From cf18204f5dd7e44a5f4c5cd186251bf1e8de951f Mon Sep 17 00:00:00 2001 From: Mohamed Mahmoud Date: Thu, 24 Oct 2024 16:36:41 -0400 Subject: [PATCH] WIP: manually update agent with pkt translation pkgs Signed-off-by: Mohamed Mahmoud --- go.mod | 7 +- go.sum | 13 +- .../cpuguy83/go-md2man/v2/md2man/roff.go | 90 +- .../pkg/decode/decode_protobuf.go | 11 + .../pkg/ebpf/bpf_arm64_bpfel.go | 12 + .../pkg/ebpf/bpf_arm64_bpfel.o | Bin 152128 -> 174344 bytes .../pkg/ebpf/bpf_powerpc_bpfel.go | 12 + .../pkg/ebpf/bpf_powerpc_bpfel.o | Bin 150920 -> 173168 bytes .../pkg/ebpf/bpf_s390_bpfeb.go | 12 + .../pkg/ebpf/bpf_s390_bpfeb.o | Bin 166704 -> 188344 bytes .../pkg/ebpf/bpf_x86_bpfel.go | 12 + .../pkg/ebpf/bpf_x86_bpfel.o | Bin 151880 -> 174064 bytes .../netobserv-ebpf-agent/pkg/ebpf/gen.go | 2 +- .../netobserv-ebpf-agent/pkg/model/record.go | 3 + .../pkg/pbflow/flow.pb.go | 385 ++- .../netobserv-ebpf-agent/pkg/pbflow/proto.go | 29 + .../sampledecoder/sample_decoder.go | 46 + .../go-controller/pkg/config/config.go | 172 +- .../go-controller/pkg/config/utils.go | 106 +- .../go-controller/pkg/libovsdb/ops/router.go | 53 +- .../go-controller/pkg/libovsdb/ops/switch.go | 3 + .../go-controller/pkg/types/const.go | 3 + vendor/github.com/urfave/cli/v2/.gitignore | 13 +- .../github.com/urfave/cli/v2/.golangci.yaml | 4 + .../urfave/cli/v2/CODE_OF_CONDUCT.md | 11 +- vendor/github.com/urfave/cli/v2/LICENSE | 2 +- vendor/github.com/urfave/cli/v2/Makefile | 26 + vendor/github.com/urfave/cli/v2/README.md | 67 +- vendor/github.com/urfave/cli/v2/app.go | 412 ++- vendor/github.com/urfave/cli/v2/category.go | 109 +- vendor/github.com/urfave/cli/v2/cli.go | 32 +- vendor/github.com/urfave/cli/v2/command.go | 302 +- vendor/github.com/urfave/cli/v2/context.go | 247 +- vendor/github.com/urfave/cli/v2/docs.go | 85 +- vendor/github.com/urfave/cli/v2/errors.go | 71 +- vendor/github.com/urfave/cli/v2/fish.go | 8 +- .../github.com/urfave/cli/v2/flag-spec.yaml | 131 + vendor/github.com/urfave/cli/v2/flag.go | 325 +- vendor/github.com/urfave/cli/v2/flag_bool.go | 144 +- .../github.com/urfave/cli/v2/flag_duration.go | 83 +- vendor/github.com/urfave/cli/v2/flag_ext.go | 48 + .../github.com/urfave/cli/v2/flag_float64.go | 87 +- .../urfave/cli/v2/flag_float64_slice.go | 155 +- .../github.com/urfave/cli/v2/flag_generic.go | 107 +- vendor/github.com/urfave/cli/v2/flag_int.go | 85 +- vendor/github.com/urfave/cli/v2/flag_int64.go | 85 +- .../urfave/cli/v2/flag_int64_slice.go | 158 +- .../urfave/cli/v2/flag_int_slice.go | 157 +- vendor/github.com/urfave/cli/v2/flag_path.go | 99 +- .../github.com/urfave/cli/v2/flag_string.go | 101 +- .../urfave/cli/v2/flag_string_slice.go | 157 +- .../urfave/cli/v2/flag_timestamp.go | 135 +- vendor/github.com/urfave/cli/v2/flag_uint.go | 85 +- .../github.com/urfave/cli/v2/flag_uint64.go | 85 +- .../urfave/cli/v2/flag_uint64_slice.go | 219 ++ .../urfave/cli/v2/flag_uint_slice.go | 230 ++ vendor/github.com/urfave/cli/v2/funcs.go | 9 +- .../urfave/cli/v2/godoc-current.txt | 2724 +++++++++++++++++ vendor/github.com/urfave/cli/v2/help.go | 390 ++- .../github.com/urfave/cli/v2/mkdocs-reqs.txt | 5 + vendor/github.com/urfave/cli/v2/mkdocs.yml | 107 + vendor/github.com/urfave/cli/v2/parse.go | 28 +- vendor/github.com/urfave/cli/v2/sliceflag.go | 290 ++ .../github.com/urfave/cli/v2/suggestions.go | 68 + vendor/github.com/urfave/cli/v2/template.go | 95 +- .../urfave/cli/v2/zz_generated.flags.go | 865 ++++++ vendor/github.com/xrash/smetrics/.travis.yml | 9 + vendor/github.com/xrash/smetrics/LICENSE | 21 + vendor/github.com/xrash/smetrics/README.md | 49 + vendor/github.com/xrash/smetrics/doc.go | 19 + vendor/github.com/xrash/smetrics/hamming.go | 25 + .../github.com/xrash/smetrics/jaro-winkler.go | 28 + vendor/github.com/xrash/smetrics/jaro.go | 86 + vendor/github.com/xrash/smetrics/soundex.go | 63 + vendor/github.com/xrash/smetrics/ukkonen.go | 94 + .../xrash/smetrics/wagner-fischer.go | 48 + vendor/modules.txt | 12 +- 77 files changed, 8208 insertions(+), 1863 deletions(-) create mode 100644 vendor/github.com/urfave/cli/v2/.golangci.yaml create mode 100644 vendor/github.com/urfave/cli/v2/Makefile create mode 100644 vendor/github.com/urfave/cli/v2/flag-spec.yaml create mode 100644 vendor/github.com/urfave/cli/v2/flag_ext.go create mode 100644 vendor/github.com/urfave/cli/v2/flag_uint64_slice.go create mode 100644 vendor/github.com/urfave/cli/v2/flag_uint_slice.go create mode 100644 vendor/github.com/urfave/cli/v2/godoc-current.txt create mode 100644 vendor/github.com/urfave/cli/v2/mkdocs-reqs.txt create mode 100644 vendor/github.com/urfave/cli/v2/mkdocs.yml create mode 100644 vendor/github.com/urfave/cli/v2/sliceflag.go create mode 100644 vendor/github.com/urfave/cli/v2/suggestions.go create mode 100644 vendor/github.com/urfave/cli/v2/zz_generated.flags.go create mode 100644 vendor/github.com/xrash/smetrics/.travis.yml create mode 100644 vendor/github.com/xrash/smetrics/LICENSE create mode 100644 vendor/github.com/xrash/smetrics/README.md create mode 100644 vendor/github.com/xrash/smetrics/doc.go create mode 100644 vendor/github.com/xrash/smetrics/hamming.go create mode 100644 vendor/github.com/xrash/smetrics/jaro-winkler.go create mode 100644 vendor/github.com/xrash/smetrics/jaro.go create mode 100644 vendor/github.com/xrash/smetrics/soundex.go create mode 100644 vendor/github.com/xrash/smetrics/ukkonen.go create mode 100644 vendor/github.com/xrash/smetrics/wagner-fischer.go diff --git a/go.mod b/go.mod index fae2f19c8..35ae41f1a 100644 --- a/go.mod +++ b/go.mod @@ -62,7 +62,7 @@ require ( github.com/containernetworking/cni v1.1.2 // indirect github.com/containernetworking/plugins v1.2.0 // indirect github.com/coreos/go-iptables v0.6.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect @@ -125,13 +125,14 @@ require ( github.com/spf13/cast v1.6.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/urfave/cli/v2 v2.2.0 // indirect + github.com/urfave/cli/v2 v2.27.2 // indirect github.com/vishvananda/netlink v1.3.0 // indirect github.com/vishvananda/netns v0.0.4 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect go.opentelemetry.io/otel/trace v1.31.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/atomic v1.9.0 // indirect @@ -169,3 +170,5 @@ require ( ) replace github.com/prometheus/common v0.46.0 => github.com/netobserv/prometheus-common v0.46.0-netobserv + +replace github.com/ovn-org/ovn-kubernetes/go-controller => github.com/npinaeva/ovn-kubernetes/go-controller v0.0.0-20241022150829-c03e72d94693 diff --git a/go.sum b/go.sum index f2abbfdfe..210e0f08e 100644 --- a/go.sum +++ b/go.sum @@ -160,8 +160,9 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= @@ -679,6 +680,8 @@ github.com/netobserv/netobserv-ebpf-agent v1.6.1-crc2.0.20241008130234-a20397fb8 github.com/netobserv/netobserv-ebpf-agent v1.6.1-crc2.0.20241008130234-a20397fb8f88/go.mod h1:FaCOf05DklroYdW4xoKyEQP8fd20XYNwvWiEg3FsZEo= github.com/netsampler/goflow2 v1.3.7 h1:XZaTy8kkMnGXpJ9hS3KbO1McyrFTpVNhVFEx9rNhMmc= github.com/netsampler/goflow2 v1.3.7/go.mod h1:4UZsVGVAs//iMCptUHn3WNScztJeUhZH7kDW2+/vDdQ= +github.com/npinaeva/ovn-kubernetes/go-controller v0.0.0-20241022150829-c03e72d94693 h1:x2PYzfMuXA2XloyNMM1cTbYpR9VljnVHk1YkEQOj+mc= +github.com/npinaeva/ovn-kubernetes/go-controller v0.0.0-20241022150829-c03e72d94693/go.mod h1:5oVtJoJgxCHohAghvIMkdQZ40XueMQeQwu+6Rk+U1Oc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -724,8 +727,6 @@ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ovn-org/libovsdb v0.7.1-0.20240820095311-ce1951614a20 h1:OoDvzyaK7F/ZANIIFOgb4Haj7mye3Hle0fYZZNdidSs= github.com/ovn-org/libovsdb v0.7.1-0.20240820095311-ce1951614a20/go.mod h1:dJbxEaalQl83nn904K32FaMjlH/qOObZ0bj4ejQ78AI= -github.com/ovn-org/ovn-kubernetes/go-controller v0.0.0-20240902083137-5d2310e77f87 h1:NHexPw6RbB7bf9YpoK+Cz3HTFYQc9jM60ai0EANquCU= -github.com/ovn-org/ovn-kubernetes/go-controller v0.0.0-20240902083137-5d2310e77f87/go.mod h1:bLkGnzUmNsq1ubG2kbXWXbIP7mMnXLaCxOXGyN6NPWQ= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -904,8 +905,8 @@ github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMW github.com/uber/jaeger-lib v2.4.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= -github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/urfave/cli/v2 v2.27.2 h1:6e0H+AkS+zDckwPCUrZkKX38mRaau4nL2uipkJpbkcI= +github.com/urfave/cli/v2 v2.27.2/go.mod h1:g0+79LmHHATl7DAcHO99smiR/T7uGLw84w8Y42x+4eM= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netlink v1.3.0 h1:X7l42GfcV4S6E4vHTsw48qbrV+9PVojNfIhZcwQdrZk= github.com/vishvananda/netlink v1.3.0/go.mod h1:i6NetklAujEcC6fK0JPjT8qSwWyO0HLn4UKG+hGqeJs= @@ -929,6 +930,8 @@ github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHM github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xlab/treeprint v1.0.0/go.mod h1:IoImgRak9i3zJyuxOKUP1v4UZd1tMoKkq/Cimt1uhCg= +github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 h1:+qGGcbkzsfDQNPPe9UDgpxAWQrhbbBXOYJFQDq/dtJw= +github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913/go.mod h1:4aEEwZQutDLsQv2Deui4iYQ6DWTxR14g6m8Wv88+Xqk= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= diff --git a/vendor/github.com/cpuguy83/go-md2man/v2/md2man/roff.go b/vendor/github.com/cpuguy83/go-md2man/v2/md2man/roff.go index 4b19188d9..8a290f197 100644 --- a/vendor/github.com/cpuguy83/go-md2man/v2/md2man/roff.go +++ b/vendor/github.com/cpuguy83/go-md2man/v2/md2man/roff.go @@ -1,6 +1,7 @@ package md2man import ( + "bufio" "bytes" "fmt" "io" @@ -21,34 +22,35 @@ type roffRenderer struct { } const ( - titleHeader = ".TH " - topLevelHeader = "\n\n.SH " - secondLevelHdr = "\n.SH " - otherHeader = "\n.SS " - crTag = "\n" - emphTag = "\\fI" - emphCloseTag = "\\fP" - strongTag = "\\fB" - strongCloseTag = "\\fP" - breakTag = "\n.br\n" - paraTag = "\n.PP\n" - hruleTag = "\n.ti 0\n\\l'\\n(.lu'\n" - linkTag = "\n\\[la]" - linkCloseTag = "\\[ra]" - codespanTag = "\\fB" - codespanCloseTag = "\\fR" - codeTag = "\n.EX\n" - codeCloseTag = "\n.EE\n" - quoteTag = "\n.PP\n.RS\n" - quoteCloseTag = "\n.RE\n" - listTag = "\n.RS\n" - listCloseTag = "\n.RE\n" - dtTag = "\n.TP\n" - dd2Tag = "\n" - tableStart = "\n.TS\nallbox;\n" - tableEnd = ".TE\n" - tableCellStart = "T{\n" - tableCellEnd = "\nT}\n" + titleHeader = ".TH " + topLevelHeader = "\n\n.SH " + secondLevelHdr = "\n.SH " + otherHeader = "\n.SS " + crTag = "\n" + emphTag = "\\fI" + emphCloseTag = "\\fP" + strongTag = "\\fB" + strongCloseTag = "\\fP" + breakTag = "\n.br\n" + paraTag = "\n.PP\n" + hruleTag = "\n.ti 0\n\\l'\\n(.lu'\n" + linkTag = "\n\\[la]" + linkCloseTag = "\\[ra]" + codespanTag = "\\fB" + codespanCloseTag = "\\fR" + codeTag = "\n.EX\n" + codeCloseTag = ".EE\n" // Do not prepend a newline character since code blocks, by definition, include a newline already (or at least as how blackfriday gives us on). + quoteTag = "\n.PP\n.RS\n" + quoteCloseTag = "\n.RE\n" + listTag = "\n.RS\n" + listCloseTag = "\n.RE\n" + dtTag = "\n.TP\n" + dd2Tag = "\n" + tableStart = "\n.TS\nallbox;\n" + tableEnd = ".TE\n" + tableCellStart = "T{\n" + tableCellEnd = "\nT}\n" + tablePreprocessor = `'\" t` ) // NewRoffRenderer creates a new blackfriday Renderer for generating roff documents @@ -75,6 +77,16 @@ func (r *roffRenderer) GetExtensions() blackfriday.Extensions { // RenderHeader handles outputting the header at document start func (r *roffRenderer) RenderHeader(w io.Writer, ast *blackfriday.Node) { + // We need to walk the tree to check if there are any tables. + // If there are, we need to enable the roff table preprocessor. + ast.Walk(func(node *blackfriday.Node, entering bool) blackfriday.WalkStatus { + if node.Type == blackfriday.Table { + out(w, tablePreprocessor+"\n") + return blackfriday.Terminate + } + return blackfriday.GoToNext + }) + // disable hyphenation out(w, ".nh\n") } @@ -322,6 +334,28 @@ func out(w io.Writer, output string) { } func escapeSpecialChars(w io.Writer, text []byte) { + scanner := bufio.NewScanner(bytes.NewReader(text)) + + // count the number of lines in the text + // we need to know this to avoid adding a newline after the last line + n := bytes.Count(text, []byte{'\n'}) + idx := 0 + + for scanner.Scan() { + dt := scanner.Bytes() + if idx < n { + idx++ + dt = append(dt, '\n') + } + escapeSpecialCharsLine(w, dt) + } + + if err := scanner.Err(); err != nil { + panic(err) + } +} + +func escapeSpecialCharsLine(w io.Writer, text []byte) { for i := 0; i < len(text); i++ { // escape initial apostrophe or period if len(text) >= 1 && (text[0] == '\'' || text[0] == '.') { diff --git a/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/decode/decode_protobuf.go b/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/decode/decode_protobuf.go index 0449acb96..14fda28f3 100644 --- a/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/decode/decode_protobuf.go +++ b/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/decode/decode_protobuf.go @@ -143,6 +143,17 @@ func RecordToMap(fr *model.Record) config.GenericMap { } out["NetworkEvents"] = metadata } + + if fr.Metrics.TranslatedFlow.ZoneId != 0 { + out["ZoneId"] = fr.Metrics.TranslatedFlow.ZoneId + out["XlatSrcPort"] = fr.Metrics.TranslatedFlow.Sport + out["XlatDstPort"] = fr.Metrics.TranslatedFlow.Dport + out["XlatSrcAddr"] = model.IP(fr.Metrics.TranslatedFlow.Saddr).String() + out["XlatDstAddr"] = model.IP(fr.Metrics.TranslatedFlow.Daddr).String() + if len(fr.UdnID) != 0 { + out["UdnId"] = fr.UdnID + } + } return out } diff --git a/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/ebpf/bpf_arm64_bpfel.go b/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/ebpf/bpf_arm64_bpfel.go index 243f49dd8..a1367e552 100644 --- a/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/ebpf/bpf_arm64_bpfel.go +++ b/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/ebpf/bpf_arm64_bpfel.go @@ -104,6 +104,7 @@ type BpfFlowMetricsT struct { FlowRtt uint64 NetworkEventsIdx uint8 NetworkEvents [4][8]uint8 + TranslatedFlow BpfTranslatedFlowT } type BpfFlowRecordT struct { @@ -149,6 +150,14 @@ const ( BpfTcpFlagsTRST_ACK_FLAG BpfTcpFlagsT = 1024 ) +type BpfTranslatedFlowT struct { + Saddr [16]uint8 + Daddr [16]uint8 + Sport uint16 + Dport uint16 + ZoneId uint16 +} + // LoadBpf returns the embedded CollectionSpec for Bpf. func LoadBpf() (*ebpf.CollectionSpec, error) { reader := bytes.NewReader(_BpfBytes) @@ -202,6 +211,7 @@ type BpfProgramSpecs struct { TcxEgressPcaParse *ebpf.ProgramSpec `ebpf:"tcx_egress_pca_parse"` TcxIngressFlowParse *ebpf.ProgramSpec `ebpf:"tcx_ingress_flow_parse"` TcxIngressPcaParse *ebpf.ProgramSpec `ebpf:"tcx_ingress_pca_parse"` + TrackNatManipPkt *ebpf.ProgramSpec `ebpf:"track_nat_manip_pkt"` } // BpfMapSpecs contains maps before they are loaded into the kernel. @@ -270,6 +280,7 @@ type BpfPrograms struct { TcxEgressPcaParse *ebpf.Program `ebpf:"tcx_egress_pca_parse"` TcxIngressFlowParse *ebpf.Program `ebpf:"tcx_ingress_flow_parse"` TcxIngressPcaParse *ebpf.Program `ebpf:"tcx_ingress_pca_parse"` + TrackNatManipPkt *ebpf.Program `ebpf:"track_nat_manip_pkt"` } func (p *BpfPrograms) Close() error { @@ -286,6 +297,7 @@ func (p *BpfPrograms) Close() error { p.TcxEgressPcaParse, p.TcxIngressFlowParse, p.TcxIngressPcaParse, + p.TrackNatManipPkt, ) } diff --git a/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/ebpf/bpf_arm64_bpfel.o b/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/ebpf/bpf_arm64_bpfel.o index 426e1f762d686dac68abed2ccfbbd9afd9fc5f11..f39e0733933f2a2e950545317d4eaf852aca6734 100644 GIT binary patch literal 174344 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 z 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 F{{VS~_TB&h literal 152128 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

xgywFmT_1WbCoHW| zu@hzlJz-m86+<=zKSLTjMkbWNLhltImnmV$d>c!s@OZdJN2WOVMNRM8$xu?Py)8VO z?z~H4!I)h1Rqce|-W!BgVDDY~JLsP35`MIIc4$lD=9Zp*&>t2pbM>O3l*I`p$?}Bw z`Lv|0m*_-~%#*J1Qx8wz-4gtyyxCbhp$FRJ!pd>F6VIq2n(ieUA|1pHk=$vBpopzh`pTm z3X#2kPY-<9?P)AJ5am@8o6W~2=VS-d#NVjxZZbFKND}3Ad_qS*{`K%+13s8=|~-T)p!(ugegXS(xlnddb5yZ;E;w=8}E0TiasKwzjtQH5*vR$+y{5*4!#!*~RC@wG~5@ zwMTm9)JkZ#weUO9|#cQ270> z-Ch28kD;3iDN(`DR=&KUO-ykXHtZtl&h9vGaXt>`lF$qCgK=^8>7cQ@$Sxt#nIvdq zqctVEOZX8>h34OyQXz%uoife6Rwvj)vU5ejN)WtQW5SIYjL#@WKAn#mf`br$rv~1g z!L-jzrl^WLJb2?r*s1gOacKu*eS;GVx}wrGJm{=YNsDOD3Pj6OYfb_5T%79iroCpB zFb1Iu?mdaX^(|ebay~>cx!8kt6lA+i*k%*vAtb%#=C0`cv&#P z_t@@5GsZUS(tFe#2hN&K#b|51(KqF>m*Wt}88YK1JLe=xYV-*AFUUl7J34AI6das9 znTW6MpAd7ky62+V#MpKx8@r-|P_5gwX{atwhZrwsqi0kYR+q~?-sM`k6kKtK>yy|e zdzp!7Ti583WgkwjP%IztPyZ(0-9HZ8=9$hNVYxsqQm#!if`8u4!lS%>euA)VC?UgM0u2mkN;I*o} z8uh61YH~SMUaekkmG6ps&#TWiOg%dRpS z!VY{t*UZwje77W8g=}-XpE2KiWdf^X@6YfhhW~M?cRE2VOngXY=`Yo|=(L9ul%`18 zaTICorkTaUXQvkCvEfwH&*2P(D6@$xMvww*mzlwEAo~G4_RD%iI&;SzX2$}ZDPdW= zXWO@IXfK>e>UC%68iQ6u4M$~UGi($$>-ur3?T*yMzBt02$P8(0W=ebT7DtwLs3clz z2E(rCZG+KIO?#&)3WxGu`&R~hu${u`$_q)BdE(tLsuzEGJ3gs+N*TX>`6%5`(N-k< zca@I#AW{bA%rBB6FGB!lTaX;;C4h(UZN**%VBAg2T~3{SY-UT-@XmLYtu^82J?xdK zJ!dGq!>}Z6@#K^Frs6#sR`{U^isl`?w-@O!qoqSbz%O@$Hl|=U}Jn@VhWq<#l{kD615Yk5*!n}G|e&1F?NG| z#ZtZn7j^W`5;hILy(O$=(^B@n5edurwze0SjKLbgw!^x&S6Da|yoNg*3SPqmr-wuA zhr(7)7kwNorg85R6mEdeUbeSITLQoA(;hc<=ASLzIx{keD+zF1a(*#=;DPkOAzZ9~ zX!Ii=dU8jKbyE^AP7Za1h29=!qFd`RS8aaEs%2O<-Z_Yydlr|tCW<>oG0iDQ@v$iP zKsqe{t{Eo2Z{a>f-o(mVV&ykp^u`L=J%|&IJlw{g*O94j&PMa{OWyx<6syvD@3Dd1 zIfmQfX5dgxgY#ChWn3GE-6wJ#8Qt-w9@#oB4oSgxUUsXm+&j!)xxuqAxy(x-;lc9U zxI7n+&*FY4T(E-)cU)sOtJhEBH+|4O&f~xgU2)?EP9`2l8WwSNpy*iyac^+AD2F#= z%1v-~ld#;k8*Un6h$m+8yE%N~%m}Yw)FbQ1acfh!lC$eRHG03exHOFrr*Rz`j=ST0 zD(t#wBuJ1%NBiDnX_iw(vS5MfsRb@I%2GlExMV9B$nBG1Gbk>DmfIANQAdz+T+2Hr zrHGEFqrsak!#$_y03|zd=5Xq0$HK(y46+?J590FZIb4Kv6gLwsO=F|v>=JI@nwmfY zj-sS_uwSm%JF+19e78GLakhv%jd<8!cJa%LMX3vTdsMduE|)fE%oC&q@ti<@x6{Vl znZ~8kQlD67aUT+9Kyk#Ba6;+;FN-G0MUz@Isp4xDHwx9%e;x=Wc14r}U&K7`Q}^H5Yn}C$b(>rh3n;Yv643ysZze zxK9VwnD-+~%fgaGM-TpBPf$S$L2EJZ_LdF=4%tF+6r2%fzCLk2*N{D| z^V09KHAz;X)FyCB9>&x{7V!OPT;n(8E z5v|hH1a{0%pndMeui6C*)_=g|)1BUG0T(RtEF-E1I-K^0E9}A3uh|67e$WIL0^m*M ztk9>6j@}AXvM;1I3YPLEFSC8#BPI18NaPbLkM?fkiFR>I;)T6_=aE^^t7$*zms(XwY zg9a;-m>@q&U2gP~E{1Y2psO?xbu_4FLb)>q_^~t;G_OvC1QTwrUB;cJyxobPtsuIH zp`=x8arPiM;6;G=(9!zw;EDyrJMX25V{w_)lySjr22)e4HwpGY;_6j#fW1ocBXGFQ zM}7l=p77>E3KVktfmAeJEX7+M@gbIw*?GX{!orb>;gOMHbhf;*nbH@(+iXj`u?h@Z zkji*B29gx+jzj?M7y8Q(<*rYxw8~XhIQtlW4^q-h-NF%^txFD%<5=mDS!*z`EY6uJ zjHw)3LFr&GC4V^}LFXQ_uHAF87~sMDiJ4>>2XBw?7Y*gAbsn6ZDeVhprYRP2#szl| z>nktu*Voy*`588nn>W>j3D?&}$dDQ!=3)7>ie?fbX4cSggx{9L4fnhd+kC>kAsAU1 z9>=`?OlchVxkA9|5F`BX|RRh2PykjYJjI&kH)Pr^Ai7@)k-x^i33i;MF|D%yHcPIhj0* zV^c?QZ4z8)?>c%jx18b@NU<5lLX<41MX$nVjuM%O z#U>~OscZ^j3qNEMTqHM4%~MQ3cQ%DC5@M1Nj$SVEcH1yC5U~kDHhusE`G&^Kt`>5h zyr4tiLBs_083CiN<6yFEs0l+DNOl~~;7hHsGY*Y#5z>mj@guj03yrmN3J?4cNQgvo zf@kmXOCtO-p}hG-yW|704~F8AzS5`Vxnpy@8y)B5L~2+J$L^WE_)~FiS}u^s9ihBl z1$7BG5$ol(h%heDN8hx7N{0u{_~dE+aAmL51HC>vcmum|hOTe)3H~C}6Zjz@{Px?E z4?gi^TgRB$B}q9fH|vTsDIuv9;p?u&J%z8m_}XCalip1|wl*XQ()XCJ2J(&>dx~1jL2iO`ZhhV-G|Jo?rCT}kGS#4vkW+~b`^v-uX zt#uhj_Xc0aBi`>L+wB;1=a>r<(0hMgZ-?ldF+J2iaB{J8Z2Snal)d2E*Um8r`4Jm@ zL%4wi9bni;!l8b&BZb#=CUDK4Zncx`Jtk2iQ=2&nr{L3_atyxvEdDNTe36LZMm?U2 z|D4PXu}tk80bE7fmqFZQEK>%kUFJXvJZ!%}9fMEY!xZYsMN_FZi*2`m-ub|{dv7RR zhU>YyE)He+G7!Wye6PXlVY2z#aoL{8*HnbCv6T)tWMU?hvPb)fL|e!9qg)~` zojTF&quk-x<)i4Bk5V;st0iW~hUMl7GUnzqccli;;ttXy^If?dU*W)*O7Wp+r4Fmx zo)PY3yC(SUubAxVPp1%g!v!+#?fr4d-S^K(u3m8&rm!T)AViT^73Q zhqrbz@+^_K5{G^zN&VVnv2Hj*Ju-)TbBkxNP(!ybo4 zzMa^~$&q)K$>QV^F{8}AFa8t+jknD`T8l5*+lMK5aVnY}If8}CUR&&QKMrb52*T`l zuAURS(Km|reAMurdYhb+kT{8}A#rV>efyu)v0hPv#Sj;}A_rFv#P_Y?ntQpN0wRUI zVlSb+@|!O50%n6ukKfN|6QX?gWr(UiVYIx)ogZtO*i8%=67oK0+yfhgaE6MJDx__U zL&LQNxcVl%;6_KeBhYwA##NNfF+B%~MYkTSt-JL(oVbGm9F@WLnujUyL-F!!^5OU8 zxgKgdVLdU{i55+h?(^t&CrB@Cf3rj{JN}@qx5I18g_Xh&jIU!3s!)(z1|C9ZDUlcxAP&?$L_k(c7G|u z-CE>&t4!OC2zX9&_nuHay!PG6?!y>8?Z%c-{JStO6J}Q9IE)FGfXUdM$ji^{hg?Kc zM_amtAQL9?qYs$kEbw|cj^#1Qgx^u&EK>NIiK$up*(d(;ivEy7JQbjR zgjpDlrQ~N_@Ix1n85b~w=65JuUMCX=onL!m2$C77<5-FV$>f)e)0i}!IwWJ_2$wH% zs4EkQ)Us&;nuS}wFg4EGzPM6YzziCvW1|5wE`jSHUoo0xcrw!@6H79&b$FQ>5)wm= zJ^1y7j*d=fF&>hbD2g_@$+*QczFl$Ed`pt#r~aZZN%5rG&=>yR7)_GaN0Q{FcPB|d z^cUZgBrp>71pfVty&WEcLE)Yb?+5=MBOU$___}+O;D7dyRNyhLTy(LMCcn;)} zWD?Kw4<^YGJnN4q$Z@`6s{! zKH1?_oI>dMwpkCe;)QXo?f3^Q2tZ$%j=V|4Iw_a-iExYtxrl3UjtrM zw)j<*KLh*kJGVZmIj%eVXO$(rudh$eEB_SSZ~Ef;B(pKf510=q{|3xAesz74RsKWp z!*3$J%J$y7HYDejUk49tM&iCB*q8XF84Z{cn><8oU-Nj zDYb9@Rg@)vU*C|NaeUU5UK`l=g} zmg5V`UqW~fo!OA|Zwcwi>_+_2xeO><_^C4OZ-o7v@_yLg{@R9QRQWh~OC9x7S<;8j zXj=J)X#NW7E12bL>b#m8x0EHl2R9}I-x;+Z@Sw8U&nioL^T=<5cd*a8>yyX+DDVg5&Z$qs;cZ745gF{Hw6PX*=YdOtAku;P(td-ch~) zzGk>D8Fc0&j&sV}_9V$IS;&9N6W~q5Nm5ca|H{gi{!_~4{EH`QC$& z$CQ5(oE=S)Q_8{sPU%kRD|#@4E7Tg?ZnFJ{f!9lP~IB`yf-{FL^%5;l>-mDCUGbfxm4P$i2$6 zPxI87BdTKmMVN1X5%s{?=NJc~jwt&3S#a`lCtUJIu!SSx*7}kze<9DCzh<9fC5XJD zzJ&K*$KOWOQ^ueCS7g*nj-enZ=i z&CEXlsyywB|1j)V7XM#Cn^uNRQK|AL;oqj$l4QhjPFd>DfiT{o|33oz1I;8s7a`&O z68OrmhHsWp(RaKLg;|XF3UEo;(z~Mk0odR4To}vW`{5+{KKv!;P@XU+OMPr2JrQ36J|FRQ z;8w(Yz!xH>c|XQq=3f?^iFgy3<3F1JI{vOk`Hd(`d1G+N@gB|p2!AY}X=SN@7f^o6 zQvWveC1;iY4)(9vjPFIn+rUlbMAdm^so!Xi7-C6yQeRP7F@zG9`poa=hQQ`Nqb&7z z5Z@!mS!JoO`_Z12A3(#s5|uj_nQw*pn6lK@gJ`eH7T!u^z7^)H%JO|jW2h=W1^+iq z_9bT=*TJ8I*^l7wJ5%IW#8-mPD_i;@a<}cj59Sb=+k87X6YN1wulrJ_7S$gnvO<86L-{^xynTojJ#kG=B`?Wly30MZ6PS-qLZu1@Sqh z{DZW=iuS7fo8TL(2=6c?tD3;`f15 z75+v1K5$vNM)TLv-#M--|1Qm&$WP_>JdXT%1Ld#$Y4Fw-KE|04pYJ8ViS#S~XYiJ7 z>yl~Z%oC_j={gzDF#dbM*AK2sR-AcR`Ei)vzH42=@eS>p`?~VKfcdrfn4fj#O=X5Z zfbd(+Ji9gc_tS9y{{8Eck%$Mtd1Z57RQ^razcq*SIQtwA#qp~se}nNqur673=BJ(e zu`9dXpH{Z^T36n62<2T|mz-CY@}5Ncl%+gRu1or_3jP^ql*@3xwT$#C|9kNJo`*aT z@pka2@*lxGeF5dAd@p3Jt*a<6czql@`I9^r$EX}JZALZW#Z%Nk4c#iqi|6P#J zYA_!N@x2v%;}_Q@7t+8V18+IAE*ZEf^q(u>ZBL?pDSrXHsgxwS_XqReBQJq(?(T0_ z9aojF{RF~)9{suU_kg!n&>tv&FL(#~i*pg*4sJ&LesC*d+P|Ru3-k~D%fKxmK7R(@ zj`lyOyycUqzvwTx=EM1t8^=)MFQNV^KMUUUGU{8zDR?E~o57WcY5%nH&%!tg!xrtQE)xt z$HC2r3*ht0UxxqJk3wF#BgBv4T@CY$@&(5CAmsOm_k%|wegr%g@n^tA<+0Bozw`KB zN9NbUd{y~}VLm*I@kzw@gU?319ehstk757r68fKAA-?4O;GDAMUtam)0`d?2St;T> zz$+0CgI6Pd2waW$QE)xtPk_%V{{;NM9{uC_$oy)Ux0HVk=GhmKpLd4%lJ5l%M0^N5 z9r07(lJZSOiFhygjPePZzl8jWcrW;Z@|R&gR7d^W9l|Hy2Tmj24jxp#W*qik zMSLQ@54@s`A8kp7&SL#K;`_jLhJ7v*KTKea9?D*qJuAjXFgZv>Z=e+}ka^62jzSCsz{=2utHA4I$rTvgsQ zf&K;Z!PU!LbW#;{k2bA&4fyrHvC$bUm z1Lu@2{LzRReqP!9FGkGp@$-jW;g=m(l&w5hm46xWx$1SuZxL?+x0JsI^T8(MpNO}D zlc5ma^^+I_oriptwVd5Q$9!|rhG7{Z1TZqWKQ{@sBH4Vbi|YoDiKpYs4AO$(2AJyLI1rWK9+w2 z$|fI-L`?Z07cu37V#JgWrX!|&a4KTT2Nh+L4{DJ)3@YDL#P_d??{mbI4^Ancp!rLvUlCJ2Xexgh=9CZ4M@;#k{{taBno~X)P&WA> zA2H>FqO!>cs}WN^IIWzhswta%P**njAhSP&Z}P!_vdIU7$|fI-D4TpRsx03}$OHL^ zDIbg}n|x4myrOLKK{;Z|2d9)xJ~$mQ<%2WI_I<8L%YJaE;#PL zKje?e2ZIq)J{VE9@N*F}{842Ke=K5#Uy7LFuQ)yh=J@!(;d{AtKfaI3-vXytoH?WX z=oHKkU_YR;%&(2&d;dUikMqjO);zxV%0CAl!1#PH;`f6`!L0wL^2#QUR3oN5a$5Oo zDv#76raW>++2oPBvdJT7Bc?oZPTAy<^AS@XX(^jLaskZz`D>)-gRel|`Cx|+fJc<~ z9>Mqi9Og@u4}q^n{HB$c$t`?elr8;bWyx>IKdZ`;-`lXCPg(LCi)j~>CBIYTe=fvF z*3(WR|CL{2d`4J?!JNDaJQ(p-@JPf1;9SJpz@rhHd`R*XTdmcO~Kscs1ey@ac#-eyBx!J@`z-bbnSka}@rMLEeuz13u^Y zyz)-kFQPq1oB>~O-2Y(6?*p_y4H-7#40yotpz>#Ezl7mL#2N62<5A_4w7-J#h&Tft zb3Cp5Z)m@a@`yMCUU7U%xkme^kpB^9z^jf=EB`j_S1|t-aRz)=IZ@SAmiqc4OKfn|Sl8S}Erk0bBi{Q~N9#GAl_%CbIOh55t5z3hKJjr?>x67g1;k15Ok z=Ni(dyaoPV@e1mbS>I(9trWW{m~U=+aG;8V(yPV3ubv(dKzkO`=if0zToU9ABxid zI>ukhwm*8*ndg;le{@mV_D7eLZGUt{88t=JYGj}Lqt7VY{^+yHwmK7Wh(^&t1t}jU*4d&#{;C^r%zY#UJ{LCrK{>iZoNzrl1 z*hsFBzdAu5&h};dtNWF0e|4&C`>O|) z&3)Fn&pG#8=cfPWzNl>Rn^v~{)n#SdUtM+fPlK7?$4{U?Nie_W_^fgk{mq^X#$(QX zGcw-_^W%~@yOFmud{?1Zel@>qzkxvwaj`wJ0ofq(rU5BC2G{@;eWe@dBqr?_A7jI!-l zY(&icicRGO*ynylZt!FN%l^>=82>yT*zzl@Ec-vFF+Zs+`#&)rosM{b<5lH<2md!= zJbGH${5zv8-?uW#8_fFj$g{AqYhBV%UIkyBU6(W?-ULpb2=@OI%(?#Cul!Z;#@xE3 zto**uf-#@bRQ@!00P`0YBEANk918xKc_w0-r^?bl=P^I2{IB63$D-)|SeJ|`TYXtk{vgaZtzfDg{C*j|!-6qY=|QA2H2~%J;zi`(HzU67d#rRoT*0S1!W-^&3#$5pMyX zQ~q(rryuJz5nl(s5HZb@Plxo;KFu@AzfJd>F+Zcc?)#8`UxoY_@fPri@(9egpGW#4 zz79MVG0lq+)4Zg7jPBn+|EO&Bp{D#I%@3geh}TVm|tB&dsN0l6q=y8|G!}V z-YnLWl;5O(!`NSmglh^ zu596-R<`ibrH1t1LjUl+R=zri{6S(G$})a>3F9|pHsfdNtn$}k|2vV`mg8i7w|z{Z zi2Gd+qWz#h!jy%uxlffRVSe=)v@hp=#F=A?N!~BQoR+L`{U)8|)-!X+6hVX5CS5~(1T~pb{cNZe&_%3}{xBuMV%Jka!j{93<9(DHfYA)%=_>TKo zY2U_otIoWtY~#B#$~L|`t8C-D^U7BLT9JK@?=s&J!n5&Rs%+!8tTQh=^MA%lOlr<1_A$CENIl`(ep8 zJ{wfF@mWsU##f`xecrh*I``AgeOcM!cS_mDXH{hzpPdFXe`UOd&i0J5<+q*RH2<(k zP|_p${rZL^b(~c;`y&62s*!!3hpj8ydDyecb{@8=Z0BLmE8BV47C8Q%aep%7 zW6I8JO8O3V&TATTKXPoJ`;p0#zWm1IjN`iUFYbmcTtxmW+j-cgvW0&>vd{Cd{h8pu zorldRpU6Uf!}-^Nh+j-bzYY6}ILr5RazxGGW^ROA^pQQN+(hrWyb5NP>c`MrU zn6k`|Jc;qBvYc0iFjaEySCoGQ?gt^Ka(^`a{~DO*E2_#{9>#nG=J&W?n&uw@XCaK$ zBHj(={%M;3Ak24`5x(+ogSSjV9=a-+8>f!XIc_>$-PY~C>UiwxZu6q@wFeOYQ`kQc z@zvmwYl8jH!u*5JWBeNN2zX5Szrg&xFCagZEkA3@R^DfnEkDmGTYff`EkDmITYk18 zW`6SgX`G)`Wy`;@0heCK1J`z&r;g7#ZaQAQuG@W8+48dgsl&|?vlBAeFDJq+PE6OsThWV1JvdpJtuwEPS z0Qju(z3^|-Hq2)!TYYLN|IaYLtBU-&F~o>W$>1lFy2$P{L3j@{*5XBIqY-( ztf*|`Mcze(P(<-uz@zxvd=BA2$9N-{cNE3;9s_TFqhpV}5zM=bVtYSIeGHn+KN-Jb z(8N29VteOkZ@aU1OW;L(Ga!D+*!EF8zYeA<;qMUsHlmGF)$m92QRVY^|JV5Y;LZ34 zYOpWZZz!)K0(4)$MU3SvDEV)dr`Kc51vfu?YcS_nE9R!M#b~n4)4)21p#V3pUN^`T%v$V1O%EnMXzW*a3e4b6Exw&WkV)HhF)BTKPBC{)LA^eX;(h^l*3mX)0U&PY(oh>yN77xc@otcmUrl znp^!WI_6q9&8<9YVAfyjkGK}h{>J(vt_72=KN=YA?vJ<@Omp+^G&t^`>dMw1jiR2! z=A$3&?w`1}8~0BmRMZya4-D5OKx)pNwJmar{}mtD;|f0&MLL;)<}f%M$uEnp-^2f?2Pu zA7DR6wt7`kwswbUimrBtVObYXE1Ul{$4zC6Z-VbS!?SkBIXc!0Yj>QZBU`)UcRj8* zO>kUqrqR#F%P`9G-OM?-xZaF_86RtBC1uNxe)QXMJsMQDdU6gNyU*x%+1zu^ zhV{n-OH;(D6}$MK(5 zw)k_*-c_%aEj`G(ORDv4Nw?eDdQQeW^$V!GeaQ`NU1XD}^{6wPysy7Eu>JckHXi6R zKVx+p>KyeixFD8Mw$#svIp2fYhB_nmB^=enqoV$=ig`zWpT;LA{&n=9QTvpwVioM+ zK0W8pA0poC@ZUf#*yj2S)i(9NhO&&+52G$Ko|GM9RY4n~K4rpKeN*E@Sv6L_t?4Z} z`*jWXvO?)=Y^>n7{^k5N&VrySh1Sa_;7wBR%ZZx81!DJnuGe}IsxO)`=(;` z8364+q?#JM(0Xf8B=aq6_RBXh)9y{rh zJjUg*8drZBu_oTXTk7$Za&J>?v?BR@Wzz5b`8kbe*;SS8>OaSvvEsLY@hQ71!F4+7 zb3Q#*ydRYM1Fn62pN7lzhFG1~^s>*5)s*Uo@H-|?sXr&VR*^IWld*wTghq*(m`fc?o!s+ra2I?YecN5$$(@Q3!lqMCO^hU<7^#8ls=Nw0@ z-jsTac{iv3pCvzWKHmBBH^SlGi`bua;vVyDnjSNoRey4>KL0lh*VWHoRe#R9`uQ{P zkoo*A^_Vg*)l-^pyq7UnS7>@$F5Lg1;c^`yR$tI?N1Q)@4}FIFUhRjinjX@0`R~_l zYX45PzgGiURr|be!>jd)`PyxQ(;M9yO6%KS$Byxn8vj-2{|!>lF%OyR*yY=LjSuh3 zh}AWkpJg3Om|5r_vH$RP(+STzwLb71Zmd49`ONz;V)e4d=e*PZR~qiXU~C(6yc$p5 z8xgBJtz9_#-%$TY?}}|>eO=?j`!QnmgKFQ#oM!f~G+f>X5v$`G&%D!bsQ4$cX{$y9|3&uPaf2aRZO)u|9h}C)Z zpZ6Zb>OS>{_YuVERn>1f{da3V@IHZ9J*xT7dj(?k5e=936U1st^Nsfa#OglvhxZ4> z>UP!VIrmt7S^Xby`ai7ois$@ewaw~-)BjWTpXcghwW{@j=k;T?Ps8Oo|5$C&eB=4~ zSpACGcltMIe0Ux$R@*c_Jm(&(r!?Pq-aS@Vs6V5_v2K$5qK3=!>aqHl){dP1U#S0Q zo&J|KT|CzvtKZjfd7eF1PiVN={jo0QOaq8$La?)K0KElt5L1bJZ~MV-&g;6jyhJqqyCSL#Jc#c49$nU)8DQB^L%rx=Cpiy z&N)^s&1arpj@7dI&vVJK`f-gX&kM)uDfR!H*VlaDdEZ!lN%NoQeq;3unqHnCj@4C~ zt}$1>Kd1iid~d9NTJ?D@G*{P9Q=udK$D15c^;c71a0koAz~ zK4SIT0NOvIn(x==vX(pd^~Z|)Cg~5)E5z!(8qd-vW8EbAJGIaA1F;&?`2n62pu!em zQB^HR?x&B{6`KFt7apr=^`GYlV)Z8)f9~^+)d`Jf>h#}Z`p*Af(tPIr_E`P6<|p_0 z$7({$cg5MiMdQhR=w7Wy{`XSrqxnNKzX$2M67x%@8t)BnJ0Qnz#U_J{8Vu_5Yofos z?E)x@&nu&Or)kyy0>*EceNYN(n}m;wz9d@AQu!C(UzFR{DE=0+D(o{p_PH?oOXAOF zb)6)pKP>v4!Mnx3Ao`Z7uy=rt??<>-;y+WR8^hbDH9i)CrS~`R!uXWcL8{MRka%uS zYAGF*OSQwh`E#Y(53X^p zMPF`|eCUk7Qq{**1IUE|vo3op2%E(Ibrk90C>1|2zI{-o?188BBfye_Z3DBL5}+Qt3AX{}s6CxEb*u z!hGaC_y>ya$>oUu2+X|`R5bqs{Mr07`Ook-pb0d#`4sYBrkD4KQW^7JP~$i8vJ&y%gHtw4DBAxz{&=qz zl`-!bF=l$3j(IOeY+iTFdjZUx`N4Co#>|h($Ge&5MyVJ+)5~+BRAi=?=Rm2*bkB33 zRA!&&K8LJZppKQLD{TB7O@0ZFrEt6C`Mn%5`+M#! zp+G zCO8{0zaRS}W_=%xnDzO|i2nz;7%}V9tYh9kO~vqO{+#2A;};#DcKk)hb;swFnSU4X zw+nw%WPWP*6QIb~;qM>;ihKk9o+3bzS=DC=P-GN$vP6I~J{hph&pCeH@e7V$bo_F} zx8ePji212{E#g7EzaH@pyuT6gNAdnv#N&A1%tSyj{)h3mJ>m&)He%*i&aw4xbWii5 zGcP$VJGTDN+*h4>&2imv!*SDb%dtcf@wD)4z1cWrA|mswY5vPu`j&qLlj*E`DXDjxbT~(?zrK&>A2-s3O-72 zh6NvS>Nx8-=Q!`U=(yy#?6~5%>bT~(?zrK&>A2-M(E%s5Sv73`ka6nFvyO9)ZT;5V z7oB;@aoKUjan*6naouslano_ju?=u7z8Q?`sEkv`S;slYdB;V^VZN;6f7zK=99JFJ z9M>H;95)@e948p}#_7#CP90|*=N#u97af-zmmOCeR~^?J*Bv(;HyyVen}BNNolybQ zICY$LoO7IaTy$J=Ty|V>TyoNRLC@7U%GEI+c&Jm)y?xahd#xa_#% zxazp(xbC>&xaqj%*e2*KeLUA5w};emSfA*$-<&hgJ1#mdIW9Y{IIcRbIj%cyIBq&_ zIZkALx|1I6A?`}Q0iS~j)p5;n-EqTl z({anOEhMzlpXn~&)UoYfHTyQ-X`FZVi;hc<%Z@9KtBz}q>y8_an~qzKv8W-+;?H{s zsEkv`S;slYdB;V^CC6pQ6~|S_HOFbT~(?zrK&>A2bzE~?cieE?blh^BT-}}CjN{aC)^W~p-f_`! z$#L0n#c|bf&2imv!*SDb%du@yZkNBVj~J(pvyO9)ZNI;{xAhm}lCxiSTyb1=TytD^ z+;H4<+;W`g`kBQq<2ZGkb)0jYcU*LA>vtAj*_l@yR~^?J*Bv(;HyyVe+lB#)PewNo z7^jZ2j&qLlj*E^5Kj+1L$`*+NHWT-4ZvW|0(^Nx#-OODHq zD~_vfu%3QK~j|7)N$5v&T-yx(Q(Of*>S~j)p5;n-EqTl({amj zqU*oy^gB)+XC3Dp=N%UvmmHTJ+xaJpPt}>%9M>H;95)@e9NT)gg_qgx%HOfAhnxMJ zGq?3|GcP*xlH;=DisP!|n&Z0ThU2E=mSY)oNA*3!L3qTe| zH;95)@e949v=qO3eJj#I~3$2rG&$3@2_$7RPA$5qEQ$92aI z$4$pA$I1I$`W>f^vyO9)^Nx#-OODHqD~_vH;95)@e9Loix$O4ORW@mSPq>i(WbB^5Kj*~qu{f_Ov5sQD;ndcnm9Ty#!9G4we z99JFJ9M>H;95)@e94B|X^gB)+XC3Dp=N%UvmmHTJR~%Oz*BsX!Hyk$|w;U(KF8z*E z$63cY$9cy^$0f&Q#}&s_$2G@w#|_6#$1TTpPmR^@%--(&NF8S#=N#KTHs)W^nU@@w z9akJz9oHP!9XA{|9k(1O`?}McacuYdSbDO~Jm)y?xahd#xa_#%xazp(xbC>&xaqj% zIJw8A-*M{L?h&&5$T{=8{4q>B)?A=SS)|>p17w z?mII7iq5>`xa_#%xazp(xbC>&xaqj%IJvhwy&1=;|eb1Ltw<7UL1>S{Ue|3D|boC+Fn zoQ;@MB{|1=$94}E>pSh2oO#)C#c|bf&2imv!*SDb%ds8UwfJTBBa%?YsbjmJ&CGMo zJny*Zxa7F(xZ=3#xaPR-xZ$|zxaByxzdOAd$EoA2H;95)@e948-i>35tu&N|LH z&O0tTwtLwuf6C6h;<)O#=D6;-;kfCz~Ow zn7^+`W%hH9^Nx#-OODHqD~_vH;95)@e94C)- zr!V6;b)0pabDVcvbX;;=c3g2>bzE~?cieE?blh^Be8{EWaq8Ia<=g;gBL6z`yyK$d zlH;=DisP!|n&Z0ThU2E=mgD5ZF8z*E$63cY$9cy^$0f&Q#}&s_$2G@w#|_6#$1TUn zs7t?N{+1b)m3P*0&T-yx(Q(Of*>S~j)p5;n-EqTl({amj@{#WJWgMrDvyO9)^Nx#- zS0er>fH2E9JeB#VA2=}6w8miJ>qrXU5@uVKIr%<$Fq)4I)2{q zi;iD*{EFk(9KY`P4aaXe-ux&M3B~j?z1tn{a=hR1LB~%yo^^cE@$-&fbo{d8R~*0Q z_;tr`IDX6V=7UUqlzzv%9Pf90(D74_XC0q({Ji5A9lz}O)rfCEyuaf3jfneT{+8p- zA7g4mdTGAh@h->v9UpZ3l;c^)CmlcU_(jJrJATFSYmQ%c{D$MV9B+P1k}vgL((ibe zv9UpZ3l;c^)CmlcU z_(jJrJATFSYmQ%c{D$MV9B-ePO=N-T3_+`hhIDXCX>yF=W z{FdX*kGu3c-sO0|3G8vo%GUto8wy? z4?8~K_({i;j+Y!i=lBK3FFF3A<5wMj#qn1izv+0xA(wu~w>Tble8BOOjwc;2IeyOZ z3yxoM{6)vFI{u2|uR4CyaeSYvl>d|6`EiTm`2JSfKj6%tbUf*J$?ig@yR^Q+B{e9m*^u5*hk9}|So$vcb-?#d{-uF*^|D*43``+yP{&nB% z`&!>$_Fd@vyT00{QR-yQek{(E#kME(v2c8TZf0qIp{*HQnE!3< ziSgNqG28w5>q8b*&J(b+u%=H9P*Y zcrWrc)@=J4YnrDWy~6Cw#MGR`F0{u`O_NY53#gLw3zNy3nOQixFuz=ynUq=>n(|%N zvZof8(0FGSr>BCkHh^BnQ!8xQNDx~B9?#Csj|WFmflBi;b4zzE9y@&3u_FspXgJ3X zC%YGy7T`ag&mNcO!aVwcaVvhLu-%g+%X7<%Q5LSH%t&9dkxuqrjoFCAY@`sL_k`zgcw|)<7>tJt z_t?wOK6~41FGHQTVbi-?UJ%Wofk=gyefBb37=l*FrF$5ck%Byi_Jt>clo%q<>;*rm z#oUC;_S-#et$p$~QrK%c!{H@c(3j!D-J*jmG!xU}4ptA@-)zei;gH$YC=Y4ljtUyo?m?mM7wB2Ks_H zhBwrQU^J{RNRQcVn+%0FltM6Szo6~}oxS#gnr;3KW%p`13`;H9Taf2)cu77ZlV4DR99pt8&42Kt#h3O21H^kj^!VB`k?CQ(D!XD8A$`X1ig%^#$K`hhFD4LPS3 zt8D=4y(`wldrmp~-Q5QL-I!#+oA8%&`nf+2A(cZkl3QWUS94EyRD+0rukcG6ZsWcG ze`Dv*(m)VI@dFzXksu;sp@&$cyjny8R*HlOHWtDm7HPzYDJ)aiSScuWLhLM4L7m2hLa)KRWm^=HGkQ_?1`34`m|rd5z%*|J&eSXXJkx{8NR`Y@feRVQTs3 zsxI)*bx8|9gk3Ug`8R}*JURans_;W^8vH0DpZ||R%ytkzp~`-O$#2yUwlsQ@#EPc zLA(BAS^s$8{TtGuz{mAJLza z9~!&*z4zX0OF#J@Ia{sqZRs77Z%e;v^cADqjXoo^CH=VNb4DLBy2a>bqn$?A8C@;3 zzTVn3$J({Q+SSMNoLw{%r*UqN( z+Wx}+Z$*7ftnZOh&zk{EQ`CBY5k0hb5=VC#{vaK2yV7nOpLr1W!D4-+^>gqCY0Pk* zg*-ce)Ln0Mky7d%jic6k$?T#1=)PLZmtoL-z=rD2N_j)O+OHw4_G?&itMKRbQ@Nq2 zA7&FCHB8-?e^Kv7rTx%1j<;*aP&!pCb%&bSie}SpY~Ox3lHOCIvwM`5cbnd!W)J0} zpI0f0{PiQkpdK_aUruxQIF=c8{+bdidmj4{Pt?a04p-{NeP?n!)yYNv+|zHJzqgtH zwxoB@U)$2F#13ugtkLB{**}=fYa5VLJ9TM0Ilq>}-fd}}7xjy#NkM&}e%~GQ_lF=y z{~Ns%f3NkP7rpg?`FZmS$+x7xEHv_S?MKrlotJSxXFImqcy-Uw_Qm~vb`QV*x#%sl zZ?Ko1mnvB=p!II;SI{wD^7AlGtRh%5PV!R+3qhRHeh)<*@zgX~bHm1K!-Crm6-Kaj ztk8Lwmn@ljj>a_fJ`NXuLQJ1Q)1{qGoIdFy}2aLZf&JABJq|2qz_ zyb#QDdWHHiTNHHY{GF<5aNT`H{M5yR!Z_jLLre9mA{Y0+SKxnz@#k99!Iso|I&OvX z@pp?N51+LmJnMcAd9v%{p%bTT3!7u%1AN!E^Qu5cilE7wMTnLfgf-%b7CO{LJD zAN5D-6+I0q$GF1rbL)s@CLh*mzv6tJ7uIS2LSN5kTxR{DPc6}PVd`;`^@38Jzxnu(r|}?fzq6g3&ewc@`|5n1+Gyo{b$;jjTc-1W9vUb8ov(5(zE3qf zPMxXzsmCj=50wtGa<;<iRd!A13XHqLyo50~=RE?xJwuGcsd`o{{t zTf6CTKFK)w$MoXMIQd8S;>$SsToqwFVtRb!L;py!d+=qP{F+{T87Kb;;fLiP7aFyn zt%9EQLS#K6>sNKpUiSyx8YaBL_@44s$aQ5a{1yMa2D=_LH0wI5Fg{1?TlH&}AH)+a zG5)hZuD)x5*`#gIB|X&gX`xLUZ9bg(QOPr&$h)T?z9D^y(fLN_8m%*W zq0yN}ryHGS^mLFU3YW!^N+N}1C#bfbLU*l># zPK$r~dVPrVHLmM*B+mEIj?mYM66cG5`g&c8^Tj{?@oYZU2dqt>i^;qz*M&}NS7(v- z>it7ppSD-;v*LVhuikIP`9A6keZB9B^R>Nt{}tzJd+k1~oLb}UJy7zkUF(Xp7eNjw zu20)Lsuy3|TiJ{6gA@8Ad-1is8gSzJwY?)mJ}l?i@%9dvd~4V0BJDju%H#U9y&vnv z*Y*zU#rMGpeOiRLx_fcQy z>-sXz*Y?^vKh|$;uih7g^L^Ii z;{u8l=WBa$p)BBQdl68PLS~Snc&0%z=+f&)SpK+_*LUf9rMLd$q&&`7{Tbnh<;Mt( z^dBqv`YwGg5kF7cd$g3t`KnLXyJ5MmV$`NF)LY+)Mf9Cu`i?KqH`(;*`mMLVvx?}OX8O)7&^Oie>AJADzB7vGJKgl1TA=SV z)2Hjn-ulifqHm_@JGVgJ4AbZJ@^>AN+9LXlK3zY@&(r=k711}}^j%z_Z=UHZFVeooBKqc< zzBvW@8cd(A&wIBoD57tn>03~s?=sUjv`G6dEu!xd)7M;}uf_D)x;z$F)qbr-^es1i zOAGWZGkt!M_AM!*Z?WlHRG=?3eR@CA+kRIS(U%o|Sbl}j$p5aCe0^6{k@kH;%H#E@ z|6OkSRut%KGkv=LkDsUZyP=4_Ri^K{0)5w;zOhBxcWn`UD^1_k1^TWreR{vryM1el z=v!_2ZZ6Pwi|Nz*p5FRCSw!DWrmwv~-;JhE@2`66`*aa~>rCIL3iRD>`Z7iAcUuvC zx0=3=0)1;upWYAlZeLdseVxJ&%RetP^1m-gzP@Wpk@kH~%H#E@|9#f<-BFkIU4FnxNz9q*UUkFOTdx5e~*xj^4nOyA5R z?fX&@efOHaFBa&#$MnrDqVMZP^gU$y9xTwe)%4XB(f73?`W`TS_Z8^7-}GHlMBlfI z=*tN|EPq63(5zi*koZxrbJrs-Q)MBn#{=zG-keWyU*cO~D{ zrO!>m^6wXvKPLI^5+V8hVn#(qz@)eBA1t}PjDMN`(mSMWr`kSKjoTl7@?G+SwTF;k ze{+z~VC@*o548NjmfzFz2U&g(%U4_eBbGnV@&hbiW%>S=A8mPUV6b+S<@;HArRDot zex&7-manjUspUslzK`XHTRvfV-|}j(VC?~x7lQrDk7+)?e>=?b*8h(EEpPqr_^9Qr z{~c+|TmL)uv%K}cgR>m=9d7;a*w^yb|BfM+xBhpeEN}hq*vInL|Bk&aZ~gDk1xq;G z`romam0SNi=)J7p`ro1B?B0(F){K|({JurUILW(xifI4#P~it1V^tpN*#o!F_(At? zx1u?0VaiiGwQBS5{8jz(0PU97R=r*4)q1H`_5q6R3)2Gby$ZMA(Neul&UgDSE!Fz` z*zFf3y;Edzh#OO@>9J$oIVPr}V;*V>Xj`fz}PK>gR97c5f$ zb>|0*)Ze-9NKXkuoe%ka+X}6Js=6Ka1+-o4myaUudvhjig}c%tlb*(tV3GPg^|H%B zpnmWCB?xt%rK_+mHjvjsh8?sB7VtzELIf+ zhl!wj|1K~)rb@ISts5Sf{>&P8C{M@xTbgggdk5@qs?R|(uey&DHOMDrpDF3RB#cy_ zK5{)w^%>>WfaBz9`@A6Ug#{I&7X8)w-28C;bo&QEg-mBJsML7t-Uo2+J*1Kr=PN8e zS7Jbr3gv3;{fVH$;(R5o+gmP`RKEz8XdDjgMI+jqXSny^hK;j&?fufAuwI=O-mr<* zF86*=VZA0dYoczPB|RO_ph5@G*)7%Qo6_DO(1|x|ZwZ@uyY_=QY0;oU=W(jf*Gzt* z&{=!GEwrDFztfxawg^8}qVqhcG<#Q=y$kxC>Z9|vt!9h(hqF`L`44Hnz+P=NIpMe7 zspYL3H1F&fl`DVDSK|z1o z(l)ML1>v_JWA8fpD9J30Hh>+`Vby6$!L44Yu_ufqB} z()wFq=V8;`bwI~?)`SJp?xehp&i4v5J_Qx;Hx3q8Y+kh0xHw_zWI~I2^Sw) z@3goufnMTyM^ChMeBQoJpV`&)xp>oCPp#+~bIx?3E^fN(TWz0#avcjsj+FBJx~HN- z^3JY7Wu=y5{5di~#VF0Aez^{xBiZ~qh1Wx-){Rd}Je)Q81j)Pl-M%(QrwT_>uF`l9 z7^ku4M>lAF-54jPK{g)(RfF;PyTxA}w_1zS?t6kk*XVifJr?Rc0IYmH&@1)KRln#) zznBJ{sI+^M(m_*{2CIy!IlW=m{#EKvdIw6uuIgn(>s>ErIpV;Fu2-*n&YrlMBKz78~u>}E;M_iSoCL1zpr$+ z??X@@Q+yn#|AXF_q`ZmZX!-k*3ZH7_eP^-PaI=?&eJ>bk_Hz9hK0@W)_#G$N{QV^3 z4=YIFJ!>}E-H*7ud%tw|?@tb(IkoZ$dB%E|KiTC?emh}$5cx7z3*er61DmFpz`bLQ7`}!{fqXTdah)>R9{;cR>IMc zf>97aDwM13Yvq-89Unz4z2#DU?LKCyPM~0kT_16})N6h`>@2I--NzKxtIG>-*tu4( zyN@ZX*W_lMtM)8@AJZ-EjqYP!mb@Du7Z;=Zn6I1sM4_|xeqLzr`%P(Yol5Guy6ybU5;Fs{Q(LpUujy$ocYo8mNz3!=3)2^s>w08N{S#8ZdoOIvkRM9k zt#^YDdLJ{2Q8qTtX79Y;xcitK}8~Es}TR>e>-h?j`(Q_c6Nc#Cpxy#n#WG_7VBQ z`JNx&N?rE{qqJd#a{2MCv~~R`UQJ@-Yj#fctrUKKd<*Ym%%6u%*EsLuU35RAb_kZ* z{4hUj-C%Y*T-4{E7Y&=M?F~k1``b>naj39x%-0FjW)lWzR9XDD%X03P1pPT zVRJ2hjnsa(ooekXxUcCpJ*^w9otAg+9}k_DUsn{9GIe zmgxLxJKy@dbgXp5ja%!T%6IYK#gj2}wH-${+I@~ahl=zR*uAKpqolqu=N>84#Z@<+ z|KHu`==#Ui|GxJ**BmSD-TnIc)`U+ z)jhmnjqZL&SJJCqC(~Wa&-|tKLR`8f^Q{px4t?QK;bWTjs zlzp!#^B)SD_OWuB0UfL@)p)tf^B~vbJm{${t&$pdc^>NMaUSxurNiYswuk-cQ7(G* z`2fpl{~qPiUVZ+>az>yYh+H0>|&2{sbALzEa&yFM>!a^rMj+SxnEcgMy-8U z%JNKMIT*FJzF>Kl<$Kxs5q)FCd(3EKNgsJ`&@>!OB)9+4GFbC&JlpKM7WX|L{eY<@ zt>4EN{*Fa3Ld#Q$cSN$qe#fLG{YUYa7TYgtNxy3OSB$=7ROdlU`UT5xH~L$ny06@l z*8Sv`^fSi)rO~I2>bz~S-&bi#>pX2qKVjwS-|qKG-0zmOq#w2N?-?CiZi`cF%>?k~2a|1A1aCBG26rAnTbFOu7u zhvw^D2>I5#v|e}J`JnZ;rOWgBpbq0WLGlghu|nI@Rr&H9%Db0S3eN*|S?R_5xx@NN zKkmLp#Pa>6ogO4VRK9Cx>!ux|e`k7Nvi$i?T`D(7my2Ha-KwV_t}C>!i?_5h?|ix& zw4C;)-JPFycPM|5`E_9LYlQauBW@ouOg|>=3haH2(0<1zu(%$kzh~u1Q5dGxe}dtx z4exoRe~`BuLw)gj)vuy@zgLC$Eo84b79JA8pO%r_I)`&05|MO2sd((md+i^f z&D%}xIinia!scf!ukkHx{*C1|9)`^?O1}Oo8)viMGW3&EGj#9Q#P}Tluv*tWVft5c z{xbLl?H^j)tiOs<828wDs!!u{oUi)+UE7s@xj^45k`J!J1VsvNKt)Kcn>BuMJ;?E| zEja>D>bU+pkHz_U+LoRo=eMOZMs2(c;*#@=?p=&~74*i(o&9yc>*V49uaE4fdv9sb zIAoCAdjesN`aw`(^RPz!A+Yxi!W#99!1l|-8ubtN-a=TTeiBr$*RXeu`ip!2A*@lq z39e!5Sg!sP*uHOAqt~~<_NT)d9mk+T*9W1!e-zk0cUYt28&v51aaf~%9#rUhFsxC3 z4=Qwg!W#9{V1(6Qt^OJe*5`|1wfb!^*!o|s{u>Oo_-F5j1%oaARjWS-_In*+wfc21 z*!o|s{v8ZfzX@4;ZbuL`Tx|AN8#Tq~?rzY7Li|Eta42J3tXtJNQa z!Pft3o!7x&>wmS*?_jX?zgp*2u$T2et@A6mO8e{lw&`w-Guv=l2IE9O<}Kn3&|^Vs zOPEG!Uq+8b?^76 z-sW}Q+Qr}JT8!`WX(x_Qn0`a_GhYYB&ekXHIz)W?jul0*@ zf{FFN`uF$Vn*od}@%?cp{-R%SABv0yeFY$F)^%e1{)_qw-*4o&QIGqsn)xJ-RNv|N zi#RmL_9dT3Cu`lveZJFxE zPp7ebk1ykKlJ1+j=P}DrJ{ISNC+U7`oL?n;y)TOMec`h<^fRWPobV)Fh{XA9XLyn> z_`<&WTx}V6?0?u-@2kR5Y6o8Tgg;8{PUv52I_}r$@58ZpVsS<5}%G35!?gptz|1d7l z@=1w$h;v=#GXEOV2MZ1FI9X`RiWBnl5-RZgLg!h-fTL7?fZlI#Tz!@g(CdA}0KMKf zw9gkg&MPTzza*~@;?Q@x>aq2LyKiYoPdENFqZb;TX>_j9I-`q?E;M?%(d9;08qFHL z$>=Jhw;Ek-^s`3S8Qo~K)9AfMHwz8ZCs}@r(3bQA#(z*~;rPa%&oQnQj^pl+GcH_6 z?mLFw&$AeXFc&a*^91Q1j{gY2!rxzU&k5Y~^sSKLxV!h6_`V6R;A1L&g}<0Ls@`+Y z69%0tY_C<_&I|ZL7gD%HuloTfpyX}8i2+aYdfg8=(Iv0f{orEOj`JJ!x*yp6V`$IS zd0oUm&%Jj($T}G;H9d`5f3Vc*X{0pb=Mbe~qw<5Lt{!b)u+-Yw*iYq`T0a^&Yw;Xr zh^^bLzHJbbdA>x7z3v!40~UXOX%c9-MC(cQ{kYsu)%IN_agWaVuBZe#a|J?q%{C4@28m z4U?mcUukrt(F&t%HR~I0)Hiy7(JG^(h1QQXyQ%rTWuOu_8+D)CT|dbedp7FzAWZ7@ zYZ^Htv%Yme?{MEVXEexR>S$nR*;gTm>)@(IZ?nXAm~3KLmZXePN@Hf6!O`G;CBq2>QYSk-|px2lqR3VWav*VDBS@je4C9 z`a1ttKMDG}`7>Db1byB7Qoji#O3)8OavqsJ}$xWd4#L z2c3t}IO+V1#zFl*u>G1aSta#1O%&p7ga2dz`TK43s~Mojf=2!a10r$V%9^%Hj@NIs zlgo$6@lp~d#~D?J43qj?K1^!A!lauA+K(`){VR+suAO00+y9@B2RhHgq?_03?{0qg zj&nAC|7G#)FtN*RX21NroT&W9KKo1DN%c8FJUZ1!e|IbCohoOLu zb?@`>{eRBfR3Bg7i()@lBA@isFXH`V#2!6F{VQO;yDb!nf_Ce(n5_@sX+6{!49Q zKa7yx&$E55y@NC?_W0dAx&PO&?{#Zfl;;3E?^+xI^*|Y0&}#S1?ta=m*N@*nyZi3= z`Sr_m-ck>*3}b?%Tp-+Yi?De#mo53{fvG+KmVe3U?~LkmvKD);+tRGh zy;_>LS-I^~H9uo{eJS=qu&y` zv+kJ9HME$O#JPpafeSQzuZW}1(&a~w{f8d=NNZVJ)K2Pq5P7#R;ryU=^NwEqbb8oe*U$Vul1?A5`z~tV`ExJc zaX9~Q{>1v3-18v!{5aZ2((#G*b95gl+DFoHbMJFU`%FpE8`^$kw4bBTfmtu7c=395 z{G)nxA1JC<{UQi7P=sl>&*bV=KZ@$r{jH|u8pqu8h-e>4pKGyQ51?JG8+3f#cnDf>vRo7GQi6U!59$Dj~@khW@A z@fuc4lJ>N%7;Dtpcel#zY@d#^M7NLP_E$pt-Z-@Vk#L31^Kgaj2d%LEr4_cn zv_j{7xWe|AR@na13fo^=q46SIVf$4pH132e^m%o-LgP=k!uFR|Y?uCoD{Oyhg~p?B zh3zk`(D)Uu(C6XxYizvDj(o1hsp6i`yXU^-bKT&c(}!u@k5~qO;5dY~A78(QQt;be z`ZS)#`KnK!6NhPiz8~qc=l^T^i@u~cT`2vJX}9-_Y}|LXe_RE9`Ef-*#jn;#HQu1% zN~3)d9nWZA#O<5dysEZ+qx`;z?HlFyMRdHQeG%I?%I}NVzEKBTL3`W2QGQ=UuPf2M zh}$=@`$5|W4D$OTwr`Z*7kNhfBia|SeWU!oi27T!FQR_O>n#1k?JxJXi~40`7u!$C z?-!|`M*Br>KS`DW=%@N^WEZ!eqywJcPjbKOkl#PqKY_7jGI%Cg}YD{+|xEoZmMv0w=wfr6cs;`;c$F zOXFwZb?yD)D9_K~{KE5^-Y34&zqyWcanjABhP1`O!hKdZZ+3CLjK{;``$W1=Q+%ID z_mO(<6TK;Z+UtI%TGwa2o{zF~NW9-|#?)c|X!kJvC(+Y%x2}tl-pwMHDyh`_nUXX0 zeg@;D_cQnXON~?hx}|RDHQZs>t2^v^wTtm#WY5Pn^osq<+oR~dUeEDLdcN4}U&U_= z?a{Uyc3>op+hMN{VTWG#i8UY2Zs z`W>eKBJn34*B{~ja)-Dqy-F0ET z*2m{RtiN#oi1UN>y8kDsw(Qe#0_!I~wD11oad-FhtQI}gpTt3ZOio|xhH|yfc;!dy z&+~inVIo|Y&+EnK{0^&U3O}rwA+%w|=_-f*GEuJ&+EAU*@@l>A74A#6t}jzP)#nQ3 zx`$0}sGcJEmOG{!JwfHtbBxv-tus2?=tV|n8NJZx1wtFr(~N3d&+n(En@z6C=zOE| zj9zTC(db;G4MrCk4U8@{dYRD$MlUsbiP09LD~z@pU2b%l(WOS07+q{MGwB`{9c>m+xBgwyqbIpNydC_+jYlqz4LcCz5J_qMEw&=S`_f1&8=sQm3 z-1{r!`#gWRoqvsj{ChrEvlQhOLZE+yfV}>zwSe2=qW^f6bL}2v>*Usru)kuPy~(l`-}^V#2U(pce#Q*__LJ;&jBT5kJB>kbyV)(vG+Z#YT!mE8LT zl%FK}?7bu8naF1i;Us(SD8{Fy!%6x;F|NlKK6?*8h{=-^PSOY6alZCX_c_Bd-qoO9 z9Mb->l;nBc#L(pTYa+X-{oVSIe66QK&I_x2p}hWxzA7Eh_;V2HUzPevoGSjPs>`RqEGqzO=JS{W~10^I#b|DeWAp^Q3TI7tT-jyp->s zpo_B3CM}eU<}vTea9=E|0hOC99R0)VEnDKo=UQN%(Ori>NN)eb^`lkIiTiA}8tWu` zpEZ@xdWPEgOCkQ)&!2fSz~^{!AB&0ijT@n2tK_13S_k{WY2Ay~;{AL-rT<0x* z*mxJ)pGqa(l#!VMJu(g@f0R7`e^Dkr_hqW>ug`bleprtF71l>T;Tg5wi=wAcK7Kvg zXD8s*#FPllGgQxdk?N9t?L)}{{yq1^h|es z+1>Hrd5nvN=hbi0af;uUx$$HqapO4yVT27$^}R*xUfK6%{DMeyKbGoqllog1m`MFl z-z)Howr0J~bz_TBF?=t1bf`0I0h>Rrh5 zuE8Iq-L;d`i~oQ8U7klhOfBh=GENO?Uuc{CzhErSp}hNgN}(RTtQOzbv*(GfA3R_7 z^$ObgU-5ky?dP6TbAHOcUW2wXZhvyzeR%JEJ@wCMf9>ni|7d^hARIjezi+>-c_W^9z z1GGoMcJflh?%$yH6Md`anDBog;ePxV9D9k7z51KW^N2HLi^N`T351vOn&7 zlHU7QI-b$~m5yuly_1e_w11`J9DVPk;~ni^>A1W1f5K`V|6mbYLA$9RMBh8X_O;`?~dN_p>nyzR<|pJmWr#+yl? zZa+7^?k)V@tLHx6^IHGrw}mFXPeKdt$41*e-qeD9yx~&*e|vmfoZ{~zGBvdO(*FGW zXq%MZ4~qi1F4b$E^K$3=cV>rr2q3w5%zaXg<2FunRFC^TwlJ;dxppMIMiKZ|v(N6> zg{I8Mb6>=xAqb9$a9>Y`*_pDaN&wAGVkN@j(UpS=XdL6 z8^4$E1yLM)YKl<$eG-TJerp-DOFZ4ro}210$@jKnAs6mv&rM_eD&gC6(-_|uK34-h z^^+6sr#E=$w%$ibu6FLYx}3Ge9`uw+f(0KT~9>qpP}VW->ow>|AE`D zb_zPq?^)lP^CTa&|ALzw9eP3I zzJ`qVntI_!?Qc;1uD&&MHD9#-I<9$rYxQ~<*?(S7eYein{0DBozW3ms1F=3dvDbTa zt?Sj_+;xfj2$LWej#Iyl^T!Hb{X5Q=c|A_YJI?n-Ugt-g&v_7z(|H!>(|^NpIv?YF z+C3bn^Ee!?^Ox%unAqcUGWIKMnu5RR-+CeP{|4iK^+etQ2KKQaEj_WzIg$*9S-qCO8|9A#+z z;QLLjrsuYI2vYo^Eu_MAYqYx`~6dbQE4(JPGV`%f+D z6_#Iabg9wBMi&`fXmo+mON=%fop1DFqjQbUFTd|qvsl(ZuD%U(~O>J z^mL=A8l7VFB%>!7J>F=>=rKl*GFoGFlF`G3y8Wjxy-D)%`>}f5N4fX*S~qx7PXEGE z4c`N5Ke;bQe+bi>FI=C*_lNl$rqI8Oty2o+qIrM?5mKsOQYhtqAxQtwKlx@ye1C*z z%)=!0LHYX+q^W-DN1P`t|KRf%CnDj#UFNS_Pr2W5EqvdgbzfiPTleGYFnS-NWq|p~ z0QHmN{r(7-f%5+olD4#)|FoO`w4495oBy<%|FoO`w4495oBy<%|FoO`w4495oBy<% z|FoO`w4495oBy<{|G2o&(mr1Os(q}{LyR75wAyHu(NRW63Z?zHK6c}_v;EaN_)q@( zQ;hRM$UA@J`FyU|wnF_hzi;{}Fp=WlDP0IX@qJ9F%Gc}kykjx`@3VLUD5uo`eF1w`9W5m6h)zZrxWe(9xCOu8{E0Qq9gL{dI06_J?~xlPmgifr2Y^e zFXyMl#+@sj6aszW?~Zc5y7$vqF6ZmxDzEkKGHK_a10jUexFSnX>IAN zvftc&yUOLC>(l5+4fcI_n|%k~X5V|q=d<|F8kML2unF`#&O44DD-6>b$HMfHQh#W_ zcNL~j)4cr-YS{d7%WHfKnk5xVCqlGd~aD2kF#`WUglTH)) z-ukARzB3B+>2)Sp*B{z>J=EuOZais!CcOV5=e61IR=fA9+R_%M>~~Y$`0r|btDrAG zzUZ&`osEC*{pU$iZ?w;<;~VX>>NrRHtUBJ&KC6ybH?y)PEzps2@jmQGX8d-<7IgM|M#^i|nHQ71_o7D*s)n`dwrfUDrf*(Rm!% zMdwds7oA7JIt?t1W%@m7x88=~y~vHSj^+E2lt{`KLmEHsL%#K{a`B^GtxsGWh3WIx zJ^FtRdAA;EdcXKv@IIG|n{FPt|989SyxGNdH69m>??;~_{Vcv8eU_B>-jCLGXz%Yz zbzK_2FSsanz3=^9X|3o_dOD$_@v;5rvT3>>jd5BDySjZ?+UH+uoQlM?O=vU{pYO_b zt6uY*ue{>t;~M(I{)K6^NAdkv8?QO4$JrxncXpgF1^;UHX)BEPyRZx6d)zL2eF(d_ z=TyE*=slCa7m2U`5Ps8|k>rc!Bey=&=Mg+ZQ-iJ78f+cs&U5#R zJG0AMW*6EcK96}l+SPgd|CVS^o|p9Ylm_fheSA-x=W!kULF#kY@A!Ew&F`4~UJ>f- zz6|qb$xI5A!%K2F2ndS zPKIe+kG6Kb*-M|cxA*;mwpZ7s@p`nqx;~BbwY|Ddjq|m=x?YX*wY~1XOV_7Sdv*QV zYR@&|=V^O&of_wBdv(1U=WBa)-5Td>dv*O9=WBa)9UJFsd+oj~t?SmPy}GV#?b7Re z{5);%v|e`C_UigJF0bv?b#9!m?bY>eoUiTGb#I)n?X~;Zw61fb_UbygsY~NZnAYoF zRIckY_j_JpTGta%xvuNt>$ee@Uxm*pInNkE+;{Ho`DdzZF}PUo;P#OAanCcTU+gv1 z-meKnEPB6YsJ&kkJGp|nm<{bH}7`}X3Cy@n1Eez=@bNS_OrfriWV z{hFfjx#~ud?-gf<-X#2@@ww`TBImUW-+k}F|2LosoZj)e%Hs6|jn{}jbhL2vN96o) zbhIBuM!2uukB9rRSIk4PP%J!!@@hmrqbsRAUIv9?$?F9nRP*7x$ZM2ewNmNOtBhW4 z^h%>yqxv0jIP?n3w;8?MsNQ&mLsv+Ct5(-p!IG5IAidG~vl zyHgKaR_ywbugCn)$+_#8Ygag5-=kdybBkZizghbEe)Gt^@9dtdQ6ER7aK1(RAv(S( z*@ZMYvn4BJ`(!^vhquT7i$G84uA@}X?-`lreHq`Ja`X5$GLfi{>UUL6Iakg(h;Sh> zk^EwMiplYuou>ERYh1MGvPJ&F`i7Rq#s1tymo4-g7B$u{Zdx$UU(mSBzxa~Nmid+V z?@W8kEm=5MJ9|On;$@dDYVjMFHZE8k`gyU&@R8z8y78Y^g~#((QjJd zFP`7%FM{lxB^Mv!p8&fqbSGjUPM&u9PKV?FRpuA|P$JLCr2Tx=4#!`0s*;u9w6W<_ z!bs`ov+`P&%uVun6-(kka&nr34vn~ym08I7tWj50BVWpE60dA->hf-j`Z74GaUcz3 z1b5|t361zH>e&`+2l)x!vwWNgVTdc}V{w32%6q<3aB#1M>0BIp;b1%JaPX?gIXU0( z6wrk@QaG05SY~(!C?h=eEJx$6H@pgXH86Fq1Kwb`6ZlJpHv==i@JhS|I0uSU#xIi} z73h_*JwH@jLc1~lYt5JO7HFH{y+NN>j9(nnn5$W}4ckGR7mkJFQ|}vkLfO8ce=$rO z{7rGMapeldem0|wT1DiT41d0E znEqz(Aj=p38RVZr8GNafwk_75-$I7%uET+;By}$Y-T}=1(^m$de%N0A2hM$gozJ;G z)AnibosC@o>%g~!R;zA~p%Wwdf4Vsz!QM!uS_+Dv%s{Cv;l2A$#6OF z>4tq^ONmN{3g(y-VO>>_;oQ{~7se8LxGKxwmUYPdFb#K5?)yL3+qLr8u|LMqP zD@Oaq;7`1LV}&h$de$eiRQQSUAlK{pWrqQ;1;!jK9S!W_1|?nGpfAvWIBq@;7iT(w zo$vT)L>KhX&pDqgC1egD6CV??F?j6Hp*S))*ynMeSsd*11kfCg_?UbVe58RB@h7Un zOH2~B{OQqW^vR_JW2>beGR|+~|5Q4DyzG)Teg_Qj*Ak zJc{%2uavREW_)7&ojIkc(&n(fcam?&=(%ZvB2c9g06rOXD2#Z$$xi~l6_|F&0P|d=vJ>#@~?qX{ypWFO#$u?hrn2gd4S$x8wL8 z@L8a&;0a*1V?gPTvp_jlF9+q?jE0K-YmXHr@-$nEMzgW8=%9M}cw>=;!-` zGDaQ+N?)H2ngLw^dK~B~(BnZr4>}q2A*e-3&g=$oJ?feyf6o(x(AIt6qJ=qaEV zgPsa{HRx%ep8-7`^bycAKz{>D|9=~lK0XA_Fb(u@Q2O}=pl5?#33?9bCeZ1iKLM=; zeHE1PXaJmN2I#?{GeOS;Jr6VhJs&FjF&*9F%jbgYC&waeaONQS9|8>Lv z0sL3PZv!VV0jcM&zRuf?XFV|DtCzuXkKrt^ zr3CwQKlo57_quHNMOMgm6K53d1|O~@v7hpFQ8`h<*#kPIKaWFZj>-H882orj z+-Nx`zYQ{TjrSt(e8YbNMk;H>pT8Nt82F!t=K=Sj(?oVDiQiL6Nx^&@8!?k`KS?b{ z_k=Dt&OUH_9MD#=S9OekIPfJnH)H36BrY`!dm+kba(;oFcr;GyG52YQNhZ6{=y4Fb z+%U<(aDB?00zT&+(*?lPh16%RVN_7Ez%cx}z3YQt&pKWP}(-;&Q7M(ixP6PR($$MI$00Mz-y zBH#>;hrow!@$YW~V_du}jvpAm6PRfUjvN6}D~|0requ75C`>DG_=eknGr+%u4BIdb z_;tf|zzKAk{Dr_=i!BGv0`G17)xaYScLE<~cnfe2vPkl*hJe0=arcgaOh|^M#YQKC zk0j4l2q0fd`BP0Nd9{Y!{BSz!!Cy)NOUsPDp|qFIX2`QIOiN-quK-5s)#hu#$9PKm zWDJwx+OQ6MjuF%6Vwic#;PAczzN_~UVEUv>|2vQV`{vOnVB`#r-JM5QLNL$%p>Zj|Lkn;T){$1konN_CF_)cIz7ea2t{3c{=4VJ6PP1N zWp3`VYJ?~6H^#pn_$6SNUi$tv@G9__{$VmVXf`iXir|g*$5Z0tU_1*x))*^y0KWiy zlS%v$_$$B}48RUMHw!!ffuAv_6ZoURTYz)G6~Jr**MbKFvo5X$CjmbK?DfSxg5ezS zOyKW;oyEnk!Q?Zz;4KDT3Vt2%N?_U`3w(>=PT)I$sXqt2(eQTQ`+>g;zI)*KC?N0E z9tQv4fwRDm0kdDcF?||%6=i^50H)45;MWXif&T$~9r&HV{SoN62FU?4y~;nh01pA5 zearw?0>4H+F2>`4snZ8O9vJ_;4DfjXOM&Zvn}J^k&H^t5{wZ({_)1{>lN;n44g0v? zSqscIWPsNj&H{f8_>Vjn_+j8TDKp6Pegw=mWPyJLOnY_$zYP2*$^-ugF#dVlf!_o8 z1~6{KOZZz+#3jJ{8%_WpWVjD-jbSXtN>4V-&50Snyr!1}&o=A>w;1Msi`xb)eF44! z_%o2t0)HC#ao`;A7lGM+J`nh-VITNmVA?PP{Dfhyg`WfdGx%BHmw?&+PT)Tq-VEG# zKW*C<;56`kkjVj$24-E`fe!=z4`5!bjs<=jFavx#u#6Y*OyIfT=YZ>h=}UZ2(QKIO ztPoh*348@G+fxVJZkTJR+YB$<+bj8!;Q;u1h8OMa_5CIAHk`X0@-GAL0L}vc3HVIl z9Pqn_`H*BlTK8u%!21IKgYv*W@H>dx7^!94@T^$XI4AXdRC4LLRQ* zWpVrj_*0;(aXbTzZc}gR3x+?7ro3tRbHM*J{CVI#un6V&cH&^V9Y+qwF!1Sn8MJj2 zFm%Xz?-1ZG0O!Cz(r^X}P6ysdK9wPD;-5b7dGI#_W`LRQ#zEW+KHHxIzS1!7;hDaK zV>|Gz;4{v6rKr>N_`pnG#^ErklzX}@khxh(_0KJa9|j*u_OJ*bUs?wGIQX;~(^H0h z;O!=lVUa}rtoCK_F=ZsZ3EW}Wh_oKzg3VJwJse3{&JJ? zfvK1Fvechr%tZaZ}?{54KaB@u`NQ1 z*fwSd;nPmEImgtJ@K+;4K965E-3fp~M%wcg$OOiJ5cr$G^tWFtPu?T2Vj1giAj5vJ&)twmDtj1zeg;gP zLxG@7oIHFY9HS zIp1d(KmNRL2lT(63{OM9q;1KM*>xN|K9j|{GQR8!^=EMKxhHWJho!_}6hs1%IaLll z-&2-1B!-QZ7-RB084+G{r%HTM{a1NNZdK@$ZCps2&Uz`U>jIb^cHbHINZI0xJU{0#X? zJO>7*uVk@?Ukdzh#0WHPz`p_J+B*xpjeM+)_XDL5tpeu0Bk^ir?pYCY-{Ka?6L$jN z4jce)0scJjZ-H~bcL6^S>|vd}1(^2X#p=7jF92qN9|L}gd{p`)V5G7i2#Mk$=hqL7 z_q56U2>BO)F+39US^R{_yb3<&qi=c0$Xt61e6g+Ze{7V5dN^nP1{wB?spJ5xV?bdl zmtYMorz|rAAVZ(50!{%-AAvs#d_HIvM+NYcpgA10q0DzsONpNu0BcXje98edjlOX( zbhy4A4$Qg8G|8|JTmuYK%YHZC7x@JRkR}+;0`q;5ul`Hvl7*{Zfd=d&Yxx;IB5`XMi^t z{ygv(46g@9lKbrYfiWJX88E&F4A+qK3&R=Yes4Gn{8z&{;QqeJqdg-GvtLIV&H_(2 zoCCfTm}3hf??Ab__%0D~2FI1Y;wXCAt54Pe_Xno`(-s2_^If=o46g6SPFce;VXgNoW2>DcFIA&i;5S4R{shc8lELwc;W}VTi7F_29ekv+`S|mmVUA;R1leBMUxa9z*blB} z-ZI`ECc_wDDNzZX4*%65gwc^P{=vY5ac+tAvjX_4FA*QaBe=9&WX-V zyk{7v$i6YNuH4xhtOVzZrNn69>JgGF>jTA>WGt^4skR*mW;<}w%K4ca@mTQh0A`%6 z!(mCr9+&sLZ~xmU7y-VB%el85m~j@V^mm3!fnPJsv40boI?HizjuZPhb{L=amW)@Q0EjJN$~M=7qW+stXBqH2l^54k$UVeur4P2w+xc@hRguNWI(O>BJIVw%)~iP z>@$P(elllQ={y9HHP6oaem)BKK)q~F1F-AwWx$kYf0r4a1kAK2m10qe$50PY~xZ7j3mz)W{*)lWxLSBb-o*S z*PgMEpMOYnZUAil<6Ul;I5IVo8h!wHsNsi! z_cQz`aN6)sfIn(jHK>cR-_#u|64zrt$cNv!)Wbhn_DkrbUlG3m?0n{R!|co3z)8dn z%JANh@f<0cJXA5tN(LH6KTC!h?gxB;Vc2KrfxzI29ygDuh&pLc$n-fJGQ?QgCyqCa zAX{>V;eo*C7#;+C0WjOlb{;b}8Y5mW-58w&zUlYq8*YqF1AiEd=0lbV{gW{|6a0^v zG0y>Bt;OC2zy}zgZFb|uVrN4aC&`Q3FfLOEJ(*t(Q5zXBd@{NDg` zO~L_s&Tt0!MZ;O(*A3@@|K#NR!*`rK@ZX(0@VibPxb$$-KLFPN!x`W`4QGM(Hk<>t zB)-gc(Jy^t{@-ptn{goQ#`ZJuyM~>$pJM@2<@-z7w6g;0leL z3dkH{n0(krt}O?~&K+YoLjj~QY$xau#?JvWxi%aVJ9lyntCYqeHx?WZCaBE&Zv`?Z z<2;Z(4#gi!iSfWsfIk9l%z?@HYw<@6l4w&!j9R`}k;oddzQRiRm+zc?^YZH0k zca5I~=H4**oxr@uCC&l&`?%umz=I9bg8KtcKs`S2Xv3Yr<4nefVUISP0iI&G&I~@0 z?F8mKTL@3G7kjqJFo0j+^Z+w`9P%09xyH`|Ukc1v*$LbVEP6~HY_vw(&MG5zPrfzB zgL?7ttD)y`WMU~X34LdBGLNIplL};xh-Ac%Zi1e1kXa21vd0l753wHQyl*!zVVG%ZUoK(UkEJMFF0lc@Mpox05=1#1I_|31HPF0;neNG^9=Kym-)aM@YjIfM4iBV zme35G1HKJ>Kv_er2fhw!m^J}p!U&)1f)L$(?+`v9XG@_c=> zuQ3R0`PPHwOv53wL7`U(e75O~KSQemA8hIGSYUVV$ASAnKlJTl&oz7j@C?Isz%vau0-tA?=L42fKmQ8=r+;_&@%7s7$QRQ;9hJL!7oZJDWp2D- z+ntWZg=lmZg3BRa2TXfi1w0pc9WZ@^d}5|zHk<_+Cfe{K!?fXS!?a<&VcKwxVcM|4 zFwY14KsKbW(&k)ivz<&_YZI3N-wypqW#16;!S%cL#BFP;Fk|xxu8#K}C=AN>Sc=Oe zPD6R8wMSy93MD4vgfD{M7yg+6kG5)oEE8?Dz%YF^FiblyHcT5XG5j#_P(9Uq9GK%? zj{MJoFEN>CfN3A{e`}cMylmJ9eiQgo$Yg*mNgsKh>*KqSL6T=?Wv4`SQU7ID7w?G| z0{al$8#3I}tHZ&%I3^2mxMzvWfrml{w+ix&)o5U*BSER|EKu6^5>Phg22i$TBPjam zeH#=u^nMEpKlR=NEdw2PDq;}mQJ@1rElGb?Bjfrr73HYA6qiizJmAp!;Ovz_-r0!P zk&7Thdocc8Y?!ej0A{>q*$Ts1;A;$b0^bD8*q6g`8!%;`#L;E=8Q^R9Q)d>K_9b2gY)SgQ2t3#KS0T?V?e!M0T&sZJ1%}OqUv^sL zTfg=dgGj=;J=Qf3P7{55EJXnmbo3}c7d&2n%gI8h$Mlx1RnNGHO9uSPlbT!Uj0 z9UAAav~yg)xwf2x09=G+^Gec*QtXMjsXm8k`i!#9b0^bMwXMy(zrp+_su$DHN zX~5$R&m89^jyHV%I9-P_rd=@3OP&cn$D$7M7XaT+oxt-;vC#I0M{mxDNOShO@vw1AYK@?gaj|lbHY?a5BJuGTaGVf=05PIpA`D0C+p_ ze!v{ZH-Re*?*N_vjDPa6#ib2#n;oDA>+!*#%IhO@x! zhC6}R8O{OUWq3RAeTMmgWzMh<{J7x^@Kc8CfS)s*1^%7kPT)6zC2j!o<9(UelMs`E zQRHQSeZzIY;|ynkk1*T`JlSv#_$E7T_JJoG&HzsZ=DBsi7Xs5(S>R@q$pJ4nyd5|TJQOngSoIdeKJXWSsV4(` z7chOS4)|fi^N;sRehy4OTnPRPz-(t0_>YD=flFHPu6haj0=y^icY!mLQ77=Dn|4`#iiyyQ~D*N*Z^ z+6`X^{5iwd18*_B3g>>?@M_?n7+web8^fKzuNmG9{0{IS)U^e8&o;c{k2d6hhX8M3 zn@7XOz%oWvc)n-Y2R;$_t86py*}(hYvi%GeE?h(02%St9f`21*!jKKX=aV@Uu?2WF zU6!>r3DZ zv~?LU$ADwTH7B1FPXpfv=JQeZWi0TyICnm92AI#JB}M>SN*sj>=RyXo(mF8t%;mPI z+=DA6$!~_tr;NW8_|t}mL;mxISAf3<^o)i4^}y^4Q-@(6_;ZFc!1n-iZr9=13M}&t z_&bK_YdohvRfTSN7x11^x_pOcw%w*6c*B4un7vC#n9x6+zHZHROb@c_m4*Yn(^858T zA-|803YJ(qv%s#8oxoRuPkZKouLmxJ&S}Ws0el}Q(?($Ws*mGAVES7I2j7+Dc-GO4YLz}1nvUO;INc91oiF!pM9wUv)>hZF3VGfGr-Re)AnS6Suai# zKdFEWaSjKcd9SDLnEu0As3~zw3?CcAnajzz#LB>$FK2+*M$s@GmM`F zJ{Op=q!Y(n!&`uvlDO_u=Oy5yACi_E_K~{=*v9{Wn+?x~#Xn`ZPR@`&2s0X|F#p6L zn;?U>uVg#F0z97rNDtb%8Q_OwdcJ2k3;xr<^ubOXFBsm8=Kk66m(YfP8vb(R0n!Gx zmu+CC@0C(0w%rr>K^u!f!04~Ul3~DZybeD=v5#{tiO#R#Jg4&j$m7y1{hFY9MDzsH z<0E&b;SBIh!*#%OfVtkwqFI+3z6yAm;j4i^VfY&0>kY3&cWyC!J@}t8yb8_gGJF&8 zy}-2FYRGV(gm?|6*+a%(hx~U;z7zOIhUpK#0LFNgW`Lgs{<_)f1>m{hah~y=-*13& zPV@Tt2xt}upP8|)9Pk^ECw?6GZNpCjziXJ!y833-{yyYb*9D+Ve7~4=<(Scw_$K6; zK=%BW;fFzoWJQNOI~)bfG$|``g7GK8dk;&AQ5f(k*=XEn0K0K_e(0Mph>UwT&M!qK zQqz;qGA0O@avnL~CeQ7m`M~vAyM_ZZIr)pTQ5$w8kEV;SUJ{eP+_3NEQ{s3CT1p%m z!*W5eV1p0=Yanhc-+6Hz8T2VXD$Fm+T%wi4;xE--E^JGIeG5G zvu=0Z{V3;oKeqFL2hi^<_2*c>bc5su{uKPE$Q$tUDAS+5`-aIqWpeKp)-t>yEPJs^kBi3);mrd?D)B82c%UIb- zAadR`0G`L=+a~vdod*_E;`hi~8i1+p{m|roS0MLFOzs58{oLeUE|B{}Ob%1t`;E!H zS|InwnA}Gp_oB(YULg0Um>iwu4<`3!f!td$x&HwE3*_KNr9Z$q^nKcnsRTD(X;Au4 zf4vDC_?H4*J7T(g$nIrwe=U&vM@;S=;Qb)iA0d$TK2*=~P64IZ1)yk#cPS_bCksls z+d*-y_Pz<)7xX#MexQE=#oYD!Blsf?{Ch#&@5SoQKwvMEd$&L?!Adm^I0*8B z;1rXSpb`o8kQ)JhU~+?Yp^tHDwaM+Z3pvKh`%P}|UC12-xhG97WpZy62M*nZ{vi+1ue;;cLao-s3AH#KMCwyLR?J37pj$^bS>{);wV%P`8FD^^#rU6&;cdesnTin+ zz9%Nb_gaud|AR69!!i6=4D;EglYctKe=UaJj$!^Thm-GfbA$)SaAgeF#PIPkJS~RL zi{ZI39LDe!G5pCG{(KB?iQy+=_?Z}fJ%+ue1&h7evyVIb?BmXxeajiUL~Z;nT4x4Ga)xq9Xpg2%0SSvA9w>zKm&cF` zg|TkLZD?e8Bs(@Rl*^74LT+EZ`dhqoG&+7Gm+q-_MK;=U6E&<}Qbqy9dWv zfASi5_k|0ixeM?zCZV9&YMH@&u{!0Rnf=8&rB({z!r;jH?!hd+Y%n~Q8%2Q)4B|J7 zV8wo}Z(t%jm>UiQ`7FNw&~4@tCD=e!Y())eXGt0~4fopPL3=pF>RGa>K%4q_&>jv2 zrayYfC)(lfLHTu+}tKkg95dh(~FvS<=wC1LxJ#s({h@9DEow>7o5 zho<=R?D5X*$o1ZEubb$4@*HAI`Ns9Uq!bG{uJ#&$q<~IxpIz zr$wNDMbKEIvaquCQDMX4_j%Jfog?cdgHKWII|~vhB|vKXYcCuN@~^ zvnLSXI)mt&7T7w|b0;@&cDAWQ%b0Ok=dPurxv8zWr9GzANAvUs9zy^0+2)gN>%4+N zTWbt!o!Pmwr%xP58Kcb49Lhd>?o5a9I(wa`+Mdm}wwyVA;)Qi)@c(Q}Yg? zo3<0rJ$3HXsddKUDEn;F`b=eRA3xX8oUN1~8a{jSQB;akE$7azuK;R(?rc*hszFDE zN}x7Q9Y1~MTwBw+cuD9j*Yy85LcXT=$6KChdf|P%*eHC>wx`hY&a|L)qqh4R!055r zw^uYd{!~j_M;7hiWUFsjcPt(`Qe%JYUhc<;=;A-L^c})OIbmr&^wEYJ0kJ zmbRTb@z~)*hqJB6pRXKshTPutsdG(dPgM5d^x5Z*pE-SL_i6}kcDZZVt} z&Q{E#6K7i5E64B@T2o7FQ)OpNA7WL}OZGh1GG}Veoo#PAi=J?!f^9j~l11*FYs$8^ zp?X#fhjuFVIB3Q#=Q_@|wBc{l`to_I^;Gu6(=cq!>HwEk%hRpT9X)xv{rFR7Dzvz> zO{br3&YnOQ-ORd+IoP^mSQ%vgx^s{VMfQKquFC@yzsW8xpb3ud`_H>$`9C+Sv|N z!4vE3cN|CGC9+LLqmIrE3{RhUcB64m`-I9FD5K)>lPBAn+S*#$)>msW->}k~NbuC@ z^(jAzmT;<#!dKEgQ&VJ-XR{rrpKU^Os%(WV{?zgHkmnU)Fy z8HDn6LARfKs{Mub?6b$)p9wN;?H@yR@qu|SI2d!?IiX={>>ppGHz&!{-R_v4Vw#d+vCAF{)JJ(##+ z`o_7N%;T_rAiw>+qw@RGcy2t0)dcxq9fbcL%zH7f9O>&Ta?fC#mA#BinZV4qfXP=OjCBtTa)K{TB}SN{ zjOPjipUDMGnlbrwmPgMIb8a_?&j5zO!K}bA%sCl(IrPSV*+S1~_gGJV`P4m(o{#pk zSv=*tM={;O++}cNlqRDC7y8HeFqrFu*YH2fq#zJJN;rj!GTqHFb(RxjnCcHEj)D8Cyj1Do{h4G;w6wk=WNOt66_htAM z7g&1CE5Y8};K0kdQB3l&@Pe6ZwtEbVKv-75d2mqSB7Eu@>@E}r`YvN;IMf4g>A~O# zvPz(51hqIfh6&}Rs4<8&mqE0TVJsimLPK0?8a$Hi?=JL*!ln3oX`pW)%TG}DX0eWd z>10U*RV~|xbt9~nbmt4>@w<(YvaGTUItCYABKd_LDK%NtlHA408ZuzGFQy_F6II|M z+lA2)rY^2_NsZ0+XRf}}{6jkpdWwIw&I+P2;l zOHMV}##CdSv&4b3DoM*`FBMaWYKBD>%Xv1(mj}Ctvxs+mkW7w`V?6^X=<_)&-3@o= z2e@!lK-EA=Fny8?{bXftmd$WK{KM9^{6{hoDoo;*g085AclL z-@{Kv{J7X>H><`^X3~Kl!%Mcf@L(Nt25P(^gA5J;$5yM zhxS?0IFIHsIC6nzeIuinx<}EeNRLZ@;>Sp_aGD#EfCjVZPJ8%RtPBzwMipwZ$&8@v zd$8V0|769FPx+C-0W4C|3i_6w?w)>$_z3(hg;p5uRevr~U!u$fp{!srQe%aebTN!Z zXk9Kb96{Kbh$}JDe$0YSyEVqGyN4Yei)dV;jd-x{8lf9LjPk*?WQ=KOyd{?yC?qvp zhF8x_OGYu+932@)G}-ac-Gu^{rMb|k&vYnb6`YB`Q`!)Hv$n2N8^+(AZTpCOFX=m$g46U^Hh*#(3O^e&+mm;W8`GAU!Pt zo_a5!<6?wzuw`xFJeo;1-!FAk4C10&S#THjg8Gf#3TnCbD&xKK4GKT?LN{=*N>0(d~x=~h)g2-j)ta>FWv7N|A zg=rW&g%~}umJK@&ajSv@pGR|uh$I7IAFbvw{Edx3fRSKEd&UEn{3+|AN{R)Pz#$cP zkeE`Z)|2h)9vT>Ad>{wN{sx~U0MRQ3B{YzK`RK^7TF2l5=-SXqDo`5f-~$G}hYR!`(7Ib2kgxECKbc_$a=S#0JJP z`IQ!+(q?qWn8X6?PDaNMn#MMWRMgUdp07k5;8+Nk_rxN{4|KjdpnHrBJ|EwW&iB zeGJlR2JUZ^v;g9;d$gy&s0~Li6|F#egse^x6!MFF%Nqf74~%J*qVxv)iH^8HVq|_5 zXALiLa%DQq&M;awS~AiY|6bw-Oql2!9kM}oBG1CaMkob{^Ow0%sVxVE9oR38h6}l2 zbYM}U;3h3?kIBN5beO&1cENBE1x!V#Y`oqpcT$SVmT6vxBk6koZR*x#fKs zGrK%?;jq0pJ{))JBoZ=2zZ`~QREvr0m5yu(9WIKQBDXwppc$AzerK^ESbWCjCpR^* zi5>Ha{c-e;?FrKv6l3?1(0!B*1rg+koP&Tg(0lk0j3gR^1ARFe33~d_NnAS9J;{6!7V#UF?zB=L>)J3kPLk_sE4RG4VY zal~eze73<1qvs$8nV^Q~n}>U`0Ks`Snixz5unlUq(Hc23imjJ(^idl}WN}~w0~CaO zbeeJhALFMka&RO?2%LtA6d1kE_T?auqMo5HUFgG%KU_rB!cY85If0VE$hgV^@tN^* z!*TuNHr3&jgNnm9>h<{?T61@A-2>99FfGDT$w*(_c*EZP8T`%c+xtM_;=@n6S;+x* zwPG6+DDet^MstYbaE4isla&QdL2TWKBRnTun03WTlgzvhF;0i$1P;UAIOYfg!xUqX z{<;SSdiQ7Qi_sbA-K&9NFwDe?z**G(jEpp;3DrRF0Xu5~&GJ<&o%Ws2V*ahZaqd;- z1b${-c_owR9pvn+v{*MjHZWMgLLC#oKIS-C8v!Huk5&Fu1QSGS)!+<%($VLbx{z6^$(OdrlT6ahmtUvl4vdTqd{O?!QeMC zKH8JRL+m9{s_QeRCx03F{P2^U^dW}(Gw|d<^kILd3H!Up&orIY2$$ukIpoPB=P-s@ z<`fw$;W8Nb9%F+gIb;*FV0dh#zfc#0m590=jt*I~m~b?lOCzHfb$O+7E|=TUh{wv5 zhW>=44||ENwiHmfG=K%gOkJ$Tri;3?u1yZ)OD!PpN@^fqxuBA0X}sujS*FGY2ESbc z%Uc6mXWJJ6BQ%gdf^p78jQGB;S@PF(Eolk^{aAUz`lOt;p_GCtCgmSnCkJl^Z0H+h<2W%FxKZ7kdo^Xl{KYEMxy!R`@Qaw5# zd3bGaW4^A-Sxr{VSZj`!-E5HPOqj$YvCOS!!00v{rA2npxzWmfLu#v1wQfF9JW^8jl=di#7T}sS}<5Kpuv1 z0Sy8kRs`TRW|49E5|hvn}9=zP|U4{@0fWalOfI zKhc47Yc#^kW7uGmL~~mJ^D8buFx2%$N+-Tdr5wr%U2K#UU79oFy`_x7v&$FIKQvp! z^HQ$R|Le^ZoY4Dth*8)e^)S44;%VWUY3F%T2!}TMkX-s{xQMAu~e1fW0zFc8&QMw zNlto;9u|(WIc!qm2W_jn_hrmr_%zxrUSMfXOb2=~oySz0OGY`&7>Cj4FbJ5Nvk^!L zqp*jb47&+f_s0qg*VVE4stYag3~zJ-|D!2H!W=fTIa3-6cyQp)4*)<8avsz=37oP^Ins6%d5n4rNx zn`{OO6S3miYS_nf%uxRZ08T*IX?5wZVUL{-53>(qYYg*ZENKnZJy5izXWAi~aGoW> zU>;aBj-K4}MCL4xJDGUSIAb+THu||%p@GEhdF(%6ufEPaE043D`HBHCumh#T9&t&h z0M8EYmxz?5YdD9o2Llj{KP#q~WxK?U=h5h}oU=jVWD5O&`LSQ}`uN!wERskudIHSW zhp>W$22jX6@BpXr86;eej4-NHu>;4Ul#6xu%635}#yZ0(en$3xFf?Wm5GLb@?ESqj z4&Te+(MEoHQl7b(BcUz(w=%Agot2!Ia!_9L$UO7}D^w|q)8I<>Eyv;F;Pu$ow=kI2 z_~Hd(8W%A>fNNW%klzpBPF7hEp!}BH$qA4TR2R6KQl2NVJ~VZnZtw8T?Ye6POXb=% zL#iih#`;?EgP{i-l#thC`Mxi%-^QOuOc##_=CtvmKoJT1jG&lMo71bD1;rixjBQsBB578HAUk_0Px z6c{CzJ$bC7Ak>TJk->Pi0q@fkl>$2dweiZ?HM@pe>iVF30q=8X^Xj1P2jV4Up1q9%5Aup*A#1~ne&9va2M zAzbpo^6DZ)fb+Q!e=24@r$L;S9l_%EnDimfAh(}tDrR?dTgu({%Wm`VFemV_DD12W z25*eYs4|Fip?J^%r)lCbA-wX#BWB!I!*QVzWH#pS+%Uo7ET4*+M~j+AO_LJ`)s;u_ z2``OxV=jZUPF!N(W_*EVBo90>77t`a;ivzS9?y~j#=bCjd_{ zF+mgJYACz?$6l4!@b2}1l8x!z^3x@$UtvqA2S|3T3w{Qb?nRbBHdUUgbCM4Au*O)XNhm@ zgr>1;L??d$K|F!g9MxGb9>b2Ga|4T_F}glX^aitWeUnRt$Ple?SRtZS_6R&xd%W#r zlxGgc1*fv*Vzzilj&ZXn#%v=g<^xSTnLM3(*1JJm4ym!{VU>$B)mV>MgjR+q9v!vY zQL&ks(AisO$;&(}DRsWaiYbHovalzQLG>n*jSN*QVgSU9AjT$(vBY4TQbcYJC-?oNXtRvoX?H+ z>04`-%9R zFO3(cE!o&npLmdC3=J|407qRvX6wxBd~;*64inc3yEtfA$g+!-*(X0mLmeby7ZsQZ ztjz;Rz;oSP-9NZLgYFm)c$Mz?mbPcIP0!)&n06il&*I&yQpx9rd1z|mtdPUf9Q!vK z?4y)WCKn8$zbOd~G5)Gyl|LS_(L;+_)@?SMb+eP?Em=vFYmoOO-k9&q5A&~VLQu)S z{TcKYLOiqgE_^9b%sY~ z$8k8zr)a|hl{b&@=GU{Q@p@**iRM_k>-zb4tjG8CQHPzqtLbdZ>;rj7d>EUW9Q3gV zseN}q-%$2E)+1VI_ai;UN9li^zMePM*Rhp&3^3bW;HK31?(+kKJPE85ZJs8;(I`2> z>7GR-LCcFvaYM2kkE&Ci^+OQr6E{d8TMC`txTd=YUJF{v8meK18utvQe)eATf!Vm_3$U@WxNmB;*h2flAVeA=J* zfu6Q(se-wCxR&Rc1#oTucrOGS9e*Cm-~hq>74m1j#~)}` zFDpFd(ePb6BU-T|eY&OPWDJ^x#~{-+AL^H{4*3G3$FXtyRUysKOcV+-#pyq0p#_}m zsI(4H@~C(Y#n!71B*jxN6@a~BrJiF0S1g2w9xCPX`$qaYR;k-BaF$}WeiGKk;Vx_ZbxCGyDpIe_M>J&2IQGr z9K`3@3aldV{EdlqctxdLzjTU)qBL9%7jW8tNDi9o+*B7%;FM?hGyCxN87gwBySKFi zFNZzdj@P)`o;_5D1s(0WY~95zvpDxfX|BxuLFazM6F&PhdSeN^)AuJ>826}Lw>~{_ zr3h7zl~Wx>Na$7P&o#4-@KykvhR^!9+be+MZrCpV#Be+CWw z;8C146Z;HIbAlPBIl=W9vDm;fX>=jS9?OE%;4rV?;uJ!rDK6PzkfS3wNhd3uxWk4o zoT2v0117LI&4@FN{oNNaE5Q!6_%4Tx`R>>l-pxa7Stt^3sjjgQxWmbtLC$ux@rC)b zEqn{UTu9j_2@gE zqDQfYuy&$D$#oC$>ZYj2>S=mx^Naz&z>Z5 z>jT>B6unV4Pl#A|a)O&=qO1n%{u6s|ot#lnEIURZ%e@j2?wRBV@xCNuB{FQW$HQ8L zoUoR7%6vR9$yD?Zi)VT=f^m;W-H<$V9tXw`;8d(QJ6L>OuHkLK`eLcZQHmAWbHAk4HAPLbw8>hz~qe^0b^gtoLo>7edb$YDDRyv;* zJub%Ad&~&N?A2C*v00x?ig71<)1!o}`|%i;PY2>lZ`V~SZgL|Ma*R-1u8XL;q(ygH zD2BoY5AIZ&()+{|aLCMN?jk35oTlbZxHICWx22{Lk&0PoeK%atUr-zkV2 zGFo#X?y9uQTlY{#c>gepwL^BWLlz?fI?JSod?5rePTnHH6mU;{~ zpJcV+c8VOol}Ns3f_L1vWXp^4HsxCt> zSuGQ2c=%<^yh|!}U`Egrwl!8Ugc|*fX)GDpsu?V>BCfAGNv6adod;M#*-ynQ3S|e5 zOFo%L_A!(U4v39j&g^?cV!@cK8#PMdvtr8;bR8b}TpHwDwp_yx8-J`NZRiK%!lGra zu3PK3IH4q2o>(7!Nm5p6ZI2$ACuIx#6+GcU4L`XcS~}@N540gdnwEx$Usl#c_Zkh6 z4tzr-ml`5yT|;E3RIw43>K5$At;F)ernQHyeU`xBSZqisJ;Z}97%Qe>GhDYF*4N;y;u0Hq)t?O9JWnr>QskC5AvkkUIn~%3Q z7nc@`*QXYDM(L7@K2xA59SHPwFxsgkFJ419G)MeR7A}!(72D*xUCRfsYU;XXdc~Mt zYde&7s4Rf8UbA8V=r?sgxl-rJ@Kox;!7lD;KuTLbda>QQ7YlsumGwrpR*fw9Y>^(mM?%fYf$M0viHoEKrlzR3@u)-E>^8Pov8`=veZvM;a`Ig^l?@NJT6Xc5 zH30XuxTC9B1AqW0Q;PD5jCW=wbii8p!)S7)#%)&PAQN*CZ%r~Vo~XdpH9T~e8+|!f z_duLkh-_36+oU=~cUW?;!#w7#RBts+Y6z`dUpu8upL*=&5B3f}IEFcu#4IB>fM7>e zBwLO4fy_x9bH%L(F@x?++THbUNHBC$F(oP(+QF>U&~{FFOdy_lF3)bCw}tWZcxfKJ zAP0=~*{74n@*=y2MCYYKlkWZ@Qla@*(GRAZ!t_2lhp|y7SV6K&ih`9Oda=QdFayFc zikVMoP(yGK;vd$)%QKkvnaLDYad8_jU5n?+-#;$JV61OQ#DcP@luZvx2dJb)6jue@ z>8TBu04koHD)Xjzq$)55u?w!eh`{4ldWI_T!Np{~2gNAJ;qZ7UJibUJ+jUqf5I4oQ z$CC94Ihk;+m(9dAGHf3gbc&NYJaX2_^XU3Ay>=3An4(Ke$mG^7wq}U#wn^60?FXg} zLh>7B{8r&&4mf1HtJ}BoIH!!X&`Ku?W?CCKpdgn8UnM%EfpNyCEb5oaR z1N6>zy_dhTi_&~|qX{nyCi?E}t~=6Tt1gvi%|39}bSg$$^X=?{r;fB8t{EdSp2!UMUpIhjss-l7aPav2Q#_B0*;Uu>wj6nF=`d-(Y4~dfnPWoR93_yU&obxsT43T zD_T_7O39+{TIDeWZ&c;gs6v%jlk2JSYV~@nd|7m~grHYkd5x(nhQHoMU{O_4WiE?V z-u$kVOY4fYEOO<=sz%JK>nqkWzqD8_GI84E_GOC2S_-C8gk7<+HdN}ys9&K#seL`A zNqg5@l%*)FFD2{Ai?LKIXgF5Xp;94IFBW8s@il$^E_%e6zH9ngtU4CgN+q$b>Xb60 zyxvg%dMb^!){-~ZU1cazc2MtCy0%S zQ?g2bt;R*C6`Y_nMauS3q_ukn3fa%(Mn|yDt?B0iHH9d%iNjt<0e0;MFdeA>IDU@F zene*Ap@+u>HcOQ5Rzx1Mo+0rz8 z@YfzTTJTFftdyx0S13}4@yw*flfTS274Olo;zzhBnwRw6U*t#acC)=)FM0{ADn=iQ zZxXqJi^oIJ2?ZY$lk}szN=d}52@Q8N_XF4$<|owFPvfJF?w+0;-YyjzW4IUHu1S&L znBcK~&S@^P8{{L-np$wKqfad1owoP4guQH9s(-ve!b*JG*o$k%V1rYt`nb>{`aX;C*#C1Y8*7 zzACPM$1Y+2jEbyEaGLb<2WLSEit(TmhO0sq`cWE4oT5>dAm41qT(Zz z-U5EJz2m%$nA(|ar+|{+;MyCpk4zWk2a3rEDBxm;0Er|7(yBfxWZZV zEQ0tZL%hY2HadZ+_s=#Fuset53de+17_6o+G$FUC!I08!Bn=zVY}b6S_mmT-=wDyHK*wGdRE;=;LQP zhH+=-1)LZi>&Ic`L7WLj=_3IbQ0}~oO71xB8x?&%TefxM&U)TWg@5wOsXSPe%77Q0 zmTTZM9_EaBg0vu>J;?oH+L$~2_>4u-HG*3T#rJyBsGGcvVuAc&dJ(9G~oO~PvIz_WAF8Uc9!C7~FD5h8*ax{vC zpqX2;tr}80i@InCycU4p8N~{rkX_Aj(r1eUPKO>8LxU{hg+&#(gBtbiGLaQT_dw{qlW^w669i9NU+(S^VZ2j zx2GSUlHqYc3`KHpf?Pz+EYkb_*~=k&Sm&h|W^0nHLaE^j3>s4lS-|I)aQ8O$tOKqq ziq$>j2l?3>d7*=v1H*kIrTzy8Z5;6OXLKhhee@^AQ7Rs|)1j*e@2k)RuSnoYg{pXu zvFOMh>k?QI55+e-gqcaKMgp#G#Hu5@sJkp&r^7xkIv7Jip>Oc^&>uw3Gj-P6GIDrR zoS!Tf%iXAM_B@U*tqi2U5Nr5|62JBmdqVnwjKDps7(}9Rx1QWL;wJe3`j*eI=hQGE zS+bLz<3#5vwNm>e!*HyQBBU{>f>T2;(Z(WN)M)p z(E{s<*hGHtO%|j=-RSr&TJoA|S!p1<&|Y4S<<1n~tFtI*zCBZvmE}=R8HaIPA&;v^ zqYhUH;-e&+4tOOs#xdF%idI=b{0>T#C2*H1L?E0q#3wU&Ya0BEFId2K@j+hMi5HqM z2n_E0h68NKweQ&Plv_`6K}P&$_TWh9ABgdwS+)S4NaKe91e` z$UK~D4Cq#)^i}M$m_u+pa*5yi>Ekz>7ivR}VRi*fVMdUj@UZ;bJpxDsoh(7QKo?45c9vNo|mh5>XB! zL-AE2H)iKXI7Fkb$)V4Jh$4hLI&i%azxd7WQA8F9xcJN&@((SI{UBs4dB9l68!N(? zh-IkhIJ7QDTjFG5EIwnD)YuuvmRW$LpidlN3iz^v_8jpC-#Ckr2$$r|B(lVbzi6BM zLF}WUc%+Z?X?*zNFuxXqSLbBJ)*GOhz4)i1RKI*u2RA_RT0Yb%T=JyfGJtqG$}gTl zn&t;|@XK!n#BVo9P0%lAL=RvWDMZ)Q+{Q0Xw&A@ueA~9;cw0wN$CxD~i8wExSP*AY zHc}trn5qSx!x$^RmKX(z`8`@w1`4AwRwT+_!sjVem4juHc(}Aok)9Hi=AL;)7c@)u zWKpK1-e^%+tz)p21PXDF_9GkZmsal!Yy zaamkU*Hpx?`3Btp4tVRESw%C|u`?mph)bzXl>4YJ0y-Z>$9$Bkp~oGuLUlwgCnIBh zOmkOi@E|U$?;9!0Wq->T<8DPOby(e2jBqL2HF@uU7kNd0N`-)3ZwhPg?@yB4qyK>9 z>RsqQwXEo6F_j}evhNk+%2SKQmr(TN4X<}+sKcSk6lhQKKcdWt`ILK#M*J zd=K6CX2N(c=etOTIQ^grQAbHqd<-kRu<_l*PTt=5V3{mVt`Rdz-A8@qMUD5(JzDcu zGatn=xHuKfk{lsrg-Rp#c_s$6CI(^lOP3X=L)G$uHPtHk5TsqZ|xISOJFPcG6 zu^y*Ug2fmYyG2oM_9z|5$9ItA1~W)A_K5r8?2%)-$O~A5F+Gl-?jWFy`)megj+v`` z>tx+UZv1>uWfQxu%e+A2NUjkn#Ugg$_@+RV&>1mIWqa_oW?nzdg+pAR7$0yuxM&z3 zR6ZoLFG#jL?F->XPYSCkF2N92M?!M0pHn#4-tgUrp!=6?O`mMSy_$F%!gS*HpVx7F zoT2=FBfDd+l6HDiStUE^#V@HHUept0`?;;9wYBMFydFm47SsKxrXQc;lYDqge?O+b zxCo3@qV!3o16ioPAuMd7*kn7h@)ZR|dzCk^ipHplcFA^f$wARdj6ivPx-P>55_x$G z88@`Xo4hv)L45miD_# z{Da_&j(-STgS0SDu4tNm7tdeEzwpK;$uIIASlTuh^VV}StdWnw{NXE`!bHL|3C}9; z+>La;y(!Eqw}baCYzhm?{}{aOE1SZS@~?nzTHX{^l>ZO#_V*BZ{Lk>8ychiSO`%qK z8hrmZHic&8-v?JshER*LqW!-I@BR|XNEzOWs#o6g(GYHVEriB|n;q|fdB5^Auz$zv zAxwfli|1GIuWEWrSX4Iumy~}4=DTLLgn<8P-?&EE?AI!P8+Pt^eM_iIxL*0deIY#c z#+J~iZ0?(#c@@kjm46=gtLCwe_b{Fab+d@FcH+5DeXejfJk zTHX@o6JAK{FDgrV-`f&am1p37+gn>gO_j?JnAa*Vz`W|~TSC3^AA(PO3+Yv^e*o^+ zwuCNai(kL9zYX@Ml)s<$k@y+q*U8`666O-~tBHB@_r&*W35ZIK_@ zi|~#hK48}G7I4)&A*`sm<;SY>OEAx%uxoCJ?u|3bX1`8Z%IihMH{oXGUuAfMTSJ%f z*T7GWA^ytd--I)-g88)aKi!A+`^wfZr~IqnouA(t=9QOdKCv|{D*rXjC%1+rWplr* zZ0=W;&Hb9Pxv#!4rr+XMqrCkgq-P4{rMwrs=Sy2dJ(&614nBm=rcv4QdkW0*F*U6$ z`TO41a3$fz#Qu`9$xgWeeRE17u$-nBV(53uEntuoNOWD#lt1Rhz9p#hoa$5z{7$%8`4@h#vvC04whJ+iHfBBIRo<`^0sx0ZNL;X@V|N5Q%D%hV=zNH@NJBIWs4}tGI zg7iAR1w5<#D$N^^Ua&9EE6QxYJJ5btlz$QSx9x$vQxom~Z{QEtLEceb1>bsPQ>aVK z8xn3*-g+>E`{1TaxgER>a%NuH{F_v^^iL_9`?g7-Ftu&R9b;Se5z9NchgbZ_R($}KQ|^h^jd%CCa! zA)H=O{`cgQAuK90ynP5Se_Qm={9jNu|MRuc+~PN({P*y0S8E8f%FiD`|IvZ)9Pa@y zD*rIeJCPn`EAKVs--h|7tD9slf+1hj-$3u?NAdWjD2E$Yfl3_fSzkz@E@81;i%Krtt7wvyi89$&aY!Gs!a18 zFwZOh4*2L=2xzhrzZg2^u+Dr3%x9HvcpULT|2L;B{SWf!it=HY-;XhPS-A_m2kmji z@iy?P^5H!1x>2DE|`7@0dWEl)nPrHHrLi=C{C{^E0~te_+1z6^x@r~fTvZZ%I`El6a_W3xM|D#s)m7ju*Z=gJ3PL}%kEu_cst>9J1cYxO%9|B)> zO!Mk3CI9NdHIBD|Ip1S=JqUmIRisy0%KN>|GQXqwD=^=&74=umrT*QtDNHF#{j1#+ z7M1@;*uOP{@xk#f@QSkK$Evc_@B7eyD@%Pv`@ob*;wSaF9{tkR$mYIAS?cdGj6Vt2 zD@%PvWo=M?5Aoyp)#%K3z`Rpg>T4I$t8C#-IP)DapHY_aymwQWRsK8pzinbuxRUS! z`1ZCC4&vX<$Pb8wMcxTsRhIN4KOtfl&F_LaMC2kr2(EE_7z`1nX#NQ>M3N#mgIkq9 zi|}uqLwj{x1%`+w_J1DcN9Iv~mH!01^Q{o3mG5gu`&dAKfWemO`9AVg2n*Gb z&A-}h<(yIeS=ir!`qYqcv+{qT`73CT%8xvU@>@cADgOX?=U32wD*r3+hgT53^1I;e ztLRU`Z11KxpC@m99{zm^?NM3e%W2d<%x`Jl3-fzkL;fm%5q$Ry>ThDs`77<4d8_iT z!2U<(&_5*RYl(TdspS4a_+Raq;c-4n|INQlV$S&@&A);0>LHgbIo=1J#C*%#Z%2Hl zlppMb{WsBGmHWYWzlHEHf1&-?!1rB2eRX^nIHUaQFn{=M)K|w3f;m5<`)|_!1&ptb z_kp{VA9?}v|98+IDGz}6En@xCneT@==STF<;>Y8HY}_0;pP_wozo2~2i)dG8HiyN;d_|ez z*CPD2#Jqk-^zRdJe{bvN(BQZh+^THuyOjH3|Nai7C$Z1@kB{H9^8W<;4|Z-2Gl}_J z;=Xfdx%;ci)?RCFiRQlp|8|WbzRFVG5I!1}r97uMht7n%l<)dJl+SC(PvsZDcg=1N z(~kFmXOv%od1h{NSWx~Wx_=Y-t^8Nu-SeBnO2Vtkwcii(w>F2`T`~T7@b+DsL!I)^ zgYS3;=C?=l{~dhyBGPwXiFc*!yCuPQ$c_uH>*4p$xD z0SxJ&uV^zX$jVc9b_1Df|m{}6joonXIy*`?-x z1NX^bz4D*I zeESN*dL?*IP=?KKBN2u%LI3Mfzm)$y`Q+xX?D%%@it@K$ez+O+&+$jVYs!cFP+sU?tFcbW_`d)? zvIpa><0ruNj`x5YmFHle^6<3dW8gVu)C5uU$~Rm<`JTl1<@f-2+3{oGtB#w&;XsTZ z-G2(4ahwI$DPM&7oy{2Eo%wE%V^XPvZ9|KP+TmDTe{|VirKbv>_5crDY zBj9DnPk~n)KLh3h49lDTJqNB<{@4KW5B+1EGv5vKdgX4IQ=V&e{4sE+<96_z;}^m6 z%D)Nsch4d|jvobIRo?vrFn0_vaR$H85W_kjDA-=h6@5Ff{n zgRdy>ya;p1cWaIx2Zuv3e9Ql8y#`nysCit8Tz|~my|yX^WBg)mL2Z^uPFaZm_Gt} zxw(zGM zGyG{~3xC!z!@uH~;V&e-q-^E6tb7jfxdrPlbw^_Q$=kv8%3lE2tw8>9yaU{*{BL1? z+v?`fto-}*Z|j!O>UcZ2Q~BF4|423V-yQD&PbiCjSUj3kzI_;Ff&J?l$K21JRW|ux z!7=5773D|ZetR$Eg-2uhgr{JBG_vK#TEbVAO+Ki3EZR5upjO%3XOvAom~gy(0pp*t z$p^EJDId%`rhKrdZ1O>4Lk!>KgD%IE5BeQbKA3V$`C!^H<%4<0ln<^bn|!eB%qbtN zD4To`J{IFcrhHKCnDRlLW6B5h$|fJQI&;bgUCJgOX`DunzG3UH6M@hV|bJgYL!hsXmCvVpwThqgD%IE5Bil& zKA3Xmln;0|jQzLC2Xl@oA1pbhe6XTy@X`DuRb?BW zLt{)Ind5V{vW?HRjyXQpJLdS@kZ`lI$p`(8DIZKITlkZX8UB>Ag+Jq%;m`})8Jan&-)$U z3!VbAKQJ||Z1Tv8W6C3|$|jGjIi@^vRoUc`@Kp5Q&`!L_WjP(-bZ-RFtesjvV^~erJ&X%CevK3i4n1DTKGZ0pqLVZQy>#JHQi;Yr&I_cY&uI)BUt^ z7yRGVi1z2W20ZJy7Ci6xZtxYycY+rj)BU3I7wA9Q_mblp@Ur7t@Tz0ZAJ!b-3BKx> z?yFD6{QENf?}Uu$xCUICaGmlZ?RTL)JFWpYB;2h0HQL9R)#|tg+?jB{@^@$-|MHG& zz!M2iDc|uD>`$OP9M^zn5}s2&Li>{_563m&D+wZXuH@t@W?06fvUs?8t zXJLLS`X}d|=a8QXPdMHI^BLu5K8p3%d8AMI2J|a8zK!~naP`yLAHY7(LpOpMf3x4L z=5l^)2J@SQrxN?qYW{78|2pP33C}6pdFU&N`vqst^Uzn7?L2h8ImXw{LoX@YdFWNg zJP%!cx;#BK;Ljp%b{@Je;fBP1qnbGzmD`P+j;1DWjhbO zq%4&Qf0mtno`=4wZ0Dh?KN;h1=b>wr&AdM`zoLB4gIEs^IIsCkbZ_UOJC*G`beHn? zjAH+D4C`rN)`!Qy+ulR_RC7BoeMQ;MOD`toOU|6|arq@_rHLmlIxAw)4}g%67iG zx+TWn!mm-LeV(VTQ?~QajmmP~73Zm&mF+xqm$IFQ?oZt36Zeye`>DkJtg^*#PT9^= zFDTo2>XpR)Dwz5GKTM)O37aq=lykN6!{~1g)nGmbW_g>+IP)DaZ&a4^AiGeW%4WY) zSXS5%$JnSeM4JxPu>pynw4vQ81K`dZ(3A72Il$1tIBphv8Fw`C-aO%M)@_^=lR4& zWjQa3`R*L-uslpHD9d@ze#}3W<-8~6qgNf*f-^V=LHEB0|F`9_KC5j0H7m>bHi`9O zFw678=U`+1=Fp}5YvA4WSPyi(4Lq&<=P<85hW$_F@A=1Q4~?5c&2!PeMl#kj^2)D( zYq5SY<@i?cv}2mjI;Q!&vh>fb*l$sO6aI0%dQtg5fw#SZ`LMFYZyx!j{2j*U3f3Ex zkA5EfHr7L)kMTA0PGvKnQ_j==0`gn=x5)3HexnSTf7ZWtD)0IN&X+7=KCS#1_~9k2 zuP96W*U%p;OZ>lu{SD;;>{nGIKa?ds0rGlce&vN2{=cLBn;^e`IO z5yY(9y$fFG{Kd`8*oOZE3g|GHtmZ364BFGiO7GmZ6EWr^RLsL#p+$5G$s(O#70 zeT}yu4=Mj9{JVVt@}uMJ;7R3g!+g&>kbfNC0iJbC^Et;fzoK0Cqj0|n`Oxtl;AO`& zUvW(HHRTuJ{@!;XBYs~@FL^t-UfI&qs{A>a-?m`veegp*vIlriwMpI`_4dR+tecsCVh{Zk-zjDGQoVxbe~y1uotr~OdD9bUUtMTlj&B9G zDj%VFFV53Aegr(Jd>Q7u^XM;>@gr&ue;MAthWTyv=s%UeN&k*uzgl_wli&vIw`_{` zN5Q*3kNuQ{o0Wea=DVjbUO3(cM%GDqUxoShFQLCzw(yY^Vs7E1OBR;-6za@^@=mO4 z@jT|Dvdo{}K>J2!Gd-pjl>Zv`Z=OdUCww)rAGSpIdmGVy&>vw*L;N%MwaVQv-+cx1 zKV=KAJ~3}po`e0WMXX0C|0nP*$lTe4=N#{V`AXt`Rr!YFkjIuGPbAFqz9Mgb6yafh z*9>NUSop1KZu7gzgr^hxJikl-Y<@SF@Vv6k?-mmGJikl#H0S&-R7JM=-Gs8u?|8nI z_HBN*=9u$4o_F=>$$)9!=6Cf8HzxM&eNmg=@q8=Y+x%`?+018@ZGJbeZ1cMXWt-ov zC|iA4b@n;GtNu_7&*pEn$~M2V_fgG!A~9c7zUM)-N6hbPtD}E5zw1}F`Q4PqnZ1cAoFv~~AzwcnWpyrkzoys;pn@D&nu|KVB z^Ru~x?fp%gk1eUW&DVHdmgQ?|)tPgC#`Cf?xA|GEvdzzUK9=S-KWk97`B`J)zBzH< znYiyt+)pT5{3excem0}L_aTg@c;9sv%>0%4Rx8GPWy|k1wQv4iRhImIuk^mAaozUv z{Ha%#{9Y-&uW8(>=Jvj;y}xPiyG|tj@w_ne&)#>PRnF{3dhovMoHEa0@qO0?WyyaW z=I420y0`aTmz70+dAEvpfR%J=wEZ#p&IInE)zfLM| zdl+3AI=^XU^KZu4=lic$lw$7(hw34p;(gb!BZg1r`>)l?uhP5$^%d;PGo#G*%=c?}UYh2zKGFes zSy|ps?T37vxX&wdAF2*=D$h&P{nx>Kzk=tb$u~TO^@uUZx5_8L^%IbX9UlOz zU)JNW-cqkD>v335X?9!-?o>Vs|F-SI{7BjA|o%r_l9@f44n@c%j{(DhiwVv@-WAswN@#c>X-r?GpP} zm2WtXdD0B}iOuEyVJa*B%RU?CC(=KgSJ^z!=2bSYvw2m}d6>r6}&eM!*lx^N*_XgR#s!q)Y4fN~wQuvNyt2)s zY#wU!s7aW!d`(?V!V5a@lJdknDwA-%vbnc;rKAt@sIqw^xJ&KZyvgR3Hm{mU{F_v! zIp zgwO#wi}O_47rE{0K;;|GV4iRcb1BEW!S#-5-r$(#&C18=z7cYh4wER{4uyzBe+j{2$33SocoMmlE?eaZ7-#dtSIo=NDJd*CsobyQXiL>xOkN7GhWKma?r(u4}I~ezse-T{u9mvv{ zC(`|&k^|&;%nQl)v|t^6E961PJHfNcjWn-@-0pZMcv0EHUs9HH12x#ERhDxCyRgrT zc_qWk!oPjBkS~?3J}f$Bc`rF;eOPu(bKa9g|ExX)%nOZK-qnt81J^jFc}95#@p)tq z_UVW$t;9e^0p+vht1KA7(~Ctt6bUj^=z9n(Au8yt9MuEq{1N2jg>LuUMBm zH++6fL$*Z|FQ#W++47?cvX^&1t8Dq%coVuy=e|qX+*5Y)?kOwz@SC@zk8|$(mCZfZ zxV`&ubGiE&FuJ5-`El$gTlsLT_wG5i`|zhx@6crw-E(Xun|qFpwEye%G5>hi7^;vc zG`;W=mE6m?4b1v${SnW+`u>P#UVVSWGq1isqD)9O|5m}ie`04$w*F{J+4`?3$VA?} z_H23o)C%_PlVhN7pLJ+NzJF>~w)(UPo z%$m}wx#WQO@e|ScXZ1rst?DK2-g>s%%w*0HbnK7SVJX1!t{+wsJm>-sYp3(C8 z!!uIskIkHCo_znzGfix-X3jH8zW?Q!Bj2C$jFIn8d4{O0zf`vTo{!g=fGw4O4;16seKE-?&k9HSOEKa zx1wzB8$MhfKIh23JgZTGd_ApIw(_b2`}lK?>D^xi`+8iBIhG&yxwdaZw6C{Tk8PZX zcpjd?KWm>|%AZC*NwoxKxYqwyqaKrOe3(?Wd|gnsdfJG3?d$1O!dH|n-9hWMF~@hh zw|d&D?ZE2k68J34%|6$5eZA${uCKRT+x7MK|7-H$*1O?YdyZ+E`V7dt^U=Zp0|KEpJ8o`YcJ%FDKD#e z&9l+G2JL|6mz0~8|FiO>@?&SCea`*8|D4Nv|1+4|lFk24W%GYZ+5BHnHveNN8~@!> zl*Y^LY+*x4)Q8YkHsR(XQ;3$RUqzipD+z10k?rpvv9Uv+ZQLu$z|_B*1o1CXSEyej z=6sIoCiK-}U&2vM{0yK^r~Zummh{&&K8@(Jy=qbWtTSE>Xtaw#A2=8D>aR6EoFjVmN19%)Gkf(B>~U#-HyuQgQ4th21-QEdKrn(W;hx-J+&GYzdO+GVL#-p0ONF&FkZ{ zVl|#)HZ%VIuTuZwd1J5tqQ;Z&sZeq4f$Fy;KG<(h>iHQl$2w6d=;#1{w}hmUsL2*i z&?~68%Cp{JOTeL-L|v8g+9~_(-ssm=f5vO#`3Z^VPLXH4(KjVsJHtw;$&2wv)t^Og z8PBgul6J~|xi`v7KJN@Oi9cUZ|9P*gS6|imaP0J|Tm7F9cO{c&q`Y>9<)pn#OS?k4 zlJ?cA;c_j-t0ifVJIm@H&7V|#%7k7$tp3!ZPxtCcjVEO|uinsnpls&VHcc;OMz3Dh z_^&2a;y#TJ#~QCF)8fs_uxt%j4R@*i>07;R+)J+d&58aN)#v#cuX;5;Q;Gk#Xg=_K zjaQ%3bnzUGSMBN#&zpGluL10Teoi&(_4lKipFFSP)gQti+W!O9e8?GY3A-G{$JZr3 zyJUUW8(x<5?h2IUy!utC=ey+IXRrTLQs1DT)X(2l|I_~eo8s>-x&PPu^ItXG2FZ_- z3HO5`)db2iUj3Pr?=HDF*z12y{h{pQ)eemhWiqc`5Jq~F`uWqE-gG?5X?nS@>D6yr ze3EcKqyA9#@oJOChx;>L{f6puAIGcL)ql!3UhUEJa^2snMb+p2fLA{PU_HSfQRVd{ zsr<0fqW!#$6U#cVac!6*3Fj1EWhK3M|18n}oa)DZrR3tDN&e$~8p+p^{?DoX7*0w5 zhr}N4Uy<-j`adJ>4(}x<{``dGXS{#4WE=Zu8vlMxkC{EH{xrIAmu4?oxJkMHij)iD zla%|raKn6lNb}jmg-12qnxskoqQ;Z^hh9CU;c{Qls~^*Fc@M5vRcJ2^_k@OPC3>Hx zi}%)gbr<}h{TI~!qiWc#_IdAXs_-^QswKQ7;80@)wIw8-9_%z}{Ff8|AC~rx`e1^T z`u7#B54L7u!ThPlbD`06;_u^Xzjl2@;b<%a`}IdUc1^|EWV>H-wk1z9sg5_D0&nIl#pKPR$42OX}4rjpuY? zzg_+3y`x^8()jTHQLoP#`l9;J`!~J1QT^e)m|nf1`t^zaLz)jEDVOin{I5>*|5($@dosQHK1~JRU+^y)Fy=Y5M_jcB@fFQivzw4T={`v0fu^PWntKBVd5{f=JUsqyE%kzOsT zKJT0K>OX7#^Bza9UetI_Ci;J&@!`ElUfrkZ<$a4@b!fiv-bJt8Q-7u&^Sb!{kA};8 z6TRYjN7h5$kLcBZRsX9Sye`iFYklDTf?o0cE&9WI6}|ep`k()V*M&`uC+|`8YD(?% zenhW!X?%EZpjY2i{mw-Hs-~Cs0($k3>hpd;uU^t}=e>VkeO3MEeSTj3gvNg+(I3@( zm`?Ot)PLTy=hZ*b^5uPdUM*`r^Bz5~PO1OAAJ3~F*Ld>YI{j%d1gUz}G5)F0k6=hc0xKYiTm;%t$%m&S7azg7L}ME|EWe|V3a zSHEZBCjQ5HBi`#x{5hxTnn?7YQvK${pPbeo-pA(E4h?rA(f@nR|K?=8?$h!LNqeu+ z{G3hnV+OKZ%x*`0U=JR4=|B&WGI9YE0C)Iu?@#l9n zT;A8=)w}9X{zxpoiNQ$?qzy)ulmD#NxXVhq+?Da{YJIKJT&c z>WiD%tH%2(s6Pd!n$&Wv#~!0sTQvW9KY>?ws{g#l!mA;T5APfB>UPb~`9%L`)jscY z@ah%KXWp~m)xWdyO6-4L%eOkQ|A!hb??Xt{7UX{=wZ*M7oB1ze9=#LmpG9?heEQrb z?4^Z!eNCb@^uINHy5xbioZME`eeWAZx{b1(W29(`oFz}_N5R+C!_i|K%f4b zvT*j`f$_27&g}Cn$xgTKXZk!dwbQNpS^WQ4^h=W?)Bj1NYbX9ID)s1>HN8>{Ftqe$ zME{;JsSeb7*eCJ4E7upMeR#9g&VU^ z@sIgtIg03s!mBuvZ`Qmly$`B=sit@~e=e&1=o)(@`tUzXd^FO~%cy>*=-;7KswZC% zed{es`fHk>RwFFjKhS)WY7O5^|A#c6XEg+i|4qmMrq`y+Rz6$BpN!h(%6?Rzg@qlc z{}!(O{x~v#`j$@9|2Enq^)1Dwzen{g1k-;M8BhCl8lLIDg#L&6HjOa-U%~_R8xs3p zmUP`68Wa6nRKGdVe-s%;e_9j$Ka+g8ySOh<3|HgdmDsoRGvEIf|0cBpk^c_=797*O z7UfGt^S{DBTfZ@$)r==s;m?|5?$u_bUyklS1dj9I60bP(Z@~{+-=%-#NiBHtxAAY* z@i)QCjv2{XO(5-)ZC!?3jX!)ZmWoXO8y(aCF30qr-vy$g{cZTe?*LJeX`kQyp(4{h zzq3O{W_lag0HKWeog3rr(7fXKW-z}SW9AxhZE(@doHQq zRPrOQ6^hLKSW>ybnD?Mjk(pjQi$`X97dr3<%IvQ=7W?N)=Cp71llEDkYGpjcyN7tD z-jbH5u`fTyZ_1S~d43oEKw0?9jv2n~)6tyaPiR9o`?HQ|f6+1R*Wn)(?K8fbUB&oj zphsoq)^08Smfr7{t=};JEqwBS!@oHO4n^jlRsKR5+rAok6aMhL8kLz(X@_d@Yupjd zjq}R1&-~_jb}HlfglFz7H|KlCR2H7?bC8+e%{p|DncsXbm&*LFcTD?y50}d9^F3N) zYSu**^DW?Y^~=={ribU+o>$Pe`tA*y%7ClH_7@m>3Ams`I2Lv^_X$Y zvl?$W-VL62d@J~E$CO1D9piP0@D<0mgI65i0se;LJHhl1EF zxHaLfg!2hcCOn<+Y{K&iFC@H_@JhmK2}{Fv>8oMGbeu`JKH zc&V%`y>@<%)>u_CiFtj(jS1Vnw7Ks}%<~CPCOn<+Y{K&iFC@H_@JhmK3ENVR#kWQ$ z=Ej+X>l1EFxHaLfg!2hcCOn<+Y{K&iFC@H_@JhmK35O3Q<)3gS;rfId6K+koE8%>? zlL=2JJe%-*!V3v6CA^aGTEaFVv+}M{0oOQ_aDBp!3CHtcrSYOGG0!JFnecSNvkA{9 zypZrx!Yc`{B^-49!O~lku&rO1d3|Eum~d;tT?ywCo=kW;;n{@e6JAJoDdClb*Aljc zL`z={Cw@@InS|>TZcMl};jV<^dB&3elZp9s!m|m_C%lmGQo<_wxn+9iTiD(^ki--uMhPJ zHzwSga96_lgeMc8PIxxq`Ggl8bH1{i@M^-mXOoKQrG36zL}gr?a9zTUjz0o-tqFG} zZ0FGFKkZLBbIzY;5}tQVQGFp{J9kL`Xugt|uO)0-BW9oPgisl060T3UG2zyPyAsYP zJelxx!m|m_C%lmGQo<_8nXNld!$-W%<*Xn71a}m2f`c$%Lm9o=tc@;e~{k z5?)DoEn(hgL}lsW{Y9R6f05_LEmR6 zraxi6BU+aJgc}oXO}H!Je8Q6nPbWN^@O;7x2`?qQlJHu>cCewCe%;S9&Lmu)u%Ct5BYemvY{53{z#iy@*|dm z^I!eQrPzcm*oGb0gMB!FLpXwCIDu0*gLAn2PwJubU9Wy#WKcgWKW`%AHpU&;gMB!F zLpXwCIDu0*gLBw0i>v+e{l0FNynO$ME!c(~*n@pIfI~QfV>p3RID>Oo{U~wykn>rG zP1u5M*nvIRhXXi-BRGZ=IE6DfhmB95e%OR9*oGb0gMB!FLpXwCIDu0*gLByUBwju=JxthwZPID{iO zh7&l2GdPEh&lJ^M)>DT~*n(}?fj!uV12}{uIEE8Ag)=yZ}b7p*n}$aID%t1fm1kxbGW>*_3-uoqoeC# z!WL}94lKW~AlH|V@c<6t2#(sBVdHb7_10k%wqP4}U=Q};01n{@j^PAO;SA1U z`2k-!KlK+z*TaM@*oGb0gMB!FLpXwCIDu0*gLByUvC(?#unAkR4Lh(0`)~k#q*fI~QfV>p3RID>Q8xHVdD9X4SLwqXbM zU>^?P5RTv&PT&;I;2f4;NR;zcw?@~)gylXcvb~LQ2like4&V@u;22Ke6wcrrHX5V# z)?pKt`??J3$G8J~unz}t2uE-XCvXa9a1P7;Xr!L{?a}oxVGFil2like4&V@u;22Ke z6wcrrHtvkpTZc{9f^FD=J=li>ID{iOh7&l2GdPEhChCVx*n(}?fj!uV12}{uIEE8A zg)=yZjTzJro3I7jumj6|h~)LkN|5BA{z4&exn z;RH_M49;O=7WKm>Y{53{z#iya^nHHKI^T~^)O)zwqXbMU>^?P z5RTv&PT&;I;2bvQM(eG^CTzhr?7(v0FIit7;{hDP5gfw_oWdEL!^V%Je%OR9*oGb0 zgXR8WvK|4(LpXwuhFp9rPwqcf?5}V(G+unGD~Bh4LUpP~v3>EaAh}PO*cuuyzExtw z4(!1`9Kdp)vm#%y{|MtToWLoZ!8t6yuq*lMFRG;KAvR$PwqXbMU>^?P5RTv&PT&;I z;2bu7aWAh2cXB;g7`I^u_Fx|l;1G`B z7*606&fpw2ej4?|CTzhr?7$u@_idE*3@{$T5gfw_oWdEL!-kFeVH37s8+Kq1_Tc~y z;Ruf51Ww@$&SB$cjPfDpqYlgcab(=WxD7k72m5dUhj0YPZ~~`r2IsKcFH!2NzcjiY zCTzhr?7$xE!vP$^5gfw_oWdEL!*YM4LH$3A`e6&UVY!dA?9aov4+pT^UsC2r7?0ru zPT>sBVYv^b3L# zd$11&a0o|m3@303XK)T13#cD9VGFil2like4&V@u;22Ke6wcrrHhv!U!zOIOHtfJ2 zEcfe`_mcqQAsoR+Lw;Eu`Z0V0pTQUKWU&+VD2}HHZ@|-V3toVi;4Zuc@4$QT0el1> z!zb_=d;w2>v8aBies~&g!3%Kl8MMRu>%v>`4!j2+z(?>gd;*`r7x3i0(c`@VPs1&E z0bYW;@D{uS@4*M~5qu1vz-RCUJozQm4^P7_cmZC5yYLpg1Mk5H@DY3rpTKAE1w8p> z)DKU?EqDQ5g1hh*yaVsS2k;Sm44=Sf@C7{i3#cD1KEt_q$opdpEho|8dyZ|r3U3d%Lf%o78_y|6RPvA570-pS3 z)DKU?EqDQ5g1hh*yaVsS2k;Sm44=Sf@C7`%i2C7axCJl3OK=z7f_LCO_y9hFkKq&e z48DLTe+Bi!)3AJwh5UISpUWX$!uDNw3*LeE-~;#wK88==Gx!3Y{8iKsPs1&E0rrNx ztak0gJ44=5<9l#C z58WAuwr{E?$4==)PxDRi`yYN1I2tS3N!Kd&!Jn`$OAD)7n@I1T- zx8dRYaTnLyHpX}1w}$+~YWv~)Z5MtvG=5F_6h4QC@26dCfBiSq7xgHv|H4!7@cp!l z@p+6d!fm(@Z^OIrK70s2g`dHv@Hss3o2m%)kb1AfazAVtZ(@8Nmiu4J_HB&!;ca*q z-iHt2r|>iQ6h4P1UP1lv6x@X8;YGL&_u*}L7v6^t;ivF3_!K^eCw>d{!&7h*o`)CV zHr$7|;azwiK7^mb&)`$|9G>`X)DKU=O?Vz&gxhc*-iCMKefSW5d&r+vrMv^b3%>_H z=U&!d%zqw!0e%s_2fqTZ!EeBC!rz47g1-&F4Zj1w3%>_H=b?W11^7ky9{dWt2EPHn z34arQ3;s6zHvA6!F8m(++_F(ViuddC{KGH6FT(fWSKu}H4S09R#kZFC;Y0W-{0u&Y z&*6#tm-QC;uESGs6P||`;Wpfdx8YrQA3lVi!q4DS_#B>CLH+O)+=S=hMYs+3;ca*q z-iHt2r|>iQ6h4P1+Nd9%f}8L>ya>19KD-U@!u#+c{1ko$pTg(xL}#@A|G5^_ez*2} zwLhr+VeOA@v;B7mR(zTdD(yRn$chJ-QLQp?t{*HzxTRvv)5U>+3#%ib@bBW=WiD1 ztS{eR>$tss-)OIIy8cG5Zz#BH8yk@aH(m93@VIaIkNR%A zx8c9vcKzP+`sP|O{e5<*HeBhr>z)2<8@)$v=T&vkn}cjcYWMNR`f7ipH|W$eR5ibY3SvB ztd4W}VQ14AJ_W{u)wMOZ)9-fMJ>%;2E;doSRg3KFt=F2X>kl>zwT7eTSWc^26S)@0 zZ?MwssFPP*lkJUiOO=Li8k|6V2>x*xUFocsN2lKl^i^)?>(*6Q?MAO{j9qW{VQ=G!zuGP@RQ)z`OWsvFn|<}h zvAWsq=;7-1bJcKXt9VyY1r;wA)x5s8v8*SR*O4NI#wObN}vu=b?LR7Ee^5emQ7<; zx6O)bNp-(EI0+hqXm-$bw~SiujPx{h&~SAy=iZT#Do{&Z_E=S`4!*K()iLWC611d4 z9ecH9wM9{k-nLlzS!2~#?>={{>h2cRsg*C=mTuG)qr2}`?aZKUwDgEN2NE>y>PXcx z=+coo_OeGEyKJHZOFGm6=^j;uY@!0a@H6__C>ynO<$+2&TX|;C&gl)*fl1KNkt#-d z20=qdYHu>s)PX9Z3|j6T>Cl0yMK*2dNL@zKQw8cpQ1+gxds)FJ8)bqp#R{^MN!ZglfbRm1J-6zF!w zE!(DU8tM%|`e!9*=twPp*`pR+Mw&WMXHI$=I#M-N+v-;Bw+hr^l_ToXD&A(9n^(+GJ=DG<2j2s%Gm}9lmVZP?3HmG<26Lq}sOXPzC7`_3|$Rb!l4q-$4JL zum3oqKa-OCNWM}lyZ-*U(UEJTG_ETbeIG`@T{)?~Pbb5Z5>#znwI5MWyRtNArp_Pe z#`ugHC_iDn9Z@7Bg_-NHujm($cNX@@0fA^C*aa?U!-(7{$h<~zSO@lCV#ie?^W}qk@@0BWAeAI$Y0Er`I7%%)Z$;Y z{>N2*Qxa9J%$M$eR+Fz<|D`Iwi_RC`K=F_|G&oM-?<`xk(2qqI41v6 zmESO>Qr*gY>HWf({Cib?ON|$g;{5-hddhsM|JJzt-za9O&$YgxTlp&U#h)9K|M*k- z_2*R^7Ws?!I+-u||87iv<6C;7shh!9nJ*oGJ0}11r*(eGQ{?|4^_2P2|L&Ol<_FAw zHYR`Tiu}b=GXK}dF%6#em+L-(cSLFZL75V>tO#bc%%>Qp=@-JPH|M@HO z|7-RBtIw8HWf)2VK=KsLEqa!??Om$rO{#&hoSS@UE{eMC|rGB~oe?;}MrZVH- z=-%tq_le6s^@aJ1YwD`}7t=a%(AG1H{8Q@5{4cA8`_R4bY^b3?JqM4i>hDhrgB~65 eSpP{KP*vi{mN!1Ed*yQqih2L3o|0eQ*8UHFv6U+T literal 150920 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 literal 166704 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 z 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

gSfYNK-#5J-Or-etlrDsx_&z374d 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y+9xfllGzihF; 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

LFE%$a%|_h&~TruretEMGaTz@ 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⪙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 CpAyml diff --git a/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/ebpf/gen.go b/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/ebpf/gen.go index a21e44a88..3ec45b49c 100644 --- a/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/ebpf/gen.go +++ b/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/ebpf/gen.go @@ -1,4 +1,4 @@ package ebpf // $BPF_CLANG and $BPF_CFLAGS are set by the Makefile. -//go:generate bpf2go -cc $BPF_CLANG -cflags $BPF_CFLAGS -target amd64,arm64,ppc64le,s390x -type flow_metrics_t -type flow_id_t -type flow_record_t -type pkt_drops_t -type dns_record_t -type global_counters_key_t -type direction_t -type filter_action_t -type tcp_flags_t Bpf ../../bpf/flows.c -- -I../../bpf/headers +//go:generate bpf2go -cc $BPF_CLANG -cflags $BPF_CFLAGS -target amd64,arm64,ppc64le,s390x -type flow_metrics_t -type flow_id_t -type flow_record_t -type pkt_drops_t -type dns_record_t -type global_counters_key_t -type direction_t -type filter_action_t -type tcp_flags_t -type translated_flow_t Bpf ../../bpf/flows.c -- -I../../bpf/headers diff --git a/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/model/record.go b/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/model/record.go index 8d4c6c708..f8beaf806 100644 --- a/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/model/record.go +++ b/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/model/record.go @@ -60,6 +60,7 @@ type Record struct { TimeFlowRtt time.Duration DupList []map[string]uint8 NetworkMonitorEventsMD []string + UdnID string } func NewRecord( @@ -134,6 +135,8 @@ func Accumulate(r *ebpf.BpfFlowMetrics, src *ebpf.BpfFlowMetrics) { r.NetworkEventsIdx = (r.NetworkEventsIdx + 1) % maxNetworkEvents } } + + r.TranslatedFlow = src.TranslatedFlow } func networkEventsMDExist(events [maxNetworkEvents][networkEventsMaxEventsMD]uint8, md [networkEventsMaxEventsMD]uint8) bool { diff --git a/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/pbflow/flow.pb.go b/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/pbflow/flow.pb.go index 6a5c43207..97112b551 100644 --- a/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/pbflow/flow.pb.go +++ b/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/pbflow/flow.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc v3.19.4 // source: proto/flow.proto @@ -79,11 +79,9 @@ type CollectorReply struct { func (x *CollectorReply) Reset() { *x = CollectorReply{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_flow_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_flow_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CollectorReply) String() string { @@ -94,7 +92,7 @@ func (*CollectorReply) ProtoMessage() {} func (x *CollectorReply) ProtoReflect() protoreflect.Message { mi := &file_proto_flow_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -119,11 +117,9 @@ type Records struct { func (x *Records) Reset() { *x = Records{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_flow_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_flow_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Records) String() string { @@ -134,7 +130,7 @@ func (*Records) ProtoMessage() {} func (x *Records) ProtoReflect() protoreflect.Message { mi := &file_proto_flow_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -167,11 +163,9 @@ type DupMapEntry struct { func (x *DupMapEntry) Reset() { *x = DupMapEntry{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_flow_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_flow_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DupMapEntry) String() string { @@ -182,7 +176,7 @@ func (*DupMapEntry) ProtoMessage() {} func (x *DupMapEntry) ProtoReflect() protoreflect.Message { mi := &file_proto_flow_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -249,15 +243,14 @@ type Record struct { DnsErrno uint32 `protobuf:"varint,25,opt,name=dns_errno,json=dnsErrno,proto3" json:"dns_errno,omitempty"` DupList []*DupMapEntry `protobuf:"bytes,26,rep,name=dup_list,json=dupList,proto3" json:"dup_list,omitempty"` NetworkEventsMetadata []string `protobuf:"bytes,27,rep,name=network_events_metadata,json=networkEventsMetadata,proto3" json:"network_events_metadata,omitempty"` + Xlat *Xlat `protobuf:"bytes,28,opt,name=xlat,proto3" json:"xlat,omitempty"` } func (x *Record) Reset() { *x = Record{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_flow_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_flow_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Record) String() string { @@ -268,7 +261,7 @@ func (*Record) ProtoMessage() {} func (x *Record) ProtoReflect() protoreflect.Message { mi := &file_proto_flow_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -472,6 +465,13 @@ func (x *Record) GetNetworkEventsMetadata() []string { return nil } +func (x *Record) GetXlat() *Xlat { + if x != nil { + return x.Xlat + } + return nil +} + type DataLink struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -483,11 +483,9 @@ type DataLink struct { func (x *DataLink) Reset() { *x = DataLink{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_flow_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_flow_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DataLink) String() string { @@ -498,7 +496,7 @@ func (*DataLink) ProtoMessage() {} func (x *DataLink) ProtoReflect() protoreflect.Message { mi := &file_proto_flow_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -539,11 +537,9 @@ type Network struct { func (x *Network) Reset() { *x = Network{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_flow_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_flow_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Network) String() string { @@ -554,7 +550,7 @@ func (*Network) ProtoMessage() {} func (x *Network) ProtoReflect() protoreflect.Message { mi := &file_proto_flow_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -604,11 +600,9 @@ type IP struct { func (x *IP) Reset() { *x = IP{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_flow_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_flow_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *IP) String() string { @@ -619,7 +613,7 @@ func (*IP) ProtoMessage() {} func (x *IP) ProtoReflect() protoreflect.Message { mi := &file_proto_flow_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -685,11 +679,9 @@ type Transport struct { func (x *Transport) Reset() { *x = Transport{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_flow_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_flow_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Transport) String() string { @@ -700,7 +692,7 @@ func (*Transport) ProtoMessage() {} func (x *Transport) ProtoReflect() protoreflect.Message { mi := &file_proto_flow_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -736,6 +728,91 @@ func (x *Transport) GetProtocol() uint32 { return 0 } +type Xlat struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SrcAddr *IP `protobuf:"bytes,1,opt,name=src_addr,json=srcAddr,proto3" json:"src_addr,omitempty"` + DstAddr *IP `protobuf:"bytes,2,opt,name=dst_addr,json=dstAddr,proto3" json:"dst_addr,omitempty"` + SrcPort uint32 `protobuf:"varint,3,opt,name=src_port,json=srcPort,proto3" json:"src_port,omitempty"` + DstPort uint32 `protobuf:"varint,4,opt,name=dst_port,json=dstPort,proto3" json:"dst_port,omitempty"` + ZoneId uint32 `protobuf:"varint,5,opt,name=zone_id,json=zoneId,proto3" json:"zone_id,omitempty"` + UdnId string `protobuf:"bytes,6,opt,name=udn_id,json=udnId,proto3" json:"udn_id,omitempty"` +} + +func (x *Xlat) Reset() { + *x = Xlat{} + mi := &file_proto_flow_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Xlat) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Xlat) ProtoMessage() {} + +func (x *Xlat) ProtoReflect() protoreflect.Message { + mi := &file_proto_flow_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Xlat.ProtoReflect.Descriptor instead. +func (*Xlat) Descriptor() ([]byte, []int) { + return file_proto_flow_proto_rawDescGZIP(), []int{8} +} + +func (x *Xlat) GetSrcAddr() *IP { + if x != nil { + return x.SrcAddr + } + return nil +} + +func (x *Xlat) GetDstAddr() *IP { + if x != nil { + return x.DstAddr + } + return nil +} + +func (x *Xlat) GetSrcPort() uint32 { + if x != nil { + return x.SrcPort + } + return 0 +} + +func (x *Xlat) GetDstPort() uint32 { + if x != nil { + return x.DstPort + } + return 0 +} + +func (x *Xlat) GetZoneId() uint32 { + if x != nil { + return x.ZoneId + } + return 0 +} + +func (x *Xlat) GetUdnId() string { + if x != nil { + return x.UdnId + } + return "" +} + var File_proto_flow_proto protoreflect.FileDescriptor var file_proto_flow_proto_rawDesc = []byte{ @@ -755,7 +832,7 @@ var file_proto_flow_proto_rawDesc = []byte{ 0x2f, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0xf4, 0x08, 0x0a, 0x06, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x65, + 0x22, 0x96, 0x09, 0x0a, 0x06, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x2f, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, @@ -826,35 +903,49 @@ var file_proto_flow_proto_rawDesc = []byte{ 0x36, 0x0a, 0x17, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x1b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3c, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x4c, - 0x69, 0x6e, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x72, 0x63, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x12, 0x17, 0x0a, 0x07, - 0x64, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x64, - 0x73, 0x74, 0x4d, 0x61, 0x63, 0x22, 0x6b, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x12, 0x25, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x49, 0x50, 0x52, 0x07, - 0x73, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x12, 0x25, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x66, 0x6c, - 0x6f, 0x77, 0x2e, 0x49, 0x50, 0x52, 0x07, 0x64, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x12, - 0x0a, 0x04, 0x64, 0x73, 0x63, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x64, 0x73, - 0x63, 0x70, 0x22, 0x3d, 0x0a, 0x02, 0x49, 0x50, 0x12, 0x14, 0x0a, 0x04, 0x69, 0x70, 0x76, 0x34, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x07, 0x48, 0x00, 0x52, 0x04, 0x69, 0x70, 0x76, 0x34, 0x12, 0x14, - 0x0a, 0x04, 0x69, 0x70, 0x76, 0x36, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x04, - 0x69, 0x70, 0x76, 0x36, 0x42, 0x0b, 0x0a, 0x09, 0x69, 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, - 0x79, 0x22, 0x5d, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x19, - 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x73, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, - 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x64, 0x73, 0x74, - 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x2a, 0x24, 0x0a, 0x09, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, - 0x07, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x47, - 0x52, 0x45, 0x53, 0x53, 0x10, 0x01, 0x32, 0x3e, 0x0a, 0x09, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x12, 0x31, 0x0a, 0x04, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x0f, 0x2e, 0x70, 0x62, - 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x1a, 0x16, 0x2e, 0x70, - 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2f, 0x70, 0x62, 0x66, 0x6c, - 0x6f, 0x77, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x20, 0x0a, 0x04, 0x78, 0x6c, 0x61, 0x74, 0x18, + 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x58, + 0x6c, 0x61, 0x74, 0x52, 0x04, 0x78, 0x6c, 0x61, 0x74, 0x22, 0x3c, 0x0a, 0x08, 0x44, 0x61, 0x74, + 0x61, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x72, 0x63, 0x5f, 0x6d, 0x61, 0x63, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x12, 0x17, + 0x0a, 0x07, 0x64, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x06, 0x64, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x22, 0x6b, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x12, 0x25, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x49, 0x50, + 0x52, 0x07, 0x73, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x12, 0x25, 0x0a, 0x08, 0x64, 0x73, 0x74, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, + 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x49, 0x50, 0x52, 0x07, 0x64, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x73, 0x63, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, + 0x64, 0x73, 0x63, 0x70, 0x22, 0x3d, 0x0a, 0x02, 0x49, 0x50, 0x12, 0x14, 0x0a, 0x04, 0x69, 0x70, + 0x76, 0x34, 0x18, 0x01, 0x20, 0x01, 0x28, 0x07, 0x48, 0x00, 0x52, 0x04, 0x69, 0x70, 0x76, 0x34, + 0x12, 0x14, 0x0a, 0x04, 0x69, 0x70, 0x76, 0x36, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, + 0x52, 0x04, 0x69, 0x70, 0x76, 0x36, 0x42, 0x0b, 0x0a, 0x09, 0x69, 0x70, 0x5f, 0x66, 0x61, 0x6d, + 0x69, 0x6c, 0x79, 0x22, 0x5d, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, + 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x64, + 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x64, + 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x22, 0xba, 0x01, 0x0a, 0x04, 0x58, 0x6c, 0x61, 0x74, 0x12, 0x25, 0x0a, 0x08, 0x73, + 0x72, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, + 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x49, 0x50, 0x52, 0x07, 0x73, 0x72, 0x63, 0x41, 0x64, + 0x64, 0x72, 0x12, 0x25, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x49, 0x50, + 0x52, 0x07, 0x64, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, + 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x64, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x06, 0x7a, 0x6f, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x75, 0x64, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x75, 0x64, 0x6e, 0x49, 0x64, 0x2a, + 0x24, 0x0a, 0x09, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, + 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x47, 0x52, + 0x45, 0x53, 0x53, 0x10, 0x01, 0x32, 0x3e, 0x0a, 0x09, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x12, 0x31, 0x0a, 0x04, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x66, + 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x1a, 0x16, 0x2e, 0x70, 0x62, + 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2f, 0x70, 0x62, 0x66, 0x6c, 0x6f, + 0x77, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -870,7 +961,7 @@ func file_proto_flow_proto_rawDescGZIP() []byte { } var file_proto_flow_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_proto_flow_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_proto_flow_proto_msgTypes = make([]protoimpl.MessageInfo, 9) var file_proto_flow_proto_goTypes = []any{ (Direction)(0), // 0: pbflow.Direction (*CollectorReply)(nil), // 1: pbflow.CollectorReply @@ -881,31 +972,35 @@ var file_proto_flow_proto_goTypes = []any{ (*Network)(nil), // 6: pbflow.Network (*IP)(nil), // 7: pbflow.IP (*Transport)(nil), // 8: pbflow.Transport - (*timestamppb.Timestamp)(nil), // 9: google.protobuf.Timestamp - (*durationpb.Duration)(nil), // 10: google.protobuf.Duration + (*Xlat)(nil), // 9: pbflow.Xlat + (*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp + (*durationpb.Duration)(nil), // 11: google.protobuf.Duration } var file_proto_flow_proto_depIdxs = []int32{ 4, // 0: pbflow.Records.entries:type_name -> pbflow.Record 0, // 1: pbflow.DupMapEntry.direction:type_name -> pbflow.Direction 0, // 2: pbflow.Record.direction:type_name -> pbflow.Direction - 9, // 3: pbflow.Record.time_flow_start:type_name -> google.protobuf.Timestamp - 9, // 4: pbflow.Record.time_flow_end:type_name -> google.protobuf.Timestamp + 10, // 3: pbflow.Record.time_flow_start:type_name -> google.protobuf.Timestamp + 10, // 4: pbflow.Record.time_flow_end:type_name -> google.protobuf.Timestamp 5, // 5: pbflow.Record.data_link:type_name -> pbflow.DataLink 6, // 6: pbflow.Record.network:type_name -> pbflow.Network 8, // 7: pbflow.Record.transport:type_name -> pbflow.Transport 7, // 8: pbflow.Record.agent_ip:type_name -> pbflow.IP - 10, // 9: pbflow.Record.dns_latency:type_name -> google.protobuf.Duration - 10, // 10: pbflow.Record.time_flow_rtt:type_name -> google.protobuf.Duration + 11, // 9: pbflow.Record.dns_latency:type_name -> google.protobuf.Duration + 11, // 10: pbflow.Record.time_flow_rtt:type_name -> google.protobuf.Duration 3, // 11: pbflow.Record.dup_list:type_name -> pbflow.DupMapEntry - 7, // 12: pbflow.Network.src_addr:type_name -> pbflow.IP - 7, // 13: pbflow.Network.dst_addr:type_name -> pbflow.IP - 2, // 14: pbflow.Collector.Send:input_type -> pbflow.Records - 1, // 15: pbflow.Collector.Send:output_type -> pbflow.CollectorReply - 15, // [15:16] is the sub-list for method output_type - 14, // [14:15] is the sub-list for method input_type - 14, // [14:14] is the sub-list for extension type_name - 14, // [14:14] is the sub-list for extension extendee - 0, // [0:14] is the sub-list for field type_name + 9, // 12: pbflow.Record.xlat:type_name -> pbflow.Xlat + 7, // 13: pbflow.Network.src_addr:type_name -> pbflow.IP + 7, // 14: pbflow.Network.dst_addr:type_name -> pbflow.IP + 7, // 15: pbflow.Xlat.src_addr:type_name -> pbflow.IP + 7, // 16: pbflow.Xlat.dst_addr:type_name -> pbflow.IP + 2, // 17: pbflow.Collector.Send:input_type -> pbflow.Records + 1, // 18: pbflow.Collector.Send:output_type -> pbflow.CollectorReply + 18, // [18:19] is the sub-list for method output_type + 17, // [17:18] is the sub-list for method input_type + 17, // [17:17] is the sub-list for extension type_name + 17, // [17:17] is the sub-list for extension extendee + 0, // [0:17] is the sub-list for field type_name } func init() { file_proto_flow_proto_init() } @@ -913,104 +1008,6 @@ func file_proto_flow_proto_init() { if File_proto_flow_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_proto_flow_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*CollectorReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_flow_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*Records); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_flow_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*DupMapEntry); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_flow_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*Record); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_flow_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*DataLink); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_flow_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*Network); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_flow_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*IP); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_flow_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*Transport); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } file_proto_flow_proto_msgTypes[6].OneofWrappers = []any{ (*IP_Ipv4)(nil), (*IP_Ipv6)(nil), @@ -1021,7 +1018,7 @@ func file_proto_flow_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proto_flow_proto_rawDesc, NumEnums: 1, - NumMessages: 8, + NumMessages: 9, NumExtensions: 0, NumServices: 1, }, diff --git a/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/pbflow/proto.go b/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/pbflow/proto.go index 8341a4d7f..c184ab5a4 100644 --- a/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/pbflow/proto.go +++ b/vendor/github.com/netobserv/netobserv-ebpf-agent/pkg/pbflow/proto.go @@ -2,6 +2,7 @@ package pbflow import ( "encoding/binary" + "fmt" "net" "github.com/netobserv/netobserv-ebpf-agent/pkg/ebpf" @@ -76,6 +77,11 @@ func FlowToPB(fr *model.Record, s *ovnobserv.SampleDecoder) *Record { DnsFlags: uint32(fr.Metrics.DnsRecord.Flags), DnsErrno: uint32(fr.Metrics.DnsRecord.Errno), TimeFlowRtt: durationpb.New(fr.TimeFlowRtt), + Xlat: &Xlat{ + SrcPort: uint32(fr.Metrics.TranslatedFlow.Sport), + DstPort: uint32(fr.Metrics.TranslatedFlow.Dport), + ZoneId: uint32(fr.Metrics.TranslatedFlow.ZoneId), + }, } if fr.Metrics.DnsRecord.Latency != 0 { pbflowRecord.DnsLatency = durationpb.New(fr.DNSLatency) @@ -94,9 +100,13 @@ func FlowToPB(fr *model.Record, s *ovnobserv.SampleDecoder) *Record { if fr.Id.EthProtocol == model.IPv6Type { pbflowRecord.Network.SrcAddr = &IP{IpFamily: &IP_Ipv6{Ipv6: fr.Id.SrcIp[:]}} pbflowRecord.Network.DstAddr = &IP{IpFamily: &IP_Ipv6{Ipv6: fr.Id.DstIp[:]}} + pbflowRecord.Xlat.SrcAddr = &IP{IpFamily: &IP_Ipv6{Ipv6: fr.Metrics.TranslatedFlow.Saddr[:]}} + pbflowRecord.Xlat.DstAddr = &IP{IpFamily: &IP_Ipv6{Ipv6: fr.Metrics.TranslatedFlow.Daddr[:]}} } else { pbflowRecord.Network.SrcAddr = &IP{IpFamily: &IP_Ipv4{Ipv4: model.IntEncodeV4(fr.Id.SrcIp)}} pbflowRecord.Network.DstAddr = &IP{IpFamily: &IP_Ipv4{Ipv4: model.IntEncodeV4(fr.Id.DstIp)}} + pbflowRecord.Xlat.SrcAddr = &IP{IpFamily: &IP_Ipv4{Ipv4: model.IntEncodeV4(fr.Metrics.TranslatedFlow.Saddr)}} + pbflowRecord.Xlat.DstAddr = &IP{IpFamily: &IP_Ipv4{Ipv4: model.IntEncodeV4(fr.Metrics.TranslatedFlow.Daddr)}} } if s != nil { seen := make(map[string]bool) @@ -113,6 +123,14 @@ func FlowToPB(fr *model.Record, s *ovnobserv.SampleDecoder) *Record { } } } + zoneIDtoUdnIDMap, err := s.GetConntrackZoneToUDN() + if err != nil { + protoLog.Errorf("unable to get zoneIDtoUdnIdMap: %v", err) + } + if udnID, ok := zoneIDtoUdnIDMap[fmt.Sprint(fr.Metrics.TranslatedFlow.ZoneId)]; ok { + pbflowRecord.Xlat.UdnId = udnID + protoLog.Debugf("Packet Xlation zoneID %d mapped to udnID %s", fr.Metrics.TranslatedFlow.ZoneId, udnID) + } } return &pbflowRecord } @@ -154,6 +172,13 @@ func PBToFlow(pb *Record) *model.Record { Errno: uint8(pb.DnsErrno), Latency: uint64(pb.DnsLatency.AsDuration()), }, + TranslatedFlow: ebpf.BpfTranslatedFlowT{ + Saddr: ipToIPAddr(pb.Xlat.GetSrcAddr()), + Daddr: ipToIPAddr(pb.Xlat.GetDstAddr()), + Sport: uint16(pb.Xlat.GetSrcPort()), + Dport: uint16(pb.Xlat.GetDstPort()), + ZoneId: uint16(pb.Xlat.GetZoneId()), + }, }, }, TimeFlowStart: pb.TimeFlowStart.AsTime(), @@ -176,6 +201,10 @@ func PBToFlow(pb *Record) *model.Record { out.NetworkMonitorEventsMD = append(out.NetworkMonitorEventsMD, pb.GetNetworkEventsMetadata()...) protoLog.Debugf("decoded Network events monitor metadata: %v", out.NetworkMonitorEventsMD) } + + if len(pb.GetXlat().UdnId) != 0 { + out.UdnID = pb.GetXlat().UdnId + } return &out } diff --git a/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/observability-lib/sampledecoder/sample_decoder.go b/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/observability-lib/sampledecoder/sample_decoder.go index 0bf419bd5..aac21dfeb 100644 --- a/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/observability-lib/sampledecoder/sample_decoder.go +++ b/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/observability-lib/sampledecoder/sample_decoder.go @@ -5,6 +5,8 @@ import ( "context" "encoding/binary" "fmt" + "k8s.io/apimachinery/pkg/util/sets" + "strings" "github.com/ovn-org/libovsdb/client" "github.com/ovn-org/ovn-kubernetes/go-controller/observability-lib/ovsdb" @@ -288,3 +290,47 @@ func (d *SampleDecoder) DeleteCollector(collectorID int) error { fmt.Println("res: ", res) return err } + +// TODO check start with [prefix]udnName +var ctPrefixes = sets.New("GR_", "breth0_", "cr-rtos-", "etor-GR_", "ext_", "jtor-GR_", "k8s-", "rtoe-GR_", "rtoj-GR_") + +func (d *SampleDecoder) GetConntrackZoneToUDN() (map[string]string, error) { + res := map[string]string{} + bridges := []*ovsdb.Bridge{} + err := d.ovsdbClient.WhereCache(func(item *ovsdb.Bridge) bool { + return item.Name == bridgeName + }).List(context.Background(), &bridges) + if err != nil || len(bridges) != 1 { + return nil, fmt.Errorf("failed finding br-int: %w", err) + } + udns := sets.New[string]() + // node names can only have - or . and alphanumerics + for ctName := range bridges[0].ExternalIDs { + if strings.HasPrefix(ctName, "ct-zone-GR_") && strings.HasSuffix(ctName, "_dnat") { + // remove "ct-zone-GR_" prefix + s := ctName[11 : len(ctName)-5] + // format is [_] + if i := strings.Index(s, "_"); i != -1 { + udns.Insert(s[:i]) + } + } + } + //fmt.Println("udns: ", udns) + + for ctName, ctZone := range bridges[0].ExternalIDs { + if strings.HasPrefix(ctName, "ct-zone-") { + foundUDN := false + for udn := range udns { + if strings.Contains(ctName, udn) { + res[ctZone] = udn + foundUDN = true + break + } + } + if !foundUDN { + res[ctZone] = "default" + } + } + } + return res, nil +} diff --git a/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config/config.go b/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config/config.go index 6a54509af..3b129624b 100644 --- a/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config/config.go +++ b/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config/config.go @@ -13,14 +13,14 @@ import ( "strings" "time" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/labels" - "github.com/urfave/cli/v2" gcfg "gopkg.in/gcfg.v1" lumberjack "gopkg.in/natefinch/lumberjack.v2" + "k8s.io/apimachinery/pkg/api/validation" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" "k8s.io/klog/v2" - kexec "k8s.io/utils/exec" utilnet "k8s.io/utils/net" @@ -60,19 +60,20 @@ var ( // Default holds parsed config file parameters and command-line overrides Default = DefaultConfig{ - MTU: 1400, - ConntrackZone: 64000, - EncapType: "geneve", - EncapIP: "", - EncapPort: DefaultEncapPort, - InactivityProbe: 100000, // in Milliseconds - OpenFlowProbe: 180, // in Seconds - OfctrlWaitBeforeClear: 0, // in Milliseconds - MonitorAll: true, - OVSDBTxnTimeout: DefaultDBTxnTimeout, - LFlowCacheEnable: true, - RawClusterSubnets: "10.128.0.0/14/23", - Zone: types.OvnDefaultZone, + MTU: 1400, + ConntrackZone: 64000, + EncapType: "geneve", + EncapIP: "", + EncapPort: DefaultEncapPort, + InactivityProbe: 100000, // in Milliseconds + OpenFlowProbe: 180, // in Seconds + OfctrlWaitBeforeClear: 0, // in Milliseconds + MonitorAll: true, + OVSDBTxnTimeout: DefaultDBTxnTimeout, + LFlowCacheEnable: true, + RawClusterSubnets: "10.128.0.0/14/23", + Zone: types.OvnDefaultZone, + RawUDNAllowedDefaultServices: "default/kubernetes,kube-system/kube-dns", } // Logging holds logging-related parsed config file parameters and command-line overrides @@ -110,13 +111,14 @@ var ( // Kubernetes holds Kubernetes-related parsed config file parameters and command-line overrides Kubernetes = KubernetesConfig{ - APIServer: DefaultAPIServer, - RawServiceCIDRs: "172.16.1.0/24", - OVNConfigNamespace: "ovn-kubernetes", - HostNetworkNamespace: "", - PlatformType: "", - DNSServiceNamespace: "kube-system", - DNSServiceName: "kube-dns", + APIServer: DefaultAPIServer, + RawServiceCIDRs: "172.16.1.0/24", + OVNConfigNamespace: "ovn-kubernetes", + HostNetworkNamespace: "", + DisableRequestedChassis: false, + PlatformType: "", + DNSServiceNamespace: "kube-system", + DNSServiceName: "kube-dns", // By default, use a short lifetime length for certificates to ensure that the automatic rotation works well, // might revisit in the future to use a more sensible value CertDuration: 10 * time.Minute, @@ -280,6 +282,14 @@ type DefaultConfig struct { // Zone name to which ovnkube-node/ovnkube-controller belongs to Zone string `gcfg:"zone"` + + // RawUDNAllowedDefaultServices holds the unparsed UDNAllowedDefaultServices. Should only be + // used inside config module. + RawUDNAllowedDefaultServices string `gcfg:"udn-allowed-default-services"` + + // UDNAllowedDefaultServices holds a list of namespaced names of + // default cluster network services accessible from primary user-defined networks + UDNAllowedDefaultServices []string } // LoggingConfig holds logging-related parsed config file parameters and command-line overrides @@ -346,26 +356,27 @@ type CNIConfig struct { // KubernetesConfig holds Kubernetes-related parsed config file parameters and command-line overrides type KubernetesConfig struct { - BootstrapKubeconfig string `gcfg:"bootstrap-kubeconfig"` - CertDir string `gcfg:"cert-dir"` - CertDuration time.Duration `gcfg:"cert-duration"` - Kubeconfig string `gcfg:"kubeconfig"` - CACert string `gcfg:"cacert"` - CAData []byte - APIServer string `gcfg:"apiserver"` - Token string `gcfg:"token"` - TokenFile string `gcfg:"tokenFile"` - CompatServiceCIDR string `gcfg:"service-cidr"` - RawServiceCIDRs string `gcfg:"service-cidrs"` - ServiceCIDRs []*net.IPNet - OVNConfigNamespace string `gcfg:"ovn-config-namespace"` - OVNEmptyLbEvents bool `gcfg:"ovn-empty-lb-events"` - PodIP string `gcfg:"pod-ip"` // UNUSED - RawNoHostSubnetNodes string `gcfg:"no-hostsubnet-nodes"` - NoHostSubnetNodes labels.Selector - HostNetworkNamespace string `gcfg:"host-network-namespace"` - PlatformType string `gcfg:"platform-type"` - HealthzBindAddress string `gcfg:"healthz-bind-address"` + BootstrapKubeconfig string `gcfg:"bootstrap-kubeconfig"` + CertDir string `gcfg:"cert-dir"` + CertDuration time.Duration `gcfg:"cert-duration"` + Kubeconfig string `gcfg:"kubeconfig"` + CACert string `gcfg:"cacert"` + CAData []byte + APIServer string `gcfg:"apiserver"` + Token string `gcfg:"token"` + TokenFile string `gcfg:"tokenFile"` + CompatServiceCIDR string `gcfg:"service-cidr"` + RawServiceCIDRs string `gcfg:"service-cidrs"` + ServiceCIDRs []*net.IPNet + OVNConfigNamespace string `gcfg:"ovn-config-namespace"` + OVNEmptyLbEvents bool `gcfg:"ovn-empty-lb-events"` + PodIP string `gcfg:"pod-ip"` // UNUSED + RawNoHostSubnetNodes string `gcfg:"no-hostsubnet-nodes"` + NoHostSubnetNodes labels.Selector + HostNetworkNamespace string `gcfg:"host-network-namespace"` + DisableRequestedChassis bool `gcfg:"disable-requestedchassis"` + PlatformType string `gcfg:"platform-type"` + HealthzBindAddress string `gcfg:"healthz-bind-address"` // CompatMetricsBindAddress is overridden by the corresponding option in MetricsConfig CompatMetricsBindAddress string `gcfg:"metrics-bind-address"` @@ -636,6 +647,7 @@ func PrepareTestConfig() error { HybridOverlay = savedHybridOverlay OvnKubeNode = savedOvnKubeNode ClusterManager = savedClusterManager + Kubernetes.DisableRequestedChassis = false EnableMulticast = false Default.OVSDBTxnTimeout = 5 * time.Second @@ -921,6 +933,14 @@ var CommonFlags = []cli.Flag{ Value: Default.Zone, Destination: &cliConfig.Default.Zone, }, + &cli.StringFlag{ + Name: "udn-allowed-default-services", + Usage: "a list of namespaced names of default cluster network services accessible from primary" + + "user-defined networks. If not specified defaults to [\"default/kubernetes\", \"kube-system/kube-dns\"]." + + "Only used when enable-network-segmentation is set", + Value: Default.RawUDNAllowedDefaultServices, + Destination: &cliConfig.Default.RawUDNAllowedDefaultServices, + }, } // MonitoringFlags capture monitoring-related options @@ -1184,6 +1204,12 @@ var K8sFlags = []cli.Flag{ Destination: &cliConfig.Kubernetes.HostNetworkNamespace, Value: Kubernetes.HostNetworkNamespace, }, + &cli.BoolFlag{ + Name: "disable-requestedchassis", + Usage: "If set to true, requested-chassis option will not be set during pod creation", + Destination: &cliConfig.Kubernetes.DisableRequestedChassis, + Value: Kubernetes.DisableRequestedChassis, + }, &cli.StringFlag{ Name: "platform-type", Usage: "The cloud provider platform type ovn-kubernetes is deployed on. " + @@ -1759,7 +1785,7 @@ func buildKubernetesConfig(exec kexec.Interface, cli, file *config, saPath strin // completeKubernetesConfig completes the Kubernetes config by parsing raw values // into their final form. -func completeKubernetesConfig(allSubnets *configSubnets) error { +func completeKubernetesConfig(allSubnets *ConfigSubnets) error { Kubernetes.ServiceCIDRs = []*net.IPNet{} for _, cidrString := range strings.Split(Kubernetes.RawServiceCIDRs, ",") { _, serviceCIDR, err := net.ParseCIDR(cidrString) @@ -1767,7 +1793,7 @@ func completeKubernetesConfig(allSubnets *configSubnets) error { return fmt.Errorf("kubernetes service network CIDR %q invalid: %v", cidrString, err) } Kubernetes.ServiceCIDRs = append(Kubernetes.ServiceCIDRs, serviceCIDR) - allSubnets.append(configSubnetService, serviceCIDR) + allSubnets.Append(ConfigSubnetService, serviceCIDR) } if len(Kubernetes.ServiceCIDRs) > 2 { return fmt.Errorf("kubernetes service-cidrs must contain either a single CIDR or else an IPv4/IPv6 pair") @@ -1865,7 +1891,7 @@ func buildGatewayConfig(ctx *cli.Context, cli, file *config) error { return nil } -func completeGatewayConfig(allSubnets *configSubnets, masqueradeIPs *MasqueradeIPsConfig) error { +func completeGatewayConfig(allSubnets *ConfigSubnets, masqueradeIPs *MasqueradeIPsConfig) error { // Validate v4 and v6 join subnets v4IP, v4JoinCIDR, err := net.ParseCIDR(Gateway.V4JoinSubnet) if err != nil || utilnet.IsIPv6(v4IP) { @@ -1876,8 +1902,8 @@ func completeGatewayConfig(allSubnets *configSubnets, masqueradeIPs *MasqueradeI if err != nil || !utilnet.IsIPv6(v6IP) { return fmt.Errorf("invalid gateway v6 join subnet specified, subnet: %s: error: %v", Gateway.V6JoinSubnet, err) } - allSubnets.append(configSubnetJoin, v4JoinCIDR) - allSubnets.append(configSubnetJoin, v6JoinCIDR) + allSubnets.Append(ConfigSubnetJoin, v4JoinCIDR) + allSubnets.Append(ConfigSubnetJoin, v6JoinCIDR) //validate v4 and v6 masquerade subnets v4MasqueradeIP, v4MasqueradeCIDR, err := net.ParseCIDR(Gateway.V4MasqueradeSubnet) @@ -1896,8 +1922,8 @@ func completeGatewayConfig(allSubnets *configSubnets, masqueradeIPs *MasqueradeI return fmt.Errorf("unable to allocate V6MasqueradeIPs: %s", err) } - allSubnets.append(configSubnetMasquerade, v4MasqueradeCIDR) - allSubnets.append(configSubnetMasquerade, v6MasqueradeCIDR) + allSubnets.Append(ConfigSubnetMasquerade, v4MasqueradeCIDR) + allSubnets.Append(ConfigSubnetMasquerade, v6MasqueradeCIDR) return nil } @@ -2027,7 +2053,7 @@ func buildHybridOverlayConfig(ctx *cli.Context, cli, file *config) error { // completeHybridOverlayConfig completes the HybridOverlay config by parsing raw values // into their final form. -func completeHybridOverlayConfig(allSubnets *configSubnets) error { +func completeHybridOverlayConfig(allSubnets *ConfigSubnets) error { if !HybridOverlay.Enabled || len(HybridOverlay.RawClusterSubnets) == 0 { return nil } @@ -2038,7 +2064,7 @@ func completeHybridOverlayConfig(allSubnets *configSubnets) error { return fmt.Errorf("hybrid overlay cluster subnet invalid: %v", err) } for _, subnet := range HybridOverlay.ClusterSubnets { - allSubnets.append(configSubnetHybrid, subnet.CIDR) + allSubnets.Append(ConfigSubnetHybrid, subnet.CIDR) } return nil @@ -2060,7 +2086,7 @@ func buildClusterManagerConfig(ctx *cli.Context, cli, file *config) error { // completeClusterManagerConfig completes the ClusterManager config by parsing raw values // into their final form. -func completeClusterManagerConfig(allSubnets *configSubnets) error { +func completeClusterManagerConfig(allSubnets *ConfigSubnets) error { // Validate v4 and v6 transit switch subnets v4IP, v4TransitCIDR, err := net.ParseCIDR(ClusterManager.V4TransitSwitchSubnet) if err != nil || utilnet.IsIPv6(v4IP) { @@ -2071,8 +2097,8 @@ func completeClusterManagerConfig(allSubnets *configSubnets) error { if err != nil || !utilnet.IsIPv6(v6IP) { return fmt.Errorf("invalid transit switch v6 subnet specified, subnet: %s: error: %v", ClusterManager.V6TransitSwitchSubnet, err) } - allSubnets.append(configSubnetTransit, v4TransitCIDR) - allSubnets.append(configSubnetTransit, v6TransitCIDR) + allSubnets.Append(ConfigSubnetTransit, v4TransitCIDR) + allSubnets.Append(ConfigSubnetTransit, v6TransitCIDR) return nil } @@ -2101,14 +2127,19 @@ func buildDefaultConfig(cli, file *config) error { // completeDefaultConfig completes the Default config by parsing raw values // into their final form. -func completeDefaultConfig(allSubnets *configSubnets) error { +func completeDefaultConfig(allSubnets *ConfigSubnets) error { var err error Default.ClusterSubnets, err = ParseClusterSubnetEntries(Default.RawClusterSubnets) if err != nil { return fmt.Errorf("cluster subnet invalid: %v", err) } for _, subnet := range Default.ClusterSubnets { - allSubnets.append(configSubnetCluster, subnet.CIDR) + allSubnets.Append(ConfigSubnetCluster, subnet.CIDR) + } + + Default.UDNAllowedDefaultServices, err = parseServicesNamespacedNames(Default.RawUDNAllowedDefaultServices) + if err != nil { + return fmt.Errorf("UDN allowed services field is invalid: %v", err) } Default.HostMasqConntrackZone = Default.ConntrackZone + 1 @@ -2118,6 +2149,27 @@ func completeDefaultConfig(allSubnets *configSubnets) error { return nil } +// parseServicesNamespacedNames splits the input string by `,` and returns a slice +// of keys that were verified to be a valid namespaced service name. It ignores spaces between the elements. +func parseServicesNamespacedNames(servicesRaw string) ([]string, error) { + var services []string + for _, udnEnabledSVC := range strings.Split(servicesRaw, ",") { + svcKey := strings.TrimSpace(udnEnabledSVC) + namespace, name, err := cache.SplitMetaNamespaceKey(strings.TrimSpace(svcKey)) + if namespace == "" { + return nil, fmt.Errorf("UDN enabled service %q no namespace set: %v", svcKey, err) + } + if errs := validation.ValidateNamespaceName(namespace, false); len(errs) != 0 { + return nil, fmt.Errorf("UDN enabled service %q has an invalid namespace: %v", svcKey, err) + } + if errs := validation.NameIsDNSSubdomain(name, false); len(errs) != 0 { + return nil, fmt.Errorf("UDN enabled service %q has an invalid name: %v", svcKey, err) + } + services = append(services, svcKey) + } + return services, nil +} + // getConfigFilePath returns config file path and 'true' if the config file is // the fallback path (eg not given by the user), 'false' if given explicitly // by the user @@ -2333,7 +2385,7 @@ func initConfigWithPath(ctx *cli.Context, exec kexec.Interface, saPath string, d } func completeConfig() error { - allSubnets := newConfigSubnets() + allSubnets := NewConfigSubnets() if err := completeKubernetesConfig(allSubnets); err != nil { return err @@ -2356,7 +2408,7 @@ func completeConfig() error { return err } - if err := allSubnets.checkForOverlaps(); err != nil { + if err := allSubnets.CheckForOverlaps(); err != nil { return err } diff --git a/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config/utils.go b/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config/utils.go index 17cdb3027..b27be4d7c 100644 --- a/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config/utils.go +++ b/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config/utils.go @@ -162,67 +162,69 @@ func ParseFlowCollectors(flowCollectors string) ([]HostPort, error) { return parsedFlowsCollectors, nil } -type configSubnetType string +type ConfigSubnetType string const ( - configSubnetJoin configSubnetType = "built-in join subnet" - configSubnetCluster configSubnetType = "cluster subnet" - configSubnetService configSubnetType = "service subnet" - configSubnetHybrid configSubnetType = "hybrid overlay subnet" - configSubnetMasquerade configSubnetType = "masquerade subnet" - configSubnetTransit configSubnetType = "transit switch subnet" + ConfigSubnetJoin ConfigSubnetType = "built-in join subnet" + ConfigSubnetCluster ConfigSubnetType = "cluster subnet" + ConfigSubnetService ConfigSubnetType = "service subnet" + ConfigSubnetHybrid ConfigSubnetType = "hybrid overlay subnet" + ConfigSubnetMasquerade ConfigSubnetType = "masquerade subnet" + ConfigSubnetTransit ConfigSubnetType = "transit switch subnet" + UserDefinedSubnets ConfigSubnetType = "user defined subnet" + UserDefinedJoinSubnet ConfigSubnetType = "user defined join subnet" ) -type configSubnet struct { - subnetType configSubnetType - subnet *net.IPNet +type ConfigSubnet struct { + SubnetType ConfigSubnetType + Subnet *net.IPNet } -// configSubnets represents a set of configured subnets (and their names) -type configSubnets struct { - subnets []configSubnet - v4 map[configSubnetType]bool - v6 map[configSubnetType]bool +// ConfigSubnets represents a set of configured subnets (and their names) +type ConfigSubnets struct { + Subnets []ConfigSubnet + V4 map[ConfigSubnetType]bool + V6 map[ConfigSubnetType]bool } -// newConfigSubnets returns a new configSubnets -func newConfigSubnets() *configSubnets { - return &configSubnets{ - v4: make(map[configSubnetType]bool), - v6: make(map[configSubnetType]bool), +// NewConfigSubnets returns a new ConfigSubnets +func NewConfigSubnets() *ConfigSubnets { + return &ConfigSubnets{ + V4: make(map[ConfigSubnetType]bool), + V6: make(map[ConfigSubnetType]bool), } } // append adds a single subnet to cs -func (cs *configSubnets) append(subnetType configSubnetType, subnet *net.IPNet) { - cs.subnets = append(cs.subnets, configSubnet{subnetType: subnetType, subnet: subnet}) - if subnetType != configSubnetJoin && subnetType != configSubnetMasquerade && subnetType != configSubnetTransit { +func (cs *ConfigSubnets) Append(subnetType ConfigSubnetType, subnet *net.IPNet) { + cs.Subnets = append(cs.Subnets, ConfigSubnet{SubnetType: subnetType, Subnet: subnet}) + if subnetType == ConfigSubnetCluster || subnetType == ConfigSubnetService || subnetType == ConfigSubnetHybrid { if utilnet.IsIPv6CIDR(subnet) { - cs.v6[subnetType] = true + cs.V6[subnetType] = true } else { - cs.v4[subnetType] = true + cs.V4[subnetType] = true } } } -// checkForOverlaps checks if any of the subnets in cs overlap -func (cs *configSubnets) checkForOverlaps() error { - for i, si := range cs.subnets { +// CheckForOverlaps checks if any of the subnets in cs overlap +func (cs *ConfigSubnets) CheckForOverlaps() error { + for i, si := range cs.Subnets { for j := 0; j < i; j++ { - sj := cs.subnets[j] - if si.subnet.Contains(sj.subnet.IP) || sj.subnet.Contains(si.subnet.IP) { + sj := cs.Subnets[j] + if si.Subnet.Contains(sj.Subnet.IP) || sj.Subnet.Contains(si.Subnet.IP) { return fmt.Errorf("illegal network configuration: %s %q overlaps %s %q", - si.subnetType, si.subnet.String(), - sj.subnetType, sj.subnet.String()) + si.SubnetType, si.Subnet.String(), + sj.SubnetType, sj.Subnet.String()) } } } return nil } -func (cs *configSubnets) describeSubnetType(subnetType configSubnetType) string { - ipv4 := cs.v4[subnetType] - ipv6 := cs.v6[subnetType] +func (cs *ConfigSubnets) describeSubnetType(subnetType ConfigSubnetType) string { + ipv4 := cs.V4[subnetType] + ipv6 := cs.V6[subnetType] var familyType string switch { case ipv4 && !ipv6: @@ -240,45 +242,27 @@ func (cs *configSubnets) describeSubnetType(subnetType configSubnetType) string // checkIPFamilies determines if cs contains a valid single-stack IPv4 configuration, a // valid single-stack IPv6 configuration, a valid dual-stack configuration, or none of the // above. -func (cs *configSubnets) checkIPFamilies() (usingIPv4, usingIPv6 bool, err error) { - if len(cs.v6) == 0 { +func (cs *ConfigSubnets) checkIPFamilies() (usingIPv4, usingIPv6 bool, err error) { + if len(cs.V6) == 0 { // Single-stack IPv4 return true, false, nil - } else if len(cs.v4) == 0 { + } else if len(cs.V4) == 0 { // Single-stack IPv6 return false, true, nil - } else if reflect.DeepEqual(cs.v4, cs.v6) { + } else if reflect.DeepEqual(cs.V4, cs.V6) { // Dual-stack return true, true, nil } - netConfig := cs.describeSubnetType(configSubnetCluster) - netConfig += ", " + cs.describeSubnetType(configSubnetService) - if cs.v4[configSubnetHybrid] || cs.v6[configSubnetHybrid] { - netConfig += ", " + cs.describeSubnetType(configSubnetHybrid) + netConfig := cs.describeSubnetType(ConfigSubnetCluster) + netConfig += ", " + cs.describeSubnetType(ConfigSubnetService) + if cs.V4[ConfigSubnetHybrid] || cs.V6[ConfigSubnetHybrid] { + netConfig += ", " + cs.describeSubnetType(ConfigSubnetHybrid) } return false, false, fmt.Errorf("illegal network configuration: %s", netConfig) } -func ContainsJoinIP(ip net.IP) bool { - var joinSubnetsConfig []string - if IPv4Mode { - joinSubnetsConfig = append(joinSubnetsConfig, Gateway.V4JoinSubnet) - } - if IPv6Mode { - joinSubnetsConfig = append(joinSubnetsConfig, Gateway.V6JoinSubnet) - } - - for _, subnet := range joinSubnetsConfig { - _, joinSubnet, _ := net.ParseCIDR(subnet) - if joinSubnet.Contains(ip) { - return true - } - } - return false -} - // masqueradeIP represents the masqueradeIPs used by the masquerade subnets for host to service traffic type MasqueradeIPsConfig struct { V4OVNMasqueradeIP net.IP diff --git a/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/libovsdb/ops/router.go b/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/libovsdb/ops/router.go index 0eb8499ab..9aeb42123 100644 --- a/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/libovsdb/ops/router.go +++ b/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/libovsdb/ops/router.go @@ -8,9 +8,10 @@ import ( libovsdbclient "github.com/ovn-org/libovsdb/client" libovsdb "github.com/ovn-org/libovsdb/ovsdb" + "k8s.io/apimachinery/pkg/util/sets" + "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config" "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/nbdb" - "k8s.io/apimachinery/pkg/util/sets" ) // ROUTER OPs @@ -644,7 +645,7 @@ func CreateOrReplaceLogicalRouterStaticRouteWithPredicate(nbClient libovsdbclien lr := &nbdb.LogicalRouter{Name: routerName} router, err := GetLogicalRouter(nbClient, lr) if err != nil { - return err + return fmt.Errorf("unable to get logical router %s: %w", routerName, err) } newPredicate := func(item *nbdb.LogicalRouterStaticRoute) bool { for _, routeUUID := range router.StaticRoutes { @@ -656,7 +657,7 @@ func CreateOrReplaceLogicalRouterStaticRouteWithPredicate(nbClient libovsdbclien } routes, err := FindLogicalRouterStaticRoutesWithPredicate(nbClient, newPredicate) if err != nil { - return err + return fmt.Errorf("unable to get logical router static routes with predicate on router %s: %w", routerName, err) } var ops []libovsdb.Operation @@ -697,7 +698,7 @@ func CreateOrReplaceLogicalRouterStaticRouteWithPredicate(nbClient libovsdbclien ops, err = CreateOrUpdateLogicalRouterStaticRoutesWithPredicateOps(nbClient, ops, routerName, lrsr, nil, fields...) if err != nil { - return err + return fmt.Errorf("unable to get create or update logical router static routes on router %s: %w", routerName, err) } _, err = TransactAndCheck(nbClient, ops) return err @@ -886,6 +887,7 @@ func buildNAT( logicalPort string, externalMac string, externalIDs map[string]string, + match string, ) *nbdb.NAT { nat := &nbdb.NAT{ Type: natType, @@ -893,6 +895,7 @@ func buildNAT( LogicalIP: logicalIP, Options: map[string]string{"stateless": "false"}, ExternalIDs: externalIDs, + Match: match, } if logicalPort != "" { @@ -912,6 +915,16 @@ func BuildSNAT( logicalIP *net.IPNet, logicalPort string, externalIDs map[string]string, +) *nbdb.NAT { + return BuildSNATWithMatch(externalIP, logicalIP, logicalPort, externalIDs, "") +} + +func BuildSNATWithMatch( + externalIP *net.IP, + logicalIP *net.IPNet, + logicalPort string, + externalIDs map[string]string, + match string, ) *nbdb.NAT { externalIPStr := "" if externalIP != nil { @@ -923,7 +936,7 @@ func BuildSNAT( if logicalIPMask != 32 && logicalIPMask != 128 { logicalIPStr = logicalIP.String() } - return buildNAT(nbdb.NATTypeSNAT, externalIPStr, logicalIPStr, logicalPort, "", externalIDs) + return buildNAT(nbdb.NATTypeSNAT, externalIPStr, logicalIPStr, logicalPort, "", externalIDs, match) } // BuildDNATAndSNAT builds a logical router DNAT/SNAT @@ -933,6 +946,17 @@ func BuildDNATAndSNAT( logicalPort string, externalMac string, externalIDs map[string]string, +) *nbdb.NAT { + return BuildDNATAndSNATWithMatch(externalIP, logicalIP, logicalPort, externalMac, externalIDs, "") +} + +func BuildDNATAndSNATWithMatch( + externalIP *net.IP, + logicalIP *net.IPNet, + logicalPort string, + externalMac string, + externalIDs map[string]string, + match string, ) *nbdb.NAT { externalIPStr := "" if externalIP != nil { @@ -948,13 +972,18 @@ func BuildDNATAndSNAT( logicalIPStr, logicalPort, externalMac, - externalIDs) + externalIDs, + match) } -// isEquivalentNAT if it has same uuid. Otherwise, check if types match. -// ExternalIP must be unique amonst non-SNATs; -// LogicalIP must be unique amonst SNATs; -// If provided, LogicalPort is expected to match; +// isEquivalentNAT checks if the `searched` NAT is equivalent to `existing`. +// Returns true if the UUID is set in `searched` and matches the UUID of `existing`. +// Otherwise, perform the following checks: +// - Compare the Type and Match fields. +// - Compare ExternalIP if it is set in `searched`. +// - Compare LogicalIP if the Type in `searched` is SNAT. +// - Compare LogicalPort if it is set in `searched`. +// - Ensure that all ExternalIDs of `searched` exist and have the same value in `existing`. func isEquivalentNAT(existing *nbdb.NAT, searched *nbdb.NAT) bool { // Simple case: uuid was provided. if searched.UUID != "" && existing.UUID == searched.UUID { @@ -965,6 +994,10 @@ func isEquivalentNAT(existing *nbdb.NAT, searched *nbdb.NAT) bool { return false } + if searched.Match != existing.Match { + return false + } + // Compre externalIP if its not empty. if searched.ExternalIP != "" && searched.ExternalIP != existing.ExternalIP { return false diff --git a/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/libovsdb/ops/switch.go b/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/libovsdb/ops/switch.go index fbee34b55..964e711bb 100644 --- a/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/libovsdb/ops/switch.go +++ b/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/libovsdb/ops/switch.go @@ -312,6 +312,9 @@ func createOrUpdateLogicalSwitchPortsOps(nbClient libovsdbclient.Client, ops []l m := newModelClient(nbClient) ops, err := m.CreateOrUpdateOps(ops, opModels...) sw.Ports = originalPorts + if err != nil && errors.Is(err, libovsdbclient.ErrNotFound) && !createSwitch { + err = fmt.Errorf("could not find switch: %q, %w", sw.Name, err) + } return ops, err } diff --git a/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types/const.go b/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types/const.go index 7b021716e..1b2499ea5 100644 --- a/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types/const.go +++ b/vendor/github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types/const.go @@ -108,6 +108,7 @@ const ( MGMTPortPolicyPriority = "1005" NodeSubnetPolicyPriority = "1004" InterNodePolicyPriority = "1003" + UDNHostCIDRPolicyPriority = "99" HybridOverlaySubnetPriority = 1002 HybridOverlayReroutePriority = 501 DefaultNoRereoutePriority = 102 @@ -196,6 +197,8 @@ const ( LoadBalancerKindExternalID = OvnK8sPrefix + "/" + "kind" // key for load_balancer service external-id LoadBalancerOwnerExternalID = OvnK8sPrefix + "/" + "owner" + // key for UDN enabled services routes + UDNEnabledServiceExternalID = OvnK8sPrefix + "/" + "udn-enabled-default-service" // different secondary network topology type defined in CNI netconf Layer3Topology = "layer3" diff --git a/vendor/github.com/urfave/cli/v2/.gitignore b/vendor/github.com/urfave/cli/v2/.gitignore index 2d5e149b4..1ef91a60b 100644 --- a/vendor/github.com/urfave/cli/v2/.gitignore +++ b/vendor/github.com/urfave/cli/v2/.gitignore @@ -1,7 +1,14 @@ *.coverprofile +*.exe *.orig -node_modules/ -vendor +.*envrc +.envrc .idea -internal/*/built-example +# goimports is installed here if not available +/.local/ +/site/ coverage.txt +internal/*/built-example +vendor +/cmd/urfave-cli-genflags/urfave-cli-genflags +*.exe diff --git a/vendor/github.com/urfave/cli/v2/.golangci.yaml b/vendor/github.com/urfave/cli/v2/.golangci.yaml new file mode 100644 index 000000000..89b6e8661 --- /dev/null +++ b/vendor/github.com/urfave/cli/v2/.golangci.yaml @@ -0,0 +1,4 @@ +# https://golangci-lint.run/usage/configuration/ +linters: + enable: + - misspell diff --git a/vendor/github.com/urfave/cli/v2/CODE_OF_CONDUCT.md b/vendor/github.com/urfave/cli/v2/CODE_OF_CONDUCT.md index 41ba294f6..9fee14807 100644 --- a/vendor/github.com/urfave/cli/v2/CODE_OF_CONDUCT.md +++ b/vendor/github.com/urfave/cli/v2/CODE_OF_CONDUCT.md @@ -55,11 +55,12 @@ further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting Dan Buch at dan@meatballhat.com. All complaints will be -reviewed and investigated and will result in a response that is deemed necessary -and appropriate to the circumstances. The project team is obligated to maintain -confidentiality with regard to the reporter of an incident. Further details of -specific enforcement policies may be posted separately. +reported by contacting urfave-governance@googlegroups.com, a members-only group +that is world-postable. All complaints will be reviewed and investigated and +will result in a response that is deemed necessary and appropriate to the +circumstances. The project team is obligated to maintain confidentiality with +regard to the reporter of an incident. Further details of specific enforcement +policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other diff --git a/vendor/github.com/urfave/cli/v2/LICENSE b/vendor/github.com/urfave/cli/v2/LICENSE index 42a597e29..2c84c78a1 100644 --- a/vendor/github.com/urfave/cli/v2/LICENSE +++ b/vendor/github.com/urfave/cli/v2/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2016 Jeremy Saenz & Contributors +Copyright (c) 2022 urfave/cli maintainers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/github.com/urfave/cli/v2/Makefile b/vendor/github.com/urfave/cli/v2/Makefile new file mode 100644 index 000000000..f0d41905e --- /dev/null +++ b/vendor/github.com/urfave/cli/v2/Makefile @@ -0,0 +1,26 @@ +# NOTE: this Makefile is meant to provide a simplified entry point for humans to +# run all of the critical steps to verify one's changes are harmonious in +# nature. Keeping target bodies to one line each and abstaining from make magic +# are very important so that maintainers and contributors can focus their +# attention on files that are primarily Go. + +GO_RUN_BUILD := go run internal/build/build.go + +.PHONY: all +all: generate vet test check-binary-size gfmrun yamlfmt v2diff + +# NOTE: this is a special catch-all rule to run any of the commands +# defined in internal/build/build.go with optional arguments passed +# via GFLAGS (global flags) and FLAGS (command-specific flags), e.g.: +# +# $ make test GFLAGS='--packages cli' +%: + $(GO_RUN_BUILD) $(GFLAGS) $* $(FLAGS) + +.PHONY: docs +docs: + mkdocs build + +.PHONY: serve-docs +serve-docs: + mkdocs serve diff --git a/vendor/github.com/urfave/cli/v2/README.md b/vendor/github.com/urfave/cli/v2/README.md index c9237fbc6..9080aee41 100644 --- a/vendor/github.com/urfave/cli/v2/README.md +++ b/vendor/github.com/urfave/cli/v2/README.md @@ -1,66 +1,19 @@ -cli -=== +# cli -[![GoDoc](https://godoc.org/github.com/urfave/cli?status.svg)](https://godoc.org/github.com/urfave/cli) -[![codebeat](https://codebeat.co/badges/0a8f30aa-f975-404b-b878-5fab3ae1cc5f)](https://codebeat.co/projects/github-com-urfave-cli) -[![Go Report Card](https://goreportcard.com/badge/urfave/cli)](https://goreportcard.com/report/urfave/cli) -[![codecov](https://codecov.io/gh/urfave/cli/branch/master/graph/badge.svg)](https://codecov.io/gh/urfave/cli) +[![Run Tests](https://github.com/urfave/cli/actions/workflows/cli.yml/badge.svg?branch=v2-maint)](https://github.com/urfave/cli/actions/workflows/cli.yml) +[![Go Reference](https://pkg.go.dev/badge/github.com/urfave/cli/v2.svg)](https://pkg.go.dev/github.com/urfave/cli/v2) +[![Go Report Card](https://goreportcard.com/badge/github.com/urfave/cli/v2)](https://goreportcard.com/report/github.com/urfave/cli/v2) +[![codecov](https://codecov.io/gh/urfave/cli/branch/v2-maint/graph/badge.svg?token=t9YGWLh05g)](https://app.codecov.io/gh/urfave/cli/tree/v2-maint) cli is a simple, fast, and fun package for building command line apps in Go. The goal is to enable developers to write fast and distributable command line applications in an expressive way. -## Usage Documentation +## Documentation -Usage documentation exists for each major version. Don't know what version you're on? You're probably using the version from the `master` branch, which is currently `v2`. +More documentation is available in [`./docs`](./docs) or the hosted +documentation site at . -- `v2` - [./docs/v2/manual.md](./docs/v2/manual.md) -- `v1` - [./docs/v1/manual.md](./docs/v1/manual.md) +## License -## Installation - -Make sure you have a working Go environment. Go version 1.11+ is supported. [See the install instructions for Go](http://golang.org/doc/install.html). - -Go Modules are strongly recommended when using this package. [See the go blog guide on using Go Modules](https://blog.golang.org/using-go-modules). - -### Using `v2` releases - -``` -$ GO111MODULE=on go get github.com/urfave/cli/v2 -``` - -```go -... -import ( - "github.com/urfave/cli/v2" // imports as package "cli" -) -... -``` - -### Using `v1` releases - -``` -$ GO111MODULE=on go get github.com/urfave/cli -``` - -```go -... -import ( - "github.com/urfave/cli" -) -... -``` - -### GOPATH - -Make sure your `PATH` includes the `$GOPATH/bin` directory so your commands can -be easily used: -``` -export PATH=$PATH:$GOPATH/bin -``` - -### Supported platforms - -cli is tested against multiple versions of Go on Linux, and against the latest -released version of Go on OS X and Windows. This project uses Github Actions for -builds. For more build info, please look at the [./.github/workflows/cli.yml](https://github.com/urfave/cli/blob/master/.github/workflows/cli.yml). +See [`LICENSE`](./LICENSE) diff --git a/vendor/github.com/urfave/cli/v2/app.go b/vendor/github.com/urfave/cli/v2/app.go index d0c8f84e2..af072e769 100644 --- a/vendor/github.com/urfave/cli/v2/app.go +++ b/vendor/github.com/urfave/cli/v2/app.go @@ -8,16 +8,24 @@ import ( "os" "path/filepath" "sort" + "strings" "time" ) +const suggestDidYouMeanTemplate = "Did you mean %q?" + var ( - changeLogURL = "https://github.com/urfave/cli/blob/master/docs/CHANGELOG.md" + changeLogURL = "https://github.com/urfave/cli/blob/main/docs/CHANGELOG.md" appActionDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-action-signature", changeLogURL) contactSysadmin = "This is an error in the application. Please contact the distributor of this application if this is not you." errInvalidActionType = NewExitError("ERROR invalid Action type. "+ fmt.Sprintf("Must be `func(*Context`)` or `func(*Context) error). %s", contactSysadmin)+ fmt.Sprintf("See %s", appActionDeprecationURL), 2) + ignoreFlagPrefix = "test." // this is to ignore test flags when adding flags from other packages + + SuggestFlag SuggestFlagFunc = nil // initialized in suggestions.go unless built with urfave_cli_no_suggest + SuggestCommand SuggestCommandFunc = nil // initialized in suggestions.go unless built with urfave_cli_no_suggest + SuggestDidYouMeanTemplate string = suggestDidYouMeanTemplate ) // App is the main structure of a cli application. It is recommended that @@ -31,12 +39,17 @@ type App struct { Usage string // Text to override the USAGE section of help UsageText string + // Whether this command supports arguments + Args bool // Description of the program argument format. ArgsUsage string // Version of the program Version string // Description of the program Description string + // DefaultCommand is the (optional) name of a command + // to run if no command names are passed as CLI arguments. + DefaultCommand string // List of commands to execute Commands []*Command // List of flags to parse @@ -52,6 +65,8 @@ type App struct { HideVersion bool // categories contains the categorized commands and is populated on app startup categories CommandCategories + // flagCategories contains the categorized flags and is populated on app startup + flagCategories FlagCategories // An action to execute when the shell completion flag is set BashComplete BashCompleteFunc // An action to execute before any subcommands are run, but after the context is ready @@ -64,20 +79,25 @@ type App struct { Action ActionFunc // Execute this function if the proper command cannot be found CommandNotFound CommandNotFoundFunc - // Execute this function if an usage error occurs + // Execute this function if a usage error occurs OnUsageError OnUsageErrorFunc + // Execute this function when an invalid flag is accessed from the context + InvalidFlagAccessHandler InvalidFlagAccessFunc // Compilation date Compiled time.Time // List of all authors who contributed Authors []*Author // Copyright of the binary if any Copyright string + // Reader reader to write input to (useful for tests) + Reader io.Reader // Writer writer to write output to Writer io.Writer // ErrWriter writes error output ErrWriter io.Writer - // Execute this function to handle ExitErrors. If not provided, HandleExitCoder is provided to - // function as a default, so this is optional. + // ExitErrHandler processes any error encountered while running an App before + // it is returned to the caller. If no function is provided, HandleExitCoder + // is used as the default behavior. ExitErrHandler ExitErrHandlerFunc // Other custom info Metadata map[string]interface{} @@ -87,14 +107,32 @@ type App struct { // cli.go uses text/template to render templates. You can // render custom help text by setting this variable. CustomAppHelpTemplate string + // SliceFlagSeparator is used to customize the separator for SliceFlag, the default is "," + SliceFlagSeparator string + // DisableSliceFlagSeparator is used to disable SliceFlagSeparator, the default is false + DisableSliceFlagSeparator bool // Boolean to enable short-option handling so user can combine several // single-character bool arguments into one // i.e. foobar -o -v -> foobar -ov UseShortOptionHandling bool - - didSetup bool + // Enable suggestions for commands and flags + Suggest bool + // Allows global flags set by libraries which use flag.XXXVar(...) directly + // to be parsed through this library + AllowExtFlags bool + // Treat all flags as normal arguments if true + SkipFlagParsing bool + + didSetup bool + separator separatorSpec + + rootCommand *Command } +type SuggestFlagFunc func(flags []Flag, provided string, hideHelp bool) string + +type SuggestCommandFunc func(commands []*Command, provided string) string + // Tries to find out when this binary was compiled. // Returns the current time if it fails to find it. func compileTime() time.Time { @@ -110,13 +148,14 @@ func compileTime() time.Time { func NewApp() *App { return &App{ Name: filepath.Base(os.Args[0]), - HelpName: filepath.Base(os.Args[0]), Usage: "A new cli application", UsageText: "", BashComplete: DefaultAppComplete, Action: helpCommand.Action, Compiled: compileTime(), + Reader: os.Stdin, Writer: os.Stdout, + ErrWriter: os.Stderr, } } @@ -135,7 +174,7 @@ func (a *App) Setup() { } if a.HelpName == "" { - a.HelpName = filepath.Base(os.Args[0]) + a.HelpName = a.Name } if a.Usage == "" { @@ -158,19 +197,47 @@ func (a *App) Setup() { a.Compiled = compileTime() } + if a.Reader == nil { + a.Reader = os.Stdin + } + if a.Writer == nil { a.Writer = os.Stdout } - var newCommands []*Command + if a.ErrWriter == nil { + a.ErrWriter = os.Stderr + } + + if a.AllowExtFlags { + // add global flags added by other packages + flag.VisitAll(func(f *flag.Flag) { + // skip test flags + if !strings.HasPrefix(f.Name, ignoreFlagPrefix) { + a.Flags = append(a.Flags, &extFlag{f}) + } + }) + } + + if len(a.SliceFlagSeparator) != 0 { + a.separator.customized = true + a.separator.sep = a.SliceFlagSeparator + } + + if a.DisableSliceFlagSeparator { + a.separator.customized = true + a.separator.disabled = true + } for _, c := range a.Commands { - if c.HelpName == "" { - c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name) + cname := c.Name + if c.HelpName != "" { + cname = c.HelpName } - newCommands = append(newCommands, c) + c.separator = a.separator + c.HelpName = fmt.Sprintf("%s %s", a.HelpName, cname) + c.flagCategories = newFlagCategoriesFromFlags(c.Flags) } - a.Commands = newCommands if a.Command(helpCommand.Name) == nil && !a.HideHelp { if !a.HideHelpCommand { @@ -192,17 +259,42 @@ func (a *App) Setup() { } sort.Sort(a.categories.(*commandCategories)) + a.flagCategories = newFlagCategoriesFromFlags(a.Flags) + if a.Metadata == nil { a.Metadata = make(map[string]interface{}) } +} - if a.Writer == nil { - a.Writer = os.Stdout +func (a *App) newRootCommand() *Command { + return &Command{ + Name: a.Name, + Usage: a.Usage, + UsageText: a.UsageText, + Description: a.Description, + ArgsUsage: a.ArgsUsage, + BashComplete: a.BashComplete, + Before: a.Before, + After: a.After, + Action: a.Action, + OnUsageError: a.OnUsageError, + Subcommands: a.Commands, + Flags: a.Flags, + flagCategories: a.flagCategories, + HideHelp: a.HideHelp, + HideHelpCommand: a.HideHelpCommand, + UseShortOptionHandling: a.UseShortOptionHandling, + HelpName: a.HelpName, + CustomHelpTemplate: a.CustomAppHelpTemplate, + categories: a.categories, + SkipFlagParsing: a.SkipFlagParsing, + isRoot: true, + separator: a.separator, } } func (a *App) newFlagSet() (*flag.FlagSet, error) { - return flagSet(a.Name, a.Flags) + return flagSet(a.Name, a.Flags, a.separator) } func (a *App) useShortOptionHandling() bool { @@ -229,212 +321,72 @@ func (a *App) RunContext(ctx context.Context, arguments []string) (err error) { // always appends the completion flag at the end of the command shellComplete, arguments := checkShellCompleteFlag(a, arguments) - set, err := a.newFlagSet() - if err != nil { - return err - } + cCtx := NewContext(a, nil, &Context{Context: ctx}) + cCtx.shellComplete = shellComplete - err = parseIter(set, a, arguments[1:], shellComplete) - nerr := normalizeFlags(a.Flags, set) - context := NewContext(a, set, &Context{Context: ctx}) - if nerr != nil { - _, _ = fmt.Fprintln(a.Writer, nerr) - _ = ShowAppHelp(context) - return nerr - } - context.shellComplete = shellComplete - - if checkCompletions(context) { - return nil - } + a.rootCommand = a.newRootCommand() + cCtx.Command = a.rootCommand - if err != nil { - if a.OnUsageError != nil { - err := a.OnUsageError(context, err, false) - a.handleExitCoder(context, err) - return err - } - _, _ = fmt.Fprintf(a.Writer, "%s %s\n\n", "Incorrect Usage.", err.Error()) - _ = ShowAppHelp(context) + if err := checkDuplicatedCmds(a.rootCommand); err != nil { return err } + return a.rootCommand.Run(cCtx, arguments...) +} - if !a.HideHelp && checkHelp(context) { - _ = ShowAppHelp(context) - return nil - } +// RunAsSubcommand is for legacy/compatibility purposes only. New code should only +// use App.RunContext. This function is slated to be removed in v3. +func (a *App) RunAsSubcommand(ctx *Context) (err error) { + a.Setup() - if !a.HideVersion && checkVersion(context) { - ShowVersion(context) - return nil - } + cCtx := NewContext(a, nil, ctx) + cCtx.shellComplete = ctx.shellComplete - cerr := checkRequiredFlags(a.Flags, context) - if cerr != nil { - _ = ShowAppHelp(context) - return cerr - } + a.rootCommand = a.newRootCommand() + cCtx.Command = a.rootCommand - if a.After != nil { - defer func() { - if afterErr := a.After(context); afterErr != nil { - if err != nil { - err = newMultiError(err, afterErr) - } else { - err = afterErr - } - } - }() - } + return a.rootCommand.Run(cCtx, ctx.Args().Slice()...) +} - if a.Before != nil { - beforeErr := a.Before(context) - if beforeErr != nil { - _, _ = fmt.Fprintf(a.Writer, "%v\n\n", beforeErr) - _ = ShowAppHelp(context) - a.handleExitCoder(context, beforeErr) - err = beforeErr - return err - } +func (a *App) suggestFlagFromError(err error, command string) (string, error) { + flag, parseErr := flagFromError(err) + if parseErr != nil { + return "", err } - args := context.Args() - if args.Present() { - name := args.First() - c := a.Command(name) - if c != nil { - return c.Run(context) + flags := a.Flags + hideHelp := a.HideHelp + if command != "" { + cmd := a.Command(command) + if cmd == nil { + return "", err } + flags = cmd.Flags + hideHelp = hideHelp || cmd.HideHelp } - if a.Action == nil { - a.Action = helpCommand.Action + if SuggestFlag == nil { + return "", err + } + suggestion := SuggestFlag(flags, flag, hideHelp) + if len(suggestion) == 0 { + return "", err } - // Run default Action - err = a.Action(context) - - a.handleExitCoder(context, err) - return err + return fmt.Sprintf(SuggestDidYouMeanTemplate+"\n\n", suggestion), nil } // RunAndExitOnError calls .Run() and exits non-zero if an error was returned // // Deprecated: instead you should return an error that fulfills cli.ExitCoder -// to cli.App.Run. This will cause the application to exit with the given eror +// to cli.App.Run. This will cause the application to exit with the given error // code in the cli.ExitCoder func (a *App) RunAndExitOnError() { if err := a.Run(os.Args); err != nil { - _, _ = fmt.Fprintln(a.errWriter(), err) + _, _ = fmt.Fprintln(a.ErrWriter, err) OsExiter(1) } } -// RunAsSubcommand invokes the subcommand given the context, parses ctx.Args() to -// generate command-specific flags -func (a *App) RunAsSubcommand(ctx *Context) (err error) { - // Setup also handles HideHelp and HideHelpCommand - a.Setup() - - var newCmds []*Command - for _, c := range a.Commands { - if c.HelpName == "" { - c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name) - } - newCmds = append(newCmds, c) - } - a.Commands = newCmds - - set, err := a.newFlagSet() - if err != nil { - return err - } - - err = parseIter(set, a, ctx.Args().Tail(), ctx.shellComplete) - nerr := normalizeFlags(a.Flags, set) - context := NewContext(a, set, ctx) - - if nerr != nil { - _, _ = fmt.Fprintln(a.Writer, nerr) - _, _ = fmt.Fprintln(a.Writer) - if len(a.Commands) > 0 { - _ = ShowSubcommandHelp(context) - } else { - _ = ShowCommandHelp(ctx, context.Args().First()) - } - return nerr - } - - if checkCompletions(context) { - return nil - } - - if err != nil { - if a.OnUsageError != nil { - err = a.OnUsageError(context, err, true) - a.handleExitCoder(context, err) - return err - } - _, _ = fmt.Fprintf(a.Writer, "%s %s\n\n", "Incorrect Usage.", err.Error()) - _ = ShowSubcommandHelp(context) - return err - } - - if len(a.Commands) > 0 { - if checkSubcommandHelp(context) { - return nil - } - } else { - if checkCommandHelp(ctx, context.Args().First()) { - return nil - } - } - - cerr := checkRequiredFlags(a.Flags, context) - if cerr != nil { - _ = ShowSubcommandHelp(context) - return cerr - } - - if a.After != nil { - defer func() { - afterErr := a.After(context) - if afterErr != nil { - a.handleExitCoder(context, err) - if err != nil { - err = newMultiError(err, afterErr) - } else { - err = afterErr - } - } - }() - } - - if a.Before != nil { - beforeErr := a.Before(context) - if beforeErr != nil { - a.handleExitCoder(context, beforeErr) - err = beforeErr - return err - } - } - - args := context.Args() - if args.Present() { - name := args.First() - c := a.Command(name) - if c != nil { - return c.Run(context) - } - } - - // Run default Action - err = a.Action(context) - - a.handleExitCoder(context, err) - return err -} - // Command returns the named command on App. Returns nil if the command does not exist func (a *App) Command(name string) *Command { for _, c := range a.Commands { @@ -474,20 +426,19 @@ func (a *App) VisibleCommands() []*Command { return ret } +// VisibleFlagCategories returns a slice containing all the categories with the flags they contain +func (a *App) VisibleFlagCategories() []VisibleFlagCategory { + if a.flagCategories == nil { + return []VisibleFlagCategory{} + } + return a.flagCategories.VisibleCategories() +} + // VisibleFlags returns a slice of the Flags with Hidden=false func (a *App) VisibleFlags() []Flag { return visibleFlags(a.Flags) } -func (a *App) errWriter() io.Writer { - // When the app ErrWriter is nil use the package level one. - if a.ErrWriter == nil { - return ErrWriter - } - - return a.ErrWriter -} - func (a *App) appendFlag(fl Flag) { if !hasFlag(a.Flags, fl) { a.Flags = append(a.Flags, fl) @@ -500,14 +451,45 @@ func (a *App) appendCommand(c *Command) { } } -func (a *App) handleExitCoder(context *Context, err error) { +func (a *App) handleExitCoder(cCtx *Context, err error) { if a.ExitErrHandler != nil { - a.ExitErrHandler(context, err) + a.ExitErrHandler(cCtx, err) } else { HandleExitCoder(err) } } +func (a *App) argsWithDefaultCommand(oldArgs Args) Args { + if a.DefaultCommand != "" { + rawArgs := append([]string{a.DefaultCommand}, oldArgs.Slice()...) + newArgs := args(rawArgs) + + return &newArgs + } + + return oldArgs +} + +func runFlagActions(c *Context, fs []Flag) error { + for _, f := range fs { + isSet := false + for _, name := range f.Names() { + if c.IsSet(name) { + isSet = true + break + } + } + if isSet { + if af, ok := f.(ActionableFlag); ok { + if err := af.RunAction(c); err != nil { + return err + } + } + } + } + return nil +} + // Author represents someone who has contributed to a cli project. type Author struct { Name string // The Authors name @@ -527,16 +509,28 @@ func (a *Author) String() string { // HandleAction attempts to figure out which Action signature was used. If // it's an ActionFunc or a func with the legacy signature for Action, the func // is run! -func HandleAction(action interface{}, context *Context) (err error) { +func HandleAction(action interface{}, cCtx *Context) (err error) { switch a := action.(type) { case ActionFunc: - return a(context) + return a(cCtx) case func(*Context) error: - return a(context) + return a(cCtx) case func(*Context): // deprecated function signature - a(context) + a(cCtx) return nil } return errInvalidActionType } + +func checkStringSliceIncludes(want string, sSlice []string) bool { + found := false + for _, s := range sSlice { + if want == s { + found = true + break + } + } + + return found +} diff --git a/vendor/github.com/urfave/cli/v2/category.go b/vendor/github.com/urfave/cli/v2/category.go index 867e3908c..0986fffca 100644 --- a/vendor/github.com/urfave/cli/v2/category.go +++ b/vendor/github.com/urfave/cli/v2/category.go @@ -1,10 +1,12 @@ package cli +import "sort" + // CommandCategories interface allows for category manipulation type CommandCategories interface { // AddCommand adds a command to a category, creating a new category if necessary. AddCommand(category string, command *Command) - // categories returns a copy of the category slice + // Categories returns a slice of categories sorted by name Categories() []CommandCategory } @@ -77,3 +79,108 @@ func (c *commandCategory) VisibleCommands() []*Command { } return ret } + +// FlagCategories interface allows for category manipulation +type FlagCategories interface { + // AddFlags adds a flag to a category, creating a new category if necessary. + AddFlag(category string, fl Flag) + // VisibleCategories returns a slice of visible flag categories sorted by name + VisibleCategories() []VisibleFlagCategory +} + +type defaultFlagCategories struct { + m map[string]*defaultVisibleFlagCategory +} + +func newFlagCategories() FlagCategories { + return &defaultFlagCategories{ + m: map[string]*defaultVisibleFlagCategory{}, + } +} + +func newFlagCategoriesFromFlags(fs []Flag) FlagCategories { + fc := newFlagCategories() + + var categorized bool + for _, fl := range fs { + if cf, ok := fl.(CategorizableFlag); ok { + if cat := cf.GetCategory(); cat != "" && cf.IsVisible() { + fc.AddFlag(cat, cf) + categorized = true + } + } + } + + if categorized { + for _, fl := range fs { + if cf, ok := fl.(CategorizableFlag); ok { + if cf.GetCategory() == "" && cf.IsVisible() { + fc.AddFlag("", fl) + } + } + } + } + + return fc +} + +func (f *defaultFlagCategories) AddFlag(category string, fl Flag) { + if _, ok := f.m[category]; !ok { + f.m[category] = &defaultVisibleFlagCategory{name: category, m: map[string]Flag{}} + } + + f.m[category].m[fl.String()] = fl +} + +func (f *defaultFlagCategories) VisibleCategories() []VisibleFlagCategory { + catNames := []string{} + for name := range f.m { + catNames = append(catNames, name) + } + + sort.Strings(catNames) + + ret := make([]VisibleFlagCategory, len(catNames)) + for i, name := range catNames { + ret[i] = f.m[name] + } + + return ret +} + +// VisibleFlagCategory is a category containing flags. +type VisibleFlagCategory interface { + // Name returns the category name string + Name() string + // Flags returns a slice of VisibleFlag sorted by name + Flags() []VisibleFlag +} + +type defaultVisibleFlagCategory struct { + name string + m map[string]Flag +} + +func (fc *defaultVisibleFlagCategory) Name() string { + return fc.name +} + +func (fc *defaultVisibleFlagCategory) Flags() []VisibleFlag { + vfNames := []string{} + for flName, fl := range fc.m { + if vf, ok := fl.(VisibleFlag); ok { + if vf.IsVisible() { + vfNames = append(vfNames, flName) + } + } + } + + sort.Strings(vfNames) + + ret := make([]VisibleFlag, len(vfNames)) + for i, flName := range vfNames { + ret[i] = fc.m[flName].(VisibleFlag) + } + + return ret +} diff --git a/vendor/github.com/urfave/cli/v2/cli.go b/vendor/github.com/urfave/cli/v2/cli.go index 62a5bc22d..28ad0582b 100644 --- a/vendor/github.com/urfave/cli/v2/cli.go +++ b/vendor/github.com/urfave/cli/v2/cli.go @@ -1,23 +1,25 @@ // Package cli provides a minimal framework for creating and organizing command line // Go applications. cli is designed to be easy to understand and write, the most simple // cli application can be written as follows: -// func main() { -// (&cli.App{}).Run(os.Args) -// } +// +// func main() { +// (&cli.App{}).Run(os.Args) +// } // // Of course this application does not do much, so let's make this an actual application: -// func main() { -// app := &cli.App{ -// Name: "greet", -// Usage: "say a greeting", -// Action: func(c *cli.Context) error { -// fmt.Println("Greetings") -// return nil -// }, -// } // -// app.Run(os.Args) -// } +// func main() { +// app := &cli.App{ +// Name: "greet", +// Usage: "say a greeting", +// Action: func(c *cli.Context) error { +// fmt.Println("Greetings") +// return nil +// }, +// } +// +// app.Run(os.Args) +// } package cli -//go:generate go run flag-gen/main.go flag-gen/assets_vfsdata.go +//go:generate make -C cmd/urfave-cli-genflags run diff --git a/vendor/github.com/urfave/cli/v2/command.go b/vendor/github.com/urfave/cli/v2/command.go index 95840f32e..472c1ff44 100644 --- a/vendor/github.com/urfave/cli/v2/command.go +++ b/vendor/github.com/urfave/cli/v2/command.go @@ -3,6 +3,7 @@ package cli import ( "flag" "fmt" + "reflect" "sort" "strings" ) @@ -19,6 +20,8 @@ type Command struct { UsageText string // A longer explanation of how the command works Description string + // Whether this command supports arguments + Args bool // A short description of the arguments of this command ArgsUsage string // The category the command is part of @@ -38,7 +41,8 @@ type Command struct { // List of child commands Subcommands []*Command // List of flags to parse - Flags []Flag + Flags []Flag + flagCategories FlagCategories // Treat all flags as normal arguments if true SkipFlagParsing bool // Boolean to hide built-in help command and help flag @@ -61,6 +65,14 @@ type Command struct { // cli.go uses text/template to render templates. You can // render custom help text by setting this variable. CustomHelpTemplate string + + // categories contains the categorized commands and is populated on app startup + categories CommandCategories + + // if this is a root "special" command + isRoot bool + + separator separatorSpec } type Commands []*Command @@ -88,10 +100,21 @@ func (c *Command) FullName() string { return strings.Join(c.commandNamePath, " ") } -// Run invokes the command given the context, parses ctx.Args() to generate command-specific flags -func (c *Command) Run(ctx *Context) (err error) { - if len(c.Subcommands) > 0 { - return c.startApp(ctx) +func (cmd *Command) Command(name string) *Command { + for _, c := range cmd.Subcommands { + if c.HasName(name) { + return c + } + } + + return nil +} + +func (c *Command) setup(ctx *Context) { + if c.Command(helpCommand.Name) == nil && !c.HideHelp { + if !c.HideHelpCommand { + c.Subcommands = append(c.Subcommands, helpCommand) + } } if !c.HideHelp && HelpFlag != nil { @@ -103,41 +126,77 @@ func (c *Command) Run(ctx *Context) (err error) { c.UseShortOptionHandling = true } - set, err := c.parseFlags(ctx.Args(), ctx.shellComplete) + c.categories = newCommandCategories() + for _, command := range c.Subcommands { + c.categories.AddCommand(command.Category, command) + } + sort.Sort(c.categories.(*commandCategories)) - context := NewContext(ctx.App, set, ctx) - context.Command = c - if checkCommandCompletions(context, c.Name) { + for _, scmd := range c.Subcommands { + if scmd.HelpName == "" { + scmd.HelpName = fmt.Sprintf("%s %s", c.HelpName, scmd.Name) + } + scmd.separator = c.separator + } + + if c.BashComplete == nil { + c.BashComplete = DefaultCompleteWithFlags(c) + } +} + +func (c *Command) Run(cCtx *Context, arguments ...string) (err error) { + + if !c.isRoot { + c.setup(cCtx) + if err := checkDuplicatedCmds(c); err != nil { + return err + } + } + + a := args(arguments) + set, err := c.parseFlags(&a, cCtx.shellComplete) + cCtx.flagSet = set + + if checkCompletions(cCtx) { return nil } if err != nil { if c.OnUsageError != nil { - err = c.OnUsageError(context, err, false) - context.App.handleExitCoder(context, err) + err = c.OnUsageError(cCtx, err, !c.isRoot) + cCtx.App.handleExitCoder(cCtx, err) return err } - _, _ = fmt.Fprintln(context.App.Writer, "Incorrect Usage:", err.Error()) - _, _ = fmt.Fprintln(context.App.Writer) - _ = ShowCommandHelp(context, c.Name) + _, _ = fmt.Fprintf(cCtx.App.Writer, "%s %s\n\n", "Incorrect Usage:", err.Error()) + if cCtx.App.Suggest { + if suggestion, err := c.suggestFlagFromError(err, ""); err == nil { + fmt.Fprintf(cCtx.App.Writer, "%s", suggestion) + } + } + if !c.HideHelp { + if c.isRoot { + _ = ShowAppHelp(cCtx) + } else { + _ = ShowCommandHelp(cCtx.parentContext, c.Name) + } + } return err } - if checkCommandHelp(context, c.Name) { - return nil + if checkHelp(cCtx) { + return helpCommand.Action(cCtx) } - cerr := checkRequiredFlags(c.Flags, context) - if cerr != nil { - _ = ShowCommandHelp(context, c.Name) - return cerr + if c.isRoot && !cCtx.App.HideVersion && checkVersion(cCtx) { + ShowVersion(cCtx) + return nil } - if c.After != nil { + if c.After != nil && !cCtx.shellComplete { defer func() { - afterErr := c.After(context) + afterErr := c.After(cCtx) if afterErr != nil { - context.App.handleExitCoder(context, err) + cCtx.App.handleExitCoder(cCtx, err) if err != nil { err = newMultiError(err, afterErr) } else { @@ -147,36 +206,112 @@ func (c *Command) Run(ctx *Context) (err error) { }() } - if c.Before != nil { - err = c.Before(context) - if err != nil { - _ = ShowCommandHelp(context, c.Name) - context.App.handleExitCoder(context, err) + cerr := cCtx.checkRequiredFlags(c.Flags) + if cerr != nil { + _ = helpCommand.Action(cCtx) + return cerr + } + + if c.Before != nil && !cCtx.shellComplete { + beforeErr := c.Before(cCtx) + if beforeErr != nil { + cCtx.App.handleExitCoder(cCtx, beforeErr) + err = beforeErr return err } } - if c.Action == nil { - c.Action = helpSubcommand.Action + if err = runFlagActions(cCtx, c.Flags); err != nil { + return err } - context.Command = c - err = c.Action(context) + var cmd *Command + args := cCtx.Args() + if args.Present() { + name := args.First() + cmd = c.Command(name) + if cmd == nil { + hasDefault := cCtx.App.DefaultCommand != "" + isFlagName := checkStringSliceIncludes(name, cCtx.FlagNames()) + + var ( + isDefaultSubcommand = false + defaultHasSubcommands = false + ) + + if hasDefault { + dc := cCtx.App.Command(cCtx.App.DefaultCommand) + defaultHasSubcommands = len(dc.Subcommands) > 0 + for _, dcSub := range dc.Subcommands { + if checkStringSliceIncludes(name, dcSub.Names()) { + isDefaultSubcommand = true + break + } + } + } - if err != nil { - context.App.handleExitCoder(context, err) + if isFlagName || (hasDefault && (defaultHasSubcommands && isDefaultSubcommand)) { + argsWithDefault := cCtx.App.argsWithDefaultCommand(args) + if !reflect.DeepEqual(args, argsWithDefault) { + cmd = cCtx.App.rootCommand.Command(argsWithDefault.First()) + } + } + } + } else if c.isRoot && cCtx.App.DefaultCommand != "" { + if dc := cCtx.App.Command(cCtx.App.DefaultCommand); dc != c { + cmd = dc + } } + + if cmd != nil { + newcCtx := NewContext(cCtx.App, nil, cCtx) + newcCtx.Command = cmd + return cmd.Run(newcCtx, cCtx.Args().Slice()...) + } + + if c.Action == nil { + c.Action = helpCommand.Action + } + + err = c.Action(cCtx) + + cCtx.App.handleExitCoder(cCtx, err) return err } func (c *Command) newFlagSet() (*flag.FlagSet, error) { - return flagSet(c.Name, c.Flags) + return flagSet(c.Name, c.Flags, c.separator) } func (c *Command) useShortOptionHandling() bool { return c.UseShortOptionHandling } +func (c *Command) suggestFlagFromError(err error, command string) (string, error) { + flag, parseErr := flagFromError(err) + if parseErr != nil { + return "", err + } + + flags := c.Flags + hideHelp := c.HideHelp + if command != "" { + cmd := c.Command(command) + if cmd == nil { + return "", err + } + flags = cmd.Flags + hideHelp = hideHelp || cmd.HideHelp + } + + suggestion := SuggestFlag(flags, flag, hideHelp) + if len(suggestion) == 0 { + return "", err + } + + return fmt.Sprintf(SuggestDidYouMeanTemplate, suggestion) + "\n\n", nil +} + func (c *Command) parseFlags(args Args, shellComplete bool) (*flag.FlagSet, error) { set, err := c.newFlagSet() if err != nil { @@ -215,68 +350,40 @@ func (c *Command) HasName(name string) bool { return false } -func (c *Command) startApp(ctx *Context) error { - app := &App{ - Metadata: ctx.App.Metadata, - Name: fmt.Sprintf("%s %s", ctx.App.Name, c.Name), - } - - if c.HelpName == "" { - app.HelpName = c.HelpName - } else { - app.HelpName = app.Name +// VisibleCategories returns a slice of categories and commands that are +// Hidden=false +func (c *Command) VisibleCategories() []CommandCategory { + ret := []CommandCategory{} + for _, category := range c.categories.Categories() { + if visible := func() CommandCategory { + if len(category.VisibleCommands()) > 0 { + return category + } + return nil + }(); visible != nil { + ret = append(ret, visible) + } } + return ret +} - app.Usage = c.Usage - app.Description = c.Description - app.ArgsUsage = c.ArgsUsage - - // set CommandNotFound - app.CommandNotFound = ctx.App.CommandNotFound - app.CustomAppHelpTemplate = c.CustomHelpTemplate - - // set the flags and commands - app.Commands = c.Subcommands - app.Flags = c.Flags - app.HideHelp = c.HideHelp - app.HideHelpCommand = c.HideHelpCommand - - app.Version = ctx.App.Version - app.HideVersion = ctx.App.HideVersion - app.Compiled = ctx.App.Compiled - app.Writer = ctx.App.Writer - app.ErrWriter = ctx.App.ErrWriter - app.ExitErrHandler = ctx.App.ExitErrHandler - app.UseShortOptionHandling = ctx.App.UseShortOptionHandling - - app.categories = newCommandCategories() +// VisibleCommands returns a slice of the Commands with Hidden=false +func (c *Command) VisibleCommands() []*Command { + var ret []*Command for _, command := range c.Subcommands { - app.categories.AddCommand(command.Category, command) - } - - sort.Sort(app.categories.(*commandCategories)) - - // bash completion - app.EnableBashCompletion = ctx.App.EnableBashCompletion - if c.BashComplete != nil { - app.BashComplete = c.BashComplete - } - - // set the actions - app.Before = c.Before - app.After = c.After - if c.Action != nil { - app.Action = c.Action - } else { - app.Action = helpSubcommand.Action + if !command.Hidden { + ret = append(ret, command) + } } - app.OnUsageError = c.OnUsageError + return ret +} - for index, cc := range app.Commands { - app.Commands[index].commandNamePath = []string{c.Name, cc.Name} +// VisibleFlagCategories returns a slice containing all the visible flag categories with the flags they contain +func (c *Command) VisibleFlagCategories() []VisibleFlagCategory { + if c.flagCategories == nil { + c.flagCategories = newFlagCategoriesFromFlags(c.Flags) } - - return app.RunAsSubcommand(ctx) + return c.flagCategories.VisibleCategories() } // VisibleFlags returns a slice of the Flags with Hidden=false @@ -299,3 +406,16 @@ func hasCommand(commands []*Command, command *Command) bool { return false } + +func checkDuplicatedCmds(parent *Command) error { + seen := make(map[string]struct{}) + for _, c := range parent.Subcommands { + for _, name := range c.Names() { + if _, exists := seen[name]; exists { + return fmt.Errorf("parent command [%s] has duplicated subcommand name or alias: %s", parent.Name, name) + } + seen[name] = struct{}{} + } + } + return nil +} diff --git a/vendor/github.com/urfave/cli/v2/context.go b/vendor/github.com/urfave/cli/v2/context.go index 74ed51912..8dd476521 100644 --- a/vendor/github.com/urfave/cli/v2/context.go +++ b/vendor/github.com/urfave/cli/v2/context.go @@ -2,7 +2,6 @@ package cli import ( "context" - "errors" "flag" "fmt" "strings" @@ -42,88 +41,140 @@ func NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context { } // NumFlags returns the number of flags set -func (c *Context) NumFlags() int { - return c.flagSet.NFlag() +func (cCtx *Context) NumFlags() int { + return cCtx.flagSet.NFlag() } // Set sets a context flag to a value. -func (c *Context) Set(name, value string) error { - return c.flagSet.Set(name, value) +func (cCtx *Context) Set(name, value string) error { + if fs := cCtx.lookupFlagSet(name); fs != nil { + return fs.Set(name, value) + } + + return fmt.Errorf("no such flag -%s", name) } // IsSet determines if the flag was actually set -func (c *Context) IsSet(name string) bool { - if fs := lookupFlagSet(name, c); fs != nil { - if fs := lookupFlagSet(name, c); fs != nil { - isSet := false - fs.Visit(func(f *flag.Flag) { - if f.Name == name { - isSet = true - } - }) - if isSet { - return true +func (cCtx *Context) IsSet(name string) bool { + + if fs := cCtx.lookupFlagSet(name); fs != nil { + isSet := false + fs.Visit(func(f *flag.Flag) { + if f.Name == name { + isSet = true } + }) + if isSet { + return true } - f := lookupFlag(name, c) + f := cCtx.lookupFlag(name) if f == nil { return false } - return f.IsSet() + if f.IsSet() { + return true + } + + // now redo flagset search on aliases + aliases := f.Names() + fs.Visit(func(f *flag.Flag) { + for _, alias := range aliases { + if f.Name == alias { + isSet = true + } + } + }) + + if isSet { + return true + } } return false } // LocalFlagNames returns a slice of flag names used in this context. -func (c *Context) LocalFlagNames() []string { +func (cCtx *Context) LocalFlagNames() []string { var names []string - c.flagSet.Visit(makeFlagNameVisitor(&names)) - return names + cCtx.flagSet.Visit(makeFlagNameVisitor(&names)) + // Check the flags which have been set via env or file + if cCtx.Command != nil && cCtx.Command.Flags != nil { + for _, f := range cCtx.Command.Flags { + if f.IsSet() { + names = append(names, f.Names()...) + } + } + } + + // Sort out the duplicates since flag could be set via multiple + // paths + m := map[string]struct{}{} + var unames []string + for _, name := range names { + if _, ok := m[name]; !ok { + m[name] = struct{}{} + unames = append(unames, name) + } + } + + return unames } // FlagNames returns a slice of flag names used by the this context and all of // its parent contexts. -func (c *Context) FlagNames() []string { +func (cCtx *Context) FlagNames() []string { var names []string - for _, ctx := range c.Lineage() { - ctx.flagSet.Visit(makeFlagNameVisitor(&names)) + for _, pCtx := range cCtx.Lineage() { + names = append(names, pCtx.LocalFlagNames()...) } return names } // Lineage returns *this* context and all of its ancestor contexts in order from // child to parent -func (c *Context) Lineage() []*Context { +func (cCtx *Context) Lineage() []*Context { var lineage []*Context - for cur := c; cur != nil; cur = cur.parentContext { + for cur := cCtx; cur != nil; cur = cur.parentContext { lineage = append(lineage, cur) } return lineage } +// Count returns the num of occurrences of this flag +func (cCtx *Context) Count(name string) int { + if fs := cCtx.lookupFlagSet(name); fs != nil { + if cf, ok := fs.Lookup(name).Value.(Countable); ok { + return cf.Count() + } + } + return 0 +} + // Value returns the value of the flag corresponding to `name` -func (c *Context) Value(name string) interface{} { - return c.flagSet.Lookup(name).Value.(flag.Getter).Get() +func (cCtx *Context) Value(name string) interface{} { + if fs := cCtx.lookupFlagSet(name); fs != nil { + return fs.Lookup(name).Value.(flag.Getter).Get() + } + return nil } // Args returns the command line arguments associated with the context. -func (c *Context) Args() Args { - ret := args(c.flagSet.Args()) +func (cCtx *Context) Args() Args { + ret := args(cCtx.flagSet.Args()) return &ret } // NArg returns the number of the command line arguments. -func (c *Context) NArg() int { - return c.Args().Len() +func (cCtx *Context) NArg() int { + return cCtx.Args().Len() } -func lookupFlag(name string, ctx *Context) Flag { - for _, c := range ctx.Lineage() { +func (cCtx *Context) lookupFlag(name string) Flag { + for _, c := range cCtx.Lineage() { if c.Command == nil { continue } @@ -137,8 +188,8 @@ func lookupFlag(name string, ctx *Context) Flag { } } - if ctx.App != nil { - for _, f := range ctx.App.Flags { + if cCtx.App != nil { + for _, f := range cCtx.App.Flags { for _, n := range f.Names() { if n == name { return f @@ -150,58 +201,58 @@ func lookupFlag(name string, ctx *Context) Flag { return nil } -func lookupFlagSet(name string, ctx *Context) *flag.FlagSet { - for _, c := range ctx.Lineage() { +func (cCtx *Context) lookupFlagSet(name string) *flag.FlagSet { + for _, c := range cCtx.Lineage() { + if c.flagSet == nil { + continue + } if f := c.flagSet.Lookup(name); f != nil { return c.flagSet } } - + cCtx.onInvalidFlag(name) return nil } -func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) { - switch ff.Value.(type) { - case Serializer: - _ = set.Set(name, ff.Value.(Serializer).Serialize()) - default: - _ = set.Set(name, ff.Value.String()) - } -} - -func normalizeFlags(flags []Flag, set *flag.FlagSet) error { - visited := make(map[string]bool) - set.Visit(func(f *flag.Flag) { - visited[f.Name] = true - }) +func (cCtx *Context) checkRequiredFlags(flags []Flag) requiredFlagsErr { + var missingFlags []string for _, f := range flags { - parts := f.Names() - if len(parts) == 1 { - continue - } - var ff *flag.Flag - for _, name := range parts { - name = strings.Trim(name, " ") - if visited[name] { - if ff != nil { - return errors.New("Cannot use two forms of the same flag: " + name + " " + ff.Name) + if rf, ok := f.(RequiredFlag); ok && rf.IsRequired() { + var flagPresent bool + var flagName string + + flagNames := f.Names() + flagName = flagNames[0] + + for _, key := range flagNames { + if cCtx.IsSet(strings.TrimSpace(key)) { + flagPresent = true } - ff = set.Lookup(name) } - } - if ff == nil { - continue - } - for _, name := range parts { - name = strings.Trim(name, " ") - if !visited[name] { - copyFlag(name, ff, set) + + if !flagPresent && flagName != "" { + missingFlags = append(missingFlags, flagName) } } } + + if len(missingFlags) != 0 { + return &errRequiredFlags{missingFlags: missingFlags} + } + return nil } +func (cCtx *Context) onInvalidFlag(name string) { + for cCtx != nil { + if cCtx.App != nil && cCtx.App.InvalidFlagAccessHandler != nil { + cCtx.App.InvalidFlagAccessHandler(cCtx, name) + break + } + cCtx = cCtx.parentContext + } +} + func makeFlagNameVisitor(names *[]string) func(*flag.Flag) { return func(f *flag.Flag) { nameParts := strings.Split(f.Name, ",") @@ -219,55 +270,3 @@ func makeFlagNameVisitor(names *[]string) func(*flag.Flag) { } } } - -type requiredFlagsErr interface { - error - getMissingFlags() []string -} - -type errRequiredFlags struct { - missingFlags []string -} - -func (e *errRequiredFlags) Error() string { - numberOfMissingFlags := len(e.missingFlags) - if numberOfMissingFlags == 1 { - return fmt.Sprintf("Required flag %q not set", e.missingFlags[0]) - } - joinedMissingFlags := strings.Join(e.missingFlags, ", ") - return fmt.Sprintf("Required flags %q not set", joinedMissingFlags) -} - -func (e *errRequiredFlags) getMissingFlags() []string { - return e.missingFlags -} - -func checkRequiredFlags(flags []Flag, context *Context) requiredFlagsErr { - var missingFlags []string - for _, f := range flags { - if rf, ok := f.(RequiredFlag); ok && rf.IsRequired() { - var flagPresent bool - var flagName string - - for _, key := range f.Names() { - if len(key) > 1 { - flagName = key - } - - if context.IsSet(strings.TrimSpace(key)) { - flagPresent = true - } - } - - if !flagPresent && flagName != "" { - missingFlags = append(missingFlags, flagName) - } - } - } - - if len(missingFlags) != 0 { - return &errRequiredFlags{missingFlags: missingFlags} - } - - return nil -} diff --git a/vendor/github.com/urfave/cli/v2/docs.go b/vendor/github.com/urfave/cli/v2/docs.go index dc16fc82d..6cd0624ae 100644 --- a/vendor/github.com/urfave/cli/v2/docs.go +++ b/vendor/github.com/urfave/cli/v2/docs.go @@ -1,3 +1,6 @@ +//go:build !urfave_cli_no_docs +// +build !urfave_cli_no_docs + package cli import ( @@ -15,31 +18,39 @@ import ( // The function errors if either parsing or writing of the string fails. func (a *App) ToMarkdown() (string, error) { var w bytes.Buffer - if err := a.writeDocTemplate(&w); err != nil { + if err := a.writeDocTemplate(&w, 0); err != nil { return "", err } return w.String(), nil } -// ToMan creates a man page string for the `*App` +// ToMan creates a man page string with section number for the `*App` // The function errors if either parsing or writing of the string fails. -func (a *App) ToMan() (string, error) { +func (a *App) ToManWithSection(sectionNumber int) (string, error) { var w bytes.Buffer - if err := a.writeDocTemplate(&w); err != nil { + if err := a.writeDocTemplate(&w, sectionNumber); err != nil { return "", err } man := md2man.Render(w.Bytes()) return string(man), nil } +// ToMan creates a man page string for the `*App` +// The function errors if either parsing or writing of the string fails. +func (a *App) ToMan() (string, error) { + man, err := a.ToManWithSection(8) + return man, err +} + type cliTemplate struct { App *App + SectionNum int Commands []string GlobalArgs []string SynopsisArgs []string } -func (a *App) writeDocTemplate(w io.Writer) error { +func (a *App) writeDocTemplate(w io.Writer, sectionNum int) error { const name = "cli" t, err := template.New(name).Parse(MarkdownDocTemplate) if err != nil { @@ -47,6 +58,7 @@ func (a *App) writeDocTemplate(w io.Writer) error { } return t.ExecuteTemplate(w, name, &cliTemplate{ App: a, + SectionNum: sectionNum, Commands: prepareCommands(a.Commands, 0), GlobalArgs: prepareArgsWithValues(a.VisibleFlags()), SynopsisArgs: prepareArgsSynopsis(a.VisibleFlags()), @@ -59,25 +71,26 @@ func prepareCommands(commands []*Command, level int) []string { if command.Hidden { continue } - usage := "" - if command.Usage != "" { - usage = command.Usage - } - prepared := fmt.Sprintf("%s %s\n\n%s\n", + usageText := prepareUsageText(command) + + usage := prepareUsage(command, usageText) + + prepared := fmt.Sprintf("%s %s\n\n%s%s", strings.Repeat("#", level+2), strings.Join(command.Names(), ", "), usage, + usageText, ) - flags := prepareArgsWithValues(command.Flags) + flags := prepareArgsWithValues(command.VisibleFlags()) if len(flags) > 0 { prepared += fmt.Sprintf("\n%s", strings.Join(flags, "\n")) } coms = append(coms, prepared) - // recursevly iterate subcommands + // recursively iterate subcommands if len(command.Subcommands) > 0 { coms = append( coms, @@ -140,9 +153,51 @@ func prepareFlags( // flagDetails returns a string containing the flags metadata func flagDetails(flag DocGenerationFlag) string { description := flag.GetUsage() - value := flag.GetValue() - if value != "" { - description += " (default: " + value + ")" + if flag.TakesValue() { + defaultText := flag.GetDefaultText() + if defaultText == "" { + defaultText = flag.GetValue() + } + if defaultText != "" { + description += " (default: " + defaultText + ")" + } } return ": " + description } + +func prepareUsageText(command *Command) string { + if command.UsageText == "" { + return "" + } + + // Remove leading and trailing newlines + preparedUsageText := strings.Trim(command.UsageText, "\n") + + var usageText string + if strings.Contains(preparedUsageText, "\n") { + // Format multi-line string as a code block using the 4 space schema to allow for embedded markdown such + // that it will not break the continuous code block. + for _, ln := range strings.Split(preparedUsageText, "\n") { + usageText += fmt.Sprintf(" %s\n", ln) + } + } else { + // Style a single line as a note + usageText = fmt.Sprintf(">%s\n", preparedUsageText) + } + + return usageText +} + +func prepareUsage(command *Command, usageText string) string { + if command.Usage == "" { + return "" + } + + usage := command.Usage + "\n" + // Add a newline to the Usage IFF there is a UsageText + if usageText != "" { + usage += "\n" + } + + return usage +} diff --git a/vendor/github.com/urfave/cli/v2/errors.go b/vendor/github.com/urfave/cli/v2/errors.go index 344b4361e..a818727db 100644 --- a/vendor/github.com/urfave/cli/v2/errors.go +++ b/vendor/github.com/urfave/cli/v2/errors.go @@ -17,11 +17,10 @@ var ErrWriter io.Writer = os.Stderr // MultiError is an error that wraps multiple errors. type MultiError interface { error - // Errors returns a copy of the errors slice Errors() []error } -// NewMultiError creates a new MultiError. Pass in one or more errors. +// newMultiError creates a new MultiError. Pass in one or more errors. func newMultiError(err ...error) MultiError { ret := multiError(err) return &ret @@ -48,6 +47,28 @@ func (m *multiError) Errors() []error { return errs } +type requiredFlagsErr interface { + error + getMissingFlags() []string +} + +type errRequiredFlags struct { + missingFlags []string +} + +func (e *errRequiredFlags) Error() string { + numberOfMissingFlags := len(e.missingFlags) + if numberOfMissingFlags == 1 { + return fmt.Sprintf("Required flag %q not set", e.missingFlags[0]) + } + joinedMissingFlags := strings.Join(e.missingFlags, ", ") + return fmt.Sprintf("Required flags %q not set", joinedMissingFlags) +} + +func (e *errRequiredFlags) getMissingFlags() []string { + return e.missingFlags +} + // ErrorFormatter is the interface that will suitably format the error output type ErrorFormatter interface { Format(s fmt.State, verb rune) @@ -62,35 +83,61 @@ type ExitCoder interface { type exitError struct { exitCode int - message interface{} + err error } -// NewExitError makes a new *exitError +// NewExitError calls Exit to create a new ExitCoder. +// +// Deprecated: This function is a duplicate of Exit and will eventually be removed. func NewExitError(message interface{}, exitCode int) ExitCoder { return Exit(message, exitCode) } -// Exit wraps a message and exit code into an ExitCoder suitable for handling by -// HandleExitCoder +// Exit wraps a message and exit code into an error, which by default is +// handled with a call to os.Exit during default error handling. +// +// This is the simplest way to trigger a non-zero exit code for an App without +// having to call os.Exit manually. During testing, this behavior can be avoided +// by overriding the ExitErrHandler function on an App or the package-global +// OsExiter function. func Exit(message interface{}, exitCode int) ExitCoder { + var err error + + switch e := message.(type) { + case ErrorFormatter: + err = fmt.Errorf("%+v", message) + case error: + err = e + default: + err = fmt.Errorf("%+v", message) + } + return &exitError{ - message: message, + err: err, exitCode: exitCode, } } func (ee *exitError) Error() string { - return fmt.Sprintf("%v", ee.message) + return ee.err.Error() } func (ee *exitError) ExitCode() int { return ee.exitCode } -// HandleExitCoder checks if the error fulfills the ExitCoder interface, and if -// so prints the error to stderr (if it is non-empty) and calls OsExiter with the -// given exit code. If the given error is a MultiError, then this func is -// called on all members of the Errors slice and calls OsExiter with the last exit code. +func (ee *exitError) Unwrap() error { + return ee.err +} + +// HandleExitCoder handles errors implementing ExitCoder by printing their +// message and calling OsExiter with the given exit code. +// +// If the given error instead implements MultiError, each error will be checked +// for the ExitCoder interface, and OsExiter will be called with the last exit +// code found, or exit code 1 if no ExitCoder is found. +// +// This function is the default error-handling behavior for an App. func HandleExitCoder(err error) { if err == nil { return diff --git a/vendor/github.com/urfave/cli/v2/fish.go b/vendor/github.com/urfave/cli/v2/fish.go index 67122c9fe..909dfc5a2 100644 --- a/vendor/github.com/urfave/cli/v2/fish.go +++ b/vendor/github.com/urfave/cli/v2/fish.go @@ -95,10 +95,10 @@ func (a *App) prepareFishCommands(commands []*Command, allCommands *[]string, pr completions = append(completions, completion.String()) completions = append( completions, - a.prepareFishFlags(command.Flags, command.Names())..., + a.prepareFishFlags(command.VisibleFlags(), command.Names())..., ) - // recursevly iterate subcommands + // recursively iterate subcommands if len(command.Subcommands) > 0 { completions = append( completions, @@ -171,6 +171,10 @@ func fishAddFileFlag(flag Flag, completion *strings.Builder) { if f.TakesFile { return } + case *PathFlag: + if f.TakesFile { + return + } } completion.WriteString(" -f") } diff --git a/vendor/github.com/urfave/cli/v2/flag-spec.yaml b/vendor/github.com/urfave/cli/v2/flag-spec.yaml new file mode 100644 index 000000000..03d82e701 --- /dev/null +++ b/vendor/github.com/urfave/cli/v2/flag-spec.yaml @@ -0,0 +1,131 @@ +# NOTE: this file is used by the tool defined in +# ./cmd/urfave-cli-genflags/main.go which uses the +# `Spec` type that maps to this file structure. +flag_types: + bool: + struct_fields: + - name: Count + type: int + pointer: true + - name: DisableDefaultText + type: bool + - name: Action + type: "func(*Context, bool) error" + float64: + struct_fields: + - name: Action + type: "func(*Context, float64) error" + Float64Slice: + value_pointer: true + skip_interfaces: + - fmt.Stringer + struct_fields: + - name: separator + type: separatorSpec + - name: Action + type: "func(*Context, []float64) error" + int: + struct_fields: + - name: Base + type: int + - name: Action + type: "func(*Context, int) error" + IntSlice: + value_pointer: true + skip_interfaces: + - fmt.Stringer + struct_fields: + - name: separator + type: separatorSpec + - name: Action + type: "func(*Context, []int) error" + int64: + struct_fields: + - name: Base + type: int + - name: Action + type: "func(*Context, int64) error" + Int64Slice: + value_pointer: true + skip_interfaces: + - fmt.Stringer + struct_fields: + - name: separator + type: separatorSpec + - name: Action + type: "func(*Context, []int64) error" + uint: + struct_fields: + - name: Base + type: int + - name: Action + type: "func(*Context, uint) error" + UintSlice: + value_pointer: true + skip_interfaces: + - fmt.Stringer + struct_fields: + - name: separator + type: separatorSpec + - name: Action + type: "func(*Context, []uint) error" + uint64: + struct_fields: + - name: Base + type: int + - name: Action + type: "func(*Context, uint64) error" + Uint64Slice: + value_pointer: true + skip_interfaces: + - fmt.Stringer + struct_fields: + - name: separator + type: separatorSpec + - name: Action + type: "func(*Context, []uint64) error" + string: + struct_fields: + - name: TakesFile + type: bool + - name: Action + type: "func(*Context, string) error" + StringSlice: + value_pointer: true + skip_interfaces: + - fmt.Stringer + struct_fields: + - name: separator + type: separatorSpec + - name: TakesFile + type: bool + - name: Action + type: "func(*Context, []string) error" + - name: KeepSpace + type: bool + time.Duration: + struct_fields: + - name: Action + type: "func(*Context, time.Duration) error" + Timestamp: + value_pointer: true + struct_fields: + - name: Layout + type: string + - name: Timezone + type: "*time.Location" + - name: Action + type: "func(*Context, *time.Time) error" + Generic: + no_destination_pointer: true + struct_fields: + - name: TakesFile + type: bool + - name: Action + type: "func(*Context, interface{}) error" + Path: + struct_fields: + - name: TakesFile + type: bool + - name: Action + type: "func(*Context, Path) error" diff --git a/vendor/github.com/urfave/cli/v2/flag.go b/vendor/github.com/urfave/cli/v2/flag.go index ad97c2d05..4d04de3da 100644 --- a/vendor/github.com/urfave/cli/v2/flag.go +++ b/vendor/github.com/urfave/cli/v2/flag.go @@ -1,13 +1,13 @@ package cli import ( + "errors" "flag" "fmt" - "io/ioutil" - "reflect" + "io" + "os" "regexp" "runtime" - "strconv" "strings" "syscall" "time" @@ -15,6 +15,11 @@ import ( const defaultPlaceholder = "value" +const ( + defaultSliceFlagSeparator = "," + disableSliceFlagSeparator = false +) + var ( slPfx = fmt.Sprintf("sl:::%d:::", time.Now().UTC().UnixNano()) @@ -29,18 +34,20 @@ var BashCompletionFlag Flag = &BoolFlag{ // VersionFlag prints the version for the application var VersionFlag Flag = &BoolFlag{ - Name: "version", - Aliases: []string{"v"}, - Usage: "print the version", + Name: "version", + Aliases: []string{"v"}, + Usage: "print the version", + DisableDefaultText: true, } // HelpFlag prints the help for all commands and subcommands. // Set to nil to disable the flag. The subcommand // will still be added unless HideHelp or HideHelpCommand is set to true. var HelpFlag Flag = &BoolFlag{ - Name: "help", - Aliases: []string{"h"}, - Usage: "show help", + Name: "help", + Aliases: []string{"h"}, + Usage: "show help", + DisableDefaultText: true, } // FlagStringer converts a flag definition to a string. This is used by help @@ -84,6 +91,12 @@ func (f FlagsByName) Swap(i, j int) { f[i], f[j] = f[j], f[i] } +// ActionableFlag is an interface that wraps Flag interface and RunAction operation. +type ActionableFlag interface { + Flag + RunAction(*Context) error +} + // Flag is a common interface related to parsing flags in cli. // For more advanced flag parsing techniques, it is recommended that // this interface be implemented. @@ -116,25 +129,105 @@ type DocGenerationFlag interface { // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. GetValue() string + + // GetDefaultText returns the default text for this flag + GetDefaultText() string + + // GetEnvVars returns the env vars for this flag + GetEnvVars() []string } -func flagSet(name string, flags []Flag) (*flag.FlagSet, error) { +// DocGenerationSliceFlag extends DocGenerationFlag for slice-based flags. +type DocGenerationSliceFlag interface { + DocGenerationFlag + + // IsSliceFlag returns true for flags that can be given multiple times. + IsSliceFlag() bool +} + +// VisibleFlag is an interface that allows to check if a flag is visible +type VisibleFlag interface { + Flag + + // IsVisible returns true if the flag is not hidden, otherwise false + IsVisible() bool +} + +// CategorizableFlag is an interface that allows us to potentially +// use a flag in a categorized representation. +type CategorizableFlag interface { + VisibleFlag + + GetCategory() string +} + +// Countable is an interface to enable detection of flag values which support +// repetitive flags +type Countable interface { + Count() int +} + +func flagSet(name string, flags []Flag, spec separatorSpec) (*flag.FlagSet, error) { set := flag.NewFlagSet(name, flag.ContinueOnError) for _, f := range flags { + if c, ok := f.(customizedSeparator); ok { + c.WithSeparatorSpec(spec) + } if err := f.Apply(set); err != nil { return nil, err } } - set.SetOutput(ioutil.Discard) + set.SetOutput(io.Discard) return set, nil } +func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) { + switch ff.Value.(type) { + case Serializer: + _ = set.Set(name, ff.Value.(Serializer).Serialize()) + default: + _ = set.Set(name, ff.Value.String()) + } +} + +func normalizeFlags(flags []Flag, set *flag.FlagSet) error { + visited := make(map[string]bool) + set.Visit(func(f *flag.Flag) { + visited[f.Name] = true + }) + for _, f := range flags { + parts := f.Names() + if len(parts) == 1 { + continue + } + var ff *flag.Flag + for _, name := range parts { + name = strings.Trim(name, " ") + if visited[name] { + if ff != nil { + return errors.New("Cannot use two forms of the same flag: " + name + " " + ff.Name) + } + ff = set.Lookup(name) + } + } + if ff == nil { + continue + } + for _, name := range parts { + name = strings.Trim(name, " ") + if !visited[name] { + copyFlag(name, ff, set) + } + } + } + return nil +} + func visibleFlags(fl []Flag) []Flag { var visible []Flag for _, f := range fl { - field := flagValue(f).FieldByName("Hidden") - if !field.IsValid() || !field.Bool() { + if vf, ok := f.(VisibleFlag); ok && vf.IsVisible() { visible = append(visible, f) } } @@ -186,24 +279,28 @@ func prefixedNames(names []string, placeholder string) string { return prefixed } +func envFormat(envVars []string, prefix, sep, suffix string) string { + if len(envVars) > 0 { + return fmt.Sprintf(" [%s%s%s]", prefix, strings.Join(envVars, sep), suffix) + } + return "" +} + +func defaultEnvFormat(envVars []string) string { + return envFormat(envVars, "$", ", $", "") +} + func withEnvHint(envVars []string, str string) string { envText := "" - if envVars != nil && len(envVars) > 0 { - prefix := "$" - suffix := "" - sep := ", $" - if runtime.GOOS == "windows" { - prefix = "%" - suffix = "%" - sep = "%, %" - } - - envText = fmt.Sprintf(" [%s%s%s]", prefix, strings.Join(envVars, sep), suffix) + if runtime.GOOS != "windows" || os.Getenv("PSHOME") != "" { + envText = defaultEnvFormat(envVars) + } else { + envText = envFormat(envVars, "%", "%, %", "%") } return str + envText } -func flagNames(name string, aliases []string) []string { +func FlagNames(name string, aliases []string) []string { var ret []string for _, part := range append([]string{name}, aliases...) { @@ -217,17 +314,6 @@ func flagNames(name string, aliases []string) []string { return ret } -func flagStringSliceField(f Flag, name string) []string { - fv := flagValue(f) - field := fv.FieldByName(name) - - if field.IsValid() { - return field.Interface().([]string) - } - - return []string{} -} - func withFileHint(filePath, str string) string { fileText := "" if filePath != "" { @@ -236,130 +322,44 @@ func withFileHint(filePath, str string) string { return str + fileText } -func flagValue(f Flag) reflect.Value { - fv := reflect.ValueOf(f) - for fv.Kind() == reflect.Ptr { - fv = reflect.Indirect(fv) - } - return fv -} - func formatDefault(format string) string { return " (default: " + format + ")" } func stringifyFlag(f Flag) string { - fv := flagValue(f) - - switch f := f.(type) { - case *IntSliceFlag: - return withEnvHint(flagStringSliceField(f, "EnvVars"), - stringifyIntSliceFlag(f)) - case *Int64SliceFlag: - return withEnvHint(flagStringSliceField(f, "EnvVars"), - stringifyInt64SliceFlag(f)) - case *Float64SliceFlag: - return withEnvHint(flagStringSliceField(f, "EnvVars"), - stringifyFloat64SliceFlag(f)) - case *StringSliceFlag: - return withEnvHint(flagStringSliceField(f, "EnvVars"), - stringifyStringSliceFlag(f)) - } - - placeholder, usage := unquoteUsage(fv.FieldByName("Usage").String()) - - needsPlaceholder := false - defaultValueString := "" - val := fv.FieldByName("Value") - if val.IsValid() { - needsPlaceholder = val.Kind() != reflect.Bool - defaultValueString = fmt.Sprintf(formatDefault("%v"), val.Interface()) - - if val.Kind() == reflect.String && val.String() != "" { - defaultValueString = fmt.Sprintf(formatDefault("%q"), val.String()) - } + // enforce DocGeneration interface on flags to avoid reflection + df, ok := f.(DocGenerationFlag) + if !ok { + return "" } - helpText := fv.FieldByName("DefaultText") - if helpText.IsValid() && helpText.String() != "" { - needsPlaceholder = val.Kind() != reflect.Bool - defaultValueString = fmt.Sprintf(formatDefault("%s"), helpText.String()) - } - - if defaultValueString == formatDefault("") { - defaultValueString = "" - } + placeholder, usage := unquoteUsage(df.GetUsage()) + needsPlaceholder := df.TakesValue() if needsPlaceholder && placeholder == "" { placeholder = defaultPlaceholder } - usageWithDefault := strings.TrimSpace(usage + defaultValueString) - - return withEnvHint(flagStringSliceField(f, "EnvVars"), - fmt.Sprintf("%s\t%s", prefixedNames(f.Names(), placeholder), usageWithDefault)) -} - -func stringifyIntSliceFlag(f *IntSliceFlag) string { - var defaultVals []string - if f.Value != nil && len(f.Value.Value()) > 0 { - for _, i := range f.Value.Value() { - defaultVals = append(defaultVals, strconv.Itoa(i)) - } - } - - return stringifySliceFlag(f.Usage, f.Names(), defaultVals) -} - -func stringifyInt64SliceFlag(f *Int64SliceFlag) string { - var defaultVals []string - if f.Value != nil && len(f.Value.Value()) > 0 { - for _, i := range f.Value.Value() { - defaultVals = append(defaultVals, strconv.FormatInt(i, 10)) - } - } - - return stringifySliceFlag(f.Usage, f.Names(), defaultVals) -} - -func stringifyFloat64SliceFlag(f *Float64SliceFlag) string { - var defaultVals []string - - if f.Value != nil && len(f.Value.Value()) > 0 { - for _, i := range f.Value.Value() { - defaultVals = append(defaultVals, strings.TrimRight(strings.TrimRight(fmt.Sprintf("%f", i), "0"), ".")) - } - } - - return stringifySliceFlag(f.Usage, f.Names(), defaultVals) -} + defaultValueString := "" -func stringifyStringSliceFlag(f *StringSliceFlag) string { - var defaultVals []string - if f.Value != nil && len(f.Value.Value()) > 0 { - for _, s := range f.Value.Value() { - if len(s) > 0 { - defaultVals = append(defaultVals, strconv.Quote(s)) - } + // set default text for all flags except bool flags + // for bool flags display default text if DisableDefaultText is not + // set + if bf, ok := f.(*BoolFlag); !ok || !bf.DisableDefaultText { + if s := df.GetDefaultText(); s != "" { + defaultValueString = fmt.Sprintf(formatDefault("%s"), s) } } - return stringifySliceFlag(f.Usage, f.Names(), defaultVals) -} - -func stringifySliceFlag(usage string, names, defaultVals []string) string { - placeholder, usage := unquoteUsage(usage) - if placeholder == "" { - placeholder = defaultPlaceholder - } + usageWithDefault := strings.TrimSpace(usage + defaultValueString) - defaultVal := "" - if len(defaultVals) > 0 { - defaultVal = fmt.Sprintf(formatDefault("%s"), strings.Join(defaultVals, ", ")) + pn := prefixedNames(df.Names(), placeholder) + sliceFlag, ok := f.(DocGenerationSliceFlag) + if ok && sliceFlag.IsSliceFlag() { + pn = pn + " [ " + pn + " ]" } - usageWithDefault := strings.TrimSpace(fmt.Sprintf("%s%s", usage, defaultVal)) - return fmt.Sprintf("%s\t%s", prefixedNames(names, placeholder), usageWithDefault) + return withEnvHint(df.GetEnvVars(), fmt.Sprintf("%s\t%s", pn, usageWithDefault)) } func hasFlag(flags []Flag, fl Flag) bool { @@ -372,17 +372,48 @@ func hasFlag(flags []Flag, fl Flag) bool { return false } -func flagFromEnvOrFile(envVars []string, filePath string) (val string, ok bool) { +// Return the first value from a list of environment variables and files +// (which may or may not exist), a description of where the value was found, +// and a boolean which is true if a value was found. +func flagFromEnvOrFile(envVars []string, filePath string) (value string, fromWhere string, found bool) { for _, envVar := range envVars { envVar = strings.TrimSpace(envVar) - if val, ok := syscall.Getenv(envVar); ok { - return val, true + if value, found := syscall.Getenv(envVar); found { + return value, fmt.Sprintf("environment variable %q", envVar), true } } for _, fileVar := range strings.Split(filePath, ",") { - if data, err := ioutil.ReadFile(fileVar); err == nil { - return string(data), true + if fileVar != "" { + if data, err := os.ReadFile(fileVar); err == nil { + return string(data), fmt.Sprintf("file %q", filePath), true + } } } - return "", false + return "", "", false +} + +type customizedSeparator interface { + WithSeparatorSpec(separatorSpec) +} + +type separatorSpec struct { + sep string + disabled bool + customized bool +} + +func (s separatorSpec) flagSplitMultiValues(val string) []string { + var ( + disabled bool = s.disabled + sep string = s.sep + ) + if !s.customized { + disabled = disableSliceFlagSeparator + sep = defaultSliceFlagSeparator + } + if disabled { + return []string{val} + } + + return strings.Split(val, sep) } diff --git a/vendor/github.com/urfave/cli/v2/flag_bool.go b/vendor/github.com/urfave/cli/v2/flag_bool.go index bc9ea35d0..01862ea76 100644 --- a/vendor/github.com/urfave/cli/v2/flag_bool.go +++ b/vendor/github.com/urfave/cli/v2/flag_bool.go @@ -1,45 +1,61 @@ package cli import ( + "errors" "flag" "fmt" "strconv" ) -// BoolFlag is a flag with type bool -type BoolFlag struct { - Name string - Aliases []string - Usage string - EnvVars []string - FilePath string - Required bool - Hidden bool - Value bool - DefaultText string - Destination *bool - HasBeenSet bool +// boolValue needs to implement the boolFlag internal interface in flag +// to be able to capture bool fields and values +// +// type boolFlag interface { +// Value +// IsBoolFlag() bool +// } +type boolValue struct { + destination *bool + count *int } -// IsSet returns whether or not the flag has been set through env or file -func (f *BoolFlag) IsSet() bool { - return f.HasBeenSet +func newBoolValue(val bool, p *bool, count *int) *boolValue { + *p = val + return &boolValue{ + destination: p, + count: count, + } } -// String returns a readable representation of this value -// (for usage defaults) -func (f *BoolFlag) String() string { - return FlagStringer(f) +func (b *boolValue) Set(s string) error { + v, err := strconv.ParseBool(s) + if err != nil { + err = errors.New("parse error") + return err + } + *b.destination = v + if b.count != nil { + *b.count = *b.count + 1 + } + return err } -// Names returns the names of the flag -func (f *BoolFlag) Names() []string { - return flagNames(f.Name, f.Aliases) +func (b *boolValue) Get() interface{} { return *b.destination } + +func (b *boolValue) String() string { + if b.destination != nil { + return strconv.FormatBool(*b.destination) + } + return strconv.FormatBool(false) } -// IsRequired returns whether or not the flag is required -func (f *BoolFlag) IsRequired() bool { - return f.Required +func (b *boolValue) IsBoolFlag() bool { return true } + +func (b *boolValue) Count() int { + if b.count != nil && *b.count > 0 { + return *b.count + } + return 0 } // TakesValue returns true of the flag takes a value, otherwise false @@ -52,42 +68,98 @@ func (f *BoolFlag) GetUsage() string { return f.Usage } +// GetCategory returns the category for the flag +func (f *BoolFlag) GetCategory() string { + return f.Category +} + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *BoolFlag) GetValue() string { return "" } +// GetDefaultText returns the default text for this flag +func (f *BoolFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + if f.defaultValueSet { + return fmt.Sprintf("%v", f.defaultValue) + } + return fmt.Sprintf("%v", f.Value) +} + +// GetEnvVars returns the env vars for this flag +func (f *BoolFlag) GetEnvVars() []string { + return f.EnvVars +} + +// RunAction executes flag action if set +func (f *BoolFlag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.Bool(f.Name)) + } + + return nil +} + // Apply populates the flag given the flag set and environment func (f *BoolFlag) Apply(set *flag.FlagSet) error { - if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok { + // set default value so that environment wont be able to overwrite it + f.defaultValue = f.Value + f.defaultValueSet = true + + if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { if val != "" { valBool, err := strconv.ParseBool(val) if err != nil { - return fmt.Errorf("could not parse %q as bool value for flag %s: %s", val, f.Name, err) + return fmt.Errorf("could not parse %q as bool value from %s for flag %s: %s", val, source, f.Name, err) } f.Value = valBool - f.HasBeenSet = true + } else { + // empty value implies that the env is defined but set to empty string, we have to assume that this is + // what the user wants. If user doesnt want this then the env needs to be deleted or the flag removed from + // file + f.Value = false } + f.HasBeenSet = true + } + + count := f.Count + dest := f.Destination + + if count == nil { + count = new(int) + } + + // since count will be incremented for each alias as well + // subtract number of aliases from overall count + *count -= len(f.Aliases) + + if dest == nil { + dest = new(bool) } for _, name := range f.Names() { - if f.Destination != nil { - set.BoolVar(f.Destination, name, f.Value, f.Usage) - continue - } - set.Bool(name, f.Value, f.Usage) + value := newBoolValue(f.Value, dest, count) + set.Var(value, name, f.Usage) } return nil } +// Get returns the flag’s value in the given Context. +func (f *BoolFlag) Get(ctx *Context) bool { + return ctx.Bool(f.Name) +} + // Bool looks up the value of a local BoolFlag, returns // false if not found -func (c *Context) Bool(name string) bool { - if fs := lookupFlagSet(name, c); fs != nil { +func (cCtx *Context) Bool(name string) bool { + if fs := cCtx.lookupFlagSet(name); fs != nil { return lookupBool(name, fs) } return false diff --git a/vendor/github.com/urfave/cli/v2/flag_duration.go b/vendor/github.com/urfave/cli/v2/flag_duration.go index 22a2e6720..e600cc30a 100644 --- a/vendor/github.com/urfave/cli/v2/flag_duration.go +++ b/vendor/github.com/urfave/cli/v2/flag_duration.go @@ -6,42 +6,6 @@ import ( "time" ) -// DurationFlag is a flag with type time.Duration (see https://golang.org/pkg/time/#ParseDuration) -type DurationFlag struct { - Name string - Aliases []string - Usage string - EnvVars []string - FilePath string - Required bool - Hidden bool - Value time.Duration - DefaultText string - Destination *time.Duration - HasBeenSet bool -} - -// IsSet returns whether or not the flag has been set through env or file -func (f *DurationFlag) IsSet() bool { - return f.HasBeenSet -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f *DurationFlag) String() string { - return FlagStringer(f) -} - -// Names returns the names of the flag -func (f *DurationFlag) Names() []string { - return flagNames(f.Name, f.Aliases) -} - -// IsRequired returns whether or not the flag is required -func (f *DurationFlag) IsRequired() bool { - return f.Required -} - // TakesValue returns true of the flag takes a value, otherwise false func (f *DurationFlag) TakesValue() bool { return true @@ -52,20 +16,45 @@ func (f *DurationFlag) GetUsage() string { return f.Usage } +// GetCategory returns the category for the flag +func (f *DurationFlag) GetCategory() string { + return f.Category +} + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *DurationFlag) GetValue() string { return f.Value.String() } +// GetDefaultText returns the default text for this flag +func (f *DurationFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + if f.defaultValueSet { + return f.defaultValue.String() + } + return f.Value.String() +} + +// GetEnvVars returns the env vars for this flag +func (f *DurationFlag) GetEnvVars() []string { + return f.EnvVars +} + // Apply populates the flag given the flag set and environment func (f *DurationFlag) Apply(set *flag.FlagSet) error { - if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok { + // set default value so that environment wont be able to overwrite it + f.defaultValue = f.Value + f.defaultValueSet = true + + if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { if val != "" { valDuration, err := time.ParseDuration(val) if err != nil { - return fmt.Errorf("could not parse %q as duration value for flag %s: %s", val, f.Name, err) + return fmt.Errorf("could not parse %q as duration value from %s for flag %s: %s", val, source, f.Name, err) } f.Value = valDuration @@ -83,10 +72,24 @@ func (f *DurationFlag) Apply(set *flag.FlagSet) error { return nil } +// Get returns the flag’s value in the given Context. +func (f *DurationFlag) Get(ctx *Context) time.Duration { + return ctx.Duration(f.Name) +} + +// RunAction executes flag action if set +func (f *DurationFlag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.Duration(f.Name)) + } + + return nil +} + // Duration looks up the value of a local DurationFlag, returns // 0 if not found -func (c *Context) Duration(name string) time.Duration { - if fs := lookupFlagSet(name, c); fs != nil { +func (cCtx *Context) Duration(name string) time.Duration { + if fs := cCtx.lookupFlagSet(name); fs != nil { return lookupDuration(name, fs) } return 0 diff --git a/vendor/github.com/urfave/cli/v2/flag_ext.go b/vendor/github.com/urfave/cli/v2/flag_ext.go new file mode 100644 index 000000000..64da59ea9 --- /dev/null +++ b/vendor/github.com/urfave/cli/v2/flag_ext.go @@ -0,0 +1,48 @@ +package cli + +import "flag" + +type extFlag struct { + f *flag.Flag +} + +func (e *extFlag) Apply(fs *flag.FlagSet) error { + fs.Var(e.f.Value, e.f.Name, e.f.Usage) + return nil +} + +func (e *extFlag) Names() []string { + return []string{e.f.Name} +} + +func (e *extFlag) IsSet() bool { + return false +} + +func (e *extFlag) String() string { + return FlagStringer(e) +} + +func (e *extFlag) IsVisible() bool { + return true +} + +func (e *extFlag) TakesValue() bool { + return false +} + +func (e *extFlag) GetUsage() string { + return e.f.Usage +} + +func (e *extFlag) GetValue() string { + return e.f.Value.String() +} + +func (e *extFlag) GetDefaultText() string { + return e.f.DefValue +} + +func (e *extFlag) GetEnvVars() []string { + return nil +} diff --git a/vendor/github.com/urfave/cli/v2/flag_float64.go b/vendor/github.com/urfave/cli/v2/flag_float64.go index 91c778c87..6a4de5c88 100644 --- a/vendor/github.com/urfave/cli/v2/flag_float64.go +++ b/vendor/github.com/urfave/cli/v2/flag_float64.go @@ -6,42 +6,6 @@ import ( "strconv" ) -// Float64Flag is a flag with type float64 -type Float64Flag struct { - Name string - Aliases []string - Usage string - EnvVars []string - FilePath string - Required bool - Hidden bool - Value float64 - DefaultText string - Destination *float64 - HasBeenSet bool -} - -// IsSet returns whether or not the flag has been set through env or file -func (f *Float64Flag) IsSet() bool { - return f.HasBeenSet -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f *Float64Flag) String() string { - return FlagStringer(f) -} - -// Names returns the names of the flag -func (f *Float64Flag) Names() []string { - return flagNames(f.Name, f.Aliases) -} - -// IsRequired returns whether or not the flag is required -func (f *Float64Flag) IsRequired() bool { - return f.Required -} - // TakesValue returns true of the flag takes a value, otherwise false func (f *Float64Flag) TakesValue() bool { return true @@ -52,20 +16,43 @@ func (f *Float64Flag) GetUsage() string { return f.Usage } +// GetCategory returns the category for the flag +func (f *Float64Flag) GetCategory() string { + return f.Category +} + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *Float64Flag) GetValue() string { - return fmt.Sprintf("%f", f.Value) + return fmt.Sprintf("%v", f.Value) +} + +// GetDefaultText returns the default text for this flag +func (f *Float64Flag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + if f.defaultValueSet { + return fmt.Sprintf("%v", f.defaultValue) + } + return fmt.Sprintf("%v", f.Value) +} + +// GetEnvVars returns the env vars for this flag +func (f *Float64Flag) GetEnvVars() []string { + return f.EnvVars } // Apply populates the flag given the flag set and environment func (f *Float64Flag) Apply(set *flag.FlagSet) error { - if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok { - if val != "" { - valFloat, err := strconv.ParseFloat(val, 10) + f.defaultValue = f.Value + f.defaultValueSet = true + if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { + if val != "" { + valFloat, err := strconv.ParseFloat(val, 64) if err != nil { - return fmt.Errorf("could not parse %q as float64 value for flag %s: %s", val, f.Name, err) + return fmt.Errorf("could not parse %q as float64 value from %s for flag %s: %s", val, source, f.Name, err) } f.Value = valFloat @@ -84,10 +71,24 @@ func (f *Float64Flag) Apply(set *flag.FlagSet) error { return nil } +// Get returns the flag’s value in the given Context. +func (f *Float64Flag) Get(ctx *Context) float64 { + return ctx.Float64(f.Name) +} + +// RunAction executes flag action if set +func (f *Float64Flag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.Float64(f.Name)) + } + + return nil +} + // Float64 looks up the value of a local Float64Flag, returns // 0 if not found -func (c *Context) Float64(name string) float64 { - if fs := lookupFlagSet(name, c); fs != nil { +func (cCtx *Context) Float64(name string) float64 { + if fs := cCtx.lookupFlagSet(name); fs != nil { return lookupFloat64(name, fs) } return 0 diff --git a/vendor/github.com/urfave/cli/v2/flag_float64_slice.go b/vendor/github.com/urfave/cli/v2/flag_float64_slice.go index 706ee6cd4..0bc4612c8 100644 --- a/vendor/github.com/urfave/cli/v2/flag_float64_slice.go +++ b/vendor/github.com/urfave/cli/v2/flag_float64_slice.go @@ -11,6 +11,7 @@ import ( // Float64Slice wraps []float64 to satisfy flag.Value type Float64Slice struct { slice []float64 + separator separatorSpec hasBeenSet bool } @@ -19,6 +20,20 @@ func NewFloat64Slice(defaults ...float64) *Float64Slice { return &Float64Slice{slice: append([]float64{}, defaults...)} } +// clone allocate a copy of self object +func (f *Float64Slice) clone() *Float64Slice { + n := &Float64Slice{ + slice: make([]float64, len(f.slice)), + hasBeenSet: f.hasBeenSet, + } + copy(n.slice, f.slice) + return n +} + +func (f *Float64Slice) WithSeparatorSpec(spec separatorSpec) { + f.separator = spec +} + // Set parses the value into a float64 and appends it to the list of values func (f *Float64Slice) Set(value string) error { if !f.hasBeenSet { @@ -33,18 +48,25 @@ func (f *Float64Slice) Set(value string) error { return nil } - tmp, err := strconv.ParseFloat(value, 64) - if err != nil { - return err - } + for _, s := range f.separator.flagSplitMultiValues(value) { + tmp, err := strconv.ParseFloat(strings.TrimSpace(s), 64) + if err != nil { + return err + } - f.slice = append(f.slice, tmp) + f.slice = append(f.slice, tmp) + } return nil } // String returns a readable representation of this value (for usage defaults) func (f *Float64Slice) String() string { - return fmt.Sprintf("%#v", f.slice) + v := f.slice + if v == nil { + // treat nil the same as zero length non-nil + v = make([]float64, 0) + } + return fmt.Sprintf("%#v", v) } // Serialize allows Float64Slice to fulfill Serializer @@ -63,41 +85,12 @@ func (f *Float64Slice) Get() interface{} { return *f } -// Float64SliceFlag is a flag with type *Float64Slice -type Float64SliceFlag struct { - Name string - Aliases []string - Usage string - EnvVars []string - FilePath string - Required bool - Hidden bool - Value *Float64Slice - DefaultText string - HasBeenSet bool -} - -// IsSet returns whether or not the flag has been set through env or file -func (f *Float64SliceFlag) IsSet() bool { - return f.HasBeenSet -} - // String returns a readable representation of this value // (for usage defaults) func (f *Float64SliceFlag) String() string { return FlagStringer(f) } -// Names returns the names of the flag -func (f *Float64SliceFlag) Names() []string { - return flagNames(f.Name, f.Aliases) -} - -// IsRequired returns whether or not the flag is required -func (f *Float64SliceFlag) IsRequired() bool { - return f.Required -} - // TakesValue returns true if the flag takes a value, otherwise false func (f *Float64SliceFlag) TakesValue() bool { return true @@ -108,36 +101,96 @@ func (f *Float64SliceFlag) GetUsage() string { return f.Usage } +// GetCategory returns the category for the flag +func (f *Float64SliceFlag) GetCategory() string { + return f.Category +} + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *Float64SliceFlag) GetValue() string { - if f.Value != nil { - return f.Value.String() + var defaultVals []string + if f.Value != nil && len(f.Value.Value()) > 0 { + for _, i := range f.Value.Value() { + defaultVals = append(defaultVals, strings.TrimRight(strings.TrimRight(fmt.Sprintf("%f", i), "0"), ".")) + } } - return "" + return strings.Join(defaultVals, ", ") +} + +// GetDefaultText returns the default text for this flag +func (f *Float64SliceFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + +// GetEnvVars returns the env vars for this flag +func (f *Float64SliceFlag) GetEnvVars() []string { + return f.EnvVars +} + +// IsSliceFlag implements DocGenerationSliceFlag. +func (f *Float64SliceFlag) IsSliceFlag() bool { + return true } // Apply populates the flag given the flag set and environment func (f *Float64SliceFlag) Apply(set *flag.FlagSet) error { - if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok { - if val != "" { - f.Value = &Float64Slice{} + // apply any default + if f.Destination != nil && f.Value != nil { + f.Destination.slice = make([]float64, len(f.Value.slice)) + copy(f.Destination.slice, f.Value.slice) + } - for _, s := range strings.Split(val, ",") { - if err := f.Value.Set(strings.TrimSpace(s)); err != nil { - return fmt.Errorf("could not parse %q as float64 slice value for flag %s: %s", f.Value, f.Name, err) + // resolve setValue (what we will assign to the set) + var setValue *Float64Slice + switch { + case f.Destination != nil: + setValue = f.Destination + case f.Value != nil: + setValue = f.Value.clone() + default: + setValue = new(Float64Slice) + setValue.WithSeparatorSpec(f.separator) + } + + if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { + if val != "" { + for _, s := range f.separator.flagSplitMultiValues(val) { + if err := setValue.Set(strings.TrimSpace(s)); err != nil { + return fmt.Errorf("could not parse %q as float64 slice value from %s for flag %s: %s", val, source, f.Name, err) } } + // Set this to false so that we reset the slice if we then set values from + // flags that have already been set by the environment. + setValue.hasBeenSet = false f.HasBeenSet = true } } for _, name := range f.Names() { - if f.Value == nil { - f.Value = &Float64Slice{} - } - set.Var(f.Value, name, f.Usage) + set.Var(setValue, name, f.Usage) + } + + return nil +} + +func (f *Float64SliceFlag) WithSeparatorSpec(spec separatorSpec) { + f.separator = spec +} + +// Get returns the flag’s value in the given Context. +func (f *Float64SliceFlag) Get(ctx *Context) []float64 { + return ctx.Float64Slice(f.Name) +} + +// RunAction executes flag action if set +func (f *Float64SliceFlag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.Float64Slice(f.Name)) } return nil @@ -145,8 +198,8 @@ func (f *Float64SliceFlag) Apply(set *flag.FlagSet) error { // Float64Slice looks up the value of a local Float64SliceFlag, returns // nil if not found -func (c *Context) Float64Slice(name string) []float64 { - if fs := lookupFlagSet(name, c); fs != nil { +func (cCtx *Context) Float64Slice(name string) []float64 { + if fs := cCtx.lookupFlagSet(name); fs != nil { return lookupFloat64Slice(name, fs) } return nil @@ -155,7 +208,7 @@ func (c *Context) Float64Slice(name string) []float64 { func lookupFloat64Slice(name string, set *flag.FlagSet) []float64 { f := set.Lookup(name) if f != nil { - if slice, ok := f.Value.(*Float64Slice); ok { + if slice, ok := unwrapFlagValue(f.Value).(*Float64Slice); ok { return slice.Value() } } diff --git a/vendor/github.com/urfave/cli/v2/flag_generic.go b/vendor/github.com/urfave/cli/v2/flag_generic.go index b0c8ff44d..7528c934c 100644 --- a/vendor/github.com/urfave/cli/v2/flag_generic.go +++ b/vendor/github.com/urfave/cli/v2/flag_generic.go @@ -11,40 +11,17 @@ type Generic interface { String() string } -// GenericFlag is a flag with type Generic -type GenericFlag struct { - Name string - Aliases []string - Usage string - EnvVars []string - FilePath string - Required bool - Hidden bool - TakesFile bool - Value Generic - DefaultText string - HasBeenSet bool +type stringGeneric struct { + value string } -// IsSet returns whether or not the flag has been set through env or file -func (f *GenericFlag) IsSet() bool { - return f.HasBeenSet -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f *GenericFlag) String() string { - return FlagStringer(f) -} - -// Names returns the names of the flag -func (f *GenericFlag) Names() []string { - return flagNames(f.Name, f.Aliases) +func (s *stringGeneric) Set(value string) error { + s.value = value + return nil } -// IsRequired returns whether or not the flag is required -func (f *GenericFlag) IsRequired() bool { - return f.Required +func (s *stringGeneric) String() string { + return s.value } // TakesValue returns true of the flag takes a value, otherwise false @@ -57,6 +34,11 @@ func (f *GenericFlag) GetUsage() string { return f.Usage } +// GetCategory returns the category for the flag +func (f *GenericFlag) GetCategory() string { + return f.Category +} + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *GenericFlag) GetValue() string { @@ -66,13 +48,41 @@ func (f *GenericFlag) GetValue() string { return "" } +// GetDefaultText returns the default text for this flag +func (f *GenericFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + val := f.Value + if f.defaultValueSet { + val = f.defaultValue + } + + if val != nil { + return val.String() + } + + return "" +} + +// GetEnvVars returns the env vars for this flag +func (f *GenericFlag) GetEnvVars() []string { + return f.EnvVars +} + // Apply takes the flagset and calls Set on the generic flag with the value // provided by the user for parsing by the flag -func (f GenericFlag) Apply(set *flag.FlagSet) error { - if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok { +func (f *GenericFlag) Apply(set *flag.FlagSet) error { + // set default value so that environment wont be able to overwrite it + if f.Value != nil { + f.defaultValue = &stringGeneric{value: f.Value.String()} + f.defaultValueSet = true + } + + if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { if val != "" { if err := f.Value.Set(val); err != nil { - return fmt.Errorf("could not parse %q as value for flag %s: %s", val, f.Name, err) + return fmt.Errorf("could not parse %q from %s as value for flag %s: %s", val, source, f.Name, err) } f.HasBeenSet = true @@ -80,29 +90,42 @@ func (f GenericFlag) Apply(set *flag.FlagSet) error { } for _, name := range f.Names() { + if f.Destination != nil { + set.Var(f.Destination, name, f.Usage) + continue + } set.Var(f.Value, name, f.Usage) } return nil } +// Get returns the flag’s value in the given Context. +func (f *GenericFlag) Get(ctx *Context) interface{} { + return ctx.Generic(f.Name) +} + +// RunAction executes flag action if set +func (f *GenericFlag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.Generic(f.Name)) + } + + return nil +} + // Generic looks up the value of a local GenericFlag, returns // nil if not found -func (c *Context) Generic(name string) interface{} { - if fs := lookupFlagSet(name, c); fs != nil { +func (cCtx *Context) Generic(name string) interface{} { + if fs := cCtx.lookupFlagSet(name); fs != nil { return lookupGeneric(name, fs) } return nil } func lookupGeneric(name string, set *flag.FlagSet) interface{} { - f := set.Lookup(name) - if f != nil { - parsed, err := f.Value, error(nil) - if err != nil { - return nil - } - return parsed + if f := set.Lookup(name); f != nil { + return f.Value } return nil } diff --git a/vendor/github.com/urfave/cli/v2/flag_int.go b/vendor/github.com/urfave/cli/v2/flag_int.go index ac39d4a9e..750e7ebfc 100644 --- a/vendor/github.com/urfave/cli/v2/flag_int.go +++ b/vendor/github.com/urfave/cli/v2/flag_int.go @@ -6,42 +6,6 @@ import ( "strconv" ) -// IntFlag is a flag with type int -type IntFlag struct { - Name string - Aliases []string - Usage string - EnvVars []string - FilePath string - Required bool - Hidden bool - Value int - DefaultText string - Destination *int - HasBeenSet bool -} - -// IsSet returns whether or not the flag has been set through env or file -func (f *IntFlag) IsSet() bool { - return f.HasBeenSet -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f *IntFlag) String() string { - return FlagStringer(f) -} - -// Names returns the names of the flag -func (f *IntFlag) Names() []string { - return flagNames(f.Name, f.Aliases) -} - -// IsRequired returns whether or not the flag is required -func (f *IntFlag) IsRequired() bool { - return f.Required -} - // TakesValue returns true of the flag takes a value, otherwise false func (f *IntFlag) TakesValue() bool { return true @@ -52,20 +16,45 @@ func (f *IntFlag) GetUsage() string { return f.Usage } +// GetCategory returns the category for the flag +func (f *IntFlag) GetCategory() string { + return f.Category +} + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *IntFlag) GetValue() string { return fmt.Sprintf("%d", f.Value) } +// GetDefaultText returns the default text for this flag +func (f *IntFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + if f.defaultValueSet { + return fmt.Sprintf("%d", f.defaultValue) + } + return fmt.Sprintf("%d", f.Value) +} + +// GetEnvVars returns the env vars for this flag +func (f *IntFlag) GetEnvVars() []string { + return f.EnvVars +} + // Apply populates the flag given the flag set and environment func (f *IntFlag) Apply(set *flag.FlagSet) error { - if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok { + // set default value so that environment wont be able to overwrite it + f.defaultValue = f.Value + f.defaultValueSet = true + + if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { if val != "" { - valInt, err := strconv.ParseInt(val, 0, 64) + valInt, err := strconv.ParseInt(val, f.Base, 64) if err != nil { - return fmt.Errorf("could not parse %q as int value for flag %s: %s", val, f.Name, err) + return fmt.Errorf("could not parse %q as int value from %s for flag %s: %s", val, source, f.Name, err) } f.Value = int(valInt) @@ -84,10 +73,24 @@ func (f *IntFlag) Apply(set *flag.FlagSet) error { return nil } +// Get returns the flag’s value in the given Context. +func (f *IntFlag) Get(ctx *Context) int { + return ctx.Int(f.Name) +} + +// RunAction executes flag action if set +func (f *IntFlag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.Int(f.Name)) + } + + return nil +} + // Int looks up the value of a local IntFlag, returns // 0 if not found -func (c *Context) Int(name string) int { - if fs := lookupFlagSet(name, c); fs != nil { +func (cCtx *Context) Int(name string) int { + if fs := cCtx.lookupFlagSet(name); fs != nil { return lookupInt(name, fs) } return 0 diff --git a/vendor/github.com/urfave/cli/v2/flag_int64.go b/vendor/github.com/urfave/cli/v2/flag_int64.go index e09991269..688c26716 100644 --- a/vendor/github.com/urfave/cli/v2/flag_int64.go +++ b/vendor/github.com/urfave/cli/v2/flag_int64.go @@ -6,42 +6,6 @@ import ( "strconv" ) -// Int64Flag is a flag with type int64 -type Int64Flag struct { - Name string - Aliases []string - Usage string - EnvVars []string - FilePath string - Required bool - Hidden bool - Value int64 - DefaultText string - Destination *int64 - HasBeenSet bool -} - -// IsSet returns whether or not the flag has been set through env or file -func (f *Int64Flag) IsSet() bool { - return f.HasBeenSet -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f *Int64Flag) String() string { - return FlagStringer(f) -} - -// Names returns the names of the flag -func (f *Int64Flag) Names() []string { - return flagNames(f.Name, f.Aliases) -} - -// IsRequired returns whether or not the flag is required -func (f *Int64Flag) IsRequired() bool { - return f.Required -} - // TakesValue returns true of the flag takes a value, otherwise false func (f *Int64Flag) TakesValue() bool { return true @@ -52,20 +16,45 @@ func (f *Int64Flag) GetUsage() string { return f.Usage } +// GetCategory returns the category for the flag +func (f *Int64Flag) GetCategory() string { + return f.Category +} + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *Int64Flag) GetValue() string { return fmt.Sprintf("%d", f.Value) } +// GetDefaultText returns the default text for this flag +func (f *Int64Flag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + if f.defaultValueSet { + return fmt.Sprintf("%d", f.defaultValue) + } + return fmt.Sprintf("%d", f.Value) +} + +// GetEnvVars returns the env vars for this flag +func (f *Int64Flag) GetEnvVars() []string { + return f.EnvVars +} + // Apply populates the flag given the flag set and environment func (f *Int64Flag) Apply(set *flag.FlagSet) error { - if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok { + // set default value so that environment wont be able to overwrite it + f.defaultValue = f.Value + f.defaultValueSet = true + + if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { if val != "" { - valInt, err := strconv.ParseInt(val, 0, 64) + valInt, err := strconv.ParseInt(val, f.Base, 64) if err != nil { - return fmt.Errorf("could not parse %q as int value for flag %s: %s", val, f.Name, err) + return fmt.Errorf("could not parse %q as int value from %s for flag %s: %s", val, source, f.Name, err) } f.Value = valInt @@ -83,10 +72,24 @@ func (f *Int64Flag) Apply(set *flag.FlagSet) error { return nil } +// Get returns the flag’s value in the given Context. +func (f *Int64Flag) Get(ctx *Context) int64 { + return ctx.Int64(f.Name) +} + +// RunAction executes flag action if set +func (f *Int64Flag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.Int64(f.Name)) + } + + return nil +} + // Int64 looks up the value of a local Int64Flag, returns // 0 if not found -func (c *Context) Int64(name string) int64 { - if fs := lookupFlagSet(name, c); fs != nil { +func (cCtx *Context) Int64(name string) int64 { + if fs := cCtx.lookupFlagSet(name); fs != nil { return lookupInt64(name, fs) } return 0 diff --git a/vendor/github.com/urfave/cli/v2/flag_int64_slice.go b/vendor/github.com/urfave/cli/v2/flag_int64_slice.go index 6c7fd9376..d45c2dd44 100644 --- a/vendor/github.com/urfave/cli/v2/flag_int64_slice.go +++ b/vendor/github.com/urfave/cli/v2/flag_int64_slice.go @@ -11,6 +11,7 @@ import ( // Int64Slice wraps []int64 to satisfy flag.Value type Int64Slice struct { slice []int64 + separator separatorSpec hasBeenSet bool } @@ -19,6 +20,20 @@ func NewInt64Slice(defaults ...int64) *Int64Slice { return &Int64Slice{slice: append([]int64{}, defaults...)} } +// clone allocate a copy of self object +func (i *Int64Slice) clone() *Int64Slice { + n := &Int64Slice{ + slice: make([]int64, len(i.slice)), + hasBeenSet: i.hasBeenSet, + } + copy(n.slice, i.slice) + return n +} + +func (i *Int64Slice) WithSeparatorSpec(spec separatorSpec) { + i.separator = spec +} + // Set parses the value into an integer and appends it to the list of values func (i *Int64Slice) Set(value string) error { if !i.hasBeenSet { @@ -33,19 +48,26 @@ func (i *Int64Slice) Set(value string) error { return nil } - tmp, err := strconv.ParseInt(value, 0, 64) - if err != nil { - return err - } + for _, s := range i.separator.flagSplitMultiValues(value) { + tmp, err := strconv.ParseInt(strings.TrimSpace(s), 0, 64) + if err != nil { + return err + } - i.slice = append(i.slice, tmp) + i.slice = append(i.slice, tmp) + } return nil } // String returns a readable representation of this value (for usage defaults) func (i *Int64Slice) String() string { - return fmt.Sprintf("%#v", i.slice) + v := i.slice + if v == nil { + // treat nil the same as zero length non-nil + v = make([]int64, 0) + } + return fmt.Sprintf("%#v", v) } // Serialize allows Int64Slice to fulfill Serializer @@ -64,79 +86,110 @@ func (i *Int64Slice) Get() interface{} { return *i } -// Int64SliceFlag is a flag with type *Int64Slice -type Int64SliceFlag struct { - Name string - Aliases []string - Usage string - EnvVars []string - FilePath string - Required bool - Hidden bool - Value *Int64Slice - DefaultText string - HasBeenSet bool -} - -// IsSet returns whether or not the flag has been set through env or file -func (f *Int64SliceFlag) IsSet() bool { - return f.HasBeenSet -} - // String returns a readable representation of this value // (for usage defaults) func (f *Int64SliceFlag) String() string { return FlagStringer(f) } -// Names returns the names of the flag -func (f *Int64SliceFlag) Names() []string { - return flagNames(f.Name, f.Aliases) -} - -// IsRequired returns whether or not the flag is required -func (f *Int64SliceFlag) IsRequired() bool { - return f.Required -} - // TakesValue returns true of the flag takes a value, otherwise false func (f *Int64SliceFlag) TakesValue() bool { return true } // GetUsage returns the usage string for the flag -func (f Int64SliceFlag) GetUsage() string { +func (f *Int64SliceFlag) GetUsage() string { return f.Usage } +// GetCategory returns the category for the flag +func (f *Int64SliceFlag) GetCategory() string { + return f.Category +} + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *Int64SliceFlag) GetValue() string { - if f.Value != nil { - return f.Value.String() + var defaultVals []string + if f.Value != nil && len(f.Value.Value()) > 0 { + for _, i := range f.Value.Value() { + defaultVals = append(defaultVals, strconv.FormatInt(i, 10)) + } } - return "" + return strings.Join(defaultVals, ", ") +} + +// GetDefaultText returns the default text for this flag +func (f *Int64SliceFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + +// GetEnvVars returns the env vars for this flag +func (f *Int64SliceFlag) GetEnvVars() []string { + return f.EnvVars +} + +// IsSliceFlag implements DocGenerationSliceFlag. +func (f *Int64SliceFlag) IsSliceFlag() bool { + return true } // Apply populates the flag given the flag set and environment func (f *Int64SliceFlag) Apply(set *flag.FlagSet) error { - if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok { - f.Value = &Int64Slice{} + // apply any default + if f.Destination != nil && f.Value != nil { + f.Destination.slice = make([]int64, len(f.Value.slice)) + copy(f.Destination.slice, f.Value.slice) + } + + // resolve setValue (what we will assign to the set) + var setValue *Int64Slice + switch { + case f.Destination != nil: + setValue = f.Destination + case f.Value != nil: + setValue = f.Value.clone() + default: + setValue = new(Int64Slice) + setValue.WithSeparatorSpec(f.separator) + } - for _, s := range strings.Split(val, ",") { - if err := f.Value.Set(strings.TrimSpace(s)); err != nil { - return fmt.Errorf("could not parse %q as int64 slice value for flag %s: %s", val, f.Name, err) + if val, source, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok && val != "" { + for _, s := range f.separator.flagSplitMultiValues(val) { + if err := setValue.Set(strings.TrimSpace(s)); err != nil { + return fmt.Errorf("could not parse %q as int64 slice value from %s for flag %s: %s", val, source, f.Name, err) } } + // Set this to false so that we reset the slice if we then set values from + // flags that have already been set by the environment. + setValue.hasBeenSet = false f.HasBeenSet = true } for _, name := range f.Names() { - if f.Value == nil { - f.Value = &Int64Slice{} - } - set.Var(f.Value, name, f.Usage) + set.Var(setValue, name, f.Usage) + } + + return nil +} + +func (f *Int64SliceFlag) WithSeparatorSpec(spec separatorSpec) { + f.separator = spec +} + +// Get returns the flag’s value in the given Context. +func (f *Int64SliceFlag) Get(ctx *Context) []int64 { + return ctx.Int64Slice(f.Name) +} + +// RunAction executes flag action if set +func (f *Int64SliceFlag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.Int64Slice(f.Name)) } return nil @@ -144,14 +197,17 @@ func (f *Int64SliceFlag) Apply(set *flag.FlagSet) error { // Int64Slice looks up the value of a local Int64SliceFlag, returns // nil if not found -func (c *Context) Int64Slice(name string) []int64 { - return lookupInt64Slice(name, c.flagSet) +func (cCtx *Context) Int64Slice(name string) []int64 { + if fs := cCtx.lookupFlagSet(name); fs != nil { + return lookupInt64Slice(name, fs) + } + return nil } func lookupInt64Slice(name string, set *flag.FlagSet) []int64 { f := set.Lookup(name) if f != nil { - if slice, ok := f.Value.(*Int64Slice); ok { + if slice, ok := unwrapFlagValue(f.Value).(*Int64Slice); ok { return slice.Value() } } diff --git a/vendor/github.com/urfave/cli/v2/flag_int_slice.go b/vendor/github.com/urfave/cli/v2/flag_int_slice.go index 4e0afc021..da9c09bc7 100644 --- a/vendor/github.com/urfave/cli/v2/flag_int_slice.go +++ b/vendor/github.com/urfave/cli/v2/flag_int_slice.go @@ -11,6 +11,7 @@ import ( // IntSlice wraps []int to satisfy flag.Value type IntSlice struct { slice []int + separator separatorSpec hasBeenSet bool } @@ -19,6 +20,16 @@ func NewIntSlice(defaults ...int) *IntSlice { return &IntSlice{slice: append([]int{}, defaults...)} } +// clone allocate a copy of self object +func (i *IntSlice) clone() *IntSlice { + n := &IntSlice{ + slice: make([]int, len(i.slice)), + hasBeenSet: i.hasBeenSet, + } + copy(n.slice, i.slice) + return n +} + // TODO: Consistently have specific Set function for Int64 and Float64 ? // SetInt directly adds an integer to the list of values func (i *IntSlice) SetInt(value int) { @@ -30,6 +41,10 @@ func (i *IntSlice) SetInt(value int) { i.slice = append(i.slice, value) } +func (i *IntSlice) WithSeparatorSpec(spec separatorSpec) { + i.separator = spec +} + // Set parses the value into an integer and appends it to the list of values func (i *IntSlice) Set(value string) error { if !i.hasBeenSet { @@ -44,19 +59,26 @@ func (i *IntSlice) Set(value string) error { return nil } - tmp, err := strconv.ParseInt(value, 0, 64) - if err != nil { - return err - } + for _, s := range i.separator.flagSplitMultiValues(value) { + tmp, err := strconv.ParseInt(strings.TrimSpace(s), 0, 64) + if err != nil { + return err + } - i.slice = append(i.slice, int(tmp)) + i.slice = append(i.slice, int(tmp)) + } return nil } // String returns a readable representation of this value (for usage defaults) func (i *IntSlice) String() string { - return fmt.Sprintf("%#v", i.slice) + v := i.slice + if v == nil { + // treat nil the same as zero length non-nil + v = make([]int, 0) + } + return fmt.Sprintf("%#v", v) } // Serialize allows IntSlice to fulfill Serializer @@ -75,79 +97,110 @@ func (i *IntSlice) Get() interface{} { return *i } -// IntSliceFlag is a flag with type *IntSlice -type IntSliceFlag struct { - Name string - Aliases []string - Usage string - EnvVars []string - FilePath string - Required bool - Hidden bool - Value *IntSlice - DefaultText string - HasBeenSet bool -} - -// IsSet returns whether or not the flag has been set through env or file -func (f *IntSliceFlag) IsSet() bool { - return f.HasBeenSet -} - // String returns a readable representation of this value // (for usage defaults) func (f *IntSliceFlag) String() string { return FlagStringer(f) } -// Names returns the names of the flag -func (f *IntSliceFlag) Names() []string { - return flagNames(f.Name, f.Aliases) -} - -// IsRequired returns whether or not the flag is required -func (f *IntSliceFlag) IsRequired() bool { - return f.Required -} - // TakesValue returns true of the flag takes a value, otherwise false func (f *IntSliceFlag) TakesValue() bool { return true } // GetUsage returns the usage string for the flag -func (f IntSliceFlag) GetUsage() string { +func (f *IntSliceFlag) GetUsage() string { return f.Usage } +// GetCategory returns the category for the flag +func (f *IntSliceFlag) GetCategory() string { + return f.Category +} + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *IntSliceFlag) GetValue() string { - if f.Value != nil { - return f.Value.String() + var defaultVals []string + if f.Value != nil && len(f.Value.Value()) > 0 { + for _, i := range f.Value.Value() { + defaultVals = append(defaultVals, strconv.Itoa(i)) + } } - return "" + return strings.Join(defaultVals, ", ") +} + +// GetDefaultText returns the default text for this flag +func (f *IntSliceFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + +// GetEnvVars returns the env vars for this flag +func (f *IntSliceFlag) GetEnvVars() []string { + return f.EnvVars +} + +// IsSliceFlag implements DocGenerationSliceFlag. +func (f *IntSliceFlag) IsSliceFlag() bool { + return true } // Apply populates the flag given the flag set and environment func (f *IntSliceFlag) Apply(set *flag.FlagSet) error { - if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok { - f.Value = &IntSlice{} + // apply any default + if f.Destination != nil && f.Value != nil { + f.Destination.slice = make([]int, len(f.Value.slice)) + copy(f.Destination.slice, f.Value.slice) + } + + // resolve setValue (what we will assign to the set) + var setValue *IntSlice + switch { + case f.Destination != nil: + setValue = f.Destination + case f.Value != nil: + setValue = f.Value.clone() + default: + setValue = new(IntSlice) + setValue.WithSeparatorSpec(f.separator) + } - for _, s := range strings.Split(val, ",") { - if err := f.Value.Set(strings.TrimSpace(s)); err != nil { - return fmt.Errorf("could not parse %q as int slice value for flag %s: %s", val, f.Name, err) + if val, source, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok && val != "" { + for _, s := range f.separator.flagSplitMultiValues(val) { + if err := setValue.Set(strings.TrimSpace(s)); err != nil { + return fmt.Errorf("could not parse %q as int slice value from %s for flag %s: %s", val, source, f.Name, err) } } + // Set this to false so that we reset the slice if we then set values from + // flags that have already been set by the environment. + setValue.hasBeenSet = false f.HasBeenSet = true } for _, name := range f.Names() { - if f.Value == nil { - f.Value = &IntSlice{} - } - set.Var(f.Value, name, f.Usage) + set.Var(setValue, name, f.Usage) + } + + return nil +} + +func (f *IntSliceFlag) WithSeparatorSpec(spec separatorSpec) { + f.separator = spec +} + +// Get returns the flag’s value in the given Context. +func (f *IntSliceFlag) Get(ctx *Context) []int { + return ctx.IntSlice(f.Name) +} + +// RunAction executes flag action if set +func (f *IntSliceFlag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.IntSlice(f.Name)) } return nil @@ -155,9 +208,9 @@ func (f *IntSliceFlag) Apply(set *flag.FlagSet) error { // IntSlice looks up the value of a local IntSliceFlag, returns // nil if not found -func (c *Context) IntSlice(name string) []int { - if fs := lookupFlagSet(name, c); fs != nil { - return lookupIntSlice(name, c.flagSet) +func (cCtx *Context) IntSlice(name string) []int { + if fs := cCtx.lookupFlagSet(name); fs != nil { + return lookupIntSlice(name, fs) } return nil } @@ -165,7 +218,7 @@ func (c *Context) IntSlice(name string) []int { func lookupIntSlice(name string, set *flag.FlagSet) []int { f := set.Lookup(name) if f != nil { - if slice, ok := f.Value.(*IntSlice); ok { + if slice, ok := unwrapFlagValue(f.Value).(*IntSlice); ok { return slice.Value() } } diff --git a/vendor/github.com/urfave/cli/v2/flag_path.go b/vendor/github.com/urfave/cli/v2/flag_path.go index 8070dc4b0..76cb35248 100644 --- a/vendor/github.com/urfave/cli/v2/flag_path.go +++ b/vendor/github.com/urfave/cli/v2/flag_path.go @@ -1,42 +1,11 @@ package cli -import "flag" - -type PathFlag struct { - Name string - Aliases []string - Usage string - EnvVars []string - FilePath string - Required bool - Hidden bool - TakesFile bool - Value string - DefaultText string - Destination *string - HasBeenSet bool -} - -// IsSet returns whether or not the flag has been set through env or file -func (f *PathFlag) IsSet() bool { - return f.HasBeenSet -} +import ( + "flag" + "fmt" +) -// String returns a readable representation of this value -// (for usage defaults) -func (f *PathFlag) String() string { - return FlagStringer(f) -} - -// Names returns the names of the flag -func (f *PathFlag) Names() []string { - return flagNames(f.Name, f.Aliases) -} - -// IsRequired returns whether or not the flag is required -func (f *PathFlag) IsRequired() bool { - return f.Required -} +type Path = string // TakesValue returns true of the flag takes a value, otherwise false func (f *PathFlag) TakesValue() bool { @@ -48,15 +17,44 @@ func (f *PathFlag) GetUsage() string { return f.Usage } +// GetCategory returns the category for the flag +func (f *PathFlag) GetCategory() string { + return f.Category +} + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *PathFlag) GetValue() string { return f.Value } +// GetDefaultText returns the default text for this flag +func (f *PathFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + val := f.Value + if f.defaultValueSet { + val = f.defaultValue + } + if val == "" { + return val + } + return fmt.Sprintf("%q", val) +} + +// GetEnvVars returns the env vars for this flag +func (f *PathFlag) GetEnvVars() []string { + return f.EnvVars +} + // Apply populates the flag given the flag set and environment func (f *PathFlag) Apply(set *flag.FlagSet) error { - if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok { + // set default value so that environment wont be able to overwrite it + f.defaultValue = f.Value + f.defaultValueSet = true + + if val, _, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { f.Value = val f.HasBeenSet = true } @@ -72,10 +70,24 @@ func (f *PathFlag) Apply(set *flag.FlagSet) error { return nil } +// Get returns the flag’s value in the given Context. +func (f *PathFlag) Get(ctx *Context) string { + return ctx.Path(f.Name) +} + +// RunAction executes flag action if set +func (f *PathFlag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.Path(f.Name)) + } + + return nil +} + // Path looks up the value of a local PathFlag, returns // "" if not found -func (c *Context) Path(name string) string { - if fs := lookupFlagSet(name, c); fs != nil { +func (cCtx *Context) Path(name string) string { + if fs := cCtx.lookupFlagSet(name); fs != nil { return lookupPath(name, fs) } @@ -83,13 +95,8 @@ func (c *Context) Path(name string) string { } func lookupPath(name string, set *flag.FlagSet) string { - f := set.Lookup(name) - if f != nil { - parsed, err := f.Value.String(), error(nil) - if err != nil { - return "" - } - return parsed + if f := set.Lookup(name); f != nil { + return f.Value.String() } return "" } diff --git a/vendor/github.com/urfave/cli/v2/flag_string.go b/vendor/github.com/urfave/cli/v2/flag_string.go index 400bb532e..0f73e0621 100644 --- a/vendor/github.com/urfave/cli/v2/flag_string.go +++ b/vendor/github.com/urfave/cli/v2/flag_string.go @@ -1,43 +1,9 @@ package cli -import "flag" - -// StringFlag is a flag with type string -type StringFlag struct { - Name string - Aliases []string - Usage string - EnvVars []string - FilePath string - Required bool - Hidden bool - TakesFile bool - Value string - DefaultText string - Destination *string - HasBeenSet bool -} - -// IsSet returns whether or not the flag has been set through env or file -func (f *StringFlag) IsSet() bool { - return f.HasBeenSet -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f *StringFlag) String() string { - return FlagStringer(f) -} - -// Names returns the names of the flag -func (f *StringFlag) Names() []string { - return flagNames(f.Name, f.Aliases) -} - -// IsRequired returns whether or not the flag is required -func (f *StringFlag) IsRequired() bool { - return f.Required -} +import ( + "flag" + "fmt" +) // TakesValue returns true of the flag takes a value, otherwise false func (f *StringFlag) TakesValue() bool { @@ -49,15 +15,45 @@ func (f *StringFlag) GetUsage() string { return f.Usage } +// GetCategory returns the category for the flag +func (f *StringFlag) GetCategory() string { + return f.Category +} + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *StringFlag) GetValue() string { return f.Value } +// GetDefaultText returns the default text for this flag +func (f *StringFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + val := f.Value + if f.defaultValueSet { + val = f.defaultValue + } + + if val == "" { + return val + } + return fmt.Sprintf("%q", val) +} + +// GetEnvVars returns the env vars for this flag +func (f *StringFlag) GetEnvVars() []string { + return f.EnvVars +} + // Apply populates the flag given the flag set and environment func (f *StringFlag) Apply(set *flag.FlagSet) error { - if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok { + // set default value so that environment wont be able to overwrite it + f.defaultValue = f.Value + f.defaultValueSet = true + + if val, _, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { f.Value = val f.HasBeenSet = true } @@ -73,23 +69,32 @@ func (f *StringFlag) Apply(set *flag.FlagSet) error { return nil } +// Get returns the flag’s value in the given Context. +func (f *StringFlag) Get(ctx *Context) string { + return ctx.String(f.Name) +} + +// RunAction executes flag action if set +func (f *StringFlag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.String(f.Name)) + } + + return nil +} + // String looks up the value of a local StringFlag, returns // "" if not found -func (c *Context) String(name string) string { - if fs := lookupFlagSet(name, c); fs != nil { +func (cCtx *Context) String(name string) string { + if fs := cCtx.lookupFlagSet(name); fs != nil { return lookupString(name, fs) } return "" } func lookupString(name string, set *flag.FlagSet) string { - f := set.Lookup(name) - if f != nil { - parsed, err := f.Value.String(), error(nil) - if err != nil { - return "" - } - return parsed + if f := set.Lookup(name); f != nil { + return f.Value.String() } return "" } diff --git a/vendor/github.com/urfave/cli/v2/flag_string_slice.go b/vendor/github.com/urfave/cli/v2/flag_string_slice.go index ac363bf60..28f4798f5 100644 --- a/vendor/github.com/urfave/cli/v2/flag_string_slice.go +++ b/vendor/github.com/urfave/cli/v2/flag_string_slice.go @@ -4,13 +4,16 @@ import ( "encoding/json" "flag" "fmt" + "strconv" "strings" ) // StringSlice wraps a []string to satisfy flag.Value type StringSlice struct { slice []string + separator separatorSpec hasBeenSet bool + keepSpace bool } // NewStringSlice creates a *StringSlice with default values @@ -18,6 +21,16 @@ func NewStringSlice(defaults ...string) *StringSlice { return &StringSlice{slice: append([]string{}, defaults...)} } +// clone allocate a copy of self object +func (s *StringSlice) clone() *StringSlice { + n := &StringSlice{ + slice: make([]string, len(s.slice)), + hasBeenSet: s.hasBeenSet, + } + copy(n.slice, s.slice) + return n +} + // Set appends the string value to the list of values func (s *StringSlice) Set(value string) error { if !s.hasBeenSet { @@ -32,11 +45,20 @@ func (s *StringSlice) Set(value string) error { return nil } - s.slice = append(s.slice, value) + for _, t := range s.separator.flagSplitMultiValues(value) { + if !s.keepSpace { + t = strings.TrimSpace(t) + } + s.slice = append(s.slice, t) + } return nil } +func (s *StringSlice) WithSeparatorSpec(spec separatorSpec) { + s.separator = spec +} + // String returns a readable representation of this value (for usage defaults) func (s *StringSlice) String() string { return fmt.Sprintf("%s", s.slice) @@ -58,43 +80,12 @@ func (s *StringSlice) Get() interface{} { return *s } -// StringSliceFlag is a flag with type *StringSlice -type StringSliceFlag struct { - Name string - Aliases []string - Usage string - EnvVars []string - FilePath string - Required bool - Hidden bool - TakesFile bool - Value *StringSlice - DefaultText string - HasBeenSet bool - Destination *StringSlice -} - -// IsSet returns whether or not the flag has been set through env or file -func (f *StringSliceFlag) IsSet() bool { - return f.HasBeenSet -} - // String returns a readable representation of this value // (for usage defaults) func (f *StringSliceFlag) String() string { return FlagStringer(f) } -// Names returns the names of the flag -func (f *StringSliceFlag) Names() []string { - return flagNames(f.Name, f.Aliases) -} - -// IsRequired returns whether or not the flag is required -func (f *StringSliceFlag) IsRequired() bool { - return f.Required -} - // TakesValue returns true of the flag takes a value, otherwise false func (f *StringSliceFlag) TakesValue() bool { return true @@ -105,47 +96,101 @@ func (f *StringSliceFlag) GetUsage() string { return f.Usage } +// GetCategory returns the category for the flag +func (f *StringSliceFlag) GetCategory() string { + return f.Category +} + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *StringSliceFlag) GetValue() string { - if f.Value != nil { - return f.Value.String() + var defaultVals []string + if f.Value != nil && len(f.Value.Value()) > 0 { + for _, s := range f.Value.Value() { + if len(s) > 0 { + defaultVals = append(defaultVals, strconv.Quote(s)) + } + } + } + return strings.Join(defaultVals, ", ") +} + +// GetDefaultText returns the default text for this flag +func (f *StringSliceFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText } - return "" + return f.GetValue() +} + +// GetEnvVars returns the env vars for this flag +func (f *StringSliceFlag) GetEnvVars() []string { + return f.EnvVars +} + +// IsSliceFlag implements DocGenerationSliceFlag. +func (f *StringSliceFlag) IsSliceFlag() bool { + return true } // Apply populates the flag given the flag set and environment func (f *StringSliceFlag) Apply(set *flag.FlagSet) error { - if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok { - f.Value = &StringSlice{} - destination := f.Value - if f.Destination != nil { - destination = f.Destination - } + // apply any default + if f.Destination != nil && f.Value != nil { + f.Destination.slice = make([]string, len(f.Value.slice)) + copy(f.Destination.slice, f.Value.slice) + } + + // resolve setValue (what we will assign to the set) + var setValue *StringSlice + switch { + case f.Destination != nil: + setValue = f.Destination + case f.Value != nil: + setValue = f.Value.clone() + default: + setValue = new(StringSlice) + setValue.WithSeparatorSpec(f.separator) + } + + setValue.keepSpace = f.KeepSpace - for _, s := range strings.Split(val, ",") { - if err := destination.Set(strings.TrimSpace(s)); err != nil { - return fmt.Errorf("could not parse %q as string value for flag %s: %s", val, f.Name, err) + if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { + for _, s := range f.separator.flagSplitMultiValues(val) { + if !f.KeepSpace { + s = strings.TrimSpace(s) + } + if err := setValue.Set(s); err != nil { + return fmt.Errorf("could not parse %q as string value from %s for flag %s: %s", val, source, f.Name, err) } } // Set this to false so that we reset the slice if we then set values from // flags that have already been set by the environment. - destination.hasBeenSet = false + setValue.hasBeenSet = false f.HasBeenSet = true } for _, name := range f.Names() { - if f.Value == nil { - f.Value = &StringSlice{} - } + set.Var(setValue, name, f.Usage) + } - if f.Destination != nil { - set.Var(f.Destination, name, f.Usage) - continue - } + return nil +} + +func (f *StringSliceFlag) WithSeparatorSpec(spec separatorSpec) { + f.separator = spec +} + +// Get returns the flag’s value in the given Context. +func (f *StringSliceFlag) Get(ctx *Context) []string { + return ctx.StringSlice(f.Name) +} - set.Var(f.Value, name, f.Usage) +// RunAction executes flag action if set +func (f *StringSliceFlag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.StringSlice(f.Name)) } return nil @@ -153,8 +198,8 @@ func (f *StringSliceFlag) Apply(set *flag.FlagSet) error { // StringSlice looks up the value of a local StringSliceFlag, returns // nil if not found -func (c *Context) StringSlice(name string) []string { - if fs := lookupFlagSet(name, c); fs != nil { +func (cCtx *Context) StringSlice(name string) []string { + if fs := cCtx.lookupFlagSet(name); fs != nil { return lookupStringSlice(name, fs) } return nil @@ -163,7 +208,7 @@ func (c *Context) StringSlice(name string) []string { func lookupStringSlice(name string, set *flag.FlagSet) []string { f := set.Lookup(name) if f != nil { - if slice, ok := f.Value.(*StringSlice); ok { + if slice, ok := unwrapFlagValue(f.Value).(*StringSlice); ok { return slice.Value() } } diff --git a/vendor/github.com/urfave/cli/v2/flag_timestamp.go b/vendor/github.com/urfave/cli/v2/flag_timestamp.go index 9fac1d1e2..b90123087 100644 --- a/vendor/github.com/urfave/cli/v2/flag_timestamp.go +++ b/vendor/github.com/urfave/cli/v2/flag_timestamp.go @@ -11,6 +11,7 @@ type Timestamp struct { timestamp *time.Time hasBeenSet bool layout string + location *time.Location } // Timestamp constructor @@ -31,9 +32,22 @@ func (t *Timestamp) SetLayout(layout string) { t.layout = layout } +// Set perceived timezone of the to-be parsed time string +func (t *Timestamp) SetLocation(loc *time.Location) { + t.location = loc +} + // Parses the string value to timestamp func (t *Timestamp) Set(value string) error { - timestamp, err := time.Parse(t.layout, value) + var timestamp time.Time + var err error + + if t.location != nil { + timestamp, err = time.ParseInLocation(t.layout, value, t.location) + } else { + timestamp, err = time.Parse(t.layout, value) + } + if err != nil { return err } @@ -58,40 +72,23 @@ func (t *Timestamp) Get() interface{} { return *t } -// TimestampFlag is a flag with type time -type TimestampFlag struct { - Name string - Aliases []string - Usage string - EnvVars []string - FilePath string - Required bool - Hidden bool - Layout string - Value *Timestamp - DefaultText string - HasBeenSet bool -} - -// IsSet returns whether or not the flag has been set through env or file -func (f *TimestampFlag) IsSet() bool { - return f.HasBeenSet -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f *TimestampFlag) String() string { - return FlagStringer(f) -} - -// Names returns the names of the flag -func (f *TimestampFlag) Names() []string { - return flagNames(f.Name, f.Aliases) -} - -// IsRequired returns whether or not the flag is required -func (f *TimestampFlag) IsRequired() bool { - return f.Required +// clone timestamp +func (t *Timestamp) clone() *Timestamp { + tc := &Timestamp{ + timestamp: nil, + hasBeenSet: t.hasBeenSet, + layout: t.layout, + location: nil, + } + if t.timestamp != nil { + tts := *t.timestamp + tc.timestamp = &tts + } + if t.location != nil { + loc := *t.location + tc.location = &loc + } + return tc } // TakesValue returns true of the flag takes a value, otherwise false @@ -104,39 +101,95 @@ func (f *TimestampFlag) GetUsage() string { return f.Usage } +// GetCategory returns the category for the flag +func (f *TimestampFlag) GetCategory() string { + return f.Category +} + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *TimestampFlag) GetValue() string { - if f.Value != nil { + if f.Value != nil && f.Value.timestamp != nil { return f.Value.timestamp.String() } return "" } +// GetDefaultText returns the default text for this flag +func (f *TimestampFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + val := f.Value + if f.defaultValueSet { + val = f.defaultValue + } + + if val != nil && val.timestamp != nil { + return val.timestamp.String() + } + + return "" +} + +// GetEnvVars returns the env vars for this flag +func (f *TimestampFlag) GetEnvVars() []string { + return f.EnvVars +} + // Apply populates the flag given the flag set and environment func (f *TimestampFlag) Apply(set *flag.FlagSet) error { if f.Layout == "" { return fmt.Errorf("timestamp Layout is required") } - f.Value = &Timestamp{} + if f.Value == nil { + f.Value = &Timestamp{} + } f.Value.SetLayout(f.Layout) + f.Value.SetLocation(f.Timezone) - if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok { + f.defaultValue = f.Value.clone() + f.defaultValueSet = true + + if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { if err := f.Value.Set(val); err != nil { - return fmt.Errorf("could not parse %q as timestamp value for flag %s: %s", val, f.Name, err) + return fmt.Errorf("could not parse %q as timestamp value from %s for flag %s: %s", val, source, f.Name, err) } f.HasBeenSet = true } + if f.Destination != nil { + *f.Destination = *f.Value + } + for _, name := range f.Names() { + if f.Destination != nil { + set.Var(f.Destination, name, f.Usage) + continue + } + set.Var(f.Value, name, f.Usage) } return nil } +// Get returns the flag’s value in the given Context. +func (f *TimestampFlag) Get(ctx *Context) *time.Time { + return ctx.Timestamp(f.Name) +} + +// RunAction executes flag action if set +func (f *TimestampFlag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.Timestamp(f.Name)) + } + + return nil +} + // Timestamp gets the timestamp from a flag name -func (c *Context) Timestamp(name string) *time.Time { - if fs := lookupFlagSet(name, c); fs != nil { +func (cCtx *Context) Timestamp(name string) *time.Time { + if fs := cCtx.lookupFlagSet(name); fs != nil { return lookupTimestamp(name, fs) } return nil diff --git a/vendor/github.com/urfave/cli/v2/flag_uint.go b/vendor/github.com/urfave/cli/v2/flag_uint.go index 2e5e76b0e..8d5b85458 100644 --- a/vendor/github.com/urfave/cli/v2/flag_uint.go +++ b/vendor/github.com/urfave/cli/v2/flag_uint.go @@ -6,42 +6,6 @@ import ( "strconv" ) -// UintFlag is a flag with type uint -type UintFlag struct { - Name string - Aliases []string - Usage string - EnvVars []string - FilePath string - Required bool - Hidden bool - Value uint - DefaultText string - Destination *uint - HasBeenSet bool -} - -// IsSet returns whether or not the flag has been set through env or file -func (f *UintFlag) IsSet() bool { - return f.HasBeenSet -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f *UintFlag) String() string { - return FlagStringer(f) -} - -// Names returns the names of the flag -func (f *UintFlag) Names() []string { - return flagNames(f.Name, f.Aliases) -} - -// IsRequired returns whether or not the flag is required -func (f *UintFlag) IsRequired() bool { - return f.Required -} - // TakesValue returns true of the flag takes a value, otherwise false func (f *UintFlag) TakesValue() bool { return true @@ -52,13 +16,22 @@ func (f *UintFlag) GetUsage() string { return f.Usage } +// GetCategory returns the category for the flag +func (f *UintFlag) GetCategory() string { + return f.Category +} + // Apply populates the flag given the flag set and environment func (f *UintFlag) Apply(set *flag.FlagSet) error { - if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok { + // set default value so that environment wont be able to overwrite it + f.defaultValue = f.Value + f.defaultValueSet = true + + if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { if val != "" { - valInt, err := strconv.ParseUint(val, 0, 64) + valInt, err := strconv.ParseUint(val, f.Base, 64) if err != nil { - return fmt.Errorf("could not parse %q as uint value for flag %s: %s", val, f.Name, err) + return fmt.Errorf("could not parse %q as uint value from %s for flag %s: %s", val, source, f.Name, err) } f.Value = uint(valInt) @@ -77,16 +50,46 @@ func (f *UintFlag) Apply(set *flag.FlagSet) error { return nil } +// RunAction executes flag action if set +func (f *UintFlag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.Uint(f.Name)) + } + + return nil +} + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *UintFlag) GetValue() string { return fmt.Sprintf("%d", f.Value) } +// GetDefaultText returns the default text for this flag +func (f *UintFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + if f.defaultValueSet { + return fmt.Sprintf("%d", f.defaultValue) + } + return fmt.Sprintf("%d", f.Value) +} + +// GetEnvVars returns the env vars for this flag +func (f *UintFlag) GetEnvVars() []string { + return f.EnvVars +} + +// Get returns the flag’s value in the given Context. +func (f *UintFlag) Get(ctx *Context) uint { + return ctx.Uint(f.Name) +} + // Uint looks up the value of a local UintFlag, returns // 0 if not found -func (c *Context) Uint(name string) uint { - if fs := lookupFlagSet(name, c); fs != nil { +func (cCtx *Context) Uint(name string) uint { + if fs := cCtx.lookupFlagSet(name); fs != nil { return lookupUint(name, fs) } return 0 diff --git a/vendor/github.com/urfave/cli/v2/flag_uint64.go b/vendor/github.com/urfave/cli/v2/flag_uint64.go index 8fc3289d8..c356e533b 100644 --- a/vendor/github.com/urfave/cli/v2/flag_uint64.go +++ b/vendor/github.com/urfave/cli/v2/flag_uint64.go @@ -6,42 +6,6 @@ import ( "strconv" ) -// Uint64Flag is a flag with type uint64 -type Uint64Flag struct { - Name string - Aliases []string - Usage string - EnvVars []string - FilePath string - Required bool - Hidden bool - Value uint64 - DefaultText string - Destination *uint64 - HasBeenSet bool -} - -// IsSet returns whether or not the flag has been set through env or file -func (f *Uint64Flag) IsSet() bool { - return f.HasBeenSet -} - -// String returns a readable representation of this value -// (for usage defaults) -func (f *Uint64Flag) String() string { - return FlagStringer(f) -} - -// Names returns the names of the flag -func (f *Uint64Flag) Names() []string { - return flagNames(f.Name, f.Aliases) -} - -// IsRequired returns whether or not the flag is required -func (f *Uint64Flag) IsRequired() bool { - return f.Required -} - // TakesValue returns true of the flag takes a value, otherwise false func (f *Uint64Flag) TakesValue() bool { return true @@ -52,13 +16,22 @@ func (f *Uint64Flag) GetUsage() string { return f.Usage } +// GetCategory returns the category for the flag +func (f *Uint64Flag) GetCategory() string { + return f.Category +} + // Apply populates the flag given the flag set and environment func (f *Uint64Flag) Apply(set *flag.FlagSet) error { - if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok { + // set default value so that environment wont be able to overwrite it + f.defaultValue = f.Value + f.defaultValueSet = true + + if val, source, found := flagFromEnvOrFile(f.EnvVars, f.FilePath); found { if val != "" { - valInt, err := strconv.ParseUint(val, 0, 64) + valInt, err := strconv.ParseUint(val, f.Base, 64) if err != nil { - return fmt.Errorf("could not parse %q as uint64 value for flag %s: %s", val, f.Name, err) + return fmt.Errorf("could not parse %q as uint64 value from %s for flag %s: %s", val, source, f.Name, err) } f.Value = valInt @@ -77,16 +50,46 @@ func (f *Uint64Flag) Apply(set *flag.FlagSet) error { return nil } +// RunAction executes flag action if set +func (f *Uint64Flag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.Uint64(f.Name)) + } + + return nil +} + // GetValue returns the flags value as string representation and an empty // string if the flag takes no value at all. func (f *Uint64Flag) GetValue() string { return fmt.Sprintf("%d", f.Value) } +// GetDefaultText returns the default text for this flag +func (f *Uint64Flag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + if f.defaultValueSet { + return fmt.Sprintf("%d", f.defaultValue) + } + return fmt.Sprintf("%d", f.Value) +} + +// GetEnvVars returns the env vars for this flag +func (f *Uint64Flag) GetEnvVars() []string { + return f.EnvVars +} + +// Get returns the flag’s value in the given Context. +func (f *Uint64Flag) Get(ctx *Context) uint64 { + return ctx.Uint64(f.Name) +} + // Uint64 looks up the value of a local Uint64Flag, returns // 0 if not found -func (c *Context) Uint64(name string) uint64 { - if fs := lookupFlagSet(name, c); fs != nil { +func (cCtx *Context) Uint64(name string) uint64 { + if fs := cCtx.lookupFlagSet(name); fs != nil { return lookupUint64(name, fs) } return 0 diff --git a/vendor/github.com/urfave/cli/v2/flag_uint64_slice.go b/vendor/github.com/urfave/cli/v2/flag_uint64_slice.go new file mode 100644 index 000000000..d34201868 --- /dev/null +++ b/vendor/github.com/urfave/cli/v2/flag_uint64_slice.go @@ -0,0 +1,219 @@ +package cli + +import ( + "encoding/json" + "flag" + "fmt" + "strconv" + "strings" +) + +// Uint64Slice wraps []int64 to satisfy flag.Value +type Uint64Slice struct { + slice []uint64 + separator separatorSpec + hasBeenSet bool +} + +// NewUint64Slice makes an *Uint64Slice with default values +func NewUint64Slice(defaults ...uint64) *Uint64Slice { + return &Uint64Slice{slice: append([]uint64{}, defaults...)} +} + +// clone allocate a copy of self object +func (i *Uint64Slice) clone() *Uint64Slice { + n := &Uint64Slice{ + slice: make([]uint64, len(i.slice)), + hasBeenSet: i.hasBeenSet, + } + copy(n.slice, i.slice) + return n +} + +// Set parses the value into an integer and appends it to the list of values +func (i *Uint64Slice) Set(value string) error { + if !i.hasBeenSet { + i.slice = []uint64{} + i.hasBeenSet = true + } + + if strings.HasPrefix(value, slPfx) { + // Deserializing assumes overwrite + _ = json.Unmarshal([]byte(strings.Replace(value, slPfx, "", 1)), &i.slice) + i.hasBeenSet = true + return nil + } + + for _, s := range i.separator.flagSplitMultiValues(value) { + tmp, err := strconv.ParseUint(strings.TrimSpace(s), 0, 64) + if err != nil { + return err + } + + i.slice = append(i.slice, tmp) + } + + return nil +} + +func (i *Uint64Slice) WithSeparatorSpec(spec separatorSpec) { + i.separator = spec +} + +// String returns a readable representation of this value (for usage defaults) +func (i *Uint64Slice) String() string { + v := i.slice + if v == nil { + // treat nil the same as zero length non-nil + v = make([]uint64, 0) + } + str := fmt.Sprintf("%d", v) + str = strings.Replace(str, " ", ", ", -1) + str = strings.Replace(str, "[", "{", -1) + str = strings.Replace(str, "]", "}", -1) + return fmt.Sprintf("[]uint64%s", str) +} + +// Serialize allows Uint64Slice to fulfill Serializer +func (i *Uint64Slice) Serialize() string { + jsonBytes, _ := json.Marshal(i.slice) + return fmt.Sprintf("%s%s", slPfx, string(jsonBytes)) +} + +// Value returns the slice of ints set by this flag +func (i *Uint64Slice) Value() []uint64 { + return i.slice +} + +// Get returns the slice of ints set by this flag +func (i *Uint64Slice) Get() interface{} { + return *i +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f *Uint64SliceFlag) String() string { + return FlagStringer(f) +} + +// TakesValue returns true of the flag takes a value, otherwise false +func (f *Uint64SliceFlag) TakesValue() bool { + return true +} + +// GetUsage returns the usage string for the flag +func (f *Uint64SliceFlag) GetUsage() string { + return f.Usage +} + +// GetCategory returns the category for the flag +func (f *Uint64SliceFlag) GetCategory() string { + return f.Category +} + +// GetValue returns the flags value as string representation and an empty +// string if the flag takes no value at all. +func (f *Uint64SliceFlag) GetValue() string { + var defaultVals []string + if f.Value != nil && len(f.Value.Value()) > 0 { + for _, i := range f.Value.Value() { + defaultVals = append(defaultVals, strconv.FormatUint(i, 10)) + } + } + return strings.Join(defaultVals, ", ") +} + +// GetDefaultText returns the default text for this flag +func (f *Uint64SliceFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + +// GetEnvVars returns the env vars for this flag +func (f *Uint64SliceFlag) GetEnvVars() []string { + return f.EnvVars +} + +// IsSliceFlag implements DocGenerationSliceFlag. +func (f *Uint64SliceFlag) IsSliceFlag() bool { + return true +} + +// Apply populates the flag given the flag set and environment +func (f *Uint64SliceFlag) Apply(set *flag.FlagSet) error { + // apply any default + if f.Destination != nil && f.Value != nil { + f.Destination.slice = make([]uint64, len(f.Value.slice)) + copy(f.Destination.slice, f.Value.slice) + } + + // resolve setValue (what we will assign to the set) + var setValue *Uint64Slice + switch { + case f.Destination != nil: + setValue = f.Destination + case f.Value != nil: + setValue = f.Value.clone() + default: + setValue = new(Uint64Slice) + setValue.WithSeparatorSpec(f.separator) + } + + if val, source, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok && val != "" { + for _, s := range f.separator.flagSplitMultiValues(val) { + if err := setValue.Set(strings.TrimSpace(s)); err != nil { + return fmt.Errorf("could not parse %q as uint64 slice value from %s for flag %s: %s", val, source, f.Name, err) + } + } + + // Set this to false so that we reset the slice if we then set values from + // flags that have already been set by the environment. + setValue.hasBeenSet = false + f.HasBeenSet = true + } + + for _, name := range f.Names() { + set.Var(setValue, name, f.Usage) + } + + return nil +} + +func (f *Uint64SliceFlag) WithSeparatorSpec(spec separatorSpec) { + f.separator = spec +} + +// Get returns the flag’s value in the given Context. +func (f *Uint64SliceFlag) Get(ctx *Context) []uint64 { + return ctx.Uint64Slice(f.Name) +} + +// RunAction executes flag action if set +func (f *Uint64SliceFlag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.Uint64Slice(f.Name)) + } + + return nil +} + +// Uint64Slice looks up the value of a local Uint64SliceFlag, returns +// nil if not found +func (cCtx *Context) Uint64Slice(name string) []uint64 { + if fs := cCtx.lookupFlagSet(name); fs != nil { + return lookupUint64Slice(name, fs) + } + return nil +} + +func lookupUint64Slice(name string, set *flag.FlagSet) []uint64 { + f := set.Lookup(name) + if f != nil { + if slice, ok := unwrapFlagValue(f.Value).(*Uint64Slice); ok { + return slice.Value() + } + } + return nil +} diff --git a/vendor/github.com/urfave/cli/v2/flag_uint_slice.go b/vendor/github.com/urfave/cli/v2/flag_uint_slice.go new file mode 100644 index 000000000..4dc13e126 --- /dev/null +++ b/vendor/github.com/urfave/cli/v2/flag_uint_slice.go @@ -0,0 +1,230 @@ +package cli + +import ( + "encoding/json" + "flag" + "fmt" + "strconv" + "strings" +) + +// UintSlice wraps []int to satisfy flag.Value +type UintSlice struct { + slice []uint + separator separatorSpec + hasBeenSet bool +} + +// NewUintSlice makes an *UintSlice with default values +func NewUintSlice(defaults ...uint) *UintSlice { + return &UintSlice{slice: append([]uint{}, defaults...)} +} + +// clone allocate a copy of self object +func (i *UintSlice) clone() *UintSlice { + n := &UintSlice{ + slice: make([]uint, len(i.slice)), + hasBeenSet: i.hasBeenSet, + } + copy(n.slice, i.slice) + return n +} + +// TODO: Consistently have specific Set function for Int64 and Float64 ? +// SetInt directly adds an integer to the list of values +func (i *UintSlice) SetUint(value uint) { + if !i.hasBeenSet { + i.slice = []uint{} + i.hasBeenSet = true + } + + i.slice = append(i.slice, value) +} + +// Set parses the value into an integer and appends it to the list of values +func (i *UintSlice) Set(value string) error { + if !i.hasBeenSet { + i.slice = []uint{} + i.hasBeenSet = true + } + + if strings.HasPrefix(value, slPfx) { + // Deserializing assumes overwrite + _ = json.Unmarshal([]byte(strings.Replace(value, slPfx, "", 1)), &i.slice) + i.hasBeenSet = true + return nil + } + + for _, s := range i.separator.flagSplitMultiValues(value) { + tmp, err := strconv.ParseUint(strings.TrimSpace(s), 0, 32) + if err != nil { + return err + } + + i.slice = append(i.slice, uint(tmp)) + } + + return nil +} + +func (i *UintSlice) WithSeparatorSpec(spec separatorSpec) { + i.separator = spec +} + +// String returns a readable representation of this value (for usage defaults) +func (i *UintSlice) String() string { + v := i.slice + if v == nil { + // treat nil the same as zero length non-nil + v = make([]uint, 0) + } + str := fmt.Sprintf("%d", v) + str = strings.Replace(str, " ", ", ", -1) + str = strings.Replace(str, "[", "{", -1) + str = strings.Replace(str, "]", "}", -1) + return fmt.Sprintf("[]uint%s", str) +} + +// Serialize allows UintSlice to fulfill Serializer +func (i *UintSlice) Serialize() string { + jsonBytes, _ := json.Marshal(i.slice) + return fmt.Sprintf("%s%s", slPfx, string(jsonBytes)) +} + +// Value returns the slice of ints set by this flag +func (i *UintSlice) Value() []uint { + return i.slice +} + +// Get returns the slice of ints set by this flag +func (i *UintSlice) Get() interface{} { + return *i +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f *UintSliceFlag) String() string { + return FlagStringer(f) +} + +// TakesValue returns true of the flag takes a value, otherwise false +func (f *UintSliceFlag) TakesValue() bool { + return true +} + +// GetUsage returns the usage string for the flag +func (f *UintSliceFlag) GetUsage() string { + return f.Usage +} + +// GetCategory returns the category for the flag +func (f *UintSliceFlag) GetCategory() string { + return f.Category +} + +// GetValue returns the flags value as string representation and an empty +// string if the flag takes no value at all. +func (f *UintSliceFlag) GetValue() string { + var defaultVals []string + if f.Value != nil && len(f.Value.Value()) > 0 { + for _, i := range f.Value.Value() { + defaultVals = append(defaultVals, strconv.FormatUint(uint64(i), 10)) + } + } + return strings.Join(defaultVals, ", ") +} + +// GetDefaultText returns the default text for this flag +func (f *UintSliceFlag) GetDefaultText() string { + if f.DefaultText != "" { + return f.DefaultText + } + return f.GetValue() +} + +// GetEnvVars returns the env vars for this flag +func (f *UintSliceFlag) GetEnvVars() []string { + return f.EnvVars +} + +// IsSliceFlag implements DocGenerationSliceFlag. +func (f *UintSliceFlag) IsSliceFlag() bool { + return true +} + +// Apply populates the flag given the flag set and environment +func (f *UintSliceFlag) Apply(set *flag.FlagSet) error { + // apply any default + if f.Destination != nil && f.Value != nil { + f.Destination.slice = make([]uint, len(f.Value.slice)) + copy(f.Destination.slice, f.Value.slice) + } + + // resolve setValue (what we will assign to the set) + var setValue *UintSlice + switch { + case f.Destination != nil: + setValue = f.Destination + case f.Value != nil: + setValue = f.Value.clone() + default: + setValue = new(UintSlice) + setValue.WithSeparatorSpec(f.separator) + } + + if val, source, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok && val != "" { + for _, s := range f.separator.flagSplitMultiValues(val) { + if err := setValue.Set(strings.TrimSpace(s)); err != nil { + return fmt.Errorf("could not parse %q as uint slice value from %s for flag %s: %s", val, source, f.Name, err) + } + } + + // Set this to false so that we reset the slice if we then set values from + // flags that have already been set by the environment. + setValue.hasBeenSet = false + f.HasBeenSet = true + } + + for _, name := range f.Names() { + set.Var(setValue, name, f.Usage) + } + + return nil +} + +func (f *UintSliceFlag) WithSeparatorSpec(spec separatorSpec) { + f.separator = spec +} + +// Get returns the flag’s value in the given Context. +func (f *UintSliceFlag) Get(ctx *Context) []uint { + return ctx.UintSlice(f.Name) +} + +// RunAction executes flag action if set +func (f *UintSliceFlag) RunAction(c *Context) error { + if f.Action != nil { + return f.Action(c, c.UintSlice(f.Name)) + } + + return nil +} + +// UintSlice looks up the value of a local UintSliceFlag, returns +// nil if not found +func (cCtx *Context) UintSlice(name string) []uint { + if fs := cCtx.lookupFlagSet(name); fs != nil { + return lookupUintSlice(name, fs) + } + return nil +} + +func lookupUintSlice(name string, set *flag.FlagSet) []uint { + f := set.Lookup(name) + if f != nil { + if slice, ok := unwrapFlagValue(f.Value).(*UintSlice); ok { + return slice.Value() + } + } + return nil +} diff --git a/vendor/github.com/urfave/cli/v2/funcs.go b/vendor/github.com/urfave/cli/v2/funcs.go index 474c48faf..e77b0d0a1 100644 --- a/vendor/github.com/urfave/cli/v2/funcs.go +++ b/vendor/github.com/urfave/cli/v2/funcs.go @@ -17,15 +17,18 @@ type ActionFunc func(*Context) error // CommandNotFoundFunc is executed if the proper command cannot be found type CommandNotFoundFunc func(*Context, string) -// OnUsageErrorFunc is executed if an usage error occurs. This is useful for displaying +// OnUsageErrorFunc is executed if a usage error occurs. This is useful for displaying // customized usage error messages. This function is able to replace the // original error messages. If this function is not set, the "Incorrect usage" // is displayed and the execution is interrupted. -type OnUsageErrorFunc func(context *Context, err error, isSubcommand bool) error +type OnUsageErrorFunc func(cCtx *Context, err error, isSubcommand bool) error + +// InvalidFlagAccessFunc is executed when an invalid flag is accessed from the context. +type InvalidFlagAccessFunc func(*Context, string) // ExitErrHandlerFunc is executed if provided in order to handle exitError values // returned by Actions and Before/After functions. -type ExitErrHandlerFunc func(context *Context, err error) +type ExitErrHandlerFunc func(cCtx *Context, err error) // FlagStringFunc is used by the help generation to display a flag, which is // expected to be a single line. diff --git a/vendor/github.com/urfave/cli/v2/godoc-current.txt b/vendor/github.com/urfave/cli/v2/godoc-current.txt new file mode 100644 index 000000000..4b620feeb --- /dev/null +++ b/vendor/github.com/urfave/cli/v2/godoc-current.txt @@ -0,0 +1,2724 @@ +package cli // import "github.com/urfave/cli/v2" + +Package cli provides a minimal framework for creating and organizing command +line Go applications. cli is designed to be easy to understand and write, +the most simple cli application can be written as follows: + + func main() { + (&cli.App{}).Run(os.Args) + } + +Of course this application does not do much, so let's make this an actual +application: + + func main() { + app := &cli.App{ + Name: "greet", + Usage: "say a greeting", + Action: func(c *cli.Context) error { + fmt.Println("Greetings") + return nil + }, + } + + app.Run(os.Args) + } + +VARIABLES + +var ( + SuggestFlag SuggestFlagFunc = nil // initialized in suggestions.go unless built with urfave_cli_no_suggest + SuggestCommand SuggestCommandFunc = nil // initialized in suggestions.go unless built with urfave_cli_no_suggest + SuggestDidYouMeanTemplate string = suggestDidYouMeanTemplate +) +var AppHelpTemplate = `NAME: + {{template "helpNameTemplate" .}} + +USAGE: + {{if .UsageText}}{{wrap .UsageText 3}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}{{if .Args}}[arguments...]{{end}}{{end}}{{end}}{{if .Version}}{{if not .HideVersion}} + +VERSION: + {{.Version}}{{end}}{{end}}{{if .Description}} + +DESCRIPTION: + {{template "descriptionTemplate" .}}{{end}} +{{- if len .Authors}} + +AUTHOR{{template "authorsTemplate" .}}{{end}}{{if .VisibleCommands}} + +COMMANDS:{{template "visibleCommandCategoryTemplate" .}}{{end}}{{if .VisibleFlagCategories}} + +GLOBAL OPTIONS:{{template "visibleFlagCategoryTemplate" .}}{{else if .VisibleFlags}} + +GLOBAL OPTIONS:{{template "visibleFlagTemplate" .}}{{end}}{{if .Copyright}} + +COPYRIGHT: + {{template "copyrightTemplate" .}}{{end}} +` + AppHelpTemplate is the text template for the Default help topic. cli.go + uses text/template to render templates. You can render custom help text by + setting this variable. + +var CommandHelpTemplate = `NAME: + {{template "helpNameTemplate" .}} + +USAGE: + {{template "usageTemplate" .}}{{if .Category}} + +CATEGORY: + {{.Category}}{{end}}{{if .Description}} + +DESCRIPTION: + {{template "descriptionTemplate" .}}{{end}}{{if .VisibleFlagCategories}} + +OPTIONS:{{template "visibleFlagCategoryTemplate" .}}{{else if .VisibleFlags}} + +OPTIONS:{{template "visibleFlagTemplate" .}}{{end}} +` + CommandHelpTemplate is the text template for the command help topic. cli.go + uses text/template to render templates. You can render custom help text by + setting this variable. + +var ErrWriter io.Writer = os.Stderr + ErrWriter is used to write errors to the user. This can be anything + implementing the io.Writer interface and defaults to os.Stderr. + +var FishCompletionTemplate = `# {{ .App.Name }} fish shell completion + +function __fish_{{ .App.Name }}_no_subcommand --description 'Test if there has been any subcommand yet' + for i in (commandline -opc) + if contains -- $i{{ range $v := .AllCommands }} {{ $v }}{{ end }} + return 1 + end + end + return 0 +end + +{{ range $v := .Completions }}{{ $v }} +{{ end }}` +var MarkdownDocTemplate = `{{if gt .SectionNum 0}}% {{ .App.Name }} {{ .SectionNum }} + +{{end}}# NAME + +{{ .App.Name }}{{ if .App.Usage }} - {{ .App.Usage }}{{ end }} + +# SYNOPSIS + +{{ .App.Name }} +{{ if .SynopsisArgs }} +` + "```" + ` +{{ range $v := .SynopsisArgs }}{{ $v }}{{ end }}` + "```" + ` +{{ end }}{{ if .App.Description }} +# DESCRIPTION + +{{ .App.Description }} +{{ end }} +**Usage**: + +` + "```" + `{{ if .App.UsageText }} +{{ .App.UsageText }} +{{ else }} +{{ .App.Name }} [GLOBAL OPTIONS] command [COMMAND OPTIONS] [ARGUMENTS...] +{{ end }}` + "```" + ` +{{ if .GlobalArgs }} +# GLOBAL OPTIONS +{{ range $v := .GlobalArgs }} +{{ $v }}{{ end }} +{{ end }}{{ if .Commands }} +# COMMANDS +{{ range $v := .Commands }} +{{ $v }}{{ end }}{{ end }}` +var OsExiter = os.Exit + OsExiter is the function used when the app exits. If not set defaults to + os.Exit. + +var SubcommandHelpTemplate = `NAME: + {{template "helpNameTemplate" .}} + +USAGE: + {{if .UsageText}}{{wrap .UsageText 3}}{{else}}{{.HelpName}} {{if .VisibleFlags}}command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}{{if .Args}}[arguments...]{{end}}{{end}}{{end}}{{if .Description}} + +DESCRIPTION: + {{template "descriptionTemplate" .}}{{end}}{{if .VisibleCommands}} + +COMMANDS:{{template "visibleCommandCategoryTemplate" .}}{{end}}{{if .VisibleFlagCategories}} + +OPTIONS:{{template "visibleFlagCategoryTemplate" .}}{{else if .VisibleFlags}} + +OPTIONS:{{template "visibleFlagTemplate" .}}{{end}} +` + SubcommandHelpTemplate is the text template for the subcommand help topic. + cli.go uses text/template to render templates. You can render custom help + text by setting this variable. + +var VersionPrinter = printVersion + VersionPrinter prints the version for the App + +var HelpPrinter helpPrinter = printHelp + HelpPrinter is a function that writes the help output. If not set + explicitly, this calls HelpPrinterCustom using only the default template + functions. + + If custom logic for printing help is required, this function can be + overridden. If the ExtraInfo field is defined on an App, this function + should not be modified, as HelpPrinterCustom will be used directly in order + to capture the extra information. + +var HelpPrinterCustom helpPrinterCustom = printHelpCustom + HelpPrinterCustom is a function that writes the help output. It is used as + the default implementation of HelpPrinter, and may be called directly if the + ExtraInfo field is set on an App. + + In the default implementation, if the customFuncs argument contains a + "wrapAt" key, which is a function which takes no arguments and returns an + int, this int value will be used to produce a "wrap" function used by the + default template to wrap long lines. + + +FUNCTIONS + +func DefaultAppComplete(cCtx *Context) + DefaultAppComplete prints the list of subcommands as the default app + completion method + +func DefaultCompleteWithFlags(cmd *Command) func(cCtx *Context) +func FlagNames(name string, aliases []string) []string +func HandleAction(action interface{}, cCtx *Context) (err error) + HandleAction attempts to figure out which Action signature was used. + If it's an ActionFunc or a func with the legacy signature for Action, + the func is run! + +func HandleExitCoder(err error) + HandleExitCoder handles errors implementing ExitCoder by printing their + message and calling OsExiter with the given exit code. + + If the given error instead implements MultiError, each error will be checked + for the ExitCoder interface, and OsExiter will be called with the last exit + code found, or exit code 1 if no ExitCoder is found. + + This function is the default error-handling behavior for an App. + +func ShowAppHelp(cCtx *Context) error + ShowAppHelp is an action that displays the help. + +func ShowAppHelpAndExit(c *Context, exitCode int) + ShowAppHelpAndExit - Prints the list of subcommands for the app and exits + with exit code. + +func ShowCommandCompletions(ctx *Context, command string) + ShowCommandCompletions prints the custom completions for a given command + +func ShowCommandHelp(ctx *Context, command string) error + ShowCommandHelp prints help for the given command + +func ShowCommandHelpAndExit(c *Context, command string, code int) + ShowCommandHelpAndExit - exits with code after showing help + +func ShowCompletions(cCtx *Context) + ShowCompletions prints the lists of commands within a given context + +func ShowSubcommandHelp(cCtx *Context) error + ShowSubcommandHelp prints help for the given subcommand + +func ShowSubcommandHelpAndExit(c *Context, exitCode int) + ShowSubcommandHelpAndExit - Prints help for the given subcommand and exits + with exit code. + +func ShowVersion(cCtx *Context) + ShowVersion prints the version number of the App + + +TYPES + +type ActionFunc func(*Context) error + ActionFunc is the action to execute when no subcommands are specified + +type ActionableFlag interface { + Flag + RunAction(*Context) error +} + ActionableFlag is an interface that wraps Flag interface and RunAction + operation. + +type AfterFunc func(*Context) error + AfterFunc is an action to execute after any subcommands are run, but after + the subcommand has finished it is run even if Action() panics + +type App struct { + // The name of the program. Defaults to path.Base(os.Args[0]) + Name string + // Full name of command for help, defaults to Name + HelpName string + // Description of the program. + Usage string + // Text to override the USAGE section of help + UsageText string + // Whether this command supports arguments + Args bool + // Description of the program argument format. + ArgsUsage string + // Version of the program + Version string + // Description of the program + Description string + // DefaultCommand is the (optional) name of a command + // to run if no command names are passed as CLI arguments. + DefaultCommand string + // List of commands to execute + Commands []*Command + // List of flags to parse + Flags []Flag + // Boolean to enable bash completion commands + EnableBashCompletion bool + // Boolean to hide built-in help command and help flag + HideHelp bool + // Boolean to hide built-in help command but keep help flag. + // Ignored if HideHelp is true. + HideHelpCommand bool + // Boolean to hide built-in version flag and the VERSION section of help + HideVersion bool + + // An action to execute when the shell completion flag is set + BashComplete BashCompleteFunc + // An action to execute before any subcommands are run, but after the context is ready + // If a non-nil error is returned, no subcommands are run + Before BeforeFunc + // An action to execute after any subcommands are run, but after the subcommand has finished + // It is run even if Action() panics + After AfterFunc + // The action to execute when no subcommands are specified + Action ActionFunc + // Execute this function if the proper command cannot be found + CommandNotFound CommandNotFoundFunc + // Execute this function if a usage error occurs + OnUsageError OnUsageErrorFunc + // Execute this function when an invalid flag is accessed from the context + InvalidFlagAccessHandler InvalidFlagAccessFunc + // Compilation date + Compiled time.Time + // List of all authors who contributed + Authors []*Author + // Copyright of the binary if any + Copyright string + // Reader reader to write input to (useful for tests) + Reader io.Reader + // Writer writer to write output to + Writer io.Writer + // ErrWriter writes error output + ErrWriter io.Writer + // ExitErrHandler processes any error encountered while running an App before + // it is returned to the caller. If no function is provided, HandleExitCoder + // is used as the default behavior. + ExitErrHandler ExitErrHandlerFunc + // Other custom info + Metadata map[string]interface{} + // Carries a function which returns app specific info. + ExtraInfo func() map[string]string + // CustomAppHelpTemplate the text template for app help topic. + // cli.go uses text/template to render templates. You can + // render custom help text by setting this variable. + CustomAppHelpTemplate string + // SliceFlagSeparator is used to customize the separator for SliceFlag, the default is "," + SliceFlagSeparator string + // DisableSliceFlagSeparator is used to disable SliceFlagSeparator, the default is false + DisableSliceFlagSeparator bool + // Boolean to enable short-option handling so user can combine several + // single-character bool arguments into one + // i.e. foobar -o -v -> foobar -ov + UseShortOptionHandling bool + // Enable suggestions for commands and flags + Suggest bool + // Allows global flags set by libraries which use flag.XXXVar(...) directly + // to be parsed through this library + AllowExtFlags bool + // Treat all flags as normal arguments if true + SkipFlagParsing bool + + // Has unexported fields. +} + App is the main structure of a cli application. It is recommended that an + app be created with the cli.NewApp() function + +func NewApp() *App + NewApp creates a new cli Application with some reasonable defaults for Name, + Usage, Version and Action. + +func (a *App) Command(name string) *Command + Command returns the named command on App. Returns nil if the command does + not exist + +func (a *App) Run(arguments []string) (err error) + Run is the entry point to the cli app. Parses the arguments slice and routes + to the proper flag/args combination + +func (a *App) RunAndExitOnError() + RunAndExitOnError calls .Run() and exits non-zero if an error was returned + + Deprecated: instead you should return an error that fulfills cli.ExitCoder + to cli.App.Run. This will cause the application to exit with the given error + code in the cli.ExitCoder + +func (a *App) RunAsSubcommand(ctx *Context) (err error) + RunAsSubcommand is for legacy/compatibility purposes only. New code should + only use App.RunContext. This function is slated to be removed in v3. + +func (a *App) RunContext(ctx context.Context, arguments []string) (err error) + RunContext is like Run except it takes a Context that will be passed to + its commands and sub-commands. Through this, you can propagate timeouts and + cancellation requests + +func (a *App) Setup() + Setup runs initialization code to ensure all data structures are ready + for `Run` or inspection prior to `Run`. It is internally called by `Run`, + but will return early if setup has already happened. + +func (a *App) ToFishCompletion() (string, error) + ToFishCompletion creates a fish completion string for the `*App` The + function errors if either parsing or writing of the string fails. + +func (a *App) ToMan() (string, error) + ToMan creates a man page string for the `*App` The function errors if either + parsing or writing of the string fails. + +func (a *App) ToManWithSection(sectionNumber int) (string, error) + ToMan creates a man page string with section number for the `*App` The + function errors if either parsing or writing of the string fails. + +func (a *App) ToMarkdown() (string, error) + ToMarkdown creates a markdown string for the `*App` The function errors if + either parsing or writing of the string fails. + +func (a *App) VisibleCategories() []CommandCategory + VisibleCategories returns a slice of categories and commands that are + Hidden=false + +func (a *App) VisibleCommands() []*Command + VisibleCommands returns a slice of the Commands with Hidden=false + +func (a *App) VisibleFlagCategories() []VisibleFlagCategory + VisibleFlagCategories returns a slice containing all the categories with the + flags they contain + +func (a *App) VisibleFlags() []Flag + VisibleFlags returns a slice of the Flags with Hidden=false + +type Args interface { + // Get returns the nth argument, or else a blank string + Get(n int) string + // First returns the first argument, or else a blank string + First() string + // Tail returns the rest of the arguments (not the first one) + // or else an empty string slice + Tail() []string + // Len returns the length of the wrapped slice + Len() int + // Present checks if there are any arguments present + Present() bool + // Slice returns a copy of the internal slice + Slice() []string +} + +type Author struct { + Name string // The Authors name + Email string // The Authors email +} + Author represents someone who has contributed to a cli project. + +func (a *Author) String() string + String makes Author comply to the Stringer interface, to allow an easy print + in the templating process + +type BashCompleteFunc func(*Context) + BashCompleteFunc is an action to execute when the shell completion flag is + set + +type BeforeFunc func(*Context) error + BeforeFunc is an action to execute before any subcommands are run, but after + the context is ready if a non-nil error is returned, no subcommands are run + +type BoolFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value bool + Destination *bool + + Aliases []string + EnvVars []string + + Count *int + + DisableDefaultText bool + + Action func(*Context, bool) error + // Has unexported fields. +} + BoolFlag is a flag with type bool + +func (f *BoolFlag) Apply(set *flag.FlagSet) error + Apply populates the flag given the flag set and environment + +func (f *BoolFlag) Get(ctx *Context) bool + Get returns the flag’s value in the given Context. + +func (f *BoolFlag) GetCategory() string + GetCategory returns the category for the flag + +func (f *BoolFlag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *BoolFlag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *BoolFlag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *BoolFlag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *BoolFlag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *BoolFlag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *BoolFlag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *BoolFlag) Names() []string + Names returns the names of the flag + +func (f *BoolFlag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *BoolFlag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *BoolFlag) TakesValue() bool + TakesValue returns true of the flag takes a value, otherwise false + +type CategorizableFlag interface { + VisibleFlag + + GetCategory() string +} + CategorizableFlag is an interface that allows us to potentially use a flag + in a categorized representation. + +type Command struct { + // The name of the command + Name string + // A list of aliases for the command + Aliases []string + // A short description of the usage of this command + Usage string + // Custom text to show on USAGE section of help + UsageText string + // A longer explanation of how the command works + Description string + // Whether this command supports arguments + Args bool + // A short description of the arguments of this command + ArgsUsage string + // The category the command is part of + Category string + // The function to call when checking for bash command completions + BashComplete BashCompleteFunc + // An action to execute before any sub-subcommands are run, but after the context is ready + // If a non-nil error is returned, no sub-subcommands are run + Before BeforeFunc + // An action to execute after any subcommands are run, but after the subcommand has finished + // It is run even if Action() panics + After AfterFunc + // The function to call when this command is invoked + Action ActionFunc + // Execute this function if a usage error occurs. + OnUsageError OnUsageErrorFunc + // List of child commands + Subcommands []*Command + // List of flags to parse + Flags []Flag + + // Treat all flags as normal arguments if true + SkipFlagParsing bool + // Boolean to hide built-in help command and help flag + HideHelp bool + // Boolean to hide built-in help command but keep help flag + // Ignored if HideHelp is true. + HideHelpCommand bool + // Boolean to hide this command from help or completion + Hidden bool + // Boolean to enable short-option handling so user can combine several + // single-character bool arguments into one + // i.e. foobar -o -v -> foobar -ov + UseShortOptionHandling bool + + // Full name of command for help, defaults to full command name, including parent commands. + HelpName string + + // CustomHelpTemplate the text template for the command help topic. + // cli.go uses text/template to render templates. You can + // render custom help text by setting this variable. + CustomHelpTemplate string + + // Has unexported fields. +} + Command is a subcommand for a cli.App. + +func (cmd *Command) Command(name string) *Command + +func (c *Command) FullName() string + FullName returns the full name of the command. For subcommands this ensures + that parent commands are part of the command path + +func (c *Command) HasName(name string) bool + HasName returns true if Command.Name matches given name + +func (c *Command) Names() []string + Names returns the names including short names and aliases. + +func (c *Command) Run(cCtx *Context, arguments ...string) (err error) + +func (c *Command) VisibleCategories() []CommandCategory + VisibleCategories returns a slice of categories and commands that are + Hidden=false + +func (c *Command) VisibleCommands() []*Command + VisibleCommands returns a slice of the Commands with Hidden=false + +func (c *Command) VisibleFlagCategories() []VisibleFlagCategory + VisibleFlagCategories returns a slice containing all the visible flag + categories with the flags they contain + +func (c *Command) VisibleFlags() []Flag + VisibleFlags returns a slice of the Flags with Hidden=false + +type CommandCategories interface { + // AddCommand adds a command to a category, creating a new category if necessary. + AddCommand(category string, command *Command) + // Categories returns a slice of categories sorted by name + Categories() []CommandCategory +} + CommandCategories interface allows for category manipulation + +type CommandCategory interface { + // Name returns the category name string + Name() string + // VisibleCommands returns a slice of the Commands with Hidden=false + VisibleCommands() []*Command +} + CommandCategory is a category containing commands. + +type CommandNotFoundFunc func(*Context, string) + CommandNotFoundFunc is executed if the proper command cannot be found + +type Commands []*Command + +type CommandsByName []*Command + +func (c CommandsByName) Len() int + +func (c CommandsByName) Less(i, j int) bool + +func (c CommandsByName) Swap(i, j int) + +type Context struct { + context.Context + App *App + Command *Command + + // Has unexported fields. +} + Context is a type that is passed through to each Handler action in a cli + application. Context can be used to retrieve context-specific args and + parsed command-line options. + +func NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context + NewContext creates a new context. For use in when invoking an App or Command + action. + +func (cCtx *Context) Args() Args + Args returns the command line arguments associated with the context. + +func (cCtx *Context) Bool(name string) bool + Bool looks up the value of a local BoolFlag, returns false if not found + +func (cCtx *Context) Count(name string) int + Count returns the num of occurrences of this flag + +func (cCtx *Context) Duration(name string) time.Duration + Duration looks up the value of a local DurationFlag, returns 0 if not found + +func (cCtx *Context) FlagNames() []string + FlagNames returns a slice of flag names used by the this context and all of + its parent contexts. + +func (cCtx *Context) Float64(name string) float64 + Float64 looks up the value of a local Float64Flag, returns 0 if not found + +func (cCtx *Context) Float64Slice(name string) []float64 + Float64Slice looks up the value of a local Float64SliceFlag, returns nil if + not found + +func (cCtx *Context) Generic(name string) interface{} + Generic looks up the value of a local GenericFlag, returns nil if not found + +func (cCtx *Context) Int(name string) int + Int looks up the value of a local IntFlag, returns 0 if not found + +func (cCtx *Context) Int64(name string) int64 + Int64 looks up the value of a local Int64Flag, returns 0 if not found + +func (cCtx *Context) Int64Slice(name string) []int64 + Int64Slice looks up the value of a local Int64SliceFlag, returns nil if not + found + +func (cCtx *Context) IntSlice(name string) []int + IntSlice looks up the value of a local IntSliceFlag, returns nil if not + found + +func (cCtx *Context) IsSet(name string) bool + IsSet determines if the flag was actually set + +func (cCtx *Context) Lineage() []*Context + Lineage returns *this* context and all of its ancestor contexts in order + from child to parent + +func (cCtx *Context) LocalFlagNames() []string + LocalFlagNames returns a slice of flag names used in this context. + +func (cCtx *Context) NArg() int + NArg returns the number of the command line arguments. + +func (cCtx *Context) NumFlags() int + NumFlags returns the number of flags set + +func (cCtx *Context) Path(name string) string + Path looks up the value of a local PathFlag, returns "" if not found + +func (cCtx *Context) Set(name, value string) error + Set sets a context flag to a value. + +func (cCtx *Context) String(name string) string + String looks up the value of a local StringFlag, returns "" if not found + +func (cCtx *Context) StringSlice(name string) []string + StringSlice looks up the value of a local StringSliceFlag, returns nil if + not found + +func (cCtx *Context) Timestamp(name string) *time.Time + Timestamp gets the timestamp from a flag name + +func (cCtx *Context) Uint(name string) uint + Uint looks up the value of a local UintFlag, returns 0 if not found + +func (cCtx *Context) Uint64(name string) uint64 + Uint64 looks up the value of a local Uint64Flag, returns 0 if not found + +func (cCtx *Context) Uint64Slice(name string) []uint64 + Uint64Slice looks up the value of a local Uint64SliceFlag, returns nil if + not found + +func (cCtx *Context) UintSlice(name string) []uint + UintSlice looks up the value of a local UintSliceFlag, returns nil if not + found + +func (cCtx *Context) Value(name string) interface{} + Value returns the value of the flag corresponding to `name` + +type Countable interface { + Count() int +} + Countable is an interface to enable detection of flag values which support + repetitive flags + +type DocGenerationFlag interface { + Flag + + // TakesValue returns true if the flag takes a value, otherwise false + TakesValue() bool + + // GetUsage returns the usage string for the flag + GetUsage() string + + // GetValue returns the flags value as string representation and an empty + // string if the flag takes no value at all. + GetValue() string + + // GetDefaultText returns the default text for this flag + GetDefaultText() string + + // GetEnvVars returns the env vars for this flag + GetEnvVars() []string +} + DocGenerationFlag is an interface that allows documentation generation for + the flag + +type DocGenerationSliceFlag interface { + DocGenerationFlag + + // IsSliceFlag returns true for flags that can be given multiple times. + IsSliceFlag() bool +} + DocGenerationSliceFlag extends DocGenerationFlag for slice-based flags. + +type DurationFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value time.Duration + Destination *time.Duration + + Aliases []string + EnvVars []string + + Action func(*Context, time.Duration) error + // Has unexported fields. +} + DurationFlag is a flag with type time.Duration + +func (f *DurationFlag) Apply(set *flag.FlagSet) error + Apply populates the flag given the flag set and environment + +func (f *DurationFlag) Get(ctx *Context) time.Duration + Get returns the flag’s value in the given Context. + +func (f *DurationFlag) GetCategory() string + GetCategory returns the category for the flag + +func (f *DurationFlag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *DurationFlag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *DurationFlag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *DurationFlag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *DurationFlag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *DurationFlag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *DurationFlag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *DurationFlag) Names() []string + Names returns the names of the flag + +func (f *DurationFlag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *DurationFlag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *DurationFlag) TakesValue() bool + TakesValue returns true of the flag takes a value, otherwise false + +type ErrorFormatter interface { + Format(s fmt.State, verb rune) +} + ErrorFormatter is the interface that will suitably format the error output + +type ExitCoder interface { + error + ExitCode() int +} + ExitCoder is the interface checked by `App` and `Command` for a custom exit + code + +func Exit(message interface{}, exitCode int) ExitCoder + Exit wraps a message and exit code into an error, which by default is + handled with a call to os.Exit during default error handling. + + This is the simplest way to trigger a non-zero exit code for an App + without having to call os.Exit manually. During testing, this behavior + can be avoided by overriding the ExitErrHandler function on an App or the + package-global OsExiter function. + +func NewExitError(message interface{}, exitCode int) ExitCoder + NewExitError calls Exit to create a new ExitCoder. + + Deprecated: This function is a duplicate of Exit and will eventually be + removed. + +type ExitErrHandlerFunc func(cCtx *Context, err error) + ExitErrHandlerFunc is executed if provided in order to handle exitError + values returned by Actions and Before/After functions. + +type Flag interface { + fmt.Stringer + // Apply Flag settings to the given flag set + Apply(*flag.FlagSet) error + Names() []string + IsSet() bool +} + Flag is a common interface related to parsing flags in cli. For more + advanced flag parsing techniques, it is recommended that this interface be + implemented. + +var BashCompletionFlag Flag = &BoolFlag{ + Name: "generate-bash-completion", + Hidden: true, +} + BashCompletionFlag enables bash-completion for all commands and subcommands + +var HelpFlag Flag = &BoolFlag{ + Name: "help", + Aliases: []string{"h"}, + Usage: "show help", + DisableDefaultText: true, +} + HelpFlag prints the help for all commands and subcommands. Set to nil to + disable the flag. The subcommand will still be added unless HideHelp or + HideHelpCommand is set to true. + +var VersionFlag Flag = &BoolFlag{ + Name: "version", + Aliases: []string{"v"}, + Usage: "print the version", + DisableDefaultText: true, +} + VersionFlag prints the version for the application + +type FlagCategories interface { + // AddFlags adds a flag to a category, creating a new category if necessary. + AddFlag(category string, fl Flag) + // VisibleCategories returns a slice of visible flag categories sorted by name + VisibleCategories() []VisibleFlagCategory +} + FlagCategories interface allows for category manipulation + +type FlagEnvHintFunc func(envVars []string, str string) string + FlagEnvHintFunc is used by the default FlagStringFunc to annotate flag help + with the environment variable details. + +var FlagEnvHinter FlagEnvHintFunc = withEnvHint + FlagEnvHinter annotates flag help message with the environment variable + details. This is used by the default FlagStringer. + +type FlagFileHintFunc func(filePath, str string) string + FlagFileHintFunc is used by the default FlagStringFunc to annotate flag help + with the file path details. + +var FlagFileHinter FlagFileHintFunc = withFileHint + FlagFileHinter annotates flag help message with the environment variable + details. This is used by the default FlagStringer. + +type FlagNamePrefixFunc func(fullName []string, placeholder string) string + FlagNamePrefixFunc is used by the default FlagStringFunc to create prefix + text for a flag's full name. + +var FlagNamePrefixer FlagNamePrefixFunc = prefixedNames + FlagNamePrefixer converts a full flag name and its placeholder into the help + message flag prefix. This is used by the default FlagStringer. + +type FlagStringFunc func(Flag) string + FlagStringFunc is used by the help generation to display a flag, which is + expected to be a single line. + +var FlagStringer FlagStringFunc = stringifyFlag + FlagStringer converts a flag definition to a string. This is used by help to + display a flag. + +type FlagsByName []Flag + FlagsByName is a slice of Flag. + +func (f FlagsByName) Len() int + +func (f FlagsByName) Less(i, j int) bool + +func (f FlagsByName) Swap(i, j int) + +type Float64Flag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value float64 + Destination *float64 + + Aliases []string + EnvVars []string + + Action func(*Context, float64) error + // Has unexported fields. +} + Float64Flag is a flag with type float64 + +func (f *Float64Flag) Apply(set *flag.FlagSet) error + Apply populates the flag given the flag set and environment + +func (f *Float64Flag) Get(ctx *Context) float64 + Get returns the flag’s value in the given Context. + +func (f *Float64Flag) GetCategory() string + GetCategory returns the category for the flag + +func (f *Float64Flag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *Float64Flag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *Float64Flag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *Float64Flag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *Float64Flag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *Float64Flag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *Float64Flag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *Float64Flag) Names() []string + Names returns the names of the flag + +func (f *Float64Flag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *Float64Flag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *Float64Flag) TakesValue() bool + TakesValue returns true of the flag takes a value, otherwise false + +type Float64Slice struct { + // Has unexported fields. +} + Float64Slice wraps []float64 to satisfy flag.Value + +func NewFloat64Slice(defaults ...float64) *Float64Slice + NewFloat64Slice makes a *Float64Slice with default values + +func (f *Float64Slice) Get() interface{} + Get returns the slice of float64s set by this flag + +func (f *Float64Slice) Serialize() string + Serialize allows Float64Slice to fulfill Serializer + +func (f *Float64Slice) Set(value string) error + Set parses the value into a float64 and appends it to the list of values + +func (f *Float64Slice) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *Float64Slice) Value() []float64 + Value returns the slice of float64s set by this flag + +func (f *Float64Slice) WithSeparatorSpec(spec separatorSpec) + +type Float64SliceFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value *Float64Slice + Destination *Float64Slice + + Aliases []string + EnvVars []string + + Action func(*Context, []float64) error + // Has unexported fields. +} + Float64SliceFlag is a flag with type *Float64Slice + +func (f *Float64SliceFlag) Apply(set *flag.FlagSet) error + Apply populates the flag given the flag set and environment + +func (f *Float64SliceFlag) Get(ctx *Context) []float64 + Get returns the flag’s value in the given Context. + +func (f *Float64SliceFlag) GetCategory() string + GetCategory returns the category for the flag + +func (f *Float64SliceFlag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *Float64SliceFlag) GetDestination() []float64 + +func (f *Float64SliceFlag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *Float64SliceFlag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *Float64SliceFlag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *Float64SliceFlag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *Float64SliceFlag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *Float64SliceFlag) IsSliceFlag() bool + IsSliceFlag implements DocGenerationSliceFlag. + +func (f *Float64SliceFlag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *Float64SliceFlag) Names() []string + Names returns the names of the flag + +func (f *Float64SliceFlag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *Float64SliceFlag) SetDestination(slice []float64) + +func (f *Float64SliceFlag) SetValue(slice []float64) + +func (f *Float64SliceFlag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *Float64SliceFlag) TakesValue() bool + TakesValue returns true if the flag takes a value, otherwise false + +func (f *Float64SliceFlag) WithSeparatorSpec(spec separatorSpec) + +type Generic interface { + Set(value string) error + String() string +} + Generic is a generic parseable type identified by a specific flag + +type GenericFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value Generic + Destination Generic + + Aliases []string + EnvVars []string + + TakesFile bool + + Action func(*Context, interface{}) error + // Has unexported fields. +} + GenericFlag is a flag with type Generic + +func (f *GenericFlag) Apply(set *flag.FlagSet) error + Apply takes the flagset and calls Set on the generic flag with the value + provided by the user for parsing by the flag + +func (f *GenericFlag) Get(ctx *Context) interface{} + Get returns the flag’s value in the given Context. + +func (f *GenericFlag) GetCategory() string + GetCategory returns the category for the flag + +func (f *GenericFlag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *GenericFlag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *GenericFlag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *GenericFlag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *GenericFlag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *GenericFlag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *GenericFlag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *GenericFlag) Names() []string + Names returns the names of the flag + +func (f *GenericFlag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *GenericFlag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *GenericFlag) TakesValue() bool + TakesValue returns true of the flag takes a value, otherwise false + +type Int64Flag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value int64 + Destination *int64 + + Aliases []string + EnvVars []string + + Base int + + Action func(*Context, int64) error + // Has unexported fields. +} + Int64Flag is a flag with type int64 + +func (f *Int64Flag) Apply(set *flag.FlagSet) error + Apply populates the flag given the flag set and environment + +func (f *Int64Flag) Get(ctx *Context) int64 + Get returns the flag’s value in the given Context. + +func (f *Int64Flag) GetCategory() string + GetCategory returns the category for the flag + +func (f *Int64Flag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *Int64Flag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *Int64Flag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *Int64Flag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *Int64Flag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *Int64Flag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *Int64Flag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *Int64Flag) Names() []string + Names returns the names of the flag + +func (f *Int64Flag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *Int64Flag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *Int64Flag) TakesValue() bool + TakesValue returns true of the flag takes a value, otherwise false + +type Int64Slice struct { + // Has unexported fields. +} + Int64Slice wraps []int64 to satisfy flag.Value + +func NewInt64Slice(defaults ...int64) *Int64Slice + NewInt64Slice makes an *Int64Slice with default values + +func (i *Int64Slice) Get() interface{} + Get returns the slice of ints set by this flag + +func (i *Int64Slice) Serialize() string + Serialize allows Int64Slice to fulfill Serializer + +func (i *Int64Slice) Set(value string) error + Set parses the value into an integer and appends it to the list of values + +func (i *Int64Slice) String() string + String returns a readable representation of this value (for usage defaults) + +func (i *Int64Slice) Value() []int64 + Value returns the slice of ints set by this flag + +func (i *Int64Slice) WithSeparatorSpec(spec separatorSpec) + +type Int64SliceFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value *Int64Slice + Destination *Int64Slice + + Aliases []string + EnvVars []string + + Action func(*Context, []int64) error + // Has unexported fields. +} + Int64SliceFlag is a flag with type *Int64Slice + +func (f *Int64SliceFlag) Apply(set *flag.FlagSet) error + Apply populates the flag given the flag set and environment + +func (f *Int64SliceFlag) Get(ctx *Context) []int64 + Get returns the flag’s value in the given Context. + +func (f *Int64SliceFlag) GetCategory() string + GetCategory returns the category for the flag + +func (f *Int64SliceFlag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *Int64SliceFlag) GetDestination() []int64 + +func (f *Int64SliceFlag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *Int64SliceFlag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *Int64SliceFlag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *Int64SliceFlag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *Int64SliceFlag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *Int64SliceFlag) IsSliceFlag() bool + IsSliceFlag implements DocGenerationSliceFlag. + +func (f *Int64SliceFlag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *Int64SliceFlag) Names() []string + Names returns the names of the flag + +func (f *Int64SliceFlag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *Int64SliceFlag) SetDestination(slice []int64) + +func (f *Int64SliceFlag) SetValue(slice []int64) + +func (f *Int64SliceFlag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *Int64SliceFlag) TakesValue() bool + TakesValue returns true of the flag takes a value, otherwise false + +func (f *Int64SliceFlag) WithSeparatorSpec(spec separatorSpec) + +type IntFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value int + Destination *int + + Aliases []string + EnvVars []string + + Base int + + Action func(*Context, int) error + // Has unexported fields. +} + IntFlag is a flag with type int + +func (f *IntFlag) Apply(set *flag.FlagSet) error + Apply populates the flag given the flag set and environment + +func (f *IntFlag) Get(ctx *Context) int + Get returns the flag’s value in the given Context. + +func (f *IntFlag) GetCategory() string + GetCategory returns the category for the flag + +func (f *IntFlag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *IntFlag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *IntFlag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *IntFlag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *IntFlag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *IntFlag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *IntFlag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *IntFlag) Names() []string + Names returns the names of the flag + +func (f *IntFlag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *IntFlag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *IntFlag) TakesValue() bool + TakesValue returns true of the flag takes a value, otherwise false + +type IntSlice struct { + // Has unexported fields. +} + IntSlice wraps []int to satisfy flag.Value + +func NewIntSlice(defaults ...int) *IntSlice + NewIntSlice makes an *IntSlice with default values + +func (i *IntSlice) Get() interface{} + Get returns the slice of ints set by this flag + +func (i *IntSlice) Serialize() string + Serialize allows IntSlice to fulfill Serializer + +func (i *IntSlice) Set(value string) error + Set parses the value into an integer and appends it to the list of values + +func (i *IntSlice) SetInt(value int) + TODO: Consistently have specific Set function for Int64 and Float64 ? SetInt + directly adds an integer to the list of values + +func (i *IntSlice) String() string + String returns a readable representation of this value (for usage defaults) + +func (i *IntSlice) Value() []int + Value returns the slice of ints set by this flag + +func (i *IntSlice) WithSeparatorSpec(spec separatorSpec) + +type IntSliceFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value *IntSlice + Destination *IntSlice + + Aliases []string + EnvVars []string + + Action func(*Context, []int) error + // Has unexported fields. +} + IntSliceFlag is a flag with type *IntSlice + +func (f *IntSliceFlag) Apply(set *flag.FlagSet) error + Apply populates the flag given the flag set and environment + +func (f *IntSliceFlag) Get(ctx *Context) []int + Get returns the flag’s value in the given Context. + +func (f *IntSliceFlag) GetCategory() string + GetCategory returns the category for the flag + +func (f *IntSliceFlag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *IntSliceFlag) GetDestination() []int + +func (f *IntSliceFlag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *IntSliceFlag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *IntSliceFlag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *IntSliceFlag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *IntSliceFlag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *IntSliceFlag) IsSliceFlag() bool + IsSliceFlag implements DocGenerationSliceFlag. + +func (f *IntSliceFlag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *IntSliceFlag) Names() []string + Names returns the names of the flag + +func (f *IntSliceFlag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *IntSliceFlag) SetDestination(slice []int) + +func (f *IntSliceFlag) SetValue(slice []int) + +func (f *IntSliceFlag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *IntSliceFlag) TakesValue() bool + TakesValue returns true of the flag takes a value, otherwise false + +func (f *IntSliceFlag) WithSeparatorSpec(spec separatorSpec) + +type InvalidFlagAccessFunc func(*Context, string) + InvalidFlagAccessFunc is executed when an invalid flag is accessed from the + context. + +type MultiError interface { + error + Errors() []error +} + MultiError is an error that wraps multiple errors. + +type MultiFloat64Flag = SliceFlag[*Float64SliceFlag, []float64, float64] + MultiFloat64Flag extends Float64SliceFlag with support for using slices + directly, as Value and/or Destination. See also SliceFlag. + +type MultiInt64Flag = SliceFlag[*Int64SliceFlag, []int64, int64] + MultiInt64Flag extends Int64SliceFlag with support for using slices + directly, as Value and/or Destination. See also SliceFlag. + +type MultiIntFlag = SliceFlag[*IntSliceFlag, []int, int] + MultiIntFlag extends IntSliceFlag with support for using slices directly, + as Value and/or Destination. See also SliceFlag. + +type MultiStringFlag = SliceFlag[*StringSliceFlag, []string, string] + MultiStringFlag extends StringSliceFlag with support for using slices + directly, as Value and/or Destination. See also SliceFlag. + +type OnUsageErrorFunc func(cCtx *Context, err error, isSubcommand bool) error + OnUsageErrorFunc is executed if a usage error occurs. This is useful for + displaying customized usage error messages. This function is able to replace + the original error messages. If this function is not set, the "Incorrect + usage" is displayed and the execution is interrupted. + +type Path = string + +type PathFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value Path + Destination *Path + + Aliases []string + EnvVars []string + + TakesFile bool + + Action func(*Context, Path) error + // Has unexported fields. +} + PathFlag is a flag with type Path + +func (f *PathFlag) Apply(set *flag.FlagSet) error + Apply populates the flag given the flag set and environment + +func (f *PathFlag) Get(ctx *Context) string + Get returns the flag’s value in the given Context. + +func (f *PathFlag) GetCategory() string + GetCategory returns the category for the flag + +func (f *PathFlag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *PathFlag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *PathFlag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *PathFlag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *PathFlag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *PathFlag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *PathFlag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *PathFlag) Names() []string + Names returns the names of the flag + +func (f *PathFlag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *PathFlag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *PathFlag) TakesValue() bool + TakesValue returns true of the flag takes a value, otherwise false + +type RequiredFlag interface { + Flag + + IsRequired() bool +} + RequiredFlag is an interface that allows us to mark flags as required + it allows flags required flags to be backwards compatible with the Flag + interface + +type Serializer interface { + Serialize() string +} + Serializer is used to circumvent the limitations of flag.FlagSet.Set + +type SliceFlag[T SliceFlagTarget[E], S ~[]E, E any] struct { + Target T + Value S + Destination *S +} + SliceFlag extends implementations like StringSliceFlag and IntSliceFlag + with support for using slices directly, as Value and/or Destination. + See also SliceFlagTarget, MultiStringFlag, MultiFloat64Flag, MultiInt64Flag, + MultiIntFlag. + +func (x *SliceFlag[T, S, E]) Apply(set *flag.FlagSet) error + +func (x *SliceFlag[T, S, E]) GetCategory() string + +func (x *SliceFlag[T, S, E]) GetDefaultText() string + +func (x *SliceFlag[T, S, E]) GetDestination() S + +func (x *SliceFlag[T, S, E]) GetEnvVars() []string + +func (x *SliceFlag[T, S, E]) GetUsage() string + +func (x *SliceFlag[T, S, E]) GetValue() string + +func (x *SliceFlag[T, S, E]) IsRequired() bool + +func (x *SliceFlag[T, S, E]) IsSet() bool + +func (x *SliceFlag[T, S, E]) IsVisible() bool + +func (x *SliceFlag[T, S, E]) Names() []string + +func (x *SliceFlag[T, S, E]) SetDestination(slice S) + +func (x *SliceFlag[T, S, E]) SetValue(slice S) + +func (x *SliceFlag[T, S, E]) String() string + +func (x *SliceFlag[T, S, E]) TakesValue() bool + +type SliceFlagTarget[E any] interface { + Flag + RequiredFlag + DocGenerationFlag + VisibleFlag + CategorizableFlag + + // SetValue should propagate the given slice to the target, ideally as a new value. + // Note that a nil slice should nil/clear any existing value (modelled as ~[]E). + SetValue(slice []E) + // SetDestination should propagate the given slice to the target, ideally as a new value. + // Note that a nil slice should nil/clear any existing value (modelled as ~*[]E). + SetDestination(slice []E) + // GetDestination should return the current value referenced by any destination, or nil if nil/unset. + GetDestination() []E +} + SliceFlagTarget models a target implementation for use with SliceFlag. The + three methods, SetValue, SetDestination, and GetDestination, are necessary + to propagate Value and Destination, where Value is propagated inwards + (initially), and Destination is propagated outwards (on every update). + +type StringFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value string + Destination *string + + Aliases []string + EnvVars []string + + TakesFile bool + + Action func(*Context, string) error + // Has unexported fields. +} + StringFlag is a flag with type string + +func (f *StringFlag) Apply(set *flag.FlagSet) error + Apply populates the flag given the flag set and environment + +func (f *StringFlag) Get(ctx *Context) string + Get returns the flag’s value in the given Context. + +func (f *StringFlag) GetCategory() string + GetCategory returns the category for the flag + +func (f *StringFlag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *StringFlag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *StringFlag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *StringFlag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *StringFlag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *StringFlag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *StringFlag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *StringFlag) Names() []string + Names returns the names of the flag + +func (f *StringFlag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *StringFlag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *StringFlag) TakesValue() bool + TakesValue returns true of the flag takes a value, otherwise false + +type StringSlice struct { + // Has unexported fields. +} + StringSlice wraps a []string to satisfy flag.Value + +func NewStringSlice(defaults ...string) *StringSlice + NewStringSlice creates a *StringSlice with default values + +func (s *StringSlice) Get() interface{} + Get returns the slice of strings set by this flag + +func (s *StringSlice) Serialize() string + Serialize allows StringSlice to fulfill Serializer + +func (s *StringSlice) Set(value string) error + Set appends the string value to the list of values + +func (s *StringSlice) String() string + String returns a readable representation of this value (for usage defaults) + +func (s *StringSlice) Value() []string + Value returns the slice of strings set by this flag + +func (s *StringSlice) WithSeparatorSpec(spec separatorSpec) + +type StringSliceFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value *StringSlice + Destination *StringSlice + + Aliases []string + EnvVars []string + + TakesFile bool + + Action func(*Context, []string) error + + KeepSpace bool + // Has unexported fields. +} + StringSliceFlag is a flag with type *StringSlice + +func (f *StringSliceFlag) Apply(set *flag.FlagSet) error + Apply populates the flag given the flag set and environment + +func (f *StringSliceFlag) Get(ctx *Context) []string + Get returns the flag’s value in the given Context. + +func (f *StringSliceFlag) GetCategory() string + GetCategory returns the category for the flag + +func (f *StringSliceFlag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *StringSliceFlag) GetDestination() []string + +func (f *StringSliceFlag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *StringSliceFlag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *StringSliceFlag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *StringSliceFlag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *StringSliceFlag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *StringSliceFlag) IsSliceFlag() bool + IsSliceFlag implements DocGenerationSliceFlag. + +func (f *StringSliceFlag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *StringSliceFlag) Names() []string + Names returns the names of the flag + +func (f *StringSliceFlag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *StringSliceFlag) SetDestination(slice []string) + +func (f *StringSliceFlag) SetValue(slice []string) + +func (f *StringSliceFlag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *StringSliceFlag) TakesValue() bool + TakesValue returns true of the flag takes a value, otherwise false + +func (f *StringSliceFlag) WithSeparatorSpec(spec separatorSpec) + +type SuggestCommandFunc func(commands []*Command, provided string) string + +type SuggestFlagFunc func(flags []Flag, provided string, hideHelp bool) string + +type Timestamp struct { + // Has unexported fields. +} + Timestamp wrap to satisfy golang's flag interface. + +func NewTimestamp(timestamp time.Time) *Timestamp + Timestamp constructor + +func (t *Timestamp) Get() interface{} + Get returns the flag structure + +func (t *Timestamp) Set(value string) error + Parses the string value to timestamp + +func (t *Timestamp) SetLayout(layout string) + Set the timestamp string layout for future parsing + +func (t *Timestamp) SetLocation(loc *time.Location) + Set perceived timezone of the to-be parsed time string + +func (t *Timestamp) SetTimestamp(value time.Time) + Set the timestamp value directly + +func (t *Timestamp) String() string + String returns a readable representation of this value (for usage defaults) + +func (t *Timestamp) Value() *time.Time + Value returns the timestamp value stored in the flag + +type TimestampFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value *Timestamp + Destination *Timestamp + + Aliases []string + EnvVars []string + + Layout string + + Timezone *time.Location + + Action func(*Context, *time.Time) error + // Has unexported fields. +} + TimestampFlag is a flag with type *Timestamp + +func (f *TimestampFlag) Apply(set *flag.FlagSet) error + Apply populates the flag given the flag set and environment + +func (f *TimestampFlag) Get(ctx *Context) *time.Time + Get returns the flag’s value in the given Context. + +func (f *TimestampFlag) GetCategory() string + GetCategory returns the category for the flag + +func (f *TimestampFlag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *TimestampFlag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *TimestampFlag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *TimestampFlag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *TimestampFlag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *TimestampFlag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *TimestampFlag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *TimestampFlag) Names() []string + Names returns the names of the flag + +func (f *TimestampFlag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *TimestampFlag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *TimestampFlag) TakesValue() bool + TakesValue returns true of the flag takes a value, otherwise false + +type Uint64Flag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value uint64 + Destination *uint64 + + Aliases []string + EnvVars []string + + Base int + + Action func(*Context, uint64) error + // Has unexported fields. +} + Uint64Flag is a flag with type uint64 + +func (f *Uint64Flag) Apply(set *flag.FlagSet) error + Apply populates the flag given the flag set and environment + +func (f *Uint64Flag) Get(ctx *Context) uint64 + Get returns the flag’s value in the given Context. + +func (f *Uint64Flag) GetCategory() string + GetCategory returns the category for the flag + +func (f *Uint64Flag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *Uint64Flag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *Uint64Flag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *Uint64Flag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *Uint64Flag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *Uint64Flag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *Uint64Flag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *Uint64Flag) Names() []string + Names returns the names of the flag + +func (f *Uint64Flag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *Uint64Flag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *Uint64Flag) TakesValue() bool + TakesValue returns true of the flag takes a value, otherwise false + +type Uint64Slice struct { + // Has unexported fields. +} + Uint64Slice wraps []int64 to satisfy flag.Value + +func NewUint64Slice(defaults ...uint64) *Uint64Slice + NewUint64Slice makes an *Uint64Slice with default values + +func (i *Uint64Slice) Get() interface{} + Get returns the slice of ints set by this flag + +func (i *Uint64Slice) Serialize() string + Serialize allows Uint64Slice to fulfill Serializer + +func (i *Uint64Slice) Set(value string) error + Set parses the value into an integer and appends it to the list of values + +func (i *Uint64Slice) String() string + String returns a readable representation of this value (for usage defaults) + +func (i *Uint64Slice) Value() []uint64 + Value returns the slice of ints set by this flag + +func (i *Uint64Slice) WithSeparatorSpec(spec separatorSpec) + +type Uint64SliceFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value *Uint64Slice + Destination *Uint64Slice + + Aliases []string + EnvVars []string + + Action func(*Context, []uint64) error + // Has unexported fields. +} + Uint64SliceFlag is a flag with type *Uint64Slice + +func (f *Uint64SliceFlag) Apply(set *flag.FlagSet) error + Apply populates the flag given the flag set and environment + +func (f *Uint64SliceFlag) Get(ctx *Context) []uint64 + Get returns the flag’s value in the given Context. + +func (f *Uint64SliceFlag) GetCategory() string + GetCategory returns the category for the flag + +func (f *Uint64SliceFlag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *Uint64SliceFlag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *Uint64SliceFlag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *Uint64SliceFlag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *Uint64SliceFlag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *Uint64SliceFlag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *Uint64SliceFlag) IsSliceFlag() bool + IsSliceFlag implements DocGenerationSliceFlag. + +func (f *Uint64SliceFlag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *Uint64SliceFlag) Names() []string + Names returns the names of the flag + +func (f *Uint64SliceFlag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *Uint64SliceFlag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *Uint64SliceFlag) TakesValue() bool + TakesValue returns true of the flag takes a value, otherwise false + +func (f *Uint64SliceFlag) WithSeparatorSpec(spec separatorSpec) + +type UintFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value uint + Destination *uint + + Aliases []string + EnvVars []string + + Base int + + Action func(*Context, uint) error + // Has unexported fields. +} + UintFlag is a flag with type uint + +func (f *UintFlag) Apply(set *flag.FlagSet) error + Apply populates the flag given the flag set and environment + +func (f *UintFlag) Get(ctx *Context) uint + Get returns the flag’s value in the given Context. + +func (f *UintFlag) GetCategory() string + GetCategory returns the category for the flag + +func (f *UintFlag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *UintFlag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *UintFlag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *UintFlag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *UintFlag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *UintFlag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *UintFlag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *UintFlag) Names() []string + Names returns the names of the flag + +func (f *UintFlag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *UintFlag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *UintFlag) TakesValue() bool + TakesValue returns true of the flag takes a value, otherwise false + +type UintSlice struct { + // Has unexported fields. +} + UintSlice wraps []int to satisfy flag.Value + +func NewUintSlice(defaults ...uint) *UintSlice + NewUintSlice makes an *UintSlice with default values + +func (i *UintSlice) Get() interface{} + Get returns the slice of ints set by this flag + +func (i *UintSlice) Serialize() string + Serialize allows UintSlice to fulfill Serializer + +func (i *UintSlice) Set(value string) error + Set parses the value into an integer and appends it to the list of values + +func (i *UintSlice) SetUint(value uint) + TODO: Consistently have specific Set function for Int64 and Float64 ? SetInt + directly adds an integer to the list of values + +func (i *UintSlice) String() string + String returns a readable representation of this value (for usage defaults) + +func (i *UintSlice) Value() []uint + Value returns the slice of ints set by this flag + +func (i *UintSlice) WithSeparatorSpec(spec separatorSpec) + +type UintSliceFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value *UintSlice + Destination *UintSlice + + Aliases []string + EnvVars []string + + Action func(*Context, []uint) error + // Has unexported fields. +} + UintSliceFlag is a flag with type *UintSlice + +func (f *UintSliceFlag) Apply(set *flag.FlagSet) error + Apply populates the flag given the flag set and environment + +func (f *UintSliceFlag) Get(ctx *Context) []uint + Get returns the flag’s value in the given Context. + +func (f *UintSliceFlag) GetCategory() string + GetCategory returns the category for the flag + +func (f *UintSliceFlag) GetDefaultText() string + GetDefaultText returns the default text for this flag + +func (f *UintSliceFlag) GetEnvVars() []string + GetEnvVars returns the env vars for this flag + +func (f *UintSliceFlag) GetUsage() string + GetUsage returns the usage string for the flag + +func (f *UintSliceFlag) GetValue() string + GetValue returns the flags value as string representation and an empty + string if the flag takes no value at all. + +func (f *UintSliceFlag) IsRequired() bool + IsRequired returns whether or not the flag is required + +func (f *UintSliceFlag) IsSet() bool + IsSet returns whether or not the flag has been set through env or file + +func (f *UintSliceFlag) IsSliceFlag() bool + IsSliceFlag implements DocGenerationSliceFlag. + +func (f *UintSliceFlag) IsVisible() bool + IsVisible returns true if the flag is not hidden, otherwise false + +func (f *UintSliceFlag) Names() []string + Names returns the names of the flag + +func (f *UintSliceFlag) RunAction(c *Context) error + RunAction executes flag action if set + +func (f *UintSliceFlag) String() string + String returns a readable representation of this value (for usage defaults) + +func (f *UintSliceFlag) TakesValue() bool + TakesValue returns true of the flag takes a value, otherwise false + +func (f *UintSliceFlag) WithSeparatorSpec(spec separatorSpec) + +type VisibleFlag interface { + Flag + + // IsVisible returns true if the flag is not hidden, otherwise false + IsVisible() bool +} + VisibleFlag is an interface that allows to check if a flag is visible + +type VisibleFlagCategory interface { + // Name returns the category name string + Name() string + // Flags returns a slice of VisibleFlag sorted by name + Flags() []VisibleFlag +} + VisibleFlagCategory is a category containing flags. + +package altsrc // import "github.com/urfave/cli/v2/altsrc" + + +FUNCTIONS + +func ApplyInputSourceValues(cCtx *cli.Context, inputSourceContext InputSourceContext, flags []cli.Flag) error + ApplyInputSourceValues iterates over all provided flags and executes + ApplyInputSourceValue on flags implementing the FlagInputSourceExtension + interface to initialize these flags to an alternate input source. + +func InitInputSource(flags []cli.Flag, createInputSource func() (InputSourceContext, error)) cli.BeforeFunc + InitInputSource is used to to setup an InputSourceContext on a cli.Command + Before method. It will create a new input source based on the func provided. + If there is no error it will then apply the new input source to any flags + that are supported by the input source + +func InitInputSourceWithContext(flags []cli.Flag, createInputSource func(cCtx *cli.Context) (InputSourceContext, error)) cli.BeforeFunc + InitInputSourceWithContext is used to to setup an InputSourceContext on + a cli.Command Before method. It will create a new input source based on + the func provided with potentially using existing cli.Context values to + initialize itself. If there is no error it will then apply the new input + source to any flags that are supported by the input source + +func NewJSONSourceFromFlagFunc(flag string) func(c *cli.Context) (InputSourceContext, error) + NewJSONSourceFromFlagFunc returns a func that takes a cli.Context and + returns an InputSourceContext suitable for retrieving config variables from + a file containing JSON data with the file name defined by the given flag. + +func NewTomlSourceFromFlagFunc(flagFileName string) func(cCtx *cli.Context) (InputSourceContext, error) + NewTomlSourceFromFlagFunc creates a new TOML InputSourceContext from a + provided flag name and source context. + +func NewYamlSourceFromFlagFunc(flagFileName string) func(cCtx *cli.Context) (InputSourceContext, error) + NewYamlSourceFromFlagFunc creates a new Yaml InputSourceContext from a + provided flag name and source context. + + +TYPES + +type BoolFlag struct { + *cli.BoolFlag + // Has unexported fields. +} + BoolFlag is the flag type that wraps cli.BoolFlag to allow for other values + to be specified + +func NewBoolFlag(fl *cli.BoolFlag) *BoolFlag + NewBoolFlag creates a new BoolFlag + +func (f *BoolFlag) Apply(set *flag.FlagSet) error + Apply saves the flagSet for later usage calls, then calls the wrapped + BoolFlag.Apply + +func (f *BoolFlag) ApplyInputSourceValue(cCtx *cli.Context, isc InputSourceContext) error + ApplyInputSourceValue applies a Bool value to the flagSet if required + +type DurationFlag struct { + *cli.DurationFlag + // Has unexported fields. +} + DurationFlag is the flag type that wraps cli.DurationFlag to allow for other + values to be specified + +func NewDurationFlag(fl *cli.DurationFlag) *DurationFlag + NewDurationFlag creates a new DurationFlag + +func (f *DurationFlag) Apply(set *flag.FlagSet) error + Apply saves the flagSet for later usage calls, then calls the wrapped + DurationFlag.Apply + +func (f *DurationFlag) ApplyInputSourceValue(cCtx *cli.Context, isc InputSourceContext) error + ApplyInputSourceValue applies a Duration value to the flagSet if required + +type FlagInputSourceExtension interface { + cli.Flag + ApplyInputSourceValue(cCtx *cli.Context, isc InputSourceContext) error +} + FlagInputSourceExtension is an extension interface of cli.Flag that allows a + value to be set on the existing parsed flags. + +type Float64Flag struct { + *cli.Float64Flag + // Has unexported fields. +} + Float64Flag is the flag type that wraps cli.Float64Flag to allow for other + values to be specified + +func NewFloat64Flag(fl *cli.Float64Flag) *Float64Flag + NewFloat64Flag creates a new Float64Flag + +func (f *Float64Flag) Apply(set *flag.FlagSet) error + Apply saves the flagSet for later usage calls, then calls the wrapped + Float64Flag.Apply + +func (f *Float64Flag) ApplyInputSourceValue(cCtx *cli.Context, isc InputSourceContext) error + ApplyInputSourceValue applies a Float64 value to the flagSet if required + +type Float64SliceFlag struct { + *cli.Float64SliceFlag + // Has unexported fields. +} + Float64SliceFlag is the flag type that wraps cli.Float64SliceFlag to allow + for other values to be specified + +func NewFloat64SliceFlag(fl *cli.Float64SliceFlag) *Float64SliceFlag + NewFloat64SliceFlag creates a new Float64SliceFlag + +func (f *Float64SliceFlag) Apply(set *flag.FlagSet) error + Apply saves the flagSet for later usage calls, then calls the wrapped + Float64SliceFlag.Apply + +func (f *Float64SliceFlag) ApplyInputSourceValue(cCtx *cli.Context, isc InputSourceContext) error + ApplyInputSourceValue applies a Float64Slice value if required + +type GenericFlag struct { + *cli.GenericFlag + // Has unexported fields. +} + GenericFlag is the flag type that wraps cli.GenericFlag to allow for other + values to be specified + +func NewGenericFlag(fl *cli.GenericFlag) *GenericFlag + NewGenericFlag creates a new GenericFlag + +func (f *GenericFlag) Apply(set *flag.FlagSet) error + Apply saves the flagSet for later usage calls, then calls the wrapped + GenericFlag.Apply + +func (f *GenericFlag) ApplyInputSourceValue(cCtx *cli.Context, isc InputSourceContext) error + ApplyInputSourceValue applies a generic value to the flagSet if required + +type InputSourceContext interface { + Source() string + + Int(name string) (int, error) + Int64(name string) (int64, error) + Uint(name string) (uint, error) + Uint64(name string) (uint64, error) + Duration(name string) (time.Duration, error) + Float64(name string) (float64, error) + String(name string) (string, error) + StringSlice(name string) ([]string, error) + IntSlice(name string) ([]int, error) + Int64Slice(name string) ([]int64, error) + Float64Slice(name string) ([]float64, error) + Generic(name string) (cli.Generic, error) + Bool(name string) (bool, error) + + // Has unexported methods. +} + InputSourceContext is an interface used to allow other input sources to be + implemented as needed. + + Source returns an identifier for the input source. In case of file source it + should return path to the file. + +func NewJSONSource(data []byte) (InputSourceContext, error) + NewJSONSource returns an InputSourceContext suitable for retrieving config + variables from raw JSON data. + +func NewJSONSourceFromFile(f string) (InputSourceContext, error) + NewJSONSourceFromFile returns an InputSourceContext suitable for retrieving + config variables from a file (or url) containing JSON data. + +func NewJSONSourceFromReader(r io.Reader) (InputSourceContext, error) + NewJSONSourceFromReader returns an InputSourceContext suitable for + retrieving config variables from an io.Reader that returns JSON data. + +func NewTomlSourceFromFile(file string) (InputSourceContext, error) + NewTomlSourceFromFile creates a new TOML InputSourceContext from a filepath. + +func NewYamlSourceFromFile(file string) (InputSourceContext, error) + NewYamlSourceFromFile creates a new Yaml InputSourceContext from a filepath. + +type Int64Flag struct { + *cli.Int64Flag + // Has unexported fields. +} + Int64Flag is the flag type that wraps cli.Int64Flag to allow for other + values to be specified + +func NewInt64Flag(fl *cli.Int64Flag) *Int64Flag + NewInt64Flag creates a new Int64Flag + +func (f *Int64Flag) Apply(set *flag.FlagSet) error + Apply saves the flagSet for later usage calls, then calls the wrapped + Int64Flag.Apply + +func (f *Int64Flag) ApplyInputSourceValue(cCtx *cli.Context, isc InputSourceContext) error + +type Int64SliceFlag struct { + *cli.Int64SliceFlag + // Has unexported fields. +} + Int64SliceFlag is the flag type that wraps cli.Int64SliceFlag to allow for + other values to be specified + +func NewInt64SliceFlag(fl *cli.Int64SliceFlag) *Int64SliceFlag + NewInt64SliceFlag creates a new Int64SliceFlag + +func (f *Int64SliceFlag) Apply(set *flag.FlagSet) error + Apply saves the flagSet for later usage calls, then calls the wrapped + Int64SliceFlag.Apply + +func (f *Int64SliceFlag) ApplyInputSourceValue(cCtx *cli.Context, isc InputSourceContext) error + ApplyInputSourceValue applies a Int64Slice value if required + +type IntFlag struct { + *cli.IntFlag + // Has unexported fields. +} + IntFlag is the flag type that wraps cli.IntFlag to allow for other values to + be specified + +func NewIntFlag(fl *cli.IntFlag) *IntFlag + NewIntFlag creates a new IntFlag + +func (f *IntFlag) Apply(set *flag.FlagSet) error + Apply saves the flagSet for later usage calls, then calls the wrapped + IntFlag.Apply + +func (f *IntFlag) ApplyInputSourceValue(cCtx *cli.Context, isc InputSourceContext) error + ApplyInputSourceValue applies a int value to the flagSet if required + +type IntSliceFlag struct { + *cli.IntSliceFlag + // Has unexported fields. +} + IntSliceFlag is the flag type that wraps cli.IntSliceFlag to allow for other + values to be specified + +func NewIntSliceFlag(fl *cli.IntSliceFlag) *IntSliceFlag + NewIntSliceFlag creates a new IntSliceFlag + +func (f *IntSliceFlag) Apply(set *flag.FlagSet) error + Apply saves the flagSet for later usage calls, then calls the wrapped + IntSliceFlag.Apply + +func (f *IntSliceFlag) ApplyInputSourceValue(cCtx *cli.Context, isc InputSourceContext) error + ApplyInputSourceValue applies a IntSlice value if required + +type MapInputSource struct { + // Has unexported fields. +} + MapInputSource implements InputSourceContext to return data from the map + that is loaded. + +func NewMapInputSource(file string, valueMap map[interface{}]interface{}) *MapInputSource + NewMapInputSource creates a new MapInputSource for implementing custom input + sources. + +func (fsm *MapInputSource) Bool(name string) (bool, error) + Bool returns an bool from the map otherwise returns false + +func (fsm *MapInputSource) Duration(name string) (time.Duration, error) + Duration returns a duration from the map if it exists otherwise returns 0 + +func (fsm *MapInputSource) Float64(name string) (float64, error) + Float64 returns an float64 from the map if it exists otherwise returns 0 + +func (fsm *MapInputSource) Float64Slice(name string) ([]float64, error) + Float64Slice returns an []float64 from the map if it exists otherwise + returns nil + +func (fsm *MapInputSource) Generic(name string) (cli.Generic, error) + Generic returns an cli.Generic from the map if it exists otherwise returns + nil + +func (fsm *MapInputSource) Int(name string) (int, error) + Int returns an int from the map if it exists otherwise returns 0 + +func (fsm *MapInputSource) Int64(name string) (int64, error) + Int64 returns an int64 from the map if it exists otherwise returns 0 + +func (fsm *MapInputSource) Int64Slice(name string) ([]int64, error) + Int64Slice returns an []int64 from the map if it exists otherwise returns + nil + +func (fsm *MapInputSource) IntSlice(name string) ([]int, error) + IntSlice returns an []int from the map if it exists otherwise returns nil + +func (fsm *MapInputSource) Source() string + Source returns the path of the source file + +func (fsm *MapInputSource) String(name string) (string, error) + String returns a string from the map if it exists otherwise returns an empty + string + +func (fsm *MapInputSource) StringSlice(name string) ([]string, error) + StringSlice returns an []string from the map if it exists otherwise returns + nil + +func (fsm *MapInputSource) Uint(name string) (uint, error) + Int64 returns an int64 from the map if it exists otherwise returns 0 + +func (fsm *MapInputSource) Uint64(name string) (uint64, error) + UInt64 returns an uint64 from the map if it exists otherwise returns 0 + +type PathFlag struct { + *cli.PathFlag + // Has unexported fields. +} + PathFlag is the flag type that wraps cli.PathFlag to allow for other values + to be specified + +func NewPathFlag(fl *cli.PathFlag) *PathFlag + NewPathFlag creates a new PathFlag + +func (f *PathFlag) Apply(set *flag.FlagSet) error + Apply saves the flagSet for later usage calls, then calls the wrapped + PathFlag.Apply + +func (f *PathFlag) ApplyInputSourceValue(cCtx *cli.Context, isc InputSourceContext) error + ApplyInputSourceValue applies a Path value to the flagSet if required + +type StringFlag struct { + *cli.StringFlag + // Has unexported fields. +} + StringFlag is the flag type that wraps cli.StringFlag to allow for other + values to be specified + +func NewStringFlag(fl *cli.StringFlag) *StringFlag + NewStringFlag creates a new StringFlag + +func (f *StringFlag) Apply(set *flag.FlagSet) error + Apply saves the flagSet for later usage calls, then calls the wrapped + StringFlag.Apply + +func (f *StringFlag) ApplyInputSourceValue(cCtx *cli.Context, isc InputSourceContext) error + ApplyInputSourceValue applies a String value to the flagSet if required + +type StringSliceFlag struct { + *cli.StringSliceFlag + // Has unexported fields. +} + StringSliceFlag is the flag type that wraps cli.StringSliceFlag to allow for + other values to be specified + +func NewStringSliceFlag(fl *cli.StringSliceFlag) *StringSliceFlag + NewStringSliceFlag creates a new StringSliceFlag + +func (f *StringSliceFlag) Apply(set *flag.FlagSet) error + Apply saves the flagSet for later usage calls, then calls the wrapped + StringSliceFlag.Apply + +func (f *StringSliceFlag) ApplyInputSourceValue(cCtx *cli.Context, isc InputSourceContext) error + ApplyInputSourceValue applies a StringSlice value to the flagSet if required + +type Uint64Flag struct { + *cli.Uint64Flag + // Has unexported fields. +} + Uint64Flag is the flag type that wraps cli.Uint64Flag to allow for other + values to be specified + +func NewUint64Flag(fl *cli.Uint64Flag) *Uint64Flag + NewUint64Flag creates a new Uint64Flag + +func (f *Uint64Flag) Apply(set *flag.FlagSet) error + Apply saves the flagSet for later usage calls, then calls the wrapped + Uint64Flag.Apply + +func (f *Uint64Flag) ApplyInputSourceValue(cCtx *cli.Context, isc InputSourceContext) error + +type UintFlag struct { + *cli.UintFlag + // Has unexported fields. +} + UintFlag is the flag type that wraps cli.UintFlag to allow for other values + to be specified + +func NewUintFlag(fl *cli.UintFlag) *UintFlag + NewUintFlag creates a new UintFlag + +func (f *UintFlag) Apply(set *flag.FlagSet) error + Apply saves the flagSet for later usage calls, then calls the wrapped + UintFlag.Apply + +func (f *UintFlag) ApplyInputSourceValue(cCtx *cli.Context, isc InputSourceContext) error + diff --git a/vendor/github.com/urfave/cli/v2/help.go b/vendor/github.com/urfave/cli/v2/help.go index c1e974a48..640e29045 100644 --- a/vendor/github.com/urfave/cli/v2/help.go +++ b/vendor/github.com/urfave/cli/v2/help.go @@ -10,34 +10,77 @@ import ( "unicode/utf8" ) -var helpCommand = &Command{ - Name: "help", - Aliases: []string{"h"}, +const ( + helpName = "help" + helpAlias = "h" +) + +// this instance is to avoid recursion in the ShowCommandHelp which can +// add a help command again +var helpCommandDontUse = &Command{ + Name: helpName, + Aliases: []string{helpAlias}, Usage: "Shows a list of commands or help for one command", ArgsUsage: "[command]", - Action: func(c *Context) error { - args := c.Args() - if args.Present() { - return ShowCommandHelp(c, args.First()) - } - - _ = ShowAppHelp(c) - return nil - }, } -var helpSubcommand = &Command{ - Name: "help", - Aliases: []string{"h"}, +var helpCommand = &Command{ + Name: helpName, + Aliases: []string{helpAlias}, Usage: "Shows a list of commands or help for one command", ArgsUsage: "[command]", - Action: func(c *Context) error { - args := c.Args() - if args.Present() { - return ShowCommandHelp(c, args.First()) + Action: func(cCtx *Context) error { + args := cCtx.Args() + argsPresent := args.First() != "" + firstArg := args.First() + + // This action can be triggered by a "default" action of a command + // or via cmd.Run when cmd == helpCmd. So we have following possibilities + // + // 1 $ app + // 2 $ app help + // 3 $ app foo + // 4 $ app help foo + // 5 $ app foo help + // 6 $ app foo -h (with no other sub-commands nor flags defined) + + // Case 4. when executing a help command set the context to parent + // to allow resolution of subsequent args. This will transform + // $ app help foo + // to + // $ app foo + // which will then be handled as case 3 + if cCtx.Command.Name == helpName || cCtx.Command.Name == helpAlias { + cCtx = cCtx.parentContext + } + + // Case 4. $ app hello foo + // foo is the command for which help needs to be shown + if argsPresent { + return ShowCommandHelp(cCtx, firstArg) } - return ShowSubcommandHelp(c) + // Case 1 & 2 + // Special case when running help on main app itself as opposed to individual + // commands/subcommands + if cCtx.parentContext.App == nil { + _ = ShowAppHelp(cCtx) + return nil + } + + // Case 3, 5 + if (len(cCtx.Command.Subcommands) == 1 && !cCtx.Command.HideHelp && !cCtx.Command.HideHelpCommand) || + (len(cCtx.Command.Subcommands) == 0 && cCtx.Command.HideHelp) { + templ := cCtx.Command.CustomHelpTemplate + if templ == "" { + templ = CommandHelpTemplate + } + HelpPrinter(cCtx.App.Writer, templ, cCtx.Command) + return nil + } + + // Case 6, handling incorporated in the callee itself + return ShowSubcommandHelp(cCtx) }, } @@ -59,6 +102,11 @@ var HelpPrinter helpPrinter = printHelp // HelpPrinterCustom is a function that writes the help output. It is used as // the default implementation of HelpPrinter, and may be called directly if // the ExtraInfo field is set on an App. +// +// In the default implementation, if the customFuncs argument contains a +// "wrapAt" key, which is a function which takes no arguments and returns +// an int, this int value will be used to produce a "wrap" function used +// by the default template to wrap long lines. var HelpPrinterCustom helpPrinterCustom = printHelpCustom // VersionPrinter prints the version for the App @@ -71,30 +119,30 @@ func ShowAppHelpAndExit(c *Context, exitCode int) { } // ShowAppHelp is an action that displays the help. -func ShowAppHelp(c *Context) error { - template := c.App.CustomAppHelpTemplate - if template == "" { - template = AppHelpTemplate +func ShowAppHelp(cCtx *Context) error { + tpl := cCtx.App.CustomAppHelpTemplate + if tpl == "" { + tpl = AppHelpTemplate } - if c.App.ExtraInfo == nil { - HelpPrinter(c.App.Writer, template, c.App) + if cCtx.App.ExtraInfo == nil { + HelpPrinter(cCtx.App.Writer, tpl, cCtx.App) return nil } customAppData := func() map[string]interface{} { return map[string]interface{}{ - "ExtraInfo": c.App.ExtraInfo, + "ExtraInfo": cCtx.App.ExtraInfo, } } - HelpPrinterCustom(c.App.Writer, template, c.App, customAppData()) + HelpPrinterCustom(cCtx.App.Writer, tpl, cCtx.App, customAppData()) return nil } // DefaultAppComplete prints the list of subcommands as the default app completion method -func DefaultAppComplete(c *Context) { - DefaultCompleteWithFlags(nil)(c) +func DefaultAppComplete(cCtx *Context) { + DefaultCompleteWithFlags(nil)(cCtx) } func printCommandSuggestions(commands []*Command, writer io.Writer) { @@ -102,7 +150,7 @@ func printCommandSuggestions(commands []*Command, writer io.Writer) { if command.Hidden { continue } - if os.Getenv("_CLI_ZSH_AUTOCOMPLETE_HACK") == "1" { + if strings.HasSuffix(os.Getenv("SHELL"), "zsh") { for _, name := range command.Names() { _, _ = fmt.Fprintf(writer, "%s:%s\n", name, command.Usage) } @@ -143,7 +191,7 @@ func printFlagSuggestions(lastArg string, flags []Flag, writer io.Writer) { // this will get total count utf8 letters in flag name count := utf8.RuneCountInString(name) if count > 2 { - count = 2 // resuse this count to generate single - or -- in flag completion + count = 2 // reuse this count to generate single - or -- in flag completion } // if flag name has more than one utf8 letter and last argument in cli has -- prefix then // skip flag completion for short flags example -v or -x @@ -159,23 +207,36 @@ func printFlagSuggestions(lastArg string, flags []Flag, writer io.Writer) { } } -func DefaultCompleteWithFlags(cmd *Command) func(c *Context) { - return func(c *Context) { +func DefaultCompleteWithFlags(cmd *Command) func(cCtx *Context) { + return func(cCtx *Context) { + var lastArg string + + // TODO: This shouldnt depend on os.Args rather it should + // depend on root arguments passed to App if len(os.Args) > 2 { - lastArg := os.Args[len(os.Args)-2] + lastArg = os.Args[len(os.Args)-2] + } + + if lastArg != "" { if strings.HasPrefix(lastArg, "-") { - printFlagSuggestions(lastArg, c.App.Flags, c.App.Writer) if cmd != nil { - printFlagSuggestions(lastArg, cmd.Flags, c.App.Writer) + printFlagSuggestions(lastArg, cmd.Flags, cCtx.App.Writer) + + return } + + printFlagSuggestions(lastArg, cCtx.App.Flags, cCtx.App.Writer) + return } } + if cmd != nil { - printCommandSuggestions(cmd.Subcommands, c.App.Writer) - } else { - printCommandSuggestions(c.App.Commands, c.App.Writer) + printCommandSuggestions(cmd.Subcommands, cCtx.App.Writer) + return } + + printCommandSuggestions(cCtx.Command.Subcommands, cCtx.App.Writer) } } @@ -187,17 +248,26 @@ func ShowCommandHelpAndExit(c *Context, command string, code int) { // ShowCommandHelp prints help for the given command func ShowCommandHelp(ctx *Context, command string) error { - // show the subcommand help for a command with subcommands - if command == "" { - HelpPrinter(ctx.App.Writer, SubcommandHelpTemplate, ctx.App) - return nil - } - for _, c := range ctx.App.Commands { + commands := ctx.App.Commands + if ctx.Command.Subcommands != nil { + commands = ctx.Command.Subcommands + } + for _, c := range commands { if c.HasName(command) { + if !ctx.App.HideHelpCommand && !c.HasName(helpName) && len(c.Subcommands) != 0 && c.Command(helpName) == nil { + c.Subcommands = append(c.Subcommands, helpCommandDontUse) + } + if !ctx.App.HideHelp && HelpFlag != nil { + c.appendFlag(HelpFlag) + } templ := c.CustomHelpTemplate if templ == "" { - templ = CommandHelpTemplate + if len(c.Subcommands) == 0 { + templ = CommandHelpTemplate + } else { + templ = SubcommandHelpTemplate + } } HelpPrinter(ctx.App.Writer, templ, c) @@ -207,46 +277,59 @@ func ShowCommandHelp(ctx *Context, command string) error { } if ctx.App.CommandNotFound == nil { - return Exit(fmt.Sprintf("No help topic for '%v'", command), 3) + errMsg := fmt.Sprintf("No help topic for '%v'", command) + if ctx.App.Suggest && SuggestCommand != nil { + if suggestion := SuggestCommand(ctx.Command.Subcommands, command); suggestion != "" { + errMsg += ". " + suggestion + } + } + return Exit(errMsg, 3) } ctx.App.CommandNotFound(ctx, command) return nil } +// ShowSubcommandHelpAndExit - Prints help for the given subcommand and exits with exit code. +func ShowSubcommandHelpAndExit(c *Context, exitCode int) { + _ = ShowSubcommandHelp(c) + os.Exit(exitCode) +} + // ShowSubcommandHelp prints help for the given subcommand -func ShowSubcommandHelp(c *Context) error { - if c == nil { +func ShowSubcommandHelp(cCtx *Context) error { + if cCtx == nil { return nil } - - if c.Command != nil { - return ShowCommandHelp(c, c.Command.Name) + // use custom template when provided (fixes #1703) + templ := SubcommandHelpTemplate + if cCtx.Command != nil && cCtx.Command.CustomHelpTemplate != "" { + templ = cCtx.Command.CustomHelpTemplate } - - return ShowCommandHelp(c, "") + HelpPrinter(cCtx.App.Writer, templ, cCtx.Command) + return nil } // ShowVersion prints the version number of the App -func ShowVersion(c *Context) { - VersionPrinter(c) +func ShowVersion(cCtx *Context) { + VersionPrinter(cCtx) } -func printVersion(c *Context) { - _, _ = fmt.Fprintf(c.App.Writer, "%v version %v\n", c.App.Name, c.App.Version) +func printVersion(cCtx *Context) { + _, _ = fmt.Fprintf(cCtx.App.Writer, "%v version %v\n", cCtx.App.Name, cCtx.App.Version) } // ShowCompletions prints the lists of commands within a given context -func ShowCompletions(c *Context) { - a := c.App - if a != nil && a.BashComplete != nil { - a.BashComplete(c) +func ShowCompletions(cCtx *Context) { + c := cCtx.Command + if c != nil && c.BashComplete != nil { + c.BashComplete(cCtx) } } // ShowCommandCompletions prints the custom completions for a given command func ShowCommandCompletions(ctx *Context, command string) { - c := ctx.App.Command(command) + c := ctx.Command.Command(command) if c != nil { if c.BashComplete != nil { c.BashComplete(ctx) @@ -262,15 +345,57 @@ func ShowCommandCompletions(ctx *Context, command string) { // The customFuncs map will be combined with a default template.FuncMap to // allow using arbitrary functions in template rendering. func printHelpCustom(out io.Writer, templ string, data interface{}, customFuncs map[string]interface{}) { + + const maxLineLength = 10000 + funcMap := template.FuncMap{ - "join": strings.Join, + "join": strings.Join, + "subtract": subtract, + "indent": indent, + "nindent": nindent, + "trim": strings.TrimSpace, + "wrap": func(input string, offset int) string { return wrap(input, offset, maxLineLength) }, + "offset": offset, + "offsetCommands": offsetCommands, } + + if customFuncs["wrapAt"] != nil { + if wa, ok := customFuncs["wrapAt"]; ok { + if waf, ok := wa.(func() int); ok { + wrapAt := waf() + customFuncs["wrap"] = func(input string, offset int) string { + return wrap(input, offset, wrapAt) + } + } + } + } + for key, value := range customFuncs { funcMap[key] = value } w := tabwriter.NewWriter(out, 1, 8, 2, ' ', 0) t := template.Must(template.New("help").Funcs(funcMap).Parse(templ)) + templates := map[string]string{ + "helpNameTemplate": helpNameTemplate, + "usageTemplate": usageTemplate, + "descriptionTemplate": descriptionTemplate, + "visibleCommandTemplate": visibleCommandTemplate, + "copyrightTemplate": copyrightTemplate, + "versionTemplate": versionTemplate, + "visibleFlagCategoryTemplate": visibleFlagCategoryTemplate, + "visibleFlagTemplate": visibleFlagTemplate, + "visibleGlobalFlagCategoryTemplate": strings.Replace(visibleFlagCategoryTemplate, "OPTIONS", "GLOBAL OPTIONS", -1), + "authorsTemplate": authorsTemplate, + "visibleCommandCategoryTemplate": visibleCommandCategoryTemplate, + } + for name, value := range templates { + if _, err := t.New(name).Parse(value); err != nil { + if os.Getenv("CLI_TEMPLATE_ERROR_DEBUG") != "" { + _, _ = fmt.Fprintf(ErrWriter, "CLI TEMPLATE ERROR: %#v\n", err) + } + } + } err := t.Execute(w, data) if err != nil { @@ -288,42 +413,29 @@ func printHelp(out io.Writer, templ string, data interface{}) { HelpPrinterCustom(out, templ, data, nil) } -func checkVersion(c *Context) bool { +func checkVersion(cCtx *Context) bool { found := false for _, name := range VersionFlag.Names() { - if c.Bool(name) { + if cCtx.Bool(name) { found = true } } return found } -func checkHelp(c *Context) bool { +func checkHelp(cCtx *Context) bool { + if HelpFlag == nil { + return false + } found := false for _, name := range HelpFlag.Names() { - if c.Bool(name) { + if cCtx.Bool(name) { found = true + break } } - return found -} - -func checkCommandHelp(c *Context, name string) bool { - if c.Bool("h") || c.Bool("help") { - _ = ShowCommandHelp(c, name) - return true - } - - return false -} - -func checkSubcommandHelp(c *Context) bool { - if c.Bool("h") || c.Bool("help") { - _ = ShowSubcommandHelp(c) - return true - } - return false + return found } func checkShellCompleteFlag(a *App, arguments []string) (bool, []string) { @@ -341,28 +453,112 @@ func checkShellCompleteFlag(a *App, arguments []string) (bool, []string) { return true, arguments[:pos] } -func checkCompletions(c *Context) bool { - if !c.shellComplete { +func checkCompletions(cCtx *Context) bool { + if !cCtx.shellComplete { return false } - if args := c.Args(); args.Present() { + if args := cCtx.Args(); args.Present() { name := args.First() - if cmd := c.App.Command(name); cmd != nil { + if cmd := cCtx.Command.Command(name); cmd != nil { // let the command handle the completion return false } } - ShowCompletions(c) + ShowCompletions(cCtx) return true } -func checkCommandCompletions(c *Context, name string) bool { - if !c.shellComplete { - return false +func subtract(a, b int) int { + return a - b +} + +func indent(spaces int, v string) string { + pad := strings.Repeat(" ", spaces) + return pad + strings.Replace(v, "\n", "\n"+pad, -1) +} + +func nindent(spaces int, v string) string { + return "\n" + indent(spaces, v) +} + +func wrap(input string, offset int, wrapAt int) string { + var ss []string + + lines := strings.Split(input, "\n") + + padding := strings.Repeat(" ", offset) + + for i, line := range lines { + if line == "" { + ss = append(ss, line) + } else { + wrapped := wrapLine(line, offset, wrapAt, padding) + if i == 0 { + ss = append(ss, wrapped) + } else { + ss = append(ss, padding+wrapped) + + } + + } } - ShowCommandCompletions(c, name) - return true + return strings.Join(ss, "\n") +} + +func wrapLine(input string, offset int, wrapAt int, padding string) string { + if wrapAt <= offset || len(input) <= wrapAt-offset { + return input + } + + lineWidth := wrapAt - offset + words := strings.Fields(input) + if len(words) == 0 { + return input + } + + wrapped := words[0] + spaceLeft := lineWidth - len(wrapped) + for _, word := range words[1:] { + if len(word)+1 > spaceLeft { + wrapped += "\n" + padding + word + spaceLeft = lineWidth - len(word) + } else { + wrapped += " " + word + spaceLeft -= 1 + len(word) + } + } + + return wrapped +} + +func offset(input string, fixed int) int { + return len(input) + fixed +} + +// this function tries to find the max width of the names column +// so say we have the following rows for help +// +// foo1, foo2, foo3 some string here +// bar1, b2 some other string here +// +// We want to offset the 2nd row usage by some amount so that everything +// is aligned +// +// foo1, foo2, foo3 some string here +// bar1, b2 some other string here +// +// to find that offset we find the length of all the rows and use the max +// to calculate the offset +func offsetCommands(cmds []*Command, fixed int) int { + var max int = 0 + for _, cmd := range cmds { + s := strings.Join(cmd.Names(), ", ") + if len(s) > max { + max = len(s) + } + } + return max + fixed } diff --git a/vendor/github.com/urfave/cli/v2/mkdocs-reqs.txt b/vendor/github.com/urfave/cli/v2/mkdocs-reqs.txt new file mode 100644 index 000000000..482ad0622 --- /dev/null +++ b/vendor/github.com/urfave/cli/v2/mkdocs-reqs.txt @@ -0,0 +1,5 @@ +mkdocs-git-revision-date-localized-plugin~=1.0 +mkdocs-material-extensions~=1.0 +mkdocs-material~=8.2 +mkdocs~=1.3 +pygments~=2.12 diff --git a/vendor/github.com/urfave/cli/v2/mkdocs.yml b/vendor/github.com/urfave/cli/v2/mkdocs.yml new file mode 100644 index 000000000..f7bfd419e --- /dev/null +++ b/vendor/github.com/urfave/cli/v2/mkdocs.yml @@ -0,0 +1,107 @@ +# NOTE: the mkdocs dependencies will need to be installed out of +# band until this whole thing gets more automated: +# +# pip install -r mkdocs-reqs.txt +# + +site_name: urfave/cli +site_url: https://cli.urfave.org/ +repo_url: https://github.com/urfave/cli +edit_uri: edit/main/docs/ +nav: + - Home: + - Welcome: index.md + - Contributing: CONTRIBUTING.md + - Code of Conduct: CODE_OF_CONDUCT.md + - Releasing: RELEASING.md + - Security: SECURITY.md + - Migrate v1 to v2: migrate-v1-to-v2.md + - v2 Manual: + - Getting Started: v2/getting-started.md + - Migrating From Older Releases: v2/migrating-from-older-releases.md + - Examples: + - Greet: v2/examples/greet.md + - Arguments: v2/examples/arguments.md + - Flags: v2/examples/flags.md + - Subcommands: v2/examples/subcommands.md + - Subcommands Categories: v2/examples/subcommands-categories.md + - Exit Codes: v2/examples/exit-codes.md + - Combining Short Options: v2/examples/combining-short-options.md + - Bash Completions: v2/examples/bash-completions.md + - Generated Help Text: v2/examples/generated-help-text.md + - Version Flag: v2/examples/version-flag.md + - Timestamp Flag: v2/examples/timestamp-flag.md + - Suggestions: v2/examples/suggestions.md + - Full API Example: v2/examples/full-api-example.md + - v1 Manual: + - Getting Started: v1/getting-started.md + - Migrating to v2: v1/migrating-to-v2.md + - Examples: + - Greet: v1/examples/greet.md + - Arguments: v1/examples/arguments.md + - Flags: v1/examples/flags.md + - Subcommands: v1/examples/subcommands.md + - Subcommands (Categories): v1/examples/subcommands-categories.md + - Exit Codes: v1/examples/exit-codes.md + - Combining Short Options: v1/examples/combining-short-options.md + - Bash Completions: v1/examples/bash-completions.md + - Generated Help Text: v1/examples/generated-help-text.md + - Version Flag: v1/examples/version-flag.md + +theme: + name: material + palette: + - media: "(prefers-color-scheme: light)" + scheme: default + toggle: + icon: material/brightness-4 + name: dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + toggle: + icon: material/brightness-7 + name: light mode + features: + - content.code.annotate + - navigation.top + - navigation.instant + - navigation.expand + - navigation.sections + - navigation.tabs + - navigation.tabs.sticky +plugins: + - git-revision-date-localized + - search + - tags +# NOTE: this is the recommended configuration from +# https://squidfunk.github.io/mkdocs-material/setup/extensions/#recommended-configuration +markdown_extensions: + - abbr + - admonition + - attr_list + - def_list + - footnotes + - meta + - md_in_html + - toc: + permalink: true + - pymdownx.arithmatex: + generic: true + - pymdownx.betterem: + smart_enable: all + - pymdownx.caret + - pymdownx.details + - pymdownx.emoji: + emoji_index: !!python/name:materialx.emoji.twemoji + emoji_generator: !!python/name:materialx.emoji.to_svg + - pymdownx.highlight + - pymdownx.inlinehilite + - pymdownx.keys + - pymdownx.mark + - pymdownx.smartsymbols + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - pymdownx.tasklist: + custom_checkbox: true + - pymdownx.tilde diff --git a/vendor/github.com/urfave/cli/v2/parse.go b/vendor/github.com/urfave/cli/v2/parse.go index 7df17296a..d79f15a18 100644 --- a/vendor/github.com/urfave/cli/v2/parse.go +++ b/vendor/github.com/urfave/cli/v2/parse.go @@ -26,9 +26,8 @@ func parseIter(set *flag.FlagSet, ip iterativeParser, args []string, shellComple return err } - errStr := err.Error() - trimmed := strings.TrimPrefix(errStr, "flag provided but not defined: -") - if errStr == trimmed { + trimmed, trimErr := flagFromError(err) + if trimErr != nil { return err } @@ -47,7 +46,10 @@ func parseIter(set *flag.FlagSet, ip iterativeParser, args []string, shellComple } // swap current argument with the split version - args = append(args[:i], append(shortOpts, args[i+1:]...)...) + // do not include args that parsed correctly so far as it would + // trigger Value.Set() on those args and would result in + // duplicates for slice type flags + args = append(shortOpts, args[i+1:]...) argsWereSplit = true break } @@ -57,14 +59,20 @@ func parseIter(set *flag.FlagSet, ip iterativeParser, args []string, shellComple if !argsWereSplit { return err } + } +} - // Since custom parsing failed, replace the flag set before retrying - newSet, err := ip.newFlagSet() - if err != nil { - return err - } - *set = *newSet +const providedButNotDefinedErrMsg = "flag provided but not defined: -" + +// flagFromError tries to parse a provided flag from an error message. If the +// parsing fials, it returns the input error and an empty string +func flagFromError(err error) (string, error) { + errStr := err.Error() + trimmed := strings.TrimPrefix(errStr, providedButNotDefinedErrMsg) + if errStr == trimmed { + return "", err } + return trimmed, nil } func splitShortOptions(set *flag.FlagSet, arg string) []string { diff --git a/vendor/github.com/urfave/cli/v2/sliceflag.go b/vendor/github.com/urfave/cli/v2/sliceflag.go new file mode 100644 index 000000000..b2ca59041 --- /dev/null +++ b/vendor/github.com/urfave/cli/v2/sliceflag.go @@ -0,0 +1,290 @@ +package cli + +import ( + "flag" + "reflect" +) + +type ( + // SliceFlag extends implementations like StringSliceFlag and IntSliceFlag with support for using slices directly, + // as Value and/or Destination. + // See also SliceFlagTarget, MultiStringFlag, MultiFloat64Flag, MultiInt64Flag, MultiIntFlag. + SliceFlag[T SliceFlagTarget[E], S ~[]E, E any] struct { + Target T + Value S + Destination *S + } + + // SliceFlagTarget models a target implementation for use with SliceFlag. + // The three methods, SetValue, SetDestination, and GetDestination, are necessary to propagate Value and + // Destination, where Value is propagated inwards (initially), and Destination is propagated outwards (on every + // update). + SliceFlagTarget[E any] interface { + Flag + RequiredFlag + DocGenerationFlag + VisibleFlag + CategorizableFlag + + // SetValue should propagate the given slice to the target, ideally as a new value. + // Note that a nil slice should nil/clear any existing value (modelled as ~[]E). + SetValue(slice []E) + // SetDestination should propagate the given slice to the target, ideally as a new value. + // Note that a nil slice should nil/clear any existing value (modelled as ~*[]E). + SetDestination(slice []E) + // GetDestination should return the current value referenced by any destination, or nil if nil/unset. + GetDestination() []E + } + + // MultiStringFlag extends StringSliceFlag with support for using slices directly, as Value and/or Destination. + // See also SliceFlag. + MultiStringFlag = SliceFlag[*StringSliceFlag, []string, string] + + // MultiFloat64Flag extends Float64SliceFlag with support for using slices directly, as Value and/or Destination. + // See also SliceFlag. + MultiFloat64Flag = SliceFlag[*Float64SliceFlag, []float64, float64] + + // MultiInt64Flag extends Int64SliceFlag with support for using slices directly, as Value and/or Destination. + // See also SliceFlag. + MultiInt64Flag = SliceFlag[*Int64SliceFlag, []int64, int64] + + // MultiIntFlag extends IntSliceFlag with support for using slices directly, as Value and/or Destination. + // See also SliceFlag. + MultiIntFlag = SliceFlag[*IntSliceFlag, []int, int] + + flagValueHook struct { + value Generic + hook func() + } +) + +var ( + // compile time assertions + + _ SliceFlagTarget[string] = (*StringSliceFlag)(nil) + _ SliceFlagTarget[string] = (*SliceFlag[*StringSliceFlag, []string, string])(nil) + _ SliceFlagTarget[string] = (*MultiStringFlag)(nil) + _ SliceFlagTarget[float64] = (*MultiFloat64Flag)(nil) + _ SliceFlagTarget[int64] = (*MultiInt64Flag)(nil) + _ SliceFlagTarget[int] = (*MultiIntFlag)(nil) + + _ Generic = (*flagValueHook)(nil) + _ Serializer = (*flagValueHook)(nil) +) + +func (x *SliceFlag[T, S, E]) Apply(set *flag.FlagSet) error { + x.Target.SetValue(x.convertSlice(x.Value)) + + destination := x.Destination + if destination == nil { + x.Target.SetDestination(nil) + + return x.Target.Apply(set) + } + + x.Target.SetDestination(x.convertSlice(*destination)) + + return applyFlagValueHook(set, x.Target.Apply, func() { + *destination = x.Target.GetDestination() + }) +} + +func (x *SliceFlag[T, S, E]) convertSlice(slice S) []E { + result := make([]E, len(slice)) + copy(result, slice) + return result +} + +func (x *SliceFlag[T, S, E]) SetValue(slice S) { + x.Value = slice +} + +func (x *SliceFlag[T, S, E]) SetDestination(slice S) { + if slice != nil { + x.Destination = &slice + } else { + x.Destination = nil + } +} + +func (x *SliceFlag[T, S, E]) GetDestination() S { + if destination := x.Destination; destination != nil { + return *destination + } + return nil +} + +func (x *SliceFlag[T, S, E]) String() string { return x.Target.String() } +func (x *SliceFlag[T, S, E]) Names() []string { return x.Target.Names() } +func (x *SliceFlag[T, S, E]) IsSet() bool { return x.Target.IsSet() } +func (x *SliceFlag[T, S, E]) IsRequired() bool { return x.Target.IsRequired() } +func (x *SliceFlag[T, S, E]) TakesValue() bool { return x.Target.TakesValue() } +func (x *SliceFlag[T, S, E]) GetUsage() string { return x.Target.GetUsage() } +func (x *SliceFlag[T, S, E]) GetValue() string { return x.Target.GetValue() } +func (x *SliceFlag[T, S, E]) GetDefaultText() string { return x.Target.GetDefaultText() } +func (x *SliceFlag[T, S, E]) GetEnvVars() []string { return x.Target.GetEnvVars() } +func (x *SliceFlag[T, S, E]) IsVisible() bool { return x.Target.IsVisible() } +func (x *SliceFlag[T, S, E]) GetCategory() string { return x.Target.GetCategory() } + +func (x *flagValueHook) Set(value string) error { + if err := x.value.Set(value); err != nil { + return err + } + x.hook() + return nil +} + +func (x *flagValueHook) String() string { + // note: this is necessary due to the way Go's flag package handles defaults + isZeroValue := func(f flag.Value, v string) bool { + /* + https://cs.opensource.google/go/go/+/refs/tags/go1.18.3:src/flag/flag.go;drc=2580d0e08d5e9f979b943758d3c49877fb2324cb;l=453 + + Copyright (c) 2009 The Go Authors. All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + // Build a zero value of the flag's Value type, and see if the + // result of calling its String method equals the value passed in. + // This works unless the Value type is itself an interface type. + typ := reflect.TypeOf(f) + var z reflect.Value + if typ.Kind() == reflect.Pointer { + z = reflect.New(typ.Elem()) + } else { + z = reflect.Zero(typ) + } + return v == z.Interface().(flag.Value).String() + } + if x.value != nil { + // only return non-empty if not the same string as returned by the zero value + if s := x.value.String(); !isZeroValue(x.value, s) { + return s + } + } + return `` +} + +func (x *flagValueHook) Serialize() string { + if value, ok := x.value.(Serializer); ok { + return value.Serialize() + } + return x.String() +} + +// applyFlagValueHook wraps calls apply then wraps flags to call a hook function on update and after initial apply. +func applyFlagValueHook(set *flag.FlagSet, apply func(set *flag.FlagSet) error, hook func()) error { + if apply == nil || set == nil || hook == nil { + panic(`invalid input`) + } + var tmp flag.FlagSet + if err := apply(&tmp); err != nil { + return err + } + tmp.VisitAll(func(f *flag.Flag) { set.Var(&flagValueHook{value: f.Value, hook: hook}, f.Name, f.Usage) }) + hook() + return nil +} + +// newSliceFlagValue is for implementing SliceFlagTarget.SetValue and SliceFlagTarget.SetDestination. +// It's e.g. as part of StringSliceFlag.SetValue, using the factory NewStringSlice. +func newSliceFlagValue[R any, S ~[]E, E any](factory func(defaults ...E) *R, defaults S) *R { + if defaults == nil { + return nil + } + return factory(defaults...) +} + +// unwrapFlagValue strips any/all *flagValueHook wrappers. +func unwrapFlagValue(v flag.Value) flag.Value { + for { + h, ok := v.(*flagValueHook) + if !ok { + return v + } + v = h.value + } +} + +// NOTE: the methods below are in this file to make use of the build constraint + +func (f *Float64SliceFlag) SetValue(slice []float64) { + f.Value = newSliceFlagValue(NewFloat64Slice, slice) +} + +func (f *Float64SliceFlag) SetDestination(slice []float64) { + f.Destination = newSliceFlagValue(NewFloat64Slice, slice) +} + +func (f *Float64SliceFlag) GetDestination() []float64 { + if destination := f.Destination; destination != nil { + return destination.Value() + } + return nil +} + +func (f *Int64SliceFlag) SetValue(slice []int64) { + f.Value = newSliceFlagValue(NewInt64Slice, slice) +} + +func (f *Int64SliceFlag) SetDestination(slice []int64) { + f.Destination = newSliceFlagValue(NewInt64Slice, slice) +} + +func (f *Int64SliceFlag) GetDestination() []int64 { + if destination := f.Destination; destination != nil { + return destination.Value() + } + return nil +} + +func (f *IntSliceFlag) SetValue(slice []int) { + f.Value = newSliceFlagValue(NewIntSlice, slice) +} + +func (f *IntSliceFlag) SetDestination(slice []int) { + f.Destination = newSliceFlagValue(NewIntSlice, slice) +} + +func (f *IntSliceFlag) GetDestination() []int { + if destination := f.Destination; destination != nil { + return destination.Value() + } + return nil +} + +func (f *StringSliceFlag) SetValue(slice []string) { + f.Value = newSliceFlagValue(NewStringSlice, slice) +} + +func (f *StringSliceFlag) SetDestination(slice []string) { + f.Destination = newSliceFlagValue(NewStringSlice, slice) +} + +func (f *StringSliceFlag) GetDestination() []string { + if destination := f.Destination; destination != nil { + return destination.Value() + } + return nil +} diff --git a/vendor/github.com/urfave/cli/v2/suggestions.go b/vendor/github.com/urfave/cli/v2/suggestions.go new file mode 100644 index 000000000..9d2b7a81e --- /dev/null +++ b/vendor/github.com/urfave/cli/v2/suggestions.go @@ -0,0 +1,68 @@ +//go:build !urfave_cli_no_suggest +// +build !urfave_cli_no_suggest + +package cli + +import ( + "fmt" + + "github.com/xrash/smetrics" +) + +func init() { + SuggestFlag = suggestFlag + SuggestCommand = suggestCommand +} + +func jaroWinkler(a, b string) float64 { + // magic values are from https://github.com/xrash/smetrics/blob/039620a656736e6ad994090895784a7af15e0b80/jaro-winkler.go#L8 + const ( + boostThreshold = 0.7 + prefixSize = 4 + ) + return smetrics.JaroWinkler(a, b, boostThreshold, prefixSize) +} + +func suggestFlag(flags []Flag, provided string, hideHelp bool) string { + distance := 0.0 + suggestion := "" + + for _, flag := range flags { + flagNames := flag.Names() + if !hideHelp && HelpFlag != nil { + flagNames = append(flagNames, HelpFlag.Names()...) + } + for _, name := range flagNames { + newDistance := jaroWinkler(name, provided) + if newDistance > distance { + distance = newDistance + suggestion = name + } + } + } + + if len(suggestion) == 1 { + suggestion = "-" + suggestion + } else if len(suggestion) > 1 { + suggestion = "--" + suggestion + } + + return suggestion +} + +// suggestCommand takes a list of commands and a provided string to suggest a +// command name +func suggestCommand(commands []*Command, provided string) (suggestion string) { + distance := 0.0 + for _, command := range commands { + for _, name := range append(command.Names(), helpName, helpAlias) { + newDistance := jaroWinkler(name, provided) + if newDistance > distance { + distance = newDistance + suggestion = name + } + } + } + + return fmt.Sprintf(SuggestDidYouMeanTemplate, suggestion) +} diff --git a/vendor/github.com/urfave/cli/v2/template.go b/vendor/github.com/urfave/cli/v2/template.go index aee3e0494..5748f4c20 100644 --- a/vendor/github.com/urfave/cli/v2/template.go +++ b/vendor/github.com/urfave/cli/v2/template.go @@ -1,82 +1,103 @@ package cli +var helpNameTemplate = `{{$v := offset .HelpName 6}}{{wrap .HelpName 3}}{{if .Usage}} - {{wrap .Usage $v}}{{end}}` +var usageTemplate = `{{if .UsageText}}{{wrap .UsageText 3}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [command options]{{end}}{{if .ArgsUsage}}{{.ArgsUsage}}{{else}}{{if .Args}} [arguments...]{{end}}{{end}}{{end}}` +var descriptionTemplate = `{{wrap .Description 3}}` +var authorsTemplate = `{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}: + {{range $index, $author := .Authors}}{{if $index}} + {{end}}{{$author}}{{end}}` +var visibleCommandTemplate = `{{ $cv := offsetCommands .VisibleCommands 5}}{{range .VisibleCommands}} + {{$s := join .Names ", "}}{{$s}}{{ $sp := subtract $cv (offset $s 3) }}{{ indent $sp ""}}{{wrap .Usage $cv}}{{end}}` +var visibleCommandCategoryTemplate = `{{range .VisibleCategories}}{{if .Name}} + {{.Name}}:{{range .VisibleCommands}} + {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{template "visibleCommandTemplate" .}}{{end}}{{end}}` +var visibleFlagCategoryTemplate = `{{range .VisibleFlagCategories}} + {{if .Name}}{{.Name}} + + {{end}}{{$flglen := len .Flags}}{{range $i, $e := .Flags}}{{if eq (subtract $flglen $i) 1}}{{$e}} +{{else}}{{$e}} + {{end}}{{end}}{{end}}` + +var visibleFlagTemplate = `{{range $i, $e := .VisibleFlags}} + {{wrap $e.String 6}}{{end}}` + +var versionTemplate = `{{if .Version}}{{if not .HideVersion}} + +VERSION: + {{.Version}}{{end}}{{end}}` + +var copyrightTemplate = `{{wrap .Copyright 3}}` + // AppHelpTemplate is the text template for the Default help topic. // cli.go uses text/template to render templates. You can // render custom help text by setting this variable. var AppHelpTemplate = `NAME: - {{.Name}}{{if .Usage}} - {{.Usage}}{{end}} + {{template "helpNameTemplate" .}} USAGE: - {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}} + {{if .UsageText}}{{wrap .UsageText 3}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}{{if .Args}}[arguments...]{{end}}{{end}}{{end}}{{if .Version}}{{if not .HideVersion}} VERSION: {{.Version}}{{end}}{{end}}{{if .Description}} DESCRIPTION: - {{.Description}}{{end}}{{if len .Authors}} + {{template "descriptionTemplate" .}}{{end}} +{{- if len .Authors}} -AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}: - {{range $index, $author := .Authors}}{{if $index}} - {{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}} +AUTHOR{{template "authorsTemplate" .}}{{end}}{{if .VisibleCommands}} -COMMANDS:{{range .VisibleCategories}}{{if .Name}} - {{.Name}}:{{range .VisibleCommands}} - {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{range .VisibleCommands}} - {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{end}}{{if .VisibleFlags}} +COMMANDS:{{template "visibleCommandCategoryTemplate" .}}{{end}}{{if .VisibleFlagCategories}} + +GLOBAL OPTIONS:{{template "visibleFlagCategoryTemplate" .}}{{else if .VisibleFlags}} -GLOBAL OPTIONS: - {{range $index, $option := .VisibleFlags}}{{if $index}} - {{end}}{{$option}}{{end}}{{end}}{{if .Copyright}} +GLOBAL OPTIONS:{{template "visibleFlagTemplate" .}}{{end}}{{if .Copyright}} COPYRIGHT: - {{.Copyright}}{{end}} + {{template "copyrightTemplate" .}}{{end}} ` // CommandHelpTemplate is the text template for the command help topic. // cli.go uses text/template to render templates. You can // render custom help text by setting this variable. var CommandHelpTemplate = `NAME: - {{.HelpName}} - {{.Usage}} + {{template "helpNameTemplate" .}} USAGE: - {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Category}} + {{template "usageTemplate" .}}{{if .Category}} CATEGORY: {{.Category}}{{end}}{{if .Description}} DESCRIPTION: - {{.Description}}{{end}}{{if .VisibleFlags}} + {{template "descriptionTemplate" .}}{{end}}{{if .VisibleFlagCategories}} + +OPTIONS:{{template "visibleFlagCategoryTemplate" .}}{{else if .VisibleFlags}} -OPTIONS: - {{range .VisibleFlags}}{{.}} - {{end}}{{end}} +OPTIONS:{{template "visibleFlagTemplate" .}}{{end}} ` // SubcommandHelpTemplate is the text template for the subcommand help topic. // cli.go uses text/template to render templates. You can // render custom help text by setting this variable. var SubcommandHelpTemplate = `NAME: - {{.HelpName}} - {{.Usage}} + {{template "helpNameTemplate" .}} USAGE: - {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Description}} + {{if .UsageText}}{{wrap .UsageText 3}}{{else}}{{.HelpName}} {{if .VisibleFlags}}command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}{{if .Args}}[arguments...]{{end}}{{end}}{{end}}{{if .Description}} DESCRIPTION: - {{.Description}}{{end}} + {{template "descriptionTemplate" .}}{{end}}{{if .VisibleCommands}} -COMMANDS:{{range .VisibleCategories}}{{if .Name}} - {{.Name}}:{{range .VisibleCommands}} - {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{range .VisibleCommands}} - {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}} +COMMANDS:{{template "visibleCommandCategoryTemplate" .}}{{end}}{{if .VisibleFlagCategories}} + +OPTIONS:{{template "visibleFlagCategoryTemplate" .}}{{else if .VisibleFlags}} -OPTIONS: - {{range .VisibleFlags}}{{.}} - {{end}}{{end}} +OPTIONS:{{template "visibleFlagTemplate" .}}{{end}} ` -var MarkdownDocTemplate = `% {{ .App.Name }} 8 +var MarkdownDocTemplate = `{{if gt .SectionNum 0}}% {{ .App.Name }} {{ .SectionNum }} -# NAME +{{end}}# NAME {{ .App.Name }}{{ if .App.Usage }} - {{ .App.Usage }}{{ end }} @@ -86,16 +107,18 @@ var MarkdownDocTemplate = `% {{ .App.Name }} 8 {{ if .SynopsisArgs }} ` + "```" + ` {{ range $v := .SynopsisArgs }}{{ $v }}{{ end }}` + "```" + ` -{{ end }}{{ if .App.UsageText }} +{{ end }}{{ if .App.Description }} # DESCRIPTION -{{ .App.UsageText }} +{{ .App.Description }} {{ end }} **Usage**: -` + "```" + ` +` + "```" + `{{ if .App.UsageText }} +{{ .App.UsageText }} +{{ else }} {{ .App.Name }} [GLOBAL OPTIONS] command [COMMAND OPTIONS] [ARGUMENTS...] -` + "```" + ` +{{ end }}` + "```" + ` {{ if .GlobalArgs }} # GLOBAL OPTIONS {{ range $v := .GlobalArgs }} diff --git a/vendor/github.com/urfave/cli/v2/zz_generated.flags.go b/vendor/github.com/urfave/cli/v2/zz_generated.flags.go new file mode 100644 index 000000000..f2fc8c88b --- /dev/null +++ b/vendor/github.com/urfave/cli/v2/zz_generated.flags.go @@ -0,0 +1,865 @@ +// WARNING: this file is generated. DO NOT EDIT + +package cli + +import "time" + +// Float64SliceFlag is a flag with type *Float64Slice +type Float64SliceFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value *Float64Slice + Destination *Float64Slice + + Aliases []string + EnvVars []string + + defaultValue *Float64Slice + defaultValueSet bool + + separator separatorSpec + + Action func(*Context, []float64) error +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *Float64SliceFlag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *Float64SliceFlag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *Float64SliceFlag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *Float64SliceFlag) IsVisible() bool { + return !f.Hidden +} + +// GenericFlag is a flag with type Generic +type GenericFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value Generic + Destination Generic + + Aliases []string + EnvVars []string + + defaultValue Generic + defaultValueSet bool + + TakesFile bool + + Action func(*Context, interface{}) error +} + +// String returns a readable representation of this value (for usage defaults) +func (f *GenericFlag) String() string { + return FlagStringer(f) +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *GenericFlag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *GenericFlag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *GenericFlag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *GenericFlag) IsVisible() bool { + return !f.Hidden +} + +// Int64SliceFlag is a flag with type *Int64Slice +type Int64SliceFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value *Int64Slice + Destination *Int64Slice + + Aliases []string + EnvVars []string + + defaultValue *Int64Slice + defaultValueSet bool + + separator separatorSpec + + Action func(*Context, []int64) error +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *Int64SliceFlag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *Int64SliceFlag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *Int64SliceFlag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *Int64SliceFlag) IsVisible() bool { + return !f.Hidden +} + +// IntSliceFlag is a flag with type *IntSlice +type IntSliceFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value *IntSlice + Destination *IntSlice + + Aliases []string + EnvVars []string + + defaultValue *IntSlice + defaultValueSet bool + + separator separatorSpec + + Action func(*Context, []int) error +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *IntSliceFlag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *IntSliceFlag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *IntSliceFlag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *IntSliceFlag) IsVisible() bool { + return !f.Hidden +} + +// PathFlag is a flag with type Path +type PathFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value Path + Destination *Path + + Aliases []string + EnvVars []string + + defaultValue Path + defaultValueSet bool + + TakesFile bool + + Action func(*Context, Path) error +} + +// String returns a readable representation of this value (for usage defaults) +func (f *PathFlag) String() string { + return FlagStringer(f) +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *PathFlag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *PathFlag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *PathFlag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *PathFlag) IsVisible() bool { + return !f.Hidden +} + +// StringSliceFlag is a flag with type *StringSlice +type StringSliceFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value *StringSlice + Destination *StringSlice + + Aliases []string + EnvVars []string + + defaultValue *StringSlice + defaultValueSet bool + + separator separatorSpec + + TakesFile bool + + Action func(*Context, []string) error + + KeepSpace bool +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *StringSliceFlag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *StringSliceFlag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *StringSliceFlag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *StringSliceFlag) IsVisible() bool { + return !f.Hidden +} + +// TimestampFlag is a flag with type *Timestamp +type TimestampFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value *Timestamp + Destination *Timestamp + + Aliases []string + EnvVars []string + + defaultValue *Timestamp + defaultValueSet bool + + Layout string + + Timezone *time.Location + + Action func(*Context, *time.Time) error +} + +// String returns a readable representation of this value (for usage defaults) +func (f *TimestampFlag) String() string { + return FlagStringer(f) +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *TimestampFlag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *TimestampFlag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *TimestampFlag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *TimestampFlag) IsVisible() bool { + return !f.Hidden +} + +// Uint64SliceFlag is a flag with type *Uint64Slice +type Uint64SliceFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value *Uint64Slice + Destination *Uint64Slice + + Aliases []string + EnvVars []string + + defaultValue *Uint64Slice + defaultValueSet bool + + separator separatorSpec + + Action func(*Context, []uint64) error +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *Uint64SliceFlag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *Uint64SliceFlag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *Uint64SliceFlag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *Uint64SliceFlag) IsVisible() bool { + return !f.Hidden +} + +// UintSliceFlag is a flag with type *UintSlice +type UintSliceFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value *UintSlice + Destination *UintSlice + + Aliases []string + EnvVars []string + + defaultValue *UintSlice + defaultValueSet bool + + separator separatorSpec + + Action func(*Context, []uint) error +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *UintSliceFlag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *UintSliceFlag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *UintSliceFlag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *UintSliceFlag) IsVisible() bool { + return !f.Hidden +} + +// BoolFlag is a flag with type bool +type BoolFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value bool + Destination *bool + + Aliases []string + EnvVars []string + + defaultValue bool + defaultValueSet bool + + Count *int + + DisableDefaultText bool + + Action func(*Context, bool) error +} + +// String returns a readable representation of this value (for usage defaults) +func (f *BoolFlag) String() string { + return FlagStringer(f) +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *BoolFlag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *BoolFlag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *BoolFlag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *BoolFlag) IsVisible() bool { + return !f.Hidden +} + +// Float64Flag is a flag with type float64 +type Float64Flag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value float64 + Destination *float64 + + Aliases []string + EnvVars []string + + defaultValue float64 + defaultValueSet bool + + Action func(*Context, float64) error +} + +// String returns a readable representation of this value (for usage defaults) +func (f *Float64Flag) String() string { + return FlagStringer(f) +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *Float64Flag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *Float64Flag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *Float64Flag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *Float64Flag) IsVisible() bool { + return !f.Hidden +} + +// IntFlag is a flag with type int +type IntFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value int + Destination *int + + Aliases []string + EnvVars []string + + defaultValue int + defaultValueSet bool + + Base int + + Action func(*Context, int) error +} + +// String returns a readable representation of this value (for usage defaults) +func (f *IntFlag) String() string { + return FlagStringer(f) +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *IntFlag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *IntFlag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *IntFlag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *IntFlag) IsVisible() bool { + return !f.Hidden +} + +// Int64Flag is a flag with type int64 +type Int64Flag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value int64 + Destination *int64 + + Aliases []string + EnvVars []string + + defaultValue int64 + defaultValueSet bool + + Base int + + Action func(*Context, int64) error +} + +// String returns a readable representation of this value (for usage defaults) +func (f *Int64Flag) String() string { + return FlagStringer(f) +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *Int64Flag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *Int64Flag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *Int64Flag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *Int64Flag) IsVisible() bool { + return !f.Hidden +} + +// StringFlag is a flag with type string +type StringFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value string + Destination *string + + Aliases []string + EnvVars []string + + defaultValue string + defaultValueSet bool + + TakesFile bool + + Action func(*Context, string) error +} + +// String returns a readable representation of this value (for usage defaults) +func (f *StringFlag) String() string { + return FlagStringer(f) +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *StringFlag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *StringFlag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *StringFlag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *StringFlag) IsVisible() bool { + return !f.Hidden +} + +// DurationFlag is a flag with type time.Duration +type DurationFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value time.Duration + Destination *time.Duration + + Aliases []string + EnvVars []string + + defaultValue time.Duration + defaultValueSet bool + + Action func(*Context, time.Duration) error +} + +// String returns a readable representation of this value (for usage defaults) +func (f *DurationFlag) String() string { + return FlagStringer(f) +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *DurationFlag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *DurationFlag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *DurationFlag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *DurationFlag) IsVisible() bool { + return !f.Hidden +} + +// UintFlag is a flag with type uint +type UintFlag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value uint + Destination *uint + + Aliases []string + EnvVars []string + + defaultValue uint + defaultValueSet bool + + Base int + + Action func(*Context, uint) error +} + +// String returns a readable representation of this value (for usage defaults) +func (f *UintFlag) String() string { + return FlagStringer(f) +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *UintFlag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *UintFlag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *UintFlag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *UintFlag) IsVisible() bool { + return !f.Hidden +} + +// Uint64Flag is a flag with type uint64 +type Uint64Flag struct { + Name string + + Category string + DefaultText string + FilePath string + Usage string + + Required bool + Hidden bool + HasBeenSet bool + + Value uint64 + Destination *uint64 + + Aliases []string + EnvVars []string + + defaultValue uint64 + defaultValueSet bool + + Base int + + Action func(*Context, uint64) error +} + +// String returns a readable representation of this value (for usage defaults) +func (f *Uint64Flag) String() string { + return FlagStringer(f) +} + +// IsSet returns whether or not the flag has been set through env or file +func (f *Uint64Flag) IsSet() bool { + return f.HasBeenSet +} + +// Names returns the names of the flag +func (f *Uint64Flag) Names() []string { + return FlagNames(f.Name, f.Aliases) +} + +// IsRequired returns whether or not the flag is required +func (f *Uint64Flag) IsRequired() bool { + return f.Required +} + +// IsVisible returns true if the flag is not hidden, otherwise false +func (f *Uint64Flag) IsVisible() bool { + return !f.Hidden +} + +// vim:ro diff --git a/vendor/github.com/xrash/smetrics/.travis.yml b/vendor/github.com/xrash/smetrics/.travis.yml new file mode 100644 index 000000000..d1cd67ff9 --- /dev/null +++ b/vendor/github.com/xrash/smetrics/.travis.yml @@ -0,0 +1,9 @@ +language: go +go: + - 1.11 + - 1.12 + - 1.13 + - 1.14.x + - master +script: + - cd tests && make diff --git a/vendor/github.com/xrash/smetrics/LICENSE b/vendor/github.com/xrash/smetrics/LICENSE new file mode 100644 index 000000000..80445682f --- /dev/null +++ b/vendor/github.com/xrash/smetrics/LICENSE @@ -0,0 +1,21 @@ +Copyright (C) 2016 Felipe da Cunha Gonçalves +All Rights Reserved. + +MIT LICENSE + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/xrash/smetrics/README.md b/vendor/github.com/xrash/smetrics/README.md new file mode 100644 index 000000000..5e0c1a463 --- /dev/null +++ b/vendor/github.com/xrash/smetrics/README.md @@ -0,0 +1,49 @@ +[![Build Status](https://travis-ci.org/xrash/smetrics.svg?branch=master)](http://travis-ci.org/xrash/smetrics) + +# smetrics + +`smetrics` is "string metrics". + +Package smetrics provides a bunch of algorithms for calculating the distance between strings. + +There are implementations for calculating the popular Levenshtein distance (aka Edit Distance or Wagner-Fischer), as well as the Jaro distance, the Jaro-Winkler distance, and more. + +# How to import + +```go +import "github.com/xrash/smetrics" +``` + +# Documentation + +Go to [https://pkg.go.dev/github.com/xrash/smetrics](https://pkg.go.dev/github.com/xrash/smetrics) for complete documentation. + +# Example + +```go +package main + +import ( + "github.com/xrash/smetrics" +) + +func main() { + smetrics.WagnerFischer("POTATO", "POTATTO", 1, 1, 2) + smetrics.WagnerFischer("MOUSE", "HOUSE", 2, 2, 4) + + smetrics.Ukkonen("POTATO", "POTATTO", 1, 1, 2) + smetrics.Ukkonen("MOUSE", "HOUSE", 2, 2, 4) + + smetrics.Jaro("AL", "AL") + smetrics.Jaro("MARTHA", "MARHTA") + + smetrics.JaroWinkler("AL", "AL", 0.7, 4) + smetrics.JaroWinkler("MARTHA", "MARHTA", 0.7, 4) + + smetrics.Soundex("Euler") + smetrics.Soundex("Ellery") + + smetrics.Hamming("aaa", "aaa") + smetrics.Hamming("aaa", "aab") +} +``` diff --git a/vendor/github.com/xrash/smetrics/doc.go b/vendor/github.com/xrash/smetrics/doc.go new file mode 100644 index 000000000..21bc986c9 --- /dev/null +++ b/vendor/github.com/xrash/smetrics/doc.go @@ -0,0 +1,19 @@ +/* +Package smetrics provides a bunch of algorithms for calculating +the distance between strings. + +There are implementations for calculating the popular Levenshtein +distance (aka Edit Distance or Wagner-Fischer), as well as the Jaro +distance, the Jaro-Winkler distance, and more. + +For the Levenshtein distance, you can use the functions WagnerFischer() +and Ukkonen(). Read the documentation on these functions. + +For the Jaro and Jaro-Winkler algorithms, check the functions +Jaro() and JaroWinkler(). Read the documentation on these functions. + +For the Soundex algorithm, check the function Soundex(). + +For the Hamming distance algorithm, check the function Hamming(). +*/ +package smetrics diff --git a/vendor/github.com/xrash/smetrics/hamming.go b/vendor/github.com/xrash/smetrics/hamming.go new file mode 100644 index 000000000..505d3e5da --- /dev/null +++ b/vendor/github.com/xrash/smetrics/hamming.go @@ -0,0 +1,25 @@ +package smetrics + +import ( + "fmt" +) + +// The Hamming distance is the minimum number of substitutions required to change string A into string B. Both strings must have the same size. If the strings have different sizes, the function returns an error. +func Hamming(a, b string) (int, error) { + al := len(a) + bl := len(b) + + if al != bl { + return -1, fmt.Errorf("strings are not equal (len(a)=%d, len(b)=%d)", al, bl) + } + + var difference = 0 + + for i := range a { + if a[i] != b[i] { + difference = difference + 1 + } + } + + return difference, nil +} diff --git a/vendor/github.com/xrash/smetrics/jaro-winkler.go b/vendor/github.com/xrash/smetrics/jaro-winkler.go new file mode 100644 index 000000000..abdb28883 --- /dev/null +++ b/vendor/github.com/xrash/smetrics/jaro-winkler.go @@ -0,0 +1,28 @@ +package smetrics + +import ( + "math" +) + +// The Jaro-Winkler distance. The result is 1 for equal strings, and 0 for completely different strings. It is commonly used on Record Linkage stuff, thus it tries to be accurate for common typos when writing real names such as person names and street names. +// Jaro-Winkler is a modification of the Jaro algorithm. It works by first running Jaro, then boosting the score of exact matches at the beginning of the strings. Because of that, it introduces two more parameters: the boostThreshold and the prefixSize. These are commonly set to 0.7 and 4, respectively. +func JaroWinkler(a, b string, boostThreshold float64, prefixSize int) float64 { + j := Jaro(a, b) + + if j <= boostThreshold { + return j + } + + prefixSize = int(math.Min(float64(len(a)), math.Min(float64(prefixSize), float64(len(b))))) + + var prefixMatch float64 + for i := 0; i < prefixSize; i++ { + if a[i] == b[i] { + prefixMatch++ + } else { + break + } + } + + return j + 0.1*prefixMatch*(1.0-j) +} diff --git a/vendor/github.com/xrash/smetrics/jaro.go b/vendor/github.com/xrash/smetrics/jaro.go new file mode 100644 index 000000000..75f924e11 --- /dev/null +++ b/vendor/github.com/xrash/smetrics/jaro.go @@ -0,0 +1,86 @@ +package smetrics + +import ( + "math" +) + +// The Jaro distance. The result is 1 for equal strings, and 0 for completely different strings. +func Jaro(a, b string) float64 { + // If both strings are zero-length, they are completely equal, + // therefore return 1. + if len(a) == 0 && len(b) == 0 { + return 1 + } + + // If one string is zero-length, strings are completely different, + // therefore return 0. + if len(a) == 0 || len(b) == 0 { + return 0 + } + + // Define the necessary variables for the algorithm. + la := float64(len(a)) + lb := float64(len(b)) + matchRange := int(math.Max(0, math.Floor(math.Max(la, lb)/2.0)-1)) + matchesA := make([]bool, len(a)) + matchesB := make([]bool, len(b)) + var matches float64 = 0 + + // Step 1: Matches + // Loop through each character of the first string, + // looking for a matching character in the second string. + for i := 0; i < len(a); i++ { + start := int(math.Max(0, float64(i-matchRange))) + end := int(math.Min(lb-1, float64(i+matchRange))) + + for j := start; j <= end; j++ { + if matchesB[j] { + continue + } + + if a[i] == b[j] { + matchesA[i] = true + matchesB[j] = true + matches++ + break + } + } + } + + // If there are no matches, strings are completely different, + // therefore return 0. + if matches == 0 { + return 0 + } + + // Step 2: Transpositions + // Loop through the matches' arrays, looking for + // unaligned matches. Count the number of unaligned matches. + unaligned := 0 + j := 0 + for i := 0; i < len(a); i++ { + if !matchesA[i] { + continue + } + + for !matchesB[j] { + j++ + } + + if a[i] != b[j] { + unaligned++ + } + + j++ + } + + // The number of unaligned matches divided by two, is the number of _transpositions_. + transpositions := math.Floor(float64(unaligned / 2)) + + // Jaro distance is the average between these three numbers: + // 1. matches / length of string A + // 2. matches / length of string B + // 3. (matches - transpositions/matches) + // So, all that divided by three is the final result. + return ((matches / la) + (matches / lb) + ((matches - transpositions) / matches)) / 3.0 +} diff --git a/vendor/github.com/xrash/smetrics/soundex.go b/vendor/github.com/xrash/smetrics/soundex.go new file mode 100644 index 000000000..18c3aef72 --- /dev/null +++ b/vendor/github.com/xrash/smetrics/soundex.go @@ -0,0 +1,63 @@ +package smetrics + +import ( + "strings" +) + +// The Soundex encoding. It is a phonetic algorithm that considers how the words sound in English. Soundex maps a string to a 4-byte code consisting of the first letter of the original string and three numbers. Strings that sound similar should map to the same code. +func Soundex(s string) string { + b := strings.Builder{} + b.Grow(4) + + p := s[0] + if p <= 'z' && p >= 'a' { + p -= 32 // convert to uppercase + } + b.WriteByte(p) + + n := 0 + for i := 1; i < len(s); i++ { + c := s[i] + + if c <= 'z' && c >= 'a' { + c -= 32 // convert to uppercase + } else if c < 'A' || c > 'Z' { + continue + } + + if c == p { + continue + } + + p = c + + switch c { + case 'B', 'P', 'F', 'V': + c = '1' + case 'C', 'S', 'K', 'G', 'J', 'Q', 'X', 'Z': + c = '2' + case 'D', 'T': + c = '3' + case 'L': + c = '4' + case 'M', 'N': + c = '5' + case 'R': + c = '6' + default: + continue + } + + b.WriteByte(c) + n++ + if n == 3 { + break + } + } + + for i := n; i < 3; i++ { + b.WriteByte('0') + } + + return b.String() +} diff --git a/vendor/github.com/xrash/smetrics/ukkonen.go b/vendor/github.com/xrash/smetrics/ukkonen.go new file mode 100644 index 000000000..3c5579cd9 --- /dev/null +++ b/vendor/github.com/xrash/smetrics/ukkonen.go @@ -0,0 +1,94 @@ +package smetrics + +import ( + "math" +) + +// The Ukkonen algorithm for calculating the Levenshtein distance. The algorithm is described in http://www.cs.helsinki.fi/u/ukkonen/InfCont85.PDF, or in docs/InfCont85.PDF. It runs on O(t . min(m, n)) where t is the actual distance between strings a and b. It needs O(min(t, m, n)) space. This function might be preferred over WagnerFischer() for *very* similar strings. But test it out yourself. +// The first two parameters are the two strings to be compared. The last three parameters are the insertion cost, the deletion cost and the substitution cost. These are normally defined as 1, 1 and 2 respectively. +func Ukkonen(a, b string, icost, dcost, scost int) int { + var lowerCost int + + if icost < dcost && icost < scost { + lowerCost = icost + } else if dcost < scost { + lowerCost = dcost + } else { + lowerCost = scost + } + + infinite := math.MaxInt32 / 2 + + var r []int + var k, kprime, p, t int + var ins, del, sub int + + if len(a) > len(b) { + t = (len(a) - len(b) + 1) * lowerCost + } else { + t = (len(b) - len(a) + 1) * lowerCost + } + + for { + if (t / lowerCost) < (len(b) - len(a)) { + continue + } + + // This is the right damn thing since the original Ukkonen + // paper minimizes the expression result only, but the uncommented version + // doesn't need to deal with floats so it's faster. + // p = int(math.Floor(0.5*((float64(t)/float64(lowerCost)) - float64(len(b) - len(a))))) + p = ((t / lowerCost) - (len(b) - len(a))) / 2 + + k = -p + kprime = k + + rowlength := (len(b) - len(a)) + (2 * p) + + r = make([]int, rowlength+2) + + for i := 0; i < rowlength+2; i++ { + r[i] = infinite + } + + for i := 0; i <= len(a); i++ { + for j := 0; j <= rowlength; j++ { + if i == j+k && i == 0 { + r[j] = 0 + } else { + if j-1 < 0 { + ins = infinite + } else { + ins = r[j-1] + icost + } + + del = r[j+1] + dcost + sub = r[j] + scost + + if i-1 < 0 || i-1 >= len(a) || j+k-1 >= len(b) || j+k-1 < 0 { + sub = infinite + } else if a[i-1] == b[j+k-1] { + sub = r[j] + } + + if ins < del && ins < sub { + r[j] = ins + } else if del < sub { + r[j] = del + } else { + r[j] = sub + } + } + } + k++ + } + + if r[(len(b)-len(a))+(2*p)+kprime] <= t { + break + } else { + t *= 2 + } + } + + return r[(len(b)-len(a))+(2*p)+kprime] +} diff --git a/vendor/github.com/xrash/smetrics/wagner-fischer.go b/vendor/github.com/xrash/smetrics/wagner-fischer.go new file mode 100644 index 000000000..9883aea04 --- /dev/null +++ b/vendor/github.com/xrash/smetrics/wagner-fischer.go @@ -0,0 +1,48 @@ +package smetrics + +// The Wagner-Fischer algorithm for calculating the Levenshtein distance. +// The first two parameters are the two strings to be compared. The last three parameters are the insertion cost, the deletion cost and the substitution cost. These are normally defined as 1, 1 and 2 respectively. +func WagnerFischer(a, b string, icost, dcost, scost int) int { + + // Allocate both rows. + row1 := make([]int, len(b)+1) + row2 := make([]int, len(b)+1) + var tmp []int + + // Initialize the first row. + for i := 1; i <= len(b); i++ { + row1[i] = i * icost + } + + // For each row... + for i := 1; i <= len(a); i++ { + row2[0] = i * dcost + + // For each column... + for j := 1; j <= len(b); j++ { + if a[i-1] == b[j-1] { + row2[j] = row1[j-1] + } else { + ins := row2[j-1] + icost + del := row1[j] + dcost + sub := row1[j-1] + scost + + if ins < del && ins < sub { + row2[j] = ins + } else if del < sub { + row2[j] = del + } else { + row2[j] = sub + } + } + } + + // Swap the rows at the end of each row. + tmp = row1 + row1 = row2 + row2 = tmp + } + + // Because we swapped the rows, the final result is in row1 instead of row2. + return row1[len(row1)-1] +} diff --git a/vendor/modules.txt b/vendor/modules.txt index f40fb72e0..c95910fdc 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -71,7 +71,7 @@ github.com/containernetworking/plugins/pkg/utils/sysctl # github.com/coreos/go-iptables v0.6.0 ## explicit; go 1.16 github.com/coreos/go-iptables/iptables -# github.com/cpuguy83/go-md2man/v2 v2.0.3 +# github.com/cpuguy83/go-md2man/v2 v2.0.4 ## explicit; go 1.11 github.com/cpuguy83/go-md2man/v2/md2man # github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc @@ -347,7 +347,7 @@ github.com/ovn-org/libovsdb/model github.com/ovn-org/libovsdb/ovsdb github.com/ovn-org/libovsdb/ovsdb/serverdb github.com/ovn-org/libovsdb/updates -# github.com/ovn-org/ovn-kubernetes/go-controller v0.0.0-20240902083137-5d2310e77f87 +# github.com/ovn-org/ovn-kubernetes/go-controller v0.0.0-20240902083137-5d2310e77f87 => github.com/npinaeva/ovn-kubernetes/go-controller v0.0.0-20241022150829-c03e72d94693 ## explicit; go 1.22.0 github.com/ovn-org/ovn-kubernetes/go-controller/observability-lib/ovsdb github.com/ovn-org/ovn-kubernetes/go-controller/observability-lib/sampledecoder @@ -560,8 +560,8 @@ github.com/stretchr/testify/require # github.com/subosito/gotenv v1.6.0 ## explicit; go 1.18 github.com/subosito/gotenv -# github.com/urfave/cli/v2 v2.2.0 -## explicit; go 1.11 +# github.com/urfave/cli/v2 v2.27.2 +## explicit; go 1.18 github.com/urfave/cli/v2 # github.com/vishvananda/netlink v1.3.0 ## explicit; go 1.12 @@ -599,6 +599,9 @@ github.com/xdg-go/scram # github.com/xdg-go/stringprep v1.0.4 ## explicit; go 1.11 github.com/xdg-go/stringprep +# github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 +## explicit; go 1.15.0 +github.com/xrash/smetrics # go.opentelemetry.io/otel v1.31.0 ## explicit; go 1.22 go.opentelemetry.io/otel @@ -1357,3 +1360,4 @@ sigs.k8s.io/structured-merge-diff/v4/value sigs.k8s.io/yaml sigs.k8s.io/yaml/goyaml.v2 # github.com/prometheus/common v0.46.0 => github.com/netobserv/prometheus-common v0.46.0-netobserv +# github.com/ovn-org/ovn-kubernetes/go-controller => github.com/npinaeva/ovn-kubernetes/go-controller v0.0.0-20241022150829-c03e72d94693