From b8112c58c3375cbf4a1260bbc1e3da4d56e97ad1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2026 13:02:45 +0000 Subject: [PATCH] Update module github.com/golangci/golangci-lint/v2 to v2.14.0 --- go.mod | 44 +- go.sum | 88 +-- .../go/exhaustruct/v5/analyzer/analyzer.go | 5 +- .../go/exhaustruct/v5/analyzer/config.go | 37 +- .../v5/analyzer/missing-fields-visitor.go | 472 +++++++++++++-- .../v5/analyzer/tag-migration-visitor.go | 527 ++++++++++++++-- .../v5/internal/astutil/file-parser.go | 51 +- .../go/exhaustruct/v5/internal/cache/cache.go | 113 +++- .../v5/internal/directive/directive.go | 116 +++- .../v5/internal/directive/scanner.go | 262 ++++++-- .../exhaustruct/v5/internal/pattern/list.go | 43 +- .../v5/internal/structure/origin-scanner.go | 121 ---- .../v5/internal/structure/processor.go | 257 +++++--- .../v5/internal/structure/struct.go | 448 ++++++++++++-- vendor/github.com/4meepo/tagalign/tagalign.go | 11 +- .../alecthomas/go-check-sumtype/.golangci.yml | 75 +-- .../go-check-sumtype/.goreleaser.yml | 10 +- .../alecthomas/go-check-sumtype/README.md | 4 +- .../alecthomas/go-check-sumtype/analyzer.go | 110 ++++ .../alecthomas/go-check-sumtype/check.go | 68 +-- .../alecthomas/go-check-sumtype/config.go | 54 +- .../alecthomas/go-check-sumtype/decl.go | 87 ++- .../alecthomas/go-check-sumtype/def.go | 60 +- .../alecthomas/go-check-sumtype/fact.go | 33 + .../alecthomas/go-check-sumtype/run.go | 26 - .../ghostiam/protogetter/processor.go | 5 +- .../checkers/appendAssign_checker.go | 3 +- .../go-critic/checkers/badCond_checker.go | 5 +- .../checkers/boolExprSimplify_checker.go | 10 +- .../go-critic/checkers/newDeref_checker.go | 3 +- .../checkers/rangeExprCopy_checker.go | 2 +- .../checkers/rangeValCopy_checker.go | 2 +- .../go-critic/checkers/rulesdata/rulesdata.go | 564 +++++++++--------- .../go-critic/checkers/sortSlice_checker.go | 3 +- .../go-critic/checkers/weakCond_checker.go | 5 +- .../go-critic/go-critic/linter/go_version.go | 6 +- .../pkg/check/deprecated/deprecated.go | 2 +- .../godoc-lint/pkg/check/shared/deprecated.go | 2 +- .../check/start_with_name/start_with_name.go | 2 +- .../pkg/check/stdlib_doclink/stdlib.json | 2 +- vendor/github.com/gofrs/flock/.golangci.yml | 4 +- vendor/github.com/gofrs/flock/flock.go | 4 +- vendor/github.com/gofrs/flock/flock_others.go | 2 +- vendor/github.com/gofrs/flock/flock_unix.go | 2 +- .../gofrs/flock/flock_unix_fcntl.go | 2 +- .../github.com/gofrs/flock/flock_windows.go | 2 +- vendor/github.com/gofrs/flock/zizmor.yml | 3 + .../v2/jsonschema/golangci.jsonschema.json | 20 + .../jsonschema/golangci.next.jsonschema.json | 15 +- .../golangci-lint/v2/pkg/commands/run.go | 2 +- .../v2/pkg/config/linters_settings.go | 17 +- .../v2/pkg/goanalysis/runner_action_cache.go | 59 +- .../pkg/goanalysis/runner_loadingpackage.go | 33 +- .../v2/pkg/goanalysis/runners.go | 12 + .../golinters/exhaustruct/exhaustruct_v5.go | 1 + .../gochecksumtype/gochecksumtype.go | 74 +-- .../v2/pkg/golinters/gosec/gosec.go | 5 - .../v2/pkg/golinters/internal/util.go | 2 +- .../v2/pkg/golinters/misspell/misspell.go | 2 +- .../golinters/nolintlint/internal/issues.go | 12 +- .../v2/pkg/golinters/revive/revive.go | 210 +------ .../v2/pkg/lint/lintersdb/builder_linter.go | 2 +- .../ldez/gomoddirectives/.golangci.yml | 5 +- .../ldez/gomoddirectives/gomoddirectives.go | 49 +- .../github.com/ldez/gomoddirectives/readme.md | 3 +- .../github.com/ldez/tagliatelle/.golangci.yml | 12 +- .../ldez/tagliatelle/tagliatelle.go | 17 +- .../mgechev/revive/config/config.go | 98 ++- .../mgechev/revive/formatter/checkstyle.go | 23 +- .../mgechev/revive/formatter/friendly.go | 2 +- .../mgechev/revive/formatter/json.go | 2 +- .../mgechev/revive/formatter/ndjson.go | 2 +- .../mgechev/revive/formatter/severity.go | 13 - .../mgechev/revive/formatter/stylish.go | 2 +- .../revive/internal/astutils/ast_utils.go | 17 + .../revive/internal/astutils/exit_funcs.go | 46 ++ .../mgechev/revive/internal/config/config.go | 12 + .../mgechev/revive/internal/ifelse/rule.go | 1 + .../mgechev/revive/internal/rule/case.go | 84 +++ .../github.com/mgechev/revive/lint/config.go | 12 +- .../github.com/mgechev/revive/lint/failure.go | 15 + vendor/github.com/mgechev/revive/lint/file.go | 68 ++- .../github.com/mgechev/revive/lint/linter.go | 11 + .../github.com/mgechev/revive/lint/package.go | 14 + .../mgechev/revive/rule/add_constant.go | 6 + .../mgechev/revive/rule/argument_limit.go | 3 + .../github.com/mgechev/revive/rule/atomic.go | 1 + .../mgechev/revive/rule/banned_characters.go | 3 + .../mgechev/revive/rule/bare_return.go | 1 + .../revive/rule/cognitive_complexity.go | 2 + .../mgechev/revive/rule/comment_spacings.go | 11 +- .../mgechev/revive/rule/comments_density.go | 3 + .../revive/rule/context_as_argument.go | 2 + .../mgechev/revive/rule/cyclomatic.go | 2 + .../mgechev/revive/rule/deep_exit.go | 9 +- .../github.com/mgechev/revive/rule/defer.go | 17 +- .../mgechev/revive/rule/dot_imports.go | 2 + .../mgechev/revive/rule/empty_block.go | 7 + .../mgechev/revive/rule/enforce_map_style.go | 2 + .../rule/enforce_repeated_arg_type_style.go | 2 + .../revive/rule/enforce_slice_style.go | 25 +- .../revive/rule/enforce_switch_style.go | 2 + .../mgechev/revive/rule/error_strings.go | 2 + .../mgechev/revive/rule/exported.go | 4 +- .../mgechev/revive/rule/file_header.go | 3 + .../mgechev/revive/rule/file_length_limit.go | 2 + .../mgechev/revive/rule/filename_format.go | 3 + .../mgechev/revive/rule/function_length.go | 4 + .../revive/rule/function_result_limit.go | 3 + .../revive/rule/identical_switch_branches.go | 60 +- .../mgechev/revive/rule/if_return.go | 1 + .../revive/rule/import_alias_naming.go | 2 + .../mgechev/revive/rule/imports_blocklist.go | 2 + .../mgechev/revive/rule/line_length_limit.go | 101 +++- .../mgechev/revive/rule/marshal_receiver.go | 76 +++ .../revive/rule/max_control_nesting.go | 2 + .../mgechev/revive/rule/max_public_structs.go | 2 + .../revive/rule/modifies_value_receiver.go | 1 + .../mgechev/revive/rule/multiline_if_init.go | 59 ++ .../mgechev/revive/rule/package_comments.go | 18 +- .../revive/rule/package_directory_mismatch.go | 2 + .../mgechev/revive/rule/package_naming.go | 5 +- .../github.com/mgechev/revive/rule/range.go | 1 + .../mgechev/revive/rule/range_val_address.go | 1 + .../revive/rule/range_val_in_closure.go | 1 + .../mgechev/revive/rule/receiver_naming.go | 3 + .../revive/rule/redefines_builtin_id.go | 1 + .../revive/rule/redundant_build_tag.go | 32 +- .../revive/rule/redundant_test_main_exit.go | 166 +++++- .../mgechev/revive/rule/string_format.go | 3 + .../mgechev/revive/rule/string_of_int.go | 1 + .../mgechev/revive/rule/struct_tag.go | 5 +- .../revive/rule/unchecked_type_assertion.go | 2 + .../revive/rule/unconditional_recursion.go | 2 +- .../mgechev/revive/rule/unexported_return.go | 29 +- .../mgechev/revive/rule/unhandled_error.go | 24 + .../revive/rule/unsecure_url_scheme.go | 1 + .../mgechev/revive/rule/unused_param.go | 2 + .../mgechev/revive/rule/unused_receiver.go | 2 + .../github.com/mgechev/revive/rule/use_any.go | 4 + .../mgechev/revive/rule/use_errors_new.go | 5 + .../mgechev/revive/rule/use_fmt_print.go | 2 +- .../mgechev/revive/rule/use_slices_concat.go | 231 +++++++ .../mgechev/revive/rule/use_waitgroup_go.go | 44 +- .../mgechev/revive/rule/useless_break.go | 1 + .../github.com/mgechev/revive/rule/utils.go | 55 +- .../mgechev/revive/rule/var_naming.go | 87 +-- .../mgechev/revive/rule/waitgroup_by_value.go | 1 + .../github.com/nishanths/exhaustive/Makefile | 2 - .../github.com/nishanths/exhaustive/README.md | 6 +- .../nishanths/exhaustive/comment.go | 70 ++- .../github.com/nishanths/exhaustive/common.go | 5 +- .../github.com/nishanths/exhaustive/enum.go | 62 +- .../nishanths/exhaustive/exhaustive.go | 2 +- vendor/github.com/nishanths/exhaustive/map.go | 25 +- .../github.com/nishanths/exhaustive/switch.go | 64 +- .../github.com/securego/gosec/v2/action.yml | 2 +- .../gosec/v2/analyzers/pathtraversal.go | 23 +- .../securego/gosec/v2/analyzers/util.go | 4 +- vendor/github.com/securego/gosec/v2/config.go | 5 +- .../securego/gosec/v2/issue/issue.go | 4 +- .../github.com/securego/gosec/v2/resolve.go | 151 ++++- .../github.com/securego/gosec/v2/rules/rsa.go | 2 +- .../securego/gosec/v2/taint/analyzer.go | 4 +- .../shirou/gopsutil/v4/cpu/cpu_windows.go | 15 +- .../v4/internal/common/common_windows.go | 2 +- .../shirou/gopsutil/v4/net/net_darwin.go | 68 +-- .../shirou/gopsutil/v4/process/process.go | 2 +- .../gopsutil/v4/process/process_windows.go | 91 ++- .../go-diff/diff/git_extended_headers.go | 94 +++ .../sourcegraph/go-diff/diff/parse.go | 64 +- .../sourcegraph/go-diff/diff/reverse.go | 125 +++- .../bodyclose/passes/bodyclose/bodyclose.go | 83 ++- .../timonwong/loggercheck/.golangci.yml | 3 + .../timonwong/loggercheck/AGENTS.md | 13 + .../loggercheck/internal/checkers/checker.go | 47 ++ vendor/github.com/xo/terminfo/dec.go | 2 +- .../fatcontext/pkg/analyzer/analyzer.go | 129 +++- vendor/modules.txt | 71 +-- vendor/mvdan.cc/gofumpt/format/format.go | 34 +- .../internal/govendor/go/doc/comment/std.go | 1 + .../internal/govendor/go/printer/math.go | 28 + .../internal/govendor/go/printer/nodes.go | 39 +- .../internal/govendor/go/printer/printer.go | 4 +- 184 files changed, 5291 insertions(+), 1944 deletions(-) delete mode 100644 vendor/dev.gaijin.team/go/exhaustruct/v5/internal/structure/origin-scanner.go create mode 100644 vendor/github.com/alecthomas/go-check-sumtype/analyzer.go create mode 100644 vendor/github.com/alecthomas/go-check-sumtype/fact.go delete mode 100644 vendor/github.com/alecthomas/go-check-sumtype/run.go create mode 100644 vendor/github.com/gofrs/flock/zizmor.yml delete mode 100644 vendor/github.com/mgechev/revive/formatter/severity.go create mode 100644 vendor/github.com/mgechev/revive/internal/astutils/exit_funcs.go create mode 100644 vendor/github.com/mgechev/revive/internal/config/config.go create mode 100644 vendor/github.com/mgechev/revive/internal/rule/case.go create mode 100644 vendor/github.com/mgechev/revive/rule/marshal_receiver.go create mode 100644 vendor/github.com/mgechev/revive/rule/multiline_if_init.go create mode 100644 vendor/github.com/mgechev/revive/rule/use_slices_concat.go create mode 100644 vendor/github.com/sourcegraph/go-diff/diff/git_extended_headers.go create mode 100644 vendor/github.com/timonwong/loggercheck/AGENTS.md create mode 100644 vendor/mvdan.cc/gofumpt/internal/govendor/go/printer/math.go diff --git a/go.mod b/go.mod index d9cd946b..07190133 100644 --- a/go.mod +++ b/go.mod @@ -24,13 +24,13 @@ require ( 4d63.com/gocheckcompilerdirectives v1.4.0 // indirect 4d63.com/gochecknoglobals v0.2.2 // indirect charm.land/lipgloss/v2 v2.0.6 // indirect - codeberg.org/chavacava/garif v0.2.0 // indirect + codeberg.org/chavacava/garif v0.2.1 // indirect codeberg.org/polyfloyd/go-errorlint v1.9.0 // indirect dario.cat/mergo v1.0.2 // indirect dev.gaijin.team/go/exhaustruct/v4 v4.0.0 // indirect - dev.gaijin.team/go/exhaustruct/v5 v5.0.3 // indirect + dev.gaijin.team/go/exhaustruct/v5 v5.2.0 // indirect dev.gaijin.team/go/golib v0.8.1 // indirect - github.com/4meepo/tagalign v1.4.3 // indirect + github.com/4meepo/tagalign v1.4.4 // indirect github.com/Abirdcfly/dupword v0.1.8 // indirect github.com/AdminBenni/iota-mixing v1.0.0 // indirect github.com/AlwxSin/noinlineerr v1.0.6 // indirect @@ -55,7 +55,7 @@ require ( github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect github.com/agext/levenshtein v1.2.3 // indirect github.com/alecthomas/chroma/v2 v2.27.0 // indirect - github.com/alecthomas/go-check-sumtype v0.3.1 // indirect + github.com/alecthomas/go-check-sumtype v0.5.1-0.20260828200218-ae6904d28606 // indirect github.com/alexkohler/nakedret/v2 v2.0.6 // indirect github.com/alexkohler/prealloc v1.1.0 // indirect github.com/alfatraining/structtag v1.0.0 // indirect @@ -131,8 +131,8 @@ require ( github.com/firefart/nonamedreturns v1.0.8 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect - github.com/ghostiam/protogetter v0.3.21 // indirect - github.com/go-critic/go-critic v0.14.4 // indirect + github.com/ghostiam/protogetter v1.0.1 // indirect + github.com/go-critic/go-critic v0.15.0 // indirect github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect @@ -147,15 +147,15 @@ require ( github.com/go-viper/mapstructure/v2 v2.5.0 // indirect github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect github.com/gobwas/glob v0.2.3 // indirect - github.com/godoc-lint/godoc-lint v0.11.2 // indirect - github.com/gofrs/flock v0.13.0 // indirect + github.com/godoc-lint/godoc-lint v0.11.4 // indirect + github.com/gofrs/flock v0.13.1 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/golangci/asciicheck v0.5.0 // indirect github.com/golangci/canonicalheader v0.0.0-20260827115959-a25c71c521f6 // indirect github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202 // indirect github.com/golangci/go-printf-func-name v0.1.1 // indirect github.com/golangci/gofmt v0.0.0-20260820135601-e84e05053792 // indirect - github.com/golangci/golangci-lint/v2 v2.13.2 // indirect + github.com/golangci/golangci-lint/v2 v2.14.0 // indirect github.com/golangci/golines v0.15.0 // indirect github.com/golangci/misspell v0.8.0 // indirect github.com/golangci/plugin-module-register v0.1.2 // indirect @@ -188,10 +188,10 @@ require ( github.com/kulti/thelper v0.7.1 // indirect github.com/kunwardeep/paralleltest v1.0.15 // indirect github.com/ldez/exptostd v0.4.5 // indirect - github.com/ldez/gomoddirectives v0.9.0 // indirect + github.com/ldez/gomoddirectives v0.10.0 // indirect github.com/ldez/grignotin v0.10.1 // indirect github.com/ldez/structtags v0.6.1 // indirect - github.com/ldez/tagliatelle v0.7.2 // indirect + github.com/ldez/tagliatelle v0.8.0 // indirect github.com/ldez/usetesting v0.5.0 // indirect github.com/leonklingele/grouper v1.1.2 // indirect github.com/lucasb-eyer/go-colorful v1.4.1 // indirect @@ -206,7 +206,7 @@ require ( github.com/mattn/go-colorable v0.1.15 // indirect github.com/mattn/go-isatty v0.0.24 // indirect github.com/mattn/go-runewidth v0.0.24 // indirect - github.com/mgechev/revive v1.15.0 // indirect + github.com/mgechev/revive v1.17.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/ioprogress v0.0.0-20180201004757-6a23b12fa88e // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -223,7 +223,7 @@ require ( github.com/muesli/cancelreader v0.2.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nakabonne/nestif v0.3.1 // indirect - github.com/nishanths/exhaustive v0.12.0 // indirect + github.com/nishanths/exhaustive v0.13.0 // indirect github.com/nishanths/predeclared v0.2.2 // indirect github.com/nunnatsa/ginkgolinter v0.24.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect @@ -241,7 +241,7 @@ require ( github.com/quasilyte/gogrep v0.5.0 // indirect github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect - github.com/raeperd/recvcheck v0.3.0 // indirect + github.com/raeperd/recvcheck v0.3.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/rogpeppe/go-internal v1.16.0 // indirect github.com/ryancurrah/gomodguard v1.4.1 // indirect @@ -253,13 +253,13 @@ require ( github.com/santhosh-tekuri/jsonschema/v6 v6.0.3 // indirect github.com/sashamelentyev/interfacebloat v1.1.0 // indirect github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect - github.com/securego/gosec/v2 v2.28.0 // indirect - github.com/shirou/gopsutil/v4 v4.26.7 // indirect + github.com/securego/gosec/v2 v2.29.0 // indirect + github.com/shirou/gopsutil/v4 v4.26.8 // indirect github.com/sirupsen/logrus v1.10.2 // indirect github.com/sivchari/containedctx v1.0.3 // indirect github.com/sonatard/noctx v0.5.1 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/sourcegraph/go-diff v0.8.0 // indirect + github.com/sourcegraph/go-diff v0.9.0 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.10 // indirect @@ -270,8 +270,8 @@ require ( github.com/stretchr/testify v1.12.1 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/tetafro/godot v1.5.6 // indirect - github.com/timakin/bodyclose v0.0.0-20260129054331-73d1f95b84b4 // indirect - github.com/timonwong/loggercheck v0.11.0 // indirect + github.com/timakin/bodyclose v0.0.0-20260723120731-857993a2939c // indirect + github.com/timonwong/loggercheck v0.12.0 // indirect github.com/tklauser/go-sysconf v0.4.0 // indirect github.com/tklauser/numcpus v0.12.0 // indirect github.com/tomarrell/wrapcheck/v2 v2.12.0 // indirect @@ -282,7 +282,7 @@ require ( github.com/uudashr/gocognit v1.2.1 // indirect github.com/uudashr/iface v1.5.1 // indirect github.com/xen0n/gosmopolitan v1.3.0 // indirect - github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + github.com/xo/terminfo v1.0.0 // indirect github.com/yagipy/maintidx v1.0.0 // indirect github.com/yeya24/promlinter v0.3.0 // indirect github.com/ykadowak/zerologlint v0.1.5 // indirect @@ -291,7 +291,7 @@ require ( go-simpler.org/musttag v0.14.0 // indirect go-simpler.org/sloglint v0.12.0 // indirect go.augendre.info/arangolint v0.4.0 // indirect - go.augendre.info/fatcontext v0.10.0 // indirect + go.augendre.info/fatcontext v0.10.1 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 // indirect go.opentelemetry.io/otel v1.46.0 // indirect @@ -314,6 +314,6 @@ require ( gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect honnef.co/go/tools v0.8.1 // indirect - mvdan.cc/gofumpt v0.11.0 // indirect + mvdan.cc/gofumpt v0.12.0 // indirect mvdan.cc/unparam v0.0.0-20260823230713-2fa3d841b0c8 // indirect ) diff --git a/go.sum b/go.sum index 082afcb8..4335acd1 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ charm.land/lipgloss/v2 v2.0.6 h1:EaGKeuA8FvF+v2BT5VmZd2LoYLaMZJXA5n34th8nCIQ= charm.land/lipgloss/v2 v2.0.6/go.mod h1:ipDDJNSGa1hlwDtSfW1s2/xR8Vdhbut4PXh2zEKZd0Q= code.cloudfoundry.org/credhub-cli v0.0.0-20261005130257-51ae6f29fd90 h1:bwtPDiXkjO4UgaFJwHu0x9AP/8hWOZwyITmHGDQzG58= code.cloudfoundry.org/credhub-cli v0.0.0-20261005130257-51ae6f29fd90/go.mod h1:ncMXOiGTUAuJii/NVtNgTIgw1uKQHD1DX45qAwdUnm0= -codeberg.org/chavacava/garif v0.2.0 h1:F0tVjhYbuOCnvNcU3YSpO6b3Waw6Bimy4K0mM8y6MfY= -codeberg.org/chavacava/garif v0.2.0/go.mod h1:P2BPbVbT4QcvLZrORc2T29szK3xEOlnl0GiPTJmEqBQ= +codeberg.org/chavacava/garif v0.2.1 h1:K9oYxSlvlXrHXyW26Z4q61bTpJDo1wbvXcYKar/F/LM= +codeberg.org/chavacava/garif v0.2.1/go.mod h1:oHnDSmc0f9K1MeE+MQD/yjkiIB5Xsn5y3S9Dg96Xk84= codeberg.org/polyfloyd/go-errorlint v1.9.0 h1:VkdEEmA1VBpH6ecQoMR4LdphVI3fA4RrCh2an7YmodI= codeberg.org/polyfloyd/go-errorlint v1.9.0/go.mod h1:GPRRu2LzVijNn4YkrZYJfatQIdS+TrcK8rL5Xs24qw8= cyphar.com/go-pathrs v0.2.5 h1:SnX9FBvnoyn3lUs1dkMgZ52bAETpirNu3FTRh5HlRik= @@ -16,12 +16,12 @@ dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= dev.gaijin.team/go/exhaustruct/v4 v4.0.0 h1:873r7aNneqoBB3IaFIzhvt2RFYTuHgmMjoKfwODoI1Y= dev.gaijin.team/go/exhaustruct/v4 v4.0.0/go.mod h1:aZ/k2o4Y05aMJtiux15x8iXaumE88YdiB0Ai4fXOzPI= -dev.gaijin.team/go/exhaustruct/v5 v5.0.3 h1:yOeA7DNjlT8y4yfmN6nWWYYggA13N523YAj9/TXbuTM= -dev.gaijin.team/go/exhaustruct/v5 v5.0.3/go.mod h1:KwtBsX8nHHH1YxhxkpiBq6bfsmw5WnazWpNvJPHgY9Y= +dev.gaijin.team/go/exhaustruct/v5 v5.2.0 h1:HZB49Fshn8qHJCi9VzYtrcnR1jbLteRHXfnQz8Adams= +dev.gaijin.team/go/exhaustruct/v5 v5.2.0/go.mod h1:5IshpqhgGdKIrF8lBmi3M6YKmI7T3hMzAL9nrflko88= dev.gaijin.team/go/golib v0.8.1 h1:JYju4x9BSo+QD/AYeHULVDcvEhiFg8wOi6pT0IaZF5E= dev.gaijin.team/go/golib v0.8.1/go.mod h1:c5fu7t1RSGMxSQgcUYO1sODbzsYnOCXJLmHeNG1Eb+0= -github.com/4meepo/tagalign v1.4.3 h1:Bnu7jGWwbfpAie2vyl63Zup5KuRv21olsPIha53BJr8= -github.com/4meepo/tagalign v1.4.3/go.mod h1:00WwRjiuSbrRJnSVeGWPLp2epS5Q/l4UEy0apLLS37c= +github.com/4meepo/tagalign v1.4.4 h1:052JDGj2pBORc6NkD30dDXpsUpoYszDeUwr9/5YZuVA= +github.com/4meepo/tagalign v1.4.4/go.mod h1:00WwRjiuSbrRJnSVeGWPLp2epS5Q/l4UEy0apLLS37c= github.com/Abirdcfly/dupword v0.1.8 h1:SrhcUuGsROBuChFxHALRYzyyPODWn9zwghmzPvD9Cd8= github.com/Abirdcfly/dupword v0.1.8/go.mod h1:XZrhVnI7YGpsTiWZANSQaBJ4QpL/Tq5vIEdKJJAs9WI= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= @@ -90,8 +90,8 @@ github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8v github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= github.com/alecthomas/chroma/v2 v2.27.0 h1:FodwmyOBgJULFYmDqibcp9pvfDLWdtPRh9v/r5BXYZs= github.com/alecthomas/chroma/v2 v2.27.0/go.mod h1:NjJ3ciIgrqBNeIkWZ4e46nseoLDslxU1LmfCoL+wcY8= -github.com/alecthomas/go-check-sumtype v0.3.1 h1:u9aUvbGINJxLVXiFvHUlPEaD7VDULsrxJb4Aq31NLkU= -github.com/alecthomas/go-check-sumtype v0.3.1/go.mod h1:A8TSiN3UPRw3laIgWEUOHHLPa6/r9MtoigdlP5h3K/E= +github.com/alecthomas/go-check-sumtype v0.5.1-0.20260828200218-ae6904d28606 h1:dXPJ+uOJLWb8rjlAuLX7JPiRJtZKw/53Ol+WxdDJ1Eo= +github.com/alecthomas/go-check-sumtype v0.5.1-0.20260828200218-ae6904d28606/go.mod h1:ZH31IJyNpxpStxP2ayCcPQz+3T2G/OnxIQqe4LWvSDw= github.com/alecthomas/repr v0.5.2 h1:SU73FTI9D1P5UNtvseffFSGmdNci/O6RsqzeXJtP0Qs= github.com/alecthomas/repr v0.5.2/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alexkohler/nakedret/v2 v2.0.6 h1:ME3Qef1/KIKr3kWX3nti3hhgNxw6aqN5pZmQiFSsuzQ= @@ -288,16 +288,16 @@ github.com/gdamore/encoding v1.0.1 h1:YzKZckdBL6jVt2Gc+5p82qhrGiqMdG/eNs6Wy0u3Uh github.com/gdamore/encoding v1.0.1/go.mod h1:0Z0cMFinngz9kS1QfMjCP8TY7em3bZYeeklsSDPivEo= github.com/gdamore/tcell/v2 v2.13.10 h1:Afs3JKt83HnhuUKdZ3MnxUgOqQRWftj5JyDqv1LLynA= github.com/gdamore/tcell/v2 v2.13.10/go.mod h1:+Wfe208WDdB7INEtCsNrAN6O2m+wsTPk1RAovjaILlo= -github.com/ghostiam/protogetter v0.3.21 h1:EeWTGvL/Eyosp653hiWb6Byx4b69iJC4/E+za7vQHoI= -github.com/ghostiam/protogetter v0.3.21/go.mod h1:iAKSpyoHwYzay+OpjoWgwzRtPFthEfuUvmlomTThck0= +github.com/ghostiam/protogetter v1.0.1 h1:q4LLTx2KJHJpxrfO3BniUDWoFkoqWD/UlHhClBlUlLM= +github.com/ghostiam/protogetter v1.0.1/go.mod h1:50Fh5yZfs6SFGrd1FlmT04NcguyEOxyjNK5zGD6/EvM= github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs= github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= github.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01KS3zGE= github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= -github.com/go-critic/go-critic v0.14.4 h1:dSX4C3pWSeuMVxvQh6yG8U0ReSf3YOmKi4nwX5q7n/8= -github.com/go-critic/go-critic v0.14.4/go.mod h1:xwntfW6SYAd7h1OqDzmN6hBX/JxsEKl5up/Y2bsxgVQ= +github.com/go-critic/go-critic v0.15.0 h1:MDUZIQKytIl+vPEc0Igw51m4uLTdi1ZGz2jatEqNs1g= +github.com/go-critic/go-critic v0.15.0/go.mod h1:3BPrw8nHATGm3o2n37cssOmJzpySGKCdY8JWkCzxgKQ= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.9.0 h1:jItGXszUDRtR/AlferWPTMN4j38BQ88XnXKbilmmBPA= @@ -344,10 +344,10 @@ github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= -github.com/godoc-lint/godoc-lint v0.11.2 h1:Bp0FkJWoSdNsBikdNgIcgtaoo+xz6I/Y9s5WSBQUeeM= -github.com/godoc-lint/godoc-lint v0.11.2/go.mod h1:iVpGdL1JCikNH2gGeAn3Hh+AgN5Gx/I/cxV+91L41jo= -github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw= -github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0= +github.com/godoc-lint/godoc-lint v0.11.4 h1:N9zUYVJ/OkznBbrBsU/zODvua64EUplMBLQWStO3+1M= +github.com/godoc-lint/godoc-lint v0.11.4/go.mod h1:7usTXoxS0QYIi5usTSCPwR0w/6xLjcz450shXjLn3t4= +github.com/gofrs/flock v0.13.1 h1:jjREztyBeSKBZYAC+mgc1laB+xsgy4kYMf3FbKF2UBo= +github.com/gofrs/flock v0.13.1/go.mod h1:sf4BFiHwnvgxa25DlQoDqXQnwRMEOwqxRq37P6MzzmE= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= @@ -369,8 +369,8 @@ github.com/golangci/go-printf-func-name v0.1.1 h1:hIYTFJqAGp1iwoIfsNTpoq1xZAarog github.com/golangci/go-printf-func-name v0.1.1/go.mod h1:Es64MpWEZbh0UBtTAICOZiB+miW53w/K9Or/4QogJss= github.com/golangci/gofmt v0.0.0-20260820135601-e84e05053792 h1:WL8YKrt3UbOBqSRU7GpP5BTtQTMWtVtj+mfPijgZeIg= github.com/golangci/gofmt v0.0.0-20260820135601-e84e05053792/go.mod h1:te5hX0dW4C5r6YbXs+6ysNr8Q5UTmdIqGbb+mlFiYmA= -github.com/golangci/golangci-lint/v2 v2.13.2 h1:bCyq3E4vo9qwzifjpzJqYndEt7Ncva80qkk8G2B4TXU= -github.com/golangci/golangci-lint/v2 v2.13.2/go.mod h1:5xaMd1kAxV7GSBPEyngw8gnnjoRocqW9UVKdBR6627w= +github.com/golangci/golangci-lint/v2 v2.14.0 h1:ot8QffRa4LzAAEgtvNYrVs9esxQ7xoTwoAv6uhp4ngA= +github.com/golangci/golangci-lint/v2 v2.14.0/go.mod h1:amHimCzNDP1GfVno3hIiNssjvqXmuW+CPZAHOdR4cIc= github.com/golangci/golines v0.15.0 h1:Qnph25g8Y1c5fdo1X7GaRDGgnMHgnxh4Gk4VfPTtRx0= github.com/golangci/golines v0.15.0/go.mod h1:AZjXd23tbHMpowhtnGlj9KCNsysj72aeZVVHnVcZx10= github.com/golangci/misspell v0.8.0 h1:qvxQhiE2/5z+BVRo1kwYA8yGz+lOlu5Jfvtx2b04Jbg= @@ -471,14 +471,14 @@ github.com/kunwardeep/paralleltest v1.0.15 h1:ZMk4Qt306tHIgKISHWFJAO1IDQJLc6uDyJ github.com/kunwardeep/paralleltest v1.0.15/go.mod h1:di4moFqtfz3ToSKxhNjhOZL+696QtJGCFe132CbBLGk= github.com/ldez/exptostd v0.4.5 h1:kv2ZGUVI6VwRfp/+bcQ6Nbx0ghFWcGIKInkG/oFn1aQ= github.com/ldez/exptostd v0.4.5/go.mod h1:QRjHRMXJrCTIm9WxVNH6VW7oN7KrGSht69bIRwvdFsM= -github.com/ldez/gomoddirectives v0.9.0 h1:2YV/EX7nVlWL4jySusYTzBKHuE3D2fgcRsQuMa3yIoo= -github.com/ldez/gomoddirectives v0.9.0/go.mod h1:DdZzfm9MdXCjn2/UGYXCFfo+tzrp2Ib4iD2Q0kIJkwE= +github.com/ldez/gomoddirectives v0.10.0 h1:Zb23rfMMkG21B6pZ9OfESzemByP5Qr7YvWcXQZE/S3Q= +github.com/ldez/gomoddirectives v0.10.0/go.mod h1:W9uh0721Vc7aaVoiMXTpKIveLmtHC9uaOSiHM4OK5a8= github.com/ldez/grignotin v0.10.1 h1:keYi9rYsgbvqAZGI1liek5c+jv9UUjbvdj3Tbn5fn4o= github.com/ldez/grignotin v0.10.1/go.mod h1:UlDbXFCARrXbWGNGP3S5vsysNXAPhnSuBufpTEbwOas= github.com/ldez/structtags v0.6.1 h1:bUooFLbXx41tW8SvkfwfFkkjPYvFFs59AAMgVg6DUBk= github.com/ldez/structtags v0.6.1/go.mod h1:YDxVSgDy/MON6ariaxLF2X09bh19qL7MtGBN5MrvbdY= -github.com/ldez/tagliatelle v0.7.2 h1:KuOlL70/fu9paxuxbeqlicJnCspCRjH0x8FW+NfgYUk= -github.com/ldez/tagliatelle v0.7.2/go.mod h1:PtGgm163ZplJfZMZ2sf5nhUT170rSuPgBimoyYtdaSI= +github.com/ldez/tagliatelle v0.8.0 h1:QczqVPa22JdT40p3m5JTTVmPMv5wDORqdomJn6/Pnn0= +github.com/ldez/tagliatelle v0.8.0/go.mod h1:K9n83Wv0wyVq3JYF9WI28BX8xXhDBVP3thHJ0ENuiEs= github.com/ldez/usetesting v0.5.0 h1:3/QtzZObBKLy1F4F8jLuKJiKBjjVFi1IavpoWbmqLwc= github.com/ldez/usetesting v0.5.0/go.mod h1:Spnb4Qppf8JTuRgblLrEWb7IE6rDmUpGvxY3iRrzvDQ= github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= @@ -519,8 +519,8 @@ github.com/maxatome/go-testdeep v1.14.0 h1:rRlLv1+kI8eOI3OaBXZwb3O7xY3exRzdW5QyX github.com/maxatome/go-testdeep v1.14.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A= -github.com/mgechev/revive v1.15.0 h1:vJ0HzSBzfNyPbHKolgiFjHxLek9KUijhqh42yGoqZ8Q= -github.com/mgechev/revive v1.15.0/go.mod h1:LlAKO3QQe9OJ0pVZzI2GPa8CbXGZ/9lNpCGvK4T/a8A= +github.com/mgechev/revive v1.17.0 h1:hwTTVC3svSv9X2FA2hiYT17Uws+lfxDWhPxzBZZCREg= +github.com/mgechev/revive v1.17.0/go.mod h1:uiVNUF8ruVh4WHm/aPs7kKEeuo+m6oO3tuOfniyzP/g= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -560,8 +560,8 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg= -github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs= +github.com/nishanths/exhaustive v0.13.0 h1:Rof0axOSNQaaPaPmLK5RxcRrJV2Vcv+vfUmuRy+2EAM= +github.com/nishanths/exhaustive v0.13.0/go.mod h1:3/adQjJgvD/UFHHSYBjpK9Wbz8DOvf0FBtzx+zI0Rlo= github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= github.com/nunnatsa/ginkgolinter v0.24.0 h1:Mp0EagluLFP98JatP6nqp/gGEoljNG97uf9AcxcBVy8= @@ -619,8 +619,8 @@ github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= -github.com/raeperd/recvcheck v0.3.0 h1:PM+XYvyxIj3bo+kobJfFTdTuU3Lmfu96mKDbyHDbRt8= -github.com/raeperd/recvcheck v0.3.0/go.mod h1:PZNwG+HztFYMH2ZPq0Hu3QgkV2yiA6VrtNz9c1fXWJo= +github.com/raeperd/recvcheck v0.3.1 h1:p7nZMxiCWkdUtY2i3o+pv1h4fJCR5gpvqAXr9326hEY= +github.com/raeperd/recvcheck v0.3.1/go.mod h1:CbE7iRocQ4uc71JwpW/CPSh4BShnkre4A9Gb508RypU= github.com/rivo/tview v0.42.0 h1:b/ftp+RxtDsHSaynXTbJb+/n/BxDEi+W3UfF5jILK6c= github.com/rivo/tview v0.42.0/go.mod h1:cSfIYfhpSGCjp3r/ECJb+GKS7cGJnqV8vfjQPwoXyfY= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= @@ -651,13 +651,13 @@ github.com/sashamelentyev/usestdlibvars v1.29.0 h1:8J0MoRrw4/NAXtjQqTHrbW9NN+3iM github.com/sashamelentyev/usestdlibvars v1.29.0/go.mod h1:8PpnjHMk5VdeWlVb4wCdrB8PNbLqZ3wBZTZWkrpZZL8= github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8= github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= -github.com/securego/gosec/v2 v2.28.0 h1:ZsSdiDb0AtTpLFVol5z91gbMei9ZiLEPG/pZjZujp7c= -github.com/securego/gosec/v2 v2.28.0/go.mod h1:lb4/9AHe+lJy/kjWmWRWWsEipvbwGKuxf+tY1Pmjdnk= +github.com/securego/gosec/v2 v2.29.0 h1:pF2HSLcnY5voqpxQumEe0O5YAAbvF4Syu4qeIewpLyc= +github.com/securego/gosec/v2 v2.29.0/go.mod h1:47C7ej+L2bC1NOxteU2aCGnCi4cZaoKzRt5y9plIvuY= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= -github.com/shirou/gopsutil/v4 v4.26.7 h1:IXzpHz/dkMRYAhKkOXr1HB6SuzWU3eoyyeWe7g3bNZc= -github.com/shirou/gopsutil/v4 v4.26.7/go.mod h1:5O9FjBiXoTDFatIWjZZosqj4pV0DRtLx598xGbBehzM= +github.com/shirou/gopsutil/v4 v4.26.8 h1:YQMTF/1J50B5+Y0vlo1eDRf5DoR7Gk69hY+8wjYkQeo= +github.com/shirou/gopsutil/v4 v4.26.8/go.mod h1:5O9FjBiXoTDFatIWjZZosqj4pV0DRtLx598xGbBehzM= github.com/sirupsen/logrus v1.10.2 h1:G2SED73/qrAu6YwbdxOD6peLkCBI3z7L+ykJFTXJBBo= github.com/sirupsen/logrus v1.10.2/go.mod h1:SLEg8TqYulVKKfIGHldVp2K2aYz2DKSVBq4g/H5bR7Q= github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= @@ -671,8 +671,8 @@ github.com/sonatard/noctx v0.5.1 h1:wklWg9c9ZYugOAk7qG4yP4PBrlQsmSLPTvW1K4PRQMs= github.com/sonatard/noctx v0.5.1/go.mod h1:64XdbzFb18XL4LporKXp8poqZtPKbCrqQ402CV+kJas= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/sourcegraph/go-diff v0.8.0 h1:ipIyu4cTsLbIrln4l0qtHA3r0a7gyK4ntKjtQytHhvY= -github.com/sourcegraph/go-diff v0.8.0/go.mod h1:hWlcO7Al+UZStZAP8rBumHpCK5ZHQ5BXsMls8p4+F5E= +github.com/sourcegraph/go-diff v0.9.0 h1:7xcVsayWHhvxZGrqt1o89vvBApCa4nyCgO7tNxDHJ+Q= +github.com/sourcegraph/go-diff v0.9.0/go.mod h1:hWlcO7Al+UZStZAP8rBumHpCK5ZHQ5BXsMls8p4+F5E= github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= @@ -720,10 +720,10 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= -github.com/timakin/bodyclose v0.0.0-20260129054331-73d1f95b84b4 h1:SiHe5XLTn9sFWJ5pBwJ5FN/4j34q9ZlOAD//kMoMYp0= -github.com/timakin/bodyclose v0.0.0-20260129054331-73d1f95b84b4/go.mod h1:sDHLK7rb/59v/ZxZ7KtymgcoxuUMxjXq8gtu9VMOK8M= -github.com/timonwong/loggercheck v0.11.0 h1:jdaMpYBl+Uq9mWPXv1r8jc5fC3gyXx4/WGwTnnNKn4M= -github.com/timonwong/loggercheck v0.11.0/go.mod h1:HEAWU8djynujaAVX7QI65Myb8qgfcZ1uKbdpg3ZzKl8= +github.com/timakin/bodyclose v0.0.0-20260723120731-857993a2939c h1:d/FUP8GD4QiY/rdFzZmBu3KqL9eBNVzMu7W/5pGkaMM= +github.com/timakin/bodyclose v0.0.0-20260723120731-857993a2939c/go.mod h1:sDHLK7rb/59v/ZxZ7KtymgcoxuUMxjXq8gtu9VMOK8M= +github.com/timonwong/loggercheck v0.12.0 h1:7Cb9XGLJZSWYNjgL459DIhpSiEHupD+MLQ6vaN2Pl3g= +github.com/timonwong/loggercheck v0.12.0/go.mod h1:Wa6Y+SJHQR01mViZlLLY5GAZVOWOLNMbkXddMjFWQCs= github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= @@ -753,8 +753,8 @@ github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/xen0n/gosmopolitan v1.3.0 h1:zAZI1zefvo7gcpbCOrPSHJZJYA9ZgLfJqtKzZ5pHqQM= github.com/xen0n/gosmopolitan v1.3.0/go.mod h1:rckfr5T6o4lBtM1ga7mLGKZmLxswUoH1zxHgNXOsEt4= -github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= -github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/xo/terminfo v1.0.0 h1:2ZpYzqWzyyytjk3TP6aJVDhkMAkc99/1xKQdA3TDTBY= +github.com/xo/terminfo v1.0.0/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= github.com/yeya24/promlinter v0.3.0 h1:JVDbMp08lVCP7Y6NP3qHroGAO6z2yGKQtS5JsjqtoFs= @@ -778,8 +778,8 @@ go-simpler.org/sloglint v0.12.0 h1:UzWDlLWNE5FLqsvyq3tWYHuQMbqrervOhT8qPl4Mmw4= go-simpler.org/sloglint v0.12.0/go.mod h1:jBjjC2bm8rYrs88oTRlFX497kWjJsyZWYoNaXkGRI6I= go.augendre.info/arangolint v0.4.0 h1:xSCZjRoS93nXazBSg5d0OGCi9APPLNMmmLrC995tR50= go.augendre.info/arangolint v0.4.0/go.mod h1:l+f/b4plABuFISuKnTGD4RioXiCCgghv2xqst/xOvAA= -go.augendre.info/fatcontext v0.10.0 h1:HhFopmivh8U1+AU7f0kuwUeg2eiIns7YsGQOMHwSJ90= -go.augendre.info/fatcontext v0.10.0/go.mod h1:pqpGvA9GlrXy+aXkp8L2dKz12Zp4g2FhzcAtwToU+2w= +go.augendre.info/fatcontext v0.10.1 h1:HCS/+eob32cM0mEtmZM6NiXdqvS5KiZmsR+fCubTpbc= +go.augendre.info/fatcontext v0.10.1/go.mod h1:pqpGvA9GlrXy+aXkp8L2dKz12Zp4g2FhzcAtwToU+2w= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 h1:LMuyCAyfalSjDyjdC65nK6N0zoTT63+E/u95X0JovZI= @@ -933,8 +933,8 @@ gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.8.1 h1:+JKf3xJ1ni4CwrhVg4/pqsfPGP6vNAXcKbMXJodYx3w= honnef.co/go/tools v0.8.1/go.mod h1:XA+OnlRA9EDh/ukGvXMNSZNKGwFQJ+5dER0ioUkOxks= -mvdan.cc/gofumpt v0.11.0 h1:0H01XB95PnN2QgCSR9ELdZyTlJqNZ7181B0BTMh5VZc= -mvdan.cc/gofumpt v0.11.0/go.mod h1:BeT5wCsOJt6J9zT2MZIOGszjUHzFkn1/l9g6xAzqsXo= +mvdan.cc/gofumpt v0.12.0 h1:1Lbudkz2kpM9Cjz2pL4M19u7q+GaEhCTNf7N9mfpcho= +mvdan.cc/gofumpt v0.12.0/go.mod h1:SmBHHrljiZu/uoypeKup3rFzP6eoC9UwCp2iH5E3jZA= mvdan.cc/unparam v0.0.0-20260823230713-2fa3d841b0c8 h1:Re1NRyLpiAt9kB+ImaaoapwWiQXrKwER4tY8fLOkDew= mvdan.cc/unparam v0.0.0-20260823230713-2fa3d841b0c8/go.mod h1:MrS/+zJ1M2xvGXhKktiHbNQeQPyg3Qel+KkzT+f7/i4= pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= diff --git a/vendor/dev.gaijin.team/go/exhaustruct/v5/analyzer/analyzer.go b/vendor/dev.gaijin.team/go/exhaustruct/v5/analyzer/analyzer.go index ef1bc9c5..d4bb73f7 100644 --- a/vendor/dev.gaijin.team/go/exhaustruct/v5/analyzer/analyzer.go +++ b/vendor/dev.gaijin.team/go/exhaustruct/v5/analyzer/analyzer.go @@ -61,7 +61,7 @@ func NewAnalyzerWithConfig(config Config) (*analysis.Analyzer, error) { } func newBaseAnalyzer(run func(*analysis.Pass) (any, error)) *analysis.Analyzer { - return &analysis.Analyzer{ //nolint:exhaustruct + return &analysis.Analyzer{ Name: "exhaustruct", Doc: "Checks if all structure fields are initialized", Run: run, @@ -94,7 +94,6 @@ func newProcessor(config *Config) (*structure.Processor, error) { return structure.NewProcessor( directive.NewScanner(fp), - structure.NewOriginScanner(fp), structure.WithEnforce(enforce), structure.WithIgnore(ignore), structure.WithOptional(optional), @@ -108,5 +107,5 @@ func run(pass *analysis.Pass, config *Config, processor *structure.Processor) { } newMissingFieldsVisitor(pass, config, processor).run() - runTagMigration(pass) + newTagMigrationVisitor(pass, processor).run() } diff --git a/vendor/dev.gaijin.team/go/exhaustruct/v5/analyzer/config.go b/vendor/dev.gaijin.team/go/exhaustruct/v5/analyzer/config.go index 82101bc3..af96746a 100644 --- a/vendor/dev.gaijin.team/go/exhaustruct/v5/analyzer/config.go +++ b/vendor/dev.gaijin.team/go/exhaustruct/v5/analyzer/config.go @@ -11,10 +11,18 @@ type Config struct { // EnforcePatterns is a list of regular expressions to match type names that // should be checked. Anonymous structs can be matched by '' alias. // + // A type pattern selects the types checked under ExplicitMode; without it + // every type is checked already, so only field patterns change anything. + // + // A pattern may name a field as 'Type#Field', which requires that field + // inside a type already being checked, in either mode. A pattern matching + // the field and not the type holding it outranks what the type says; one + // broad enough to match both names no field in particular. + // // Each regular expression must match the full type name, including package path. // For example, to match type `net/http.Cookie` regular expression should be // `.*/http\.Cookie`, but not `http\.Cookie`. - EnforcePatterns Patterns `exhaustruct:"optional"` + EnforcePatterns Patterns //exhaustruct:optional // IgnorePatterns is a list of regular expressions to match type names that // should be skipped from checking. Anonymous structs can be matched by @@ -25,7 +33,7 @@ type Config struct { // Each regular expression must match the full type name, including package path. // For example, to match type `net/http.Cookie` regular expression should be // `.*/http\.Cookie`, but not `http\.Cookie`. - IgnorePatterns Patterns `exhaustruct:"optional"` + IgnorePatterns Patterns //exhaustruct:optional // OptionalPatterns is a list of regular expressions to match type names where // all fields are treated as optional. Anonymous structs can be matched by @@ -34,10 +42,10 @@ type Config struct { // Each regular expression must match the full type name, including package path. // For example, to match type `net/http.Cookie` regular expression should be // `.*/http\.Cookie`, but not `http\.Cookie`. - OptionalPatterns Patterns `exhaustruct:"optional"` + OptionalPatterns Patterns //exhaustruct:optional // AllowEmpty allows empty structures, effectively excluding them from the check. - AllowEmpty bool `exhaustruct:"optional"` + AllowEmpty bool //exhaustruct:optional // AllowEmptyPatterns is a list of regular expressions to match type names that // should be allowed to be empty. Anonymous structs can be matched by @@ -46,22 +54,27 @@ type Config struct { // Each regular expression must match the full type name, including package path. // For example, to match type `net/http.Cookie` regular expression should be // `.*/http\.Cookie`, but not `http\.Cookie`. - AllowEmptyPatterns Patterns `exhaustruct:"optional"` + AllowEmptyPatterns Patterns //exhaustruct:optional // AllowEmptyReturns allows empty structures in return statements. - AllowEmptyReturns bool `exhaustruct:"optional"` + AllowEmptyReturns bool //exhaustruct:optional // AllowEmptyDeclarations allows empty structures in variable declarations. - AllowEmptyDeclarations bool `exhaustruct:"optional"` + AllowEmptyDeclarations bool //exhaustruct:optional + + // AllowEmptyBlankAssignments allows empty structures the blank identifier + // receives, in a declaration or an assignment. `var _ Iface = T{}`, which + // asserts at compile time that T implements Iface, is written this way. + AllowEmptyBlankAssignments bool //exhaustruct:optional // ReportFullTypePath enables full package path in error messages instead of // short package name. This helps when configuring include/exclude patterns, // as import aliases can make short names ambiguous. - ReportFullTypePath bool `exhaustruct:"optional"` + ReportFullTypePath bool //exhaustruct:optional // ExplicitMode enables opt-in checking. When true, only types marked with // //exhaustruct:enforce directive or matching enforce-rx patterns are checked. - ExplicitMode bool `exhaustruct:"optional"` + ExplicitMode bool //exhaustruct:optional } // bindToFlagSet binds the config fields to the provided flag set. @@ -72,6 +85,9 @@ func (c *Config) bindToFlagSet(fs *flag.FlagSet) { fs.Var(&c.EnforcePatterns, "enforce-rx", "Regular expression to match type names that should be checked. "+ + "Selects the types checked under -explicit. A pattern may name a field "+ + "as Type#Field, which requires that field in either mode; one matching "+ + "the field and not the type holding it outranks what the type says. "+ "Anonymous structs can be matched by '' alias. "+ "Each regex must match the full type name including package path. "+ "Example: `.*/http\\.Cookie`. Can be used multiple times.") @@ -103,6 +119,9 @@ func (c *Config) bindToFlagSet(fs *flag.FlagSet) { fs.BoolVar(&c.AllowEmptyDeclarations, "allow-empty-declarations", c.AllowEmptyDeclarations, "Allow empty structures in variable declarations") + fs.BoolVar(&c.AllowEmptyBlankAssignments, "allow-empty-blank-assignments", c.AllowEmptyBlankAssignments, + "Allow empty structures the blank identifier receives, as in 'var _ Iface = T{}'") + fs.BoolVar(&c.ReportFullTypePath, "report-full-type-path", c.ReportFullTypePath, "Report full package path in error messages (e.g., 'net/http.Cookie' instead of 'http.Cookie'). "+ "Useful for identifying types when configuring enforce/ignore patterns.") diff --git a/vendor/dev.gaijin.team/go/exhaustruct/v5/analyzer/missing-fields-visitor.go b/vendor/dev.gaijin.team/go/exhaustruct/v5/analyzer/missing-fields-visitor.go index 558d8092..53a5a9fb 100644 --- a/vendor/dev.gaijin.team/go/exhaustruct/v5/analyzer/missing-fields-visitor.go +++ b/vendor/dev.gaijin.team/go/exhaustruct/v5/analyzer/missing-fields-visitor.go @@ -5,6 +5,7 @@ import ( "go/ast" "go/token" "go/types" + "go/version" "slices" "golang.org/x/tools/go/analysis" @@ -109,30 +110,21 @@ func (lv literalVisitor) process() { // resolveLiteral extracts struct type information from the composite literal, // retrieves cached metadata, and looks up directives. +// +// The named result carries the zero value on the paths that report ok=false, +// where the caller discards it and there is no struct to describe. func (lv literalVisitor) resolveLiteral() (lit literal, ok bool) { typeName, strct, pos := lv.resolveLiteralType() if strct == nil { - return literal{}, false //nolint:exhaustruct - } - - s, diags := lv.processor.ResolveStruct( - lv.pass.Fset, typeName, strct, pos, lv.pass.Pkg, - ) - - for _, diag := range diags { - lv.pass.Report(diag) + return lit, false } + s := lv.processor.ResolveStruct(lv.pass.Fset, typeName, strct, pos, lv.pass.Pkg) if s == nil { - return literal{}, false //nolint:exhaustruct + return lit, false } - litPos := lv.pass.Fset.Position(lv.lit.Pos()) - dirs, dirDiags := lv.processor.Directives().Lookup(lv.pass.Fset, litPos) - - for _, d := range dirDiags { - lv.pass.Report(d) - } + dirs := lv.useSiteDirectives() return literal{ strct: s, @@ -141,19 +133,75 @@ func (lv literalVisitor) resolveLiteral() (lit literal, ok bool) { }, true } +// useSiteDirectives collects the directives that apply to the literal. +// +// A directive is written above the statement holding a literal, not above every +// literal nested inside it, so the search climbs out of the expression the +// literal sits in and reads the statement holding it. Enumerating the node +// kinds a literal may be written within cannot be complete -- parentheses, +// selectors, operators, calls, sends and index expressions each nest literals, +// and the list grew by one every time a shape was missed -- so the walk asks +// what a node is instead: it climbs through expressions, and through the specs +// and declarations a var block is built from, until it reaches a statement. +// +// It stops there. A statement is where a directive is written, and going above +// one would let a directive on an `if` or a `for` reach every literal in the +// block below it. +func (lv literalVisitor) useSiteDirectives() directive.Directives { + var dirs directive.Directives + + for _, node := range slices.Backward(lv.stack) { + if !carriesUseSiteDirective(node) { + break + } + + found := lv.processor.Directives().LookupPos(lv.pass.Fset, node.Pos()) + + for _, d := range found { + if !dirs.Contains(d) { + dirs = append(dirs, d) + } + } + + if _, isStatement := node.(ast.Stmt); isStatement { + break + } + } + + return dirs +} + +// carriesUseSiteDirective reports whether a directive written above node can +// apply to a composite literal nested inside it. +func carriesUseSiteDirective(node ast.Node) bool { + switch node.(type) { + case ast.Expr, ast.Spec, ast.Decl, ast.Stmt: + return true + + default: + return false + } +} + // resolveLiteralType resolves the composite literal's type and definition position. func (lv literalVisitor) resolveLiteralType() (name *types.TypeName, strct *types.Struct, pos token.Pos) { typ := lv.pass.TypesInfo.TypeOf(lv.lit) - if ptr, ok := typ.(*types.Pointer); ok { + // A literal may elide `&T` when the element type is a pointer, including a + // pointer reached through an alias or a defined pointer type. Such a + // pointer has a declaration of its own, which carries the directives and + // the patterns that select the literal -- an alias to a pointer answers + // like an alias to a struct. + name = typeNameOf(typ) + + if ptr, ok := types.Unalias(typ).Underlying().(*types.Pointer); ok { typ = ptr.Elem() - } - switch t := typ.(type) { - case *types.Alias: - name = t.Obj() - case *types.Named: - name = t.Obj() + // A plain *T is written at the use site and declares nothing, so the + // struct it points at names the literal. + if name == nil { + name = typeNameOf(typ) + } } typ = types.Unalias(typ) @@ -162,24 +210,224 @@ func (lv literalVisitor) resolveLiteralType() (name *types.TypeName, strct *type case *types.Named: var ok bool - if strct, ok = t.Underlying().(*types.Struct); !ok { + // Every instantiation of a generic type shares one declaration, and the + // declaration is what carries the fields and the directives. Resolving + // the origin makes G[int] and G[string] answer as the type they are + // written from, out of one cache entry. + if strct, ok = t.Origin().Underlying().(*types.Struct); !ok { return nil, nil, token.NoPos } - pos = name.Pos() + return name, strct, name.Pos() + + case *types.TypeParam: + // A literal of a type parameter is written against its constraint's + // core type, which the type checker has already validated the keys + // against. + if strct = coreStruct(lv.pass.Fset, lv.processor.Directives(), t); strct == nil { + return nil, nil, token.NoPos + } - return name, strct, pos + // A type parameter is declared in a signature, and the core it resolves + // to is a shape its constraint names rather than a type anyone declared. + // There is no declaration to read type-level directives from, and the + // parameter's own line would read the directives of the function. + return name, strct, token.NoPos case *types.Struct: - pos = lv.findAnonymousStructPos() + // An alias to an anonymous struct has a declaration of its own; only a + // genuinely unnamed struct needs its position recovered from the AST. + if name != nil { + return name, t, name.Pos() + } - return name, t, pos + return name, t, lv.findAnonymousStructPos() default: return nil, nil, token.NoPos } } +// typeNameOf returns the declaration a type is written under, or nil when the +// type is unnamed. +func typeNameOf(typ types.Type) *types.TypeName { + switch t := typ.(type) { + case *types.Alias: + return t.Obj() + + case *types.Named: + return t.Obj() + + case *types.TypeParam: + return t.Obj() + + default: + return nil + } +} + +// coreStruct returns the struct type every term of a type parameter's +// constraint shares, or nil when the constraint has no such core type and a +// composite literal of the parameter is therefore not possible. +func coreStruct(fset *token.FileSet, directives *directive.Scanner, tp *types.TypeParam) *types.Struct { + r := coreResolver{ + fset: fset, + directives: directives, + walking: map[*types.Interface]bool{}, + done: map[*types.Interface]coreResult{}, + } + + strct, _ := r.constraintCore(tp.Constraint()) + + return strct +} + +// coreResolver walks the interfaces a constraint embeds. walking holds the ones +// on the path being walked, so a cycle ends without a second branch of a +// diamond reading as one; done holds the ones the walk finished, so a diamond +// costs one visit per interface rather than one per path down to it. Stacked +// diamonds otherwise multiply: n layers open 2^n paths over 3n+1 declarations. +// +// constraint: Go rejects a recursive interface, so an entry in done can never +// hold a result the walking guard truncated. That guard is there so a type +// built outside the type checker cannot recurse without end. +type coreResolver struct { + fset *token.FileSet + // directives reads what a term's fields are annotated with, which is what + // tells two declarations of one shape apart. Nil where no scanner is at + // hand, and two such declarations then answer as one core. + directives *directive.Scanner + walking map[*types.Interface]bool + done map[*types.Interface]coreResult +} + +// coreResult is what one interface resolved to, kept so a branch reaching it a +// second time answers without walking it again. +type coreResult struct { + core *types.Struct + ok bool +} + +// constraintCore resolves the struct shared by every term of a constraint, +// descending into the interfaces it embeds: a constraint may name its terms +// itself or inherit them from another interface, and both describe one type +// set. +// +// A constraint restricts methods as well as types, and the two are separate +// contributions: a method-only interface narrows the type set without naming a +// type, so it leaves the core of its siblings standing. ok is false only for a +// term that names a type no literal can be written for, which leaves the whole +// constraint without a core. + +func (r coreResolver) constraintCore(typ types.Type) (core *types.Struct, ok bool) { + iface, isIface := typ.Underlying().(*types.Interface) + if !isIface { + return nil, false + } + + // An interface embedding itself contributes no core of its own; whichever + // branch opened it carries the answer. + if r.walking[iface] { + return nil, true + } + + if res, walked := r.done[iface]; walked { + return res.core, res.ok + } + + r.walking[iface] = true + + defer func() { + delete(r.walking, iface) + + r.done[iface] = coreResult{core: core, ok: ok} + }() + + for embedded := range iface.EmbeddedTypes() { + for _, term := range unionTerms(embedded) { + strct, termOK := r.termCore(term) + if !termOK { + return nil, false + } + + if strct == nil { + continue + } + + if core != nil && !r.sameCore(core, strct) { + return nil, false + } + + core = strct + } + } + + return core, true +} + +// sameCore reports whether two terms answer as one core: the same struct, which +// an alias and a defined type both share, or two declarations of one shape +// whose fields are annotated alike. Fields annotated apart make two cores, and +// reading either declaration's would answer by the order the union lists its +// terms. +func (r coreResolver) sameCore(a, b *types.Struct) bool { + if a == b { + return true + } + + if !types.Identical(a, b) { + return false + } + + if r.directives == nil { + return true + } + + for i := range a.NumFields() { + if r.fieldOptionality(a.Field(i)) != r.fieldOptionality(b.Field(i)) { + return false + } + } + + return true +} + +// fieldOptionality reads what one field of a term is annotated with, at the +// position it is declared at, through the projection the field metadata itself +// is built from. +func (r coreResolver) fieldOptionality(f *types.Var) directive.Optionality { + return r.directives.LookupPos(r.fset, f.Pos()).Optionality() +} + +// termCore resolves one term of a constraint to the struct it stands for: the +// term's own type, or the core of another interface it names. +func (r coreResolver) termCore(term types.Type) (*types.Struct, bool) { + if _, ok := term.Underlying().(*types.Interface); ok { + return r.constraintCore(term) + } + + strct, ok := term.Underlying().(*types.Struct) + + return strct, ok +} + +// unionTerms splits a constraint element into its terms. A single-term element +// is not wrapped in a union, so it stands for itself. +func unionTerms(typ types.Type) []types.Type { + union, ok := typ.(*types.Union) + if !ok { + return []types.Type{typ} + } + + terms := make([]types.Type, 0, union.Len()) + + for term := range union.Terms() { + terms = append(terms, term.Type()) + } + + return terms +} + // findAnonymousStructPos finds the position of the struct keyword for anonymous structs. func (lv literalVisitor) findAnonymousStructPos() token.Pos { if lv.lit.Type != nil { @@ -190,13 +438,19 @@ func (lv literalVisitor) findAnonymousStructPos() token.Pos { return token.NoPos } + // Key and value of a map literal both elide their type, and their types come + // from opposite sides of the map type — track which side the literal is on. + mapKey := false + for i := len(lv.stack) - 2; i >= 0; i-- { //nolint:mnd switch parent := lv.stack[i].(type) { case *ast.KeyValueExpr: + mapKey = parent.Key == lv.stack[i+1] + continue case *ast.CompositeLit: - return structPosFromType(parent.Type) + return structPosFromType(parent.Type, mapKey) default: return token.NoPos @@ -206,7 +460,7 @@ func (lv literalVisitor) findAnonymousStructPos() token.Pos { return token.NoPos } -func structPosFromType(typ ast.Expr) token.Pos { +func structPosFromType(typ ast.Expr, mapKey bool) token.Pos { if typ == nil { return token.NoPos } @@ -216,6 +470,10 @@ func structPosFromType(typ ast.Expr) token.Pos { return structPosFromExpr(t.Elt) case *ast.MapType: + if mapKey { + return structPosFromExpr(t.Key) + } + return structPosFromExpr(t.Value) } @@ -257,6 +515,10 @@ func (lv literalVisitor) checkEmptyAllowed(s *structure.Struct) bool { return true } + if lv.config.AllowEmptyBlankAssignments && lv.isBlankAssignment() { + return true + } + return false } @@ -267,7 +529,7 @@ func (lv literalVisitor) checkLiteral(lit literal) (*token.Pos, string) { strct := lit.strct - missingFields := strct.SkippedFields(lv.lit, lv.pass.Pkg.Path()) + missingFields := strct.SkippedFields(lv.lit, lv.pass.Pkg.Path(), lv.canNamePromoted()) if len(missingFields) == 0 { return nil, "" @@ -287,63 +549,127 @@ func (lv literalVisitor) checkLiteral(lit literal) (*token.Pos, string) { return &pos, fmt.Sprintf("%s is missing fields %s", displayName, structure.FormatFieldNames(missingFields)) } -func (lv literalVisitor) isChildOfVariableDeclaration() bool { - if len(lv.stack) < 2 { //nolint:mnd - return false - } +// promotedKeysVersion is the first language version that lets a composite +// literal name a promoted field in place of the embedded field carrying it +// (golang/go#77245). +const promotedKeysVersion = "go1.27" - for i := len(lv.stack) - 1; i > 0; i-- { - parent := lv.stack[i-1] +// canNamePromoted reports whether the literal may write a promoted field as a +// key. The version of the file holding it decides, not the one the module +// declares: a //go:build constraint sets a single file apart from its package. +func (lv literalVisitor) canNamePromoted() bool { + return canNamePromotedIn(lv.fileGoVersion()) +} + +// canNamePromotedIn reports whether a file of the given language version may +// write a promoted field as a key. A version that is missing or not a Go +// version reads as the newest one, as go/types reads it: the literal has +// already type-checked with whatever keys it names. +func canNamePromotedIn(goVersion string) bool { + return !version.IsValid(goVersion) || version.Compare(goVersion, promotedKeysVersion) >= 0 +} - switch p := parent.(type) { - case *ast.AssignStmt: - if p.Tok == token.DEFINE { - return true +// fileGoVersion returns the language version of the file the literal is written +// in, falling back to the package's own when the file carries none. +func (lv literalVisitor) fileGoVersion() string { + if len(lv.stack) > 0 { + if file, ok := lv.stack[0].(*ast.File); ok { + if v := lv.pass.TypesInfo.FileVersions[file]; v != "" { + return v } + } + } - case *ast.ValueSpec: - return true + return lv.pass.Pkg.GoVersion() +} + +// enclosingOfLiteral returns the node the literal is written into, climbing out +// of the wrappers that leave what it is written as unchanged: parentheses, and +// the address-of that makes a `&T{}`. The expression returned beside it is the +// one that node holds directly: the literal itself, or the outermost wrapper +// around it. Both are nil where no such node encloses the literal. +func (lv literalVisitor) enclosingOfLiteral() (parent ast.Node, child ast.Expr) { + child = lv.lit + + for i := len(lv.stack) - 1; i > 0; i-- { + switch p := lv.stack[i-1].(type) { + case *ast.ParenExpr: + child = p + + continue case *ast.UnaryExpr: if p.Op == token.AND { + child = p + continue } - return false + return nil, nil default: - return false + return p, child } } - return false + return nil, nil } -func (lv literalVisitor) getParentReturnStmt() (*ast.ReturnStmt, bool) { - if len(lv.stack) < 2 { //nolint:mnd - return nil, false +// isChildOfVariableDeclaration reports whether the literal is the value a +// variable is declared with. +func (lv literalVisitor) isChildOfVariableDeclaration() bool { + parent, _ := lv.enclosingOfLiteral() + + switch p := parent.(type) { + case *ast.AssignStmt: + return p.Tok == token.DEFINE + + case *ast.ValueSpec: + return true + + default: + return false } +} - for i := len(lv.stack) - 1; i > 0; i-- { - parent := lv.stack[i-1] +// isBlankAssignment reports whether the literal is a value the blank identifier +// receives, in a declaration or an assignment. A value is matched to its name +// by position: `var _, x = T{}, U{}` discards the first literal and binds the +// second. +func (lv literalVisitor) isBlankAssignment() bool { + parent, child := lv.enclosingOfLiteral() - switch p := parent.(type) { - case *ast.ReturnStmt: - return p, true + switch p := parent.(type) { + case *ast.ValueSpec: + i := slices.Index(p.Values, child) - case *ast.UnaryExpr: - if p.Op == token.AND { - continue - } + return i >= 0 && i < len(p.Names) && isBlank(p.Names[i]) - return nil, false + case *ast.AssignStmt: + i := slices.Index(p.Rhs, child) - default: - return nil, false - } + return i >= 0 && i < len(p.Lhs) && isBlank(p.Lhs[i]) + + default: + return false } +} + +// isBlank reports whether expr is the blank identifier, parenthesized or not, +// as go/types reads an assignment target. +func isBlank(expr ast.Expr) bool { + ident, ok := unparen(expr).(*ast.Ident) + + return ok && ident.Name == "_" +} + +// getParentReturnStmt returns the return statement the literal is a result of. +func (lv literalVisitor) getParentReturnStmt() (*ast.ReturnStmt, bool) { + parent, _ := lv.enclosingOfLiteral() + + ret, ok := parent.(*ast.ReturnStmt) - return nil, false + return ret, ok } //nolint:forcetypeassert,gochecknoglobals @@ -355,6 +681,8 @@ func (lv literalVisitor) isErrorReturnStatement(n *ast.ReturnStmt) bool { } for _, ri := range slices.Backward(n.Results) { + ri = unparen(ri) + if ri == lv.lit { continue } @@ -366,9 +694,11 @@ func (lv literalVisitor) isErrorReturnStatement(n *ast.ReturnStmt) bool { } case *ast.UnaryExpr: - if ri.X == lv.lit { + if unparen(ri.X) == lv.lit { continue } + + default: } resultType := lv.pass.TypesInfo.TypeOf(ri) @@ -379,3 +709,17 @@ func (lv literalVisitor) isErrorReturnStatement(n *ast.ReturnStmt) bool { return false } + +// unparen strips redundant parentheses, which gofmt keeps and which would +// otherwise break the walks that match a literal against its enclosing +// expression. +func unparen(expr ast.Expr) ast.Expr { + for { + paren, ok := expr.(*ast.ParenExpr) + if !ok { + return expr + } + + expr = paren.X + } +} diff --git a/vendor/dev.gaijin.team/go/exhaustruct/v5/analyzer/tag-migration-visitor.go b/vendor/dev.gaijin.team/go/exhaustruct/v5/analyzer/tag-migration-visitor.go index 7e75b668..d2d26177 100644 --- a/vendor/dev.gaijin.team/go/exhaustruct/v5/analyzer/tag-migration-visitor.go +++ b/vendor/dev.gaijin.team/go/exhaustruct/v5/analyzer/tag-migration-visitor.go @@ -1,28 +1,45 @@ package analyzer import ( + "bytes" "go/ast" + "go/token" "reflect" - "regexp" + "strconv" "strings" "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/analysis/passes/inspect" "golang.org/x/tools/go/ast/inspector" + + "dev.gaijin.team/go/exhaustruct/v5/internal/astutil" + "dev.gaijin.team/go/exhaustruct/v5/internal/structure" ) -// runTagMigration scans struct definitions for deprecated exhaustruct tags -// and emits migration diagnostics with suggested fixes, using inspector to -// traverse StructType nodes efficiently. -func runTagMigration(pass *analysis.Pass) { - insp := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) //nolint:forcetypeassert +// tagMigrationVisitor scans struct definitions for deprecated exhaustruct tags +// and emits migration diagnostics with suggested fixes. +type tagMigrationVisitor struct { + pass *analysis.Pass + processor *structure.Processor + // sources caches the file bytes placement is read from. + sources map[string][]byte +} - insp.Preorder([]ast.Node{new(ast.StructType)}, func(n ast.Node) { - visitStructType(pass, n) - }) +func newTagMigrationVisitor(pass *analysis.Pass, processor *structure.Processor) *tagMigrationVisitor { + return &tagMigrationVisitor{ + pass: pass, + processor: processor, + sources: map[string][]byte{}, + } +} + +func (v *tagMigrationVisitor) run() { + insp := v.pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) //nolint:forcetypeassert + + insp.Preorder([]ast.Node{new(ast.StructType)}, v.visitStructType) } -func visitStructType(pass *analysis.Pass, n ast.Node) { +func (v *tagMigrationVisitor) visitStructType(n ast.Node) { st, ok := n.(*ast.StructType) if !ok { return @@ -32,7 +49,7 @@ func visitStructType(pass *analysis.Pass, n ast.Node) { return } - for _, field := range st.Fields.List { + for i, field := range st.Fields.List { if field.Tag == nil { continue } @@ -42,70 +59,496 @@ func visitStructType(pass *analysis.Pass, n ast.Node) { continue } - pass.Report(buildTagDiagnostic(field, value)) + v.pass.Report(buildTagDiagnostic(field, v.placeTag(st, i), value)) } } -const exhaustructTagKey = "exhaustruct" +const ( + exhaustructTagKey = "exhaustruct" + optionalTagValue = "optional" + optionalDirective = "//exhaustruct:optional" + fixMessage = "fix" +) -// parseExhaustructTag extracts value from `exhaustruct:"value"` tag. +// parseExhaustructTag extracts value from an `exhaustruct:"value"` tag. // Returns ("", false) if tag not present. func parseExhaustructTag(tagLiteral string) (string, bool) { - if len(tagLiteral) < 2 { //nolint:mnd + tag, err := strconv.Unquote(tagLiteral) + if err != nil { return "", false } - // Strip backticks - inner := tagLiteral[1 : len(tagLiteral)-1] - - return reflect.StructTag(inner).Lookup(exhaustructTagKey) + return reflect.StructTag(tag).Lookup(exhaustructTagKey) } -func buildTagDiagnostic(field *ast.Field, tagValue string) analysis.Diagnostic { +func buildTagDiagnostic(field *ast.Field, placement tagPlacement, tagValue string) analysis.Diagnostic { + var fixes []analysis.SuggestedFix + + // A name sharing its line with a block line directive takes no comment + // above it: gofmt writes the two on lines of their own, which moves the + // name off the line the generator pinned. Appending asks for no such + // comment, so that placement is offered as it is anywhere else, and the + // tag is reported without a fix only where neither is open to it. + if placement.canAppend || !placement.movesALineDirective() { + fixes = []analysis.SuggestedFix{buildTagFix(field, placement, tagValue)} + } + return analysis.Diagnostic{ Pos: field.Tag.Pos(), Message: `struct tag "exhaustruct" is not supported anymore, use comment directives`, - SuggestedFixes: []analysis.SuggestedFix{buildTagFix(field, tagValue)}, + SuggestedFixes: fixes, } } -func buildTagFix(field *ast.Field, tagValue string) analysis.SuggestedFix { +func buildTagFix(field *ast.Field, placement tagPlacement, tagValue string) analysis.SuggestedFix { tag := field.Tag newTag := removeExhaustructFromTag(tag.Value) - if tagValue == "optional" { - if newTag != "" { - newTag += " " + // Dropping the tag entirely takes the whitespace in front of it too, but + // only whitespace: a comment written there carries its own meaning. + start := tag.Pos() + if newTag == "" && !placement.gapBeforeTag { + start = field.Type.End() + } + + edits := make([]analysis.TextEdit, 0, 1+len(placement.anchors)) + + edits = append(edits, analysis.TextEdit{ + Pos: start, + End: tag.End(), + NewText: []byte(newTag), + }) + + if tagValue != optionalTagValue { + return analysis.SuggestedFix{Message: fixMessage, TextEdits: edits} + } + + // Where a line comment swallows nothing that matters, the directive takes + // the tag's place. The tag ends the line the declaration starts on, so that + // line holds every name it declares and the one anchor answers for all of + // them. + if placement.canAppend { + if !placement.anchors[0].optionalityDecided { + edits[0].NewText = []byte(appendedDirective(newTag, start == field.Type.End())) } - newTag += "//exhaustruct:optional" + return analysis.SuggestedFix{Message: fixMessage, TextEdits: edits} + } + + // The directive takes a line of its own, and the name it precedes moves onto + // the next. A name that already begins its line needs no break in front; + // one sharing a line does, or the directive lands in the middle of it. + for _, a := range placement.anchors { + // A directive that already answers this name's optionality is the + // author's own answer, and a newer one than the tag: the tag reached v5 + // inert, so removing it leaves that answer standing. Migrating on top of + // it would contradict it, or repeat it into a group the scanner then + // refuses to read. + if a.optionalityDecided { + continue + } + + directiveLine := optionalDirective + "\n" + if !a.startsLine { + directiveLine = "\n" + directiveLine + } + + edits = append(edits, analysis.TextEdit{ + Pos: a.pos, + End: a.pos, + NewText: []byte(directiveLine), + }) + } + + return analysis.SuggestedFix{Message: fixMessage, TextEdits: edits} +} + +// appendedDirective returns the text that takes a tag's place when the directive +// is appended: what is left of the tag, then the directive, parted by a space +// from whatever stands before it -- the tag's remainder, or the type where the +// whitespace in front of the tag went with the tag. +func appendedDirective(newTag string, afterType bool) string { + if newTag != "" || afterType { + return newTag + " " + optionalDirective + } + + return optionalDirective +} + +// tagPlacement records how a tagged field sits in its source. The visitor +// reads the bytes and the directives; the fix reads only the relations they +// answer. +type tagPlacement struct { + // canAppend is true when the tag ends the line the field starts on, with + // nothing but whitespace after it. A line comment written there runs to + // the end of the line, so it takes anything else on it -- a field, the + // closing brace, a comment, a semicolon -- into its own text. A tag ending + // a later line of the field is no place for one either: a directive there + // targets that line, which is not the field's. + canAppend bool + // anchors names the positions a directive is inserted above: one for each + // line the declaration's names occupy, since field metadata is read at the + // line of each name and one directive reaches only the line it is written + // above. + anchors []nameAnchor + // gapBeforeTag is true when anything but whitespace stands between the + // field's type and its tag. + gapBeforeTag bool +} + +// nameAnchor is a position a directive is inserted above, with whether the code +// there already begins its line and whether a directive there already answers +// the optionality of the name it precedes. +type nameAnchor struct { + // pos is where the directive is written. It is the name's own position, + // except where a line directive stands above the name: the directive then + // goes in front of that line, which aboveLineDirective explains. + pos token.Pos + startsLine bool + // optionalityDecided records that a directive at the name already answers + // its optionality, so the migration writes none. + optionalityDecided bool + // sharesLineDirective records that a block line directive stands on the + // name's own line, which is what a comment written above the name moves it + // past. + sharesLineDirective bool +} + +// movesALineDirective reports whether writing a directive above the names +// would move one off the line a line directive pinned it to. +func (p tagPlacement) movesALineDirective() bool { + for _, a := range p.anchors { + if a.sharesLineDirective && !a.optionalityDecided { + return true + } + } + + return false +} + +// nameAnchors lists one anchor for each line the declaration's names occupy. +// One declaration can spread them over several lines, and each name carries +// metadata of its own, down to the directive already written for it. A +// declaration with no name -- an embedded field -- is its own single anchor. +func (v *tagMigrationVisitor) nameAnchors(before token.Pos, field *ast.Field) []nameAnchor { + fset := v.pass.Fset + + if len(field.Names) == 0 { + return []nameAnchor{v.anchorAt(before, field.Pos())} + } + + anchors := make([]nameAnchor, 0, len(field.Names)) + anchored := 0 + prev := before + + for _, name := range field.Names { + if line := astutil.PhysicalLine(fset, name.Pos()); line != anchored { + anchors = append(anchors, v.anchorAt(prev, name.Pos())) + anchored = line + } + + prev = name.End() + } + + return anchors +} + +// anchorAt reads the anchor for the name at pos, which prev is the code before. +// +// The scanner resolves a directive to the line it targets, which is the answer +// the checker itself acts on. Asking it, rather than the comments around the +// name, keeps the two from disagreeing about whose directive a comment is. Only +// optional and enforce answer optionality; an ignore reaching the line belongs +// to the statement or the type around it, and field metadata reads neither of +// those from it. +func (v *tagMigrationVisitor) anchorAt(prev, pos token.Pos) nameAnchor { + fset := v.pass.Fset + o := v.processor.Directives().LookupPos(fset, pos).Optionality() + anchor, sharesLine := v.aboveLineDirective(pos) + + return nameAnchor{ + pos: anchor, + startsLine: astutil.PhysicalLine(fset, prev) != astutil.PhysicalLine(fset, pos), + optionalityDecided: o.Optional || o.Enforced, + sharesLineDirective: sharesLine, + } +} + +// aboveLineDirective returns where a directive for the name at pos is written: +// the start of the line directive standing above it, where there is one, and +// pos itself otherwise. +// +// A line directive names the line that follows it. A directive written between +// the two takes that line for itself and moves the name onto the next, which +// renumbers what the generator pinned. Writing in front of the line directive +// leaves the numbering as it stands, and the two comments form one group, which +// the scanner reads for the code below it. +func (v *tagMigrationVisitor) aboveLineDirective(pos token.Pos) (anchor token.Pos, sharesLine bool) { + fset := v.pass.Fset + + f := fset.File(pos) + if f == nil { + return pos, false + } + + src := v.source(pos) + if src == nil { + return pos, false + } + + line := astutil.PhysicalLine(fset, pos) + lineStart := f.LineStart(line) + + // The block form can stand on the name's own line, in front of it. The name + // then reads the line that directive names, and a comment written at the + // name takes that line for itself and moves the name off it. + if start, end := f.Offset(lineStart), f.Offset(pos); start >= 0 && end <= len(src) && + onlyLineDirective(src[start:end]) { + return lineStart, true + } + + // The first line of a file has nothing above it to read. + const firstLine = 1 + + if line <= firstLine { + return pos, false + } + + above := f.LineStart(line - 1) + + start, end := f.Offset(above), f.Offset(lineStart) + if start < 0 || end > len(src) { + return pos, false + } + + // A line directive is read at the start of a line and nowhere else, so one + // written further along renumbers nothing. + if !isLineDirective(src[start:end]) { + return pos, false + } + + return above, false +} + +// isLineDirective reports whether line opens with a directive that renumbers +// the source, in either of the two forms Go reads. +func isLineDirective(line []byte) bool { + return bytes.HasPrefix(line, []byte("//line ")) || bytes.HasPrefix(line, []byte("/*line ")) +} + +// onlyLineDirective reports whether prefix holds a block line directive and +// nothing else but whitespace. Only that form can stand on the same line as the +// code it renumbers: the line form takes the rest of its line. +func onlyLineDirective(prefix []byte) bool { + const opening, closing = "/*line ", "*/" + + trimmed := bytes.TrimLeft(prefix, " \t") + if !bytes.HasPrefix(trimmed, []byte(opening)) { + return false } - // Calculate start position (include leading space if removing entirely) - startPos := tag.Pos() - if newTag == "" { - startPos = field.Type.End() + _, after, found := bytes.Cut(trimmed[len(opening):], []byte(closing)) + if !found { + return false } - return analysis.SuggestedFix{ - Message: "fix", - TextEdits: []analysis.TextEdit{{ - Pos: startPos, - End: tag.End(), - NewText: []byte(newTag), - }}, + return len(bytes.TrimLeft(after, " \t")) == 0 +} + +// placeTag reads the placement of the field at index i. +func (v *tagMigrationVisitor) placeTag(st *ast.StructType, i int) tagPlacement { + field := st.Fields.List[i] + fset := v.pass.Fset + + before := st.Fields.Opening + if i > 0 { + before = st.Fields.List[i-1].End() + } + + src := v.source(field.Tag.Pos()) + fieldLine := astutil.PhysicalLine(fset, field.Pos()) + + return tagPlacement{ + canAppend: astutil.PhysicalLine(fset, field.Tag.End()) == fieldLine && + restOfLineBlank(fset, src, field.Tag.End()), + anchors: v.nameAnchors(before, field), + gapBeforeTag: !spanBlank(fset, src, field.Type.End(), field.Tag.Pos()), } } -var exhaustructTagPattern = regexp.MustCompile(`\s*exhaustruct:"[^"]*"`) +// source returns the bytes of the file pos belongs to, or nil when they cannot +// be read. Every caller treats nil as "cannot tell" and takes its cautious +// branch. +func (v *tagMigrationVisitor) source(pos token.Pos) []byte { + name := astutil.PhysicalFilename(v.pass.Fset, pos) + if src, ok := v.sources[name]; ok { + return src + } + + src, err := v.pass.ReadFile(name) + if err != nil { + src = nil + } + + v.sources[name] = src + + return src +} + +// spanBlank reports whether the source between from and to holds nothing but +// whitespace. The scan stops at the first byte that is not, so asking about +// the rest of a line costs the gap in front of whatever comes next on it. +func spanBlank(fset *token.FileSet, src []byte, from, to token.Pos) bool { + f := fset.File(from) + if f == nil || src == nil || to < from { + return false + } + + start, end := f.Offset(from), f.Offset(to) + if start < 0 || end > len(src) { + return false + } + + for _, b := range src[start:end] { + if !isGoSpace(b) { + return false + } + } + + return true +} + +// isGoSpace reports whether b is one of the four bytes Go reads as whitespace +// between tokens. +func isGoSpace(b byte) bool { + return b == ' ' || b == '\t' || b == '\r' || b == '\n' +} + +// restOfLineBlank reports whether nothing but whitespace follows pos on its +// line. +func restOfLineBlank(fset *token.FileSet, src []byte, pos token.Pos) bool { + f := fset.File(pos) + if f == nil { + return false + } + + // LineStart counts the lines of the file on disk, and PhysicalLine answers + // in the same count, so the number reads back into it. + if line := astutil.PhysicalLine(fset, pos); line < f.LineCount() { + return spanBlank(fset, src, pos, f.LineStart(line+1)) + } + + return spanBlank(fset, src, pos, f.Pos(f.Size())) +} func removeExhaustructFromTag(tagLiteral string) string { - tagLiteral = tagLiteral[1 : len(tagLiteral)-1] - tagLiteral = strings.TrimSpace(exhaustructTagPattern.ReplaceAllString(tagLiteral, "")) + tag, err := strconv.Unquote(tagLiteral) + if err != nil { + return tagLiteral + } - if tagLiteral == "" { + // Only the ASCII space separates entries: reflect skips exactly that byte + // between them, and every byte above it belongs to the key it is reading. + // Trimming by Unicode would take a non-breaking space off a key and rename + // it. + tag = strings.Trim(cutTagEntries(tag, exhaustructTagKey), " ") + if tag == "" { return "" } - return "`" + tagLiteral + "`" + // Struct tags are conventionally raw strings, but not every tag reaches + // source as one. A backtick ends the literal, and an interpreted tag can + // decode to bytes no raw literal may hold at all -- a NUL from \x00, which + // the scanner rejects wherever it stands. + if strconv.CanBackquote(tag) { + return "`" + tag + "`" + } + + return strconv.Quote(tag) +} + +// cutTagEntries removes every entry named key from tag, leaving the rest byte +// for byte as it stands. It reads the grammar reflect.StructTag reads, so that +// removal and lookup agree on where an entry starts and ends. Lookup answers +// with the first of two identical keys, so a fix that stopped at that one +// would leave the field deprecated. The bytes past the point the tag stops +// parsing have no structure to cut along, and stay. +func cutTagEntries(tag, key string) string { + var kept strings.Builder + + written := 0 + + for i := 0; i < len(tag); { + entryStart := i + + entryKey, quote, ok := scanTagKey(tag, i) + if !ok { + break + } + + end, ok := scanTagValue(tag, quote) + if !ok { + break + } + + i = end + + if entryKey == key { + // The space in front of the entry belongs to it, and dropping the + // entry without it would leave a gap twice as wide. + kept.WriteString(tag[written:entryStart]) + + written = i + } + } + + if written == 0 { + return tag + } + + kept.WriteString(tag[written:]) + + return kept.String() +} + +// scanTagKey returns the key of the entry starting at i, along with the index +// of the quote opening its value. It reports false when the bytes at i do not +// spell a key and the quote that opens its value. +func scanTagKey(tag string, i int) (key string, quote int, ok bool) { + for i < len(tag) && tag[i] == ' ' { + i++ + } + + start := i + for i < len(tag) && isTagKeyByte(tag[i]) { + i++ + } + + if i == start || i+1 >= len(tag) || tag[i] != ':' || tag[i+1] != '"' { + return "", 0, false + } + + return tag[start:i], i + 1, true +} + +// scanTagValue returns the index past the value that opens at quote. A +// backslash escapes the byte after it, so an escaped quote does not end the +// value. +func scanTagValue(tag string, quote int) (end int, ok bool) { + for i := quote + 1; i < len(tag); i++ { + if tag[i] == '"' { + return i + 1, true + } + + if tag[i] == '\\' { + i++ + } + } + + return 0, false +} + +// isTagKeyByte reports whether b may appear in a tag key. +func isTagKeyByte(b byte) bool { + return b > ' ' && b != ':' && b != '"' && b != 0x7f } diff --git a/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/astutil/file-parser.go b/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/astutil/file-parser.go index dc437fb2..ebf5be22 100644 --- a/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/astutil/file-parser.go +++ b/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/astutil/file-parser.go @@ -24,12 +24,12 @@ type ParseCallback func(fset *token.FileSet, file *ast.File) []analysis.Diagnost // // Safe for concurrent use. type FileParser struct { - mu sync.RWMutex `exhaustruct:"optional"` + mu sync.RWMutex //exhaustruct:optional parsed map[string]bool - callbacks []ParseCallback `exhaustruct:"optional"` - parseFlags parser.Mode `exhaustruct:"optional"` - hits atomic.Uint64 `exhaustruct:"optional"` - misses atomic.Uint64 `exhaustruct:"optional"` + callbacks []ParseCallback //exhaustruct:optional + parseFlags parser.Mode //exhaustruct:optional + hits atomic.Uint64 //exhaustruct:optional + misses atomic.Uint64 //exhaustruct:optional } type Option func(*FileParser) @@ -65,7 +65,7 @@ func (p *FileParser) ProcessFiles(fset *token.FileSet, files ...*ast.File) []ana var allDiags []analysis.Diagnostic for _, file := range files { - filename := fset.Position(file.Pos()).Filename + filename := PhysicalFilename(fset, file.Pos()) p.mu.RLock() @@ -100,9 +100,35 @@ func (p *FileParser) ProcessFiles(fset *token.FileSet, files ...*ast.File) []ana return allDiags } +// PhysicalPosition returns the on-disk position of pos, ignoring //line +// directives. Generated code routinely remaps positions onto a virtual file — a +// template or a grammar — that holds no Go source and often does not exist at +// all, so anything reading, keying, or comparing by position must ask for the +// physical one. +func PhysicalPosition(fset *token.FileSet, pos token.Pos) token.Position { + return fset.PositionFor(pos, false) +} + +// PhysicalFilename returns the on-disk file a position belongs to. +func PhysicalFilename(fset *token.FileSet, pos token.Pos) string { + return PhysicalPosition(fset, pos).Filename +} + +// PhysicalLine returns the on-disk line a position sits on. A generator is free +// to repeat one virtual line number, so lines compared as the same line -- and +// the source bytes read at one -- have to be physical ones. +func PhysicalLine(fset *token.FileSet, pos token.Pos) int { + return PhysicalPosition(fset, pos).Line +} + // ProcessFilename parses a file from disk and triggers all callbacks. -// Returns nil if already processed or if the file belongs to the Go -// distribution. +// Returns nil if already processed, if the file belongs to the Go +// distribution, or if it cannot be read or parsed. +// +// Not every filename reaching here names a readable Go file. -trimpath makes +// the compiler record module-relative paths, and generated code remaps +// positions onto templates and grammars; both arrive through export data and +// resolve to nothing on disk. func (p *FileParser) ProcessFilename(fset *token.FileSet, filename string) []analysis.Diagnostic { if isGoRootFile(filename) { return nil @@ -132,12 +158,13 @@ func (p *FileParser) ProcessFilename(fset *token.FileSet, filename string) []ana file, err := p.parse(fset, filename) if err != nil { + // A definition file that cannot be read carries no directives anyone + // can act on. Reporting the failure would put a diagnostic with no + // usable position on a package that does not own the file, so treat it + // as directive-free instead. p.parsed[filename] = true - return []analysis.Diagnostic{{ - Pos: token.NoPos, - Message: err.Error(), - }} + return nil } var allDiags []analysis.Diagnostic diff --git a/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/cache/cache.go b/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/cache/cache.go index c480c6b3..4ebe311f 100644 --- a/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/cache/cache.go +++ b/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/cache/cache.go @@ -8,14 +8,29 @@ import ( type Cache[K comparable, V any] struct { entries map[K]V - mu sync.RWMutex `exhaustruct:"optional"` - hits atomic.Uint64 `exhaustruct:"optional"` - misses atomic.Uint64 `exhaustruct:"optional"` + // pending holds the keys a caller is computing. A second caller for one of + // them waits on it rather than computing again, and callers for other keys + // are not held up: the lock covers the maps, never the work. + pending map[K]*computation[V] + mu sync.RWMutex //exhaustruct:optional + hits atomic.Uint64 //exhaustruct:optional + misses atomic.Uint64 //exhaustruct:optional +} + +// computation is one in-flight fill. The caller that opened it writes value, +// marks it filled and closes done; every other caller reads both after done is +// closed. A fill that panics closes done unfilled, and its waiters compute for +// themselves. +type computation[V any] struct { + done chan struct{} + value V //exhaustruct:optional + filled bool //exhaustruct:optional } func New[K comparable, V any](initialCapacity int) *Cache[K, V] { return &Cache[K, V]{ entries: make(map[K]V, initialCapacity), + pending: make(map[K]*computation[V]), } } @@ -56,37 +71,91 @@ func (c *Cache[K, V]) Set(key K, value V) { c.mu.Unlock() } -// GetOrSet uses double-check locking to avoid computing values that are -// cached between the initial read check and acquiring the write lock. +// GetOrSet returns the value stored under key, computing it once when it is +// absent. Callers racing for one key all receive the value that computation +// published: what the first of them computed, or what a Set that landed while +// it computed stored, since that Set is the later of the two writes. A Set +// after the publication is later still and leaves what was returned as stale +// as any Get result. Callers for other keys run alongside them, since compute +// is never called with the cache locked. +// +// A compute that panics releases the key: the panic reaches its own caller, and +// every caller waiting on that fill computes for itself. Nothing is stored for +// the key until one of them returns. func (c *Cache[K, V]) GetOrSet(key K, compute func() V) V { - c.mu.RLock() + for { + // A filled key is the common answer and needs no more than the read lock + // a Get takes, which keys with nothing in common do not hold each other + // out of. The exclusive lock is for opening or joining a computation. + if v, ok := c.Get(key); ok { + return v + } - if v, ok := c.entries[key]; ok { - c.mu.RUnlock() - c.hits.Add(1) + c.mu.Lock() - return v - } + if v, ok := c.entries[key]; ok { + c.mu.Unlock() + c.hits.Add(1) - c.mu.RUnlock() + return v + } - c.mu.Lock() - defer c.mu.Unlock() + if pending, ok := c.pending[key]; ok { + c.mu.Unlock() - // Double-check after acquiring write lock. - if v, ok := c.entries[key]; ok { - c.hits.Add(1) + <-pending.done + + if pending.filled { + c.hits.Add(1) + + return pending.value + } - return v + continue + } + + pending := &computation[V]{done: make(chan struct{})} + + c.pending[key] = pending + c.misses.Add(1) + + c.mu.Unlock() + + return c.fill(key, pending, compute) } +} - c.misses.Add(1) +// fill computes the value claimed under key and publishes it. The claim is +// released and done is closed whether compute returns or panics, so a fill that +// panics leaves no waiter parked and no key claimed for good. +func (c *Cache[K, V]) fill(key K, pending *computation[V], compute func() V) (v V) { + defer func() { + c.mu.Lock() + + // A Set may have landed while the value was being computed. It is the + // later write of the two, and publishing over it would leave the key + // holding what neither order of the two produces. + if pending.filled { + if stored, ok := c.entries[key]; ok { + pending.value = stored + } else { + c.entries[key] = pending.value + } + } + + delete(c.pending, key) + + c.mu.Unlock() + + close(pending.done) - v := compute() + v = pending.value + }() - c.entries[key] = v + pending.value = compute() + pending.filled = true - return v + return pending.value } func (c *Cache[K, V]) Stats() (hits, misses, size uint64) { diff --git a/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/directive/directive.go b/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/directive/directive.go index aa7f8d90..0c7b148f 100644 --- a/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/directive/directive.go +++ b/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/directive/directive.go @@ -11,6 +11,7 @@ var ( ErrEmptyDirective = e.New("empty directive") ErrUnknownDirective = e.New("unknown directive") ErrDuplicateDirectives = e.New("duplicate directives") + ErrDirectiveAfterSpace = e.New("directive after a space is not read") ) type Directive string @@ -42,41 +43,132 @@ func (ds Directives) Contains(d Directive) bool { return slices.Contains(ds, d) } +// Optionality is what a field's directives say about whether a literal has to +// write the field. These two are all that field metadata reads, so the order a +// comment lists them in, and an ignore written beside them, leave two fields +// annotated alike. +type Optionality struct { + Optional bool + Enforced bool +} + +// Optionality projects ds onto what field metadata reads. Every consumer of a +// field's directives reads them through this, so none of them can drift from +// the others. +func (ds Directives) Optionality() Optionality { + return Optionality{ + Optional: ds.Contains(Optional), + Enforced: ds.Contains(Enforce), + } +} + // directivePrefix is the exact prefix for exhaustruct directives. -// Format: //exhaustruct: [optional comment]. -const directivePrefix = "//exhaustruct:" +// Format: exhaustruct: [optional comment], written in either +// comment form. +const directivePrefix = "exhaustruct:" + +// commentBody strips the delimiters of either comment form, leaving the text a +// directive may be written in. Both forms carry directives: a line comment +// takes the rest of its line, while a block comment closes, so it can also sit +// ahead of further code or another comment on the same line. In either form the +// directive opens the comment, as //go:build does: a space after the delimiter +// makes the comment prose. +func commentBody(text string) string { + if body, ok := strings.CutPrefix(text, "//"); ok { + return body + } + + if body, ok := strings.CutPrefix(text, "/*"); ok { + return strings.TrimSuffix(body, "*/") + } + + return text +} + +// prosePrefix is the set of bytes that end a directive list, leaving what +// follows as prose. +const prosePrefix = " \t\n" func Parse(text string) (found bool, result Directives, errs []error) { - text, found = strings.CutPrefix(text, directivePrefix) + text, found = strings.CutPrefix(commentBody(text), directivePrefix) if !found { return false, nil, nil } - if idx := strings.IndexAny(text, " \t\n"); idx > 0 { - text = text[:idx] + // Anything past the first space is prose, not part of the directive. + list, prose := text, "" + if idx := strings.IndexAny(text, prosePrefix); idx >= 0 { + list, prose = text[:idx], text[idx:] } - if text == "" { + if list == "" { return true, nil, []error{ErrEmptyDirective} } - parts := strings.Split(text, ",") + result, errs = parseParts(list) + + if len(result) == 0 { + result = nil + + // Separators alone name no directive at all. + if len(errs) == 0 { + errs = append(errs, ErrEmptyDirective) + } + } + + // A list ending in a separator that prose continues with a directive name + // is a list the author meant to go on. Read as prose, that name would be + // dropped in silence. + if strings.HasSuffix(list, ",") { + if word := Directive(firstWord(prose)); word.IsValid() { + errs = append(errs, ErrDirectiveAfterSpace.WithField("directive", word)) + } + } + + return true, result, errs +} + +// firstWord returns the first word of prose, up to a space or a separator. +func firstWord(prose string) string { + prose = strings.TrimLeft(prose, prosePrefix) - result = make(Directives, 0, len(parts)) + if idx := strings.IndexAny(prose, prosePrefix+","); idx >= 0 { + return prose[:idx] + } + + return prose +} + +// parseParts splits the comma-separated body of a directive into directives, +// reporting the ones it does not recognise. +func parseParts(text string) (Directives, []error) { + parts := strings.Split(text, ",") - var hasDups bool + var ( + result = make(Directives, 0, len(parts)) + errs []error + hasDups bool + ) for _, part := range parts { + // A trailing or doubled separator leaves an empty part behind; it names + // nothing, so there is nothing to report about it. + if part == "" { + continue + } + d := Directive(part) if !d.IsValid() { errs = append(errs, ErrUnknownDirective.WithField("directive", d)) + continue } // giving the resulting size, linear search would be most efficient if slices.Contains(result, d) { hasDups = true + continue } @@ -87,9 +179,5 @@ func Parse(text string) (found bool, result Directives, errs []error) { errs = append(errs, ErrDuplicateDirectives) } - if len(result) == 0 { - result = nil - } - - return true, result, errs + return result, errs } diff --git a/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/directive/scanner.go b/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/directive/scanner.go index 0de61ad5..4c066851 100644 --- a/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/directive/scanner.go +++ b/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/directive/scanner.go @@ -1,8 +1,10 @@ package directive import ( + "cmp" "go/ast" "go/token" + "slices" "golang.org/x/tools/go/analysis" @@ -14,6 +16,21 @@ import ( type Scanner struct { parser *astutil.FileParser cache *cache.Cache[string, fileDirectives] + // diags holds the parse diagnostics of each file, keyed by physical + // filename. A file's diagnostics belong to the package that owns it, not to + // whichever package happened to trigger the parse first. + diags *cache.Cache[string, []fileDiagnostic] +} + +// fileDiagnostic is one finding of a file, held without a token.Pos. A Pos is +// an index into the FileSet that produced it and means another file, or +// nothing, in any other. The file is parsed by whichever pass reaches it first +// and reported by the one that owns it, and those two need not share a FileSet, +// so the position is kept as an offset into the file and resolved again +// against the FileSet the owner reports with. +type fileDiagnostic struct { + offset int + message string } const cachePreallocSize = 64 @@ -24,6 +41,7 @@ func NewScanner(parser *astutil.FileParser) *Scanner { s := &Scanner{ parser: parser, cache: cache.New[string, fileDirectives](cachePreallocSize), + diags: cache.New[string, []fileDiagnostic](cachePreallocSize), } parser.OnFileParsed(s.onFileParsed) @@ -32,44 +50,108 @@ func NewScanner(parser *astutil.FileParser) *Scanner { } func (s *Scanner) onFileParsed(fset *token.FileSet, file *ast.File) []analysis.Diagnostic { - filename := fset.Position(file.Pos()).Filename + filename := astutil.PhysicalFilename(fset, file.Pos()) fd, diags := s.parseFileDirectives(fset, file) s.cache.Set(filename, fd) + s.diags.Set(filename, offsetDiagnostics(fset, diags)) return diags } -// ProcessFiles pre-populates the cache by delegating to FileParser.ProcessFiles. -// Returns diagnostics from directive parsing. +// offsetDiagnostics keeps what a diagnostic says and where it says it, with the +// position taken as an offset into its file. +func offsetDiagnostics(fset *token.FileSet, diags []analysis.Diagnostic) []fileDiagnostic { + held := make([]fileDiagnostic, 0, len(diags)) + + for _, d := range diags { + f := fset.File(d.Pos) + if f == nil { + continue + } + + held = append(held, fileDiagnostic{offset: f.Offset(d.Pos), message: d.Message}) + } + + return held +} + +// ProcessFiles pre-populates the cache by delegating to FileParser.ProcessFiles, +// and returns the directive diagnostics of exactly the given files. +// +// The diagnostics come from the per-file cache rather than from this parse, so a +// file reports its own findings even when an earlier lookup from another package +// already parsed it. func (s *Scanner) ProcessFiles(fset *token.FileSet, files ...*ast.File) []analysis.Diagnostic { - return s.parser.ProcessFiles(fset, files...) + s.parser.ProcessFiles(fset, files...) + + var diags []analysis.Diagnostic + + for _, file := range files { + held, ok := s.diags.Peek(astutil.PhysicalFilename(fset, file.Pos())) + if !ok { + continue + } + + f := fset.File(file.Pos()) + if f == nil { + continue + } + + for _, d := range held { + if d.offset < 0 || d.offset > f.Size() { + continue + } + + diags = append(diags, analysis.Diagnostic{ + Pos: f.Pos(d.offset), + Message: d.message, + }) + } + } + + return diags +} + +// LookupPos returns the directives written at the line of pos, read from the +// physical file whatever a //line directive renames it to. +// +// A caller holding a token.Pos reaches the directives this way. token.Position +// carries no sign of whether it was adjusted, so a lookup made with an adjusted +// one finds nothing and says nothing about it. +func (s *Scanner) LookupPos(fset *token.FileSet, pos token.Pos) Directives { + return s.Lookup(fset, astutil.PhysicalPosition(fset, pos)) } -// Lookup returns the directives at the given source position. -// If the file is not in cache, triggers FileParser.ProcessFilename to parse it. -func (s *Scanner) Lookup(fset *token.FileSet, pos token.Position) (Directives, []analysis.Diagnostic) { +// Lookup returns the directives at the given source position, which must be +// unadjusted — see astutil.PhysicalFilename. Use LookupPos where the caller +// holds a token.Pos. If the file is not in cache, triggers +// FileParser.ProcessFilename to parse it. +// +// Diagnostics found by such an on-demand parse are not returned: the file +// belongs to another package, which reports them through ProcessFiles. +func (s *Scanner) Lookup(fset *token.FileSet, pos token.Position) Directives { if pos.Filename == "" { - return nil, nil + return nil } if fd, ok := s.cache.Get(pos.Filename); ok { - return fd[pos.Line], nil + return fd[pos.Line] } // Cache miss - parse file (triggers onFileParsed callback, which stores // the result via cache.Set and increments the miss counter). - diags := s.parser.ProcessFilename(fset, pos.Filename) + s.parser.ProcessFilename(fset, pos.Filename) // Peek avoids counting this self-induced read as a hit — the miss was // already recorded by Set above. if fd, ok := s.cache.Peek(pos.Filename); ok { - return fd[pos.Line], diags + return fd[pos.Line] } // Still not in cache means parsing failed. - return nil, diags + return nil } func (s *Scanner) Stats() (hits, misses, size uint64) { @@ -89,59 +171,158 @@ func (*Scanner) parseFileDirectives(fset *token.FileSet, file *ast.File) (fileDi return nil, diagnostics } + retargetInline(directives, codeLines(fset, file, commentLines(directives))) + + result, conflicts := reduceByTarget(directives) + + return result, append(diagnostics, conflicts...) +} + +// commentLines lists the lines of a directive comment that code can share. +// Only these are ever asked of the code lines, so a file's whole line table +// need not be built to answer them. +// +// A comment holds every line between its first and its last, so code reaches +// only those two: one before the comment opens, the other after it closes. +func commentLines(directives map[int][]parsedDirective) map[int]bool { + lines := make(map[int]bool, len(directives)) + + for _, ds := range directives { + for _, d := range ds { + for _, line := range d.sharableLines() { + lines[line] = true + } + } + } + + return lines +} + +// codeLines maps each line of file that carries code and is asked about to the +// line a directive beside it targets, which is what tells such a directive from +// one written on a line of its own. +// +// A line usually targets itself. The line a multiline construct closes on holds +// no node that starts there, and targets the line the construct opened on +// instead: that is the line a lookup asks for the construct by, so a directive +// written beside the closing token reaches it. Constructs closing on one line +// are nested, and the innermost is the one the directive stands beside, so the +// latest opening line wins. A line that opens something of its own still +// targets itself, which no opening line above it can outrank. +func codeLines(fset *token.FileSet, file *ast.File, asked map[int]bool) map[int]int { + lines := make(map[int]int, len(asked)) + ast.Inspect(file, func(n ast.Node) bool { switch n.(type) { case nil, *ast.Comment, *ast.CommentGroup: return false } - line := fset.Position(n.Pos()).Line - if d, ok := directives[line]; ok { - d.targetLine = line - directives[line] = d + start := astutil.PhysicalLine(fset, n.Pos()) + + if end := astutil.PhysicalLine(fset, n.End()); end != start && asked[end] { + if target, taken := lines[end]; !taken || start > target { + lines[end] = start + } + } + + if asked[start] { + lines[start] = start } return true }) - result := make(fileDirectives, len(directives)) + return lines +} - for line, d := range directives { - _, exists := result[d.targetLine] - if !exists { - result[d.targetLine] = d.directives - continue +// retargetInline points a directive that shares a line with code at that line. +// One whose comment stands alone keeps the line below, which it already +// carries. A block comment spans lines and code can sit against either end of +// it, so every line it covers is asked. +func retargetInline(directives map[int][]parsedDirective, codeLines map[int]int) { + for _, ds := range directives { + for i := range ds { + if line, ok := ds[i].codeLine(codeLines); ok { + ds[i].targetLine = line + } } + } +} - pos := d.pos +// reduceByTarget keeps one directive set for each target line -- the first +// written -- and reports every other directive aimed at that line as a +// conflict. +func reduceByTarget(directives map[int][]parsedDirective) (fileDirectives, []analysis.Diagnostic) { + byTarget := make(map[int][]parsedDirective, len(directives)) - // directives from block comments win over inline comments - if line != d.targetLine { - result[d.targetLine] = d.directives - pos = directives[d.targetLine].pos + for _, ds := range directives { + for _, d := range ds { + byTarget[d.targetLine] = append(byTarget[d.targetLine], d) } + } - diagnostics = append(diagnostics, analysis.Diagnostic{ - Pos: pos, - Message: "directive ignored, conflicting directive already exists for the same target line", + var diagnostics []analysis.Diagnostic + + result := make(fileDirectives, len(byTarget)) + + for target, ds := range byTarget { + slices.SortFunc(ds, func(a, b parsedDirective) int { + return cmp.Compare(a.pos, b.pos) }) + + result[target] = ds[0].directives + + for _, d := range ds[1:] { + diagnostics = append(diagnostics, analysis.Diagnostic{ + Pos: d.pos, + Message: "directive ignored, conflicting directive already exists for the same target line", + }) + } } return result, diagnostics } type parsedDirective struct { - pos token.Pos + pos token.Pos + // line and endLine bound the comment the directive is written in. A line + // comment occupies one line; a block comment covers a range, and code + // beside any line of it makes the directive inline with that code. + line int + endLine int targetLine int directives Directives } +// codeLine returns what the first line of the directive's comment that carries +// code targets. +func (d parsedDirective) codeLine(codeLines map[int]int) (int, bool) { + for _, line := range d.sharableLines() { + if target, ok := codeLines[line]; ok { + return target, true + } + } + + return 0, false +} + +// sharableLines returns the lines of the directive's comment that code can +// share: the one it is written on and the one its comment closes on, which are +// one line for a line comment. +func (d parsedDirective) sharableLines() [2]int { + return [2]int{d.line, d.endLine} +} + func parseCommentDirectives( fset *token.FileSet, comments []*ast.CommentGroup, -) (map[int]parsedDirective, []analysis.Diagnostic) { +) (map[int][]parsedDirective, []analysis.Diagnostic) { var ( - directives = make(map[int]parsedDirective) + // Keyed by the line the directive is written on, and holding every + // directive on it: two comment groups can share one line, and both + // reach the reduction by target line. + directives = make(map[int][]parsedDirective) diagnostics []analysis.Diagnostic ) @@ -177,11 +358,18 @@ func parseCommentDirectives( } hasDirective = true - directives[fset.Position(pos).Line] = parsedDirective{ - pos: pos, - targetLine: fset.Position(cg.End()).Line + 1, + + line := astutil.PhysicalLine(fset, pos) + + directives[line] = append(directives[line], parsedDirective{ + pos: pos, + line: line, + endLine: astutil.PhysicalLine(fset, comment.End()), + // The whole group carries the directive down to the code, so a + // note written under it does not cut the reach short. + targetLine: astutil.PhysicalLine(fset, cg.End()) + 1, directives: parsed, - } + }) } } diff --git a/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/pattern/list.go b/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/pattern/list.go index c715839f..6f55559e 100644 --- a/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/pattern/list.go +++ b/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/pattern/list.go @@ -34,14 +34,24 @@ func NewList(patterns ...string) (List, error) { // MatchFullString returns true if any regex matches the entire string. // Pattern "test" matches "test" but not "testing" or "contest". func (l List) MatchFullString(target string) bool { - if len(l) == 0 { - return false + for i := range len(l) { + if matchesFull(l[i], target) { + return true + } } + return false +} + +// MatchFullStringExcept returns true if any regex matches the entire target +// without also matching the whole of excepted. +// +// A pattern broad enough to select both selects neither of them in particular, +// which is what tells a rule written for one of the two from one that reaches +// it through the other. +func (l List) MatchFullStringExcept(target, excepted string) bool { for i := range len(l) { - // A match spanning [0, len(target)) covers every byte of target, so the - // matched substring is target itself — no need to allocate it for comparison. - if loc := l[i].FindStringIndex(target); loc != nil && loc[0] == 0 && loc[1] == len(target) { + if matchesFull(l[i], target) && !matchesFull(l[i], excepted) { return true } } @@ -49,6 +59,18 @@ func (l List) MatchFullString(target string) bool { return false } +// matchesFull reports whether re matches the whole of target. +// +// A match spanning [0, len(target)) covers every byte of target, so the matched +// substring is target itself -- no need to allocate it for comparison. Patterns +// match leftmost-longest, so the span of the match found at 0 is the longest +// one there is. +func matchesFull(re *regexp.Regexp, target string) bool { + loc := re.FindStringIndex(target) + + return loc != nil && loc[0] == 0 && loc[1] == len(target) +} + func compilePattern(pattern string) (*regexp.Regexp, error) { if pattern == "" { return nil, e.New("empty regular expression is not allowed") @@ -59,5 +81,16 @@ func compilePattern(pattern string) (*regexp.Regexp, error) { return nil, e.NewFrom("compile regular expression", err, fields.F("pattern", pattern)) } + // Match leftmost-longest. The default is leftmost-first, under which + // `.*\.(Config|ConfigOption)` commits to the Config branch against + // "pkg.ConfigOption" and stops short of the end, so testing the span of the + // match rejects a pattern that does match the whole string. The longest + // match at position 0 spans the target whenever any match does. + // + // The pattern is compiled as the author wrote it. Wrapping it to anchor + // would put the author's own anchors inside a group and make what a pattern + // means depend on how it is written. + re.Longest() + return re, nil } diff --git a/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/structure/origin-scanner.go b/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/structure/origin-scanner.go deleted file mode 100644 index 4f8c774d..00000000 --- a/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/structure/origin-scanner.go +++ /dev/null @@ -1,121 +0,0 @@ -package structure - -import ( - "go/ast" - "go/token" - - "golang.org/x/tools/go/analysis" - - "dev.gaijin.team/go/exhaustruct/v5/internal/astutil" - "dev.gaijin.team/go/exhaustruct/v5/internal/cache" -) - -type TypeOrigin uint8 - -const ( - OriginUnknown TypeOrigin = iota - OriginStruct - OriginAlias - OriginDerived -) - -type fileOrigins map[string]TypeOrigin - -// OriginScanner extracts type origin information from AST files. -// Registers with FileParser to process files as they are parsed. -// Thread-safe. -type OriginScanner struct { - parser *astutil.FileParser - cache *cache.Cache[string, fileOrigins] -} - -const originCachePrealloc = 64 - -func NewOriginScanner(parser *astutil.FileParser) *OriginScanner { - o := &OriginScanner{ - parser: parser, - cache: cache.New[string, fileOrigins](originCachePrealloc), - } - - parser.OnFileParsed(o.onFileParsed) - - return o -} - -func (o *OriginScanner) onFileParsed( - fset *token.FileSet, - file *ast.File, -) []analysis.Diagnostic { - filename := fset.Position(file.Pos()).Filename - - origins := extractTypeOrigins(file) - - o.cache.Set(filename, origins) - - return nil -} - -// Lookup returns the type origin for a named type in the given file. -// Triggers on-demand parsing if file is not cached. -func (o *OriginScanner) Lookup( - fset *token.FileSet, - filename string, - typeName string, -) TypeOrigin { - if filename == "" || typeName == "" { - return OriginUnknown - } - - if origins, ok := o.cache.Get(filename); ok { - return origins[typeName] - } - - // Cache miss - parse file (onFileParsed stores the result via cache.Set - // and records the miss). Peek avoids inflating the hit rate by re-reading - // the entry we just wrote. - o.parser.ProcessFilename(fset, filename) - - if origins, ok := o.cache.Peek(filename); ok { - return origins[typeName] - } - - return OriginUnknown -} - -func (o *OriginScanner) Stats() (hits, misses, size uint64) { - return o.cache.Stats() -} - -func extractTypeOrigins(file *ast.File) fileOrigins { - origins := make(fileOrigins) - - for _, decl := range file.Decls { - gd, ok := decl.(*ast.GenDecl) - if !ok || gd.Tok != token.TYPE { - continue - } - - for _, spec := range gd.Specs { - ts, ok := spec.(*ast.TypeSpec) - if !ok { - continue - } - - origins[ts.Name.Name] = classifyTypeSpec(ts) - } - } - - return origins -} - -func classifyTypeSpec(ts *ast.TypeSpec) TypeOrigin { - if ts.Assign != token.NoPos { - return OriginAlias - } - - if _, isStruct := ts.Type.(*ast.StructType); isStruct { - return OriginStruct - } - - return OriginDerived -} diff --git a/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/structure/processor.go b/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/structure/processor.go index 1c63030e..483e5214 100644 --- a/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/structure/processor.go +++ b/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/structure/processor.go @@ -4,23 +4,40 @@ import ( "go/token" "go/types" - "golang.org/x/tools/go/analysis" - + "dev.gaijin.team/go/exhaustruct/v5/internal/astutil" "dev.gaijin.team/go/exhaustruct/v5/internal/cache" "dev.gaijin.team/go/exhaustruct/v5/internal/directive" "dev.gaijin.team/go/exhaustruct/v5/internal/pattern" ) +// structKey identifies a struct type in the struct cache. +// +// A source position cannot serve as that identity. Export data is not required +// to carry a faithful one: gcimporter discards the column outright and clamps +// any line past 64Ki to 1, so distinct declarations inside one dependency file +// collapse onto a single token.Position. go/types objects, in contrast, are +// unique per declaration per loaded package. +type structKey struct { + // name is the type's TypeName, nil for anonymous structs. + name *types.TypeName + // strct is the underlying struct type. It alone identifies an anonymous + // struct, and guards against a shared TypeName for a named one. + strct *types.Struct + // callerPkg is set for anonymous structs only, whose metadata is derived + // from the package that uses them. Named types are caller-independent and + // share one entry across every package that references them. + callerPkg *types.Package +} + type Processor struct { directives *directive.Scanner - origins *OriginScanner - fieldsCache *cache.Cache[*types.Struct, structFields] - structCache *cache.Cache[token.Position, *Struct] + fieldsCache *cache.Cache[*types.Struct, *structFields] + structCache *cache.Cache[structKey, *Struct] - enforce pattern.List `exhaustruct:"optional"` - ignore pattern.List `exhaustruct:"optional"` - optional pattern.List `exhaustruct:"optional"` - allowEmpty pattern.List `exhaustruct:"optional"` + enforce pattern.List //exhaustruct:optional + ignore pattern.List //exhaustruct:optional + optional pattern.List //exhaustruct:optional + allowEmpty pattern.List //exhaustruct:optional } type Option func(*Processor) @@ -43,12 +60,11 @@ func WithAllowEmpty(patterns pattern.List) Option { const cachePreallocSize = 64 -func NewProcessor(directives *directive.Scanner, origins *OriginScanner, opts ...Option) *Processor { +func NewProcessor(directives *directive.Scanner, opts ...Option) *Processor { p := &Processor{ directives: directives, - origins: origins, - fieldsCache: cache.New[*types.Struct, structFields](cachePreallocSize), - structCache: cache.New[token.Position, *Struct](cachePreallocSize), + fieldsCache: cache.New[*types.Struct, *structFields](cachePreallocSize), + structCache: cache.New[structKey, *Struct](cachePreallocSize), } for _, opt := range opts { @@ -79,33 +95,28 @@ func (p *Processor) ResolveStruct( strct *types.Struct, pos token.Pos, callerPkg *types.Package, -) (*Struct, []analysis.Diagnostic) { +) *Struct { if strct == nil { - return nil, nil + return nil } - position := fset.Position(pos) - - // Check cache before allocating - if position.IsValid() { - if cached, ok := p.structCache.Get(position); ok { - return cached, nil - } + key := structKey{name: typeName, strct: strct, callerPkg: nil} + if typeName == nil { + key.callerPkg = callerPkg } - s := p.buildStruct(typeName, position, callerPkg) + // One entry per key, filled once: passes run concurrently, and two of them + // racing to build the same type would each pay for it and each hold a + // value the other does not. + return p.structCache.GetOrSet(key, func() *Struct { + s := p.buildStruct(typeName, astutil.PhysicalPosition(fset, pos), callerPkg) - diags := p.populateFields(fset, s, strct) - p.resolveStructOrigin(fset, s) + p.populateFields(fset, s, strct) + p.resolveStructDirectives(fset, s) + p.matchStructPatterns(s) - diags = append(diags, p.resolveStructDirectives(fset, s)...) - p.matchStructPatterns(s) - - if s.Position.IsValid() { - p.structCache.Set(s.Position, s) - } - - return s, diags + return s + }) } // buildStruct creates Struct metadata from type info. @@ -130,29 +141,27 @@ func (*Processor) buildStruct(typeName *types.TypeName, pos token.Position, call } } -func (p *Processor) getStructFields(fset *token.FileSet, strct *types.Struct) (structFields, []analysis.Diagnostic) { +// getStructFields returns the raw field data of strct, from the cache when it +// is there. +func (p *Processor) getStructFields(fset *token.FileSet, strct *types.Struct) *structFields { if fields, ok := p.fieldsCache.Get(strct); ok { - return fields, nil + return fields } - fields, diags := p.resolveStructFields(fset, strct) + fields := p.resolveStructFields(fset, strct) p.fieldsCache.Set(strct, fields) - return fields, diags + return fields } -func (p *Processor) resolveStructFields( - fset *token.FileSet, - strct *types.Struct, -) (structFields, []analysis.Diagnostic) { - result := structFields{ +func (p *Processor) resolveStructFields(fset *token.FileSet, strct *types.Struct) *structFields { + result := &structFields{ + strct: strct, packagePath: "", fields: make([]fieldInfo, 0, strct.NumFields()), } - var diags []analysis.Diagnostic - for f := range strct.Fields() { if result.packagePath == "" && f.Pkg() != nil { result.packagePath = f.Pkg().Path() @@ -163,83 +172,171 @@ func (p *Processor) resolveStructFields( exported: f.Exported(), } - if p.directives != nil { - fieldPos := fset.Position(f.Pos()) - dirs, d := p.directives.Lookup(fset, fieldPos) + if f.Embedded() { + if embedded, ok := embeddedStruct(f.Type()); ok { + field.embedded = p.getStructFields(fset, embedded) + } + } - diags = append(diags, d...) + if p.directives != nil { + o := p.directives.LookupPos(fset, f.Pos()).Optionality() - field.enforced = dirs.Contains(directive.Enforce) - field.optional = dirs.Contains(directive.Optional) + field.enforced = o.Enforced + field.optional = o.Optional } result.fields = append(result.fields, field) } - return result, diags + return result +} + +func (p *Processor) populateFields(fset *token.FileSet, s *Struct, strct *types.Struct) { + s.Fields = p.buildFields(s, p.getStructFields(fset, strct)) + + s.Fields.paths = indexPromotion(&s.Fields) +} + +// buildFields turns resolved field data into the Struct's own view of it, +// applying pattern matching and access filtering. Embedded structs are built +// too, since a literal may name their fields directly. +// +// Fields are external when declared in a different package than the struct type. +// This happens for derived types and aliases from external packages. +// +// Rationale behind that filtering is that noone except package that has declared +// the struct can access unexported fields, therefore we can simply filter them +// out to save up on storage. Usage of derived type from the package of structure +// definition is simply impossible since it will cause import cycle - thus, such +// filtering is safe. An unexported embedded field is the exception, since a +// literal reaches the exported fields it promotes. +// +// The walk runs level by level and opens each struct once, at the depth it is +// first reached and only where it is reached once. Go resolves a promoted name +// to its shallowest occurrence and to none at all where two occurrences share a +// depth, so every other reach promotes nothing a literal can write. Opening +// them all would cost one subtree per path through the embedding graph, which +// doubles with every layer that reaches the one below it twice. +func (p *Processor) buildFields(s *Struct, resolved *structFields) Fields { + root, pending := p.levelFields(s, resolved) + opened := map[*types.Struct]bool{resolved.strct: true} + + for level := attribute(&root, pending); len(level) > 0; { + occurrences := make(map[*types.Struct]int, len(level)) + + for _, e := range level { + occurrences[e.resolved.strct]++ + } + + var next []embeddedField + + for _, e := range level { + if opened[e.resolved.strct] || occurrences[e.resolved.strct] > 1 { + continue + } + + opened[e.resolved.strct] = true + + sub, below := p.levelFields(s, e.resolved) + + e.owner.Items[e.index].Embedded = &sub + next = append(next, attribute(&sub, below)...) + } + + for r := range occurrences { + opened[r] = true + } + + level = next + } + + return root } -func (p *Processor) populateFields(fset *token.FileSet, s *Struct, strct *types.Struct) []analysis.Diagnostic { - resolved, diags := p.getStructFields(fset, strct) +// embeddedField is one embedded struct waiting to be opened, and the field of +// an already built level that holds it. +type embeddedField struct { + owner *Fields + index int + resolved *structFields +} - // Fields are external when declared in a different package than the struct type. - // This happens for derived types and aliases from external packages. - // - // Rationale behind that filtering is that noone except package that has declared - // the struct can access unexported fields, therefore we can simply filter them - // out to save up on storage. Usage of derived type from the package of structure - // definition is simply impossible since it will cause import cycle - thus, such - // filtering is safe. +// attribute names owner as the level the pending fields belong to. +func attribute(owner *Fields, pending []embeddedField) []embeddedField { + for i := range pending { + pending[i].owner = owner + } + + return pending +} + +// levelFields builds the fields of one struct, without opening the structs it +// embeds, which it returns instead. +func (p *Processor) levelFields(s *Struct, resolved *structFields) (Fields, []embeddedField) { fieldsExternal := resolved.packagePath != s.PackagePath() - s.Fields = Fields{ + fields := Fields{ PackagePath: resolved.packagePath, Items: make([]Field, 0, len(resolved.fields)), + paths: nil, } + var pending []embeddedField + for _, sf := range resolved.fields { - if fieldsExternal && !sf.exported { + // An unexported field declared in another package can never be written + // here. An embedded one is still kept: a literal reaches the exported + // fields under it by promotion, and the embedded field itself stays + // unreported, since nothing may require what nobody can write. + if fieldsExternal && !sf.exported && sf.embedded == nil { continue } + // Promoted fields are addressed by the name a literal of s writes, so + // every level shares the outer type's path. fieldPath := s.FullPath + "#" + sf.name - s.Fields.Items = append(s.Fields.Items, Field{ + fields.Items = append(fields.Items, Field{ Name: sf.name, Exported: sf.exported, Enforced: sf.enforced, Optional: sf.optional, - PatternEnforced: p.enforce.MatchFullString(fieldPath), - PatternOptional: p.optional.MatchFullString(fieldPath), + PatternEnforced: p.enforce.MatchFullStringExcept(fieldPath, s.FullPath), + PatternOptional: p.optional.MatchFullStringExcept(fieldPath, s.FullPath), + Embedded: nil, }) + + if sf.embedded != nil { + pending = append(pending, embeddedField{ + owner: nil, + index: len(fields.Items) - 1, + resolved: sf.embedded, + }) + } } - return diags + return fields, pending } -func (p *Processor) resolveStructOrigin(fset *token.FileSet, s *Struct) { - if !s.Position.IsValid() || s.Name == AnonymousName { - return - } - - origin := p.origins.Lookup(fset, s.Position.Filename, s.Name) +// embeddedStruct returns the struct type an embedded field promotes fields +// from. Embedded pointers yield nothing: a composite literal cannot reach +// through them, so their fields are not promotable in this context. +func embeddedStruct(typ types.Type) (*types.Struct, bool) { + strct, ok := types.Unalias(typ).Underlying().(*types.Struct) - s.IsAlias = origin == OriginAlias - s.IsDerived = origin == OriginDerived + return strct, ok } -func (p *Processor) resolveStructDirectives(fset *token.FileSet, s *Struct) []analysis.Diagnostic { +func (p *Processor) resolveStructDirectives(fset *token.FileSet, s *Struct) { if p.directives == nil || !s.Position.IsValid() { - return nil + return } - dirs, diags := p.directives.Lookup(fset, s.Position) + dirs := p.directives.Lookup(fset, s.Position) s.Enforced = dirs.Contains(directive.Enforce) s.Ignored = dirs.Contains(directive.Ignore) s.Optional = dirs.Contains(directive.Optional) - - return diags } func (p *Processor) matchStructPatterns(s *Struct) { diff --git a/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/structure/struct.go b/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/structure/struct.go index c6cd49f2..48b5a04c 100644 --- a/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/structure/struct.go +++ b/vendor/dev.gaijin.team/go/exhaustruct/v5/internal/structure/struct.go @@ -3,25 +3,37 @@ package structure import ( "go/ast" "go/token" + "go/types" "strings" ) const AnonymousName = "" +// BlankFieldName is the name go/types gives a blank struct field. +const BlankFieldName = "_" + // fieldInfo contains raw field data independent of type name. type fieldInfo struct { // name is the name of the field. name string // exported indicates if the field is exported. - exported bool `exhaustruct:"optional"` + exported bool //exhaustruct:optional // enforced indicates if the field is enforced via directive. - enforced bool `exhaustruct:"optional"` + enforced bool //exhaustruct:optional // optional indicates if the field is optional via directive. - optional bool `exhaustruct:"optional"` + optional bool //exhaustruct:optional + // embedded holds the fields an embedded field promotes, nil otherwise. + embedded *structFields //exhaustruct:optional } // structFields contains field information for a struct, independent of type name. type structFields struct { + // strct is the type this field data was read from, and the identity the + // promotion walk prunes by. A cached value would answer as well only while + // one goroutine fills the cache: two passes missing at once each build a + // value of their own, and one struct reached through two of them would then + // read as two. + strct *types.Struct // packagePath is the package path where fields are declared. packagePath string // fields is the list of fields in declaration order. @@ -33,22 +45,18 @@ type Struct struct { FullPath string PackageName string - Position token.Position `exhaustruct:"optional"` - Fields Fields `exhaustruct:"optional"` - - Enforced bool `exhaustruct:"optional"` - Ignored bool `exhaustruct:"optional"` - Optional bool `exhaustruct:"optional"` + Position token.Position //exhaustruct:optional + Fields Fields //exhaustruct:optional - PatternEnforced bool `exhaustruct:"optional"` - PatternIgnored bool `exhaustruct:"optional"` - PatternOptional bool `exhaustruct:"optional"` + Enforced bool //exhaustruct:optional + Ignored bool //exhaustruct:optional + Optional bool //exhaustruct:optional - AllowEmptyDecl bool `exhaustruct:"optional"` + PatternEnforced bool //exhaustruct:optional + PatternIgnored bool //exhaustruct:optional + PatternOptional bool //exhaustruct:optional - // Detected via OriginScanner AST inspection before types.Unalias. - IsAlias bool `exhaustruct:"optional"` - IsDerived bool `exhaustruct:"optional"` + AllowEmptyDecl bool //exhaustruct:optional } // PackagePath returns the package path of the struct type. @@ -77,16 +85,20 @@ func (s *Struct) IsOptional() bool { // SkippedFields returns missing required fields for a composite literal. // callerPkgPath is used to determine if unexported fields are accessible. +// canNamePromoted tells whether the literal may write a promoted field as a key, +// which Go permits since 1.27 (golang/go#77245). // For positional literals: returns fields after the last provided element. // For named literals: returns fields not present in the literal. -func (s *Struct) SkippedFields(lit *ast.CompositeLit, callerPkgPath string) []Field { - externalPkg := s.Fields.PackagePath != callerPkgPath - - if isNamedLiteral(lit) { - return s.skippedNamed(lit, externalPkg) +func (s *Struct) SkippedFields(lit *ast.CompositeLit, callerPkgPath string, canNamePromoted bool) []Field { + // An empty literal supplies nothing and can still be written in either + // form, so it is read as a keyed literal with no keys. The two then answer + // alike: neither can name a blank field, and both reach a field enforced + // under an embedded one. + if isNamedLiteral(lit) || len(lit.Elts) == 0 { + return s.skippedNamed(lit, callerPkgPath, canNamePromoted) } - return s.skippedPositional(len(lit.Elts), externalPkg) + return s.skippedPositional(len(lit.Elts), s.Fields.PackagePath != callerPkgPath) } // isNamedLiteral checks if a composite literal uses named fields. It treats @@ -124,33 +136,258 @@ func (s *Struct) skippedPositional(count int, externalPkg bool) []Field { return missing } -func (s *Struct) skippedNamed(lit *ast.CompositeLit, externalPkg bool) []Field { - present := make(map[string]bool, len(lit.Elts)) +func (s *Struct) skippedNamed(lit *ast.CompositeLit, callerPkgPath string, canNamePromoted bool) []Field { + groups := s.Fields.groupKeys(lit, callerPkgPath, canNamePromoted) - for _, elt := range lit.Elts { - if kv, ok := elt.(*ast.KeyValueExpr); ok { - if k, ok := kv.Key.(*ast.Ident); ok { - present[k.Name] = true - } + // Capacity is a hint, not a contract: a key may name a field absent from + // Items, since unexported fields are pruned for types whose fields come + // from another package. Clamp so a mismatch can never turn into a makeslice + // panic. + missing := make([]Field, 0, max(len(s.Fields.Items)-groups.namedCount(), 0)) + + missing = s.skippedIn(&s.Fields, groups, callerPkgPath, canNamePromoted, missing) + + if len(missing) == 0 { + return nil + } + + return missing +} + +// skippedIn returns the required fields of fs the literal behind groups leaves +// uninitialized. +// +// Since Go 1.27 a composite literal may name a promoted field in place of the +// embedded field carrying it (golang/go#77245). Naming both a promoted field +// and its enclosing embedded field does not compile, so an embedded field is +// either named directly, partially filled through promoted names -- in which +// case its own missing fields are reported, each nameable from the same literal +// -- or absent altogether and reported as one missing field. +func (s *Struct) skippedIn( + fs *Fields, + groups *keyGroups, + callerPkgPath string, + canNamePromoted bool, + missing []Field, +) []Field { + externalPkg := fs.PackagePath != callerPkgPath + + for i, f := range fs.Items { + if groups.names(i) { + continue + } + + // A blank field has no name to write, so a keyed literal can never + // initialize it and reporting it yields a finding nobody can act on. + // Positional literals do supply a value for it, which skippedPositional + // accounts for by keeping blank fields in Items. + if f.Name == BlankFieldName { + continue + } + + if !s.isFieldRequired(f, externalPkg) { + missing = s.skippedUnder(f, groups.child(i), callerPkgPath, externalPkg, canNamePromoted, missing) + + continue } + + if child := groups.child(i); child != nil { + missing = s.skippedIn(f.Embedded, child, callerPkgPath, canNamePromoted, missing) + + continue + } + + missing = append(missing, f) } - missing := make([]Field, 0, len(s.Fields.Items)-len(present)) + return missing +} - for _, f := range s.Fields.Items { - if !present[f.Name] && s.isFieldRequired(f, externalPkg) { - missing = append(missing, f) +// skippedUnder returns the required fields the literal behind groups leaves +// uninitialized under an embedded field nothing requires. externalPkg tells +// whether f itself is declared outside the caller's package. +// +// An embedded field the enclosing type made optional still carries fields that +// are enforced in their own right, and such a field outranks the type holding +// it. Descending finds them; the field itself stays unreported, since nothing +// requires it. A field made optional in its own right is not descended into: +// that excludes what it promotes along with it. +// +// Below Go 1.27 a literal cannot name a promoted field, so the embedded field +// is the one key that reaches what is enforced under it, and it is what is +// reported. Where that field is unexported and the caller external, no key +// reaches them at all. +func (s *Struct) skippedUnder( + f Field, + groups *keyGroups, + callerPkgPath string, + externalPkg bool, + canNamePromoted bool, + missing []Field, +) []Field { + if f.Embedded == nil || f.optedOut() { + return missing + } + + if canNamePromoted { + return s.skippedIn(f.Embedded, groups, callerPkgPath, canNamePromoted, missing) + } + + if !f.unreachable(externalPkg) && s.requiresAnyBelow(f.Embedded, callerPkgPath) { + return append(missing, f) + } + + return missing +} + +// requiresAnyBelow reports whether leaving the embedded field holding fs +// unwritten leaves a required field unwritten with it. Fields no key reaches +// count for nothing, as they do in the descent itself. +func (s *Struct) requiresAnyBelow(fs *Fields, callerPkgPath string) bool { + externalPkg := fs.PackagePath != callerPkgPath + + for _, f := range fs.Items { + if f.Name == BlankFieldName || f.unreachable(externalPkg) { + continue + } + + if s.isFieldRequired(f, externalPkg) { + return true + } + + if f.Embedded != nil && !f.optedOut() && s.requiresAnyBelow(f.Embedded, callerPkgPath) { + return true } } - if len(missing) == 0 { + return false +} + +// keyGroups holds the keys of one literal arranged as the field tree reaches +// them: one node per embedded field a key passes through, and at each node the +// indices the keys stopping there name. +// +// A literal writes its keys flat, and the descent reads them one level at a +// time. Arranging them once is what keeps a level from sorting the same keys +// again at every step below it. +type keyGroups struct { + named map[int]bool + children map[int]*keyGroups +} + +// names reports whether a key names the field at index i of this level. +func (g *keyGroups) names(i int) bool { + return g != nil && g.named[i] +} + +// namedCount returns how many fields of this level a key names. +func (g *keyGroups) namedCount() int { + if g == nil { + return 0 + } + + return len(g.named) +} + +// child returns the keys reaching through the embedded field at index i, or nil +// when the literal writes none. +func (g *keyGroups) child(i int) *keyGroups { + if g == nil { return nil } - return missing + return g.children[i] +} + +// add records one key by the path of field indices that reaches it. +func (g *keyGroups) add(path []int) { + for _, i := range path[:len(path)-1] { + if g.children == nil { + g.children = make(map[int]*keyGroups) + } + + child := g.children[i] + if child == nil { + child = &keyGroups{named: nil, children: nil} + g.children[i] = child + } + + g = child + } + + if g.named == nil { + g.named = make(map[int]bool) + } + + g.named[path[len(path)-1]] = true +} + +// groupKeys arranges the keys of lit into the tree the descent reads. A key +// naming nothing the type resolves is dropped: it names a field pruned for +// being inaccessible, one another shadows, or none at all. +func (fs *Fields) groupKeys(lit *ast.CompositeLit, callerPkgPath string, canNamePromoted bool) *keyGroups { + paths := fs.paths + if paths == nil { + // Fields built outside the processor carry no promotion index, so a key + // names a field of this level or nothing. + paths = directPaths(fs) + } + + // Most literals name only fields of the level they are written at, so the + // root is sized for all of them and the levels below allocate on demand. + groups := &keyGroups{named: make(map[int]bool, len(lit.Elts)), children: nil} + + for _, elt := range lit.Elts { + kv, ok := elt.(*ast.KeyValueExpr) + if !ok { + continue + } + + key, ok := kv.Key.(*ast.Ident) + if !ok { + continue + } + + // Below Go 1.27 only a direct field can be named, whatever the tree + // behind the type promotes. + path := paths[promotionKey(callerPkgPath, key.Name)] + if len(path) == 1 || (canNamePromoted && len(path) > 1) { + groups.add(path) + } + } + + return groups +} + +// directPaths indexes the fields of fs by name, reaching through nothing. +func directPaths(fs *Fields) map[string][]int { + paths := make(map[string][]int, len(fs.Items)) + + for i := range fs.Items { + key := promotionKey(fs.PackagePath, fs.Items[i].Name) + if _, seen := paths[key]; !seen { + paths[key] = []int{i} + } + } + + return paths +} + +// optedOut reports whether f was made optional in its own right rather than by +// the type holding it. Such a field carries its subtree out of the check with +// it, where a type marked optional carries nothing: a field enforced under one +// still outranks it. +func (f Field) optedOut() bool { + return f.Optional || f.PatternOptional } func (s *Struct) isFieldRequired(f Field, externalPkg bool) bool { + // Reach outranks every directive and pattern below, which are written + // without knowing which literal reads them. + if f.unreachable(externalPkg) { + return false + } + // explicit field directives win over everything if f.Enforced { return true @@ -160,15 +397,15 @@ func (s *Struct) isFieldRequired(f Field, externalPkg bool) bool { return false } - // field-level patterns apply only when they specifically target the field — - // i.e., the pattern matches the field path but not the struct path. A broad - // pattern that also matches the struct is handled via s.IsEnforced/IsOptional - // and must not silently promote unrelated fields to required/optional. - if f.PatternEnforced && !s.PatternEnforced { + // A pattern that names the field in its own right outranks the settings of + // the type holding it. One broad enough to select the type as well names no + // field in particular, and is answered by s.IsEnforced/IsOptional below -- + // PatternEnforced and PatternOptional are already false for it. + if f.PatternEnforced { return true } - if f.PatternOptional && !s.PatternOptional { + if f.PatternOptional { return false } @@ -177,22 +414,125 @@ func (s *Struct) isFieldRequired(f Field, externalPkg bool) bool { return false } - // unexported fields are only required for same-package usage - if externalPkg && !f.Exported { - return false - } - return true } type Field struct { Name string - Exported bool `exhaustruct:"optional"` - Enforced bool `exhaustruct:"optional"` - Optional bool `exhaustruct:"optional"` + Exported bool //exhaustruct:optional + Enforced bool //exhaustruct:optional + Optional bool //exhaustruct:optional + + // PatternEnforced and PatternOptional record that a pattern names this + // field in its own right, and not by way of the type holding it. + PatternEnforced bool //exhaustruct:optional + PatternOptional bool //exhaustruct:optional + + // Shadowed marks a promoted field a literal of the outermost type resolves + // to another field of the same name, or to none at all. Such a field has no + // key to write and nothing may require it. + Shadowed bool //exhaustruct:optional + + // Embedded holds the fields promoted by an embedded struct field, which a + // literal may name in place of this field since Go 1.27. Nil for every + // other field, including embedded pointers — a literal cannot reach through + // those. + Embedded *Fields //exhaustruct:optional +} + +// unreachable reports whether no literal can write f: an unexported field +// declared in another package, or a promoted field another one shadows. +func (f Field) unreachable(externalPkg bool) bool { + return f.Shadowed || (externalPkg && !f.Exported) +} + +// indexPromotion records the chain of field indices reaching every name a +// literal of the type holding fs may write, and marks every field no chain +// reaches. +// +// Go resolves a promoted name to its shallowest occurrence, so a deeper field +// of that name is out of reach, and a name two fields share at one depth +// resolves to nothing, leaving both out of reach. The walk starts at the +// outermost struct, which is the only level a literal writes keys at, and is +// why the index is not kept per level. +func indexPromotion(fs *Fields) map[string][]int { + paths := make(map[string][]int, len(fs.Items)) + blocked := make(map[string]bool) + + for level := []promotionLevel{{fields: fs, path: nil}}; len(level) > 0; { + atDepth := namesAtDepth(level) + + level = indexLevel(level, paths, blocked, atDepth) + + for name := range atDepth { + blocked[name] = true + } + } - PatternEnforced bool `exhaustruct:"optional"` - PatternOptional bool `exhaustruct:"optional"` + return paths +} + +// promotionLevel is one struct of the promotion walk, with the chain of field +// indices that reached it. +type promotionLevel struct { + fields *Fields + path []int +} + +// promotionKey names a field the way a literal's key resolves to it. An +// unexported name belongs to the package that wrote it, so the same spelling in +// two packages stands for two identifiers: neither shadows the other, and a +// literal reaches only the one its own package declared. +func promotionKey(pkgPath, name string) string { + if token.IsExported(name) { + return name + } + + return pkgPath + "." + name +} + +// namesAtDepth counts the fields of one promotion depth carrying each name. +func namesAtDepth(level []promotionLevel) map[string]int { + counts := make(map[string]int) + + for _, l := range level { + for _, item := range l.fields.Items { + counts[promotionKey(l.fields.PackagePath, item.Name)]++ + } + } + + return counts +} + +// indexLevel records the reachable fields of one depth, marks the rest, and +// returns the structs embedded at that depth, which make up the next one. +func indexLevel( + level []promotionLevel, + paths map[string][]int, + blocked map[string]bool, + atDepth map[string]int, +) []promotionLevel { + var next []promotionLevel + + for _, l := range level { + for i := range l.fields.Items { + item := &l.fields.Items[i] + path := append(append(make([]int, 0, len(l.path)+1), l.path...), i) + + key := promotionKey(l.fields.PackagePath, item.Name) + + item.Shadowed = blocked[key] || atDepth[key] > 1 + if !item.Shadowed { + paths[key] = path + } + + if item.Embedded != nil { + next = append(next, promotionLevel{fields: item.Embedded, path: path}) + } + } + } + + return next } // Fields is a collection of struct fields with shared package metadata. @@ -200,6 +540,12 @@ type Field struct { type Fields struct { PackagePath string Items []Field + + // paths maps every name a literal of the enclosing type may write to the + // chain of field indices reaching it. Built once with the type's metadata + // and set on the outermost Fields only, which is the level keys are written + // at. Nil for Fields built outside the processor. + paths map[string][]int //exhaustruct:optional } func FormatFieldNames(fields []Field) string { diff --git a/vendor/github.com/4meepo/tagalign/tagalign.go b/vendor/github.com/4meepo/tagalign/tagalign.go index 612aefb0..9aab3cb8 100644 --- a/vendor/github.com/4meepo/tagalign/tagalign.go +++ b/vendor/github.com/4meepo/tagalign/tagalign.go @@ -62,7 +62,7 @@ func Run(pass *analysis.Pass, options ...Option) { } ast.Inspect(f, func(n ast.Node) bool { - h.find(pass, n) + h.findNested(pass, n) return true }) @@ -126,9 +126,6 @@ func (w *Helper) find(pass *analysis.Pass, n ast.Node) { split() // check if the field is a struct - if _, ok := field.Type.(*ast.StructType); ok { - continue - } } } @@ -138,6 +135,12 @@ func (w *Helper) find(pass *analysis.Pass, n ast.Node) { split() } +func (w *Helper) findNested(pass *analysis.Pass, n ast.Node) { + if v, ok := n.(*ast.StructType); ok { + w.find(pass, v) + } +} + func (w *Helper) report(pass *analysis.Pass, field *ast.Field, msg, replaceStr string) { pass.Report(analysis.Diagnostic{ Pos: field.Tag.Pos(), diff --git a/vendor/github.com/alecthomas/go-check-sumtype/.golangci.yml b/vendor/github.com/alecthomas/go-check-sumtype/.golangci.yml index 758ae1a9..d7fefdf1 100644 --- a/vendor/github.com/alecthomas/go-check-sumtype/.golangci.yml +++ b/vendor/github.com/alecthomas/go-check-sumtype/.golangci.yml @@ -1,11 +1,8 @@ +version: "2" run: tests: true - -output: - print-issued-lines: false - linters: - enable-all: true + default: all disable: - cyclop - depguard @@ -15,23 +12,21 @@ linters: - errorlint - exhaustive - exhaustruct - - exportloopref - forcetypeassert - funlen - - gci - gochecknoglobals - gocognit - goconst - gocyclo + - godoclint - godot + - gomodguard - godox - - gofumpt - govet - ireturn - lll - maintidx - mnd - - mnd - musttag - nestif - nilnil @@ -42,51 +37,37 @@ linters: - perfsprint - predeclared - revive - - stylecheck - testableexamples - testpackage - thelper - varnamelen - wrapcheck - wsl - -linters-settings: - govet: - enable: - - shadow - gocyclo: - min-complexity: 10 - dupl: - threshold: 100 - goconst: - min-len: 8 - min-occurrences: 3 - forbidigo: - exclude-godoc-examples: false - #forbid: - # - (Must)?NewLexer$ + - wsl_v5 + settings: + dupl: + threshold: 100 + forbidigo: + exclude-godoc-examples: false + goconst: + min-len: 8 + min-occurrences: 3 + gocyclo: + min-complexity: 10 + govet: + enable: + - shadow + exclusions: + warn-unused: true + presets: + - std-error-handling + - common-false-positives + - comments issues: max-issues-per-linter: 0 max-same-issues: 0 - exclude-use-default: false - exclude-dirs: - - _examples - exclude: - # Captured by errcheck. - - "^(G104|G204):" - # Very commonly not checked. - - 'Error return value of .(.*\.Help|.*\.MarkFlagRequired|(os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*printf?|os\.(Un)?Setenv). is not checked' - - 'exported method (.*\.MarshalJSON|.*\.UnmarshalJSON|.*\.EntityURN|.*\.GoString|.*\.Pos) should have comment or be unexported' - - "composite literal uses unkeyed fields" - - 'declaration of "err" shadows declaration' - - "should not use dot imports" - - "Potential file inclusion via variable" - - "should have comment or be unexported" - - "comment on exported var .* should be of the form" - - "at least one file in a package should have a package comment" - - "string literal contains the Unicode" - - "methods on the same type should have the same receiver name" - - "_TokenType_name should be _TokenTypeName" - - "`_TokenType_map` should be `_TokenTypeMap`" - - "rewrite if-else to switch statement" +formatters: + enable: + - gofmt + - goimports diff --git a/vendor/github.com/alecthomas/go-check-sumtype/.goreleaser.yml b/vendor/github.com/alecthomas/go-check-sumtype/.goreleaser.yml index 33bd03d0..1f176949 100644 --- a/vendor/github.com/alecthomas/go-check-sumtype/.goreleaser.yml +++ b/vendor/github.com/alecthomas/go-check-sumtype/.goreleaser.yml @@ -1,3 +1,4 @@ +version: 2 project_name: go-check-sumtype release: github: @@ -20,13 +21,14 @@ builds: binary: go-check-sumtype archives: - - format: tar.gz - name_template: '{{ .Binary }}-{{ .Version }}-{{ .Os }}-{{ .Arch }}{{ if .Arm }}v{{ - .Arm }}{{ end }}' + format_overrides: + - formats: [tar.gz] + name_template: >- + {{ .Binary }}-{{ .Version }}-{{ .Os }}-{{ .Arch }}{{ if .Arm }}v{{.Arm }}{{ end }} files: - COPYING - README* snapshot: - name_template: SNAPSHOT-{{ .Commit }} + version_template: SNAPSHOT-{{ .Commit }} checksum: name_template: '{{ .ProjectName }}-{{ .Version }}-checksums.txt' diff --git a/vendor/github.com/alecthomas/go-check-sumtype/README.md b/vendor/github.com/alecthomas/go-check-sumtype/README.md index 287aa68b..dbe6afca 100644 --- a/vendor/github.com/alecthomas/go-check-sumtype/README.md +++ b/vendor/github.com/alecthomas/go-check-sumtype/README.md @@ -87,12 +87,12 @@ mysumtype.go:18:2: exhaustiveness check failed for sum type 'MySumType': missing Adding either a `default` clause or a clause to handle `*VariantB` will cause exhaustive checks to pass. To prevent `default` clauses from automatically -passing checks, set the `-default-signifies-exhasutive=false` flag. +passing checks, set the `-default-signifies-exhaustive=false` flag. As a special case, if the type switch statement contains a `default` clause that always panics, then exhaustiveness checks are still performed. -By default, `go-check-sumtype` will not include shared interfaces in the exhaustiviness check. +By default, `go-check-sumtype` will not include shared interfaces in the exhaustiveness check. This can be changed by setting the `-include-shared-interfaces=true` flag. When this flag is set, `go-check-sumtype` will not require that all concrete structs are listed in the switch statement, as long as the switch statement is exhaustive diff --git a/vendor/github.com/alecthomas/go-check-sumtype/analyzer.go b/vendor/github.com/alecthomas/go-check-sumtype/analyzer.go new file mode 100644 index 00000000..4ed2a02b --- /dev/null +++ b/vendor/github.com/alecthomas/go-check-sumtype/analyzer.go @@ -0,0 +1,110 @@ +package gochecksumtype + +import ( + "go/token" + "go/types" + + "golang.org/x/tools/go/analysis" +) + +// checks exhaustiveness of sum type +// switch statements. Sum types are declared with a //sumtype:decl comment +// above a sealed interface type. +func newAnalyzer() *analysis.Analyzer { + return &analysis.Analyzer{ + Name: "sumtype", + Doc: "check exhaustiveness of sum type switch statements", + Run: run, + Flags: newFlags(), + FactTypes: []analysis.Fact{new(sumTypeFact)}, + URL: "", + RunDespiteErrors: false, + Requires: nil, + ResultType: nil, + } +} + +var Analyzer = newAnalyzer() + +func run(pass *analysis.Pass) (any, error) { + cfg := cfgFromFlags(pass.Analyzer.Flags) + + decls, err := findSumTypeDecls(pass.Fset, pass.Files) + if err != nil { + return nil, err + } + + defs, defErrs := findSumTypeDefs(pass, decls) + for _, e := range defErrs { + pass.Reportf(e.(Error).Pos(), "%s", e.Error()) + } + + // Export facts so downstream packages can check exhaustiveness + // against sum types defined here. + fact := &sumTypeFact{Definitions: make([]sumTypeDefinitionFact, 0, len(defs))} + for _, def := range defs { + variantNames := make([]string, len(def.Variants)) + for i, v := range def.Variants { + variantNames[i] = v.Name() + } + fact.Definitions = append(fact.Definitions, sumTypeDefinitionFact{ + TypeName: def.Decl.TypeName, + Variants: variantNames, + }) + } + if len(fact.Definitions) > 0 { + pass.ExportPackageFact(fact) + } + + // Import sum type facts from dependencies. + for _, pkg := range pass.Pkg.Imports() { + var fact sumTypeFact + if pass.ImportPackageFact(pkg, &fact) { + defs = append(defs, factToTypeDefs(pass.Fset, pkg, &fact)...) + } + } + // Check exhaustiveness for all type switches in this package. + for _, astfile := range pass.Files { + for _, err := range checkFile(pass, astfile, defs, cfg) { + pass.Reportf(err.(Error).Pos(), "%s", err.Error()) + } + } + + return nil, nil +} + +// factToTypeDefs reconstructs [sumTypeDef] values from an imported fact. +func factToTypeDefs(fset *token.FileSet, pkg *types.Package, fact *sumTypeFact) []sumTypeDef { + defs := make([]sumTypeDef, 0, len(fact.Definitions)) + for _, definition := range fact.Definitions { + obj := pkg.Scope().Lookup(definition.TypeName) + if obj == nil { + continue + } + iface, ok := obj.Type().Underlying().(*types.Interface) + if !ok { + continue + } + location := pkg.Path() + "." + definition.TypeName + if position := fset.Position(obj.Pos()); position.IsValid() { + location = position.String() + } + def := sumTypeDef{ + Decl: sumTypeDecl{ + TypeName: definition.TypeName, + Pos: token.NoPos, + Location: location, + }, + Ty: iface, + Variants: make([]types.Object, 0, len(definition.Variants)), + } + for _, name := range definition.Variants { + vObj := pkg.Scope().Lookup(name) + if vObj != nil { + def.Variants = append(def.Variants, vObj) + } + } + defs = append(defs, def) + } + return defs +} diff --git a/vendor/github.com/alecthomas/go-check-sumtype/check.go b/vendor/github.com/alecthomas/go-check-sumtype/check.go index ff7fec72..381e17e6 100644 --- a/vendor/github.com/alecthomas/go-check-sumtype/check.go +++ b/vendor/github.com/alecthomas/go-check-sumtype/check.go @@ -8,22 +8,22 @@ import ( "sort" "strings" - "golang.org/x/tools/go/packages" + "golang.org/x/tools/go/analysis" ) -// inexhaustiveError is returned from check for each occurrence of inexhaustive +// inexhaustiveError is returned for each occurrence of inexhaustive // case analysis in a Go type switch statement. type inexhaustiveError struct { - Position token.Position + Position token.Pos Def sumTypeDef Missing []types.Object } -func (e inexhaustiveError) Pos() token.Position { return e.Position } +func (e inexhaustiveError) Pos() token.Pos { return e.Position } func (e inexhaustiveError) Error() string { return fmt.Sprintf( - "%s: exhaustiveness check failed for sum type %q (from %s): missing cases for %s", - e.Pos(), e.Def.Decl.TypeName, e.Def.Decl.Pos, strings.Join(e.Names(), ", ")) + "exhaustiveness check failed for sum type %q (from %s): missing cases for %s", + e.Def.Decl.TypeName, e.Def.Decl.Location, strings.Join(e.Names(), ", ")) } // Names returns a sorted list of names corresponding to the missing variant @@ -37,22 +37,21 @@ func (e inexhaustiveError) Names() []string { return list } -// check does exhaustiveness checking for the given sum type definitions in the -// given package. Every instance of inexhaustive case analysis is returned. -func check(pkg *packages.Package, defs []sumTypeDef, config Config) []error { - var errs []error - for _, astfile := range pkg.Syntax { - ast.Inspect(astfile, func(n ast.Node) bool { - swtch, ok := n.(*ast.TypeSwitchStmt) - if !ok { - return true - } - if err := checkSwitch(pkg, defs, swtch, config); err != nil { - errs = append(errs, err) - } +// checkFile does exhaustiveness checking for the given sum type definitions +// in a single AST file. Every instance of inexhaustive case analysis is +// returned. +func checkFile(pass *analysis.Pass, astfile *ast.File, defs []sumTypeDef, cfg cfg) (errs []error) { + ast.Inspect(astfile, func(n ast.Node) bool { + swtch, ok := n.(*ast.TypeSwitchStmt) + if !ok { return true - }) - } + } + err := checkSwitch(pass, defs, swtch, cfg) + if err != nil { + errs = append(errs, err) + } + return true + }) return errs } @@ -61,18 +60,18 @@ func check(pkg *packages.Package, defs []sumTypeDef, config Config) []error { // all variants of that sum type, then an error is returned indicating which // variants were missed. // -// Note that if the type switch contains a non-panicing default case, then +// Note that if the type switch contains a non-panicking default case, then // exhaustiveness checks are disabled. func checkSwitch( - pkg *packages.Package, + pass *analysis.Pass, defs []sumTypeDef, swtch *ast.TypeSwitchStmt, - config Config, + cfg cfg, ) error { - def, missing := missingVariantsInSwitch(pkg, defs, swtch, config) + def, missing := missingVariantsInSwitch(pass, defs, swtch, cfg) if len(missing) > 0 { return inexhaustiveError{ - Position: pkg.Fset.Position(swtch.Pos()), + Position: swtch.Pos(), Def: *def, Missing: missing, } @@ -85,33 +84,30 @@ func checkSwitch( // returned. (If no sum type definition could be found, then no exhaustiveness // checks are performed, and therefore, no missing variants are returned.) func missingVariantsInSwitch( - pkg *packages.Package, + pass *analysis.Pass, defs []sumTypeDef, swtch *ast.TypeSwitchStmt, - config Config, + cfg cfg, ) (*sumTypeDef, []types.Object) { asserted := findTypeAssertExpr(swtch) - ty := pkg.TypesInfo.TypeOf(asserted) + ty := pass.TypesInfo.TypeOf(asserted) if ty == nil { panic(fmt.Sprintf("no type found for asserted expression: %v", asserted)) } def := findDef(defs, ty) if def == nil { - // We couldn't find a corresponding sum type, so there's - // nothing we can do to check it. return nil, nil } variantExprs, hasDefault := switchVariants(swtch) - if config.DefaultSignifiesExhaustive && hasDefault && !defaultClauseAlwaysPanics(swtch) { - // A catch-all case defeats all exhaustiveness checks. + if cfg.defaultSignifiesExhaustive() && hasDefault && !defaultClauseAlwaysPanics(swtch) { return def, nil } variantTypes := make([]types.Type, 0, len(variantExprs)) for _, expr := range variantExprs { - variantTypes = append(variantTypes, pkg.TypesInfo.TypeOf(expr)) + variantTypes = append(variantTypes, pass.TypesInfo.TypeOf(expr)) } - return def, def.missing(variantTypes, config.IncludeSharedInterfaces) + return def, def.missing(variantTypes, cfg.includeSharedInterfaces()) } // switchVariants returns all case expressions found in a type switch. This @@ -166,7 +162,7 @@ func defaultClauseAlwaysPanics(swtch *ast.TypeSwitchStmt) bool { } // findTypeAssertExpr extracts the expression that is being type asserted from a -// type swtich statement. +// type switch statement. func findTypeAssertExpr(swtch *ast.TypeSwitchStmt) ast.Expr { var expr ast.Expr if assign, ok := swtch.Assign.(*ast.AssignStmt); ok { diff --git a/vendor/github.com/alecthomas/go-check-sumtype/config.go b/vendor/github.com/alecthomas/go-check-sumtype/config.go index 5c722b75..6dfbc08d 100644 --- a/vendor/github.com/alecthomas/go-check-sumtype/config.go +++ b/vendor/github.com/alecthomas/go-check-sumtype/config.go @@ -1,8 +1,52 @@ package gochecksumtype -type Config struct { - DefaultSignifiesExhaustive bool - // IncludeSharedInterfaces in the exhaustiviness check. If true, we do not need to list all concrete structs, as long - // as the switch statement is exhaustive with respect to interfaces the structs implement. - IncludeSharedInterfaces bool +import ( + "flag" +) + +// bit-flag set. +type cfg uint8 + +const ( + // Whether a default signifies exhaustiveness. + defaultExhaustive cfg = 1 << 0 + includeSharedInterfaces cfg = 1 << 1 +) + +func (c cfg) defaultSignifiesExhaustive() bool { + return c&defaultExhaustive != 0 +} +func (c cfg) includeSharedInterfaces() bool { + return c&includeSharedInterfaces != 0 +} + +func cfgFromFlags(flags flag.FlagSet) (result cfg) { + if getBoolFlag(flags, flagDefaultSignifiesExhaustive) { + result |= defaultExhaustive + } + if getBoolFlag(flags, flagIncludeSharedInterfaces) { + result |= includeSharedInterfaces + } + return result +} + +func getBoolFlag(flags flag.FlagSet, name string) bool { + f := flags.Lookup(name).Value.(flag.Getter) + return f != nil && f.Get().(bool) +} + +const ( + flagDefaultSignifiesExhaustive = "default-signifies-exhaustive" + flagIncludeSharedInterfaces = "include-shared-interfaces" +) + +// checks exhaustiveness of sum type +// switch statements. Sum types are declared with a //sumtype:decl comment +// above a sealed interface type. +func newFlags() (fs flag.FlagSet) { + fs.Bool(flagDefaultSignifiesExhaustive, true, + "Presence of a non-panicking default case satisfies exhaustiveness.") + fs.Bool(flagIncludeSharedInterfaces, false, + "Include shared interfaces in the exhaustiveness check.") + return fs } diff --git a/vendor/github.com/alecthomas/go-check-sumtype/decl.go b/vendor/github.com/alecthomas/go-check-sumtype/decl.go index 9dec9eef..1d9acc10 100644 --- a/vendor/github.com/alecthomas/go-check-sumtype/decl.go +++ b/vendor/github.com/alecthomas/go-check-sumtype/decl.go @@ -4,66 +4,63 @@ import ( "go/ast" "go/token" "strings" - - "golang.org/x/tools/go/packages" ) // sumTypeDecl is a declaration of a sum type in a Go source file. type sumTypeDecl struct { - // The package path that contains this decl. - Package *packages.Package // The type named by this decl. TypeName string // Position where the declaration was found. - Pos token.Position -} - -// Location returns a short string describing where this declaration was found. -func (d sumTypeDecl) Location() string { - return d.Pos.String() + Pos token.Pos + // Human-readable location of the declaration. + Location string } -// findSumTypeDecls searches every package given for sum type declarations of -// the form `sumtype:decl`. -func findSumTypeDecls(pkgs []*packages.Package) ([]sumTypeDecl, error) { +// findSumTypeDecls searches the given AST files for sum type declarations of +// the form `//sumtype:decl`. +func findSumTypeDecls(fset *token.FileSet, files []*ast.File) ([]sumTypeDecl, error) { var decls []sumTypeDecl var retErr error - for _, pkg := range pkgs { - for _, file := range pkg.Syntax { - ast.Inspect(file, func(node ast.Node) bool { - if node == nil { - return true + for _, file := range files { + ast.Inspect(file, func(node ast.Node) bool { + if node == nil { + return true + } + decl, ok := node.(*ast.GenDecl) + if !ok || decl.Doc == nil { + return true + } + var tspec *ast.TypeSpec + for _, spec := range decl.Specs { + ts, ok := spec.(*ast.TypeSpec) + if !ok { + continue } - decl, ok := node.(*ast.GenDecl) - if !ok || decl.Doc == nil { - return true + tspec = ts + } + for _, line := range decl.Doc.List { + if !strings.HasPrefix(line.Text, "//sumtype:decl") { + continue } - var tspec *ast.TypeSpec - for _, spec := range decl.Specs { - ts, ok := spec.(*ast.TypeSpec) - if !ok { - continue - } - tspec = ts + if tspec == nil { + retErr = notFoundError{Decl: sumTypeDecl{ + TypeName: "", + Pos: decl.Pos(), + Location: fset.Position(decl.Pos()).String(), + }} + return false } - for _, line := range decl.Doc.List { - if !strings.HasPrefix(line.Text, "//sumtype:decl") { - continue - } - pos := pkg.Fset.Position(decl.Pos()) - if tspec == nil { - retErr = notFoundError{Decl: sumTypeDecl{Package: pkg, Pos: pos}} - return false - } - pos = pkg.Fset.Position(tspec.Pos()) - decl := sumTypeDecl{Package: pkg, TypeName: tspec.Name.Name, Pos: pos} - debugf("found sum type decl: %s.%s", decl.Package.PkgPath, decl.TypeName) - decls = append(decls, decl) - break + pos := tspec.Pos() + decl := sumTypeDecl{ + TypeName: tspec.Name.Name, + Pos: pos, + Location: fset.Position(pos).String(), } - return true - }) - } + decls = append(decls, decl) + break + } + return true + }) } return decls, retErr } diff --git a/vendor/github.com/alecthomas/go-check-sumtype/def.go b/vendor/github.com/alecthomas/go-check-sumtype/def.go index 71bdf2f7..514d72c4 100644 --- a/vendor/github.com/alecthomas/go-check-sumtype/def.go +++ b/vendor/github.com/alecthomas/go-check-sumtype/def.go @@ -1,25 +1,17 @@ package gochecksumtype import ( - "flag" "fmt" "go/token" "go/types" - "log" -) - -var debug = flag.Bool("debug", false, "enable debug logging") -func debugf(format string, args ...interface{}) { - if *debug { - log.Printf(format, args...) - } -} + "golang.org/x/tools/go/analysis" +) -// Error as returned by Run() +// Error as returned by the analyzer type Error interface { error - Pos() token.Position + Pos() token.Pos } // unsealedError corresponds to a declared sum type whose interface is not @@ -28,12 +20,12 @@ type unsealedError struct { Decl sumTypeDecl } -func (e unsealedError) Pos() token.Position { return e.Decl.Pos } +func (e unsealedError) Pos() token.Pos { return e.Decl.Pos } func (e unsealedError) Error() string { return fmt.Sprintf( - "%s: interface '%s' is not sealed "+ + "interface '%s' is not sealed "+ "(sealing requires at least one unexported method)", - e.Decl.Location(), e.Decl.TypeName) + e.Decl.TypeName) } // notFoundError corresponds to a declared sum type whose type definition @@ -42,9 +34,9 @@ type notFoundError struct { Decl sumTypeDecl } -func (e notFoundError) Pos() token.Position { return e.Decl.Pos } +func (e notFoundError) Pos() token.Pos { return e.Decl.Pos } func (e notFoundError) Error() string { - return fmt.Sprintf("%s: type '%s' is not defined", e.Decl.Location(), e.Decl.TypeName) + return fmt.Sprintf("type '%s' is not defined", e.Decl.TypeName) } // notInterfaceError corresponds to a declared sum type that does not @@ -53,9 +45,9 @@ type notInterfaceError struct { Decl sumTypeDecl } -func (e notInterfaceError) Pos() token.Position { return e.Decl.Pos } +func (e notInterfaceError) Pos() token.Pos { return e.Decl.Pos } func (e notInterfaceError) Error() string { - return fmt.Sprintf("%s: type '%s' is not an interface", e.Decl.Location(), e.Decl.TypeName) + return fmt.Sprintf("type '%s' is not an interface", e.Decl.TypeName) } // sumTypeDef corresponds to the definition of a Go interface that is @@ -70,11 +62,11 @@ type sumTypeDef struct { // findSumTypeDefs attempts to find a Go type definition for each of the given // sum type declarations. If no such sum type definition could be found for // any of the given declarations, then an error is returned. -func findSumTypeDefs(decls []sumTypeDecl) ([]sumTypeDef, []error) { +func findSumTypeDefs(pass *analysis.Pass, decls []sumTypeDecl) ([]sumTypeDef, []error) { defs := make([]sumTypeDef, 0, len(decls)) - var errs []error + errs := make([]error, 0, len(decls)) for _, decl := range decls { - def, err := newSumTypeDef(decl.Package.Types, decl) + def, err := newSumTypeDef(pass, decl) if err != nil { errs = append(errs, err) continue @@ -94,7 +86,8 @@ func findSumTypeDefs(decls []sumTypeDecl) ([]sumTypeDef, []error) { // // If the decl corresponds to a type that isn't an interface containing at // least one unexported method, then this returns an error. -func newSumTypeDef(pkg *types.Package, decl sumTypeDecl) (*sumTypeDef, error) { +func newSumTypeDef(pass *analysis.Pass, decl sumTypeDecl) (*sumTypeDef, error) { + pkg := pass.Pkg obj := pkg.Scope().Lookup(decl.TypeName) if obj == nil { return nil, nil @@ -104,8 +97,8 @@ func newSumTypeDef(pkg *types.Package, decl sumTypeDecl) (*sumTypeDef, error) { return nil, notInterfaceError{decl} } hasUnexported := false - for i := range iface.NumMethods() { - if !iface.Method(i).Exported() { + for method := range iface.Methods() { + if !method.Exported() { hasUnexported = true break } @@ -113,26 +106,29 @@ func newSumTypeDef(pkg *types.Package, decl sumTypeDecl) (*sumTypeDef, error) { if !hasUnexported { return nil, unsealedError{decl} } + names := pkg.Scope().Names() def := &sumTypeDef{ - Decl: decl, - Ty: iface, + Decl: decl, + Ty: iface, + Variants: make([]types.Object, 0, len(names)), } - debugf("searching for variants of %s.%s\n", pkg.Path(), decl.TypeName) - for _, name := range pkg.Scope().Names() { + for _, name := range names { obj, ok := pkg.Scope().Lookup(name).(*types.TypeName) if !ok { continue } - ty := obj.Type() + ty, ok := obj.Type().(*types.Named) + if !ok { + continue + } if types.Identical(ty.Underlying(), iface) { continue } // Skip generic types. - if named, ok := ty.(*types.Named); ok && named.TypeParams() != nil { + if ty.TypeParams() != nil { continue } if types.Implements(ty, iface) || types.Implements(types.NewPointer(ty), iface) { - debugf(" found variant: %s.%s\n", pkg.Path(), obj.Name()) def.Variants = append(def.Variants, obj) } } diff --git a/vendor/github.com/alecthomas/go-check-sumtype/fact.go b/vendor/github.com/alecthomas/go-check-sumtype/fact.go new file mode 100644 index 00000000..73e1a4aa --- /dev/null +++ b/vendor/github.com/alecthomas/go-check-sumtype/fact.go @@ -0,0 +1,33 @@ +package gochecksumtype + +import ( + "fmt" + "strings" + + "golang.org/x/tools/go/analysis" +) + +// sumTypeFact is a package-level fact that declares sum types and their variants. +// It is exported by a package that contains a //sumtype:decl annotation and +// imported by downstream packages to enable cross-package exhaustiveness checking. +type sumTypeFact struct { + Definitions []sumTypeDefinitionFact +} + +type sumTypeDefinitionFact struct { + TypeName string + Variants []string +} + +var _ analysis.Fact = (*sumTypeFact)(nil) + +// AFact implements [analysis.Fact]. +func (*sumTypeFact) AFact() {} + +func (f *sumTypeFact) String() string { + definitions := make([]string, 0, len(f.Definitions)) + for _, definition := range f.Definitions { + definitions = append(definitions, fmt.Sprintf("%s %v", definition.TypeName, definition.Variants)) + } + return fmt.Sprintf("sumTypeFact{%s}", strings.Join(definitions, "; ")) +} diff --git a/vendor/github.com/alecthomas/go-check-sumtype/run.go b/vendor/github.com/alecthomas/go-check-sumtype/run.go deleted file mode 100644 index f32942d7..00000000 --- a/vendor/github.com/alecthomas/go-check-sumtype/run.go +++ /dev/null @@ -1,26 +0,0 @@ -package gochecksumtype - -import "golang.org/x/tools/go/packages" - -// Run sumtype checking on the given packages. -func Run(pkgs []*packages.Package, config Config) []error { - var errs []error - - decls, err := findSumTypeDecls(pkgs) - if err != nil { - return []error{err} - } - - defs, defErrs := findSumTypeDefs(decls) - errs = append(errs, defErrs...) - if len(defs) == 0 { - return errs - } - - for _, pkg := range pkgs { - if pkgErrs := check(pkg, defs, config); pkgErrs != nil { - errs = append(errs, pkgErrs...) - } - } - return errs -} diff --git a/vendor/github.com/ghostiam/protogetter/processor.go b/vendor/github.com/ghostiam/protogetter/processor.go index 5279199a..5d548cad 100644 --- a/vendor/github.com/ghostiam/protogetter/processor.go +++ b/vendor/github.com/ghostiam/protogetter/processor.go @@ -391,7 +391,10 @@ func typesNamed(info *types.Info, x ast.Expr) (*types.Named, bool) { t = ptr.Elem() } - named, ok := t.(*types.Named) + // A type declared as an alias of a message, as in `type Message = pb.Message`, is a + // types.Alias rather than the types.Named it aliases, so the message it stands for is reached + // through it. + named, ok := types.Unalias(t).(*types.Named) if !ok { return nil, false } diff --git a/vendor/github.com/go-critic/go-critic/checkers/appendAssign_checker.go b/vendor/github.com/go-critic/go-critic/checkers/appendAssign_checker.go index 2a67dcce..a18a36f8 100644 --- a/vendor/github.com/go-critic/go-critic/checkers/appendAssign_checker.go +++ b/vendor/github.com/go-critic/go-critic/checkers/appendAssign_checker.go @@ -10,7 +10,6 @@ import ( "github.com/go-toolsmith/astequal" "github.com/go-toolsmith/astp" - "golang.org/x/tools/go/ast/astutil" ) func init() { @@ -93,7 +92,7 @@ func (c *appendAssignChecker) checkAppend(x ast.Expr, call *ast.CallExpr) { } func (c *appendAssignChecker) matchSlices(cause ast.Node, x, y ast.Expr) { - if !astequal.Expr(x, astutil.Unparen(y)) { + if !astequal.Expr(x, ast.Unparen(y)) { c.warn(cause) } } diff --git a/vendor/github.com/go-critic/go-critic/checkers/badCond_checker.go b/vendor/github.com/go-critic/go-critic/checkers/badCond_checker.go index 22a6267f..f5f4bd3f 100644 --- a/vendor/github.com/go-critic/go-critic/checkers/badCond_checker.go +++ b/vendor/github.com/go-critic/go-critic/checkers/badCond_checker.go @@ -13,7 +13,6 @@ import ( "github.com/go-toolsmith/astcopy" "github.com/go-toolsmith/astequal" "github.com/go-toolsmith/typep" - "golang.org/x/tools/go/ast/astutil" ) func init() { @@ -56,8 +55,8 @@ func (c *badCondChecker) checkExpr(expr ast.Expr) { // TODO(quasilyte): recognize more patterns. cond := astcast.ToBinaryExpr(expr) - lhs := astcast.ToBinaryExpr(astutil.Unparen(cond.X)) - rhs := astcast.ToBinaryExpr(astutil.Unparen(cond.Y)) + lhs := astcast.ToBinaryExpr(ast.Unparen(cond.X)) + rhs := astcast.ToBinaryExpr(ast.Unparen(cond.Y)) if cond.Op != token.LAND { return diff --git a/vendor/github.com/go-critic/go-critic/checkers/boolExprSimplify_checker.go b/vendor/github.com/go-critic/go-critic/checkers/boolExprSimplify_checker.go index a1c69cb7..5fd71b7f 100644 --- a/vendor/github.com/go-critic/go-critic/checkers/boolExprSimplify_checker.go +++ b/vendor/github.com/go-critic/go-critic/checkers/boolExprSimplify_checker.go @@ -81,9 +81,9 @@ func (c *boolExprSimplifyChecker) simplifyBool(x ast.Expr) ast.Expr { func (c *boolExprSimplifyChecker) doubleNegation(cur *astutil.Cursor) bool { neg1 := astcast.ToUnaryExpr(cur.Node()) - neg2 := astcast.ToUnaryExpr(astutil.Unparen(neg1.X)) + neg2 := astcast.ToUnaryExpr(ast.Unparen(neg1.X)) if neg1.Op == token.NOT && neg2.Op == token.NOT { - cur.Replace(astutil.Unparen(neg2.X)) + cur.Replace(ast.Unparen(neg2.X)) return true } return false @@ -110,7 +110,7 @@ func (c *boolExprSimplifyChecker) invertComparison(cur *astutil.Cursor) bool { } neg := astcast.ToUnaryExpr(cur.Node()) - cmp := astcast.ToBinaryExpr(astutil.Unparen(neg.X)) + cmp := astcast.ToBinaryExpr(ast.Unparen(neg.X)) if neg.Op != token.NOT { return false } @@ -147,8 +147,8 @@ func (c *boolExprSimplifyChecker) combineChecks(cur *astutil.Cursor) bool { return false } - lhs := astcast.ToBinaryExpr(astutil.Unparen(or.X)) - rhs := astcast.ToBinaryExpr(astutil.Unparen(or.Y)) + lhs := astcast.ToBinaryExpr(ast.Unparen(or.X)) + rhs := astcast.ToBinaryExpr(ast.Unparen(or.Y)) if !astequal.Expr(lhs.X, rhs.X) || !astequal.Expr(lhs.Y, rhs.Y) { return false diff --git a/vendor/github.com/go-critic/go-critic/checkers/newDeref_checker.go b/vendor/github.com/go-critic/go-critic/checkers/newDeref_checker.go index 1a1b05e0..069fd377 100644 --- a/vendor/github.com/go-critic/go-critic/checkers/newDeref_checker.go +++ b/vendor/github.com/go-critic/go-critic/checkers/newDeref_checker.go @@ -9,7 +9,6 @@ import ( "github.com/go-critic/go-critic/linter" "github.com/go-toolsmith/astcast" - "golang.org/x/tools/go/ast/astutil" ) func init() { @@ -39,7 +38,7 @@ func (c *newDerefChecker) VisitExpr(expr ast.Expr) { if _, ok := typ.(*types.TypeParam); ok { return } - zv := lintutil.ZeroValueOf(astutil.Unparen(call.Args[0]), typ) + zv := lintutil.ZeroValueOf(ast.Unparen(call.Args[0]), typ) if zv != nil { c.warn(expr, zv) } diff --git a/vendor/github.com/go-critic/go-critic/checkers/rangeExprCopy_checker.go b/vendor/github.com/go-critic/go-critic/checkers/rangeExprCopy_checker.go index 3f61ee0b..68905224 100644 --- a/vendor/github.com/go-critic/go-critic/checkers/rangeExprCopy_checker.go +++ b/vendor/github.com/go-critic/go-critic/checkers/rangeExprCopy_checker.go @@ -54,7 +54,7 @@ type rangeExprCopyChecker struct { func (c *rangeExprCopyChecker) EnterFunc(fn *ast.FuncDecl) bool { return fn.Body != nil && - !(c.skipTestFuncs && isUnitTestFunc(c.ctx, fn)) + (!c.skipTestFuncs || !isUnitTestFunc(c.ctx, fn)) } func (c *rangeExprCopyChecker) VisitStmt(stmt ast.Stmt) { diff --git a/vendor/github.com/go-critic/go-critic/checkers/rangeValCopy_checker.go b/vendor/github.com/go-critic/go-critic/checkers/rangeValCopy_checker.go index 6d15c30c..a0afc1fa 100644 --- a/vendor/github.com/go-critic/go-critic/checkers/rangeValCopy_checker.go +++ b/vendor/github.com/go-critic/go-critic/checkers/rangeValCopy_checker.go @@ -53,7 +53,7 @@ type rangeValCopyChecker struct { func (c *rangeValCopyChecker) EnterFunc(fn *ast.FuncDecl) bool { return fn.Body != nil && - !(c.skipTestFuncs && isUnitTestFunc(c.ctx, fn)) + (!c.skipTestFuncs || !isUnitTestFunc(c.ctx, fn)) } func (c *rangeValCopyChecker) VisitStmt(stmt ast.Stmt) { diff --git a/vendor/github.com/go-critic/go-critic/checkers/rulesdata/rulesdata.go b/vendor/github.com/go-critic/go-critic/checkers/rulesdata/rulesdata.go index 66414585..4e3aab35 100644 --- a/vendor/github.com/go-critic/go-critic/checkers/rulesdata/rulesdata.go +++ b/vendor/github.com/go-critic/go-critic/checkers/rulesdata/rulesdata.go @@ -1596,38 +1596,52 @@ var PrecompiledRules = &ir.File{ Name: "sprintfQuotedString", MatcherName: "m", DocTags: []string{"diagnostic", "experimental"}, - DocSummary: "Detects \"%s\" formatting directives that can be replaced with %q", + DocSummary: "Detects manually quoted \"%s\" directives that can be replaced with %q or %#q", DocBefore: "fmt.Sprintf(`\"%s\"`, s)", DocAfter: "fmt.Sprintf(`%q`, s)", - Rules: []ir.Rule{{ - Line: 491, - SyntaxPatterns: []ir.PatternString{{Line: 491, Value: "fmt.Sprintf($s, $*_)"}}, - ReportTemplate: "use %q instead of \"%s\" for quoted strings", - WhereExpr: ir.FilterExpr{ - Line: 492, - Op: ir.FilterOrOp, - Src: "m[\"s\"].Text.Matches(\"^`.*\\\"%s\\\".*`$\") ||\n\tm[\"s\"].Text.Matches(`^\".*\\\\\"%s\\\\\".*\"$`)", - Args: []ir.FilterExpr{ - { - Line: 492, - Op: ir.FilterVarTextMatchesOp, - Src: "m[\"s\"].Text.Matches(\"^`.*\\\"%s\\\".*`$\")", - Value: "s", - Args: []ir.FilterExpr{{Line: 492, Op: ir.FilterStringOp, Src: "\"^`.*\\\"%s\\\".*`$\"", Value: "^`.*\"%s\".*`$"}}, - }, - { - Line: 493, - Op: ir.FilterVarTextMatchesOp, - Src: "m[\"s\"].Text.Matches(`^\".*\\\\\"%s\\\\\".*\"$`)", - Value: "s", - Args: []ir.FilterExpr{{Line: 493, Op: ir.FilterStringOp, Src: "`^\".*\\\\\"%s\\\\\".*\"$`", Value: "^\".*\\\\\"%s\\\\\".*\"$"}}, + Rules: []ir.Rule{ + { + Line: 491, + SyntaxPatterns: []ir.PatternString{{Line: 491, Value: "fmt.Sprintf($s, $*_)"}}, + ReportTemplate: "use %q instead of \"%s\" for quoted strings", + WhereExpr: ir.FilterExpr{ + Line: 492, + Op: ir.FilterOrOp, + Src: "m[\"s\"].Text.Matches(\"^`.*\\\"%s\\\".*`$\") ||\n\tm[\"s\"].Text.Matches(`^\".*\\\\\"%s\\\\\".*\"$`)", + Args: []ir.FilterExpr{ + { + Line: 492, + Op: ir.FilterVarTextMatchesOp, + Src: "m[\"s\"].Text.Matches(\"^`.*\\\"%s\\\".*`$\")", + Value: "s", + Args: []ir.FilterExpr{{Line: 492, Op: ir.FilterStringOp, Src: "\"^`.*\\\"%s\\\".*`$\"", Value: "^`.*\"%s\".*`$"}}, + }, + { + Line: 493, + Op: ir.FilterVarTextMatchesOp, + Src: "m[\"s\"].Text.Matches(`^\".*\\\\\"%s\\\\\".*\"$`)", + Value: "s", + Args: []ir.FilterExpr{{Line: 493, Op: ir.FilterStringOp, Src: "`^\".*\\\\\"%s\\\\\".*\"$`", Value: "^\".*\\\\\"%s\\\\\".*\"$"}}, + }, }, }, }, - }}, + { + Line: 498, + SyntaxPatterns: []ir.PatternString{{Line: 498, Value: "fmt.Sprintf($s, $*_)"}}, + ReportTemplate: "use %#q instead of \"`%s`\" for backquoted strings", + WhereExpr: ir.FilterExpr{ + Line: 499, + Op: ir.FilterVarTextMatchesOp, + Src: "m[\"s\"].Text.Matches(\"^\\\".*`%s`.*\\\"$\")", + Value: "s", + Args: []ir.FilterExpr{{Line: 499, Op: ir.FilterStringOp, Src: "\"^\\\".*`%s`.*\\\"$\"", Value: "^\".*`%s`.*\"$"}}, + }, + }, + }, }, { - Line: 501, + Line: 507, Name: "offBy1", MatcherName: "m", DocTags: []string{"diagnostic"}, @@ -1636,80 +1650,80 @@ var PrecompiledRules = &ir.File{ DocAfter: "xs[len(xs)-1]", Rules: []ir.Rule{ { - Line: 502, - SyntaxPatterns: []ir.PatternString{{Line: 502, Value: "$x[len($x)]"}}, + Line: 508, + SyntaxPatterns: []ir.PatternString{{Line: 508, Value: "$x[len($x)]"}}, ReportTemplate: "index expr always panics; maybe you wanted $x[len($x)-1]?", SuggestTemplate: "$x[len($x)-1]", WhereExpr: ir.FilterExpr{ - Line: 503, + Line: 509, Op: ir.FilterAndOp, Src: "m[\"x\"].Pure && m[\"x\"].Type.Is(`[]$_`)", Args: []ir.FilterExpr{ - {Line: 503, Op: ir.FilterVarPureOp, Src: "m[\"x\"].Pure", Value: "x"}, + {Line: 509, Op: ir.FilterVarPureOp, Src: "m[\"x\"].Pure", Value: "x"}, { - Line: 503, + Line: 509, Op: ir.FilterVarTypeIsOp, Src: "m[\"x\"].Type.Is(`[]$_`)", Value: "x", - Args: []ir.FilterExpr{{Line: 503, Op: ir.FilterStringOp, Src: "`[]$_`", Value: "[]$_"}}, + Args: []ir.FilterExpr{{Line: 509, Op: ir.FilterStringOp, Src: "`[]$_`", Value: "[]$_"}}, }, }, }, }, { - Line: 510, + Line: 516, SyntaxPatterns: []ir.PatternString{ - {Line: 511, Value: "$i := strings.Index($s, $_); $_ := $slicing[$i:]"}, - {Line: 512, Value: "$i := strings.Index($s, $_); $_ = $slicing[$i:]"}, - {Line: 513, Value: "$i := bytes.Index($s, $_); $_ := $slicing[$i:]"}, - {Line: 514, Value: "$i := bytes.Index($s, $_); $_ = $slicing[$i:]"}, + {Line: 517, Value: "$i := strings.Index($s, $_); $_ := $slicing[$i:]"}, + {Line: 518, Value: "$i := strings.Index($s, $_); $_ = $slicing[$i:]"}, + {Line: 519, Value: "$i := bytes.Index($s, $_); $_ := $slicing[$i:]"}, + {Line: 520, Value: "$i := bytes.Index($s, $_); $_ = $slicing[$i:]"}, }, ReportTemplate: "Index() can return -1; maybe you wanted to do $s[$i+1:]", WhereExpr: ir.FilterExpr{ - Line: 515, + Line: 521, Op: ir.FilterEqOp, Src: "m[\"s\"].Text == m[\"slicing\"].Text", Args: []ir.FilterExpr{ - {Line: 515, Op: ir.FilterVarTextOp, Src: "m[\"s\"].Text", Value: "s"}, - {Line: 515, Op: ir.FilterVarTextOp, Src: "m[\"slicing\"].Text", Value: "slicing"}, + {Line: 521, Op: ir.FilterVarTextOp, Src: "m[\"s\"].Text", Value: "s"}, + {Line: 521, Op: ir.FilterVarTextOp, Src: "m[\"slicing\"].Text", Value: "slicing"}, }, }, LocationVar: "slicing", }, { - Line: 519, + Line: 525, SyntaxPatterns: []ir.PatternString{ - {Line: 520, Value: "$i := strings.Index($s, $_); $_ := $slicing[:$i]"}, - {Line: 521, Value: "$i := strings.Index($s, $_); $_ = $slicing[:$i]"}, - {Line: 522, Value: "$i := bytes.Index($s, $_); $_ := $slicing[:$i]"}, - {Line: 523, Value: "$i := bytes.Index($s, $_); $_ = $slicing[:$i]"}, + {Line: 526, Value: "$i := strings.Index($s, $_); $_ := $slicing[:$i]"}, + {Line: 527, Value: "$i := strings.Index($s, $_); $_ = $slicing[:$i]"}, + {Line: 528, Value: "$i := bytes.Index($s, $_); $_ := $slicing[:$i]"}, + {Line: 529, Value: "$i := bytes.Index($s, $_); $_ = $slicing[:$i]"}, }, ReportTemplate: "Index() can return -1; maybe you wanted to do $s[:$i+1]", WhereExpr: ir.FilterExpr{ - Line: 524, + Line: 530, Op: ir.FilterEqOp, Src: "m[\"s\"].Text == m[\"slicing\"].Text", Args: []ir.FilterExpr{ - {Line: 524, Op: ir.FilterVarTextOp, Src: "m[\"s\"].Text", Value: "s"}, - {Line: 524, Op: ir.FilterVarTextOp, Src: "m[\"slicing\"].Text", Value: "slicing"}, + {Line: 530, Op: ir.FilterVarTextOp, Src: "m[\"s\"].Text", Value: "s"}, + {Line: 530, Op: ir.FilterVarTextOp, Src: "m[\"slicing\"].Text", Value: "slicing"}, }, }, LocationVar: "slicing", }, { - Line: 528, + Line: 534, SyntaxPatterns: []ir.PatternString{ - {Line: 529, Value: "$s[strings.Index($s, $_):]"}, - {Line: 530, Value: "$s[:strings.Index($s, $_)]"}, - {Line: 531, Value: "$s[bytes.Index($s, $_):]"}, - {Line: 532, Value: "$s[:bytes.Index($s, $_)]"}, + {Line: 535, Value: "$s[strings.Index($s, $_):]"}, + {Line: 536, Value: "$s[:strings.Index($s, $_)]"}, + {Line: 537, Value: "$s[bytes.Index($s, $_):]"}, + {Line: 538, Value: "$s[:bytes.Index($s, $_)]"}, }, ReportTemplate: "Index() can return -1; maybe you wanted to do Index()+1", }, }, }, { - Line: 540, + Line: 546, Name: "unslice", MatcherName: "m", DocTags: []string{"style"}, @@ -1717,35 +1731,35 @@ var PrecompiledRules = &ir.File{ DocBefore: "copy(b[:], values...)", DocAfter: "copy(b, values...)", Rules: []ir.Rule{{ - Line: 541, - SyntaxPatterns: []ir.PatternString{{Line: 541, Value: "$s[:]"}}, + Line: 547, + SyntaxPatterns: []ir.PatternString{{Line: 547, Value: "$s[:]"}}, ReportTemplate: "could simplify $$ to $s", SuggestTemplate: "$s", WhereExpr: ir.FilterExpr{ - Line: 542, + Line: 548, Op: ir.FilterOrOp, Src: "m[\"s\"].Type.Is(`string`) || m[\"s\"].Type.Is(`[]$_`)", Args: []ir.FilterExpr{ { - Line: 542, + Line: 548, Op: ir.FilterVarTypeIsOp, Src: "m[\"s\"].Type.Is(`string`)", Value: "s", - Args: []ir.FilterExpr{{Line: 542, Op: ir.FilterStringOp, Src: "`string`", Value: "string"}}, + Args: []ir.FilterExpr{{Line: 548, Op: ir.FilterStringOp, Src: "`string`", Value: "string"}}, }, { - Line: 542, + Line: 548, Op: ir.FilterVarTypeIsOp, Src: "m[\"s\"].Type.Is(`[]$_`)", Value: "s", - Args: []ir.FilterExpr{{Line: 542, Op: ir.FilterStringOp, Src: "`[]$_`", Value: "[]$_"}}, + Args: []ir.FilterExpr{{Line: 548, Op: ir.FilterStringOp, Src: "`[]$_`", Value: "[]$_"}}, }, }, }, }}, }, { - Line: 551, + Line: 557, Name: "yodaStyleExpr", MatcherName: "m", DocTags: []string{"style", "experimental"}, @@ -1754,105 +1768,105 @@ var PrecompiledRules = &ir.File{ DocAfter: "return ptr != nil", Rules: []ir.Rule{ { - Line: 552, - SyntaxPatterns: []ir.PatternString{{Line: 552, Value: "$constval != $x"}}, + Line: 558, + SyntaxPatterns: []ir.PatternString{{Line: 558, Value: "$constval != $x"}}, ReportTemplate: "consider to change order in expression to $x != $constval", WhereExpr: ir.FilterExpr{ - Line: 552, + Line: 558, Op: ir.FilterAndOp, Src: "m[\"constval\"].Node.Is(`BasicLit`) && !m[\"x\"].Node.Is(`BasicLit`)", Args: []ir.FilterExpr{ { - Line: 552, + Line: 558, Op: ir.FilterVarNodeIsOp, Src: "m[\"constval\"].Node.Is(`BasicLit`)", Value: "constval", - Args: []ir.FilterExpr{{Line: 552, Op: ir.FilterStringOp, Src: "`BasicLit`", Value: "BasicLit"}}, + Args: []ir.FilterExpr{{Line: 558, Op: ir.FilterStringOp, Src: "`BasicLit`", Value: "BasicLit"}}, }, { - Line: 552, + Line: 558, Op: ir.FilterNotOp, Src: "!m[\"x\"].Node.Is(`BasicLit`)", Args: []ir.FilterExpr{{ - Line: 552, + Line: 558, Op: ir.FilterVarNodeIsOp, Src: "m[\"x\"].Node.Is(`BasicLit`)", Value: "x", - Args: []ir.FilterExpr{{Line: 552, Op: ir.FilterStringOp, Src: "`BasicLit`", Value: "BasicLit"}}, + Args: []ir.FilterExpr{{Line: 558, Op: ir.FilterStringOp, Src: "`BasicLit`", Value: "BasicLit"}}, }}, }, }, }, }, { - Line: 554, - SyntaxPatterns: []ir.PatternString{{Line: 554, Value: "$constval == $x"}}, + Line: 560, + SyntaxPatterns: []ir.PatternString{{Line: 560, Value: "$constval == $x"}}, ReportTemplate: "consider to change order in expression to $x == $constval", WhereExpr: ir.FilterExpr{ - Line: 554, + Line: 560, Op: ir.FilterAndOp, Src: "m[\"constval\"].Node.Is(`BasicLit`) && !m[\"x\"].Node.Is(`BasicLit`)", Args: []ir.FilterExpr{ { - Line: 554, + Line: 560, Op: ir.FilterVarNodeIsOp, Src: "m[\"constval\"].Node.Is(`BasicLit`)", Value: "constval", - Args: []ir.FilterExpr{{Line: 554, Op: ir.FilterStringOp, Src: "`BasicLit`", Value: "BasicLit"}}, + Args: []ir.FilterExpr{{Line: 560, Op: ir.FilterStringOp, Src: "`BasicLit`", Value: "BasicLit"}}, }, { - Line: 554, + Line: 560, Op: ir.FilterNotOp, Src: "!m[\"x\"].Node.Is(`BasicLit`)", Args: []ir.FilterExpr{{ - Line: 554, + Line: 560, Op: ir.FilterVarNodeIsOp, Src: "m[\"x\"].Node.Is(`BasicLit`)", Value: "x", - Args: []ir.FilterExpr{{Line: 554, Op: ir.FilterStringOp, Src: "`BasicLit`", Value: "BasicLit"}}, + Args: []ir.FilterExpr{{Line: 560, Op: ir.FilterStringOp, Src: "`BasicLit`", Value: "BasicLit"}}, }}, }, }, }, }, { - Line: 557, - SyntaxPatterns: []ir.PatternString{{Line: 557, Value: "nil != $x"}}, + Line: 563, + SyntaxPatterns: []ir.PatternString{{Line: 563, Value: "nil != $x"}}, ReportTemplate: "consider to change order in expression to $x != nil", WhereExpr: ir.FilterExpr{ - Line: 557, + Line: 563, Op: ir.FilterNotOp, Src: "!m[\"x\"].Node.Is(`BasicLit`)", Args: []ir.FilterExpr{{ - Line: 557, + Line: 563, Op: ir.FilterVarNodeIsOp, Src: "m[\"x\"].Node.Is(`BasicLit`)", Value: "x", - Args: []ir.FilterExpr{{Line: 557, Op: ir.FilterStringOp, Src: "`BasicLit`", Value: "BasicLit"}}, + Args: []ir.FilterExpr{{Line: 563, Op: ir.FilterStringOp, Src: "`BasicLit`", Value: "BasicLit"}}, }}, }, }, { - Line: 559, - SyntaxPatterns: []ir.PatternString{{Line: 559, Value: "nil == $x"}}, + Line: 565, + SyntaxPatterns: []ir.PatternString{{Line: 565, Value: "nil == $x"}}, ReportTemplate: "consider to change order in expression to $x == nil", WhereExpr: ir.FilterExpr{ - Line: 559, + Line: 565, Op: ir.FilterNotOp, Src: "!m[\"x\"].Node.Is(`BasicLit`)", Args: []ir.FilterExpr{{ - Line: 559, + Line: 565, Op: ir.FilterVarNodeIsOp, Src: "m[\"x\"].Node.Is(`BasicLit`)", Value: "x", - Args: []ir.FilterExpr{{Line: 559, Op: ir.FilterStringOp, Src: "`BasicLit`", Value: "BasicLit"}}, + Args: []ir.FilterExpr{{Line: 565, Op: ir.FilterStringOp, Src: "`BasicLit`", Value: "BasicLit"}}, }}, }, }, }, }, { - Line: 567, + Line: 573, Name: "equalFold", MatcherName: "m", DocTags: []string{"performance", "experimental"}, @@ -1861,114 +1875,114 @@ var PrecompiledRules = &ir.File{ DocAfter: "strings.EqualFold(x, y)", Rules: []ir.Rule{ { - Line: 576, + Line: 582, SyntaxPatterns: []ir.PatternString{ - {Line: 577, Value: "strings.ToLower($x) == $y"}, - {Line: 578, Value: "strings.ToLower($x) == strings.ToLower($y)"}, - {Line: 579, Value: "$x == strings.ToLower($y)"}, - {Line: 580, Value: "strings.ToUpper($x) == $y"}, - {Line: 581, Value: "strings.ToUpper($x) == strings.ToUpper($y)"}, - {Line: 582, Value: "$x == strings.ToUpper($y)"}, + {Line: 583, Value: "strings.ToLower($x) == $y"}, + {Line: 584, Value: "strings.ToLower($x) == strings.ToLower($y)"}, + {Line: 585, Value: "$x == strings.ToLower($y)"}, + {Line: 586, Value: "strings.ToUpper($x) == $y"}, + {Line: 587, Value: "strings.ToUpper($x) == strings.ToUpper($y)"}, + {Line: 588, Value: "$x == strings.ToUpper($y)"}, }, ReportTemplate: "consider replacing with strings.EqualFold($x, $y)", SuggestTemplate: "strings.EqualFold($x, $y)", WhereExpr: ir.FilterExpr{ - Line: 583, + Line: 589, Op: ir.FilterAndOp, Src: "m[\"x\"].Pure && m[\"y\"].Pure && m[\"x\"].Text != m[\"y\"].Text", Args: []ir.FilterExpr{ { - Line: 583, + Line: 589, Op: ir.FilterAndOp, Src: "m[\"x\"].Pure && m[\"y\"].Pure", Args: []ir.FilterExpr{ - {Line: 583, Op: ir.FilterVarPureOp, Src: "m[\"x\"].Pure", Value: "x"}, - {Line: 583, Op: ir.FilterVarPureOp, Src: "m[\"y\"].Pure", Value: "y"}, + {Line: 589, Op: ir.FilterVarPureOp, Src: "m[\"x\"].Pure", Value: "x"}, + {Line: 589, Op: ir.FilterVarPureOp, Src: "m[\"y\"].Pure", Value: "y"}, }, }, { - Line: 583, + Line: 589, Op: ir.FilterNeqOp, Src: "m[\"x\"].Text != m[\"y\"].Text", Args: []ir.FilterExpr{ - {Line: 583, Op: ir.FilterVarTextOp, Src: "m[\"x\"].Text", Value: "x"}, - {Line: 583, Op: ir.FilterVarTextOp, Src: "m[\"y\"].Text", Value: "y"}, + {Line: 589, Op: ir.FilterVarTextOp, Src: "m[\"x\"].Text", Value: "x"}, + {Line: 589, Op: ir.FilterVarTextOp, Src: "m[\"y\"].Text", Value: "y"}, }, }, }, }, }, { - Line: 588, + Line: 594, SyntaxPatterns: []ir.PatternString{ - {Line: 589, Value: "strings.ToLower($x) != $y"}, - {Line: 590, Value: "strings.ToLower($x) != strings.ToLower($y)"}, - {Line: 591, Value: "$x != strings.ToLower($y)"}, - {Line: 592, Value: "strings.ToUpper($x) != $y"}, - {Line: 593, Value: "strings.ToUpper($x) != strings.ToUpper($y)"}, - {Line: 594, Value: "$x != strings.ToUpper($y)"}, + {Line: 595, Value: "strings.ToLower($x) != $y"}, + {Line: 596, Value: "strings.ToLower($x) != strings.ToLower($y)"}, + {Line: 597, Value: "$x != strings.ToLower($y)"}, + {Line: 598, Value: "strings.ToUpper($x) != $y"}, + {Line: 599, Value: "strings.ToUpper($x) != strings.ToUpper($y)"}, + {Line: 600, Value: "$x != strings.ToUpper($y)"}, }, ReportTemplate: "consider replacing with !strings.EqualFold($x, $y)", SuggestTemplate: "!strings.EqualFold($x, $y)", WhereExpr: ir.FilterExpr{ - Line: 595, + Line: 601, Op: ir.FilterAndOp, Src: "m[\"x\"].Pure && m[\"y\"].Pure && m[\"x\"].Text != m[\"y\"].Text", Args: []ir.FilterExpr{ { - Line: 595, + Line: 601, Op: ir.FilterAndOp, Src: "m[\"x\"].Pure && m[\"y\"].Pure", Args: []ir.FilterExpr{ - {Line: 595, Op: ir.FilterVarPureOp, Src: "m[\"x\"].Pure", Value: "x"}, - {Line: 595, Op: ir.FilterVarPureOp, Src: "m[\"y\"].Pure", Value: "y"}, + {Line: 601, Op: ir.FilterVarPureOp, Src: "m[\"x\"].Pure", Value: "x"}, + {Line: 601, Op: ir.FilterVarPureOp, Src: "m[\"y\"].Pure", Value: "y"}, }, }, { - Line: 595, + Line: 601, Op: ir.FilterNeqOp, Src: "m[\"x\"].Text != m[\"y\"].Text", Args: []ir.FilterExpr{ - {Line: 595, Op: ir.FilterVarTextOp, Src: "m[\"x\"].Text", Value: "x"}, - {Line: 595, Op: ir.FilterVarTextOp, Src: "m[\"y\"].Text", Value: "y"}, + {Line: 601, Op: ir.FilterVarTextOp, Src: "m[\"x\"].Text", Value: "x"}, + {Line: 601, Op: ir.FilterVarTextOp, Src: "m[\"y\"].Text", Value: "y"}, }, }, }, }, }, { - Line: 600, + Line: 606, SyntaxPatterns: []ir.PatternString{ - {Line: 601, Value: "bytes.Equal(bytes.ToLower($x), $y)"}, - {Line: 602, Value: "bytes.Equal(bytes.ToLower($x), bytes.ToLower($y))"}, - {Line: 603, Value: "bytes.Equal($x, bytes.ToLower($y))"}, - {Line: 604, Value: "bytes.Equal(bytes.ToUpper($x), $y)"}, - {Line: 605, Value: "bytes.Equal(bytes.ToUpper($x), bytes.ToUpper($y))"}, - {Line: 606, Value: "bytes.Equal($x, bytes.ToUpper($y))"}, + {Line: 607, Value: "bytes.Equal(bytes.ToLower($x), $y)"}, + {Line: 608, Value: "bytes.Equal(bytes.ToLower($x), bytes.ToLower($y))"}, + {Line: 609, Value: "bytes.Equal($x, bytes.ToLower($y))"}, + {Line: 610, Value: "bytes.Equal(bytes.ToUpper($x), $y)"}, + {Line: 611, Value: "bytes.Equal(bytes.ToUpper($x), bytes.ToUpper($y))"}, + {Line: 612, Value: "bytes.Equal($x, bytes.ToUpper($y))"}, }, ReportTemplate: "consider replacing with bytes.EqualFold($x, $y)", SuggestTemplate: "bytes.EqualFold($x, $y)", WhereExpr: ir.FilterExpr{ - Line: 607, + Line: 613, Op: ir.FilterAndOp, Src: "m[\"x\"].Pure && m[\"y\"].Pure && m[\"x\"].Text != m[\"y\"].Text", Args: []ir.FilterExpr{ { - Line: 607, + Line: 613, Op: ir.FilterAndOp, Src: "m[\"x\"].Pure && m[\"y\"].Pure", Args: []ir.FilterExpr{ - {Line: 607, Op: ir.FilterVarPureOp, Src: "m[\"x\"].Pure", Value: "x"}, - {Line: 607, Op: ir.FilterVarPureOp, Src: "m[\"y\"].Pure", Value: "y"}, + {Line: 613, Op: ir.FilterVarPureOp, Src: "m[\"x\"].Pure", Value: "x"}, + {Line: 613, Op: ir.FilterVarPureOp, Src: "m[\"y\"].Pure", Value: "y"}, }, }, { - Line: 607, + Line: 613, Op: ir.FilterNeqOp, Src: "m[\"x\"].Text != m[\"y\"].Text", Args: []ir.FilterExpr{ - {Line: 607, Op: ir.FilterVarTextOp, Src: "m[\"x\"].Text", Value: "x"}, - {Line: 607, Op: ir.FilterVarTextOp, Src: "m[\"y\"].Text", Value: "y"}, + {Line: 613, Op: ir.FilterVarTextOp, Src: "m[\"x\"].Text", Value: "x"}, + {Line: 613, Op: ir.FilterVarTextOp, Src: "m[\"y\"].Text", Value: "y"}, }, }, }, @@ -1977,7 +1991,7 @@ var PrecompiledRules = &ir.File{ }, }, { - Line: 616, + Line: 622, Name: "argOrder", MatcherName: "m", DocTags: []string{"diagnostic"}, @@ -1985,45 +1999,45 @@ var PrecompiledRules = &ir.File{ DocBefore: "strings.HasPrefix(\"#\", userpass)", DocAfter: "strings.HasPrefix(userpass, \"#\")", Rules: []ir.Rule{{ - Line: 617, + Line: 623, SyntaxPatterns: []ir.PatternString{ - {Line: 618, Value: "strings.HasPrefix($lit, $s)"}, - {Line: 619, Value: "bytes.HasPrefix($lit, $s)"}, - {Line: 620, Value: "strings.HasSuffix($lit, $s)"}, - {Line: 621, Value: "bytes.HasSuffix($lit, $s)"}, - {Line: 622, Value: "strings.Contains($lit, $s)"}, - {Line: 623, Value: "bytes.Contains($lit, $s)"}, - {Line: 624, Value: "strings.TrimPrefix($lit, $s)"}, - {Line: 625, Value: "bytes.TrimPrefix($lit, $s)"}, - {Line: 626, Value: "strings.TrimSuffix($lit, $s)"}, - {Line: 627, Value: "bytes.TrimSuffix($lit, $s)"}, - {Line: 628, Value: "strings.Split($lit, $s)"}, - {Line: 629, Value: "bytes.Split($lit, $s)"}, + {Line: 624, Value: "strings.HasPrefix($lit, $s)"}, + {Line: 625, Value: "bytes.HasPrefix($lit, $s)"}, + {Line: 626, Value: "strings.HasSuffix($lit, $s)"}, + {Line: 627, Value: "bytes.HasSuffix($lit, $s)"}, + {Line: 628, Value: "strings.Contains($lit, $s)"}, + {Line: 629, Value: "bytes.Contains($lit, $s)"}, + {Line: 630, Value: "strings.TrimPrefix($lit, $s)"}, + {Line: 631, Value: "bytes.TrimPrefix($lit, $s)"}, + {Line: 632, Value: "strings.TrimSuffix($lit, $s)"}, + {Line: 633, Value: "bytes.TrimSuffix($lit, $s)"}, + {Line: 634, Value: "strings.Split($lit, $s)"}, + {Line: 635, Value: "bytes.Split($lit, $s)"}, }, ReportTemplate: "$lit and $s arguments order looks reversed", WhereExpr: ir.FilterExpr{ - Line: 630, + Line: 636, Op: ir.FilterAndOp, Src: "(m[\"lit\"].Const || m[\"lit\"].ConstSlice) &&\n\t!(m[\"s\"].Const || m[\"s\"].ConstSlice) &&\n\t!m[\"lit\"].Node.Is(`Ident`)", Args: []ir.FilterExpr{ { - Line: 630, + Line: 636, Op: ir.FilterAndOp, Src: "(m[\"lit\"].Const || m[\"lit\"].ConstSlice) &&\n\t!(m[\"s\"].Const || m[\"s\"].ConstSlice)", Args: []ir.FilterExpr{ { - Line: 630, + Line: 636, Op: ir.FilterOrOp, Src: "(m[\"lit\"].Const || m[\"lit\"].ConstSlice)", Args: []ir.FilterExpr{ { - Line: 630, + Line: 636, Op: ir.FilterVarConstOp, Src: "m[\"lit\"].Const", Value: "lit", }, { - Line: 630, + Line: 636, Op: ir.FilterVarConstSliceOp, Src: "m[\"lit\"].ConstSlice", Value: "lit", @@ -2031,22 +2045,22 @@ var PrecompiledRules = &ir.File{ }, }, { - Line: 631, + Line: 637, Op: ir.FilterNotOp, Src: "!(m[\"s\"].Const || m[\"s\"].ConstSlice)", Args: []ir.FilterExpr{{ - Line: 631, + Line: 637, Op: ir.FilterOrOp, Src: "(m[\"s\"].Const || m[\"s\"].ConstSlice)", Args: []ir.FilterExpr{ { - Line: 631, + Line: 637, Op: ir.FilterVarConstOp, Src: "m[\"s\"].Const", Value: "s", }, { - Line: 631, + Line: 637, Op: ir.FilterVarConstSliceOp, Src: "m[\"s\"].ConstSlice", Value: "s", @@ -2057,15 +2071,15 @@ var PrecompiledRules = &ir.File{ }, }, { - Line: 632, + Line: 638, Op: ir.FilterNotOp, Src: "!m[\"lit\"].Node.Is(`Ident`)", Args: []ir.FilterExpr{{ - Line: 632, + Line: 638, Op: ir.FilterVarNodeIsOp, Src: "m[\"lit\"].Node.Is(`Ident`)", Value: "lit", - Args: []ir.FilterExpr{{Line: 632, Op: ir.FilterStringOp, Src: "`Ident`", Value: "Ident"}}, + Args: []ir.FilterExpr{{Line: 638, Op: ir.FilterStringOp, Src: "`Ident`", Value: "Ident"}}, }}, }, }, @@ -2073,7 +2087,7 @@ var PrecompiledRules = &ir.File{ }}, }, { - Line: 640, + Line: 646, Name: "stringConcatSimplify", MatcherName: "m", DocTags: []string{"style", "experimental"}, @@ -2082,27 +2096,27 @@ var PrecompiledRules = &ir.File{ DocAfter: "x + \"_\" + y", Rules: []ir.Rule{ { - Line: 641, - SyntaxPatterns: []ir.PatternString{{Line: 641, Value: "strings.Join([]string{$x, $y}, \"\")"}}, + Line: 647, + SyntaxPatterns: []ir.PatternString{{Line: 647, Value: "strings.Join([]string{$x, $y}, \"\")"}}, ReportTemplate: "suggestion: $x + $y", SuggestTemplate: "$x + $y", }, { - Line: 642, - SyntaxPatterns: []ir.PatternString{{Line: 642, Value: "strings.Join([]string{$x, $y, $z}, \"\")"}}, + Line: 648, + SyntaxPatterns: []ir.PatternString{{Line: 648, Value: "strings.Join([]string{$x, $y, $z}, \"\")"}}, ReportTemplate: "suggestion: $x + $y + $z", SuggestTemplate: "$x + $y + $z", }, { - Line: 643, - SyntaxPatterns: []ir.PatternString{{Line: 643, Value: "strings.Join([]string{$x, $y}, $glue)"}}, + Line: 649, + SyntaxPatterns: []ir.PatternString{{Line: 649, Value: "strings.Join([]string{$x, $y}, $glue)"}}, ReportTemplate: "suggestion: $x + $glue + $y", SuggestTemplate: "$x + $glue + $y", }, }, }, { - Line: 650, + Line: 656, Name: "timeExprSimplify", MatcherName: "m", DocTags: []string{"style", "experimental"}, @@ -2111,39 +2125,39 @@ var PrecompiledRules = &ir.File{ DocAfter: "t.UnixMilli()", Rules: []ir.Rule{ { - Line: 655, - SyntaxPatterns: []ir.PatternString{{Line: 655, Value: "$t.Unix() / 1000"}}, + Line: 661, + SyntaxPatterns: []ir.PatternString{{Line: 661, Value: "$t.Unix() / 1000"}}, ReportTemplate: "use $t.UnixMilli() instead of $$", SuggestTemplate: "$t.UnixMilli()", WhereExpr: ir.FilterExpr{ - Line: 656, + Line: 662, Op: ir.FilterAndOp, Src: "m.GoVersion().GreaterEqThan(\"1.17\") && isTime(m[\"t\"])", Args: []ir.FilterExpr{ { - Line: 656, + Line: 662, Op: ir.FilterGoVersionGreaterEqThanOp, Src: "m.GoVersion().GreaterEqThan(\"1.17\")", Value: "1.17", }, { - Line: 656, + Line: 662, Op: ir.FilterOrOp, Src: "isTime(m[\"t\"])", Args: []ir.FilterExpr{ { - Line: 656, + Line: 662, Op: ir.FilterVarTypeIsOp, Src: "m[\"t\"].Type.Is(`time.Time`)", Value: "t", - Args: []ir.FilterExpr{{Line: 652, Op: ir.FilterStringOp, Src: "`time.Time`", Value: "time.Time"}}, + Args: []ir.FilterExpr{{Line: 658, Op: ir.FilterStringOp, Src: "`time.Time`", Value: "time.Time"}}, }, { - Line: 656, + Line: 662, Op: ir.FilterVarTypeIsOp, Src: "m[\"t\"].Type.Is(`*time.Time`)", Value: "t", - Args: []ir.FilterExpr{{Line: 652, Op: ir.FilterStringOp, Src: "`*time.Time`", Value: "*time.Time"}}, + Args: []ir.FilterExpr{{Line: 658, Op: ir.FilterStringOp, Src: "`*time.Time`", Value: "*time.Time"}}, }, }, }, @@ -2151,39 +2165,39 @@ var PrecompiledRules = &ir.File{ }, }, { - Line: 660, - SyntaxPatterns: []ir.PatternString{{Line: 660, Value: "$t.UnixNano() * 1000"}}, + Line: 666, + SyntaxPatterns: []ir.PatternString{{Line: 666, Value: "$t.UnixNano() * 1000"}}, ReportTemplate: "use $t.UnixMicro() instead of $$", SuggestTemplate: "$t.UnixMicro()", WhereExpr: ir.FilterExpr{ - Line: 661, + Line: 667, Op: ir.FilterAndOp, Src: "m.GoVersion().GreaterEqThan(\"1.17\") && isTime(m[\"t\"])", Args: []ir.FilterExpr{ { - Line: 661, + Line: 667, Op: ir.FilterGoVersionGreaterEqThanOp, Src: "m.GoVersion().GreaterEqThan(\"1.17\")", Value: "1.17", }, { - Line: 661, + Line: 667, Op: ir.FilterOrOp, Src: "isTime(m[\"t\"])", Args: []ir.FilterExpr{ { - Line: 661, + Line: 667, Op: ir.FilterVarTypeIsOp, Src: "m[\"t\"].Type.Is(`time.Time`)", Value: "t", - Args: []ir.FilterExpr{{Line: 652, Op: ir.FilterStringOp, Src: "`time.Time`", Value: "time.Time"}}, + Args: []ir.FilterExpr{{Line: 658, Op: ir.FilterStringOp, Src: "`time.Time`", Value: "time.Time"}}, }, { - Line: 661, + Line: 667, Op: ir.FilterVarTypeIsOp, Src: "m[\"t\"].Type.Is(`*time.Time`)", Value: "t", - Args: []ir.FilterExpr{{Line: 652, Op: ir.FilterStringOp, Src: "`*time.Time`", Value: "*time.Time"}}, + Args: []ir.FilterExpr{{Line: 658, Op: ir.FilterStringOp, Src: "`*time.Time`", Value: "*time.Time"}}, }, }, }, @@ -2193,7 +2207,7 @@ var PrecompiledRules = &ir.File{ }, }, { - Line: 670, + Line: 676, Name: "exposedSyncMutex", MatcherName: "m", DocTags: []string{"style", "experimental"}, @@ -2202,57 +2216,57 @@ var PrecompiledRules = &ir.File{ DocAfter: "type Foo struct{ ...; mu sync.Mutex; ... }", Rules: []ir.Rule{ { - Line: 675, - SyntaxPatterns: []ir.PatternString{{Line: 675, Value: "type $x struct { $*_; sync.Mutex; $*_ }"}}, + Line: 681, + SyntaxPatterns: []ir.PatternString{{Line: 681, Value: "type $x struct { $*_; sync.Mutex; $*_ }"}}, ReportTemplate: "don't embed sync.Mutex", WhereExpr: ir.FilterExpr{ - Line: 676, + Line: 682, Op: ir.FilterVarTextMatchesOp, Src: "isExported(m[\"x\"])", Value: "x", - Args: []ir.FilterExpr{{Line: 672, Op: ir.FilterStringOp, Src: "`^\\p{Lu}`", Value: "^\\p{Lu}"}}, + Args: []ir.FilterExpr{{Line: 678, Op: ir.FilterStringOp, Src: "`^\\p{Lu}`", Value: "^\\p{Lu}"}}, }, }, { - Line: 679, - SyntaxPatterns: []ir.PatternString{{Line: 679, Value: "type $x struct { $*_; *sync.Mutex; $*_ }"}}, + Line: 685, + SyntaxPatterns: []ir.PatternString{{Line: 685, Value: "type $x struct { $*_; *sync.Mutex; $*_ }"}}, ReportTemplate: "don't embed *sync.Mutex", WhereExpr: ir.FilterExpr{ - Line: 680, + Line: 686, Op: ir.FilterVarTextMatchesOp, Src: "isExported(m[\"x\"])", Value: "x", - Args: []ir.FilterExpr{{Line: 672, Op: ir.FilterStringOp, Src: "`^\\p{Lu}`", Value: "^\\p{Lu}"}}, + Args: []ir.FilterExpr{{Line: 678, Op: ir.FilterStringOp, Src: "`^\\p{Lu}`", Value: "^\\p{Lu}"}}, }, }, { - Line: 683, - SyntaxPatterns: []ir.PatternString{{Line: 683, Value: "type $x struct { $*_; sync.RWMutex; $*_ }"}}, + Line: 689, + SyntaxPatterns: []ir.PatternString{{Line: 689, Value: "type $x struct { $*_; sync.RWMutex; $*_ }"}}, ReportTemplate: "don't embed sync.RWMutex", WhereExpr: ir.FilterExpr{ - Line: 684, + Line: 690, Op: ir.FilterVarTextMatchesOp, Src: "isExported(m[\"x\"])", Value: "x", - Args: []ir.FilterExpr{{Line: 672, Op: ir.FilterStringOp, Src: "`^\\p{Lu}`", Value: "^\\p{Lu}"}}, + Args: []ir.FilterExpr{{Line: 678, Op: ir.FilterStringOp, Src: "`^\\p{Lu}`", Value: "^\\p{Lu}"}}, }, }, { - Line: 687, - SyntaxPatterns: []ir.PatternString{{Line: 687, Value: "type $x struct { $*_; *sync.RWMutex; $*_ }"}}, + Line: 693, + SyntaxPatterns: []ir.PatternString{{Line: 693, Value: "type $x struct { $*_; *sync.RWMutex; $*_ }"}}, ReportTemplate: "don't embed *sync.RWMutex", WhereExpr: ir.FilterExpr{ - Line: 688, + Line: 694, Op: ir.FilterVarTextMatchesOp, Src: "isExported(m[\"x\"])", Value: "x", - Args: []ir.FilterExpr{{Line: 672, Op: ir.FilterStringOp, Src: "`^\\p{Lu}`", Value: "^\\p{Lu}"}}, + Args: []ir.FilterExpr{{Line: 678, Op: ir.FilterStringOp, Src: "`^\\p{Lu}`", Value: "^\\p{Lu}"}}, }, }, }, }, { - Line: 696, + Line: 702, Name: "badSorting", MatcherName: "m", DocTags: []string{"diagnostic", "experimental"}, @@ -2261,48 +2275,48 @@ var PrecompiledRules = &ir.File{ DocAfter: "sort.Strings(xs)", Rules: []ir.Rule{ { - Line: 697, - SyntaxPatterns: []ir.PatternString{{Line: 697, Value: "$x = sort.IntSlice($x)"}}, + Line: 703, + SyntaxPatterns: []ir.PatternString{{Line: 703, Value: "$x = sort.IntSlice($x)"}}, ReportTemplate: "suspicious sort.IntSlice usage, maybe sort.Ints was intended?", SuggestTemplate: "sort.Ints($x)", WhereExpr: ir.FilterExpr{ - Line: 698, + Line: 704, Op: ir.FilterVarTypeIsOp, Src: "m[\"x\"].Type.Is(`[]int`)", Value: "x", - Args: []ir.FilterExpr{{Line: 698, Op: ir.FilterStringOp, Src: "`[]int`", Value: "[]int"}}, + Args: []ir.FilterExpr{{Line: 704, Op: ir.FilterStringOp, Src: "`[]int`", Value: "[]int"}}, }, }, { - Line: 702, - SyntaxPatterns: []ir.PatternString{{Line: 702, Value: "$x = sort.Float64Slice($x)"}}, + Line: 708, + SyntaxPatterns: []ir.PatternString{{Line: 708, Value: "$x = sort.Float64Slice($x)"}}, ReportTemplate: "suspicious sort.Float64s usage, maybe sort.Float64s was intended?", SuggestTemplate: "sort.Float64s($x)", WhereExpr: ir.FilterExpr{ - Line: 703, + Line: 709, Op: ir.FilterVarTypeIsOp, Src: "m[\"x\"].Type.Is(`[]float64`)", Value: "x", - Args: []ir.FilterExpr{{Line: 703, Op: ir.FilterStringOp, Src: "`[]float64`", Value: "[]float64"}}, + Args: []ir.FilterExpr{{Line: 709, Op: ir.FilterStringOp, Src: "`[]float64`", Value: "[]float64"}}, }, }, { - Line: 707, - SyntaxPatterns: []ir.PatternString{{Line: 707, Value: "$x = sort.StringSlice($x)"}}, + Line: 713, + SyntaxPatterns: []ir.PatternString{{Line: 713, Value: "$x = sort.StringSlice($x)"}}, ReportTemplate: "suspicious sort.StringSlice usage, maybe sort.Strings was intended?", SuggestTemplate: "sort.Strings($x)", WhereExpr: ir.FilterExpr{ - Line: 708, + Line: 714, Op: ir.FilterVarTypeIsOp, Src: "m[\"x\"].Type.Is(`[]string`)", Value: "x", - Args: []ir.FilterExpr{{Line: 708, Op: ir.FilterStringOp, Src: "`[]string`", Value: "[]string"}}, + Args: []ir.FilterExpr{{Line: 714, Op: ir.FilterStringOp, Src: "`[]string`", Value: "[]string"}}, }, }, }, }, { - Line: 717, + Line: 723, Name: "externalErrorReassign", MatcherName: "m", DocTags: []string{"diagnostic", "experimental"}, @@ -2310,34 +2324,34 @@ var PrecompiledRules = &ir.File{ DocBefore: "io.EOF = nil", DocAfter: "/* don't do it */", Rules: []ir.Rule{{ - Line: 718, - SyntaxPatterns: []ir.PatternString{{Line: 718, Value: "$pkg.$err = $x"}}, + Line: 724, + SyntaxPatterns: []ir.PatternString{{Line: 724, Value: "$pkg.$err = $x"}}, ReportTemplate: "suspicious reassignment of error from another package", WhereExpr: ir.FilterExpr{ - Line: 719, + Line: 725, Op: ir.FilterAndOp, Src: "m[\"err\"].Type.Is(`error`) && m[\"pkg\"].Object.Is(`PkgName`)", Args: []ir.FilterExpr{ { - Line: 719, + Line: 725, Op: ir.FilterVarTypeIsOp, Src: "m[\"err\"].Type.Is(`error`)", Value: "err", - Args: []ir.FilterExpr{{Line: 719, Op: ir.FilterStringOp, Src: "`error`", Value: "error"}}, + Args: []ir.FilterExpr{{Line: 725, Op: ir.FilterStringOp, Src: "`error`", Value: "error"}}, }, { - Line: 719, + Line: 725, Op: ir.FilterVarObjectIsOp, Src: "m[\"pkg\"].Object.Is(`PkgName`)", Value: "pkg", - Args: []ir.FilterExpr{{Line: 719, Op: ir.FilterStringOp, Src: "`PkgName`", Value: "PkgName"}}, + Args: []ir.FilterExpr{{Line: 725, Op: ir.FilterStringOp, Src: "`PkgName`", Value: "PkgName"}}, }, }, }, }}, }, { - Line: 727, + Line: 733, Name: "emptyDecl", MatcherName: "m", DocTags: []string{"diagnostic", "experimental"}, @@ -2346,24 +2360,24 @@ var PrecompiledRules = &ir.File{ DocAfter: "/* nothing */", Rules: []ir.Rule{ { - Line: 728, - SyntaxPatterns: []ir.PatternString{{Line: 728, Value: "var()"}}, + Line: 734, + SyntaxPatterns: []ir.PatternString{{Line: 734, Value: "var()"}}, ReportTemplate: "empty var() block", }, { - Line: 729, - SyntaxPatterns: []ir.PatternString{{Line: 729, Value: "const()"}}, + Line: 735, + SyntaxPatterns: []ir.PatternString{{Line: 735, Value: "const()"}}, ReportTemplate: "empty const() block", }, { - Line: 730, - SyntaxPatterns: []ir.PatternString{{Line: 730, Value: "type()"}}, + Line: 736, + SyntaxPatterns: []ir.PatternString{{Line: 736, Value: "type()"}}, ReportTemplate: "empty type() block", }, }, }, { - Line: 737, + Line: 743, Name: "dynamicFmtString", MatcherName: "m", DocTags: []string{"diagnostic", "experimental"}, @@ -2372,16 +2386,16 @@ var PrecompiledRules = &ir.File{ DocAfter: "errors.New(msg) or fmt.Errorf(\"%s\", msg)", Rules: []ir.Rule{ { - Line: 738, - SyntaxPatterns: []ir.PatternString{{Line: 738, Value: "fmt.Errorf($f)"}}, + Line: 744, + SyntaxPatterns: []ir.PatternString{{Line: 744, Value: "fmt.Errorf($f)"}}, ReportTemplate: "use errors.New($f) or fmt.Errorf(\"%s\", $f) instead", SuggestTemplate: "errors.New($f)", WhereExpr: ir.FilterExpr{ - Line: 739, + Line: 745, Op: ir.FilterNotOp, Src: "!m[\"f\"].Const", Args: []ir.FilterExpr{{ - Line: 739, + Line: 745, Op: ir.FilterVarConstOp, Src: "m[\"f\"].Const", Value: "f", @@ -2389,15 +2403,15 @@ var PrecompiledRules = &ir.File{ }, }, { - Line: 743, - SyntaxPatterns: []ir.PatternString{{Line: 743, Value: "fmt.Errorf($f($*args))"}}, + Line: 749, + SyntaxPatterns: []ir.PatternString{{Line: 749, Value: "fmt.Errorf($f($*args))"}}, ReportTemplate: "use errors.New($f($*args)) or fmt.Errorf(\"%s\", $f($*args)) instead", SuggestTemplate: "errors.New($f($*args))", }, }, }, { - Line: 752, + Line: 758, Name: "stringsCompare", MatcherName: "m", DocTags: []string{"style", "experimental"}, @@ -2406,25 +2420,25 @@ var PrecompiledRules = &ir.File{ DocAfter: "x < y", Rules: []ir.Rule{ { - Line: 753, - SyntaxPatterns: []ir.PatternString{{Line: 753, Value: "strings.Compare($s1, $s2) == 0"}}, + Line: 759, + SyntaxPatterns: []ir.PatternString{{Line: 759, Value: "strings.Compare($s1, $s2) == 0"}}, ReportTemplate: "suggestion: $s1 == $s2", SuggestTemplate: "$s1 == $s2", }, { - Line: 756, + Line: 762, SyntaxPatterns: []ir.PatternString{ - {Line: 756, Value: "strings.Compare($s1, $s2) == -1"}, - {Line: 757, Value: "strings.Compare($s1, $s2) < 0"}, + {Line: 762, Value: "strings.Compare($s1, $s2) == -1"}, + {Line: 763, Value: "strings.Compare($s1, $s2) < 0"}, }, ReportTemplate: "suggestion: $s1 < $s2", SuggestTemplate: "$s1 < $s2", }, { - Line: 760, + Line: 766, SyntaxPatterns: []ir.PatternString{ - {Line: 760, Value: "strings.Compare($s1, $s2) == 1"}, - {Line: 761, Value: "strings.Compare($s1, $s2) > 0"}, + {Line: 766, Value: "strings.Compare($s1, $s2) == 1"}, + {Line: 767, Value: "strings.Compare($s1, $s2) > 0"}, }, ReportTemplate: "suggestion: $s1 > $s2", SuggestTemplate: "$s1 > $s2", @@ -2432,7 +2446,7 @@ var PrecompiledRules = &ir.File{ }, }, { - Line: 769, + Line: 775, Name: "uncheckedInlineErr", MatcherName: "m", DocTags: []string{"diagnostic", "experimental"}, @@ -2440,47 +2454,47 @@ var PrecompiledRules = &ir.File{ DocBefore: "if err := expr(); err2 != nil { /*...*/ }", DocAfter: "if err := expr(); err != nil { /*...*/ }", Rules: []ir.Rule{{ - Line: 770, + Line: 776, SyntaxPatterns: []ir.PatternString{ - {Line: 771, Value: "if $err := $_($*_); $err2 != nil { $*_ }"}, - {Line: 772, Value: "if $err = $_($*_); $err2 != nil { $*_ }"}, - {Line: 773, Value: "if $*_, $err := $_($*_); $err2 != nil { $*_ }"}, - {Line: 774, Value: "if $*_, $err = $_($*_); $err2 != nil { $*_ }"}, + {Line: 777, Value: "if $err := $_($*_); $err2 != nil { $*_ }"}, + {Line: 778, Value: "if $err = $_($*_); $err2 != nil { $*_ }"}, + {Line: 779, Value: "if $*_, $err := $_($*_); $err2 != nil { $*_ }"}, + {Line: 780, Value: "if $*_, $err = $_($*_); $err2 != nil { $*_ }"}, }, ReportTemplate: "$err error is unchecked, maybe intended to check it instead of $err2", WhereExpr: ir.FilterExpr{ - Line: 775, + Line: 781, Op: ir.FilterAndOp, Src: "m[\"err\"].Type.Implements(\"error\") && m[\"err2\"].Type.Implements(\"error\") &&\n\tm[\"err\"].Text != m[\"err2\"].Text", Args: []ir.FilterExpr{ { - Line: 775, + Line: 781, Op: ir.FilterAndOp, Src: "m[\"err\"].Type.Implements(\"error\") && m[\"err2\"].Type.Implements(\"error\")", Args: []ir.FilterExpr{ { - Line: 775, + Line: 781, Op: ir.FilterVarTypeImplementsOp, Src: "m[\"err\"].Type.Implements(\"error\")", Value: "err", - Args: []ir.FilterExpr{{Line: 775, Op: ir.FilterStringOp, Src: "\"error\"", Value: "error"}}, + Args: []ir.FilterExpr{{Line: 781, Op: ir.FilterStringOp, Src: "\"error\"", Value: "error"}}, }, { - Line: 775, + Line: 781, Op: ir.FilterVarTypeImplementsOp, Src: "m[\"err2\"].Type.Implements(\"error\")", Value: "err2", - Args: []ir.FilterExpr{{Line: 775, Op: ir.FilterStringOp, Src: "\"error\"", Value: "error"}}, + Args: []ir.FilterExpr{{Line: 781, Op: ir.FilterStringOp, Src: "\"error\"", Value: "error"}}, }, }, }, { - Line: 776, + Line: 782, Op: ir.FilterNeqOp, Src: "m[\"err\"].Text != m[\"err2\"].Text", Args: []ir.FilterExpr{ - {Line: 776, Op: ir.FilterVarTextOp, Src: "m[\"err\"].Text", Value: "err"}, - {Line: 776, Op: ir.FilterVarTextOp, Src: "m[\"err2\"].Text", Value: "err2"}, + {Line: 782, Op: ir.FilterVarTextOp, Src: "m[\"err\"].Text", Value: "err"}, + {Line: 782, Op: ir.FilterVarTextOp, Src: "m[\"err2\"].Text", Value: "err2"}, }, }, }, @@ -2489,7 +2503,7 @@ var PrecompiledRules = &ir.File{ }}, }, { - Line: 785, + Line: 791, Name: "badSyncOnceFunc", MatcherName: "m", DocTags: []string{"diagnostic", "experimental"}, @@ -2498,22 +2512,22 @@ var PrecompiledRules = &ir.File{ DocAfter: "fooOnce := sync.OnceFunc(foo); ...; fooOnce()", Rules: []ir.Rule{ { - Line: 786, - SyntaxPatterns: []ir.PatternString{{Line: 786, Value: "$*_; sync.OnceFunc($x); $*_;"}}, + Line: 792, + SyntaxPatterns: []ir.PatternString{{Line: 792, Value: "$*_; sync.OnceFunc($x); $*_;"}}, ReportTemplate: "possible sync.OnceFunc misuse, sync.OnceFunc($x) result is not used", WhereExpr: ir.FilterExpr{ - Line: 788, + Line: 794, Op: ir.FilterGoVersionGreaterEqThanOp, Src: "m.GoVersion().GreaterEqThan(\"1.21\")", Value: "1.21", }, }, { - Line: 790, - SyntaxPatterns: []ir.PatternString{{Line: 790, Value: "sync.OnceFunc($x)()"}}, + Line: 796, + SyntaxPatterns: []ir.PatternString{{Line: 796, Value: "sync.OnceFunc($x)()"}}, ReportTemplate: "possible sync.OnceFunc misuse, consider to assign sync.OnceFunc($x) to a variable", WhereExpr: ir.FilterExpr{ - Line: 792, + Line: 798, Op: ir.FilterGoVersionGreaterEqThanOp, Src: "m.GoVersion().GreaterEqThan(\"1.21\")", Value: "1.21", @@ -2522,7 +2536,7 @@ var PrecompiledRules = &ir.File{ }, }, { - Line: 799, + Line: 805, Name: "zeroByteRepeat", MatcherName: "m", DocTags: []string{"performance"}, @@ -2531,40 +2545,40 @@ var PrecompiledRules = &ir.File{ DocAfter: "make([]byte, x)", Rules: []ir.Rule{ { - Line: 800, - SyntaxPatterns: []ir.PatternString{{Line: 800, Value: "bytes.Repeat([]byte{0}, $x)"}}, + Line: 806, + SyntaxPatterns: []ir.PatternString{{Line: 806, Value: "bytes.Repeat([]byte{0}, $x)"}}, ReportTemplate: "avoid bytes.Repeat([]byte{0}, $x); consider using make([]byte, $x) instead", SuggestTemplate: "make([]byte, $x)", }, { - Line: 805, - SyntaxPatterns: []ir.PatternString{{Line: 805, Value: "bytes.Repeat([]byte{$x}, $n)"}}, + Line: 811, + SyntaxPatterns: []ir.PatternString{{Line: 811, Value: "bytes.Repeat([]byte{$x}, $n)"}}, ReportTemplate: "avoid bytes.Repeat with a const 0; use make([]byte, $n) instead", SuggestTemplate: "make([]byte, $n)", WhereExpr: ir.FilterExpr{ - Line: 806, + Line: 812, Op: ir.FilterAndOp, Src: "m[\"x\"].Const && m[\"x\"].Value.Int() == 0", Args: []ir.FilterExpr{ { - Line: 806, + Line: 812, Op: ir.FilterVarConstOp, Src: "m[\"x\"].Const", Value: "x", }, { - Line: 806, + Line: 812, Op: ir.FilterEqOp, Src: "m[\"x\"].Value.Int() == 0", Args: []ir.FilterExpr{ { - Line: 806, + Line: 812, Op: ir.FilterVarValueIntOp, Src: "m[\"x\"].Value.Int()", Value: "x", }, { - Line: 806, + Line: 812, Op: ir.FilterIntOp, Src: "0", Value: int64(0), diff --git a/vendor/github.com/go-critic/go-critic/checkers/sortSlice_checker.go b/vendor/github.com/go-critic/go-critic/checkers/sortSlice_checker.go index 22ef3b16..f04ea2c6 100644 --- a/vendor/github.com/go-critic/go-critic/checkers/sortSlice_checker.go +++ b/vendor/github.com/go-critic/go-critic/checkers/sortSlice_checker.go @@ -11,7 +11,6 @@ import ( "github.com/go-toolsmith/astcast" "github.com/go-toolsmith/astequal" "github.com/go-toolsmith/typep" - "golang.org/x/tools/go/ast/astutil" ) func init() { @@ -65,7 +64,7 @@ func (c *sortSliceChecker) VisitExpr(expr ast.Expr) { if !ok { return } - cmp := astcast.ToBinaryExpr(astutil.Unparen(ret.Results[0])) + cmp := astcast.ToBinaryExpr(ast.Unparen(ret.Results[0])) if !typep.SideEffectFree(c.ctx.TypesInfo, cmp) { return } diff --git a/vendor/github.com/go-critic/go-critic/checkers/weakCond_checker.go b/vendor/github.com/go-critic/go-critic/checkers/weakCond_checker.go index 3d7c9c12..921a45db 100644 --- a/vendor/github.com/go-critic/go-critic/checkers/weakCond_checker.go +++ b/vendor/github.com/go-critic/go-critic/checkers/weakCond_checker.go @@ -11,7 +11,6 @@ import ( "github.com/go-toolsmith/astcast" "github.com/go-toolsmith/astequal" "github.com/go-toolsmith/typep" - "golang.org/x/tools/go/ast/astutil" ) func init() { @@ -37,8 +36,8 @@ func (c *weakCondChecker) VisitExpr(expr ast.Expr) { // TODO(Quasilyte): analyze and fix false positives. cond := astcast.ToBinaryExpr(expr) - lhs := astcast.ToBinaryExpr(astutil.Unparen(cond.X)) - rhs := astutil.Unparen(cond.Y) + lhs := astcast.ToBinaryExpr(ast.Unparen(cond.X)) + rhs := ast.Unparen(cond.Y) // Pattern 1. // `x != nil && usageOf(x[i])` diff --git a/vendor/github.com/go-critic/go-critic/linter/go_version.go b/vendor/github.com/go-critic/go-critic/linter/go_version.go index b5ef2f75..a7393ef8 100644 --- a/vendor/github.com/go-critic/go-critic/linter/go_version.go +++ b/vendor/github.com/go-critic/go-critic/linter/go_version.go @@ -18,10 +18,10 @@ type GoVersion struct { // // As a special case, Major=0 covers all versions. func (v GoVersion) GreaterOrEqual(other GoVersion) bool { - switch { - case v.Major == 0: + switch v.Major { + case 0: return true - case v.Major == other.Major: + case other.Major: return v.Minor >= other.Minor default: return v.Major >= other.Major diff --git a/vendor/github.com/godoc-lint/godoc-lint/pkg/check/deprecated/deprecated.go b/vendor/github.com/godoc-lint/godoc-lint/pkg/check/deprecated/deprecated.go index 08915f6c..fa8e646b 100644 --- a/vendor/github.com/godoc-lint/godoc-lint/pkg/check/deprecated/deprecated.go +++ b/vendor/github.com/godoc-lint/godoc-lint/pkg/check/deprecated/deprecated.go @@ -99,7 +99,7 @@ func checkDeprecations(actx *model.AnalysisContext, doc *model.CommentGroup) { if !ok || len(par.Text) == 0 { continue } - text, ok := (par.Text[0]).(comment.Plain) + text, ok := par.Text[0].(comment.Plain) if !ok { continue } diff --git a/vendor/github.com/godoc-lint/godoc-lint/pkg/check/shared/deprecated.go b/vendor/github.com/godoc-lint/godoc-lint/pkg/check/shared/deprecated.go index 8ebed0e2..b7d47192 100644 --- a/vendor/github.com/godoc-lint/godoc-lint/pkg/check/shared/deprecated.go +++ b/vendor/github.com/godoc-lint/godoc-lint/pkg/check/shared/deprecated.go @@ -14,7 +14,7 @@ func HasDeprecatedParagraph(blocks []comment.Block) bool { if !ok || len(par.Text) == 0 { continue } - text, ok := (par.Text[0]).(comment.Plain) + text, ok := par.Text[0].(comment.Plain) if !ok { continue } diff --git a/vendor/github.com/godoc-lint/godoc-lint/pkg/check/start_with_name/start_with_name.go b/vendor/github.com/godoc-lint/godoc-lint/pkg/check/start_with_name/start_with_name.go index 70301709..b80e7602 100644 --- a/vendor/github.com/godoc-lint/godoc-lint/pkg/check/start_with_name/start_with_name.go +++ b/vendor/github.com/godoc-lint/godoc-lint/pkg/check/start_with_name/start_with_name.go @@ -123,7 +123,7 @@ var ( ) func matchSymbolName(text, symbol string) bool { - head := strings.SplitN(text, "\n", 2)[0] + head, _, _ := strings.Cut(text, "\n") head, _ = strings.CutPrefix(head, "\r") head = strings.SplitN(head, " ", 2)[0] head = strings.SplitN(head, "\t", 2)[0] diff --git a/vendor/github.com/godoc-lint/godoc-lint/pkg/check/stdlib_doclink/stdlib.json b/vendor/github.com/godoc-lint/godoc-lint/pkg/check/stdlib_doclink/stdlib.json index cbf8206d..6c914204 100644 --- a/vendor/github.com/godoc-lint/godoc-lint/pkg/check/stdlib_doclink/stdlib.json +++ b/vendor/github.com/godoc-lint/godoc-lint/pkg/check/stdlib_doclink/stdlib.json @@ -1 +1 @@ -{"archive/tar":{"path":"archive/tar","name":"tar","symbols":{"ErrFieldTooLong":"v","ErrHeader":"v","ErrInsecurePath":"v","ErrWriteAfterClose":"v","ErrWriteTooLong":"v","FileInfoHeader":"f","FileInfoNames":"t","Format":"t","Format.String":"m","FormatGNU":"c","FormatPAX":"c","FormatUSTAR":"c","FormatUnknown":"c","Header":"t","Header.FileInfo":"m","NewReader":"f","NewWriter":"f","Reader":"t","Reader.Next":"m","Reader.Read":"m","TypeBlock":"c","TypeChar":"c","TypeCont":"c","TypeDir":"c","TypeFifo":"c","TypeGNULongLink":"c","TypeGNULongName":"c","TypeGNUSparse":"c","TypeLink":"c","TypeReg":"c","TypeRegA":"c","TypeSymlink":"c","TypeXGlobalHeader":"c","TypeXHeader":"c","Writer":"t","Writer.AddFS":"m","Writer.Close":"m","Writer.Flush":"m","Writer.Write":"m","Writer.WriteHeader":"m"}},"archive/zip":{"path":"archive/zip","name":"zip","symbols":{"Compressor":"t","Decompressor":"t","Deflate":"c","ErrAlgorithm":"v","ErrChecksum":"v","ErrFormat":"v","ErrInsecurePath":"v","File":"t","File.DataOffset":"m","File.Open":"m","File.OpenRaw":"m","FileHeader":"t","FileHeader.FileInfo":"m","FileHeader.ModTime":"m","FileHeader.Mode":"m","FileHeader.SetModTime":"m","FileHeader.SetMode":"m","FileInfoHeader":"f","NewReader":"f","NewWriter":"f","OpenReader":"f","ReadCloser":"t","ReadCloser.Close":"m","Reader":"t","Reader.Open":"m","Reader.RegisterDecompressor":"m","RegisterCompressor":"f","RegisterDecompressor":"f","Store":"c","Writer":"t","Writer.AddFS":"m","Writer.Close":"m","Writer.Copy":"m","Writer.Create":"m","Writer.CreateHeader":"m","Writer.CreateRaw":"m","Writer.Flush":"m","Writer.RegisterCompressor":"m","Writer.SetComment":"m","Writer.SetOffset":"m"}},"bufio":{"path":"bufio","name":"bufio","symbols":{"ErrAdvanceTooFar":"v","ErrBadReadCount":"v","ErrBufferFull":"v","ErrFinalToken":"v","ErrInvalidUnreadByte":"v","ErrInvalidUnreadRune":"v","ErrNegativeAdvance":"v","ErrNegativeCount":"v","ErrTooLong":"v","MaxScanTokenSize":"c","NewReadWriter":"f","NewReader":"f","NewReaderSize":"f","NewScanner":"f","NewWriter":"f","NewWriterSize":"f","ReadWriter":"t","Reader":"t","Reader.Buffered":"m","Reader.Discard":"m","Reader.Peek":"m","Reader.Read":"m","Reader.ReadByte":"m","Reader.ReadBytes":"m","Reader.ReadLine":"m","Reader.ReadRune":"m","Reader.ReadSlice":"m","Reader.ReadString":"m","Reader.Reset":"m","Reader.Size":"m","Reader.UnreadByte":"m","Reader.UnreadRune":"m","Reader.WriteTo":"m","ScanBytes":"f","ScanLines":"f","ScanRunes":"f","ScanWords":"f","Scanner":"t","Scanner.Buffer":"m","Scanner.Bytes":"m","Scanner.Err":"m","Scanner.Scan":"m","Scanner.Split":"m","Scanner.Text":"m","SplitFunc":"t","Writer":"t","Writer.Available":"m","Writer.AvailableBuffer":"m","Writer.Buffered":"m","Writer.Flush":"m","Writer.ReadFrom":"m","Writer.Reset":"m","Writer.Size":"m","Writer.Write":"m","Writer.WriteByte":"m","Writer.WriteRune":"m","Writer.WriteString":"m"}},"builtin":{"path":"builtin","name":"builtin","symbols":{"ComplexType":"t","FloatType":"t","IntegerType":"t","Type":"t","Type1":"t"}},"bytes":{"path":"bytes","name":"bytes","symbols":{"Buffer":"t","Buffer.Available":"m","Buffer.AvailableBuffer":"m","Buffer.Bytes":"m","Buffer.Cap":"m","Buffer.Grow":"m","Buffer.Len":"m","Buffer.Next":"m","Buffer.Peek":"m","Buffer.Read":"m","Buffer.ReadByte":"m","Buffer.ReadBytes":"m","Buffer.ReadFrom":"m","Buffer.ReadRune":"m","Buffer.ReadString":"m","Buffer.Reset":"m","Buffer.String":"m","Buffer.Truncate":"m","Buffer.UnreadByte":"m","Buffer.UnreadRune":"m","Buffer.Write":"m","Buffer.WriteByte":"m","Buffer.WriteRune":"m","Buffer.WriteString":"m","Buffer.WriteTo":"m","Clone":"f","Compare":"f","Contains":"f","ContainsAny":"f","ContainsFunc":"f","ContainsRune":"f","Count":"f","Cut":"f","CutPrefix":"f","CutSuffix":"f","Equal":"f","EqualFold":"f","ErrTooLarge":"v","Fields":"f","FieldsFunc":"f","FieldsFuncSeq":"f","FieldsSeq":"f","HasPrefix":"f","HasSuffix":"f","Index":"f","IndexAny":"f","IndexByte":"f","IndexFunc":"f","IndexRune":"f","Join":"f","LastIndex":"f","LastIndexAny":"f","LastIndexByte":"f","LastIndexFunc":"f","Lines":"f","Map":"f","MinRead":"c","NewBuffer":"f","NewBufferString":"f","NewReader":"f","Reader":"t","Reader.Len":"m","Reader.Read":"m","Reader.ReadAt":"m","Reader.ReadByte":"m","Reader.ReadRune":"m","Reader.Reset":"m","Reader.Seek":"m","Reader.Size":"m","Reader.UnreadByte":"m","Reader.UnreadRune":"m","Reader.WriteTo":"m","Repeat":"f","Replace":"f","ReplaceAll":"f","Runes":"f","Split":"f","SplitAfter":"f","SplitAfterN":"f","SplitAfterSeq":"f","SplitN":"f","SplitSeq":"f","Title":"f","ToLower":"f","ToLowerSpecial":"f","ToTitle":"f","ToTitleSpecial":"f","ToUpper":"f","ToUpperSpecial":"f","ToValidUTF8":"f","Trim":"f","TrimFunc":"f","TrimLeft":"f","TrimLeftFunc":"f","TrimPrefix":"f","TrimRight":"f","TrimRightFunc":"f","TrimSpace":"f","TrimSuffix":"f"}},"cmp":{"path":"cmp","name":"cmp","symbols":{"Compare":"f","Less":"f","Or":"f","Ordered":"t"}},"compress/bzip2":{"path":"compress/bzip2","name":"bzip2","symbols":{"NewReader":"f","StructuralError":"t","StructuralError.Error":"m"}},"compress/flate":{"path":"compress/flate","name":"flate","symbols":{"BestCompression":"c","BestSpeed":"c","CorruptInputError":"t","CorruptInputError.Error":"m","DefaultCompression":"c","HuffmanOnly":"c","InternalError":"t","InternalError.Error":"m","NewReader":"f","NewReaderDict":"f","NewWriter":"f","NewWriterDict":"f","NoCompression":"c","ReadError":"t","ReadError.Error":"m","Reader":"t","Resetter":"t","WriteError":"t","WriteError.Error":"m","Writer":"t","Writer.Close":"m","Writer.Flush":"m","Writer.Reset":"m","Writer.Write":"m"}},"compress/gzip":{"path":"compress/gzip","name":"gzip","symbols":{"BestCompression":"c","BestSpeed":"c","DefaultCompression":"c","ErrChecksum":"v","ErrHeader":"v","Header":"t","HuffmanOnly":"c","NewReader":"f","NewWriter":"f","NewWriterLevel":"f","NoCompression":"c","Reader":"t","Reader.Close":"m","Reader.Multistream":"m","Reader.Read":"m","Reader.Reset":"m","Writer":"t","Writer.Close":"m","Writer.Flush":"m","Writer.Reset":"m","Writer.Write":"m"}},"compress/lzw":{"path":"compress/lzw","name":"lzw","symbols":{"LSB":"c","MSB":"c","NewReader":"f","NewWriter":"f","Order":"t","Reader":"t","Reader.Close":"m","Reader.Read":"m","Reader.Reset":"m","Writer":"t","Writer.Close":"m","Writer.Reset":"m","Writer.Write":"m"}},"compress/zlib":{"path":"compress/zlib","name":"zlib","symbols":{"BestCompression":"c","BestSpeed":"c","DefaultCompression":"c","ErrChecksum":"v","ErrDictionary":"v","ErrHeader":"v","HuffmanOnly":"c","NewReader":"f","NewReaderDict":"f","NewWriter":"f","NewWriterLevel":"f","NewWriterLevelDict":"f","NoCompression":"c","Resetter":"t","Writer":"t","Writer.Close":"m","Writer.Flush":"m","Writer.Reset":"m","Writer.Write":"m"}},"container/heap":{"path":"container/heap","name":"heap","symbols":{"Fix":"f","Init":"f","Interface":"t","Pop":"f","Push":"f","Remove":"f"}},"container/list":{"path":"container/list","name":"list","symbols":{"Element":"t","Element.Next":"m","Element.Prev":"m","List":"t","List.Back":"m","List.Front":"m","List.Init":"m","List.InsertAfter":"m","List.InsertBefore":"m","List.Len":"m","List.MoveAfter":"m","List.MoveBefore":"m","List.MoveToBack":"m","List.MoveToFront":"m","List.PushBack":"m","List.PushBackList":"m","List.PushFront":"m","List.PushFrontList":"m","List.Remove":"m","New":"f"}},"container/ring":{"path":"container/ring","name":"ring","symbols":{"New":"f","Ring":"t","Ring.Do":"m","Ring.Len":"m","Ring.Link":"m","Ring.Move":"m","Ring.Next":"m","Ring.Prev":"m","Ring.Unlink":"m"}},"context":{"path":"context","name":"context","symbols":{"AfterFunc":"f","Background":"f","CancelCauseFunc":"t","CancelFunc":"t","Canceled":"v","Cause":"f","Context":"t","DeadlineExceeded":"v","TODO":"f","WithCancel":"f","WithCancelCause":"f","WithDeadline":"f","WithDeadlineCause":"f","WithTimeout":"f","WithTimeoutCause":"f","WithValue":"f","WithoutCancel":"f"}},"crypto":{"path":"crypto","name":"crypto","symbols":{"BLAKE2b_256":"c","BLAKE2b_384":"c","BLAKE2b_512":"c","BLAKE2s_256":"c","Decapsulator":"t","Decrypter":"t","DecrypterOpts":"t","Encapsulator":"t","Hash":"t","Hash.Available":"m","Hash.HashFunc":"m","Hash.New":"m","Hash.Size":"m","Hash.String":"m","MD4":"c","MD5":"c","MD5SHA1":"c","MessageSigner":"t","PrivateKey":"t","PublicKey":"t","RIPEMD160":"c","RegisterHash":"f","SHA1":"c","SHA224":"c","SHA256":"c","SHA384":"c","SHA3_224":"c","SHA3_256":"c","SHA3_384":"c","SHA3_512":"c","SHA512":"c","SHA512_224":"c","SHA512_256":"c","SignMessage":"f","Signer":"t","SignerOpts":"t"}},"crypto/aes":{"path":"crypto/aes","name":"aes","symbols":{"BlockSize":"c","KeySizeError":"t","KeySizeError.Error":"m","NewCipher":"f"}},"crypto/cipher":{"path":"crypto/cipher","name":"cipher","symbols":{"AEAD":"t","Block":"t","BlockMode":"t","NewCBCDecrypter":"f","NewCBCEncrypter":"f","NewCFBDecrypter":"f","NewCFBEncrypter":"f","NewCTR":"f","NewGCM":"f","NewGCMWithNonceSize":"f","NewGCMWithRandomNonce":"f","NewGCMWithTagSize":"f","NewOFB":"f","Stream":"t","StreamReader":"t","StreamReader.Read":"m","StreamWriter":"t","StreamWriter.Close":"m","StreamWriter.Write":"m"}},"crypto/des":{"path":"crypto/des","name":"des","symbols":{"BlockSize":"c","KeySizeError":"t","KeySizeError.Error":"m","NewCipher":"f","NewTripleDESCipher":"f"}},"crypto/dsa":{"path":"crypto/dsa","name":"dsa","symbols":{"ErrInvalidPublicKey":"v","GenerateKey":"f","GenerateParameters":"f","L1024N160":"c","L2048N224":"c","L2048N256":"c","L3072N256":"c","ParameterSizes":"t","Parameters":"t","PrivateKey":"t","PublicKey":"t","Sign":"f","Verify":"f"}},"crypto/ecdh":{"path":"crypto/ecdh","name":"ecdh","symbols":{"Curve":"t","KeyExchanger":"t","P256":"f","P384":"f","P521":"f","PrivateKey":"t","PrivateKey.Bytes":"m","PrivateKey.Curve":"m","PrivateKey.ECDH":"m","PrivateKey.Equal":"m","PrivateKey.Public":"m","PrivateKey.PublicKey":"m","PublicKey":"t","PublicKey.Bytes":"m","PublicKey.Curve":"m","PublicKey.Equal":"m","X25519":"f"}},"crypto/ecdsa":{"path":"crypto/ecdsa","name":"ecdsa","symbols":{"GenerateKey":"f","ParseRawPrivateKey":"f","ParseUncompressedPublicKey":"f","PrivateKey":"t","PrivateKey.Bytes":"m","PrivateKey.ECDH":"m","PrivateKey.Equal":"m","PrivateKey.Public":"m","PrivateKey.Sign":"m","PublicKey":"t","PublicKey.Bytes":"m","PublicKey.ECDH":"m","PublicKey.Equal":"m","Sign":"f","SignASN1":"f","Verify":"f","VerifyASN1":"f"}},"crypto/ed25519":{"path":"crypto/ed25519","name":"ed25519","symbols":{"GenerateKey":"f","NewKeyFromSeed":"f","Options":"t","Options.HashFunc":"m","PrivateKey":"t","PrivateKey.Equal":"m","PrivateKey.Public":"m","PrivateKey.Seed":"m","PrivateKey.Sign":"m","PrivateKeySize":"c","PublicKey":"t","PublicKey.Equal":"m","PublicKeySize":"c","SeedSize":"c","Sign":"f","SignatureSize":"c","Verify":"f","VerifyWithOptions":"f"}},"crypto/elliptic":{"path":"crypto/elliptic","name":"elliptic","symbols":{"Curve":"t","CurveParams":"t","CurveParams.Add":"m","CurveParams.Double":"m","CurveParams.IsOnCurve":"m","CurveParams.Params":"m","CurveParams.ScalarBaseMult":"m","CurveParams.ScalarMult":"m","GenerateKey":"f","Marshal":"f","MarshalCompressed":"f","P224":"f","P256":"f","P384":"f","P521":"f","Unmarshal":"f","UnmarshalCompressed":"f"}},"crypto/fips140":{"path":"crypto/fips140","name":"fips140","symbols":{"Enabled":"f","Enforced":"f","Version":"f","WithoutEnforcement":"f"}},"crypto/hkdf":{"path":"crypto/hkdf","name":"hkdf","symbols":{"Expand":"f","Extract":"f","Key":"f"}},"crypto/hmac":{"path":"crypto/hmac","name":"hmac","symbols":{"Equal":"f","New":"f"}},"crypto/hpke":{"path":"crypto/hpke","name":"hpke","symbols":{"AEAD":"t","AES128GCM":"f","AES256GCM":"f","ChaCha20Poly1305":"f","DHKEM":"f","ExportOnly":"f","HKDFSHA256":"f","HKDFSHA384":"f","HKDFSHA512":"f","KDF":"t","KEM":"t","MLKEM1024":"f","MLKEM1024P384":"f","MLKEM768":"f","MLKEM768P256":"f","MLKEM768X25519":"f","NewAEAD":"f","NewDHKEMPrivateKey":"f","NewDHKEMPublicKey":"f","NewHybridPrivateKey":"f","NewHybridPublicKey":"f","NewKDF":"f","NewKEM":"f","NewMLKEMPrivateKey":"f","NewMLKEMPublicKey":"f","NewRecipient":"f","NewSender":"f","Open":"f","PrivateKey":"t","PublicKey":"t","Recipient":"t","Recipient.Export":"m","Recipient.Open":"m","SHAKE128":"f","SHAKE256":"f","Seal":"f","Sender":"t","Sender.Export":"m","Sender.Seal":"m"}},"crypto/md5":{"path":"crypto/md5","name":"md5","symbols":{"BlockSize":"c","New":"f","Size":"c","Sum":"f"}},"crypto/mlkem":{"path":"crypto/mlkem","name":"mlkem","symbols":{"CiphertextSize1024":"c","CiphertextSize768":"c","DecapsulationKey1024":"t","DecapsulationKey1024.Bytes":"m","DecapsulationKey1024.Decapsulate":"m","DecapsulationKey1024.EncapsulationKey":"m","DecapsulationKey1024.Encapsulator":"m","DecapsulationKey768":"t","DecapsulationKey768.Bytes":"m","DecapsulationKey768.Decapsulate":"m","DecapsulationKey768.EncapsulationKey":"m","DecapsulationKey768.Encapsulator":"m","EncapsulationKey1024":"t","EncapsulationKey1024.Bytes":"m","EncapsulationKey1024.Encapsulate":"m","EncapsulationKey768":"t","EncapsulationKey768.Bytes":"m","EncapsulationKey768.Encapsulate":"m","EncapsulationKeySize1024":"c","EncapsulationKeySize768":"c","GenerateKey1024":"f","GenerateKey768":"f","NewDecapsulationKey1024":"f","NewDecapsulationKey768":"f","NewEncapsulationKey1024":"f","NewEncapsulationKey768":"f","SeedSize":"c","SharedKeySize":"c"}},"crypto/mlkem/mlkemtest":{"path":"crypto/mlkem/mlkemtest","name":"mlkemtest","symbols":{"Encapsulate1024":"f","Encapsulate768":"f"}},"crypto/pbkdf2":{"path":"crypto/pbkdf2","name":"pbkdf2","symbols":{"Key":"f"}},"crypto/rand":{"path":"crypto/rand","name":"rand","symbols":{"Int":"f","Prime":"f","Read":"f","Reader":"v","Text":"f"}},"crypto/rc4":{"path":"crypto/rc4","name":"rc4","symbols":{"Cipher":"t","Cipher.Reset":"m","Cipher.XORKeyStream":"m","KeySizeError":"t","KeySizeError.Error":"m","NewCipher":"f"}},"crypto/rsa":{"path":"crypto/rsa","name":"rsa","symbols":{"CRTValue":"t","DecryptOAEP":"f","DecryptPKCS1v15":"f","DecryptPKCS1v15SessionKey":"f","EncryptOAEP":"f","EncryptOAEPWithOptions":"f","EncryptPKCS1v15":"f","ErrDecryption":"v","ErrMessageTooLong":"v","ErrVerification":"v","GenerateKey":"f","GenerateMultiPrimeKey":"f","OAEPOptions":"t","PKCS1v15DecryptOptions":"t","PSSOptions":"t","PSSOptions.HashFunc":"m","PSSSaltLengthAuto":"c","PSSSaltLengthEqualsHash":"c","PrecomputedValues":"t","PrivateKey":"t","PrivateKey.Decrypt":"m","PrivateKey.Equal":"m","PrivateKey.Precompute":"m","PrivateKey.Public":"m","PrivateKey.Sign":"m","PrivateKey.Validate":"m","PublicKey":"t","PublicKey.Equal":"m","PublicKey.Size":"m","SignPKCS1v15":"f","SignPSS":"f","VerifyPKCS1v15":"f","VerifyPSS":"f"}},"crypto/sha1":{"path":"crypto/sha1","name":"sha1","symbols":{"BlockSize":"c","New":"f","Size":"c","Sum":"f"}},"crypto/sha256":{"path":"crypto/sha256","name":"sha256","symbols":{"BlockSize":"c","New":"f","New224":"f","Size":"c","Size224":"c","Sum224":"f","Sum256":"f"}},"crypto/sha3":{"path":"crypto/sha3","name":"sha3","symbols":{"New224":"f","New256":"f","New384":"f","New512":"f","NewCSHAKE128":"f","NewCSHAKE256":"f","NewSHAKE128":"f","NewSHAKE256":"f","SHA3":"t","SHA3.AppendBinary":"m","SHA3.BlockSize":"m","SHA3.Clone":"m","SHA3.MarshalBinary":"m","SHA3.Reset":"m","SHA3.Size":"m","SHA3.Sum":"m","SHA3.UnmarshalBinary":"m","SHA3.Write":"m","SHAKE":"t","SHAKE.AppendBinary":"m","SHAKE.BlockSize":"m","SHAKE.MarshalBinary":"m","SHAKE.Read":"m","SHAKE.Reset":"m","SHAKE.UnmarshalBinary":"m","SHAKE.Write":"m","Sum224":"f","Sum256":"f","Sum384":"f","Sum512":"f","SumSHAKE128":"f","SumSHAKE256":"f"}},"crypto/sha512":{"path":"crypto/sha512","name":"sha512","symbols":{"BlockSize":"c","New":"f","New384":"f","New512_224":"f","New512_256":"f","Size":"c","Size224":"c","Size256":"c","Size384":"c","Sum384":"f","Sum512":"f","Sum512_224":"f","Sum512_256":"f"}},"crypto/subtle":{"path":"crypto/subtle","name":"subtle","symbols":{"ConstantTimeByteEq":"f","ConstantTimeCompare":"f","ConstantTimeCopy":"f","ConstantTimeEq":"f","ConstantTimeLessOrEq":"f","ConstantTimeSelect":"f","WithDataIndependentTiming":"f","XORBytes":"f"}},"crypto/tls":{"path":"crypto/tls","name":"tls","symbols":{"AlertError":"t","AlertError.Error":"m","Certificate":"t","CertificateRequestInfo":"t","CertificateRequestInfo.Context":"m","CertificateRequestInfo.SupportsCertificate":"m","CertificateVerificationError":"t","CertificateVerificationError.Error":"m","CertificateVerificationError.Unwrap":"m","CipherSuite":"t","CipherSuiteName":"f","CipherSuites":"f","Client":"f","ClientAuthType":"t","ClientAuthType.String":"m","ClientHelloInfo":"t","ClientHelloInfo.Context":"m","ClientHelloInfo.SupportsCertificate":"m","ClientSessionCache":"t","ClientSessionState":"t","ClientSessionState.ResumptionState":"m","Config":"t","Config.BuildNameToCertificate":"m","Config.Clone":"m","Config.DecryptTicket":"m","Config.EncryptTicket":"m","Config.SetSessionTicketKeys":"m","Conn":"t","Conn.Close":"m","Conn.CloseWrite":"m","Conn.ConnectionState":"m","Conn.Handshake":"m","Conn.HandshakeContext":"m","Conn.LocalAddr":"m","Conn.NetConn":"m","Conn.OCSPResponse":"m","Conn.Read":"m","Conn.RemoteAddr":"m","Conn.SetDeadline":"m","Conn.SetReadDeadline":"m","Conn.SetWriteDeadline":"m","Conn.VerifyHostname":"m","Conn.Write":"m","ConnectionState":"t","ConnectionState.ExportKeyingMaterial":"m","CurveID":"t","CurveID.String":"m","CurveP256":"c","CurveP384":"c","CurveP521":"c","Dial":"f","DialWithDialer":"f","Dialer":"t","Dialer.Dial":"m","Dialer.DialContext":"m","ECDSAWithP256AndSHA256":"c","ECDSAWithP384AndSHA384":"c","ECDSAWithP521AndSHA512":"c","ECDSAWithSHA1":"c","ECHRejectionError":"t","ECHRejectionError.Error":"m","Ed25519":"c","EncryptedClientHelloKey":"t","InsecureCipherSuites":"f","Listen":"f","LoadX509KeyPair":"f","NewLRUClientSessionCache":"f","NewListener":"f","NewResumptionState":"f","NoClientCert":"c","PKCS1WithSHA1":"c","PKCS1WithSHA256":"c","PKCS1WithSHA384":"c","PKCS1WithSHA512":"c","PSSWithSHA256":"c","PSSWithSHA384":"c","PSSWithSHA512":"c","ParseSessionState":"f","QUICClient":"f","QUICConfig":"t","QUICConn":"t","QUICConn.Close":"m","QUICConn.ConnectionState":"m","QUICConn.HandleData":"m","QUICConn.NextEvent":"m","QUICConn.SendSessionTicket":"m","QUICConn.SetTransportParameters":"m","QUICConn.Start":"m","QUICConn.StoreSession":"m","QUICEncryptionLevel":"t","QUICEncryptionLevel.String":"m","QUICEncryptionLevelApplication":"c","QUICEncryptionLevelEarly":"c","QUICEncryptionLevelHandshake":"c","QUICEncryptionLevelInitial":"c","QUICErrorEvent":"c","QUICEvent":"t","QUICEventKind":"t","QUICHandshakeDone":"c","QUICNoEvent":"c","QUICRejectedEarlyData":"c","QUICResumeSession":"c","QUICServer":"f","QUICSessionTicketOptions":"t","QUICSetReadSecret":"c","QUICSetWriteSecret":"c","QUICStoreSession":"c","QUICTransportParameters":"c","QUICTransportParametersRequired":"c","QUICWriteData":"c","RecordHeaderError":"t","RecordHeaderError.Error":"m","RenegotiateFreelyAsClient":"c","RenegotiateNever":"c","RenegotiateOnceAsClient":"c","RenegotiationSupport":"t","RequestClientCert":"c","RequireAndVerifyClientCert":"c","RequireAnyClientCert":"c","SecP256r1MLKEM768":"c","SecP384r1MLKEM1024":"c","Server":"f","SessionState":"t","SessionState.Bytes":"m","SignatureScheme":"t","SignatureScheme.String":"m","TLS_AES_128_GCM_SHA256":"c","TLS_AES_256_GCM_SHA384":"c","TLS_CHACHA20_POLY1305_SHA256":"c","TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA":"c","TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256":"c","TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256":"c","TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA":"c","TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384":"c","TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305":"c","TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256":"c","TLS_ECDHE_ECDSA_WITH_RC4_128_SHA":"c","TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA":"c","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA":"c","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256":"c","TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256":"c","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA":"c","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384":"c","TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305":"c","TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256":"c","TLS_ECDHE_RSA_WITH_RC4_128_SHA":"c","TLS_FALLBACK_SCSV":"c","TLS_RSA_WITH_3DES_EDE_CBC_SHA":"c","TLS_RSA_WITH_AES_128_CBC_SHA":"c","TLS_RSA_WITH_AES_128_CBC_SHA256":"c","TLS_RSA_WITH_AES_128_GCM_SHA256":"c","TLS_RSA_WITH_AES_256_CBC_SHA":"c","TLS_RSA_WITH_AES_256_GCM_SHA384":"c","TLS_RSA_WITH_RC4_128_SHA":"c","VerifyClientCertIfGiven":"c","VersionName":"f","VersionSSL30":"c","VersionTLS10":"c","VersionTLS11":"c","VersionTLS12":"c","VersionTLS13":"c","X25519":"c","X25519MLKEM768":"c","X509KeyPair":"f"}},"crypto/x509":{"path":"crypto/x509","name":"x509","symbols":{"CANotAuthorizedForExtKeyUsage":"c","CANotAuthorizedForThisName":"c","CertPool":"t","CertPool.AddCert":"m","CertPool.AddCertWithConstraint":"m","CertPool.AppendCertsFromPEM":"m","CertPool.Clone":"m","CertPool.Equal":"m","CertPool.Subjects":"m","Certificate":"t","Certificate.CheckCRLSignature":"m","Certificate.CheckSignature":"m","Certificate.CheckSignatureFrom":"m","Certificate.CreateCRL":"m","Certificate.Equal":"m","Certificate.Verify":"m","Certificate.VerifyHostname":"m","CertificateInvalidError":"t","CertificateInvalidError.Error":"m","CertificateRequest":"t","CertificateRequest.CheckSignature":"m","ConstraintViolationError":"t","ConstraintViolationError.Error":"m","CreateCertificate":"f","CreateCertificateRequest":"f","CreateRevocationList":"f","DSA":"c","DSAWithSHA1":"c","DSAWithSHA256":"c","DecryptPEMBlock":"f","ECDSA":"c","ECDSAWithSHA1":"c","ECDSAWithSHA256":"c","ECDSAWithSHA384":"c","ECDSAWithSHA512":"c","Ed25519":"c","EncryptPEMBlock":"f","ErrUnsupportedAlgorithm":"v","Expired":"c","ExtKeyUsage":"t","ExtKeyUsage.OID":"m","ExtKeyUsage.String":"m","ExtKeyUsageAny":"c","ExtKeyUsageClientAuth":"c","ExtKeyUsageCodeSigning":"c","ExtKeyUsageEmailProtection":"c","ExtKeyUsageIPSECEndSystem":"c","ExtKeyUsageIPSECTunnel":"c","ExtKeyUsageIPSECUser":"c","ExtKeyUsageMicrosoftCommercialCodeSigning":"c","ExtKeyUsageMicrosoftKernelCodeSigning":"c","ExtKeyUsageMicrosoftServerGatedCrypto":"c","ExtKeyUsageNetscapeServerGatedCrypto":"c","ExtKeyUsageOCSPSigning":"c","ExtKeyUsageServerAuth":"c","ExtKeyUsageTimeStamping":"c","HostnameError":"t","HostnameError.Error":"m","IncompatibleUsage":"c","IncorrectPasswordError":"v","InsecureAlgorithmError":"t","InsecureAlgorithmError.Error":"m","InvalidReason":"t","IsEncryptedPEMBlock":"f","KeyUsage":"t","KeyUsage.String":"m","KeyUsageCRLSign":"c","KeyUsageCertSign":"c","KeyUsageContentCommitment":"c","KeyUsageDataEncipherment":"c","KeyUsageDecipherOnly":"c","KeyUsageDigitalSignature":"c","KeyUsageEncipherOnly":"c","KeyUsageKeyAgreement":"c","KeyUsageKeyEncipherment":"c","MD2WithRSA":"c","MD5WithRSA":"c","MarshalECPrivateKey":"f","MarshalPKCS1PrivateKey":"f","MarshalPKCS1PublicKey":"f","MarshalPKCS8PrivateKey":"f","MarshalPKIXPublicKey":"f","NameConstraintsWithoutSANs":"c","NameMismatch":"c","NewCertPool":"f","NoValidChains":"c","NotAuthorizedToSign":"c","OID":"t","OID.AppendBinary":"m","OID.AppendText":"m","OID.Equal":"m","OID.EqualASN1OID":"m","OID.MarshalBinary":"m","OID.MarshalText":"m","OID.String":"m","OID.UnmarshalBinary":"m","OID.UnmarshalText":"m","OIDFromASN1OID":"f","OIDFromInts":"f","PEMCipher":"t","PEMCipher3DES":"c","PEMCipherAES128":"c","PEMCipherAES192":"c","PEMCipherAES256":"c","PEMCipherDES":"c","ParseCRL":"f","ParseCertificate":"f","ParseCertificateRequest":"f","ParseCertificates":"f","ParseDERCRL":"f","ParseECPrivateKey":"f","ParseOID":"f","ParsePKCS1PrivateKey":"f","ParsePKCS1PublicKey":"f","ParsePKCS8PrivateKey":"f","ParsePKIXPublicKey":"f","ParseRevocationList":"f","PolicyMapping":"t","PublicKeyAlgorithm":"t","PublicKeyAlgorithm.String":"m","PureEd25519":"c","RSA":"c","RevocationList":"t","RevocationList.CheckSignatureFrom":"m","RevocationListEntry":"t","SHA1WithRSA":"c","SHA256WithRSA":"c","SHA256WithRSAPSS":"c","SHA384WithRSA":"c","SHA384WithRSAPSS":"c","SHA512WithRSA":"c","SHA512WithRSAPSS":"c","SetFallbackRoots":"f","SignatureAlgorithm":"t","SignatureAlgorithm.String":"m","SystemCertPool":"f","SystemRootsError":"t","SystemRootsError.Error":"m","SystemRootsError.Unwrap":"m","TooManyConstraints":"c","TooManyIntermediates":"c","UnconstrainedName":"c","UnhandledCriticalExtension":"t","UnhandledCriticalExtension.Error":"m","UnknownAuthorityError":"t","UnknownAuthorityError.Error":"m","UnknownPublicKeyAlgorithm":"c","UnknownSignatureAlgorithm":"c","VerifyOptions":"t"}},"crypto/x509/pkix":{"path":"crypto/x509/pkix","name":"pkix","symbols":{"AlgorithmIdentifier":"t","AttributeTypeAndValue":"t","AttributeTypeAndValueSET":"t","CertificateList":"t","CertificateList.HasExpired":"m","Extension":"t","Name":"t","Name.FillFromRDNSequence":"m","Name.String":"m","Name.ToRDNSequence":"m","RDNSequence":"t","RDNSequence.String":"m","RelativeDistinguishedNameSET":"t","RevokedCertificate":"t","TBSCertificateList":"t"}},"database/sql":{"path":"database/sql","name":"sql","symbols":{"ColumnType":"t","ColumnType.DatabaseTypeName":"m","ColumnType.DecimalSize":"m","ColumnType.Length":"m","ColumnType.Name":"m","ColumnType.Nullable":"m","ColumnType.ScanType":"m","Conn":"t","Conn.BeginTx":"m","Conn.Close":"m","Conn.ExecContext":"m","Conn.PingContext":"m","Conn.PrepareContext":"m","Conn.QueryContext":"m","Conn.QueryRowContext":"m","Conn.Raw":"m","DB":"t","DB.Begin":"m","DB.BeginTx":"m","DB.Close":"m","DB.Conn":"m","DB.Driver":"m","DB.Exec":"m","DB.ExecContext":"m","DB.Ping":"m","DB.PingContext":"m","DB.Prepare":"m","DB.PrepareContext":"m","DB.Query":"m","DB.QueryContext":"m","DB.QueryRow":"m","DB.QueryRowContext":"m","DB.SetConnMaxIdleTime":"m","DB.SetConnMaxLifetime":"m","DB.SetMaxIdleConns":"m","DB.SetMaxOpenConns":"m","DB.Stats":"m","DBStats":"t","Drivers":"f","ErrConnDone":"v","ErrNoRows":"v","ErrTxDone":"v","IsolationLevel":"t","IsolationLevel.String":"m","LevelDefault":"c","LevelLinearizable":"c","LevelReadCommitted":"c","LevelReadUncommitted":"c","LevelRepeatableRead":"c","LevelSerializable":"c","LevelSnapshot":"c","LevelWriteCommitted":"c","Named":"f","NamedArg":"t","Null":"t","NullBool":"t","NullBool.Scan":"m","NullBool.Value":"m","NullByte":"t","NullByte.Scan":"m","NullByte.Value":"m","NullFloat64":"t","NullFloat64.Scan":"m","NullFloat64.Value":"m","NullInt16":"t","NullInt16.Scan":"m","NullInt16.Value":"m","NullInt32":"t","NullInt32.Scan":"m","NullInt32.Value":"m","NullInt64":"t","NullInt64.Scan":"m","NullInt64.Value":"m","NullString":"t","NullString.Scan":"m","NullString.Value":"m","NullTime":"t","NullTime.Scan":"m","NullTime.Value":"m","Open":"f","OpenDB":"f","Out":"t","RawBytes":"t","Register":"f","Result":"t","Row":"t","Row.Err":"m","Row.Scan":"m","Rows":"t","Rows.Close":"m","Rows.ColumnTypes":"m","Rows.Columns":"m","Rows.Err":"m","Rows.Next":"m","Rows.NextResultSet":"m","Rows.Scan":"m","Scanner":"t","Stmt":"t","Stmt.Close":"m","Stmt.Exec":"m","Stmt.ExecContext":"m","Stmt.Query":"m","Stmt.QueryContext":"m","Stmt.QueryRow":"m","Stmt.QueryRowContext":"m","Tx":"t","Tx.Commit":"m","Tx.Exec":"m","Tx.ExecContext":"m","Tx.Prepare":"m","Tx.PrepareContext":"m","Tx.Query":"m","Tx.QueryContext":"m","Tx.QueryRow":"m","Tx.QueryRowContext":"m","Tx.Rollback":"m","Tx.Stmt":"m","Tx.StmtContext":"m","TxOptions":"t"}},"database/sql/driver":{"path":"database/sql/driver","name":"driver","symbols":{"Bool":"v","ColumnConverter":"t","Conn":"t","ConnBeginTx":"t","ConnPrepareContext":"t","Connector":"t","DefaultParameterConverter":"v","Driver":"t","DriverContext":"t","ErrBadConn":"v","ErrRemoveArgument":"v","ErrSkip":"v","Execer":"t","ExecerContext":"t","Int32":"v","IsScanValue":"f","IsValue":"f","IsolationLevel":"t","NamedValue":"t","NamedValueChecker":"t","NotNull":"t","NotNull.ConvertValue":"m","Null":"t","Null.ConvertValue":"m","Pinger":"t","Queryer":"t","QueryerContext":"t","Result":"t","ResultNoRows":"v","Rows":"t","RowsAffected":"t","RowsAffected.LastInsertId":"m","RowsAffected.RowsAffected":"m","RowsColumnTypeDatabaseTypeName":"t","RowsColumnTypeLength":"t","RowsColumnTypeNullable":"t","RowsColumnTypePrecisionScale":"t","RowsColumnTypeScanType":"t","RowsNextResultSet":"t","SessionResetter":"t","Stmt":"t","StmtExecContext":"t","StmtQueryContext":"t","String":"v","Tx":"t","TxOptions":"t","Validator":"t","Value":"t","ValueConverter":"t","Valuer":"t"}},"debug/buildinfo":{"path":"debug/buildinfo","name":"buildinfo","symbols":{"BuildInfo":"t","Read":"f","ReadFile":"f"}},"debug/dwarf":{"path":"debug/dwarf","name":"dwarf","symbols":{"AddrType":"t","ArrayType":"t","ArrayType.Size":"m","ArrayType.String":"m","Attr":"t","Attr.GoString":"m","Attr.String":"m","AttrAbstractOrigin":"c","AttrAccessibility":"c","AttrAddrBase":"c","AttrAddrClass":"c","AttrAlignment":"c","AttrAllocated":"c","AttrArtificial":"c","AttrAssociated":"c","AttrBaseTypes":"c","AttrBinaryScale":"c","AttrBitOffset":"c","AttrBitSize":"c","AttrByteSize":"c","AttrCallAllCalls":"c","AttrCallAllSourceCalls":"c","AttrCallAllTailCalls":"c","AttrCallColumn":"c","AttrCallDataLocation":"c","AttrCallDataValue":"c","AttrCallFile":"c","AttrCallLine":"c","AttrCallOrigin":"c","AttrCallPC":"c","AttrCallParameter":"c","AttrCallReturnPC":"c","AttrCallTailCall":"c","AttrCallTarget":"c","AttrCallTargetClobbered":"c","AttrCallValue":"c","AttrCalling":"c","AttrCommonRef":"c","AttrCompDir":"c","AttrConstExpr":"c","AttrConstValue":"c","AttrContainingType":"c","AttrCount":"c","AttrDataBitOffset":"c","AttrDataLocation":"c","AttrDataMemberLoc":"c","AttrDecimalScale":"c","AttrDecimalSign":"c","AttrDeclColumn":"c","AttrDeclFile":"c","AttrDeclLine":"c","AttrDeclaration":"c","AttrDefaultValue":"c","AttrDefaulted":"c","AttrDeleted":"c","AttrDescription":"c","AttrDigitCount":"c","AttrDiscr":"c","AttrDiscrList":"c","AttrDiscrValue":"c","AttrDwoName":"c","AttrElemental":"c","AttrEncoding":"c","AttrEndianity":"c","AttrEntrypc":"c","AttrEnumClass":"c","AttrExplicit":"c","AttrExportSymbols":"c","AttrExtension":"c","AttrExternal":"c","AttrFrameBase":"c","AttrFriend":"c","AttrHighpc":"c","AttrIdentifierCase":"c","AttrImport":"c","AttrInline":"c","AttrIsOptional":"c","AttrLanguage":"c","AttrLinkageName":"c","AttrLocation":"c","AttrLoclistsBase":"c","AttrLowerBound":"c","AttrLowpc":"c","AttrMacroInfo":"c","AttrMacros":"c","AttrMainSubprogram":"c","AttrMutable":"c","AttrName":"c","AttrNamelistItem":"c","AttrNoreturn":"c","AttrObjectPointer":"c","AttrOrdering":"c","AttrPictureString":"c","AttrPriority":"c","AttrProducer":"c","AttrPrototyped":"c","AttrPure":"c","AttrRanges":"c","AttrRank":"c","AttrRecursive":"c","AttrReference":"c","AttrReturnAddr":"c","AttrRnglistsBase":"c","AttrRvalueReference":"c","AttrSegment":"c","AttrSibling":"c","AttrSignature":"c","AttrSmall":"c","AttrSpecification":"c","AttrStartScope":"c","AttrStaticLink":"c","AttrStmtList":"c","AttrStrOffsetsBase":"c","AttrStride":"c","AttrStrideSize":"c","AttrStringLength":"c","AttrStringLengthBitSize":"c","AttrStringLengthByteSize":"c","AttrThreadsScaled":"c","AttrTrampoline":"c","AttrType":"c","AttrUpperBound":"c","AttrUseLocation":"c","AttrUseUTF8":"c","AttrVarParam":"c","AttrVirtuality":"c","AttrVisibility":"c","AttrVtableElemLoc":"c","BasicType":"t","BasicType.Basic":"m","BasicType.String":"m","BoolType":"t","CharType":"t","Class":"t","Class.GoString":"m","Class.String":"m","ClassAddrPtr":"c","ClassAddress":"c","ClassBlock":"c","ClassConstant":"c","ClassExprLoc":"c","ClassFlag":"c","ClassLinePtr":"c","ClassLocList":"c","ClassLocListPtr":"c","ClassMacPtr":"c","ClassRangeListPtr":"c","ClassReference":"c","ClassReferenceAlt":"c","ClassReferenceSig":"c","ClassRngList":"c","ClassRngListsPtr":"c","ClassStrOffsetsPtr":"c","ClassString":"c","ClassStringAlt":"c","ClassUnknown":"c","CommonType":"t","CommonType.Common":"m","CommonType.Size":"m","ComplexType":"t","Data":"t","Data.AddSection":"m","Data.AddTypes":"m","Data.LineReader":"m","Data.Ranges":"m","Data.Reader":"m","Data.Type":"m","DecodeError":"t","DecodeError.Error":"m","DotDotDotType":"t","DotDotDotType.String":"m","Entry":"t","Entry.AttrField":"m","Entry.Val":"m","EnumType":"t","EnumType.String":"m","EnumValue":"t","ErrUnknownPC":"v","Field":"t","FloatType":"t","FuncType":"t","FuncType.String":"m","IntType":"t","LineEntry":"t","LineFile":"t","LineReader":"t","LineReader.Files":"m","LineReader.Next":"m","LineReader.Reset":"m","LineReader.Seek":"m","LineReader.SeekPC":"m","LineReader.Tell":"m","LineReaderPos":"t","New":"f","Offset":"t","PtrType":"t","PtrType.String":"m","QualType":"t","QualType.Size":"m","QualType.String":"m","Reader":"t","Reader.AddressSize":"m","Reader.ByteOrder":"m","Reader.Next":"m","Reader.Seek":"m","Reader.SeekPC":"m","Reader.SkipChildren":"m","StructField":"t","StructType":"t","StructType.Defn":"m","StructType.String":"m","Tag":"t","Tag.GoString":"m","Tag.String":"m","TagAccessDeclaration":"c","TagArrayType":"c","TagAtomicType":"c","TagBaseType":"c","TagCallSite":"c","TagCallSiteParameter":"c","TagCatchDwarfBlock":"c","TagClassType":"c","TagCoarrayType":"c","TagCommonDwarfBlock":"c","TagCommonInclusion":"c","TagCompileUnit":"c","TagCondition":"c","TagConstType":"c","TagConstant":"c","TagDwarfProcedure":"c","TagDynamicType":"c","TagEntryPoint":"c","TagEnumerationType":"c","TagEnumerator":"c","TagFileType":"c","TagFormalParameter":"c","TagFriend":"c","TagGenericSubrange":"c","TagImmutableType":"c","TagImportedDeclaration":"c","TagImportedModule":"c","TagImportedUnit":"c","TagInheritance":"c","TagInlinedSubroutine":"c","TagInterfaceType":"c","TagLabel":"c","TagLexDwarfBlock":"c","TagMember":"c","TagModule":"c","TagMutableType":"c","TagNamelist":"c","TagNamelistItem":"c","TagNamespace":"c","TagPackedType":"c","TagPartialUnit":"c","TagPointerType":"c","TagPtrToMemberType":"c","TagReferenceType":"c","TagRestrictType":"c","TagRvalueReferenceType":"c","TagSetType":"c","TagSharedType":"c","TagSkeletonUnit":"c","TagStringType":"c","TagStructType":"c","TagSubprogram":"c","TagSubrangeType":"c","TagSubroutineType":"c","TagTemplateAlias":"c","TagTemplateTypeParameter":"c","TagTemplateValueParameter":"c","TagThrownType":"c","TagTryDwarfBlock":"c","TagTypeUnit":"c","TagTypedef":"c","TagUnionType":"c","TagUnspecifiedParameters":"c","TagUnspecifiedType":"c","TagVariable":"c","TagVariant":"c","TagVariantPart":"c","TagVolatileType":"c","TagWithStmt":"c","Type":"t","TypedefType":"t","TypedefType.Size":"m","TypedefType.String":"m","UcharType":"t","UintType":"t","UnspecifiedType":"t","UnsupportedType":"t","UnsupportedType.String":"m","VoidType":"t","VoidType.String":"m"}},"debug/elf":{"path":"debug/elf","name":"elf","symbols":{"ARM_MAGIC_TRAMP_NUMBER":"c","COMPRESS_HIOS":"c","COMPRESS_HIPROC":"c","COMPRESS_LOOS":"c","COMPRESS_LOPROC":"c","COMPRESS_ZLIB":"c","COMPRESS_ZSTD":"c","Chdr32":"t","Chdr64":"t","Class":"t","Class.GoString":"m","Class.String":"m","CompressionType":"t","CompressionType.GoString":"m","CompressionType.String":"m","DF_1_CONFALT":"c","DF_1_DIRECT":"c","DF_1_DISPRELDNE":"c","DF_1_DISPRELPND":"c","DF_1_EDITED":"c","DF_1_ENDFILTEE":"c","DF_1_GLOBAL":"c","DF_1_GLOBAUDIT":"c","DF_1_GROUP":"c","DF_1_IGNMULDEF":"c","DF_1_INITFIRST":"c","DF_1_INTERPOSE":"c","DF_1_KMOD":"c","DF_1_LOADFLTR":"c","DF_1_NOCOMMON":"c","DF_1_NODEFLIB":"c","DF_1_NODELETE":"c","DF_1_NODIRECT":"c","DF_1_NODUMP":"c","DF_1_NOHDR":"c","DF_1_NOKSYMS":"c","DF_1_NOOPEN":"c","DF_1_NORELOC":"c","DF_1_NOW":"c","DF_1_ORIGIN":"c","DF_1_PIE":"c","DF_1_SINGLETON":"c","DF_1_STUB":"c","DF_1_SYMINTPOSE":"c","DF_1_TRANS":"c","DF_1_WEAKFILTER":"c","DF_BIND_NOW":"c","DF_ORIGIN":"c","DF_STATIC_TLS":"c","DF_SYMBOLIC":"c","DF_TEXTREL":"c","DT_ADDRRNGHI":"c","DT_ADDRRNGLO":"c","DT_AUDIT":"c","DT_AUXILIARY":"c","DT_BIND_NOW":"c","DT_CHECKSUM":"c","DT_CONFIG":"c","DT_DEBUG":"c","DT_DEPAUDIT":"c","DT_ENCODING":"c","DT_FEATURE":"c","DT_FILTER":"c","DT_FINI":"c","DT_FINI_ARRAY":"c","DT_FINI_ARRAYSZ":"c","DT_FLAGS":"c","DT_FLAGS_1":"c","DT_GNU_CONFLICT":"c","DT_GNU_CONFLICTSZ":"c","DT_GNU_HASH":"c","DT_GNU_LIBLIST":"c","DT_GNU_LIBLISTSZ":"c","DT_GNU_PRELINKED":"c","DT_HASH":"c","DT_HIOS":"c","DT_HIPROC":"c","DT_INIT":"c","DT_INIT_ARRAY":"c","DT_INIT_ARRAYSZ":"c","DT_JMPREL":"c","DT_LOOS":"c","DT_LOPROC":"c","DT_MIPS_AUX_DYNAMIC":"c","DT_MIPS_BASE_ADDRESS":"c","DT_MIPS_COMPACT_SIZE":"c","DT_MIPS_CONFLICT":"c","DT_MIPS_CONFLICTNO":"c","DT_MIPS_CXX_FLAGS":"c","DT_MIPS_DELTA_CLASS":"c","DT_MIPS_DELTA_CLASSSYM":"c","DT_MIPS_DELTA_CLASSSYM_NO":"c","DT_MIPS_DELTA_CLASS_NO":"c","DT_MIPS_DELTA_INSTANCE":"c","DT_MIPS_DELTA_INSTANCE_NO":"c","DT_MIPS_DELTA_RELOC":"c","DT_MIPS_DELTA_RELOC_NO":"c","DT_MIPS_DELTA_SYM":"c","DT_MIPS_DELTA_SYM_NO":"c","DT_MIPS_DYNSTR_ALIGN":"c","DT_MIPS_FLAGS":"c","DT_MIPS_GOTSYM":"c","DT_MIPS_GP_VALUE":"c","DT_MIPS_HIDDEN_GOTIDX":"c","DT_MIPS_HIPAGENO":"c","DT_MIPS_ICHECKSUM":"c","DT_MIPS_INTERFACE":"c","DT_MIPS_INTERFACE_SIZE":"c","DT_MIPS_IVERSION":"c","DT_MIPS_LIBLIST":"c","DT_MIPS_LIBLISTNO":"c","DT_MIPS_LOCALPAGE_GOTIDX":"c","DT_MIPS_LOCAL_GOTIDX":"c","DT_MIPS_LOCAL_GOTNO":"c","DT_MIPS_MSYM":"c","DT_MIPS_OPTIONS":"c","DT_MIPS_PERF_SUFFIX":"c","DT_MIPS_PIXIE_INIT":"c","DT_MIPS_PLTGOT":"c","DT_MIPS_PROTECTED_GOTIDX":"c","DT_MIPS_RLD_MAP":"c","DT_MIPS_RLD_MAP_REL":"c","DT_MIPS_RLD_TEXT_RESOLVE_ADDR":"c","DT_MIPS_RLD_VERSION":"c","DT_MIPS_RWPLT":"c","DT_MIPS_SYMBOL_LIB":"c","DT_MIPS_SYMTABNO":"c","DT_MIPS_TIME_STAMP":"c","DT_MIPS_UNREFEXTNO":"c","DT_MOVEENT":"c","DT_MOVESZ":"c","DT_MOVETAB":"c","DT_NEEDED":"c","DT_NULL":"c","DT_PLTGOT":"c","DT_PLTPAD":"c","DT_PLTPADSZ":"c","DT_PLTREL":"c","DT_PLTRELSZ":"c","DT_POSFLAG_1":"c","DT_PPC64_GLINK":"c","DT_PPC64_OPD":"c","DT_PPC64_OPDSZ":"c","DT_PPC64_OPT":"c","DT_PPC_GOT":"c","DT_PPC_OPT":"c","DT_PREINIT_ARRAY":"c","DT_PREINIT_ARRAYSZ":"c","DT_REL":"c","DT_RELA":"c","DT_RELACOUNT":"c","DT_RELAENT":"c","DT_RELASZ":"c","DT_RELCOUNT":"c","DT_RELENT":"c","DT_RELSZ":"c","DT_RPATH":"c","DT_RUNPATH":"c","DT_SONAME":"c","DT_SPARC_REGISTER":"c","DT_STRSZ":"c","DT_STRTAB":"c","DT_SYMBOLIC":"c","DT_SYMENT":"c","DT_SYMINENT":"c","DT_SYMINFO":"c","DT_SYMINSZ":"c","DT_SYMTAB":"c","DT_SYMTAB_SHNDX":"c","DT_TEXTREL":"c","DT_TLSDESC_GOT":"c","DT_TLSDESC_PLT":"c","DT_USED":"c","DT_VALRNGHI":"c","DT_VALRNGLO":"c","DT_VERDEF":"c","DT_VERDEFNUM":"c","DT_VERNEED":"c","DT_VERNEEDNUM":"c","DT_VERSYM":"c","Data":"t","Data.GoString":"m","Data.String":"m","Dyn32":"t","Dyn64":"t","DynFlag":"t","DynFlag.GoString":"m","DynFlag.String":"m","DynFlag1":"t","DynFlag1.GoString":"m","DynFlag1.String":"m","DynTag":"t","DynTag.GoString":"m","DynTag.String":"m","DynamicVersion":"t","DynamicVersionDep":"t","DynamicVersionFlag":"t","DynamicVersionNeed":"t","EI_ABIVERSION":"c","EI_CLASS":"c","EI_DATA":"c","EI_NIDENT":"c","EI_OSABI":"c","EI_PAD":"c","EI_VERSION":"c","ELFCLASS32":"c","ELFCLASS64":"c","ELFCLASSNONE":"c","ELFDATA2LSB":"c","ELFDATA2MSB":"c","ELFDATANONE":"c","ELFMAG":"c","ELFOSABI_86OPEN":"c","ELFOSABI_AIX":"c","ELFOSABI_ARM":"c","ELFOSABI_AROS":"c","ELFOSABI_CLOUDABI":"c","ELFOSABI_FENIXOS":"c","ELFOSABI_FREEBSD":"c","ELFOSABI_HPUX":"c","ELFOSABI_HURD":"c","ELFOSABI_IRIX":"c","ELFOSABI_LINUX":"c","ELFOSABI_MODESTO":"c","ELFOSABI_NETBSD":"c","ELFOSABI_NONE":"c","ELFOSABI_NSK":"c","ELFOSABI_OPENBSD":"c","ELFOSABI_OPENVMS":"c","ELFOSABI_SOLARIS":"c","ELFOSABI_STANDALONE":"c","ELFOSABI_TRU64":"c","EM_386":"c","EM_486":"c","EM_56800EX":"c","EM_68HC05":"c","EM_68HC08":"c","EM_68HC11":"c","EM_68HC12":"c","EM_68HC16":"c","EM_68K":"c","EM_78KOR":"c","EM_8051":"c","EM_860":"c","EM_88K":"c","EM_960":"c","EM_AARCH64":"c","EM_ALPHA":"c","EM_ALPHA_STD":"c","EM_ALTERA_NIOS2":"c","EM_AMDGPU":"c","EM_ARC":"c","EM_ARCA":"c","EM_ARC_COMPACT":"c","EM_ARC_COMPACT2":"c","EM_ARM":"c","EM_AVR":"c","EM_AVR32":"c","EM_BA1":"c","EM_BA2":"c","EM_BLACKFIN":"c","EM_BPF":"c","EM_C166":"c","EM_CDP":"c","EM_CE":"c","EM_CLOUDSHIELD":"c","EM_COGE":"c","EM_COLDFIRE":"c","EM_COOL":"c","EM_COREA_1ST":"c","EM_COREA_2ND":"c","EM_CR":"c","EM_CR16":"c","EM_CRAYNV2":"c","EM_CRIS":"c","EM_CRX":"c","EM_CSR_KALIMBA":"c","EM_CUDA":"c","EM_CYPRESS_M8C":"c","EM_D10V":"c","EM_D30V":"c","EM_DSP24":"c","EM_DSPIC30F":"c","EM_DXP":"c","EM_ECOG1":"c","EM_ECOG16":"c","EM_ECOG1X":"c","EM_ECOG2":"c","EM_ETPU":"c","EM_EXCESS":"c","EM_F2MC16":"c","EM_FIREPATH":"c","EM_FR20":"c","EM_FR30":"c","EM_FT32":"c","EM_FX66":"c","EM_H8S":"c","EM_H8_300":"c","EM_H8_300H":"c","EM_H8_500":"c","EM_HUANY":"c","EM_IA_64":"c","EM_INTEL205":"c","EM_INTEL206":"c","EM_INTEL207":"c","EM_INTEL208":"c","EM_INTEL209":"c","EM_IP2K":"c","EM_JAVELIN":"c","EM_K10M":"c","EM_KM32":"c","EM_KMX16":"c","EM_KMX32":"c","EM_KMX8":"c","EM_KVARC":"c","EM_L10M":"c","EM_LANAI":"c","EM_LATTICEMICO32":"c","EM_LOONGARCH":"c","EM_M16C":"c","EM_M32":"c","EM_M32C":"c","EM_M32R":"c","EM_MANIK":"c","EM_MAX":"c","EM_MAXQ30":"c","EM_MCHP_PIC":"c","EM_MCST_ELBRUS":"c","EM_ME16":"c","EM_METAG":"c","EM_MICROBLAZE":"c","EM_MIPS":"c","EM_MIPS_RS3_LE":"c","EM_MIPS_RS4_BE":"c","EM_MIPS_X":"c","EM_MMA":"c","EM_MMDSP_PLUS":"c","EM_MMIX":"c","EM_MN10200":"c","EM_MN10300":"c","EM_MOXIE":"c","EM_MSP430":"c","EM_NCPU":"c","EM_NDR1":"c","EM_NDS32":"c","EM_NONE":"c","EM_NORC":"c","EM_NS32K":"c","EM_OPEN8":"c","EM_OPENRISC":"c","EM_PARISC":"c","EM_PCP":"c","EM_PDP10":"c","EM_PDP11":"c","EM_PDSP":"c","EM_PJ":"c","EM_PPC":"c","EM_PPC64":"c","EM_PRISM":"c","EM_QDSP6":"c","EM_R32C":"c","EM_RCE":"c","EM_RH32":"c","EM_RISCV":"c","EM_RL78":"c","EM_RS08":"c","EM_RX":"c","EM_S370":"c","EM_S390":"c","EM_SCORE7":"c","EM_SEP":"c","EM_SE_C17":"c","EM_SE_C33":"c","EM_SH":"c","EM_SHARC":"c","EM_SLE9X":"c","EM_SNP1K":"c","EM_SPARC":"c","EM_SPARC32PLUS":"c","EM_SPARCV9":"c","EM_ST100":"c","EM_ST19":"c","EM_ST200":"c","EM_ST7":"c","EM_ST9PLUS":"c","EM_STARCORE":"c","EM_STM8":"c","EM_STXP7X":"c","EM_SVX":"c","EM_TILE64":"c","EM_TILEGX":"c","EM_TILEPRO":"c","EM_TINYJ":"c","EM_TI_ARP32":"c","EM_TI_C2000":"c","EM_TI_C5500":"c","EM_TI_C6000":"c","EM_TI_PRU":"c","EM_TMM_GPP":"c","EM_TPC":"c","EM_TRICORE":"c","EM_TRIMEDIA":"c","EM_TSK3000":"c","EM_UNICORE":"c","EM_V800":"c","EM_V850":"c","EM_VAX":"c","EM_VIDEOCORE":"c","EM_VIDEOCORE3":"c","EM_VIDEOCORE5":"c","EM_VISIUM":"c","EM_VPP500":"c","EM_X86_64":"c","EM_XCORE":"c","EM_XGATE":"c","EM_XIMO16":"c","EM_XTENSA":"c","EM_Z80":"c","EM_ZSP":"c","ET_CORE":"c","ET_DYN":"c","ET_EXEC":"c","ET_HIOS":"c","ET_HIPROC":"c","ET_LOOS":"c","ET_LOPROC":"c","ET_NONE":"c","ET_REL":"c","EV_CURRENT":"c","EV_NONE":"c","ErrNoSymbols":"v","File":"t","File.Close":"m","File.DWARF":"m","File.DynString":"m","File.DynValue":"m","File.DynamicSymbols":"m","File.DynamicVersionNeeds":"m","File.DynamicVersions":"m","File.ImportedLibraries":"m","File.ImportedSymbols":"m","File.Section":"m","File.SectionByType":"m","File.Symbols":"m","FileHeader":"t","FormatError":"t","FormatError.Error":"m","Header32":"t","Header64":"t","ImportedSymbol":"t","Machine":"t","Machine.GoString":"m","Machine.String":"m","NT_FPREGSET":"c","NT_PRPSINFO":"c","NT_PRSTATUS":"c","NType":"t","NType.GoString":"m","NType.String":"m","NewFile":"f","OSABI":"t","OSABI.GoString":"m","OSABI.String":"m","Open":"f","PF_MASKOS":"c","PF_MASKPROC":"c","PF_R":"c","PF_W":"c","PF_X":"c","PT_AARCH64_ARCHEXT":"c","PT_AARCH64_UNWIND":"c","PT_ARM_ARCHEXT":"c","PT_ARM_EXIDX":"c","PT_DYNAMIC":"c","PT_GNU_EH_FRAME":"c","PT_GNU_MBIND_HI":"c","PT_GNU_MBIND_LO":"c","PT_GNU_PROPERTY":"c","PT_GNU_RELRO":"c","PT_GNU_STACK":"c","PT_HIOS":"c","PT_HIPROC":"c","PT_INTERP":"c","PT_LOAD":"c","PT_LOOS":"c","PT_LOPROC":"c","PT_MIPS_ABIFLAGS":"c","PT_MIPS_OPTIONS":"c","PT_MIPS_REGINFO":"c","PT_MIPS_RTPROC":"c","PT_NOTE":"c","PT_NULL":"c","PT_OPENBSD_BOOTDATA":"c","PT_OPENBSD_NOBTCFI":"c","PT_OPENBSD_RANDOMIZE":"c","PT_OPENBSD_WXNEEDED":"c","PT_PAX_FLAGS":"c","PT_PHDR":"c","PT_RISCV_ATTRIBUTES":"c","PT_S390_PGSTE":"c","PT_SHLIB":"c","PT_SUNWSTACK":"c","PT_SUNW_EH_FRAME":"c","PT_TLS":"c","Prog":"t","Prog.Open":"m","Prog32":"t","Prog64":"t","ProgFlag":"t","ProgFlag.GoString":"m","ProgFlag.String":"m","ProgHeader":"t","ProgType":"t","ProgType.GoString":"m","ProgType.String":"m","R_386":"t","R_386.GoString":"m","R_386.String":"m","R_386_16":"c","R_386_32":"c","R_386_32PLT":"c","R_386_8":"c","R_386_COPY":"c","R_386_GLOB_DAT":"c","R_386_GOT32":"c","R_386_GOT32X":"c","R_386_GOTOFF":"c","R_386_GOTPC":"c","R_386_IRELATIVE":"c","R_386_JMP_SLOT":"c","R_386_NONE":"c","R_386_PC16":"c","R_386_PC32":"c","R_386_PC8":"c","R_386_PLT32":"c","R_386_RELATIVE":"c","R_386_SIZE32":"c","R_386_TLS_DESC":"c","R_386_TLS_DESC_CALL":"c","R_386_TLS_DTPMOD32":"c","R_386_TLS_DTPOFF32":"c","R_386_TLS_GD":"c","R_386_TLS_GD_32":"c","R_386_TLS_GD_CALL":"c","R_386_TLS_GD_POP":"c","R_386_TLS_GD_PUSH":"c","R_386_TLS_GOTDESC":"c","R_386_TLS_GOTIE":"c","R_386_TLS_IE":"c","R_386_TLS_IE_32":"c","R_386_TLS_LDM":"c","R_386_TLS_LDM_32":"c","R_386_TLS_LDM_CALL":"c","R_386_TLS_LDM_POP":"c","R_386_TLS_LDM_PUSH":"c","R_386_TLS_LDO_32":"c","R_386_TLS_LE":"c","R_386_TLS_LE_32":"c","R_386_TLS_TPOFF":"c","R_386_TLS_TPOFF32":"c","R_390":"t","R_390.GoString":"m","R_390.String":"m","R_390_12":"c","R_390_16":"c","R_390_20":"c","R_390_32":"c","R_390_64":"c","R_390_8":"c","R_390_COPY":"c","R_390_GLOB_DAT":"c","R_390_GOT12":"c","R_390_GOT16":"c","R_390_GOT20":"c","R_390_GOT32":"c","R_390_GOT64":"c","R_390_GOTENT":"c","R_390_GOTOFF":"c","R_390_GOTOFF16":"c","R_390_GOTOFF64":"c","R_390_GOTPC":"c","R_390_GOTPCDBL":"c","R_390_GOTPLT12":"c","R_390_GOTPLT16":"c","R_390_GOTPLT20":"c","R_390_GOTPLT32":"c","R_390_GOTPLT64":"c","R_390_GOTPLTENT":"c","R_390_GOTPLTOFF16":"c","R_390_GOTPLTOFF32":"c","R_390_GOTPLTOFF64":"c","R_390_JMP_SLOT":"c","R_390_NONE":"c","R_390_PC16":"c","R_390_PC16DBL":"c","R_390_PC32":"c","R_390_PC32DBL":"c","R_390_PC64":"c","R_390_PLT16DBL":"c","R_390_PLT32":"c","R_390_PLT32DBL":"c","R_390_PLT64":"c","R_390_RELATIVE":"c","R_390_TLS_DTPMOD":"c","R_390_TLS_DTPOFF":"c","R_390_TLS_GD32":"c","R_390_TLS_GD64":"c","R_390_TLS_GDCALL":"c","R_390_TLS_GOTIE12":"c","R_390_TLS_GOTIE20":"c","R_390_TLS_GOTIE32":"c","R_390_TLS_GOTIE64":"c","R_390_TLS_IE32":"c","R_390_TLS_IE64":"c","R_390_TLS_IEENT":"c","R_390_TLS_LDCALL":"c","R_390_TLS_LDM32":"c","R_390_TLS_LDM64":"c","R_390_TLS_LDO32":"c","R_390_TLS_LDO64":"c","R_390_TLS_LE32":"c","R_390_TLS_LE64":"c","R_390_TLS_LOAD":"c","R_390_TLS_TPOFF":"c","R_AARCH64":"t","R_AARCH64.GoString":"m","R_AARCH64.String":"m","R_AARCH64_ABS16":"c","R_AARCH64_ABS32":"c","R_AARCH64_ABS64":"c","R_AARCH64_ADD_ABS_LO12_NC":"c","R_AARCH64_ADR_GOT_PAGE":"c","R_AARCH64_ADR_PREL_LO21":"c","R_AARCH64_ADR_PREL_PG_HI21":"c","R_AARCH64_ADR_PREL_PG_HI21_NC":"c","R_AARCH64_CALL26":"c","R_AARCH64_CONDBR19":"c","R_AARCH64_COPY":"c","R_AARCH64_GLOB_DAT":"c","R_AARCH64_GOT_LD_PREL19":"c","R_AARCH64_IRELATIVE":"c","R_AARCH64_JUMP26":"c","R_AARCH64_JUMP_SLOT":"c","R_AARCH64_LD64_GOTOFF_LO15":"c","R_AARCH64_LD64_GOTPAGE_LO15":"c","R_AARCH64_LD64_GOT_LO12_NC":"c","R_AARCH64_LDST128_ABS_LO12_NC":"c","R_AARCH64_LDST16_ABS_LO12_NC":"c","R_AARCH64_LDST32_ABS_LO12_NC":"c","R_AARCH64_LDST64_ABS_LO12_NC":"c","R_AARCH64_LDST8_ABS_LO12_NC":"c","R_AARCH64_LD_PREL_LO19":"c","R_AARCH64_MOVW_SABS_G0":"c","R_AARCH64_MOVW_SABS_G1":"c","R_AARCH64_MOVW_SABS_G2":"c","R_AARCH64_MOVW_UABS_G0":"c","R_AARCH64_MOVW_UABS_G0_NC":"c","R_AARCH64_MOVW_UABS_G1":"c","R_AARCH64_MOVW_UABS_G1_NC":"c","R_AARCH64_MOVW_UABS_G2":"c","R_AARCH64_MOVW_UABS_G2_NC":"c","R_AARCH64_MOVW_UABS_G3":"c","R_AARCH64_NONE":"c","R_AARCH64_NULL":"c","R_AARCH64_P32_ABS16":"c","R_AARCH64_P32_ABS32":"c","R_AARCH64_P32_ADD_ABS_LO12_NC":"c","R_AARCH64_P32_ADR_GOT_PAGE":"c","R_AARCH64_P32_ADR_PREL_LO21":"c","R_AARCH64_P32_ADR_PREL_PG_HI21":"c","R_AARCH64_P32_CALL26":"c","R_AARCH64_P32_CONDBR19":"c","R_AARCH64_P32_COPY":"c","R_AARCH64_P32_GLOB_DAT":"c","R_AARCH64_P32_GOT_LD_PREL19":"c","R_AARCH64_P32_IRELATIVE":"c","R_AARCH64_P32_JUMP26":"c","R_AARCH64_P32_JUMP_SLOT":"c","R_AARCH64_P32_LD32_GOT_LO12_NC":"c","R_AARCH64_P32_LDST128_ABS_LO12_NC":"c","R_AARCH64_P32_LDST16_ABS_LO12_NC":"c","R_AARCH64_P32_LDST32_ABS_LO12_NC":"c","R_AARCH64_P32_LDST64_ABS_LO12_NC":"c","R_AARCH64_P32_LDST8_ABS_LO12_NC":"c","R_AARCH64_P32_LD_PREL_LO19":"c","R_AARCH64_P32_MOVW_SABS_G0":"c","R_AARCH64_P32_MOVW_UABS_G0":"c","R_AARCH64_P32_MOVW_UABS_G0_NC":"c","R_AARCH64_P32_MOVW_UABS_G1":"c","R_AARCH64_P32_PREL16":"c","R_AARCH64_P32_PREL32":"c","R_AARCH64_P32_RELATIVE":"c","R_AARCH64_P32_TLSDESC":"c","R_AARCH64_P32_TLSDESC_ADD_LO12_NC":"c","R_AARCH64_P32_TLSDESC_ADR_PAGE21":"c","R_AARCH64_P32_TLSDESC_ADR_PREL21":"c","R_AARCH64_P32_TLSDESC_CALL":"c","R_AARCH64_P32_TLSDESC_LD32_LO12_NC":"c","R_AARCH64_P32_TLSDESC_LD_PREL19":"c","R_AARCH64_P32_TLSGD_ADD_LO12_NC":"c","R_AARCH64_P32_TLSGD_ADR_PAGE21":"c","R_AARCH64_P32_TLSIE_ADR_GOTTPREL_PAGE21":"c","R_AARCH64_P32_TLSIE_LD32_GOTTPREL_LO12_NC":"c","R_AARCH64_P32_TLSIE_LD_GOTTPREL_PREL19":"c","R_AARCH64_P32_TLSLE_ADD_TPREL_HI12":"c","R_AARCH64_P32_TLSLE_ADD_TPREL_LO12":"c","R_AARCH64_P32_TLSLE_ADD_TPREL_LO12_NC":"c","R_AARCH64_P32_TLSLE_MOVW_TPREL_G0":"c","R_AARCH64_P32_TLSLE_MOVW_TPREL_G0_NC":"c","R_AARCH64_P32_TLSLE_MOVW_TPREL_G1":"c","R_AARCH64_P32_TLS_DTPMOD":"c","R_AARCH64_P32_TLS_DTPREL":"c","R_AARCH64_P32_TLS_TPREL":"c","R_AARCH64_P32_TSTBR14":"c","R_AARCH64_PREL16":"c","R_AARCH64_PREL32":"c","R_AARCH64_PREL64":"c","R_AARCH64_RELATIVE":"c","R_AARCH64_TLSDESC":"c","R_AARCH64_TLSDESC_ADD":"c","R_AARCH64_TLSDESC_ADD_LO12_NC":"c","R_AARCH64_TLSDESC_ADR_PAGE21":"c","R_AARCH64_TLSDESC_ADR_PREL21":"c","R_AARCH64_TLSDESC_CALL":"c","R_AARCH64_TLSDESC_LD64_LO12_NC":"c","R_AARCH64_TLSDESC_LDR":"c","R_AARCH64_TLSDESC_LD_PREL19":"c","R_AARCH64_TLSDESC_OFF_G0_NC":"c","R_AARCH64_TLSDESC_OFF_G1":"c","R_AARCH64_TLSGD_ADD_LO12_NC":"c","R_AARCH64_TLSGD_ADR_PAGE21":"c","R_AARCH64_TLSGD_ADR_PREL21":"c","R_AARCH64_TLSGD_MOVW_G0_NC":"c","R_AARCH64_TLSGD_MOVW_G1":"c","R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21":"c","R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC":"c","R_AARCH64_TLSIE_LD_GOTTPREL_PREL19":"c","R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC":"c","R_AARCH64_TLSIE_MOVW_GOTTPREL_G1":"c","R_AARCH64_TLSLD_ADR_PAGE21":"c","R_AARCH64_TLSLD_ADR_PREL21":"c","R_AARCH64_TLSLD_LDST128_DTPREL_LO12":"c","R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC":"c","R_AARCH64_TLSLE_ADD_TPREL_HI12":"c","R_AARCH64_TLSLE_ADD_TPREL_LO12":"c","R_AARCH64_TLSLE_ADD_TPREL_LO12_NC":"c","R_AARCH64_TLSLE_LDST128_TPREL_LO12":"c","R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC":"c","R_AARCH64_TLSLE_MOVW_TPREL_G0":"c","R_AARCH64_TLSLE_MOVW_TPREL_G0_NC":"c","R_AARCH64_TLSLE_MOVW_TPREL_G1":"c","R_AARCH64_TLSLE_MOVW_TPREL_G1_NC":"c","R_AARCH64_TLSLE_MOVW_TPREL_G2":"c","R_AARCH64_TLS_DTPMOD64":"c","R_AARCH64_TLS_DTPREL64":"c","R_AARCH64_TLS_TPREL64":"c","R_AARCH64_TSTBR14":"c","R_ALPHA":"t","R_ALPHA.GoString":"m","R_ALPHA.String":"m","R_ALPHA_BRADDR":"c","R_ALPHA_COPY":"c","R_ALPHA_GLOB_DAT":"c","R_ALPHA_GPDISP":"c","R_ALPHA_GPREL32":"c","R_ALPHA_GPRELHIGH":"c","R_ALPHA_GPRELLOW":"c","R_ALPHA_GPVALUE":"c","R_ALPHA_HINT":"c","R_ALPHA_IMMED_BR_HI32":"c","R_ALPHA_IMMED_GP_16":"c","R_ALPHA_IMMED_GP_HI32":"c","R_ALPHA_IMMED_LO32":"c","R_ALPHA_IMMED_SCN_HI32":"c","R_ALPHA_JMP_SLOT":"c","R_ALPHA_LITERAL":"c","R_ALPHA_LITUSE":"c","R_ALPHA_NONE":"c","R_ALPHA_OP_PRSHIFT":"c","R_ALPHA_OP_PSUB":"c","R_ALPHA_OP_PUSH":"c","R_ALPHA_OP_STORE":"c","R_ALPHA_REFLONG":"c","R_ALPHA_REFQUAD":"c","R_ALPHA_RELATIVE":"c","R_ALPHA_SREL16":"c","R_ALPHA_SREL32":"c","R_ALPHA_SREL64":"c","R_ARM":"t","R_ARM.GoString":"m","R_ARM.String":"m","R_ARM_ABS12":"c","R_ARM_ABS16":"c","R_ARM_ABS32":"c","R_ARM_ABS32_NOI":"c","R_ARM_ABS8":"c","R_ARM_ALU_PCREL_15_8":"c","R_ARM_ALU_PCREL_23_15":"c","R_ARM_ALU_PCREL_7_0":"c","R_ARM_ALU_PC_G0":"c","R_ARM_ALU_PC_G0_NC":"c","R_ARM_ALU_PC_G1":"c","R_ARM_ALU_PC_G1_NC":"c","R_ARM_ALU_PC_G2":"c","R_ARM_ALU_SBREL_19_12_NC":"c","R_ARM_ALU_SBREL_27_20_CK":"c","R_ARM_ALU_SB_G0":"c","R_ARM_ALU_SB_G0_NC":"c","R_ARM_ALU_SB_G1":"c","R_ARM_ALU_SB_G1_NC":"c","R_ARM_ALU_SB_G2":"c","R_ARM_AMP_VCALL9":"c","R_ARM_BASE_ABS":"c","R_ARM_CALL":"c","R_ARM_COPY":"c","R_ARM_GLOB_DAT":"c","R_ARM_GNU_VTENTRY":"c","R_ARM_GNU_VTINHERIT":"c","R_ARM_GOT32":"c","R_ARM_GOTOFF":"c","R_ARM_GOTOFF12":"c","R_ARM_GOTPC":"c","R_ARM_GOTRELAX":"c","R_ARM_GOT_ABS":"c","R_ARM_GOT_BREL12":"c","R_ARM_GOT_PREL":"c","R_ARM_IRELATIVE":"c","R_ARM_JUMP24":"c","R_ARM_JUMP_SLOT":"c","R_ARM_LDC_PC_G0":"c","R_ARM_LDC_PC_G1":"c","R_ARM_LDC_PC_G2":"c","R_ARM_LDC_SB_G0":"c","R_ARM_LDC_SB_G1":"c","R_ARM_LDC_SB_G2":"c","R_ARM_LDRS_PC_G0":"c","R_ARM_LDRS_PC_G1":"c","R_ARM_LDRS_PC_G2":"c","R_ARM_LDRS_SB_G0":"c","R_ARM_LDRS_SB_G1":"c","R_ARM_LDRS_SB_G2":"c","R_ARM_LDR_PC_G1":"c","R_ARM_LDR_PC_G2":"c","R_ARM_LDR_SBREL_11_10_NC":"c","R_ARM_LDR_SB_G0":"c","R_ARM_LDR_SB_G1":"c","R_ARM_LDR_SB_G2":"c","R_ARM_ME_TOO":"c","R_ARM_MOVT_ABS":"c","R_ARM_MOVT_BREL":"c","R_ARM_MOVT_PREL":"c","R_ARM_MOVW_ABS_NC":"c","R_ARM_MOVW_BREL":"c","R_ARM_MOVW_BREL_NC":"c","R_ARM_MOVW_PREL_NC":"c","R_ARM_NONE":"c","R_ARM_PC13":"c","R_ARM_PC24":"c","R_ARM_PLT32":"c","R_ARM_PLT32_ABS":"c","R_ARM_PREL31":"c","R_ARM_PRIVATE_0":"c","R_ARM_PRIVATE_1":"c","R_ARM_PRIVATE_10":"c","R_ARM_PRIVATE_11":"c","R_ARM_PRIVATE_12":"c","R_ARM_PRIVATE_13":"c","R_ARM_PRIVATE_14":"c","R_ARM_PRIVATE_15":"c","R_ARM_PRIVATE_2":"c","R_ARM_PRIVATE_3":"c","R_ARM_PRIVATE_4":"c","R_ARM_PRIVATE_5":"c","R_ARM_PRIVATE_6":"c","R_ARM_PRIVATE_7":"c","R_ARM_PRIVATE_8":"c","R_ARM_PRIVATE_9":"c","R_ARM_RABS32":"c","R_ARM_RBASE":"c","R_ARM_REL32":"c","R_ARM_REL32_NOI":"c","R_ARM_RELATIVE":"c","R_ARM_RPC24":"c","R_ARM_RREL32":"c","R_ARM_RSBREL32":"c","R_ARM_RXPC25":"c","R_ARM_SBREL31":"c","R_ARM_SBREL32":"c","R_ARM_SWI24":"c","R_ARM_TARGET1":"c","R_ARM_TARGET2":"c","R_ARM_THM_ABS5":"c","R_ARM_THM_ALU_ABS_G0_NC":"c","R_ARM_THM_ALU_ABS_G1_NC":"c","R_ARM_THM_ALU_ABS_G2_NC":"c","R_ARM_THM_ALU_ABS_G3":"c","R_ARM_THM_ALU_PREL_11_0":"c","R_ARM_THM_GOT_BREL12":"c","R_ARM_THM_JUMP11":"c","R_ARM_THM_JUMP19":"c","R_ARM_THM_JUMP24":"c","R_ARM_THM_JUMP6":"c","R_ARM_THM_JUMP8":"c","R_ARM_THM_MOVT_ABS":"c","R_ARM_THM_MOVT_BREL":"c","R_ARM_THM_MOVT_PREL":"c","R_ARM_THM_MOVW_ABS_NC":"c","R_ARM_THM_MOVW_BREL":"c","R_ARM_THM_MOVW_BREL_NC":"c","R_ARM_THM_MOVW_PREL_NC":"c","R_ARM_THM_PC12":"c","R_ARM_THM_PC22":"c","R_ARM_THM_PC8":"c","R_ARM_THM_RPC22":"c","R_ARM_THM_SWI8":"c","R_ARM_THM_TLS_CALL":"c","R_ARM_THM_TLS_DESCSEQ16":"c","R_ARM_THM_TLS_DESCSEQ32":"c","R_ARM_THM_XPC22":"c","R_ARM_TLS_CALL":"c","R_ARM_TLS_DESCSEQ":"c","R_ARM_TLS_DTPMOD32":"c","R_ARM_TLS_DTPOFF32":"c","R_ARM_TLS_GD32":"c","R_ARM_TLS_GOTDESC":"c","R_ARM_TLS_IE12GP":"c","R_ARM_TLS_IE32":"c","R_ARM_TLS_LDM32":"c","R_ARM_TLS_LDO12":"c","R_ARM_TLS_LDO32":"c","R_ARM_TLS_LE12":"c","R_ARM_TLS_LE32":"c","R_ARM_TLS_TPOFF32":"c","R_ARM_V4BX":"c","R_ARM_XPC25":"c","R_INFO":"f","R_INFO32":"f","R_LARCH":"t","R_LARCH.GoString":"m","R_LARCH.String":"m","R_LARCH_32":"c","R_LARCH_32_PCREL":"c","R_LARCH_64":"c","R_LARCH_64_PCREL":"c","R_LARCH_ABS64_HI12":"c","R_LARCH_ABS64_LO20":"c","R_LARCH_ABS_HI20":"c","R_LARCH_ABS_LO12":"c","R_LARCH_ADD16":"c","R_LARCH_ADD24":"c","R_LARCH_ADD32":"c","R_LARCH_ADD6":"c","R_LARCH_ADD64":"c","R_LARCH_ADD8":"c","R_LARCH_ADD_ULEB128":"c","R_LARCH_ALIGN":"c","R_LARCH_B16":"c","R_LARCH_B21":"c","R_LARCH_B26":"c","R_LARCH_CALL36":"c","R_LARCH_CFA":"c","R_LARCH_COPY":"c","R_LARCH_DELETE":"c","R_LARCH_GNU_VTENTRY":"c","R_LARCH_GNU_VTINHERIT":"c","R_LARCH_GOT64_HI12":"c","R_LARCH_GOT64_LO20":"c","R_LARCH_GOT64_PC_HI12":"c","R_LARCH_GOT64_PC_LO20":"c","R_LARCH_GOT_HI20":"c","R_LARCH_GOT_LO12":"c","R_LARCH_GOT_PC_HI20":"c","R_LARCH_GOT_PC_LO12":"c","R_LARCH_IRELATIVE":"c","R_LARCH_JUMP_SLOT":"c","R_LARCH_MARK_LA":"c","R_LARCH_MARK_PCREL":"c","R_LARCH_NONE":"c","R_LARCH_PCALA64_HI12":"c","R_LARCH_PCALA64_LO20":"c","R_LARCH_PCALA_HI20":"c","R_LARCH_PCALA_LO12":"c","R_LARCH_PCREL20_S2":"c","R_LARCH_RELATIVE":"c","R_LARCH_RELAX":"c","R_LARCH_SOP_ADD":"c","R_LARCH_SOP_AND":"c","R_LARCH_SOP_ASSERT":"c","R_LARCH_SOP_IF_ELSE":"c","R_LARCH_SOP_NOT":"c","R_LARCH_SOP_POP_32_S_0_10_10_16_S2":"c","R_LARCH_SOP_POP_32_S_0_5_10_16_S2":"c","R_LARCH_SOP_POP_32_S_10_12":"c","R_LARCH_SOP_POP_32_S_10_16":"c","R_LARCH_SOP_POP_32_S_10_16_S2":"c","R_LARCH_SOP_POP_32_S_10_5":"c","R_LARCH_SOP_POP_32_S_5_20":"c","R_LARCH_SOP_POP_32_U":"c","R_LARCH_SOP_POP_32_U_10_12":"c","R_LARCH_SOP_PUSH_ABSOLUTE":"c","R_LARCH_SOP_PUSH_DUP":"c","R_LARCH_SOP_PUSH_GPREL":"c","R_LARCH_SOP_PUSH_PCREL":"c","R_LARCH_SOP_PUSH_PLT_PCREL":"c","R_LARCH_SOP_PUSH_TLS_GD":"c","R_LARCH_SOP_PUSH_TLS_GOT":"c","R_LARCH_SOP_PUSH_TLS_TPREL":"c","R_LARCH_SOP_SL":"c","R_LARCH_SOP_SR":"c","R_LARCH_SOP_SUB":"c","R_LARCH_SUB16":"c","R_LARCH_SUB24":"c","R_LARCH_SUB32":"c","R_LARCH_SUB6":"c","R_LARCH_SUB64":"c","R_LARCH_SUB8":"c","R_LARCH_SUB_ULEB128":"c","R_LARCH_TLS_DESC32":"c","R_LARCH_TLS_DESC64":"c","R_LARCH_TLS_DESC64_HI12":"c","R_LARCH_TLS_DESC64_LO20":"c","R_LARCH_TLS_DESC64_PC_HI12":"c","R_LARCH_TLS_DESC64_PC_LO20":"c","R_LARCH_TLS_DESC_CALL":"c","R_LARCH_TLS_DESC_HI20":"c","R_LARCH_TLS_DESC_LD":"c","R_LARCH_TLS_DESC_LO12":"c","R_LARCH_TLS_DESC_PCREL20_S2":"c","R_LARCH_TLS_DESC_PC_HI20":"c","R_LARCH_TLS_DESC_PC_LO12":"c","R_LARCH_TLS_DTPMOD32":"c","R_LARCH_TLS_DTPMOD64":"c","R_LARCH_TLS_DTPREL32":"c","R_LARCH_TLS_DTPREL64":"c","R_LARCH_TLS_GD_HI20":"c","R_LARCH_TLS_GD_PCREL20_S2":"c","R_LARCH_TLS_GD_PC_HI20":"c","R_LARCH_TLS_IE64_HI12":"c","R_LARCH_TLS_IE64_LO20":"c","R_LARCH_TLS_IE64_PC_HI12":"c","R_LARCH_TLS_IE64_PC_LO20":"c","R_LARCH_TLS_IE_HI20":"c","R_LARCH_TLS_IE_LO12":"c","R_LARCH_TLS_IE_PC_HI20":"c","R_LARCH_TLS_IE_PC_LO12":"c","R_LARCH_TLS_LD_HI20":"c","R_LARCH_TLS_LD_PCREL20_S2":"c","R_LARCH_TLS_LD_PC_HI20":"c","R_LARCH_TLS_LE64_HI12":"c","R_LARCH_TLS_LE64_LO20":"c","R_LARCH_TLS_LE_ADD_R":"c","R_LARCH_TLS_LE_HI20":"c","R_LARCH_TLS_LE_HI20_R":"c","R_LARCH_TLS_LE_LO12":"c","R_LARCH_TLS_LE_LO12_R":"c","R_LARCH_TLS_TPREL32":"c","R_LARCH_TLS_TPREL64":"c","R_MIPS":"t","R_MIPS.GoString":"m","R_MIPS.String":"m","R_MIPS_16":"c","R_MIPS_26":"c","R_MIPS_32":"c","R_MIPS_64":"c","R_MIPS_ADD_IMMEDIATE":"c","R_MIPS_CALL16":"c","R_MIPS_CALL_HI16":"c","R_MIPS_CALL_LO16":"c","R_MIPS_DELETE":"c","R_MIPS_GOT16":"c","R_MIPS_GOT_DISP":"c","R_MIPS_GOT_HI16":"c","R_MIPS_GOT_LO16":"c","R_MIPS_GOT_OFST":"c","R_MIPS_GOT_PAGE":"c","R_MIPS_GPREL16":"c","R_MIPS_GPREL32":"c","R_MIPS_HI16":"c","R_MIPS_HIGHER":"c","R_MIPS_HIGHEST":"c","R_MIPS_INSERT_A":"c","R_MIPS_INSERT_B":"c","R_MIPS_JALR":"c","R_MIPS_LITERAL":"c","R_MIPS_LO16":"c","R_MIPS_NONE":"c","R_MIPS_PC16":"c","R_MIPS_PC32":"c","R_MIPS_PJUMP":"c","R_MIPS_REL16":"c","R_MIPS_REL32":"c","R_MIPS_RELGOT":"c","R_MIPS_SCN_DISP":"c","R_MIPS_SHIFT5":"c","R_MIPS_SHIFT6":"c","R_MIPS_SUB":"c","R_MIPS_TLS_DTPMOD32":"c","R_MIPS_TLS_DTPMOD64":"c","R_MIPS_TLS_DTPREL32":"c","R_MIPS_TLS_DTPREL64":"c","R_MIPS_TLS_DTPREL_HI16":"c","R_MIPS_TLS_DTPREL_LO16":"c","R_MIPS_TLS_GD":"c","R_MIPS_TLS_GOTTPREL":"c","R_MIPS_TLS_LDM":"c","R_MIPS_TLS_TPREL32":"c","R_MIPS_TLS_TPREL64":"c","R_MIPS_TLS_TPREL_HI16":"c","R_MIPS_TLS_TPREL_LO16":"c","R_PPC":"t","R_PPC.GoString":"m","R_PPC.String":"m","R_PPC64":"t","R_PPC64.GoString":"m","R_PPC64.String":"m","R_PPC64_ADDR14":"c","R_PPC64_ADDR14_BRNTAKEN":"c","R_PPC64_ADDR14_BRTAKEN":"c","R_PPC64_ADDR16":"c","R_PPC64_ADDR16_DS":"c","R_PPC64_ADDR16_HA":"c","R_PPC64_ADDR16_HI":"c","R_PPC64_ADDR16_HIGH":"c","R_PPC64_ADDR16_HIGHA":"c","R_PPC64_ADDR16_HIGHER":"c","R_PPC64_ADDR16_HIGHER34":"c","R_PPC64_ADDR16_HIGHERA":"c","R_PPC64_ADDR16_HIGHERA34":"c","R_PPC64_ADDR16_HIGHEST":"c","R_PPC64_ADDR16_HIGHEST34":"c","R_PPC64_ADDR16_HIGHESTA":"c","R_PPC64_ADDR16_HIGHESTA34":"c","R_PPC64_ADDR16_LO":"c","R_PPC64_ADDR16_LO_DS":"c","R_PPC64_ADDR24":"c","R_PPC64_ADDR32":"c","R_PPC64_ADDR64":"c","R_PPC64_ADDR64_LOCAL":"c","R_PPC64_COPY":"c","R_PPC64_D28":"c","R_PPC64_D34":"c","R_PPC64_D34_HA30":"c","R_PPC64_D34_HI30":"c","R_PPC64_D34_LO":"c","R_PPC64_DTPMOD64":"c","R_PPC64_DTPREL16":"c","R_PPC64_DTPREL16_DS":"c","R_PPC64_DTPREL16_HA":"c","R_PPC64_DTPREL16_HI":"c","R_PPC64_DTPREL16_HIGH":"c","R_PPC64_DTPREL16_HIGHA":"c","R_PPC64_DTPREL16_HIGHER":"c","R_PPC64_DTPREL16_HIGHERA":"c","R_PPC64_DTPREL16_HIGHEST":"c","R_PPC64_DTPREL16_HIGHESTA":"c","R_PPC64_DTPREL16_LO":"c","R_PPC64_DTPREL16_LO_DS":"c","R_PPC64_DTPREL34":"c","R_PPC64_DTPREL64":"c","R_PPC64_ENTRY":"c","R_PPC64_GLOB_DAT":"c","R_PPC64_GNU_VTENTRY":"c","R_PPC64_GNU_VTINHERIT":"c","R_PPC64_GOT16":"c","R_PPC64_GOT16_DS":"c","R_PPC64_GOT16_HA":"c","R_PPC64_GOT16_HI":"c","R_PPC64_GOT16_LO":"c","R_PPC64_GOT16_LO_DS":"c","R_PPC64_GOT_DTPREL16_DS":"c","R_PPC64_GOT_DTPREL16_HA":"c","R_PPC64_GOT_DTPREL16_HI":"c","R_PPC64_GOT_DTPREL16_LO_DS":"c","R_PPC64_GOT_DTPREL_PCREL34":"c","R_PPC64_GOT_PCREL34":"c","R_PPC64_GOT_TLSGD16":"c","R_PPC64_GOT_TLSGD16_HA":"c","R_PPC64_GOT_TLSGD16_HI":"c","R_PPC64_GOT_TLSGD16_LO":"c","R_PPC64_GOT_TLSGD_PCREL34":"c","R_PPC64_GOT_TLSLD16":"c","R_PPC64_GOT_TLSLD16_HA":"c","R_PPC64_GOT_TLSLD16_HI":"c","R_PPC64_GOT_TLSLD16_LO":"c","R_PPC64_GOT_TLSLD_PCREL34":"c","R_PPC64_GOT_TPREL16_DS":"c","R_PPC64_GOT_TPREL16_HA":"c","R_PPC64_GOT_TPREL16_HI":"c","R_PPC64_GOT_TPREL16_LO_DS":"c","R_PPC64_GOT_TPREL_PCREL34":"c","R_PPC64_IRELATIVE":"c","R_PPC64_JMP_IREL":"c","R_PPC64_JMP_SLOT":"c","R_PPC64_NONE":"c","R_PPC64_PCREL28":"c","R_PPC64_PCREL34":"c","R_PPC64_PCREL_OPT":"c","R_PPC64_PLT16_HA":"c","R_PPC64_PLT16_HI":"c","R_PPC64_PLT16_LO":"c","R_PPC64_PLT16_LO_DS":"c","R_PPC64_PLT32":"c","R_PPC64_PLT64":"c","R_PPC64_PLTCALL":"c","R_PPC64_PLTCALL_NOTOC":"c","R_PPC64_PLTGOT16":"c","R_PPC64_PLTGOT16_DS":"c","R_PPC64_PLTGOT16_HA":"c","R_PPC64_PLTGOT16_HI":"c","R_PPC64_PLTGOT16_LO":"c","R_PPC64_PLTGOT_LO_DS":"c","R_PPC64_PLTREL32":"c","R_PPC64_PLTREL64":"c","R_PPC64_PLTSEQ":"c","R_PPC64_PLTSEQ_NOTOC":"c","R_PPC64_PLT_PCREL34":"c","R_PPC64_PLT_PCREL34_NOTOC":"c","R_PPC64_REL14":"c","R_PPC64_REL14_BRNTAKEN":"c","R_PPC64_REL14_BRTAKEN":"c","R_PPC64_REL16":"c","R_PPC64_REL16DX_HA":"c","R_PPC64_REL16_HA":"c","R_PPC64_REL16_HI":"c","R_PPC64_REL16_HIGH":"c","R_PPC64_REL16_HIGHA":"c","R_PPC64_REL16_HIGHER":"c","R_PPC64_REL16_HIGHER34":"c","R_PPC64_REL16_HIGHERA":"c","R_PPC64_REL16_HIGHERA34":"c","R_PPC64_REL16_HIGHEST":"c","R_PPC64_REL16_HIGHEST34":"c","R_PPC64_REL16_HIGHESTA":"c","R_PPC64_REL16_HIGHESTA34":"c","R_PPC64_REL16_LO":"c","R_PPC64_REL24":"c","R_PPC64_REL24_NOTOC":"c","R_PPC64_REL24_P9NOTOC":"c","R_PPC64_REL30":"c","R_PPC64_REL32":"c","R_PPC64_REL64":"c","R_PPC64_RELATIVE":"c","R_PPC64_SECTOFF":"c","R_PPC64_SECTOFF_DS":"c","R_PPC64_SECTOFF_HA":"c","R_PPC64_SECTOFF_HI":"c","R_PPC64_SECTOFF_LO":"c","R_PPC64_SECTOFF_LO_DS":"c","R_PPC64_TLS":"c","R_PPC64_TLSGD":"c","R_PPC64_TLSLD":"c","R_PPC64_TOC":"c","R_PPC64_TOC16":"c","R_PPC64_TOC16_DS":"c","R_PPC64_TOC16_HA":"c","R_PPC64_TOC16_HI":"c","R_PPC64_TOC16_LO":"c","R_PPC64_TOC16_LO_DS":"c","R_PPC64_TOCSAVE":"c","R_PPC64_TPREL16":"c","R_PPC64_TPREL16_DS":"c","R_PPC64_TPREL16_HA":"c","R_PPC64_TPREL16_HI":"c","R_PPC64_TPREL16_HIGH":"c","R_PPC64_TPREL16_HIGHA":"c","R_PPC64_TPREL16_HIGHER":"c","R_PPC64_TPREL16_HIGHERA":"c","R_PPC64_TPREL16_HIGHEST":"c","R_PPC64_TPREL16_HIGHESTA":"c","R_PPC64_TPREL16_LO":"c","R_PPC64_TPREL16_LO_DS":"c","R_PPC64_TPREL34":"c","R_PPC64_TPREL64":"c","R_PPC64_UADDR16":"c","R_PPC64_UADDR32":"c","R_PPC64_UADDR64":"c","R_PPC_ADDR14":"c","R_PPC_ADDR14_BRNTAKEN":"c","R_PPC_ADDR14_BRTAKEN":"c","R_PPC_ADDR16":"c","R_PPC_ADDR16_HA":"c","R_PPC_ADDR16_HI":"c","R_PPC_ADDR16_LO":"c","R_PPC_ADDR24":"c","R_PPC_ADDR32":"c","R_PPC_COPY":"c","R_PPC_DTPMOD32":"c","R_PPC_DTPREL16":"c","R_PPC_DTPREL16_HA":"c","R_PPC_DTPREL16_HI":"c","R_PPC_DTPREL16_LO":"c","R_PPC_DTPREL32":"c","R_PPC_EMB_BIT_FLD":"c","R_PPC_EMB_MRKREF":"c","R_PPC_EMB_NADDR16":"c","R_PPC_EMB_NADDR16_HA":"c","R_PPC_EMB_NADDR16_HI":"c","R_PPC_EMB_NADDR16_LO":"c","R_PPC_EMB_NADDR32":"c","R_PPC_EMB_RELSDA":"c","R_PPC_EMB_RELSEC16":"c","R_PPC_EMB_RELST_HA":"c","R_PPC_EMB_RELST_HI":"c","R_PPC_EMB_RELST_LO":"c","R_PPC_EMB_SDA21":"c","R_PPC_EMB_SDA2I16":"c","R_PPC_EMB_SDA2REL":"c","R_PPC_EMB_SDAI16":"c","R_PPC_GLOB_DAT":"c","R_PPC_GOT16":"c","R_PPC_GOT16_HA":"c","R_PPC_GOT16_HI":"c","R_PPC_GOT16_LO":"c","R_PPC_GOT_TLSGD16":"c","R_PPC_GOT_TLSGD16_HA":"c","R_PPC_GOT_TLSGD16_HI":"c","R_PPC_GOT_TLSGD16_LO":"c","R_PPC_GOT_TLSLD16":"c","R_PPC_GOT_TLSLD16_HA":"c","R_PPC_GOT_TLSLD16_HI":"c","R_PPC_GOT_TLSLD16_LO":"c","R_PPC_GOT_TPREL16":"c","R_PPC_GOT_TPREL16_HA":"c","R_PPC_GOT_TPREL16_HI":"c","R_PPC_GOT_TPREL16_LO":"c","R_PPC_JMP_SLOT":"c","R_PPC_LOCAL24PC":"c","R_PPC_NONE":"c","R_PPC_PLT16_HA":"c","R_PPC_PLT16_HI":"c","R_PPC_PLT16_LO":"c","R_PPC_PLT32":"c","R_PPC_PLTREL24":"c","R_PPC_PLTREL32":"c","R_PPC_REL14":"c","R_PPC_REL14_BRNTAKEN":"c","R_PPC_REL14_BRTAKEN":"c","R_PPC_REL24":"c","R_PPC_REL32":"c","R_PPC_RELATIVE":"c","R_PPC_SDAREL16":"c","R_PPC_SECTOFF":"c","R_PPC_SECTOFF_HA":"c","R_PPC_SECTOFF_HI":"c","R_PPC_SECTOFF_LO":"c","R_PPC_TLS":"c","R_PPC_TPREL16":"c","R_PPC_TPREL16_HA":"c","R_PPC_TPREL16_HI":"c","R_PPC_TPREL16_LO":"c","R_PPC_TPREL32":"c","R_PPC_UADDR16":"c","R_PPC_UADDR32":"c","R_RISCV":"t","R_RISCV.GoString":"m","R_RISCV.String":"m","R_RISCV_32":"c","R_RISCV_32_PCREL":"c","R_RISCV_64":"c","R_RISCV_ADD16":"c","R_RISCV_ADD32":"c","R_RISCV_ADD64":"c","R_RISCV_ADD8":"c","R_RISCV_ALIGN":"c","R_RISCV_BRANCH":"c","R_RISCV_CALL":"c","R_RISCV_CALL_PLT":"c","R_RISCV_COPY":"c","R_RISCV_GNU_VTENTRY":"c","R_RISCV_GNU_VTINHERIT":"c","R_RISCV_GOT_HI20":"c","R_RISCV_GPREL_I":"c","R_RISCV_GPREL_S":"c","R_RISCV_HI20":"c","R_RISCV_JAL":"c","R_RISCV_JUMP_SLOT":"c","R_RISCV_LO12_I":"c","R_RISCV_LO12_S":"c","R_RISCV_NONE":"c","R_RISCV_PCREL_HI20":"c","R_RISCV_PCREL_LO12_I":"c","R_RISCV_PCREL_LO12_S":"c","R_RISCV_RELATIVE":"c","R_RISCV_RELAX":"c","R_RISCV_RVC_BRANCH":"c","R_RISCV_RVC_JUMP":"c","R_RISCV_RVC_LUI":"c","R_RISCV_SET16":"c","R_RISCV_SET32":"c","R_RISCV_SET6":"c","R_RISCV_SET8":"c","R_RISCV_SUB16":"c","R_RISCV_SUB32":"c","R_RISCV_SUB6":"c","R_RISCV_SUB64":"c","R_RISCV_SUB8":"c","R_RISCV_TLS_DTPMOD32":"c","R_RISCV_TLS_DTPMOD64":"c","R_RISCV_TLS_DTPREL32":"c","R_RISCV_TLS_DTPREL64":"c","R_RISCV_TLS_GD_HI20":"c","R_RISCV_TLS_GOT_HI20":"c","R_RISCV_TLS_TPREL32":"c","R_RISCV_TLS_TPREL64":"c","R_RISCV_TPREL_ADD":"c","R_RISCV_TPREL_HI20":"c","R_RISCV_TPREL_I":"c","R_RISCV_TPREL_LO12_I":"c","R_RISCV_TPREL_LO12_S":"c","R_RISCV_TPREL_S":"c","R_SPARC":"t","R_SPARC.GoString":"m","R_SPARC.String":"m","R_SPARC_10":"c","R_SPARC_11":"c","R_SPARC_13":"c","R_SPARC_16":"c","R_SPARC_22":"c","R_SPARC_32":"c","R_SPARC_5":"c","R_SPARC_6":"c","R_SPARC_64":"c","R_SPARC_7":"c","R_SPARC_8":"c","R_SPARC_COPY":"c","R_SPARC_DISP16":"c","R_SPARC_DISP32":"c","R_SPARC_DISP64":"c","R_SPARC_DISP8":"c","R_SPARC_GLOB_DAT":"c","R_SPARC_GLOB_JMP":"c","R_SPARC_GOT10":"c","R_SPARC_GOT13":"c","R_SPARC_GOT22":"c","R_SPARC_H44":"c","R_SPARC_HH22":"c","R_SPARC_HI22":"c","R_SPARC_HIPLT22":"c","R_SPARC_HIX22":"c","R_SPARC_HM10":"c","R_SPARC_JMP_SLOT":"c","R_SPARC_L44":"c","R_SPARC_LM22":"c","R_SPARC_LO10":"c","R_SPARC_LOPLT10":"c","R_SPARC_LOX10":"c","R_SPARC_M44":"c","R_SPARC_NONE":"c","R_SPARC_OLO10":"c","R_SPARC_PC10":"c","R_SPARC_PC22":"c","R_SPARC_PCPLT10":"c","R_SPARC_PCPLT22":"c","R_SPARC_PCPLT32":"c","R_SPARC_PC_HH22":"c","R_SPARC_PC_HM10":"c","R_SPARC_PC_LM22":"c","R_SPARC_PLT32":"c","R_SPARC_PLT64":"c","R_SPARC_REGISTER":"c","R_SPARC_RELATIVE":"c","R_SPARC_UA16":"c","R_SPARC_UA32":"c","R_SPARC_UA64":"c","R_SPARC_WDISP16":"c","R_SPARC_WDISP19":"c","R_SPARC_WDISP22":"c","R_SPARC_WDISP30":"c","R_SPARC_WPLT30":"c","R_SYM32":"f","R_SYM64":"f","R_TYPE32":"f","R_TYPE64":"f","R_X86_64":"t","R_X86_64.GoString":"m","R_X86_64.String":"m","R_X86_64_16":"c","R_X86_64_32":"c","R_X86_64_32S":"c","R_X86_64_64":"c","R_X86_64_8":"c","R_X86_64_COPY":"c","R_X86_64_DTPMOD64":"c","R_X86_64_DTPOFF32":"c","R_X86_64_DTPOFF64":"c","R_X86_64_GLOB_DAT":"c","R_X86_64_GOT32":"c","R_X86_64_GOT64":"c","R_X86_64_GOTOFF64":"c","R_X86_64_GOTPC32":"c","R_X86_64_GOTPC32_TLSDESC":"c","R_X86_64_GOTPC64":"c","R_X86_64_GOTPCREL":"c","R_X86_64_GOTPCREL64":"c","R_X86_64_GOTPCRELX":"c","R_X86_64_GOTPLT64":"c","R_X86_64_GOTTPOFF":"c","R_X86_64_IRELATIVE":"c","R_X86_64_JMP_SLOT":"c","R_X86_64_NONE":"c","R_X86_64_PC16":"c","R_X86_64_PC32":"c","R_X86_64_PC32_BND":"c","R_X86_64_PC64":"c","R_X86_64_PC8":"c","R_X86_64_PLT32":"c","R_X86_64_PLT32_BND":"c","R_X86_64_PLTOFF64":"c","R_X86_64_RELATIVE":"c","R_X86_64_RELATIVE64":"c","R_X86_64_REX_GOTPCRELX":"c","R_X86_64_SIZE32":"c","R_X86_64_SIZE64":"c","R_X86_64_TLSDESC":"c","R_X86_64_TLSDESC_CALL":"c","R_X86_64_TLSGD":"c","R_X86_64_TLSLD":"c","R_X86_64_TPOFF32":"c","R_X86_64_TPOFF64":"c","Rel32":"t","Rel64":"t","Rela32":"t","Rela64":"t","SHF_ALLOC":"c","SHF_COMPRESSED":"c","SHF_EXECINSTR":"c","SHF_GROUP":"c","SHF_INFO_LINK":"c","SHF_LINK_ORDER":"c","SHF_MASKOS":"c","SHF_MASKPROC":"c","SHF_MERGE":"c","SHF_OS_NONCONFORMING":"c","SHF_STRINGS":"c","SHF_TLS":"c","SHF_WRITE":"c","SHN_ABS":"c","SHN_COMMON":"c","SHN_HIOS":"c","SHN_HIPROC":"c","SHN_HIRESERVE":"c","SHN_LOOS":"c","SHN_LOPROC":"c","SHN_LORESERVE":"c","SHN_UNDEF":"c","SHN_XINDEX":"c","SHT_DYNAMIC":"c","SHT_DYNSYM":"c","SHT_FINI_ARRAY":"c","SHT_GNU_ATTRIBUTES":"c","SHT_GNU_HASH":"c","SHT_GNU_LIBLIST":"c","SHT_GNU_VERDEF":"c","SHT_GNU_VERNEED":"c","SHT_GNU_VERSYM":"c","SHT_GROUP":"c","SHT_HASH":"c","SHT_HIOS":"c","SHT_HIPROC":"c","SHT_HIUSER":"c","SHT_INIT_ARRAY":"c","SHT_LOOS":"c","SHT_LOPROC":"c","SHT_LOUSER":"c","SHT_MIPS_ABIFLAGS":"c","SHT_NOBITS":"c","SHT_NOTE":"c","SHT_NULL":"c","SHT_PREINIT_ARRAY":"c","SHT_PROGBITS":"c","SHT_REL":"c","SHT_RELA":"c","SHT_RISCV_ATTRIBUTES":"c","SHT_SHLIB":"c","SHT_STRTAB":"c","SHT_SYMTAB":"c","SHT_SYMTAB_SHNDX":"c","STB_GLOBAL":"c","STB_HIOS":"c","STB_HIPROC":"c","STB_LOCAL":"c","STB_LOOS":"c","STB_LOPROC":"c","STB_WEAK":"c","STT_COMMON":"c","STT_FILE":"c","STT_FUNC":"c","STT_GNU_IFUNC":"c","STT_HIOS":"c","STT_HIPROC":"c","STT_LOOS":"c","STT_LOPROC":"c","STT_NOTYPE":"c","STT_OBJECT":"c","STT_RELC":"c","STT_SECTION":"c","STT_SRELC":"c","STT_TLS":"c","STV_DEFAULT":"c","STV_HIDDEN":"c","STV_INTERNAL":"c","STV_PROTECTED":"c","ST_BIND":"f","ST_INFO":"f","ST_TYPE":"f","ST_VISIBILITY":"f","Section":"t","Section.Data":"m","Section.Open":"m","Section32":"t","Section64":"t","SectionFlag":"t","SectionFlag.GoString":"m","SectionFlag.String":"m","SectionHeader":"t","SectionIndex":"t","SectionIndex.GoString":"m","SectionIndex.String":"m","SectionType":"t","SectionType.GoString":"m","SectionType.String":"m","Sym32":"t","Sym32Size":"c","Sym64":"t","Sym64Size":"c","SymBind":"t","SymBind.GoString":"m","SymBind.String":"m","SymType":"t","SymType.GoString":"m","SymType.String":"m","SymVis":"t","SymVis.GoString":"m","SymVis.String":"m","Symbol":"t","Type":"t","Type.GoString":"m","Type.String":"m","VER_FLG_BASE":"c","VER_FLG_INFO":"c","VER_FLG_WEAK":"c","Version":"t","Version.GoString":"m","Version.String":"m","VersionIndex":"t","VersionIndex.Index":"m","VersionIndex.IsHidden":"m"}},"debug/gosym":{"path":"debug/gosym","name":"gosym","symbols":{"DecodingError":"t","DecodingError.Error":"m","Func":"t","LineTable":"t","LineTable.LineToPC":"m","LineTable.PCToLine":"m","NewLineTable":"f","NewTable":"f","Obj":"t","Sym":"t","Sym.BaseName":"m","Sym.PackageName":"m","Sym.ReceiverName":"m","Sym.Static":"m","Table":"t","Table.LineToPC":"m","Table.LookupFunc":"m","Table.LookupSym":"m","Table.PCToFunc":"m","Table.PCToLine":"m","Table.SymByAddr":"m","UnknownFileError":"t","UnknownFileError.Error":"m","UnknownLineError":"t","UnknownLineError.Error":"m"}},"debug/macho":{"path":"debug/macho","name":"macho","symbols":{"ARM64_RELOC_ADDEND":"c","ARM64_RELOC_BRANCH26":"c","ARM64_RELOC_GOT_LOAD_PAGE21":"c","ARM64_RELOC_GOT_LOAD_PAGEOFF12":"c","ARM64_RELOC_PAGE21":"c","ARM64_RELOC_PAGEOFF12":"c","ARM64_RELOC_POINTER_TO_GOT":"c","ARM64_RELOC_SUBTRACTOR":"c","ARM64_RELOC_TLVP_LOAD_PAGE21":"c","ARM64_RELOC_TLVP_LOAD_PAGEOFF12":"c","ARM64_RELOC_UNSIGNED":"c","ARM_RELOC_BR24":"c","ARM_RELOC_HALF":"c","ARM_RELOC_HALF_SECTDIFF":"c","ARM_RELOC_LOCAL_SECTDIFF":"c","ARM_RELOC_PAIR":"c","ARM_RELOC_PB_LA_PTR":"c","ARM_RELOC_SECTDIFF":"c","ARM_RELOC_VANILLA":"c","ARM_THUMB_32BIT_BRANCH":"c","ARM_THUMB_RELOC_BR22":"c","Cpu":"t","Cpu.GoString":"m","Cpu.String":"m","Cpu386":"c","CpuAmd64":"c","CpuArm":"c","CpuArm64":"c","CpuPpc":"c","CpuPpc64":"c","Dylib":"t","DylibCmd":"t","Dysymtab":"t","DysymtabCmd":"t","ErrNotFat":"v","FatArch":"t","FatArchHeader":"t","FatFile":"t","FatFile.Close":"m","File":"t","File.Close":"m","File.DWARF":"m","File.ImportedLibraries":"m","File.ImportedSymbols":"m","File.Section":"m","File.Segment":"m","FileHeader":"t","FlagAllModsBound":"c","FlagAllowStackExecution":"c","FlagAppExtensionSafe":"c","FlagBindAtLoad":"c","FlagBindsToWeak":"c","FlagCanonical":"c","FlagDeadStrippableDylib":"c","FlagDyldLink":"c","FlagForceFlat":"c","FlagHasTLVDescriptors":"c","FlagIncrLink":"c","FlagLazyInit":"c","FlagNoFixPrebinding":"c","FlagNoHeapExecution":"c","FlagNoMultiDefs":"c","FlagNoReexportedDylibs":"c","FlagNoUndefs":"c","FlagPIE":"c","FlagPrebindable":"c","FlagPrebound":"c","FlagRootSafe":"c","FlagSetuidSafe":"c","FlagSplitSegs":"c","FlagSubsectionsViaSymbols":"c","FlagTwoLevel":"c","FlagWeakDefines":"c","FormatError":"t","FormatError.Error":"m","GENERIC_RELOC_LOCAL_SECTDIFF":"c","GENERIC_RELOC_PAIR":"c","GENERIC_RELOC_PB_LA_PTR":"c","GENERIC_RELOC_SECTDIFF":"c","GENERIC_RELOC_TLV":"c","GENERIC_RELOC_VANILLA":"c","Load":"t","LoadBytes":"t","LoadBytes.Raw":"m","LoadCmd":"t","LoadCmd.GoString":"m","LoadCmd.String":"m","LoadCmdDylib":"c","LoadCmdDylinker":"c","LoadCmdDysymtab":"c","LoadCmdRpath":"c","LoadCmdSegment":"c","LoadCmdSegment64":"c","LoadCmdSymtab":"c","LoadCmdThread":"c","LoadCmdUnixThread":"c","Magic32":"c","Magic64":"c","MagicFat":"c","NewFatFile":"f","NewFile":"f","Nlist32":"t","Nlist64":"t","Open":"f","OpenFat":"f","Regs386":"t","RegsAMD64":"t","Reloc":"t","RelocTypeARM":"t","RelocTypeARM.GoString":"m","RelocTypeARM.String":"m","RelocTypeARM64":"t","RelocTypeARM64.GoString":"m","RelocTypeARM64.String":"m","RelocTypeGeneric":"t","RelocTypeGeneric.GoString":"m","RelocTypeGeneric.String":"m","RelocTypeX86_64":"t","RelocTypeX86_64.GoString":"m","RelocTypeX86_64.String":"m","Rpath":"t","RpathCmd":"t","Section":"t","Section.Data":"m","Section.Open":"m","Section32":"t","Section64":"t","SectionHeader":"t","Segment":"t","Segment.Data":"m","Segment.Open":"m","Segment32":"t","Segment64":"t","SegmentHeader":"t","Symbol":"t","Symtab":"t","SymtabCmd":"t","Thread":"t","Type":"t","Type.GoString":"m","Type.String":"m","TypeBundle":"c","TypeDylib":"c","TypeExec":"c","TypeObj":"c","X86_64_RELOC_BRANCH":"c","X86_64_RELOC_GOT":"c","X86_64_RELOC_GOT_LOAD":"c","X86_64_RELOC_SIGNED":"c","X86_64_RELOC_SIGNED_1":"c","X86_64_RELOC_SIGNED_2":"c","X86_64_RELOC_SIGNED_4":"c","X86_64_RELOC_SUBTRACTOR":"c","X86_64_RELOC_TLV":"c","X86_64_RELOC_UNSIGNED":"c"}},"debug/pe":{"path":"debug/pe","name":"pe","symbols":{"COFFSymbol":"t","COFFSymbol.FullName":"m","COFFSymbolAuxFormat5":"t","COFFSymbolSize":"c","DataDirectory":"t","File":"t","File.COFFSymbolReadSectionDefAux":"m","File.Close":"m","File.DWARF":"m","File.ImportedLibraries":"m","File.ImportedSymbols":"m","File.Section":"m","FileHeader":"t","FormatError":"t","FormatError.Error":"m","IMAGE_COMDAT_SELECT_ANY":"c","IMAGE_COMDAT_SELECT_ASSOCIATIVE":"c","IMAGE_COMDAT_SELECT_EXACT_MATCH":"c","IMAGE_COMDAT_SELECT_LARGEST":"c","IMAGE_COMDAT_SELECT_NODUPLICATES":"c","IMAGE_COMDAT_SELECT_SAME_SIZE":"c","IMAGE_DIRECTORY_ENTRY_ARCHITECTURE":"c","IMAGE_DIRECTORY_ENTRY_BASERELOC":"c","IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT":"c","IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR":"c","IMAGE_DIRECTORY_ENTRY_DEBUG":"c","IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT":"c","IMAGE_DIRECTORY_ENTRY_EXCEPTION":"c","IMAGE_DIRECTORY_ENTRY_EXPORT":"c","IMAGE_DIRECTORY_ENTRY_GLOBALPTR":"c","IMAGE_DIRECTORY_ENTRY_IAT":"c","IMAGE_DIRECTORY_ENTRY_IMPORT":"c","IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG":"c","IMAGE_DIRECTORY_ENTRY_RESOURCE":"c","IMAGE_DIRECTORY_ENTRY_SECURITY":"c","IMAGE_DIRECTORY_ENTRY_TLS":"c","IMAGE_DLLCHARACTERISTICS_APPCONTAINER":"c","IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE":"c","IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY":"c","IMAGE_DLLCHARACTERISTICS_GUARD_CF":"c","IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA":"c","IMAGE_DLLCHARACTERISTICS_NO_BIND":"c","IMAGE_DLLCHARACTERISTICS_NO_ISOLATION":"c","IMAGE_DLLCHARACTERISTICS_NO_SEH":"c","IMAGE_DLLCHARACTERISTICS_NX_COMPAT":"c","IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE":"c","IMAGE_DLLCHARACTERISTICS_WDM_DRIVER":"c","IMAGE_FILE_32BIT_MACHINE":"c","IMAGE_FILE_AGGRESIVE_WS_TRIM":"c","IMAGE_FILE_BYTES_REVERSED_HI":"c","IMAGE_FILE_BYTES_REVERSED_LO":"c","IMAGE_FILE_DEBUG_STRIPPED":"c","IMAGE_FILE_DLL":"c","IMAGE_FILE_EXECUTABLE_IMAGE":"c","IMAGE_FILE_LARGE_ADDRESS_AWARE":"c","IMAGE_FILE_LINE_NUMS_STRIPPED":"c","IMAGE_FILE_LOCAL_SYMS_STRIPPED":"c","IMAGE_FILE_MACHINE_AM33":"c","IMAGE_FILE_MACHINE_AMD64":"c","IMAGE_FILE_MACHINE_ARM":"c","IMAGE_FILE_MACHINE_ARM64":"c","IMAGE_FILE_MACHINE_ARMNT":"c","IMAGE_FILE_MACHINE_EBC":"c","IMAGE_FILE_MACHINE_I386":"c","IMAGE_FILE_MACHINE_IA64":"c","IMAGE_FILE_MACHINE_LOONGARCH32":"c","IMAGE_FILE_MACHINE_LOONGARCH64":"c","IMAGE_FILE_MACHINE_M32R":"c","IMAGE_FILE_MACHINE_MIPS16":"c","IMAGE_FILE_MACHINE_MIPSFPU":"c","IMAGE_FILE_MACHINE_MIPSFPU16":"c","IMAGE_FILE_MACHINE_POWERPC":"c","IMAGE_FILE_MACHINE_POWERPCFP":"c","IMAGE_FILE_MACHINE_R4000":"c","IMAGE_FILE_MACHINE_RISCV128":"c","IMAGE_FILE_MACHINE_RISCV32":"c","IMAGE_FILE_MACHINE_RISCV64":"c","IMAGE_FILE_MACHINE_SH3":"c","IMAGE_FILE_MACHINE_SH3DSP":"c","IMAGE_FILE_MACHINE_SH4":"c","IMAGE_FILE_MACHINE_SH5":"c","IMAGE_FILE_MACHINE_THUMB":"c","IMAGE_FILE_MACHINE_UNKNOWN":"c","IMAGE_FILE_MACHINE_WCEMIPSV2":"c","IMAGE_FILE_NET_RUN_FROM_SWAP":"c","IMAGE_FILE_RELOCS_STRIPPED":"c","IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP":"c","IMAGE_FILE_SYSTEM":"c","IMAGE_FILE_UP_SYSTEM_ONLY":"c","IMAGE_SCN_CNT_CODE":"c","IMAGE_SCN_CNT_INITIALIZED_DATA":"c","IMAGE_SCN_CNT_UNINITIALIZED_DATA":"c","IMAGE_SCN_LNK_COMDAT":"c","IMAGE_SCN_MEM_DISCARDABLE":"c","IMAGE_SCN_MEM_EXECUTE":"c","IMAGE_SCN_MEM_READ":"c","IMAGE_SCN_MEM_WRITE":"c","IMAGE_SUBSYSTEM_EFI_APPLICATION":"c","IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER":"c","IMAGE_SUBSYSTEM_EFI_ROM":"c","IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER":"c","IMAGE_SUBSYSTEM_NATIVE":"c","IMAGE_SUBSYSTEM_NATIVE_WINDOWS":"c","IMAGE_SUBSYSTEM_OS2_CUI":"c","IMAGE_SUBSYSTEM_POSIX_CUI":"c","IMAGE_SUBSYSTEM_UNKNOWN":"c","IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION":"c","IMAGE_SUBSYSTEM_WINDOWS_CE_GUI":"c","IMAGE_SUBSYSTEM_WINDOWS_CUI":"c","IMAGE_SUBSYSTEM_WINDOWS_GUI":"c","IMAGE_SUBSYSTEM_XBOX":"c","ImportDirectory":"t","NewFile":"f","Open":"f","OptionalHeader32":"t","OptionalHeader64":"t","Reloc":"t","Section":"t","Section.Data":"m","Section.Open":"m","SectionHeader":"t","SectionHeader32":"t","StringTable":"t","StringTable.String":"m","Symbol":"t"}},"debug/plan9obj":{"path":"debug/plan9obj","name":"plan9obj","symbols":{"ErrNoSymbols":"v","File":"t","File.Close":"m","File.Section":"m","File.Symbols":"m","FileHeader":"t","Magic386":"c","Magic64":"c","MagicAMD64":"c","MagicARM":"c","NewFile":"f","Open":"f","Section":"t","Section.Data":"m","Section.Open":"m","SectionHeader":"t","Sym":"t"}},"embed":{"path":"embed","name":"embed","symbols":{"FS":"t","FS.Open":"m","FS.ReadDir":"m","FS.ReadFile":"m"}},"encoding":{"path":"encoding","name":"encoding","symbols":{"BinaryAppender":"t","BinaryMarshaler":"t","BinaryUnmarshaler":"t","TextAppender":"t","TextMarshaler":"t","TextUnmarshaler":"t"}},"encoding/ascii85":{"path":"encoding/ascii85","name":"ascii85","symbols":{"CorruptInputError":"t","CorruptInputError.Error":"m","Decode":"f","Encode":"f","MaxEncodedLen":"f","NewDecoder":"f","NewEncoder":"f"}},"encoding/asn1":{"path":"encoding/asn1","name":"asn1","symbols":{"BitString":"t","BitString.At":"m","BitString.RightAlign":"m","ClassApplication":"c","ClassContextSpecific":"c","ClassPrivate":"c","ClassUniversal":"c","Enumerated":"t","Flag":"t","Marshal":"f","MarshalWithParams":"f","NullBytes":"v","NullRawValue":"v","ObjectIdentifier":"t","ObjectIdentifier.Equal":"m","ObjectIdentifier.String":"m","RawContent":"t","RawValue":"t","StructuralError":"t","StructuralError.Error":"m","SyntaxError":"t","SyntaxError.Error":"m","TagBMPString":"c","TagBitString":"c","TagBoolean":"c","TagEnum":"c","TagGeneralString":"c","TagGeneralizedTime":"c","TagIA5String":"c","TagInteger":"c","TagNull":"c","TagNumericString":"c","TagOID":"c","TagOctetString":"c","TagPrintableString":"c","TagSequence":"c","TagSet":"c","TagT61String":"c","TagUTCTime":"c","TagUTF8String":"c","Unmarshal":"f","UnmarshalWithParams":"f"}},"encoding/base32":{"path":"encoding/base32","name":"base32","symbols":{"CorruptInputError":"t","CorruptInputError.Error":"m","Encoding":"t","Encoding.AppendDecode":"m","Encoding.AppendEncode":"m","Encoding.Decode":"m","Encoding.DecodeString":"m","Encoding.DecodedLen":"m","Encoding.Encode":"m","Encoding.EncodeToString":"m","Encoding.EncodedLen":"m","Encoding.WithPadding":"m","HexEncoding":"v","NewDecoder":"f","NewEncoder":"f","NewEncoding":"f","NoPadding":"c","StdEncoding":"v","StdPadding":"c"}},"encoding/base64":{"path":"encoding/base64","name":"base64","symbols":{"CorruptInputError":"t","CorruptInputError.Error":"m","Encoding":"t","Encoding.AppendDecode":"m","Encoding.AppendEncode":"m","Encoding.Decode":"m","Encoding.DecodeString":"m","Encoding.DecodedLen":"m","Encoding.Encode":"m","Encoding.EncodeToString":"m","Encoding.EncodedLen":"m","Encoding.Strict":"m","Encoding.WithPadding":"m","NewDecoder":"f","NewEncoder":"f","NewEncoding":"f","NoPadding":"c","RawStdEncoding":"v","RawURLEncoding":"v","StdEncoding":"v","StdPadding":"c","URLEncoding":"v"}},"encoding/binary":{"path":"encoding/binary","name":"binary","symbols":{"Append":"f","AppendByteOrder":"t","AppendUvarint":"f","AppendVarint":"f","BigEndian":"v","ByteOrder":"t","Decode":"f","Encode":"f","LittleEndian":"v","MaxVarintLen16":"c","MaxVarintLen32":"c","MaxVarintLen64":"c","NativeEndian":"v","PutUvarint":"f","PutVarint":"f","Read":"f","ReadUvarint":"f","ReadVarint":"f","Size":"f","Uvarint":"f","Varint":"f","Write":"f"}},"encoding/csv":{"path":"encoding/csv","name":"csv","symbols":{"ErrBareQuote":"v","ErrFieldCount":"v","ErrQuote":"v","ErrTrailingComma":"v","NewReader":"f","NewWriter":"f","ParseError":"t","ParseError.Error":"m","ParseError.Unwrap":"m","Reader":"t","Reader.FieldPos":"m","Reader.InputOffset":"m","Reader.Read":"m","Reader.ReadAll":"m","Writer":"t","Writer.Error":"m","Writer.Flush":"m","Writer.Write":"m","Writer.WriteAll":"m"}},"encoding/gob":{"path":"encoding/gob","name":"gob","symbols":{"CommonType":"t","Decoder":"t","Decoder.Decode":"m","Decoder.DecodeValue":"m","Encoder":"t","Encoder.Encode":"m","Encoder.EncodeValue":"m","GobDecoder":"t","GobEncoder":"t","NewDecoder":"f","NewEncoder":"f","Register":"f","RegisterName":"f"}},"encoding/hex":{"path":"encoding/hex","name":"hex","symbols":{"AppendDecode":"f","AppendEncode":"f","Decode":"f","DecodeString":"f","DecodedLen":"f","Dump":"f","Dumper":"f","Encode":"f","EncodeToString":"f","EncodedLen":"f","ErrLength":"v","InvalidByteError":"t","InvalidByteError.Error":"m","NewDecoder":"f","NewEncoder":"f"}},"encoding/json":{"path":"encoding/json","name":"json","symbols":{"Compact":"f","Decoder":"t","Decoder.Buffered":"m","Decoder.Decode":"m","Decoder.DisallowUnknownFields":"m","Decoder.InputOffset":"m","Decoder.More":"m","Decoder.Token":"m","Decoder.UseNumber":"m","Delim":"t","Delim.String":"m","Encoder":"t","Encoder.Encode":"m","Encoder.SetEscapeHTML":"m","Encoder.SetIndent":"m","HTMLEscape":"f","Indent":"f","InvalidUTF8Error":"t","InvalidUTF8Error.Error":"m","InvalidUnmarshalError":"t","InvalidUnmarshalError.Error":"m","Marshal":"f","MarshalIndent":"f","Marshaler":"t","MarshalerError":"t","MarshalerError.Error":"m","MarshalerError.Unwrap":"m","NewDecoder":"f","NewEncoder":"f","Number":"t","Number.Float64":"m","Number.Int64":"m","Number.String":"m","RawMessage":"t","RawMessage.MarshalJSON":"m","RawMessage.UnmarshalJSON":"m","SyntaxError":"t","SyntaxError.Error":"m","Token":"t","Unmarshal":"f","UnmarshalFieldError":"t","UnmarshalFieldError.Error":"m","UnmarshalTypeError":"t","UnmarshalTypeError.Error":"m","Unmarshaler":"t","UnsupportedTypeError":"t","UnsupportedTypeError.Error":"m","UnsupportedValueError":"t","UnsupportedValueError.Error":"m","Valid":"f"}},"encoding/pem":{"path":"encoding/pem","name":"pem","symbols":{"Block":"t","Decode":"f","Encode":"f","EncodeToMemory":"f"}},"encoding/xml":{"path":"encoding/xml","name":"xml","symbols":{"Attr":"t","CharData":"t","CharData.Copy":"m","Comment":"t","Comment.Copy":"m","CopyToken":"f","Decoder":"t","Decoder.Decode":"m","Decoder.DecodeElement":"m","Decoder.InputOffset":"m","Decoder.InputPos":"m","Decoder.RawToken":"m","Decoder.Skip":"m","Decoder.Token":"m","Directive":"t","Directive.Copy":"m","Encoder":"t","Encoder.Close":"m","Encoder.Encode":"m","Encoder.EncodeElement":"m","Encoder.EncodeToken":"m","Encoder.Flush":"m","Encoder.Indent":"m","EndElement":"t","Escape":"f","EscapeText":"f","HTMLAutoClose":"v","HTMLEntity":"v","Header":"c","Marshal":"f","MarshalIndent":"f","Marshaler":"t","MarshalerAttr":"t","Name":"t","NewDecoder":"f","NewEncoder":"f","NewTokenDecoder":"f","ProcInst":"t","ProcInst.Copy":"m","StartElement":"t","StartElement.Copy":"m","StartElement.End":"m","SyntaxError":"t","SyntaxError.Error":"m","TagPathError":"t","TagPathError.Error":"m","Token":"t","TokenReader":"t","Unmarshal":"f","UnmarshalError":"t","UnmarshalError.Error":"m","Unmarshaler":"t","UnmarshalerAttr":"t","UnsupportedTypeError":"t","UnsupportedTypeError.Error":"m"}},"errors":{"path":"errors","name":"errors","symbols":{"As":"f","AsType":"f","ErrUnsupported":"v","Is":"f","Join":"f","New":"f","Unwrap":"f"}},"expvar":{"path":"expvar","name":"expvar","symbols":{"Do":"f","Float":"t","Float.Add":"m","Float.Set":"m","Float.String":"m","Float.Value":"m","Func":"t","Func.String":"m","Func.Value":"m","Get":"f","Handler":"f","Int":"t","Int.Add":"m","Int.Set":"m","Int.String":"m","Int.Value":"m","KeyValue":"t","Map":"t","Map.Add":"m","Map.AddFloat":"m","Map.Delete":"m","Map.Do":"m","Map.Get":"m","Map.Init":"m","Map.Set":"m","Map.String":"m","NewFloat":"f","NewInt":"f","NewMap":"f","NewString":"f","Publish":"f","String":"t","String.Set":"m","String.String":"m","String.Value":"m","Var":"t"}},"flag":{"path":"flag","name":"flag","symbols":{"Arg":"f","Args":"f","Bool":"f","BoolFunc":"f","BoolVar":"f","CommandLine":"v","ContinueOnError":"c","Duration":"f","DurationVar":"f","ErrHelp":"v","ErrorHandling":"t","ExitOnError":"c","Flag":"t","FlagSet":"t","FlagSet.Arg":"m","FlagSet.Args":"m","FlagSet.Bool":"m","FlagSet.BoolFunc":"m","FlagSet.BoolVar":"m","FlagSet.Duration":"m","FlagSet.DurationVar":"m","FlagSet.ErrorHandling":"m","FlagSet.Float64":"m","FlagSet.Float64Var":"m","FlagSet.Func":"m","FlagSet.Init":"m","FlagSet.Int":"m","FlagSet.Int64":"m","FlagSet.Int64Var":"m","FlagSet.IntVar":"m","FlagSet.Lookup":"m","FlagSet.NArg":"m","FlagSet.NFlag":"m","FlagSet.Name":"m","FlagSet.Output":"m","FlagSet.Parse":"m","FlagSet.Parsed":"m","FlagSet.PrintDefaults":"m","FlagSet.Set":"m","FlagSet.SetOutput":"m","FlagSet.String":"m","FlagSet.StringVar":"m","FlagSet.TextVar":"m","FlagSet.Uint":"m","FlagSet.Uint64":"m","FlagSet.Uint64Var":"m","FlagSet.UintVar":"m","FlagSet.Var":"m","FlagSet.Visit":"m","FlagSet.VisitAll":"m","Float64":"f","Float64Var":"f","Func":"f","Getter":"t","Int":"f","Int64":"f","Int64Var":"f","IntVar":"f","Lookup":"f","NArg":"f","NFlag":"f","NewFlagSet":"f","PanicOnError":"c","Parse":"f","Parsed":"f","PrintDefaults":"f","Set":"f","String":"f","StringVar":"f","TextVar":"f","Uint":"f","Uint64":"f","Uint64Var":"f","UintVar":"f","UnquoteUsage":"f","Usage":"v","Value":"t","Var":"f","Visit":"f","VisitAll":"f"}},"fmt":{"path":"fmt","name":"fmt","symbols":{"Append":"f","Appendf":"f","Appendln":"f","Errorf":"f","FormatString":"f","Formatter":"t","Fprint":"f","Fprintf":"f","Fprintln":"f","Fscan":"f","Fscanf":"f","Fscanln":"f","GoStringer":"t","Print":"f","Printf":"f","Println":"f","Scan":"f","ScanState":"t","Scanf":"f","Scanln":"f","Scanner":"t","Sprint":"f","Sprintf":"f","Sprintln":"f","Sscan":"f","Sscanf":"f","Sscanln":"f","State":"t","Stringer":"t"}},"go/ast":{"path":"go/ast","name":"ast","symbols":{"ArrayType":"t","ArrayType.End":"m","ArrayType.Pos":"m","AssignStmt":"t","AssignStmt.End":"m","AssignStmt.Pos":"m","Bad":"c","BadDecl":"t","BadDecl.End":"m","BadDecl.Pos":"m","BadExpr":"t","BadExpr.End":"m","BadExpr.Pos":"m","BadStmt":"t","BadStmt.End":"m","BadStmt.Pos":"m","BasicLit":"t","BasicLit.End":"m","BasicLit.Pos":"m","BinaryExpr":"t","BinaryExpr.End":"m","BinaryExpr.Pos":"m","BlockStmt":"t","BlockStmt.End":"m","BlockStmt.Pos":"m","BranchStmt":"t","BranchStmt.End":"m","BranchStmt.Pos":"m","CallExpr":"t","CallExpr.End":"m","CallExpr.Pos":"m","CaseClause":"t","CaseClause.End":"m","CaseClause.Pos":"m","ChanDir":"t","ChanType":"t","ChanType.End":"m","ChanType.Pos":"m","CommClause":"t","CommClause.End":"m","CommClause.Pos":"m","Comment":"t","Comment.End":"m","Comment.Pos":"m","CommentGroup":"t","CommentGroup.End":"m","CommentGroup.Pos":"m","CommentGroup.Text":"m","CommentMap":"t","CommentMap.Comments":"m","CommentMap.Filter":"m","CommentMap.String":"m","CommentMap.Update":"m","CompositeLit":"t","CompositeLit.End":"m","CompositeLit.Pos":"m","Con":"c","Decl":"t","DeclStmt":"t","DeclStmt.End":"m","DeclStmt.Pos":"m","DeferStmt":"t","DeferStmt.End":"m","DeferStmt.Pos":"m","Directive":"t","Directive.End":"m","Directive.ParseArgs":"m","Directive.Pos":"m","DirectiveArg":"t","Ellipsis":"t","Ellipsis.End":"m","Ellipsis.Pos":"m","EmptyStmt":"t","EmptyStmt.End":"m","EmptyStmt.Pos":"m","Expr":"t","ExprStmt":"t","ExprStmt.End":"m","ExprStmt.Pos":"m","Field":"t","Field.End":"m","Field.Pos":"m","FieldFilter":"t","FieldList":"t","FieldList.End":"m","FieldList.NumFields":"m","FieldList.Pos":"m","File":"t","File.End":"m","File.Pos":"m","FileExports":"f","Filter":"t","FilterDecl":"f","FilterFile":"f","FilterFuncDuplicates":"c","FilterImportDuplicates":"c","FilterPackage":"f","FilterUnassociatedComments":"c","ForStmt":"t","ForStmt.End":"m","ForStmt.Pos":"m","Fprint":"f","Fun":"c","FuncDecl":"t","FuncDecl.End":"m","FuncDecl.Pos":"m","FuncLit":"t","FuncLit.End":"m","FuncLit.Pos":"m","FuncType":"t","FuncType.End":"m","FuncType.Pos":"m","GenDecl":"t","GenDecl.End":"m","GenDecl.Pos":"m","GoStmt":"t","GoStmt.End":"m","GoStmt.Pos":"m","Ident":"t","Ident.End":"m","Ident.IsExported":"m","Ident.Pos":"m","Ident.String":"m","IfStmt":"t","IfStmt.End":"m","IfStmt.Pos":"m","ImportSpec":"t","ImportSpec.End":"m","ImportSpec.Pos":"m","Importer":"t","IncDecStmt":"t","IncDecStmt.End":"m","IncDecStmt.Pos":"m","IndexExpr":"t","IndexExpr.End":"m","IndexExpr.Pos":"m","IndexListExpr":"t","IndexListExpr.End":"m","IndexListExpr.Pos":"m","Inspect":"f","InterfaceType":"t","InterfaceType.End":"m","InterfaceType.Pos":"m","IsExported":"f","IsGenerated":"f","KeyValueExpr":"t","KeyValueExpr.End":"m","KeyValueExpr.Pos":"m","LabeledStmt":"t","LabeledStmt.End":"m","LabeledStmt.Pos":"m","Lbl":"c","MapType":"t","MapType.End":"m","MapType.Pos":"m","MergeMode":"t","MergePackageFiles":"f","NewCommentMap":"f","NewIdent":"f","NewObj":"f","NewPackage":"f","NewScope":"f","Node":"t","NotNilFilter":"f","ObjKind":"t","ObjKind.String":"m","Object":"t","Object.Pos":"m","Package":"t","Package.End":"m","Package.Pos":"m","PackageExports":"f","ParenExpr":"t","ParenExpr.End":"m","ParenExpr.Pos":"m","ParseDirective":"f","Pkg":"c","Preorder":"f","PreorderStack":"f","Print":"f","RECV":"c","RangeStmt":"t","RangeStmt.End":"m","RangeStmt.Pos":"m","ReturnStmt":"t","ReturnStmt.End":"m","ReturnStmt.Pos":"m","SEND":"c","Scope":"t","Scope.Insert":"m","Scope.Lookup":"m","Scope.String":"m","SelectStmt":"t","SelectStmt.End":"m","SelectStmt.Pos":"m","SelectorExpr":"t","SelectorExpr.End":"m","SelectorExpr.Pos":"m","SendStmt":"t","SendStmt.End":"m","SendStmt.Pos":"m","SliceExpr":"t","SliceExpr.End":"m","SliceExpr.Pos":"m","SortImports":"f","Spec":"t","StarExpr":"t","StarExpr.End":"m","StarExpr.Pos":"m","Stmt":"t","StructType":"t","StructType.End":"m","StructType.Pos":"m","SwitchStmt":"t","SwitchStmt.End":"m","SwitchStmt.Pos":"m","Typ":"c","TypeAssertExpr":"t","TypeAssertExpr.End":"m","TypeAssertExpr.Pos":"m","TypeSpec":"t","TypeSpec.End":"m","TypeSpec.Pos":"m","TypeSwitchStmt":"t","TypeSwitchStmt.End":"m","TypeSwitchStmt.Pos":"m","UnaryExpr":"t","UnaryExpr.End":"m","UnaryExpr.Pos":"m","Unparen":"f","ValueSpec":"t","ValueSpec.End":"m","ValueSpec.Pos":"m","Var":"c","Visitor":"t","Walk":"f"}},"go/build":{"path":"go/build","name":"build","symbols":{"AllowBinary":"c","ArchChar":"f","Context":"t","Context.Import":"m","Context.ImportDir":"m","Context.MatchFile":"m","Context.SrcDirs":"m","Default":"v","Directive":"t","FindOnly":"c","IgnoreVendor":"c","Import":"f","ImportComment":"c","ImportDir":"f","ImportMode":"t","IsLocalImport":"f","MultiplePackageError":"t","MultiplePackageError.Error":"m","NoGoError":"t","NoGoError.Error":"m","Package":"t","Package.IsCommand":"m","ToolDir":"v"}},"go/build/constraint":{"path":"go/build/constraint","name":"constraint","symbols":{"AndExpr":"t","AndExpr.Eval":"m","AndExpr.String":"m","Expr":"t","GoVersion":"f","IsGoBuild":"f","IsPlusBuild":"f","NotExpr":"t","NotExpr.Eval":"m","NotExpr.String":"m","OrExpr":"t","OrExpr.Eval":"m","OrExpr.String":"m","Parse":"f","PlusBuildLines":"f","SyntaxError":"t","SyntaxError.Error":"m","TagExpr":"t","TagExpr.Eval":"m","TagExpr.String":"m"}},"go/constant":{"path":"go/constant","name":"constant","symbols":{"BinaryOp":"f","BitLen":"f","Bool":"c","BoolVal":"f","Bytes":"f","Compare":"f","Complex":"c","Denom":"f","Float":"c","Float32Val":"f","Float64Val":"f","Imag":"f","Int":"c","Int64Val":"f","Kind":"t","Kind.String":"m","Make":"f","MakeBool":"f","MakeFloat64":"f","MakeFromBytes":"f","MakeFromLiteral":"f","MakeImag":"f","MakeInt64":"f","MakeString":"f","MakeUint64":"f","MakeUnknown":"f","Num":"f","Real":"f","Shift":"f","Sign":"f","String":"c","StringVal":"f","ToComplex":"f","ToFloat":"f","ToInt":"f","Uint64Val":"f","UnaryOp":"f","Unknown":"c","Val":"f","Value":"t"}},"go/doc":{"path":"go/doc","name":"doc","symbols":{"AllDecls":"c","AllMethods":"c","Example":"t","Examples":"f","Filter":"t","Func":"t","IllegalPrefixes":"v","IsPredeclared":"f","Mode":"t","New":"f","NewFromFiles":"f","Note":"t","Package":"t","Package.Filter":"m","Package.HTML":"m","Package.Markdown":"m","Package.Parser":"m","Package.Printer":"m","Package.Synopsis":"m","Package.Text":"m","PreserveAST":"c","Synopsis":"f","ToHTML":"f","ToText":"f","Type":"t","Value":"t"}},"go/doc/comment":{"path":"go/doc/comment","name":"comment","symbols":{"Block":"t","Code":"t","DefaultLookupPackage":"f","Doc":"t","DocLink":"t","DocLink.DefaultURL":"m","Heading":"t","Heading.DefaultID":"m","Italic":"t","Link":"t","LinkDef":"t","List":"t","List.BlankBefore":"m","List.BlankBetween":"m","ListItem":"t","Paragraph":"t","Parser":"t","Parser.Parse":"m","Plain":"t","Printer":"t","Printer.Comment":"m","Printer.HTML":"m","Printer.Markdown":"m","Printer.Text":"m","Text":"t"}},"go/format":{"path":"go/format","name":"format","symbols":{"Node":"f","Source":"f"}},"go/importer":{"path":"go/importer","name":"importer","symbols":{"Default":"f","For":"f","ForCompiler":"f","Lookup":"t"}},"go/parser":{"path":"go/parser","name":"parser","symbols":{"AllErrors":"c","DeclarationErrors":"c","ImportsOnly":"c","Mode":"t","PackageClauseOnly":"c","ParseComments":"c","ParseDir":"f","ParseExpr":"f","ParseExprFrom":"f","ParseFile":"f","SkipObjectResolution":"c","SpuriousErrors":"c","Trace":"c"}},"go/printer":{"path":"go/printer","name":"printer","symbols":{"CommentedNode":"t","Config":"t","Config.Fprint":"m","Fprint":"f","Mode":"t","RawFormat":"c","SourcePos":"c","TabIndent":"c","UseSpaces":"c"}},"go/scanner":{"path":"go/scanner","name":"scanner","symbols":{"Error":"t","Error.Error":"m","ErrorHandler":"t","ErrorList":"t","ErrorList.Add":"m","ErrorList.Err":"m","ErrorList.Error":"m","ErrorList.Len":"m","ErrorList.Less":"m","ErrorList.RemoveMultiples":"m","ErrorList.Reset":"m","ErrorList.Sort":"m","ErrorList.Swap":"m","Mode":"t","PrintError":"f","ScanComments":"c","Scanner":"t","Scanner.Init":"m","Scanner.Scan":"m"}},"go/token":{"path":"go/token","name":"token","symbols":{"ADD":"c","ADD_ASSIGN":"c","AND":"c","AND_ASSIGN":"c","AND_NOT":"c","AND_NOT_ASSIGN":"c","ARROW":"c","ASSIGN":"c","BREAK":"c","CASE":"c","CHAN":"c","CHAR":"c","COLON":"c","COMMA":"c","COMMENT":"c","CONST":"c","CONTINUE":"c","DEC":"c","DEFAULT":"c","DEFER":"c","DEFINE":"c","ELLIPSIS":"c","ELSE":"c","EOF":"c","EQL":"c","FALLTHROUGH":"c","FLOAT":"c","FOR":"c","FUNC":"c","File":"t","File.AddLine":"m","File.AddLineColumnInfo":"m","File.AddLineInfo":"m","File.Base":"m","File.End":"m","File.Line":"m","File.LineCount":"m","File.LineStart":"m","File.Lines":"m","File.MergeLine":"m","File.Name":"m","File.Offset":"m","File.Pos":"m","File.Position":"m","File.PositionFor":"m","File.SetLines":"m","File.SetLinesForContent":"m","File.Size":"m","FileSet":"t","FileSet.AddExistingFiles":"m","FileSet.AddFile":"m","FileSet.Base":"m","FileSet.File":"m","FileSet.Iterate":"m","FileSet.Position":"m","FileSet.PositionFor":"m","FileSet.Read":"m","FileSet.RemoveFile":"m","FileSet.Write":"m","GEQ":"c","GO":"c","GOTO":"c","GTR":"c","HighestPrec":"c","IDENT":"c","IF":"c","ILLEGAL":"c","IMAG":"c","IMPORT":"c","INC":"c","INT":"c","INTERFACE":"c","IsExported":"f","IsIdentifier":"f","IsKeyword":"f","LAND":"c","LBRACE":"c","LBRACK":"c","LEQ":"c","LOR":"c","LPAREN":"c","LSS":"c","Lookup":"f","LowestPrec":"c","MAP":"c","MUL":"c","MUL_ASSIGN":"c","NEQ":"c","NOT":"c","NewFileSet":"f","NoPos":"c","OR":"c","OR_ASSIGN":"c","PACKAGE":"c","PERIOD":"c","Pos":"t","Pos.IsValid":"m","Position":"t","Position.IsValid":"m","Position.String":"m","QUO":"c","QUO_ASSIGN":"c","RANGE":"c","RBRACE":"c","RBRACK":"c","REM":"c","REM_ASSIGN":"c","RETURN":"c","RPAREN":"c","SELECT":"c","SEMICOLON":"c","SHL":"c","SHL_ASSIGN":"c","SHR":"c","SHR_ASSIGN":"c","STRING":"c","STRUCT":"c","SUB":"c","SUB_ASSIGN":"c","SWITCH":"c","TILDE":"c","TYPE":"c","Token":"t","Token.IsKeyword":"m","Token.IsLiteral":"m","Token.IsOperator":"m","Token.Precedence":"m","Token.String":"m","UnaryPrec":"c","VAR":"c","XOR":"c","XOR_ASSIGN":"c"}},"go/types":{"path":"go/types","name":"types","symbols":{"Alias":"t","Alias.Obj":"m","Alias.Origin":"m","Alias.Rhs":"m","Alias.SetTypeParams":"m","Alias.String":"m","Alias.TypeArgs":"m","Alias.TypeParams":"m","Alias.Underlying":"m","ArgumentError":"t","ArgumentError.Error":"m","ArgumentError.Unwrap":"m","Array":"t","Array.Elem":"m","Array.Len":"m","Array.String":"m","Array.Underlying":"m","AssertableTo":"f","AssignableTo":"f","Basic":"t","Basic.Info":"m","Basic.Kind":"m","Basic.Name":"m","Basic.String":"m","Basic.Underlying":"m","BasicInfo":"t","BasicKind":"t","Bool":"c","Builtin":"t","Builtin.String":"m","Byte":"c","Chan":"t","Chan.Dir":"m","Chan.Elem":"m","Chan.String":"m","Chan.Underlying":"m","ChanDir":"t","CheckExpr":"f","Checker":"t","Checker.Files":"m","Comparable":"f","Complex128":"c","Complex64":"c","Config":"t","Config.Check":"m","Const":"t","Const.String":"m","Const.Val":"m","Context":"t","ConvertibleTo":"f","DefPredeclaredTestFuncs":"f","Default":"f","Error":"t","Error.Error":"m","Eval":"f","ExprString":"f","FieldVal":"c","FieldVar":"c","Float32":"c","Float64":"c","Func":"t","Func.FullName":"m","Func.Origin":"m","Func.Pkg":"m","Func.Scope":"m","Func.Signature":"m","Func.String":"m","Id":"f","Identical":"f","IdenticalIgnoreTags":"f","Implements":"f","ImportMode":"t","Importer":"t","ImporterFrom":"t","Info":"t","Info.ObjectOf":"m","Info.PkgNameOf":"m","Info.TypeOf":"m","Initializer":"t","Initializer.String":"m","Instance":"t","Instantiate":"f","Int":"c","Int16":"c","Int32":"c","Int64":"c","Int8":"c","Interface":"t","Interface.Complete":"m","Interface.Embedded":"m","Interface.EmbeddedType":"m","Interface.EmbeddedTypes":"m","Interface.Empty":"m","Interface.ExplicitMethod":"m","Interface.ExplicitMethods":"m","Interface.IsComparable":"m","Interface.IsImplicit":"m","Interface.IsMethodSet":"m","Interface.MarkImplicit":"m","Interface.Method":"m","Interface.Methods":"m","Interface.NumEmbeddeds":"m","Interface.NumExplicitMethods":"m","Interface.NumMethods":"m","Interface.String":"m","Interface.Underlying":"m","Invalid":"c","IsBoolean":"c","IsComplex":"c","IsConstType":"c","IsFloat":"c","IsInteger":"c","IsInterface":"f","IsNumeric":"c","IsOrdered":"c","IsString":"c","IsUnsigned":"c","IsUntyped":"c","Label":"t","Label.String":"m","LocalVar":"c","LookupFieldOrMethod":"f","LookupSelection":"f","Map":"t","Map.Elem":"m","Map.Key":"m","Map.String":"m","Map.Underlying":"m","MethodExpr":"c","MethodSet":"t","MethodSet.At":"m","MethodSet.Len":"m","MethodSet.Lookup":"m","MethodSet.Methods":"m","MethodSet.String":"m","MethodVal":"c","MissingMethod":"f","Named":"t","Named.AddMethod":"m","Named.Method":"m","Named.Methods":"m","Named.NumMethods":"m","Named.Obj":"m","Named.Origin":"m","Named.SetTypeParams":"m","Named.SetUnderlying":"m","Named.String":"m","Named.TypeArgs":"m","Named.TypeParams":"m","Named.Underlying":"m","NewAlias":"f","NewArray":"f","NewChan":"f","NewChecker":"f","NewConst":"f","NewContext":"f","NewField":"f","NewFunc":"f","NewInterface":"f","NewInterfaceType":"f","NewLabel":"f","NewMap":"f","NewMethodSet":"f","NewNamed":"f","NewPackage":"f","NewParam":"f","NewPkgName":"f","NewPointer":"f","NewScope":"f","NewSignature":"f","NewSignatureType":"f","NewSlice":"f","NewStruct":"f","NewTerm":"f","NewTuple":"f","NewTypeName":"f","NewTypeParam":"f","NewUnion":"f","NewVar":"f","Nil":"t","Nil.String":"m","Object":"t","ObjectString":"f","Package":"t","Package.Complete":"m","Package.GoVersion":"m","Package.Imports":"m","Package.MarkComplete":"m","Package.Name":"m","Package.Path":"m","Package.Scope":"m","Package.SetImports":"m","Package.SetName":"m","Package.String":"m","PackageVar":"c","ParamVar":"c","PkgName":"t","PkgName.Imported":"m","PkgName.String":"m","Pointer":"t","Pointer.Elem":"m","Pointer.String":"m","Pointer.Underlying":"m","Qualifier":"t","RecvOnly":"c","RecvVar":"c","RelativeTo":"f","ResultVar":"c","Rune":"c","Satisfies":"f","Scope":"t","Scope.Child":"m","Scope.Children":"m","Scope.Contains":"m","Scope.End":"m","Scope.Innermost":"m","Scope.Insert":"m","Scope.Len":"m","Scope.Lookup":"m","Scope.LookupParent":"m","Scope.Names":"m","Scope.NumChildren":"m","Scope.Parent":"m","Scope.Pos":"m","Scope.String":"m","Scope.WriteTo":"m","Selection":"t","Selection.Index":"m","Selection.Indirect":"m","Selection.Kind":"m","Selection.Obj":"m","Selection.Recv":"m","Selection.String":"m","Selection.Type":"m","SelectionKind":"t","SelectionString":"f","SendOnly":"c","SendRecv":"c","Signature":"t","Signature.Params":"m","Signature.Recv":"m","Signature.RecvTypeParams":"m","Signature.Results":"m","Signature.String":"m","Signature.TypeParams":"m","Signature.Underlying":"m","Signature.Variadic":"m","Sizes":"t","SizesFor":"f","Slice":"t","Slice.Elem":"m","Slice.String":"m","Slice.Underlying":"m","StdSizes":"t","StdSizes.Alignof":"m","StdSizes.Offsetsof":"m","StdSizes.Sizeof":"m","String":"c","Struct":"t","Struct.Field":"m","Struct.Fields":"m","Struct.NumFields":"m","Struct.String":"m","Struct.Tag":"m","Struct.Underlying":"m","Term":"t","Term.String":"m","Term.Tilde":"m","Term.Type":"m","Tuple":"t","Tuple.At":"m","Tuple.Len":"m","Tuple.String":"m","Tuple.Underlying":"m","Tuple.Variables":"m","Typ":"v","Type":"t","TypeAndValue":"t","TypeAndValue.Addressable":"m","TypeAndValue.Assignable":"m","TypeAndValue.HasOk":"m","TypeAndValue.IsBuiltin":"m","TypeAndValue.IsNil":"m","TypeAndValue.IsType":"m","TypeAndValue.IsValue":"m","TypeAndValue.IsVoid":"m","TypeList":"t","TypeList.At":"m","TypeList.Len":"m","TypeList.Types":"m","TypeName":"t","TypeName.IsAlias":"m","TypeName.String":"m","TypeParam":"t","TypeParam.Constraint":"m","TypeParam.Index":"m","TypeParam.Obj":"m","TypeParam.SetConstraint":"m","TypeParam.String":"m","TypeParam.Underlying":"m","TypeParamList":"t","TypeParamList.At":"m","TypeParamList.Len":"m","TypeParamList.TypeParams":"m","TypeString":"f","Uint":"c","Uint16":"c","Uint32":"c","Uint64":"c","Uint8":"c","Uintptr":"c","Unalias":"f","Union":"t","Union.Len":"m","Union.String":"m","Union.Term":"m","Union.Terms":"m","Union.Underlying":"m","Universe":"v","Unsafe":"v","UnsafePointer":"c","UntypedBool":"c","UntypedComplex":"c","UntypedFloat":"c","UntypedInt":"c","UntypedNil":"c","UntypedRune":"c","UntypedString":"c","Var":"t","Var.Anonymous":"m","Var.Embedded":"m","Var.IsField":"m","Var.Kind":"m","Var.Origin":"m","Var.SetKind":"m","Var.String":"m","VarKind":"t","VarKind.String":"m","WriteExpr":"f","WriteSignature":"f","WriteType":"f"}},"go/version":{"path":"go/version","name":"version","symbols":{"Compare":"f","IsValid":"f","Lang":"f"}},"hash":{"path":"hash","name":"hash","symbols":{"Cloner":"t","Hash":"t","Hash32":"t","Hash64":"t","XOF":"t"}},"hash/adler32":{"path":"hash/adler32","name":"adler32","symbols":{"Checksum":"f","New":"f","Size":"c"}},"hash/crc32":{"path":"hash/crc32","name":"crc32","symbols":{"Castagnoli":"c","Checksum":"f","ChecksumIEEE":"f","IEEE":"c","IEEETable":"v","Koopman":"c","MakeTable":"f","New":"f","NewIEEE":"f","Size":"c","Table":"t","Update":"f"}},"hash/crc64":{"path":"hash/crc64","name":"crc64","symbols":{"Checksum":"f","ECMA":"c","ISO":"c","MakeTable":"f","New":"f","Size":"c","Table":"t","Update":"f"}},"hash/fnv":{"path":"hash/fnv","name":"fnv","symbols":{"New128":"f","New128a":"f","New32":"f","New32a":"f","New64":"f","New64a":"f"}},"hash/maphash":{"path":"hash/maphash","name":"maphash","symbols":{"Bytes":"f","Comparable":"f","Hash":"t","Hash.BlockSize":"m","Hash.Clone":"m","Hash.Reset":"m","Hash.Seed":"m","Hash.SetSeed":"m","Hash.Size":"m","Hash.Sum":"m","Hash.Sum64":"m","Hash.Write":"m","Hash.WriteByte":"m","Hash.WriteString":"m","MakeSeed":"f","Seed":"t","String":"f","WriteComparable":"f"}},"html":{"path":"html","name":"html","symbols":{"EscapeString":"f","UnescapeString":"f"}},"html/template":{"path":"html/template","name":"template","symbols":{"CSS":"t","ErrAmbigContext":"c","ErrBadHTML":"c","ErrBranchEnd":"c","ErrEndContext":"c","ErrJSTemplate":"c","ErrNoSuchTemplate":"c","ErrOutputContext":"c","ErrPartialCharset":"c","ErrPartialEscape":"c","ErrPredefinedEscaper":"c","ErrRangeLoopReentry":"c","ErrSlashAmbig":"c","Error":"t","Error.Error":"m","ErrorCode":"t","FuncMap":"t","HTML":"t","HTMLAttr":"t","HTMLEscape":"f","HTMLEscapeString":"f","HTMLEscaper":"f","IsTrue":"f","JS":"t","JSEscape":"f","JSEscapeString":"f","JSEscaper":"f","JSStr":"t","Must":"f","New":"f","OK":"c","ParseFS":"f","ParseFiles":"f","ParseGlob":"f","Srcset":"t","Template":"t","Template.AddParseTree":"m","Template.Clone":"m","Template.DefinedTemplates":"m","Template.Delims":"m","Template.Execute":"m","Template.ExecuteTemplate":"m","Template.Funcs":"m","Template.Lookup":"m","Template.Name":"m","Template.New":"m","Template.Option":"m","Template.Parse":"m","Template.ParseFS":"m","Template.ParseFiles":"m","Template.ParseGlob":"m","Template.Templates":"m","URL":"t","URLQueryEscaper":"f"}},"image":{"path":"image","name":"image","symbols":{"Alpha":"t","Alpha.AlphaAt":"m","Alpha.At":"m","Alpha.Bounds":"m","Alpha.ColorModel":"m","Alpha.Opaque":"m","Alpha.PixOffset":"m","Alpha.RGBA64At":"m","Alpha.Set":"m","Alpha.SetAlpha":"m","Alpha.SetRGBA64":"m","Alpha.SubImage":"m","Alpha16":"t","Alpha16.Alpha16At":"m","Alpha16.At":"m","Alpha16.Bounds":"m","Alpha16.ColorModel":"m","Alpha16.Opaque":"m","Alpha16.PixOffset":"m","Alpha16.RGBA64At":"m","Alpha16.Set":"m","Alpha16.SetAlpha16":"m","Alpha16.SetRGBA64":"m","Alpha16.SubImage":"m","Black":"v","CMYK":"t","CMYK.At":"m","CMYK.Bounds":"m","CMYK.CMYKAt":"m","CMYK.ColorModel":"m","CMYK.Opaque":"m","CMYK.PixOffset":"m","CMYK.RGBA64At":"m","CMYK.Set":"m","CMYK.SetCMYK":"m","CMYK.SetRGBA64":"m","CMYK.SubImage":"m","Config":"t","Decode":"f","DecodeConfig":"f","ErrFormat":"v","Gray":"t","Gray.At":"m","Gray.Bounds":"m","Gray.ColorModel":"m","Gray.GrayAt":"m","Gray.Opaque":"m","Gray.PixOffset":"m","Gray.RGBA64At":"m","Gray.Set":"m","Gray.SetGray":"m","Gray.SetRGBA64":"m","Gray.SubImage":"m","Gray16":"t","Gray16.At":"m","Gray16.Bounds":"m","Gray16.ColorModel":"m","Gray16.Gray16At":"m","Gray16.Opaque":"m","Gray16.PixOffset":"m","Gray16.RGBA64At":"m","Gray16.Set":"m","Gray16.SetGray16":"m","Gray16.SetRGBA64":"m","Gray16.SubImage":"m","Image":"t","NRGBA":"t","NRGBA.At":"m","NRGBA.Bounds":"m","NRGBA.ColorModel":"m","NRGBA.NRGBAAt":"m","NRGBA.Opaque":"m","NRGBA.PixOffset":"m","NRGBA.RGBA64At":"m","NRGBA.Set":"m","NRGBA.SetNRGBA":"m","NRGBA.SetRGBA64":"m","NRGBA.SubImage":"m","NRGBA64":"t","NRGBA64.At":"m","NRGBA64.Bounds":"m","NRGBA64.ColorModel":"m","NRGBA64.NRGBA64At":"m","NRGBA64.Opaque":"m","NRGBA64.PixOffset":"m","NRGBA64.RGBA64At":"m","NRGBA64.Set":"m","NRGBA64.SetNRGBA64":"m","NRGBA64.SetRGBA64":"m","NRGBA64.SubImage":"m","NYCbCrA":"t","NYCbCrA.AOffset":"m","NYCbCrA.At":"m","NYCbCrA.ColorModel":"m","NYCbCrA.NYCbCrAAt":"m","NYCbCrA.Opaque":"m","NYCbCrA.RGBA64At":"m","NYCbCrA.SubImage":"m","NewAlpha":"f","NewAlpha16":"f","NewCMYK":"f","NewGray":"f","NewGray16":"f","NewNRGBA":"f","NewNRGBA64":"f","NewNYCbCrA":"f","NewPaletted":"f","NewRGBA":"f","NewRGBA64":"f","NewUniform":"f","NewYCbCr":"f","Opaque":"v","Paletted":"t","Paletted.At":"m","Paletted.Bounds":"m","Paletted.ColorIndexAt":"m","Paletted.ColorModel":"m","Paletted.Opaque":"m","Paletted.PixOffset":"m","Paletted.RGBA64At":"m","Paletted.Set":"m","Paletted.SetColorIndex":"m","Paletted.SetRGBA64":"m","Paletted.SubImage":"m","PalettedImage":"t","Point":"t","Point.Add":"m","Point.Div":"m","Point.Eq":"m","Point.In":"m","Point.Mod":"m","Point.Mul":"m","Point.String":"m","Point.Sub":"m","Pt":"f","RGBA":"t","RGBA.At":"m","RGBA.Bounds":"m","RGBA.ColorModel":"m","RGBA.Opaque":"m","RGBA.PixOffset":"m","RGBA.RGBA64At":"m","RGBA.RGBAAt":"m","RGBA.Set":"m","RGBA.SetRGBA":"m","RGBA.SetRGBA64":"m","RGBA.SubImage":"m","RGBA64":"t","RGBA64.At":"m","RGBA64.Bounds":"m","RGBA64.ColorModel":"m","RGBA64.Opaque":"m","RGBA64.PixOffset":"m","RGBA64.RGBA64At":"m","RGBA64.Set":"m","RGBA64.SetRGBA64":"m","RGBA64.SubImage":"m","RGBA64Image":"t","Rect":"f","Rectangle":"t","Rectangle.Add":"m","Rectangle.At":"m","Rectangle.Bounds":"m","Rectangle.Canon":"m","Rectangle.ColorModel":"m","Rectangle.Dx":"m","Rectangle.Dy":"m","Rectangle.Empty":"m","Rectangle.Eq":"m","Rectangle.In":"m","Rectangle.Inset":"m","Rectangle.Intersect":"m","Rectangle.Overlaps":"m","Rectangle.RGBA64At":"m","Rectangle.Size":"m","Rectangle.String":"m","Rectangle.Sub":"m","Rectangle.Union":"m","RegisterFormat":"f","Transparent":"v","Uniform":"t","Uniform.At":"m","Uniform.Bounds":"m","Uniform.ColorModel":"m","Uniform.Convert":"m","Uniform.Opaque":"m","Uniform.RGBA":"m","Uniform.RGBA64At":"m","White":"v","YCbCr":"t","YCbCr.At":"m","YCbCr.Bounds":"m","YCbCr.COffset":"m","YCbCr.ColorModel":"m","YCbCr.Opaque":"m","YCbCr.RGBA64At":"m","YCbCr.SubImage":"m","YCbCr.YCbCrAt":"m","YCbCr.YOffset":"m","YCbCrSubsampleRatio":"t","YCbCrSubsampleRatio.String":"m","YCbCrSubsampleRatio410":"c","YCbCrSubsampleRatio411":"c","YCbCrSubsampleRatio420":"c","YCbCrSubsampleRatio422":"c","YCbCrSubsampleRatio440":"c","YCbCrSubsampleRatio444":"c","ZP":"v","ZR":"v"}},"image/color":{"path":"image/color","name":"color","symbols":{"Alpha":"t","Alpha.RGBA":"m","Alpha16":"t","Alpha16.RGBA":"m","Alpha16Model":"v","AlphaModel":"v","Black":"v","CMYK":"t","CMYK.RGBA":"m","CMYKModel":"v","CMYKToRGB":"f","Color":"t","Gray":"t","Gray.RGBA":"m","Gray16":"t","Gray16.RGBA":"m","Gray16Model":"v","GrayModel":"v","Model":"t","ModelFunc":"f","NRGBA":"t","NRGBA.RGBA":"m","NRGBA64":"t","NRGBA64.RGBA":"m","NRGBA64Model":"v","NRGBAModel":"v","NYCbCrA":"t","NYCbCrA.RGBA":"m","NYCbCrAModel":"v","Opaque":"v","Palette":"t","Palette.Convert":"m","Palette.Index":"m","RGBA":"t","RGBA.RGBA":"m","RGBA64":"t","RGBA64.RGBA":"m","RGBA64Model":"v","RGBAModel":"v","RGBToCMYK":"f","RGBToYCbCr":"f","Transparent":"v","White":"v","YCbCr":"t","YCbCr.RGBA":"m","YCbCrModel":"v","YCbCrToRGB":"f"}},"image/color/palette":{"path":"image/color/palette","name":"palette","symbols":{"Plan9":"v","WebSafe":"v"}},"image/draw":{"path":"image/draw","name":"draw","symbols":{"Draw":"f","DrawMask":"f","Drawer":"t","FloydSteinberg":"v","Image":"t","Op":"t","Op.Draw":"m","Over":"c","Quantizer":"t","RGBA64Image":"t","Src":"c"}},"image/gif":{"path":"image/gif","name":"gif","symbols":{"Decode":"f","DecodeAll":"f","DecodeConfig":"f","DisposalBackground":"c","DisposalNone":"c","DisposalPrevious":"c","Encode":"f","EncodeAll":"f","GIF":"t","Options":"t"}},"image/jpeg":{"path":"image/jpeg","name":"jpeg","symbols":{"Decode":"f","DecodeConfig":"f","DefaultQuality":"c","Encode":"f","FormatError":"t","FormatError.Error":"m","Options":"t","Reader":"t","UnsupportedError":"t","UnsupportedError.Error":"m"}},"image/png":{"path":"image/png","name":"png","symbols":{"BestCompression":"c","BestSpeed":"c","CompressionLevel":"t","Decode":"f","DecodeConfig":"f","DefaultCompression":"c","Encode":"f","Encoder":"t","Encoder.Encode":"m","EncoderBuffer":"t","EncoderBufferPool":"t","FormatError":"t","FormatError.Error":"m","NoCompression":"c","UnsupportedError":"t","UnsupportedError.Error":"m"}},"index/suffixarray":{"path":"index/suffixarray","name":"suffixarray","symbols":{"Index":"t","Index.Bytes":"m","Index.FindAllIndex":"m","Index.Lookup":"m","Index.Read":"m","Index.Write":"m","New":"f"}},"io":{"path":"io","name":"io","symbols":{"ByteReader":"t","ByteScanner":"t","ByteWriter":"t","Closer":"t","Copy":"f","CopyBuffer":"f","CopyN":"f","Discard":"v","EOF":"v","ErrClosedPipe":"v","ErrNoProgress":"v","ErrShortBuffer":"v","ErrShortWrite":"v","ErrUnexpectedEOF":"v","LimitReader":"f","LimitedReader":"t","LimitedReader.Read":"m","MultiReader":"f","MultiWriter":"f","NewOffsetWriter":"f","NewSectionReader":"f","NopCloser":"f","OffsetWriter":"t","OffsetWriter.Seek":"m","OffsetWriter.Write":"m","OffsetWriter.WriteAt":"m","Pipe":"f","PipeReader":"t","PipeReader.Close":"m","PipeReader.CloseWithError":"m","PipeReader.Read":"m","PipeWriter":"t","PipeWriter.Close":"m","PipeWriter.CloseWithError":"m","PipeWriter.Write":"m","ReadAll":"f","ReadAtLeast":"f","ReadCloser":"t","ReadFull":"f","ReadSeekCloser":"t","ReadSeeker":"t","ReadWriteCloser":"t","ReadWriteSeeker":"t","ReadWriter":"t","Reader":"t","ReaderAt":"t","ReaderFrom":"t","RuneReader":"t","RuneScanner":"t","SectionReader":"t","SectionReader.Outer":"m","SectionReader.Read":"m","SectionReader.ReadAt":"m","SectionReader.Seek":"m","SectionReader.Size":"m","SeekCurrent":"c","SeekEnd":"c","SeekStart":"c","Seeker":"t","StringWriter":"t","TeeReader":"f","WriteCloser":"t","WriteSeeker":"t","WriteString":"f","Writer":"t","WriterAt":"t","WriterTo":"t"}},"io/fs":{"path":"io/fs","name":"fs","symbols":{"DirEntry":"t","ErrClosed":"v","ErrExist":"v","ErrInvalid":"v","ErrNotExist":"v","ErrPermission":"v","FS":"t","File":"t","FileInfo":"t","FileInfoToDirEntry":"f","FileMode":"t","FileMode.IsDir":"m","FileMode.IsRegular":"m","FileMode.Perm":"m","FileMode.String":"m","FileMode.Type":"m","FormatDirEntry":"f","FormatFileInfo":"f","Glob":"f","GlobFS":"t","Lstat":"f","ModeAppend":"c","ModeCharDevice":"c","ModeDevice":"c","ModeDir":"c","ModeExclusive":"c","ModeIrregular":"c","ModeNamedPipe":"c","ModePerm":"c","ModeSetgid":"c","ModeSetuid":"c","ModeSocket":"c","ModeSticky":"c","ModeSymlink":"c","ModeTemporary":"c","ModeType":"c","PathError":"t","PathError.Error":"m","PathError.Timeout":"m","PathError.Unwrap":"m","ReadDir":"f","ReadDirFS":"t","ReadDirFile":"t","ReadFile":"f","ReadFileFS":"t","ReadLink":"f","ReadLinkFS":"t","SkipAll":"v","SkipDir":"v","Stat":"f","StatFS":"t","Sub":"f","SubFS":"t","ValidPath":"f","WalkDir":"f","WalkDirFunc":"t"}},"io/ioutil":{"path":"io/ioutil","name":"ioutil","symbols":{"Discard":"v","NopCloser":"f","ReadAll":"f","ReadDir":"f","ReadFile":"f","TempDir":"f","TempFile":"f","WriteFile":"f"}},"iter":{"path":"iter","name":"iter","symbols":{"Pull":"f","Pull2":"f","Seq":"t","Seq2":"t"}},"log":{"path":"log","name":"log","symbols":{"Default":"f","Fatal":"f","Fatalf":"f","Fatalln":"f","Flags":"f","LUTC":"c","Ldate":"c","Llongfile":"c","Lmicroseconds":"c","Lmsgprefix":"c","Logger":"t","Logger.Fatal":"m","Logger.Fatalf":"m","Logger.Fatalln":"m","Logger.Flags":"m","Logger.Output":"m","Logger.Panic":"m","Logger.Panicf":"m","Logger.Panicln":"m","Logger.Prefix":"m","Logger.Print":"m","Logger.Printf":"m","Logger.Println":"m","Logger.SetFlags":"m","Logger.SetOutput":"m","Logger.SetPrefix":"m","Logger.Writer":"m","Lshortfile":"c","LstdFlags":"c","Ltime":"c","New":"f","Output":"f","Panic":"f","Panicf":"f","Panicln":"f","Prefix":"f","Print":"f","Printf":"f","Println":"f","SetFlags":"f","SetOutput":"f","SetPrefix":"f","Writer":"f"}},"log/slog":{"path":"log/slog","name":"slog","symbols":{"Any":"f","AnyValue":"f","Attr":"t","Attr.Equal":"m","Attr.String":"m","Bool":"f","BoolValue":"f","Debug":"f","DebugContext":"f","Default":"f","DiscardHandler":"v","Duration":"f","DurationValue":"f","Error":"f","ErrorContext":"f","Float64":"f","Float64Value":"f","Group":"f","GroupAttrs":"f","GroupValue":"f","Handler":"t","HandlerOptions":"t","Info":"f","InfoContext":"f","Int":"f","Int64":"f","Int64Value":"f","IntValue":"f","JSONHandler":"t","JSONHandler.Enabled":"m","JSONHandler.Handle":"m","JSONHandler.WithAttrs":"m","JSONHandler.WithGroup":"m","Kind":"t","Kind.String":"m","KindAny":"c","KindBool":"c","KindDuration":"c","KindFloat64":"c","KindGroup":"c","KindInt64":"c","KindLogValuer":"c","KindString":"c","KindTime":"c","KindUint64":"c","Level":"t","Level.AppendText":"m","Level.Level":"m","Level.MarshalJSON":"m","Level.MarshalText":"m","Level.String":"m","Level.UnmarshalJSON":"m","Level.UnmarshalText":"m","LevelDebug":"c","LevelError":"c","LevelInfo":"c","LevelKey":"c","LevelVar":"t","LevelVar.AppendText":"m","LevelVar.Level":"m","LevelVar.MarshalText":"m","LevelVar.Set":"m","LevelVar.String":"m","LevelVar.UnmarshalText":"m","LevelWarn":"c","Leveler":"t","Log":"f","LogAttrs":"f","LogValuer":"t","Logger":"t","Logger.Debug":"m","Logger.DebugContext":"m","Logger.Enabled":"m","Logger.Error":"m","Logger.ErrorContext":"m","Logger.Handler":"m","Logger.Info":"m","Logger.InfoContext":"m","Logger.Log":"m","Logger.LogAttrs":"m","Logger.Warn":"m","Logger.WarnContext":"m","Logger.With":"m","Logger.WithGroup":"m","MessageKey":"c","MultiHandler":"t","MultiHandler.Enabled":"m","MultiHandler.Handle":"m","MultiHandler.WithAttrs":"m","MultiHandler.WithGroup":"m","New":"f","NewJSONHandler":"f","NewLogLogger":"f","NewMultiHandler":"f","NewRecord":"f","NewTextHandler":"f","Record":"t","Record.Add":"m","Record.AddAttrs":"m","Record.Attrs":"m","Record.Clone":"m","Record.NumAttrs":"m","Record.Source":"m","SetDefault":"f","SetLogLoggerLevel":"f","Source":"t","SourceKey":"c","String":"f","StringValue":"f","TextHandler":"t","TextHandler.Enabled":"m","TextHandler.Handle":"m","TextHandler.WithAttrs":"m","TextHandler.WithGroup":"m","Time":"f","TimeKey":"c","TimeValue":"f","Uint64":"f","Uint64Value":"f","Value":"t","Value.Any":"m","Value.Bool":"m","Value.Duration":"m","Value.Equal":"m","Value.Float64":"m","Value.Group":"m","Value.Int64":"m","Value.Kind":"m","Value.LogValuer":"m","Value.Resolve":"m","Value.String":"m","Value.Time":"m","Value.Uint64":"m","Warn":"f","WarnContext":"f","With":"f"}},"log/syslog":{"path":"log/syslog","name":"syslog","symbols":{"Dial":"f","LOG_ALERT":"c","LOG_AUTH":"c","LOG_AUTHPRIV":"c","LOG_CRIT":"c","LOG_CRON":"c","LOG_DAEMON":"c","LOG_DEBUG":"c","LOG_EMERG":"c","LOG_ERR":"c","LOG_FTP":"c","LOG_INFO":"c","LOG_KERN":"c","LOG_LOCAL0":"c","LOG_LOCAL1":"c","LOG_LOCAL2":"c","LOG_LOCAL3":"c","LOG_LOCAL4":"c","LOG_LOCAL5":"c","LOG_LOCAL6":"c","LOG_LOCAL7":"c","LOG_LPR":"c","LOG_MAIL":"c","LOG_NEWS":"c","LOG_NOTICE":"c","LOG_SYSLOG":"c","LOG_USER":"c","LOG_UUCP":"c","LOG_WARNING":"c","New":"f","NewLogger":"f","Priority":"t","Writer":"t","Writer.Alert":"m","Writer.Close":"m","Writer.Crit":"m","Writer.Debug":"m","Writer.Emerg":"m","Writer.Err":"m","Writer.Info":"m","Writer.Notice":"m","Writer.Warning":"m","Writer.Write":"m"}},"maps":{"path":"maps","name":"maps","symbols":{"All":"f","Clone":"f","Collect":"f","Copy":"f","DeleteFunc":"f","Equal":"f","EqualFunc":"f","Insert":"f","Keys":"f","Values":"f"}},"math":{"path":"math","name":"math","symbols":{"Abs":"f","Acos":"f","Acosh":"f","Asin":"f","Asinh":"f","Atan":"f","Atan2":"f","Atanh":"f","Cbrt":"f","Ceil":"f","Copysign":"f","Cos":"f","Cosh":"f","Dim":"f","E":"c","Erf":"f","Erfc":"f","Erfcinv":"f","Erfinv":"f","Exp":"f","Exp2":"f","Expm1":"f","FMA":"f","Float32bits":"f","Float32frombits":"f","Float64bits":"f","Float64frombits":"f","Floor":"f","Frexp":"f","Gamma":"f","Hypot":"f","Ilogb":"f","Inf":"f","IsInf":"f","IsNaN":"f","J0":"f","J1":"f","Jn":"f","Ldexp":"f","Lgamma":"f","Ln10":"c","Ln2":"c","Log":"f","Log10":"f","Log10E":"c","Log1p":"f","Log2":"f","Log2E":"c","Logb":"f","Max":"f","MaxFloat32":"c","MaxFloat64":"c","MaxInt":"c","MaxInt16":"c","MaxInt32":"c","MaxInt64":"c","MaxInt8":"c","MaxUint":"c","MaxUint16":"c","MaxUint32":"c","MaxUint64":"c","MaxUint8":"c","Min":"f","MinInt":"c","MinInt16":"c","MinInt32":"c","MinInt64":"c","MinInt8":"c","Mod":"f","Modf":"f","NaN":"f","Nextafter":"f","Nextafter32":"f","Phi":"c","Pi":"c","Pow":"f","Pow10":"f","Remainder":"f","Round":"f","RoundToEven":"f","Signbit":"f","Sin":"f","Sincos":"f","Sinh":"f","SmallestNonzeroFloat32":"c","SmallestNonzeroFloat64":"c","Sqrt":"f","Sqrt2":"c","SqrtE":"c","SqrtPhi":"c","SqrtPi":"c","Tan":"f","Tanh":"f","Trunc":"f","Y0":"f","Y1":"f","Yn":"f"}},"math/big":{"path":"math/big","name":"big","symbols":{"Above":"c","Accuracy":"t","Accuracy.String":"m","AwayFromZero":"c","Below":"c","ErrNaN":"t","ErrNaN.Error":"m","Exact":"c","Float":"t","Float.Abs":"m","Float.Acc":"m","Float.Add":"m","Float.Append":"m","Float.AppendText":"m","Float.Cmp":"m","Float.Copy":"m","Float.Float32":"m","Float.Float64":"m","Float.Format":"m","Float.GobDecode":"m","Float.GobEncode":"m","Float.Int":"m","Float.Int64":"m","Float.IsInf":"m","Float.IsInt":"m","Float.MantExp":"m","Float.MarshalText":"m","Float.MinPrec":"m","Float.Mode":"m","Float.Mul":"m","Float.Neg":"m","Float.Parse":"m","Float.Prec":"m","Float.Quo":"m","Float.Rat":"m","Float.Scan":"m","Float.Set":"m","Float.SetFloat64":"m","Float.SetInf":"m","Float.SetInt":"m","Float.SetInt64":"m","Float.SetMantExp":"m","Float.SetMode":"m","Float.SetPrec":"m","Float.SetRat":"m","Float.SetString":"m","Float.SetUint64":"m","Float.Sign":"m","Float.Signbit":"m","Float.Sqrt":"m","Float.String":"m","Float.Sub":"m","Float.Text":"m","Float.Uint64":"m","Float.UnmarshalText":"m","Int":"t","Int.Abs":"m","Int.Add":"m","Int.And":"m","Int.AndNot":"m","Int.Append":"m","Int.AppendText":"m","Int.Binomial":"m","Int.Bit":"m","Int.BitLen":"m","Int.Bits":"m","Int.Bytes":"m","Int.Cmp":"m","Int.CmpAbs":"m","Int.Div":"m","Int.DivMod":"m","Int.Exp":"m","Int.FillBytes":"m","Int.Float64":"m","Int.Format":"m","Int.GCD":"m","Int.GobDecode":"m","Int.GobEncode":"m","Int.Int64":"m","Int.IsInt64":"m","Int.IsUint64":"m","Int.Lsh":"m","Int.MarshalJSON":"m","Int.MarshalText":"m","Int.Mod":"m","Int.ModInverse":"m","Int.ModSqrt":"m","Int.Mul":"m","Int.MulRange":"m","Int.Neg":"m","Int.Not":"m","Int.Or":"m","Int.ProbablyPrime":"m","Int.Quo":"m","Int.QuoRem":"m","Int.Rand":"m","Int.Rem":"m","Int.Rsh":"m","Int.Scan":"m","Int.Set":"m","Int.SetBit":"m","Int.SetBits":"m","Int.SetBytes":"m","Int.SetInt64":"m","Int.SetString":"m","Int.SetUint64":"m","Int.Sign":"m","Int.Sqrt":"m","Int.String":"m","Int.Sub":"m","Int.Text":"m","Int.TrailingZeroBits":"m","Int.Uint64":"m","Int.UnmarshalJSON":"m","Int.UnmarshalText":"m","Int.Xor":"m","Jacobi":"f","MaxBase":"c","MaxExp":"c","MaxPrec":"c","MinExp":"c","NewFloat":"f","NewInt":"f","NewRat":"f","ParseFloat":"f","Rat":"t","Rat.Abs":"m","Rat.Add":"m","Rat.AppendText":"m","Rat.Cmp":"m","Rat.Denom":"m","Rat.Float32":"m","Rat.Float64":"m","Rat.FloatPrec":"m","Rat.FloatString":"m","Rat.GobDecode":"m","Rat.GobEncode":"m","Rat.Inv":"m","Rat.IsInt":"m","Rat.MarshalText":"m","Rat.Mul":"m","Rat.Neg":"m","Rat.Num":"m","Rat.Quo":"m","Rat.RatString":"m","Rat.Scan":"m","Rat.Set":"m","Rat.SetFloat64":"m","Rat.SetFrac":"m","Rat.SetFrac64":"m","Rat.SetInt":"m","Rat.SetInt64":"m","Rat.SetString":"m","Rat.SetUint64":"m","Rat.Sign":"m","Rat.String":"m","Rat.Sub":"m","Rat.UnmarshalText":"m","RoundingMode":"t","RoundingMode.String":"m","ToNearestAway":"c","ToNearestEven":"c","ToNegativeInf":"c","ToPositiveInf":"c","ToZero":"c","Word":"t"}},"math/bits":{"path":"math/bits","name":"bits","symbols":{"Add":"f","Add32":"f","Add64":"f","Div":"f","Div32":"f","Div64":"f","LeadingZeros":"f","LeadingZeros16":"f","LeadingZeros32":"f","LeadingZeros64":"f","LeadingZeros8":"f","Len":"f","Len16":"f","Len32":"f","Len64":"f","Len8":"f","Mul":"f","Mul32":"f","Mul64":"f","OnesCount":"f","OnesCount16":"f","OnesCount32":"f","OnesCount64":"f","OnesCount8":"f","Rem":"f","Rem32":"f","Rem64":"f","Reverse":"f","Reverse16":"f","Reverse32":"f","Reverse64":"f","Reverse8":"f","ReverseBytes":"f","ReverseBytes16":"f","ReverseBytes32":"f","ReverseBytes64":"f","RotateLeft":"f","RotateLeft16":"f","RotateLeft32":"f","RotateLeft64":"f","RotateLeft8":"f","Sub":"f","Sub32":"f","Sub64":"f","TrailingZeros":"f","TrailingZeros16":"f","TrailingZeros32":"f","TrailingZeros64":"f","TrailingZeros8":"f","UintSize":"c"}},"math/cmplx":{"path":"math/cmplx","name":"cmplx","symbols":{"Abs":"f","Acos":"f","Acosh":"f","Asin":"f","Asinh":"f","Atan":"f","Atanh":"f","Conj":"f","Cos":"f","Cosh":"f","Cot":"f","Exp":"f","Inf":"f","IsInf":"f","IsNaN":"f","Log":"f","Log10":"f","NaN":"f","Phase":"f","Polar":"f","Pow":"f","Rect":"f","Sin":"f","Sinh":"f","Sqrt":"f","Tan":"f","Tanh":"f"}},"math/rand":{"path":"math/rand","name":"rand","symbols":{"ExpFloat64":"f","Float32":"f","Float64":"f","Int":"f","Int31":"f","Int31n":"f","Int63":"f","Int63n":"f","Intn":"f","New":"f","NewSource":"f","NewZipf":"f","NormFloat64":"f","Perm":"f","Rand":"t","Rand.ExpFloat64":"m","Rand.Float32":"m","Rand.Float64":"m","Rand.Int":"m","Rand.Int31":"m","Rand.Int31n":"m","Rand.Int63":"m","Rand.Int63n":"m","Rand.Intn":"m","Rand.NormFloat64":"m","Rand.Perm":"m","Rand.Read":"m","Rand.Seed":"m","Rand.Shuffle":"m","Rand.Uint32":"m","Rand.Uint64":"m","Read":"f","Seed":"f","Shuffle":"f","Source":"t","Source64":"t","Uint32":"f","Uint64":"f","Zipf":"t","Zipf.Uint64":"m"}},"math/rand/v2":{"path":"math/rand/v2","name":"rand","symbols":{"ChaCha8":"t","ChaCha8.AppendBinary":"m","ChaCha8.MarshalBinary":"m","ChaCha8.Read":"m","ChaCha8.Seed":"m","ChaCha8.Uint64":"m","ChaCha8.UnmarshalBinary":"m","ExpFloat64":"f","Float32":"f","Float64":"f","Int":"f","Int32":"f","Int32N":"f","Int64":"f","Int64N":"f","IntN":"f","N":"f","New":"f","NewChaCha8":"f","NewPCG":"f","NewZipf":"f","NormFloat64":"f","PCG":"t","PCG.AppendBinary":"m","PCG.MarshalBinary":"m","PCG.Seed":"m","PCG.Uint64":"m","PCG.UnmarshalBinary":"m","Perm":"f","Rand":"t","Rand.ExpFloat64":"m","Rand.Float32":"m","Rand.Float64":"m","Rand.Int":"m","Rand.Int32":"m","Rand.Int32N":"m","Rand.Int64":"m","Rand.Int64N":"m","Rand.IntN":"m","Rand.NormFloat64":"m","Rand.Perm":"m","Rand.Shuffle":"m","Rand.Uint":"m","Rand.Uint32":"m","Rand.Uint32N":"m","Rand.Uint64":"m","Rand.Uint64N":"m","Rand.UintN":"m","Shuffle":"f","Source":"t","Uint":"f","Uint32":"f","Uint32N":"f","Uint64":"f","Uint64N":"f","UintN":"f","Zipf":"t","Zipf.Uint64":"m"}},"mime":{"path":"mime","name":"mime","symbols":{"AddExtensionType":"f","BEncoding":"c","ErrInvalidMediaParameter":"v","ExtensionsByType":"f","FormatMediaType":"f","ParseMediaType":"f","QEncoding":"c","TypeByExtension":"f","WordDecoder":"t","WordDecoder.Decode":"m","WordDecoder.DecodeHeader":"m","WordEncoder":"t","WordEncoder.Encode":"m"}},"mime/multipart":{"path":"mime/multipart","name":"multipart","symbols":{"ErrMessageTooLarge":"v","File":"t","FileContentDisposition":"f","FileHeader":"t","FileHeader.Open":"m","Form":"t","Form.RemoveAll":"m","NewReader":"f","NewWriter":"f","Part":"t","Part.Close":"m","Part.FileName":"m","Part.FormName":"m","Part.Read":"m","Reader":"t","Reader.NextPart":"m","Reader.NextRawPart":"m","Reader.ReadForm":"m","Writer":"t","Writer.Boundary":"m","Writer.Close":"m","Writer.CreateFormField":"m","Writer.CreateFormFile":"m","Writer.CreatePart":"m","Writer.FormDataContentType":"m","Writer.SetBoundary":"m","Writer.WriteField":"m"}},"mime/quotedprintable":{"path":"mime/quotedprintable","name":"quotedprintable","symbols":{"NewReader":"f","NewWriter":"f","Reader":"t","Reader.Read":"m","Writer":"t","Writer.Close":"m","Writer.Write":"m"}},"net":{"path":"net","name":"net","symbols":{"Addr":"t","AddrError":"t","AddrError.Error":"m","AddrError.Temporary":"m","AddrError.Timeout":"m","Buffers":"t","Buffers.Read":"m","Buffers.WriteTo":"m","CIDRMask":"f","Conn":"t","DNSConfigError":"t","DNSConfigError.Error":"m","DNSConfigError.Temporary":"m","DNSConfigError.Timeout":"m","DNSConfigError.Unwrap":"m","DNSError":"t","DNSError.Error":"m","DNSError.Temporary":"m","DNSError.Timeout":"m","DNSError.Unwrap":"m","DefaultResolver":"v","Dial":"f","DialIP":"f","DialTCP":"f","DialTimeout":"f","DialUDP":"f","DialUnix":"f","Dialer":"t","Dialer.Dial":"m","Dialer.DialContext":"m","Dialer.DialIP":"m","Dialer.DialTCP":"m","Dialer.DialUDP":"m","Dialer.DialUnix":"m","Dialer.MultipathTCP":"m","Dialer.SetMultipathTCP":"m","ErrClosed":"v","ErrWriteToConnected":"v","Error":"t","FileConn":"f","FileListener":"f","FilePacketConn":"f","FlagBroadcast":"c","FlagLoopback":"c","FlagMulticast":"c","FlagPointToPoint":"c","FlagRunning":"c","FlagUp":"c","Flags":"t","Flags.String":"m","HardwareAddr":"t","HardwareAddr.String":"m","IP":"t","IP.AppendText":"m","IP.DefaultMask":"m","IP.Equal":"m","IP.IsGlobalUnicast":"m","IP.IsInterfaceLocalMulticast":"m","IP.IsLinkLocalMulticast":"m","IP.IsLinkLocalUnicast":"m","IP.IsLoopback":"m","IP.IsMulticast":"m","IP.IsPrivate":"m","IP.IsUnspecified":"m","IP.MarshalText":"m","IP.Mask":"m","IP.String":"m","IP.To16":"m","IP.To4":"m","IP.UnmarshalText":"m","IPAddr":"t","IPAddr.Network":"m","IPAddr.String":"m","IPConn":"t","IPConn.ReadFrom":"m","IPConn.ReadFromIP":"m","IPConn.ReadMsgIP":"m","IPConn.SyscallConn":"m","IPConn.WriteMsgIP":"m","IPConn.WriteTo":"m","IPConn.WriteToIP":"m","IPMask":"t","IPMask.Size":"m","IPMask.String":"m","IPNet":"t","IPNet.Contains":"m","IPNet.Network":"m","IPNet.String":"m","IPv4":"f","IPv4Mask":"f","IPv4allrouter":"v","IPv4allsys":"v","IPv4bcast":"v","IPv4len":"c","IPv4zero":"v","IPv6interfacelocalallnodes":"v","IPv6len":"c","IPv6linklocalallnodes":"v","IPv6linklocalallrouters":"v","IPv6loopback":"v","IPv6unspecified":"v","IPv6zero":"v","Interface":"t","Interface.Addrs":"m","Interface.MulticastAddrs":"m","InterfaceAddrs":"f","InterfaceByIndex":"f","InterfaceByName":"f","Interfaces":"f","InvalidAddrError":"t","InvalidAddrError.Error":"m","InvalidAddrError.Temporary":"m","InvalidAddrError.Timeout":"m","JoinHostPort":"f","KeepAliveConfig":"t","Listen":"f","ListenConfig":"t","ListenConfig.Listen":"m","ListenConfig.ListenPacket":"m","ListenConfig.MultipathTCP":"m","ListenConfig.SetMultipathTCP":"m","ListenIP":"f","ListenMulticastUDP":"f","ListenPacket":"f","ListenTCP":"f","ListenUDP":"f","ListenUnix":"f","ListenUnixgram":"f","Listener":"t","LookupAddr":"f","LookupCNAME":"f","LookupHost":"f","LookupIP":"f","LookupMX":"f","LookupNS":"f","LookupPort":"f","LookupSRV":"f","LookupTXT":"f","MX":"t","NS":"t","OpError":"t","OpError.Error":"m","OpError.Temporary":"m","OpError.Timeout":"m","OpError.Unwrap":"m","PacketConn":"t","ParseCIDR":"f","ParseError":"t","ParseError.Error":"m","ParseError.Temporary":"m","ParseError.Timeout":"m","ParseIP":"f","ParseMAC":"f","Pipe":"f","ResolveIPAddr":"f","ResolveTCPAddr":"f","ResolveUDPAddr":"f","ResolveUnixAddr":"f","Resolver":"t","Resolver.LookupAddr":"m","Resolver.LookupCNAME":"m","Resolver.LookupHost":"m","Resolver.LookupIP":"m","Resolver.LookupIPAddr":"m","Resolver.LookupMX":"m","Resolver.LookupNS":"m","Resolver.LookupNetIP":"m","Resolver.LookupPort":"m","Resolver.LookupSRV":"m","Resolver.LookupTXT":"m","SRV":"t","SplitHostPort":"f","TCPAddr":"t","TCPAddr.AddrPort":"m","TCPAddr.Network":"m","TCPAddr.String":"m","TCPAddrFromAddrPort":"f","TCPConn":"t","TCPConn.CloseRead":"m","TCPConn.CloseWrite":"m","TCPConn.MultipathTCP":"m","TCPConn.ReadFrom":"m","TCPConn.SetKeepAlive":"m","TCPConn.SetKeepAliveConfig":"m","TCPConn.SetKeepAlivePeriod":"m","TCPConn.SetLinger":"m","TCPConn.SetNoDelay":"m","TCPConn.SyscallConn":"m","TCPConn.WriteTo":"m","TCPListener":"t","TCPListener.Accept":"m","TCPListener.AcceptTCP":"m","TCPListener.Addr":"m","TCPListener.Close":"m","TCPListener.File":"m","TCPListener.SetDeadline":"m","TCPListener.SyscallConn":"m","UDPAddr":"t","UDPAddr.AddrPort":"m","UDPAddr.Network":"m","UDPAddr.String":"m","UDPAddrFromAddrPort":"f","UDPConn":"t","UDPConn.ReadFrom":"m","UDPConn.ReadFromUDP":"m","UDPConn.ReadFromUDPAddrPort":"m","UDPConn.ReadMsgUDP":"m","UDPConn.ReadMsgUDPAddrPort":"m","UDPConn.SyscallConn":"m","UDPConn.WriteMsgUDP":"m","UDPConn.WriteMsgUDPAddrPort":"m","UDPConn.WriteTo":"m","UDPConn.WriteToUDP":"m","UDPConn.WriteToUDPAddrPort":"m","UnixAddr":"t","UnixAddr.Network":"m","UnixAddr.String":"m","UnixConn":"t","UnixConn.CloseRead":"m","UnixConn.CloseWrite":"m","UnixConn.ReadFrom":"m","UnixConn.ReadFromUnix":"m","UnixConn.ReadMsgUnix":"m","UnixConn.SyscallConn":"m","UnixConn.WriteMsgUnix":"m","UnixConn.WriteTo":"m","UnixConn.WriteToUnix":"m","UnixListener":"t","UnixListener.Accept":"m","UnixListener.AcceptUnix":"m","UnixListener.Addr":"m","UnixListener.Close":"m","UnixListener.File":"m","UnixListener.SetDeadline":"m","UnixListener.SetUnlinkOnClose":"m","UnixListener.SyscallConn":"m","UnknownNetworkError":"t","UnknownNetworkError.Error":"m","UnknownNetworkError.Temporary":"m","UnknownNetworkError.Timeout":"m"}},"net/http":{"path":"net/http","name":"http","symbols":{"AllowQuerySemicolons":"f","CanonicalHeaderKey":"f","Client":"t","Client.CloseIdleConnections":"m","Client.Do":"m","Client.Get":"m","Client.Head":"m","Client.Post":"m","Client.PostForm":"m","ClientConn":"t","ClientConn.Available":"m","ClientConn.Close":"m","ClientConn.Err":"m","ClientConn.InFlight":"m","ClientConn.Release":"m","ClientConn.Reserve":"m","ClientConn.RoundTrip":"m","ClientConn.SetStateHook":"m","CloseNotifier":"t","ConnState":"t","ConnState.String":"m","Cookie":"t","Cookie.String":"m","Cookie.Valid":"m","CookieJar":"t","CrossOriginProtection":"t","CrossOriginProtection.AddInsecureBypassPattern":"m","CrossOriginProtection.AddTrustedOrigin":"m","CrossOriginProtection.Check":"m","CrossOriginProtection.Handler":"m","CrossOriginProtection.SetDenyHandler":"m","DefaultClient":"v","DefaultMaxHeaderBytes":"c","DefaultMaxIdleConnsPerHost":"c","DefaultServeMux":"v","DefaultTransport":"v","DetectContentType":"f","Dir":"t","Dir.Open":"m","ErrAbortHandler":"v","ErrBodyNotAllowed":"v","ErrBodyReadAfterClose":"v","ErrContentLength":"v","ErrHandlerTimeout":"v","ErrHeaderTooLong":"v","ErrHijacked":"v","ErrLineTooLong":"v","ErrMissingBoundary":"v","ErrMissingContentLength":"v","ErrMissingFile":"v","ErrNoCookie":"v","ErrNoLocation":"v","ErrNotMultipart":"v","ErrNotSupported":"v","ErrSchemeMismatch":"v","ErrServerClosed":"v","ErrShortBody":"v","ErrSkipAltProtocol":"v","ErrUnexpectedTrailer":"v","ErrUseLastResponse":"v","ErrWriteAfterFlush":"v","Error":"f","FS":"f","File":"t","FileServer":"f","FileServerFS":"f","FileSystem":"t","Flusher":"t","Get":"f","HTTP2Config":"t","Handle":"f","HandleFunc":"f","Handler":"t","HandlerFunc":"t","HandlerFunc.ServeHTTP":"m","Head":"f","Header":"t","Header.Add":"m","Header.Clone":"m","Header.Del":"m","Header.Get":"m","Header.Set":"m","Header.Values":"m","Header.Write":"m","Header.WriteSubset":"m","Hijacker":"t","ListenAndServe":"f","ListenAndServeTLS":"f","LocalAddrContextKey":"v","MaxBytesError":"t","MaxBytesError.Error":"m","MaxBytesHandler":"f","MaxBytesReader":"f","MethodConnect":"c","MethodDelete":"c","MethodGet":"c","MethodHead":"c","MethodOptions":"c","MethodPatch":"c","MethodPost":"c","MethodPut":"c","MethodTrace":"c","NewCrossOriginProtection":"f","NewFileTransport":"f","NewFileTransportFS":"f","NewRequest":"f","NewRequestWithContext":"f","NewResponseController":"f","NewServeMux":"f","NoBody":"v","NotFound":"f","NotFoundHandler":"f","ParseCookie":"f","ParseHTTPVersion":"f","ParseSetCookie":"f","ParseTime":"f","Post":"f","PostForm":"f","ProtocolError":"t","ProtocolError.Error":"m","ProtocolError.Is":"m","Protocols":"t","Protocols.HTTP1":"m","Protocols.HTTP2":"m","Protocols.SetHTTP1":"m","Protocols.SetHTTP2":"m","Protocols.SetUnencryptedHTTP2":"m","Protocols.String":"m","Protocols.UnencryptedHTTP2":"m","ProxyFromEnvironment":"f","ProxyURL":"f","PushOptions":"t","Pusher":"t","ReadRequest":"f","ReadResponse":"f","Redirect":"f","RedirectHandler":"f","Request":"t","Request.AddCookie":"m","Request.BasicAuth":"m","Request.Clone":"m","Request.Context":"m","Request.Cookie":"m","Request.Cookies":"m","Request.CookiesNamed":"m","Request.FormFile":"m","Request.FormValue":"m","Request.MultipartReader":"m","Request.ParseForm":"m","Request.ParseMultipartForm":"m","Request.PathValue":"m","Request.PostFormValue":"m","Request.ProtoAtLeast":"m","Request.Referer":"m","Request.SetBasicAuth":"m","Request.SetPathValue":"m","Request.UserAgent":"m","Request.WithContext":"m","Request.Write":"m","Request.WriteProxy":"m","Response":"t","Response.Cookies":"m","Response.Location":"m","Response.ProtoAtLeast":"m","Response.Write":"m","ResponseController":"t","ResponseController.EnableFullDuplex":"m","ResponseController.Flush":"m","ResponseController.Hijack":"m","ResponseController.SetReadDeadline":"m","ResponseController.SetWriteDeadline":"m","ResponseWriter":"t","RoundTripper":"t","SameSite":"t","SameSiteDefaultMode":"c","SameSiteLaxMode":"c","SameSiteNoneMode":"c","SameSiteStrictMode":"c","Serve":"f","ServeContent":"f","ServeFile":"f","ServeFileFS":"f","ServeMux":"t","ServeMux.Handle":"m","ServeMux.HandleFunc":"m","ServeMux.Handler":"m","ServeMux.ServeHTTP":"m","ServeTLS":"f","Server":"t","Server.Close":"m","Server.ListenAndServe":"m","Server.ListenAndServeTLS":"m","Server.RegisterOnShutdown":"m","Server.Serve":"m","Server.ServeTLS":"m","Server.SetKeepAlivesEnabled":"m","Server.Shutdown":"m","ServerContextKey":"v","SetCookie":"f","StateActive":"c","StateClosed":"c","StateHijacked":"c","StateIdle":"c","StateNew":"c","StatusAccepted":"c","StatusAlreadyReported":"c","StatusBadGateway":"c","StatusBadRequest":"c","StatusConflict":"c","StatusContinue":"c","StatusCreated":"c","StatusEarlyHints":"c","StatusExpectationFailed":"c","StatusFailedDependency":"c","StatusForbidden":"c","StatusFound":"c","StatusGatewayTimeout":"c","StatusGone":"c","StatusHTTPVersionNotSupported":"c","StatusIMUsed":"c","StatusInsufficientStorage":"c","StatusInternalServerError":"c","StatusLengthRequired":"c","StatusLocked":"c","StatusLoopDetected":"c","StatusMethodNotAllowed":"c","StatusMisdirectedRequest":"c","StatusMovedPermanently":"c","StatusMultiStatus":"c","StatusMultipleChoices":"c","StatusNetworkAuthenticationRequired":"c","StatusNoContent":"c","StatusNonAuthoritativeInfo":"c","StatusNotAcceptable":"c","StatusNotExtended":"c","StatusNotFound":"c","StatusNotImplemented":"c","StatusNotModified":"c","StatusOK":"c","StatusPartialContent":"c","StatusPaymentRequired":"c","StatusPermanentRedirect":"c","StatusPreconditionFailed":"c","StatusPreconditionRequired":"c","StatusProcessing":"c","StatusProxyAuthRequired":"c","StatusRequestEntityTooLarge":"c","StatusRequestHeaderFieldsTooLarge":"c","StatusRequestTimeout":"c","StatusRequestURITooLong":"c","StatusRequestedRangeNotSatisfiable":"c","StatusResetContent":"c","StatusSeeOther":"c","StatusServiceUnavailable":"c","StatusSwitchingProtocols":"c","StatusTeapot":"c","StatusTemporaryRedirect":"c","StatusText":"f","StatusTooEarly":"c","StatusTooManyRequests":"c","StatusUnauthorized":"c","StatusUnavailableForLegalReasons":"c","StatusUnprocessableEntity":"c","StatusUnsupportedMediaType":"c","StatusUpgradeRequired":"c","StatusUseProxy":"c","StatusVariantAlsoNegotiates":"c","StripPrefix":"f","TimeFormat":"c","TimeoutHandler":"f","TrailerPrefix":"c","Transport":"t","Transport.CancelRequest":"m","Transport.Clone":"m","Transport.CloseIdleConnections":"m","Transport.NewClientConn":"m","Transport.RegisterProtocol":"m","Transport.RoundTrip":"m"}},"net/http/cgi":{"path":"net/http/cgi","name":"cgi","symbols":{"Handler":"t","Handler.ServeHTTP":"m","Request":"f","RequestFromMap":"f","Serve":"f"}},"net/http/cookiejar":{"path":"net/http/cookiejar","name":"cookiejar","symbols":{"Jar":"t","Jar.Cookies":"m","Jar.SetCookies":"m","New":"f","Options":"t","PublicSuffixList":"t"}},"net/http/fcgi":{"path":"net/http/fcgi","name":"fcgi","symbols":{"ErrConnClosed":"v","ErrRequestAborted":"v","ProcessEnv":"f","Serve":"f"}},"net/http/httptest":{"path":"net/http/httptest","name":"httptest","symbols":{"DefaultRemoteAddr":"c","NewRecorder":"f","NewRequest":"f","NewRequestWithContext":"f","NewServer":"f","NewTLSServer":"f","NewUnstartedServer":"f","ResponseRecorder":"t","ResponseRecorder.Flush":"m","ResponseRecorder.Header":"m","ResponseRecorder.Result":"m","ResponseRecorder.Write":"m","ResponseRecorder.WriteHeader":"m","ResponseRecorder.WriteString":"m","Server":"t","Server.Certificate":"m","Server.Client":"m","Server.Close":"m","Server.CloseClientConnections":"m","Server.Start":"m","Server.StartTLS":"m"}},"net/http/httptrace":{"path":"net/http/httptrace","name":"httptrace","symbols":{"ClientTrace":"t","ContextClientTrace":"f","DNSDoneInfo":"t","DNSStartInfo":"t","GotConnInfo":"t","WithClientTrace":"f","WroteRequestInfo":"t"}},"net/http/httputil":{"path":"net/http/httputil","name":"httputil","symbols":{"BufferPool":"t","ClientConn":"t","ClientConn.Close":"m","ClientConn.Do":"m","ClientConn.Hijack":"m","ClientConn.Pending":"m","ClientConn.Read":"m","ClientConn.Write":"m","DumpRequest":"f","DumpRequestOut":"f","DumpResponse":"f","ErrClosed":"v","ErrLineTooLong":"v","ErrPersistEOF":"v","ErrPipeline":"v","NewChunkedReader":"f","NewChunkedWriter":"f","NewClientConn":"f","NewProxyClientConn":"f","NewServerConn":"f","NewSingleHostReverseProxy":"f","ProxyRequest":"t","ProxyRequest.SetURL":"m","ProxyRequest.SetXForwarded":"m","ReverseProxy":"t","ReverseProxy.ServeHTTP":"m","ServerConn":"t","ServerConn.Close":"m","ServerConn.Hijack":"m","ServerConn.Pending":"m","ServerConn.Read":"m","ServerConn.Write":"m"}},"net/http/pprof":{"path":"net/http/pprof","name":"pprof","symbols":{"Cmdline":"f","Handler":"f","Index":"f","Profile":"f","Symbol":"f","Trace":"f"}},"net/mail":{"path":"net/mail","name":"mail","symbols":{"Address":"t","Address.String":"m","AddressParser":"t","AddressParser.Parse":"m","AddressParser.ParseList":"m","ErrHeaderNotPresent":"v","Header":"t","Header.AddressList":"m","Header.Date":"m","Header.Get":"m","Message":"t","ParseAddress":"f","ParseAddressList":"f","ParseDate":"f","ReadMessage":"f"}},"net/netip":{"path":"net/netip","name":"netip","symbols":{"Addr":"t","Addr.AppendBinary":"m","Addr.AppendText":"m","Addr.AppendTo":"m","Addr.As16":"m","Addr.As4":"m","Addr.AsSlice":"m","Addr.BitLen":"m","Addr.Compare":"m","Addr.Is4":"m","Addr.Is4In6":"m","Addr.Is6":"m","Addr.IsGlobalUnicast":"m","Addr.IsInterfaceLocalMulticast":"m","Addr.IsLinkLocalMulticast":"m","Addr.IsLinkLocalUnicast":"m","Addr.IsLoopback":"m","Addr.IsMulticast":"m","Addr.IsPrivate":"m","Addr.IsUnspecified":"m","Addr.IsValid":"m","Addr.Less":"m","Addr.MarshalBinary":"m","Addr.MarshalText":"m","Addr.Next":"m","Addr.Prefix":"m","Addr.Prev":"m","Addr.String":"m","Addr.StringExpanded":"m","Addr.Unmap":"m","Addr.UnmarshalBinary":"m","Addr.UnmarshalText":"m","Addr.WithZone":"m","Addr.Zone":"m","AddrFrom16":"f","AddrFrom4":"f","AddrFromSlice":"f","AddrPort":"t","AddrPort.Addr":"m","AddrPort.AppendBinary":"m","AddrPort.AppendText":"m","AddrPort.AppendTo":"m","AddrPort.Compare":"m","AddrPort.IsValid":"m","AddrPort.MarshalBinary":"m","AddrPort.MarshalText":"m","AddrPort.Port":"m","AddrPort.String":"m","AddrPort.UnmarshalBinary":"m","AddrPort.UnmarshalText":"m","AddrPortFrom":"f","IPv4Unspecified":"f","IPv6LinkLocalAllNodes":"f","IPv6LinkLocalAllRouters":"f","IPv6Loopback":"f","IPv6Unspecified":"f","MustParseAddr":"f","MustParseAddrPort":"f","MustParsePrefix":"f","ParseAddr":"f","ParseAddrPort":"f","ParsePrefix":"f","Prefix":"t","Prefix.Addr":"m","Prefix.AppendBinary":"m","Prefix.AppendText":"m","Prefix.AppendTo":"m","Prefix.Bits":"m","Prefix.Compare":"m","Prefix.Contains":"m","Prefix.IsSingleIP":"m","Prefix.IsValid":"m","Prefix.MarshalBinary":"m","Prefix.MarshalText":"m","Prefix.Masked":"m","Prefix.Overlaps":"m","Prefix.String":"m","Prefix.UnmarshalBinary":"m","Prefix.UnmarshalText":"m","PrefixFrom":"f"}},"net/rpc":{"path":"net/rpc","name":"rpc","symbols":{"Accept":"f","Call":"t","Client":"t","Client.Call":"m","Client.Close":"m","Client.Go":"m","ClientCodec":"t","DefaultDebugPath":"c","DefaultRPCPath":"c","DefaultServer":"v","Dial":"f","DialHTTP":"f","DialHTTPPath":"f","ErrShutdown":"v","HandleHTTP":"f","NewClient":"f","NewClientWithCodec":"f","NewServer":"f","Register":"f","RegisterName":"f","Request":"t","Response":"t","ServeCodec":"f","ServeConn":"f","ServeRequest":"f","Server":"t","Server.Accept":"m","Server.HandleHTTP":"m","Server.Register":"m","Server.RegisterName":"m","Server.ServeCodec":"m","Server.ServeConn":"m","Server.ServeHTTP":"m","Server.ServeRequest":"m","ServerCodec":"t","ServerError":"t","ServerError.Error":"m"}},"net/rpc/jsonrpc":{"path":"net/rpc/jsonrpc","name":"jsonrpc","symbols":{"Dial":"f","NewClient":"f","NewClientCodec":"f","NewServerCodec":"f","ServeConn":"f"}},"net/smtp":{"path":"net/smtp","name":"smtp","symbols":{"Auth":"t","CRAMMD5Auth":"f","Client":"t","Client.Auth":"m","Client.Close":"m","Client.Data":"m","Client.Extension":"m","Client.Hello":"m","Client.Mail":"m","Client.Noop":"m","Client.Quit":"m","Client.Rcpt":"m","Client.Reset":"m","Client.StartTLS":"m","Client.TLSConnectionState":"m","Client.Verify":"m","Dial":"f","NewClient":"f","PlainAuth":"f","SendMail":"f","ServerInfo":"t"}},"net/textproto":{"path":"net/textproto","name":"textproto","symbols":{"CanonicalMIMEHeaderKey":"f","Conn":"t","Conn.Close":"m","Conn.Cmd":"m","Dial":"f","Error":"t","Error.Error":"m","MIMEHeader":"t","MIMEHeader.Add":"m","MIMEHeader.Del":"m","MIMEHeader.Get":"m","MIMEHeader.Set":"m","MIMEHeader.Values":"m","NewConn":"f","NewReader":"f","NewWriter":"f","Pipeline":"t","Pipeline.EndRequest":"m","Pipeline.EndResponse":"m","Pipeline.Next":"m","Pipeline.StartRequest":"m","Pipeline.StartResponse":"m","ProtocolError":"t","ProtocolError.Error":"m","Reader":"t","Reader.DotReader":"m","Reader.ReadCodeLine":"m","Reader.ReadContinuedLine":"m","Reader.ReadContinuedLineBytes":"m","Reader.ReadDotBytes":"m","Reader.ReadDotLines":"m","Reader.ReadLine":"m","Reader.ReadLineBytes":"m","Reader.ReadMIMEHeader":"m","Reader.ReadResponse":"m","TrimBytes":"f","TrimString":"f","Writer":"t","Writer.DotWriter":"m","Writer.PrintfLine":"m"}},"net/url":{"path":"net/url","name":"url","symbols":{"Error":"t","Error.Error":"m","Error.Temporary":"m","Error.Timeout":"m","Error.Unwrap":"m","EscapeError":"t","EscapeError.Error":"m","InvalidHostError":"t","InvalidHostError.Error":"m","JoinPath":"f","Parse":"f","ParseQuery":"f","ParseRequestURI":"f","PathEscape":"f","PathUnescape":"f","QueryEscape":"f","QueryUnescape":"f","URL":"t","URL.AppendBinary":"m","URL.EscapedFragment":"m","URL.EscapedPath":"m","URL.Hostname":"m","URL.IsAbs":"m","URL.JoinPath":"m","URL.MarshalBinary":"m","URL.Parse":"m","URL.Port":"m","URL.Query":"m","URL.Redacted":"m","URL.RequestURI":"m","URL.ResolveReference":"m","URL.String":"m","URL.UnmarshalBinary":"m","User":"f","UserPassword":"f","Userinfo":"t","Userinfo.Password":"m","Userinfo.String":"m","Userinfo.Username":"m","Values":"t","Values.Add":"m","Values.Del":"m","Values.Encode":"m","Values.Get":"m","Values.Has":"m","Values.Set":"m"}},"os":{"path":"os","name":"os","symbols":{"Args":"v","Chdir":"f","Chmod":"f","Chown":"f","Chtimes":"f","Clearenv":"f","CopyFS":"f","Create":"f","CreateTemp":"f","DevNull":"c","DirEntry":"t","DirFS":"f","Environ":"f","ErrClosed":"v","ErrDeadlineExceeded":"v","ErrExist":"v","ErrInvalid":"v","ErrNoDeadline":"v","ErrNoHandle":"v","ErrNotExist":"v","ErrPermission":"v","ErrProcessDone":"v","Executable":"f","Exit":"f","Expand":"f","ExpandEnv":"f","File":"t","File.Chdir":"m","File.Chmod":"m","File.Chown":"m","File.Close":"m","File.Fd":"m","File.Name":"m","File.Read":"m","File.ReadAt":"m","File.ReadDir":"m","File.ReadFrom":"m","File.Readdir":"m","File.Readdirnames":"m","File.Seek":"m","File.SetDeadline":"m","File.SetReadDeadline":"m","File.SetWriteDeadline":"m","File.Stat":"m","File.Sync":"m","File.SyscallConn":"m","File.Truncate":"m","File.Write":"m","File.WriteAt":"m","File.WriteString":"m","File.WriteTo":"m","FileInfo":"t","FileMode":"t","FindProcess":"f","Getegid":"f","Getenv":"f","Geteuid":"f","Getgid":"f","Getgroups":"f","Getpagesize":"f","Getpid":"f","Getppid":"f","Getuid":"f","Getwd":"f","Hostname":"f","Interrupt":"v","IsExist":"f","IsNotExist":"f","IsPathSeparator":"f","IsPermission":"f","IsTimeout":"f","Kill":"v","Lchown":"f","Link":"f","LinkError":"t","LinkError.Error":"m","LinkError.Unwrap":"m","LookupEnv":"f","Lstat":"f","Mkdir":"f","MkdirAll":"f","MkdirTemp":"f","ModeAppend":"c","ModeCharDevice":"c","ModeDevice":"c","ModeDir":"c","ModeExclusive":"c","ModeIrregular":"c","ModeNamedPipe":"c","ModePerm":"c","ModeSetgid":"c","ModeSetuid":"c","ModeSocket":"c","ModeSticky":"c","ModeSymlink":"c","ModeTemporary":"c","ModeType":"c","NewFile":"f","NewSyscallError":"f","O_APPEND":"c","O_CREATE":"c","O_EXCL":"c","O_RDONLY":"c","O_RDWR":"c","O_SYNC":"c","O_TRUNC":"c","O_WRONLY":"c","Open":"f","OpenFile":"f","OpenInRoot":"f","OpenRoot":"f","PathError":"t","PathListSeparator":"c","PathSeparator":"c","Pipe":"f","ProcAttr":"t","Process":"t","Process.Kill":"m","Process.Release":"m","Process.Signal":"m","Process.Wait":"m","Process.WithHandle":"m","ProcessState":"t","ProcessState.ExitCode":"m","ProcessState.Exited":"m","ProcessState.Pid":"m","ProcessState.String":"m","ProcessState.Success":"m","ProcessState.Sys":"m","ProcessState.SysUsage":"m","ProcessState.SystemTime":"m","ProcessState.UserTime":"m","ReadDir":"f","ReadFile":"f","Readlink":"f","Remove":"f","RemoveAll":"f","Rename":"f","Root":"t","Root.Chmod":"m","Root.Chown":"m","Root.Chtimes":"m","Root.Close":"m","Root.Create":"m","Root.FS":"m","Root.Lchown":"m","Root.Link":"m","Root.Lstat":"m","Root.Mkdir":"m","Root.MkdirAll":"m","Root.Name":"m","Root.Open":"m","Root.OpenFile":"m","Root.OpenRoot":"m","Root.ReadFile":"m","Root.Readlink":"m","Root.Remove":"m","Root.RemoveAll":"m","Root.Rename":"m","Root.Stat":"m","Root.Symlink":"m","Root.WriteFile":"m","SEEK_CUR":"c","SEEK_END":"c","SEEK_SET":"c","SameFile":"f","Setenv":"f","Signal":"t","StartProcess":"f","Stat":"f","Stderr":"v","Stdin":"v","Stdout":"v","Symlink":"f","SyscallError":"t","SyscallError.Error":"m","SyscallError.Timeout":"m","SyscallError.Unwrap":"m","TempDir":"f","Truncate":"f","Unsetenv":"f","UserCacheDir":"f","UserConfigDir":"f","UserHomeDir":"f","WriteFile":"f"}},"os/exec":{"path":"os/exec","name":"exec","symbols":{"Cmd":"t","Cmd.CombinedOutput":"m","Cmd.Environ":"m","Cmd.Output":"m","Cmd.Run":"m","Cmd.Start":"m","Cmd.StderrPipe":"m","Cmd.StdinPipe":"m","Cmd.StdoutPipe":"m","Cmd.String":"m","Cmd.Wait":"m","Command":"f","CommandContext":"f","ErrDot":"v","ErrNotFound":"v","ErrWaitDelay":"v","Error":"t","Error.Error":"m","Error.Unwrap":"m","ExitError":"t","ExitError.Error":"m","LookPath":"f"}},"os/signal":{"path":"os/signal","name":"signal","symbols":{"Ignore":"f","Ignored":"f","Notify":"f","NotifyContext":"f","Reset":"f","Stop":"f"}},"os/user":{"path":"os/user","name":"user","symbols":{"Current":"f","Group":"t","Lookup":"f","LookupGroup":"f","LookupGroupId":"f","LookupId":"f","UnknownGroupError":"t","UnknownGroupError.Error":"m","UnknownGroupIdError":"t","UnknownGroupIdError.Error":"m","UnknownUserError":"t","UnknownUserError.Error":"m","UnknownUserIdError":"t","UnknownUserIdError.Error":"m","User":"t","User.GroupIds":"m"}},"path":{"path":"path","name":"path","symbols":{"Base":"f","Clean":"f","Dir":"f","ErrBadPattern":"v","Ext":"f","IsAbs":"f","Join":"f","Match":"f","Split":"f"}},"path/filepath":{"path":"path/filepath","name":"filepath","symbols":{"Abs":"f","Base":"f","Clean":"f","Dir":"f","ErrBadPattern":"v","EvalSymlinks":"f","Ext":"f","FromSlash":"f","Glob":"f","HasPrefix":"f","IsAbs":"f","IsLocal":"f","Join":"f","ListSeparator":"c","Localize":"f","Match":"f","Rel":"f","Separator":"c","SkipAll":"v","SkipDir":"v","Split":"f","SplitList":"f","ToSlash":"f","VolumeName":"f","Walk":"f","WalkDir":"f","WalkFunc":"t"}},"plugin":{"path":"plugin","name":"plugin","symbols":{"Open":"f","Plugin":"t","Plugin.Lookup":"m","Symbol":"t"}},"reflect":{"path":"reflect","name":"reflect","symbols":{"Append":"f","AppendSlice":"f","Array":"c","ArrayOf":"f","Bool":"c","BothDir":"c","Chan":"c","ChanDir":"t","ChanDir.String":"m","ChanOf":"f","Complex128":"c","Complex64":"c","Copy":"f","DeepEqual":"f","Float32":"c","Float64":"c","Func":"c","FuncOf":"f","Indirect":"f","Int":"c","Int16":"c","Int32":"c","Int64":"c","Int8":"c","Interface":"c","Invalid":"c","Kind":"t","Kind.String":"m","MakeChan":"f","MakeFunc":"f","MakeMap":"f","MakeMapWithSize":"f","MakeSlice":"f","Map":"c","MapIter":"t","MapIter.Key":"m","MapIter.Next":"m","MapIter.Reset":"m","MapIter.Value":"m","MapOf":"f","Method":"t","Method.IsExported":"m","New":"f","NewAt":"f","Pointer":"c","PointerTo":"f","Ptr":"c","PtrTo":"f","RecvDir":"c","Select":"f","SelectCase":"t","SelectDefault":"c","SelectDir":"t","SelectRecv":"c","SelectSend":"c","SendDir":"c","Slice":"c","SliceAt":"f","SliceHeader":"t","SliceOf":"f","String":"c","StringHeader":"t","Struct":"c","StructField":"t","StructField.IsExported":"m","StructOf":"f","StructTag":"t","StructTag.Get":"m","StructTag.Lookup":"m","Swapper":"f","Type":"t","TypeAssert":"f","TypeFor":"f","TypeOf":"f","Uint":"c","Uint16":"c","Uint32":"c","Uint64":"c","Uint8":"c","Uintptr":"c","UnsafePointer":"c","Value":"t","Value.Addr":"m","Value.Bool":"m","Value.Bytes":"m","Value.Call":"m","Value.CallSlice":"m","Value.CanAddr":"m","Value.CanComplex":"m","Value.CanConvert":"m","Value.CanFloat":"m","Value.CanInt":"m","Value.CanInterface":"m","Value.CanSet":"m","Value.CanUint":"m","Value.Cap":"m","Value.Clear":"m","Value.Close":"m","Value.Comparable":"m","Value.Complex":"m","Value.Convert":"m","Value.Elem":"m","Value.Equal":"m","Value.Field":"m","Value.FieldByIndex":"m","Value.FieldByIndexErr":"m","Value.FieldByName":"m","Value.FieldByNameFunc":"m","Value.Fields":"m","Value.Float":"m","Value.Grow":"m","Value.Index":"m","Value.Int":"m","Value.Interface":"m","Value.InterfaceData":"m","Value.IsNil":"m","Value.IsValid":"m","Value.IsZero":"m","Value.Kind":"m","Value.Len":"m","Value.MapIndex":"m","Value.MapKeys":"m","Value.MapRange":"m","Value.Method":"m","Value.MethodByName":"m","Value.Methods":"m","Value.NumField":"m","Value.NumMethod":"m","Value.OverflowComplex":"m","Value.OverflowFloat":"m","Value.OverflowInt":"m","Value.OverflowUint":"m","Value.Pointer":"m","Value.Recv":"m","Value.Send":"m","Value.Seq":"m","Value.Seq2":"m","Value.Set":"m","Value.SetBool":"m","Value.SetBytes":"m","Value.SetCap":"m","Value.SetComplex":"m","Value.SetFloat":"m","Value.SetInt":"m","Value.SetIterKey":"m","Value.SetIterValue":"m","Value.SetLen":"m","Value.SetMapIndex":"m","Value.SetPointer":"m","Value.SetString":"m","Value.SetUint":"m","Value.SetZero":"m","Value.Slice":"m","Value.Slice3":"m","Value.String":"m","Value.TryRecv":"m","Value.TrySend":"m","Value.Type":"m","Value.Uint":"m","Value.UnsafeAddr":"m","Value.UnsafePointer":"m","ValueError":"t","ValueError.Error":"m","ValueOf":"f","VisibleFields":"f","Zero":"f"}},"regexp":{"path":"regexp","name":"regexp","symbols":{"Compile":"f","CompilePOSIX":"f","Match":"f","MatchReader":"f","MatchString":"f","MustCompile":"f","MustCompilePOSIX":"f","QuoteMeta":"f","Regexp":"t","Regexp.AppendText":"m","Regexp.Copy":"m","Regexp.Expand":"m","Regexp.ExpandString":"m","Regexp.Find":"m","Regexp.FindAll":"m","Regexp.FindAllIndex":"m","Regexp.FindAllString":"m","Regexp.FindAllStringIndex":"m","Regexp.FindAllStringSubmatch":"m","Regexp.FindAllStringSubmatchIndex":"m","Regexp.FindAllSubmatch":"m","Regexp.FindAllSubmatchIndex":"m","Regexp.FindIndex":"m","Regexp.FindReaderIndex":"m","Regexp.FindReaderSubmatchIndex":"m","Regexp.FindString":"m","Regexp.FindStringIndex":"m","Regexp.FindStringSubmatch":"m","Regexp.FindStringSubmatchIndex":"m","Regexp.FindSubmatch":"m","Regexp.FindSubmatchIndex":"m","Regexp.LiteralPrefix":"m","Regexp.Longest":"m","Regexp.MarshalText":"m","Regexp.Match":"m","Regexp.MatchReader":"m","Regexp.MatchString":"m","Regexp.NumSubexp":"m","Regexp.ReplaceAll":"m","Regexp.ReplaceAllFunc":"m","Regexp.ReplaceAllLiteral":"m","Regexp.ReplaceAllLiteralString":"m","Regexp.ReplaceAllString":"m","Regexp.ReplaceAllStringFunc":"m","Regexp.Split":"m","Regexp.String":"m","Regexp.SubexpIndex":"m","Regexp.SubexpNames":"m","Regexp.UnmarshalText":"m"}},"regexp/syntax":{"path":"regexp/syntax","name":"syntax","symbols":{"ClassNL":"c","Compile":"f","DotNL":"c","EmptyBeginLine":"c","EmptyBeginText":"c","EmptyEndLine":"c","EmptyEndText":"c","EmptyNoWordBoundary":"c","EmptyOp":"t","EmptyOpContext":"f","EmptyWordBoundary":"c","ErrInternalError":"c","ErrInvalidCharClass":"c","ErrInvalidCharRange":"c","ErrInvalidEscape":"c","ErrInvalidNamedCapture":"c","ErrInvalidPerlOp":"c","ErrInvalidRepeatOp":"c","ErrInvalidRepeatSize":"c","ErrInvalidUTF8":"c","ErrLarge":"c","ErrMissingBracket":"c","ErrMissingParen":"c","ErrMissingRepeatArgument":"c","ErrNestingDepth":"c","ErrTrailingBackslash":"c","ErrUnexpectedParen":"c","Error":"t","Error.Error":"m","ErrorCode":"t","ErrorCode.String":"m","Flags":"t","FoldCase":"c","Inst":"t","Inst.MatchEmptyWidth":"m","Inst.MatchRune":"m","Inst.MatchRunePos":"m","Inst.String":"m","InstAlt":"c","InstAltMatch":"c","InstCapture":"c","InstEmptyWidth":"c","InstFail":"c","InstMatch":"c","InstNop":"c","InstOp":"t","InstOp.String":"m","InstRune":"c","InstRune1":"c","InstRuneAny":"c","InstRuneAnyNotNL":"c","IsWordChar":"f","Literal":"c","MatchNL":"c","NonGreedy":"c","OneLine":"c","Op":"t","Op.String":"m","OpAlternate":"c","OpAnyChar":"c","OpAnyCharNotNL":"c","OpBeginLine":"c","OpBeginText":"c","OpCapture":"c","OpCharClass":"c","OpConcat":"c","OpEmptyMatch":"c","OpEndLine":"c","OpEndText":"c","OpLiteral":"c","OpNoMatch":"c","OpNoWordBoundary":"c","OpPlus":"c","OpQuest":"c","OpRepeat":"c","OpStar":"c","OpWordBoundary":"c","POSIX":"c","Parse":"f","Perl":"c","PerlX":"c","Prog":"t","Prog.Prefix":"m","Prog.StartCond":"m","Prog.String":"m","Regexp":"t","Regexp.CapNames":"m","Regexp.Equal":"m","Regexp.MaxCap":"m","Regexp.Simplify":"m","Regexp.String":"m","Simple":"c","UnicodeGroups":"c","WasDollar":"c"}},"runtime":{"path":"runtime","name":"runtime","symbols":{"AddCleanup":"f","BlockProfile":"f","BlockProfileRecord":"t","Breakpoint":"f","CPUProfile":"f","Caller":"f","Callers":"f","CallersFrames":"f","Cleanup":"t","Cleanup.Stop":"m","Compiler":"c","Error":"t","Frame":"t","Frames":"t","Frames.Next":"m","Func":"t","Func.Entry":"m","Func.FileLine":"m","Func.Name":"m","FuncForPC":"f","GC":"f","GOARCH":"c","GOMAXPROCS":"f","GOOS":"c","GOROOT":"f","Goexit":"f","GoroutineProfile":"f","Gosched":"f","KeepAlive":"f","LockOSThread":"f","MemProfile":"f","MemProfileRate":"v","MemProfileRecord":"t","MemProfileRecord.InUseBytes":"m","MemProfileRecord.InUseObjects":"m","MemProfileRecord.Stack":"m","MemStats":"t","MutexProfile":"f","NumCPU":"f","NumCgoCall":"f","NumGoroutine":"f","PanicNilError":"t","PanicNilError.Error":"m","PanicNilError.RuntimeError":"m","Pinner":"t","Pinner.Pin":"m","Pinner.Unpin":"m","ReadMemStats":"f","ReadTrace":"f","SetBlockProfileRate":"f","SetCPUProfileRate":"f","SetCgoTraceback":"f","SetDefaultGOMAXPROCS":"f","SetFinalizer":"f","SetMutexProfileFraction":"f","Stack":"f","StackRecord":"t","StackRecord.Stack":"m","StartTrace":"f","StopTrace":"f","ThreadCreateProfile":"f","TypeAssertionError":"t","TypeAssertionError.Error":"m","TypeAssertionError.RuntimeError":"m","UnlockOSThread":"f","Version":"f"}},"runtime/cgo":{"path":"runtime/cgo","name":"cgo","symbols":{"Handle":"t","Handle.Delete":"m","Handle.Value":"m","Incomplete":"t","NewHandle":"f"}},"runtime/coverage":{"path":"runtime/coverage","name":"coverage","symbols":{"ClearCounters":"f","WriteCounters":"f","WriteCountersDir":"f","WriteMeta":"f","WriteMetaDir":"f"}},"runtime/debug":{"path":"runtime/debug","name":"debug","symbols":{"BuildInfo":"t","BuildInfo.String":"m","BuildSetting":"t","CrashOptions":"t","FreeOSMemory":"f","GCStats":"t","Module":"t","ParseBuildInfo":"f","PrintStack":"f","ReadBuildInfo":"f","ReadGCStats":"f","SetCrashOutput":"f","SetGCPercent":"f","SetMaxStack":"f","SetMaxThreads":"f","SetMemoryLimit":"f","SetPanicOnFault":"f","SetTraceback":"f","Stack":"f","WriteHeapDump":"f"}},"runtime/metrics":{"path":"runtime/metrics","name":"metrics","symbols":{"All":"f","Description":"t","Float64Histogram":"t","KindBad":"c","KindFloat64":"c","KindFloat64Histogram":"c","KindUint64":"c","Read":"f","Sample":"t","Value":"t","Value.Float64":"m","Value.Float64Histogram":"m","Value.Kind":"m","Value.Uint64":"m","ValueKind":"t"}},"runtime/pprof":{"path":"runtime/pprof","name":"pprof","symbols":{"Do":"f","ForLabels":"f","Label":"f","LabelSet":"t","Labels":"f","Lookup":"f","NewProfile":"f","Profile":"t","Profile.Add":"m","Profile.Count":"m","Profile.Name":"m","Profile.Remove":"m","Profile.WriteTo":"m","Profiles":"f","SetGoroutineLabels":"f","StartCPUProfile":"f","StopCPUProfile":"f","WithLabels":"f","WriteHeapProfile":"f"}},"runtime/trace":{"path":"runtime/trace","name":"trace","symbols":{"FlightRecorder":"t","FlightRecorder.Enabled":"m","FlightRecorder.Start":"m","FlightRecorder.Stop":"m","FlightRecorder.WriteTo":"m","FlightRecorderConfig":"t","IsEnabled":"f","Log":"f","Logf":"f","NewFlightRecorder":"f","NewTask":"f","Region":"t","Region.End":"m","Start":"f","StartRegion":"f","Stop":"f","Task":"t","Task.End":"m","WithRegion":"f"}},"slices":{"path":"slices","name":"slices","symbols":{"All":"f","AppendSeq":"f","Backward":"f","BinarySearch":"f","BinarySearchFunc":"f","Chunk":"f","Clip":"f","Clone":"f","Collect":"f","Compact":"f","CompactFunc":"f","Compare":"f","CompareFunc":"f","Concat":"f","Contains":"f","ContainsFunc":"f","Delete":"f","DeleteFunc":"f","Equal":"f","EqualFunc":"f","Grow":"f","Index":"f","IndexFunc":"f","Insert":"f","IsSorted":"f","IsSortedFunc":"f","Max":"f","MaxFunc":"f","Min":"f","MinFunc":"f","Repeat":"f","Replace":"f","Reverse":"f","Sort":"f","SortFunc":"f","SortStableFunc":"f","Sorted":"f","SortedFunc":"f","SortedStableFunc":"f","Values":"f"}},"sort":{"path":"sort","name":"sort","symbols":{"Find":"f","Float64Slice":"t","Float64Slice.Len":"m","Float64Slice.Less":"m","Float64Slice.Search":"m","Float64Slice.Sort":"m","Float64Slice.Swap":"m","Float64s":"f","Float64sAreSorted":"f","IntSlice":"t","IntSlice.Len":"m","IntSlice.Less":"m","IntSlice.Search":"m","IntSlice.Sort":"m","IntSlice.Swap":"m","Interface":"t","Ints":"f","IntsAreSorted":"f","IsSorted":"f","Reverse":"f","Search":"f","SearchFloat64s":"f","SearchInts":"f","SearchStrings":"f","Slice":"f","SliceIsSorted":"f","SliceStable":"f","Sort":"f","Stable":"f","StringSlice":"t","StringSlice.Len":"m","StringSlice.Less":"m","StringSlice.Search":"m","StringSlice.Sort":"m","StringSlice.Swap":"m","Strings":"f","StringsAreSorted":"f"}},"strconv":{"path":"strconv","name":"strconv","symbols":{"AppendBool":"f","AppendFloat":"f","AppendInt":"f","AppendQuote":"f","AppendQuoteRune":"f","AppendQuoteRuneToASCII":"f","AppendQuoteRuneToGraphic":"f","AppendQuoteToASCII":"f","AppendQuoteToGraphic":"f","AppendUint":"f","Atoi":"f","CanBackquote":"f","ErrRange":"v","ErrSyntax":"v","FormatBool":"f","FormatComplex":"f","FormatFloat":"f","FormatInt":"f","FormatUint":"f","IntSize":"c","IsGraphic":"f","IsPrint":"f","Itoa":"f","NumError":"t","NumError.Error":"m","NumError.Unwrap":"m","ParseBool":"f","ParseComplex":"f","ParseFloat":"f","ParseInt":"f","ParseUint":"f","Quote":"f","QuoteRune":"f","QuoteRuneToASCII":"f","QuoteRuneToGraphic":"f","QuoteToASCII":"f","QuoteToGraphic":"f","QuotedPrefix":"f","Unquote":"f","UnquoteChar":"f"}},"strings":{"path":"strings","name":"strings","symbols":{"Builder":"t","Builder.Cap":"m","Builder.Grow":"m","Builder.Len":"m","Builder.Reset":"m","Builder.String":"m","Builder.Write":"m","Builder.WriteByte":"m","Builder.WriteRune":"m","Builder.WriteString":"m","Clone":"f","Compare":"f","Contains":"f","ContainsAny":"f","ContainsFunc":"f","ContainsRune":"f","Count":"f","Cut":"f","CutPrefix":"f","CutSuffix":"f","EqualFold":"f","Fields":"f","FieldsFunc":"f","FieldsFuncSeq":"f","FieldsSeq":"f","HasPrefix":"f","HasSuffix":"f","Index":"f","IndexAny":"f","IndexByte":"f","IndexFunc":"f","IndexRune":"f","Join":"f","LastIndex":"f","LastIndexAny":"f","LastIndexByte":"f","LastIndexFunc":"f","Lines":"f","Map":"f","NewReader":"f","NewReplacer":"f","Reader":"t","Reader.Len":"m","Reader.Read":"m","Reader.ReadAt":"m","Reader.ReadByte":"m","Reader.ReadRune":"m","Reader.Reset":"m","Reader.Seek":"m","Reader.Size":"m","Reader.UnreadByte":"m","Reader.UnreadRune":"m","Reader.WriteTo":"m","Repeat":"f","Replace":"f","ReplaceAll":"f","Replacer":"t","Replacer.Replace":"m","Replacer.WriteString":"m","Split":"f","SplitAfter":"f","SplitAfterN":"f","SplitAfterSeq":"f","SplitN":"f","SplitSeq":"f","Title":"f","ToLower":"f","ToLowerSpecial":"f","ToTitle":"f","ToTitleSpecial":"f","ToUpper":"f","ToUpperSpecial":"f","ToValidUTF8":"f","Trim":"f","TrimFunc":"f","TrimLeft":"f","TrimLeftFunc":"f","TrimPrefix":"f","TrimRight":"f","TrimRightFunc":"f","TrimSpace":"f","TrimSuffix":"f"}},"structs":{"path":"structs","name":"structs","symbols":{"HostLayout":"t"}},"sync":{"path":"sync","name":"sync","symbols":{"Cond":"t","Cond.Broadcast":"m","Cond.Signal":"m","Cond.Wait":"m","Locker":"t","Map":"t","Map.Clear":"m","Map.CompareAndDelete":"m","Map.CompareAndSwap":"m","Map.Delete":"m","Map.Load":"m","Map.LoadAndDelete":"m","Map.LoadOrStore":"m","Map.Range":"m","Map.Store":"m","Map.Swap":"m","Mutex":"t","Mutex.Lock":"m","Mutex.TryLock":"m","Mutex.Unlock":"m","NewCond":"f","Once":"t","Once.Do":"m","OnceFunc":"f","OnceValue":"f","OnceValues":"f","Pool":"t","Pool.Get":"m","Pool.Put":"m","RWMutex":"t","RWMutex.Lock":"m","RWMutex.RLock":"m","RWMutex.RLocker":"m","RWMutex.RUnlock":"m","RWMutex.TryLock":"m","RWMutex.TryRLock":"m","RWMutex.Unlock":"m","WaitGroup":"t","WaitGroup.Add":"m","WaitGroup.Done":"m","WaitGroup.Go":"m","WaitGroup.Wait":"m"}},"sync/atomic":{"path":"sync/atomic","name":"atomic","symbols":{"AddInt32":"f","AddInt64":"f","AddUint32":"f","AddUint64":"f","AddUintptr":"f","AndInt32":"f","AndInt64":"f","AndUint32":"f","AndUint64":"f","AndUintptr":"f","Bool":"t","Bool.CompareAndSwap":"m","Bool.Load":"m","Bool.Store":"m","Bool.Swap":"m","CompareAndSwapInt32":"f","CompareAndSwapInt64":"f","CompareAndSwapPointer":"f","CompareAndSwapUint32":"f","CompareAndSwapUint64":"f","CompareAndSwapUintptr":"f","Int32":"t","Int32.Add":"m","Int32.And":"m","Int32.CompareAndSwap":"m","Int32.Load":"m","Int32.Or":"m","Int32.Store":"m","Int32.Swap":"m","Int64":"t","Int64.Add":"m","Int64.And":"m","Int64.CompareAndSwap":"m","Int64.Load":"m","Int64.Or":"m","Int64.Store":"m","Int64.Swap":"m","LoadInt32":"f","LoadInt64":"f","LoadPointer":"f","LoadUint32":"f","LoadUint64":"f","LoadUintptr":"f","OrInt32":"f","OrInt64":"f","OrUint32":"f","OrUint64":"f","OrUintptr":"f","Pointer":"t","StoreInt32":"f","StoreInt64":"f","StorePointer":"f","StoreUint32":"f","StoreUint64":"f","StoreUintptr":"f","SwapInt32":"f","SwapInt64":"f","SwapPointer":"f","SwapUint32":"f","SwapUint64":"f","SwapUintptr":"f","Uint32":"t","Uint32.Add":"m","Uint32.And":"m","Uint32.CompareAndSwap":"m","Uint32.Load":"m","Uint32.Or":"m","Uint32.Store":"m","Uint32.Swap":"m","Uint64":"t","Uint64.Add":"m","Uint64.And":"m","Uint64.CompareAndSwap":"m","Uint64.Load":"m","Uint64.Or":"m","Uint64.Store":"m","Uint64.Swap":"m","Uintptr":"t","Uintptr.Add":"m","Uintptr.And":"m","Uintptr.CompareAndSwap":"m","Uintptr.Load":"m","Uintptr.Or":"m","Uintptr.Store":"m","Uintptr.Swap":"m","Value":"t","Value.CompareAndSwap":"m","Value.Load":"m","Value.Store":"m","Value.Swap":"m"}},"syscall":{"path":"syscall","name":"syscall","symbols":{"AF_ALG":"c","AF_APPLETALK":"c","AF_ASH":"c","AF_ATMPVC":"c","AF_ATMSVC":"c","AF_AX25":"c","AF_BLUETOOTH":"c","AF_BRIDGE":"c","AF_CAIF":"c","AF_CAN":"c","AF_DECnet":"c","AF_ECONET":"c","AF_FILE":"c","AF_IEEE802154":"c","AF_INET":"c","AF_INET6":"c","AF_IPX":"c","AF_IRDA":"c","AF_ISDN":"c","AF_IUCV":"c","AF_KEY":"c","AF_LLC":"c","AF_LOCAL":"c","AF_MAX":"c","AF_NETBEUI":"c","AF_NETLINK":"c","AF_NETROM":"c","AF_PACKET":"c","AF_PHONET":"c","AF_PPPOX":"c","AF_RDS":"c","AF_ROSE":"c","AF_ROUTE":"c","AF_RXRPC":"c","AF_SECURITY":"c","AF_SNA":"c","AF_TIPC":"c","AF_UNIX":"c","AF_UNSPEC":"c","AF_WANPIPE":"c","AF_X25":"c","ARPHRD_ADAPT":"c","ARPHRD_APPLETLK":"c","ARPHRD_ARCNET":"c","ARPHRD_ASH":"c","ARPHRD_ATM":"c","ARPHRD_AX25":"c","ARPHRD_BIF":"c","ARPHRD_CHAOS":"c","ARPHRD_CISCO":"c","ARPHRD_CSLIP":"c","ARPHRD_CSLIP6":"c","ARPHRD_DDCMP":"c","ARPHRD_DLCI":"c","ARPHRD_ECONET":"c","ARPHRD_EETHER":"c","ARPHRD_ETHER":"c","ARPHRD_EUI64":"c","ARPHRD_FCAL":"c","ARPHRD_FCFABRIC":"c","ARPHRD_FCPL":"c","ARPHRD_FCPP":"c","ARPHRD_FDDI":"c","ARPHRD_FRAD":"c","ARPHRD_HDLC":"c","ARPHRD_HIPPI":"c","ARPHRD_HWX25":"c","ARPHRD_IEEE1394":"c","ARPHRD_IEEE802":"c","ARPHRD_IEEE80211":"c","ARPHRD_IEEE80211_PRISM":"c","ARPHRD_IEEE80211_RADIOTAP":"c","ARPHRD_IEEE802154":"c","ARPHRD_IEEE802154_PHY":"c","ARPHRD_IEEE802_TR":"c","ARPHRD_INFINIBAND":"c","ARPHRD_IPDDP":"c","ARPHRD_IPGRE":"c","ARPHRD_IRDA":"c","ARPHRD_LAPB":"c","ARPHRD_LOCALTLK":"c","ARPHRD_LOOPBACK":"c","ARPHRD_METRICOM":"c","ARPHRD_NETROM":"c","ARPHRD_NONE":"c","ARPHRD_PIMREG":"c","ARPHRD_PPP":"c","ARPHRD_PRONET":"c","ARPHRD_RAWHDLC":"c","ARPHRD_ROSE":"c","ARPHRD_RSRVD":"c","ARPHRD_SIT":"c","ARPHRD_SKIP":"c","ARPHRD_SLIP":"c","ARPHRD_SLIP6":"c","ARPHRD_TUNNEL":"c","ARPHRD_TUNNEL6":"c","ARPHRD_VOID":"c","ARPHRD_X25":"c","Accept":"f","Accept4":"f","Access":"f","Acct":"f","Adjtimex":"f","AllThreadsSyscall":"f","AllThreadsSyscall6":"f","AttachLsf":"f","B0":"c","B1000000":"c","B110":"c","B115200":"c","B1152000":"c","B1200":"c","B134":"c","B150":"c","B1500000":"c","B1800":"c","B19200":"c","B200":"c","B2000000":"c","B230400":"c","B2400":"c","B2500000":"c","B300":"c","B3000000":"c","B3500000":"c","B38400":"c","B4000000":"c","B460800":"c","B4800":"c","B50":"c","B500000":"c","B57600":"c","B576000":"c","B600":"c","B75":"c","B921600":"c","B9600":"c","BPF_A":"c","BPF_ABS":"c","BPF_ADD":"c","BPF_ALU":"c","BPF_AND":"c","BPF_B":"c","BPF_DIV":"c","BPF_H":"c","BPF_IMM":"c","BPF_IND":"c","BPF_JA":"c","BPF_JEQ":"c","BPF_JGE":"c","BPF_JGT":"c","BPF_JMP":"c","BPF_JSET":"c","BPF_K":"c","BPF_LD":"c","BPF_LDX":"c","BPF_LEN":"c","BPF_LSH":"c","BPF_MAJOR_VERSION":"c","BPF_MAXINSNS":"c","BPF_MEM":"c","BPF_MEMWORDS":"c","BPF_MINOR_VERSION":"c","BPF_MISC":"c","BPF_MSH":"c","BPF_MUL":"c","BPF_NEG":"c","BPF_OR":"c","BPF_RET":"c","BPF_RSH":"c","BPF_ST":"c","BPF_STX":"c","BPF_SUB":"c","BPF_TAX":"c","BPF_TXA":"c","BPF_W":"c","BPF_X":"c","BRKINT":"c","Bind":"f","BindToDevice":"f","BytePtrFromString":"f","ByteSliceFromString":"f","CLOCAL":"c","CLONE_CHILD_CLEARTID":"c","CLONE_CHILD_SETTID":"c","CLONE_CLEAR_SIGHAND":"c","CLONE_DETACHED":"c","CLONE_FILES":"c","CLONE_FS":"c","CLONE_INTO_CGROUP":"c","CLONE_IO":"c","CLONE_NEWCGROUP":"c","CLONE_NEWIPC":"c","CLONE_NEWNET":"c","CLONE_NEWNS":"c","CLONE_NEWPID":"c","CLONE_NEWTIME":"c","CLONE_NEWUSER":"c","CLONE_NEWUTS":"c","CLONE_PARENT":"c","CLONE_PARENT_SETTID":"c","CLONE_PIDFD":"c","CLONE_PTRACE":"c","CLONE_SETTLS":"c","CLONE_SIGHAND":"c","CLONE_SYSVSEM":"c","CLONE_THREAD":"c","CLONE_UNTRACED":"c","CLONE_VFORK":"c","CLONE_VM":"c","CREAD":"c","CS5":"c","CS6":"c","CS7":"c","CS8":"c","CSIZE":"c","CSTOPB":"c","Chdir":"f","Chmod":"f","Chown":"f","Chroot":"f","Clearenv":"f","Close":"f","CloseOnExec":"f","CmsgLen":"f","CmsgSpace":"f","Cmsghdr":"t","Cmsghdr.SetLen":"m","Conn":"t","Connect":"f","Creat":"f","Credential":"t","DT_BLK":"c","DT_CHR":"c","DT_DIR":"c","DT_FIFO":"c","DT_LNK":"c","DT_REG":"c","DT_SOCK":"c","DT_UNKNOWN":"c","DT_WHT":"c","DetachLsf":"f","Dirent":"t","Dup":"f","Dup2":"f","Dup3":"f","E2BIG":"c","EACCES":"c","EADDRINUSE":"c","EADDRNOTAVAIL":"c","EADV":"c","EAFNOSUPPORT":"c","EAGAIN":"c","EALREADY":"c","EBADE":"c","EBADF":"c","EBADFD":"c","EBADMSG":"c","EBADR":"c","EBADRQC":"c","EBADSLT":"c","EBFONT":"c","EBUSY":"c","ECANCELED":"c","ECHILD":"c","ECHO":"c","ECHOCTL":"c","ECHOE":"c","ECHOK":"c","ECHOKE":"c","ECHONL":"c","ECHOPRT":"c","ECHRNG":"c","ECOMM":"c","ECONNABORTED":"c","ECONNREFUSED":"c","ECONNRESET":"c","EDEADLK":"c","EDEADLOCK":"c","EDESTADDRREQ":"c","EDOM":"c","EDOTDOT":"c","EDQUOT":"c","EEXIST":"c","EFAULT":"c","EFBIG":"c","EHOSTDOWN":"c","EHOSTUNREACH":"c","EIDRM":"c","EILSEQ":"c","EINPROGRESS":"c","EINTR":"c","EINVAL":"c","EIO":"c","EISCONN":"c","EISDIR":"c","EISNAM":"c","EKEYEXPIRED":"c","EKEYREJECTED":"c","EKEYREVOKED":"c","EL2HLT":"c","EL2NSYNC":"c","EL3HLT":"c","EL3RST":"c","ELIBACC":"c","ELIBBAD":"c","ELIBEXEC":"c","ELIBMAX":"c","ELIBSCN":"c","ELNRNG":"c","ELOOP":"c","EMEDIUMTYPE":"c","EMFILE":"c","EMLINK":"c","EMSGSIZE":"c","EMULTIHOP":"c","ENAMETOOLONG":"c","ENAVAIL":"c","ENETDOWN":"c","ENETRESET":"c","ENETUNREACH":"c","ENFILE":"c","ENOANO":"c","ENOBUFS":"c","ENOCSI":"c","ENODATA":"c","ENODEV":"c","ENOENT":"c","ENOEXEC":"c","ENOKEY":"c","ENOLCK":"c","ENOLINK":"c","ENOMEDIUM":"c","ENOMEM":"c","ENOMSG":"c","ENONET":"c","ENOPKG":"c","ENOPROTOOPT":"c","ENOSPC":"c","ENOSR":"c","ENOSTR":"c","ENOSYS":"c","ENOTBLK":"c","ENOTCONN":"c","ENOTDIR":"c","ENOTEMPTY":"c","ENOTNAM":"c","ENOTRECOVERABLE":"c","ENOTSOCK":"c","ENOTSUP":"c","ENOTTY":"c","ENOTUNIQ":"c","ENXIO":"c","EOPNOTSUPP":"c","EOVERFLOW":"c","EOWNERDEAD":"c","EPERM":"c","EPFNOSUPPORT":"c","EPIPE":"c","EPOLLERR":"c","EPOLLET":"c","EPOLLHUP":"c","EPOLLIN":"c","EPOLLMSG":"c","EPOLLONESHOT":"c","EPOLLOUT":"c","EPOLLPRI":"c","EPOLLRDBAND":"c","EPOLLRDHUP":"c","EPOLLRDNORM":"c","EPOLLWRBAND":"c","EPOLLWRNORM":"c","EPOLL_CLOEXEC":"c","EPOLL_CTL_ADD":"c","EPOLL_CTL_DEL":"c","EPOLL_CTL_MOD":"c","EPOLL_NONBLOCK":"c","EPROTO":"c","EPROTONOSUPPORT":"c","EPROTOTYPE":"c","ERANGE":"c","EREMCHG":"c","EREMOTE":"c","EREMOTEIO":"c","ERESTART":"c","ERFKILL":"c","EROFS":"c","ESHUTDOWN":"c","ESOCKTNOSUPPORT":"c","ESPIPE":"c","ESRCH":"c","ESRMNT":"c","ESTALE":"c","ESTRPIPE":"c","ETH_P_1588":"c","ETH_P_8021Q":"c","ETH_P_802_2":"c","ETH_P_802_3":"c","ETH_P_AARP":"c","ETH_P_ALL":"c","ETH_P_AOE":"c","ETH_P_ARCNET":"c","ETH_P_ARP":"c","ETH_P_ATALK":"c","ETH_P_ATMFATE":"c","ETH_P_ATMMPOA":"c","ETH_P_AX25":"c","ETH_P_BPQ":"c","ETH_P_CAIF":"c","ETH_P_CAN":"c","ETH_P_CONTROL":"c","ETH_P_CUST":"c","ETH_P_DDCMP":"c","ETH_P_DEC":"c","ETH_P_DIAG":"c","ETH_P_DNA_DL":"c","ETH_P_DNA_RC":"c","ETH_P_DNA_RT":"c","ETH_P_DSA":"c","ETH_P_ECONET":"c","ETH_P_EDSA":"c","ETH_P_FCOE":"c","ETH_P_FIP":"c","ETH_P_HDLC":"c","ETH_P_IEEE802154":"c","ETH_P_IEEEPUP":"c","ETH_P_IEEEPUPAT":"c","ETH_P_IP":"c","ETH_P_IPV6":"c","ETH_P_IPX":"c","ETH_P_IRDA":"c","ETH_P_LAT":"c","ETH_P_LINK_CTL":"c","ETH_P_LOCALTALK":"c","ETH_P_LOOP":"c","ETH_P_MOBITEX":"c","ETH_P_MPLS_MC":"c","ETH_P_MPLS_UC":"c","ETH_P_PAE":"c","ETH_P_PAUSE":"c","ETH_P_PHONET":"c","ETH_P_PPPTALK":"c","ETH_P_PPP_DISC":"c","ETH_P_PPP_MP":"c","ETH_P_PPP_SES":"c","ETH_P_PUP":"c","ETH_P_PUPAT":"c","ETH_P_RARP":"c","ETH_P_SCA":"c","ETH_P_SLOW":"c","ETH_P_SNAP":"c","ETH_P_TEB":"c","ETH_P_TIPC":"c","ETH_P_TRAILER":"c","ETH_P_TR_802_2":"c","ETH_P_WAN_PPP":"c","ETH_P_WCCP":"c","ETH_P_X25":"c","ETIME":"c","ETIMEDOUT":"c","ETOOMANYREFS":"c","ETXTBSY":"c","EUCLEAN":"c","EUNATCH":"c","EUSERS":"c","EWOULDBLOCK":"c","EXDEV":"c","EXFULL":"c","Environ":"f","EpollCreate":"f","EpollCreate1":"f","EpollCtl":"f","EpollEvent":"t","EpollWait":"f","Errno":"t","Errno.Error":"m","Errno.Is":"m","Errno.Temporary":"m","Errno.Timeout":"m","Exec":"f","Exit":"f","FD_CLOEXEC":"c","FD_SETSIZE":"c","FLUSHO":"c","F_DUPFD":"c","F_DUPFD_CLOEXEC":"c","F_EXLCK":"c","F_GETFD":"c","F_GETFL":"c","F_GETLEASE":"c","F_GETLK":"c","F_GETLK64":"c","F_GETOWN":"c","F_GETOWN_EX":"c","F_GETPIPE_SZ":"c","F_GETSIG":"c","F_LOCK":"c","F_NOTIFY":"c","F_OK":"c","F_RDLCK":"c","F_SETFD":"c","F_SETFL":"c","F_SETLEASE":"c","F_SETLK":"c","F_SETLK64":"c","F_SETLKW":"c","F_SETLKW64":"c","F_SETOWN":"c","F_SETOWN_EX":"c","F_SETPIPE_SZ":"c","F_SETSIG":"c","F_SHLCK":"c","F_TEST":"c","F_TLOCK":"c","F_ULOCK":"c","F_UNLCK":"c","F_WRLCK":"c","Faccessat":"f","Fallocate":"f","Fchdir":"f","Fchmod":"f","Fchmodat":"f","Fchown":"f","Fchownat":"f","FcntlFlock":"f","FdSet":"t","Fdatasync":"f","Flock":"f","Flock_t":"t","ForkExec":"f","ForkLock":"v","Fsid":"t","Fstat":"f","Fstatfs":"f","Fsync":"f","Ftruncate":"f","Futimes":"f","Futimesat":"f","Getcwd":"f","Getdents":"f","Getegid":"f","Getenv":"f","Geteuid":"f","Getgid":"f","Getgroups":"f","Getpagesize":"f","Getpeername":"f","Getpgid":"f","Getpgrp":"f","Getpid":"f","Getppid":"f","Getpriority":"f","Getrlimit":"f","Getrusage":"f","Getsockname":"f","GetsockoptICMPv6Filter":"f","GetsockoptIPMreq":"f","GetsockoptIPMreqn":"f","GetsockoptIPv6MTUInfo":"f","GetsockoptIPv6Mreq":"f","GetsockoptInet4Addr":"f","GetsockoptInt":"f","GetsockoptUcred":"f","Gettid":"f","Gettimeofday":"f","Getuid":"f","Getwd":"f","Getxattr":"f","HUPCL":"c","ICANON":"c","ICMPV6_FILTER":"c","ICMPv6Filter":"t","ICRNL":"c","IEXTEN":"c","IFA_ADDRESS":"c","IFA_ANYCAST":"c","IFA_BROADCAST":"c","IFA_CACHEINFO":"c","IFA_F_DADFAILED":"c","IFA_F_DEPRECATED":"c","IFA_F_HOMEADDRESS":"c","IFA_F_NODAD":"c","IFA_F_OPTIMISTIC":"c","IFA_F_PERMANENT":"c","IFA_F_SECONDARY":"c","IFA_F_TEMPORARY":"c","IFA_F_TENTATIVE":"c","IFA_LABEL":"c","IFA_LOCAL":"c","IFA_MAX":"c","IFA_MULTICAST":"c","IFA_UNSPEC":"c","IFF_ALLMULTI":"c","IFF_AUTOMEDIA":"c","IFF_BROADCAST":"c","IFF_DEBUG":"c","IFF_DYNAMIC":"c","IFF_LOOPBACK":"c","IFF_MASTER":"c","IFF_MULTICAST":"c","IFF_NOARP":"c","IFF_NOTRAILERS":"c","IFF_NO_PI":"c","IFF_ONE_QUEUE":"c","IFF_POINTOPOINT":"c","IFF_PORTSEL":"c","IFF_PROMISC":"c","IFF_RUNNING":"c","IFF_SLAVE":"c","IFF_TAP":"c","IFF_TUN":"c","IFF_TUN_EXCL":"c","IFF_UP":"c","IFF_VNET_HDR":"c","IFLA_ADDRESS":"c","IFLA_BROADCAST":"c","IFLA_COST":"c","IFLA_IFALIAS":"c","IFLA_IFNAME":"c","IFLA_LINK":"c","IFLA_LINKINFO":"c","IFLA_LINKMODE":"c","IFLA_MAP":"c","IFLA_MASTER":"c","IFLA_MAX":"c","IFLA_MTU":"c","IFLA_NET_NS_PID":"c","IFLA_OPERSTATE":"c","IFLA_PRIORITY":"c","IFLA_PROTINFO":"c","IFLA_QDISC":"c","IFLA_STATS":"c","IFLA_TXQLEN":"c","IFLA_UNSPEC":"c","IFLA_WEIGHT":"c","IFLA_WIRELESS":"c","IFNAMSIZ":"c","IGNBRK":"c","IGNCR":"c","IGNPAR":"c","IMAXBEL":"c","INLCR":"c","INPCK":"c","IN_ACCESS":"c","IN_ALL_EVENTS":"c","IN_ATTRIB":"c","IN_CLASSA_HOST":"c","IN_CLASSA_MAX":"c","IN_CLASSA_NET":"c","IN_CLASSA_NSHIFT":"c","IN_CLASSB_HOST":"c","IN_CLASSB_MAX":"c","IN_CLASSB_NET":"c","IN_CLASSB_NSHIFT":"c","IN_CLASSC_HOST":"c","IN_CLASSC_NET":"c","IN_CLASSC_NSHIFT":"c","IN_CLOEXEC":"c","IN_CLOSE":"c","IN_CLOSE_NOWRITE":"c","IN_CLOSE_WRITE":"c","IN_CREATE":"c","IN_DELETE":"c","IN_DELETE_SELF":"c","IN_DONT_FOLLOW":"c","IN_EXCL_UNLINK":"c","IN_IGNORED":"c","IN_ISDIR":"c","IN_LOOPBACKNET":"c","IN_MASK_ADD":"c","IN_MODIFY":"c","IN_MOVE":"c","IN_MOVED_FROM":"c","IN_MOVED_TO":"c","IN_MOVE_SELF":"c","IN_NONBLOCK":"c","IN_ONESHOT":"c","IN_ONLYDIR":"c","IN_OPEN":"c","IN_Q_OVERFLOW":"c","IN_UNMOUNT":"c","IPMreq":"t","IPMreqn":"t","IPPROTO_AH":"c","IPPROTO_COMP":"c","IPPROTO_DCCP":"c","IPPROTO_DSTOPTS":"c","IPPROTO_EGP":"c","IPPROTO_ENCAP":"c","IPPROTO_ESP":"c","IPPROTO_FRAGMENT":"c","IPPROTO_GRE":"c","IPPROTO_HOPOPTS":"c","IPPROTO_ICMP":"c","IPPROTO_ICMPV6":"c","IPPROTO_IDP":"c","IPPROTO_IGMP":"c","IPPROTO_IP":"c","IPPROTO_IPIP":"c","IPPROTO_IPV6":"c","IPPROTO_MTP":"c","IPPROTO_NONE":"c","IPPROTO_PIM":"c","IPPROTO_PUP":"c","IPPROTO_RAW":"c","IPPROTO_ROUTING":"c","IPPROTO_RSVP":"c","IPPROTO_SCTP":"c","IPPROTO_TCP":"c","IPPROTO_TP":"c","IPPROTO_UDP":"c","IPPROTO_UDPLITE":"c","IPV6_2292DSTOPTS":"c","IPV6_2292HOPLIMIT":"c","IPV6_2292HOPOPTS":"c","IPV6_2292PKTINFO":"c","IPV6_2292PKTOPTIONS":"c","IPV6_2292RTHDR":"c","IPV6_ADDRFORM":"c","IPV6_ADD_MEMBERSHIP":"c","IPV6_AUTHHDR":"c","IPV6_CHECKSUM":"c","IPV6_DROP_MEMBERSHIP":"c","IPV6_DSTOPTS":"c","IPV6_HOPLIMIT":"c","IPV6_HOPOPTS":"c","IPV6_IPSEC_POLICY":"c","IPV6_JOIN_ANYCAST":"c","IPV6_JOIN_GROUP":"c","IPV6_LEAVE_ANYCAST":"c","IPV6_LEAVE_GROUP":"c","IPV6_MTU":"c","IPV6_MTU_DISCOVER":"c","IPV6_MULTICAST_HOPS":"c","IPV6_MULTICAST_IF":"c","IPV6_MULTICAST_LOOP":"c","IPV6_NEXTHOP":"c","IPV6_PKTINFO":"c","IPV6_PMTUDISC_DO":"c","IPV6_PMTUDISC_DONT":"c","IPV6_PMTUDISC_PROBE":"c","IPV6_PMTUDISC_WANT":"c","IPV6_RECVDSTOPTS":"c","IPV6_RECVERR":"c","IPV6_RECVHOPLIMIT":"c","IPV6_RECVHOPOPTS":"c","IPV6_RECVPKTINFO":"c","IPV6_RECVRTHDR":"c","IPV6_RECVTCLASS":"c","IPV6_ROUTER_ALERT":"c","IPV6_RTHDR":"c","IPV6_RTHDRDSTOPTS":"c","IPV6_RTHDR_LOOSE":"c","IPV6_RTHDR_STRICT":"c","IPV6_RTHDR_TYPE_0":"c","IPV6_RXDSTOPTS":"c","IPV6_RXHOPOPTS":"c","IPV6_TCLASS":"c","IPV6_UNICAST_HOPS":"c","IPV6_V6ONLY":"c","IPV6_XFRM_POLICY":"c","IP_ADD_MEMBERSHIP":"c","IP_ADD_SOURCE_MEMBERSHIP":"c","IP_BLOCK_SOURCE":"c","IP_DEFAULT_MULTICAST_LOOP":"c","IP_DEFAULT_MULTICAST_TTL":"c","IP_DF":"c","IP_DROP_MEMBERSHIP":"c","IP_DROP_SOURCE_MEMBERSHIP":"c","IP_FREEBIND":"c","IP_HDRINCL":"c","IP_IPSEC_POLICY":"c","IP_MAXPACKET":"c","IP_MAX_MEMBERSHIPS":"c","IP_MF":"c","IP_MINTTL":"c","IP_MSFILTER":"c","IP_MSS":"c","IP_MTU":"c","IP_MTU_DISCOVER":"c","IP_MULTICAST_IF":"c","IP_MULTICAST_LOOP":"c","IP_MULTICAST_TTL":"c","IP_OFFMASK":"c","IP_OPTIONS":"c","IP_ORIGDSTADDR":"c","IP_PASSSEC":"c","IP_PKTINFO":"c","IP_PKTOPTIONS":"c","IP_PMTUDISC":"c","IP_PMTUDISC_DO":"c","IP_PMTUDISC_DONT":"c","IP_PMTUDISC_PROBE":"c","IP_PMTUDISC_WANT":"c","IP_RECVERR":"c","IP_RECVOPTS":"c","IP_RECVORIGDSTADDR":"c","IP_RECVRETOPTS":"c","IP_RECVTOS":"c","IP_RECVTTL":"c","IP_RETOPTS":"c","IP_RF":"c","IP_ROUTER_ALERT":"c","IP_TOS":"c","IP_TRANSPARENT":"c","IP_TTL":"c","IP_UNBLOCK_SOURCE":"c","IP_XFRM_POLICY":"c","IPv6MTUInfo":"t","IPv6Mreq":"t","ISIG":"c","ISTRIP":"c","IUCLC":"c","IUTF8":"c","IXANY":"c","IXOFF":"c","IXON":"c","IfAddrmsg":"t","IfInfomsg":"t","ImplementsGetwd":"c","Inet4Pktinfo":"t","Inet6Pktinfo":"t","InotifyAddWatch":"f","InotifyEvent":"t","InotifyInit":"f","InotifyInit1":"f","InotifyRmWatch":"f","Ioperm":"f","Iopl":"f","Iovec":"t","Iovec.SetLen":"m","Kill":"f","Klogctl":"f","LINUX_REBOOT_CMD_CAD_OFF":"c","LINUX_REBOOT_CMD_CAD_ON":"c","LINUX_REBOOT_CMD_HALT":"c","LINUX_REBOOT_CMD_KEXEC":"c","LINUX_REBOOT_CMD_POWER_OFF":"c","LINUX_REBOOT_CMD_RESTART":"c","LINUX_REBOOT_CMD_RESTART2":"c","LINUX_REBOOT_CMD_SW_SUSPEND":"c","LINUX_REBOOT_MAGIC1":"c","LINUX_REBOOT_MAGIC2":"c","LOCK_EX":"c","LOCK_NB":"c","LOCK_SH":"c","LOCK_UN":"c","Lchown":"f","Linger":"t","Link":"f","Listen":"f","Listxattr":"f","LsfJump":"f","LsfSocket":"f","LsfStmt":"f","Lstat":"f","MADV_DOFORK":"c","MADV_DONTFORK":"c","MADV_DONTNEED":"c","MADV_HUGEPAGE":"c","MADV_HWPOISON":"c","MADV_MERGEABLE":"c","MADV_NOHUGEPAGE":"c","MADV_NORMAL":"c","MADV_RANDOM":"c","MADV_REMOVE":"c","MADV_SEQUENTIAL":"c","MADV_UNMERGEABLE":"c","MADV_WILLNEED":"c","MAP_32BIT":"c","MAP_ANON":"c","MAP_ANONYMOUS":"c","MAP_DENYWRITE":"c","MAP_EXECUTABLE":"c","MAP_FILE":"c","MAP_FIXED":"c","MAP_GROWSDOWN":"c","MAP_HUGETLB":"c","MAP_LOCKED":"c","MAP_NONBLOCK":"c","MAP_NORESERVE":"c","MAP_POPULATE":"c","MAP_PRIVATE":"c","MAP_SHARED":"c","MAP_STACK":"c","MAP_TYPE":"c","MCL_CURRENT":"c","MCL_FUTURE":"c","MNT_DETACH":"c","MNT_EXPIRE":"c","MNT_FORCE":"c","MSG_CMSG_CLOEXEC":"c","MSG_CONFIRM":"c","MSG_CTRUNC":"c","MSG_DONTROUTE":"c","MSG_DONTWAIT":"c","MSG_EOR":"c","MSG_ERRQUEUE":"c","MSG_FASTOPEN":"c","MSG_FIN":"c","MSG_MORE":"c","MSG_NOSIGNAL":"c","MSG_OOB":"c","MSG_PEEK":"c","MSG_PROXY":"c","MSG_RST":"c","MSG_SYN":"c","MSG_TRUNC":"c","MSG_TRYHARD":"c","MSG_WAITALL":"c","MSG_WAITFORONE":"c","MS_ACTIVE":"c","MS_ASYNC":"c","MS_BIND":"c","MS_DIRSYNC":"c","MS_INVALIDATE":"c","MS_I_VERSION":"c","MS_KERNMOUNT":"c","MS_MANDLOCK":"c","MS_MGC_MSK":"c","MS_MGC_VAL":"c","MS_MOVE":"c","MS_NOATIME":"c","MS_NODEV":"c","MS_NODIRATIME":"c","MS_NOEXEC":"c","MS_NOSUID":"c","MS_NOUSER":"c","MS_POSIXACL":"c","MS_PRIVATE":"c","MS_RDONLY":"c","MS_REC":"c","MS_RELATIME":"c","MS_REMOUNT":"c","MS_RMT_MASK":"c","MS_SHARED":"c","MS_SILENT":"c","MS_SLAVE":"c","MS_STRICTATIME":"c","MS_SYNC":"c","MS_SYNCHRONOUS":"c","MS_UNBINDABLE":"c","Madvise":"f","Mkdir":"f","Mkdirat":"f","Mkfifo":"f","Mknod":"f","Mknodat":"f","Mlock":"f","Mlockall":"f","Mmap":"f","Mount":"f","Mprotect":"f","Msghdr":"t","Msghdr.SetControllen":"m","Munlock":"f","Munlockall":"f","Munmap":"f","NAME_MAX":"c","NETLINK_ADD_MEMBERSHIP":"c","NETLINK_AUDIT":"c","NETLINK_BROADCAST_ERROR":"c","NETLINK_CONNECTOR":"c","NETLINK_DNRTMSG":"c","NETLINK_DROP_MEMBERSHIP":"c","NETLINK_ECRYPTFS":"c","NETLINK_FIB_LOOKUP":"c","NETLINK_FIREWALL":"c","NETLINK_GENERIC":"c","NETLINK_INET_DIAG":"c","NETLINK_IP6_FW":"c","NETLINK_ISCSI":"c","NETLINK_KOBJECT_UEVENT":"c","NETLINK_NETFILTER":"c","NETLINK_NFLOG":"c","NETLINK_NO_ENOBUFS":"c","NETLINK_PKTINFO":"c","NETLINK_ROUTE":"c","NETLINK_SCSITRANSPORT":"c","NETLINK_SELINUX":"c","NETLINK_UNUSED":"c","NETLINK_USERSOCK":"c","NETLINK_XFRM":"c","NLA_ALIGNTO":"c","NLA_F_NESTED":"c","NLA_F_NET_BYTEORDER":"c","NLA_HDRLEN":"c","NLMSG_ALIGNTO":"c","NLMSG_DONE":"c","NLMSG_ERROR":"c","NLMSG_HDRLEN":"c","NLMSG_MIN_TYPE":"c","NLMSG_NOOP":"c","NLMSG_OVERRUN":"c","NLM_F_ACK":"c","NLM_F_APPEND":"c","NLM_F_ATOMIC":"c","NLM_F_CREATE":"c","NLM_F_DUMP":"c","NLM_F_ECHO":"c","NLM_F_EXCL":"c","NLM_F_MATCH":"c","NLM_F_MULTI":"c","NLM_F_REPLACE":"c","NLM_F_REQUEST":"c","NLM_F_ROOT":"c","NOFLSH":"c","Nanosleep":"f","NetlinkMessage":"t","NetlinkRIB":"f","NetlinkRouteAttr":"t","NetlinkRouteRequest":"t","NlAttr":"t","NlMsgerr":"t","NlMsghdr":"t","NsecToTimespec":"f","NsecToTimeval":"f","OCRNL":"c","OFDEL":"c","OFILL":"c","OLCUC":"c","ONLCR":"c","ONLRET":"c","ONOCR":"c","OPOST":"c","O_ACCMODE":"c","O_APPEND":"c","O_ASYNC":"c","O_CLOEXEC":"c","O_CREAT":"c","O_DIRECT":"c","O_DIRECTORY":"c","O_DSYNC":"c","O_EXCL":"c","O_FSYNC":"c","O_LARGEFILE":"c","O_NDELAY":"c","O_NOATIME":"c","O_NOCTTY":"c","O_NOFOLLOW":"c","O_NONBLOCK":"c","O_RDONLY":"c","O_RDWR":"c","O_RSYNC":"c","O_SYNC":"c","O_TRUNC":"c","O_WRONLY":"c","Open":"f","Openat":"f","PACKET_ADD_MEMBERSHIP":"c","PACKET_BROADCAST":"c","PACKET_DROP_MEMBERSHIP":"c","PACKET_FASTROUTE":"c","PACKET_HOST":"c","PACKET_LOOPBACK":"c","PACKET_MR_ALLMULTI":"c","PACKET_MR_MULTICAST":"c","PACKET_MR_PROMISC":"c","PACKET_MULTICAST":"c","PACKET_OTHERHOST":"c","PACKET_OUTGOING":"c","PACKET_RECV_OUTPUT":"c","PACKET_RX_RING":"c","PACKET_STATISTICS":"c","PARENB":"c","PARMRK":"c","PARODD":"c","PENDIN":"c","PRIO_PGRP":"c","PRIO_PROCESS":"c","PRIO_USER":"c","PROT_EXEC":"c","PROT_GROWSDOWN":"c","PROT_GROWSUP":"c","PROT_NONE":"c","PROT_READ":"c","PROT_WRITE":"c","PR_CAPBSET_DROP":"c","PR_CAPBSET_READ":"c","PR_ENDIAN_BIG":"c","PR_ENDIAN_LITTLE":"c","PR_ENDIAN_PPC_LITTLE":"c","PR_FPEMU_NOPRINT":"c","PR_FPEMU_SIGFPE":"c","PR_FP_EXC_ASYNC":"c","PR_FP_EXC_DISABLED":"c","PR_FP_EXC_DIV":"c","PR_FP_EXC_INV":"c","PR_FP_EXC_NONRECOV":"c","PR_FP_EXC_OVF":"c","PR_FP_EXC_PRECISE":"c","PR_FP_EXC_RES":"c","PR_FP_EXC_SW_ENABLE":"c","PR_FP_EXC_UND":"c","PR_GET_DUMPABLE":"c","PR_GET_ENDIAN":"c","PR_GET_FPEMU":"c","PR_GET_FPEXC":"c","PR_GET_KEEPCAPS":"c","PR_GET_NAME":"c","PR_GET_PDEATHSIG":"c","PR_GET_SECCOMP":"c","PR_GET_SECUREBITS":"c","PR_GET_TIMERSLACK":"c","PR_GET_TIMING":"c","PR_GET_TSC":"c","PR_GET_UNALIGN":"c","PR_MCE_KILL":"c","PR_MCE_KILL_CLEAR":"c","PR_MCE_KILL_DEFAULT":"c","PR_MCE_KILL_EARLY":"c","PR_MCE_KILL_GET":"c","PR_MCE_KILL_LATE":"c","PR_MCE_KILL_SET":"c","PR_SET_DUMPABLE":"c","PR_SET_ENDIAN":"c","PR_SET_FPEMU":"c","PR_SET_FPEXC":"c","PR_SET_KEEPCAPS":"c","PR_SET_NAME":"c","PR_SET_PDEATHSIG":"c","PR_SET_PTRACER":"c","PR_SET_SECCOMP":"c","PR_SET_SECUREBITS":"c","PR_SET_TIMERSLACK":"c","PR_SET_TIMING":"c","PR_SET_TSC":"c","PR_SET_UNALIGN":"c","PR_TASK_PERF_EVENTS_DISABLE":"c","PR_TASK_PERF_EVENTS_ENABLE":"c","PR_TIMING_STATISTICAL":"c","PR_TIMING_TIMESTAMP":"c","PR_TSC_ENABLE":"c","PR_TSC_SIGSEGV":"c","PR_UNALIGN_NOPRINT":"c","PR_UNALIGN_SIGBUS":"c","PTRACE_ARCH_PRCTL":"c","PTRACE_ATTACH":"c","PTRACE_CONT":"c","PTRACE_DETACH":"c","PTRACE_EVENT_CLONE":"c","PTRACE_EVENT_EXEC":"c","PTRACE_EVENT_EXIT":"c","PTRACE_EVENT_FORK":"c","PTRACE_EVENT_VFORK":"c","PTRACE_EVENT_VFORK_DONE":"c","PTRACE_GETEVENTMSG":"c","PTRACE_GETFPREGS":"c","PTRACE_GETFPXREGS":"c","PTRACE_GETREGS":"c","PTRACE_GETREGSET":"c","PTRACE_GETSIGINFO":"c","PTRACE_GET_THREAD_AREA":"c","PTRACE_KILL":"c","PTRACE_OLDSETOPTIONS":"c","PTRACE_O_MASK":"c","PTRACE_O_TRACECLONE":"c","PTRACE_O_TRACEEXEC":"c","PTRACE_O_TRACEEXIT":"c","PTRACE_O_TRACEFORK":"c","PTRACE_O_TRACESYSGOOD":"c","PTRACE_O_TRACEVFORK":"c","PTRACE_O_TRACEVFORKDONE":"c","PTRACE_PEEKDATA":"c","PTRACE_PEEKTEXT":"c","PTRACE_PEEKUSR":"c","PTRACE_POKEDATA":"c","PTRACE_POKETEXT":"c","PTRACE_POKEUSR":"c","PTRACE_SETFPREGS":"c","PTRACE_SETFPXREGS":"c","PTRACE_SETOPTIONS":"c","PTRACE_SETREGS":"c","PTRACE_SETREGSET":"c","PTRACE_SETSIGINFO":"c","PTRACE_SET_THREAD_AREA":"c","PTRACE_SINGLEBLOCK":"c","PTRACE_SINGLESTEP":"c","PTRACE_SYSCALL":"c","PTRACE_SYSEMU":"c","PTRACE_SYSEMU_SINGLESTEP":"c","PTRACE_TRACEME":"c","ParseDirent":"f","ParseNetlinkMessage":"f","ParseNetlinkRouteAttr":"f","ParseSocketControlMessage":"f","ParseUnixCredentials":"f","ParseUnixRights":"f","PathMax":"c","Pause":"f","Pipe":"f","Pipe2":"f","PivotRoot":"f","Pread":"f","ProcAttr":"t","PtraceAttach":"f","PtraceCont":"f","PtraceDetach":"f","PtraceGetEventMsg":"f","PtraceGetRegs":"f","PtracePeekData":"f","PtracePeekText":"f","PtracePokeData":"f","PtracePokeText":"f","PtraceRegs":"t","PtraceRegs.PC":"m","PtraceRegs.SetPC":"m","PtraceSetOptions":"f","PtraceSetRegs":"f","PtraceSingleStep":"f","PtraceSyscall":"f","Pwrite":"f","RLIMIT_AS":"c","RLIMIT_CORE":"c","RLIMIT_CPU":"c","RLIMIT_DATA":"c","RLIMIT_FSIZE":"c","RLIMIT_NOFILE":"c","RLIMIT_STACK":"c","RLIM_INFINITY":"c","RTAX_ADVMSS":"c","RTAX_CWND":"c","RTAX_FEATURES":"c","RTAX_FEATURE_ALLFRAG":"c","RTAX_FEATURE_ECN":"c","RTAX_FEATURE_SACK":"c","RTAX_FEATURE_TIMESTAMP":"c","RTAX_HOPLIMIT":"c","RTAX_INITCWND":"c","RTAX_INITRWND":"c","RTAX_LOCK":"c","RTAX_MAX":"c","RTAX_MTU":"c","RTAX_REORDERING":"c","RTAX_RTO_MIN":"c","RTAX_RTT":"c","RTAX_RTTVAR":"c","RTAX_SSTHRESH":"c","RTAX_UNSPEC":"c","RTAX_WINDOW":"c","RTA_ALIGNTO":"c","RTA_CACHEINFO":"c","RTA_DST":"c","RTA_FLOW":"c","RTA_GATEWAY":"c","RTA_IIF":"c","RTA_MAX":"c","RTA_METRICS":"c","RTA_MULTIPATH":"c","RTA_OIF":"c","RTA_PREFSRC":"c","RTA_PRIORITY":"c","RTA_SRC":"c","RTA_TABLE":"c","RTA_UNSPEC":"c","RTCF_DIRECTSRC":"c","RTCF_DOREDIRECT":"c","RTCF_LOG":"c","RTCF_MASQ":"c","RTCF_NAT":"c","RTCF_VALVE":"c","RTF_ADDRCLASSMASK":"c","RTF_ADDRCONF":"c","RTF_ALLONLINK":"c","RTF_BROADCAST":"c","RTF_CACHE":"c","RTF_DEFAULT":"c","RTF_DYNAMIC":"c","RTF_FLOW":"c","RTF_GATEWAY":"c","RTF_HOST":"c","RTF_INTERFACE":"c","RTF_IRTT":"c","RTF_LINKRT":"c","RTF_LOCAL":"c","RTF_MODIFIED":"c","RTF_MSS":"c","RTF_MTU":"c","RTF_MULTICAST":"c","RTF_NAT":"c","RTF_NOFORWARD":"c","RTF_NONEXTHOP":"c","RTF_NOPMTUDISC":"c","RTF_POLICY":"c","RTF_REINSTATE":"c","RTF_REJECT":"c","RTF_STATIC":"c","RTF_THROW":"c","RTF_UP":"c","RTF_WINDOW":"c","RTF_XRESOLVE":"c","RTM_BASE":"c","RTM_DELACTION":"c","RTM_DELADDR":"c","RTM_DELADDRLABEL":"c","RTM_DELLINK":"c","RTM_DELNEIGH":"c","RTM_DELQDISC":"c","RTM_DELROUTE":"c","RTM_DELRULE":"c","RTM_DELTCLASS":"c","RTM_DELTFILTER":"c","RTM_F_CLONED":"c","RTM_F_EQUALIZE":"c","RTM_F_NOTIFY":"c","RTM_F_PREFIX":"c","RTM_GETACTION":"c","RTM_GETADDR":"c","RTM_GETADDRLABEL":"c","RTM_GETANYCAST":"c","RTM_GETDCB":"c","RTM_GETLINK":"c","RTM_GETMULTICAST":"c","RTM_GETNEIGH":"c","RTM_GETNEIGHTBL":"c","RTM_GETQDISC":"c","RTM_GETROUTE":"c","RTM_GETRULE":"c","RTM_GETTCLASS":"c","RTM_GETTFILTER":"c","RTM_MAX":"c","RTM_NEWACTION":"c","RTM_NEWADDR":"c","RTM_NEWADDRLABEL":"c","RTM_NEWLINK":"c","RTM_NEWNDUSEROPT":"c","RTM_NEWNEIGH":"c","RTM_NEWNEIGHTBL":"c","RTM_NEWPREFIX":"c","RTM_NEWQDISC":"c","RTM_NEWROUTE":"c","RTM_NEWRULE":"c","RTM_NEWTCLASS":"c","RTM_NEWTFILTER":"c","RTM_NR_FAMILIES":"c","RTM_NR_MSGTYPES":"c","RTM_SETDCB":"c","RTM_SETLINK":"c","RTM_SETNEIGHTBL":"c","RTNH_ALIGNTO":"c","RTNH_F_DEAD":"c","RTNH_F_ONLINK":"c","RTNH_F_PERVASIVE":"c","RTNLGRP_IPV4_IFADDR":"c","RTNLGRP_IPV4_MROUTE":"c","RTNLGRP_IPV4_ROUTE":"c","RTNLGRP_IPV4_RULE":"c","RTNLGRP_IPV6_IFADDR":"c","RTNLGRP_IPV6_IFINFO":"c","RTNLGRP_IPV6_MROUTE":"c","RTNLGRP_IPV6_PREFIX":"c","RTNLGRP_IPV6_ROUTE":"c","RTNLGRP_IPV6_RULE":"c","RTNLGRP_LINK":"c","RTNLGRP_ND_USEROPT":"c","RTNLGRP_NEIGH":"c","RTNLGRP_NONE":"c","RTNLGRP_NOTIFY":"c","RTNLGRP_TC":"c","RTN_ANYCAST":"c","RTN_BLACKHOLE":"c","RTN_BROADCAST":"c","RTN_LOCAL":"c","RTN_MAX":"c","RTN_MULTICAST":"c","RTN_NAT":"c","RTN_PROHIBIT":"c","RTN_THROW":"c","RTN_UNICAST":"c","RTN_UNREACHABLE":"c","RTN_UNSPEC":"c","RTN_XRESOLVE":"c","RTPROT_BIRD":"c","RTPROT_BOOT":"c","RTPROT_DHCP":"c","RTPROT_DNROUTED":"c","RTPROT_GATED":"c","RTPROT_KERNEL":"c","RTPROT_MRT":"c","RTPROT_NTK":"c","RTPROT_RA":"c","RTPROT_REDIRECT":"c","RTPROT_STATIC":"c","RTPROT_UNSPEC":"c","RTPROT_XORP":"c","RTPROT_ZEBRA":"c","RT_CLASS_DEFAULT":"c","RT_CLASS_LOCAL":"c","RT_CLASS_MAIN":"c","RT_CLASS_MAX":"c","RT_CLASS_UNSPEC":"c","RT_SCOPE_HOST":"c","RT_SCOPE_LINK":"c","RT_SCOPE_NOWHERE":"c","RT_SCOPE_SITE":"c","RT_SCOPE_UNIVERSE":"c","RT_TABLE_COMPAT":"c","RT_TABLE_DEFAULT":"c","RT_TABLE_LOCAL":"c","RT_TABLE_MAIN":"c","RT_TABLE_MAX":"c","RT_TABLE_UNSPEC":"c","RUSAGE_CHILDREN":"c","RUSAGE_SELF":"c","RUSAGE_THREAD":"c","RawConn":"t","RawSockaddr":"t","RawSockaddrAny":"t","RawSockaddrInet4":"t","RawSockaddrInet6":"t","RawSockaddrLinklayer":"t","RawSockaddrNetlink":"t","RawSockaddrUnix":"t","RawSyscall":"f","RawSyscall6":"f","Read":"f","ReadDirent":"f","Readlink":"f","Reboot":"f","Recvfrom":"f","Recvmsg":"f","Removexattr":"f","Rename":"f","Renameat":"f","Rlimit":"t","Rmdir":"f","RtAttr":"t","RtGenmsg":"t","RtMsg":"t","RtNexthop":"t","Rusage":"t","SCM_CREDENTIALS":"c","SCM_RIGHTS":"c","SCM_TIMESTAMP":"c","SCM_TIMESTAMPING":"c","SCM_TIMESTAMPNS":"c","SHUT_RD":"c","SHUT_RDWR":"c","SHUT_WR":"c","SIGABRT":"c","SIGALRM":"c","SIGBUS":"c","SIGCHLD":"c","SIGCLD":"c","SIGCONT":"c","SIGFPE":"c","SIGHUP":"c","SIGILL":"c","SIGINT":"c","SIGIO":"c","SIGIOT":"c","SIGKILL":"c","SIGPIPE":"c","SIGPOLL":"c","SIGPROF":"c","SIGPWR":"c","SIGQUIT":"c","SIGSEGV":"c","SIGSTKFLT":"c","SIGSTOP":"c","SIGSYS":"c","SIGTERM":"c","SIGTRAP":"c","SIGTSTP":"c","SIGTTIN":"c","SIGTTOU":"c","SIGUNUSED":"c","SIGURG":"c","SIGUSR1":"c","SIGUSR2":"c","SIGVTALRM":"c","SIGWINCH":"c","SIGXCPU":"c","SIGXFSZ":"c","SIOCADDDLCI":"c","SIOCADDMULTI":"c","SIOCADDRT":"c","SIOCATMARK":"c","SIOCDARP":"c","SIOCDELDLCI":"c","SIOCDELMULTI":"c","SIOCDELRT":"c","SIOCDEVPRIVATE":"c","SIOCDIFADDR":"c","SIOCDRARP":"c","SIOCGARP":"c","SIOCGIFADDR":"c","SIOCGIFBR":"c","SIOCGIFBRDADDR":"c","SIOCGIFCONF":"c","SIOCGIFCOUNT":"c","SIOCGIFDSTADDR":"c","SIOCGIFENCAP":"c","SIOCGIFFLAGS":"c","SIOCGIFHWADDR":"c","SIOCGIFINDEX":"c","SIOCGIFMAP":"c","SIOCGIFMEM":"c","SIOCGIFMETRIC":"c","SIOCGIFMTU":"c","SIOCGIFNAME":"c","SIOCGIFNETMASK":"c","SIOCGIFPFLAGS":"c","SIOCGIFSLAVE":"c","SIOCGIFTXQLEN":"c","SIOCGPGRP":"c","SIOCGRARP":"c","SIOCGSTAMP":"c","SIOCGSTAMPNS":"c","SIOCPROTOPRIVATE":"c","SIOCRTMSG":"c","SIOCSARP":"c","SIOCSIFADDR":"c","SIOCSIFBR":"c","SIOCSIFBRDADDR":"c","SIOCSIFDSTADDR":"c","SIOCSIFENCAP":"c","SIOCSIFFLAGS":"c","SIOCSIFHWADDR":"c","SIOCSIFHWBROADCAST":"c","SIOCSIFLINK":"c","SIOCSIFMAP":"c","SIOCSIFMEM":"c","SIOCSIFMETRIC":"c","SIOCSIFMTU":"c","SIOCSIFNAME":"c","SIOCSIFNETMASK":"c","SIOCSIFPFLAGS":"c","SIOCSIFSLAVE":"c","SIOCSIFTXQLEN":"c","SIOCSPGRP":"c","SIOCSRARP":"c","SOCK_CLOEXEC":"c","SOCK_DCCP":"c","SOCK_DGRAM":"c","SOCK_NONBLOCK":"c","SOCK_PACKET":"c","SOCK_RAW":"c","SOCK_RDM":"c","SOCK_SEQPACKET":"c","SOCK_STREAM":"c","SOL_AAL":"c","SOL_ATM":"c","SOL_DECNET":"c","SOL_ICMPV6":"c","SOL_IP":"c","SOL_IPV6":"c","SOL_IRDA":"c","SOL_PACKET":"c","SOL_RAW":"c","SOL_SOCKET":"c","SOL_TCP":"c","SOL_X25":"c","SOMAXCONN":"c","SO_ACCEPTCONN":"c","SO_ATTACH_FILTER":"c","SO_BINDTODEVICE":"c","SO_BROADCAST":"c","SO_BSDCOMPAT":"c","SO_DEBUG":"c","SO_DETACH_FILTER":"c","SO_DOMAIN":"c","SO_DONTROUTE":"c","SO_ERROR":"c","SO_KEEPALIVE":"c","SO_LINGER":"c","SO_MARK":"c","SO_NO_CHECK":"c","SO_OOBINLINE":"c","SO_PASSCRED":"c","SO_PASSSEC":"c","SO_PEERCRED":"c","SO_PEERNAME":"c","SO_PEERSEC":"c","SO_PRIORITY":"c","SO_PROTOCOL":"c","SO_RCVBUF":"c","SO_RCVBUFFORCE":"c","SO_RCVLOWAT":"c","SO_RCVTIMEO":"c","SO_REUSEADDR":"c","SO_RXQ_OVFL":"c","SO_SECURITY_AUTHENTICATION":"c","SO_SECURITY_ENCRYPTION_NETWORK":"c","SO_SECURITY_ENCRYPTION_TRANSPORT":"c","SO_SNDBUF":"c","SO_SNDBUFFORCE":"c","SO_SNDLOWAT":"c","SO_SNDTIMEO":"c","SO_TIMESTAMP":"c","SO_TIMESTAMPING":"c","SO_TIMESTAMPNS":"c","SO_TYPE":"c","SYS_ACCEPT":"c","SYS_ACCEPT4":"c","SYS_ACCESS":"c","SYS_ACCT":"c","SYS_ADD_KEY":"c","SYS_ADJTIMEX":"c","SYS_AFS_SYSCALL":"c","SYS_ALARM":"c","SYS_ARCH_PRCTL":"c","SYS_BIND":"c","SYS_BRK":"c","SYS_CAPGET":"c","SYS_CAPSET":"c","SYS_CHDIR":"c","SYS_CHMOD":"c","SYS_CHOWN":"c","SYS_CHROOT":"c","SYS_CLOCK_GETRES":"c","SYS_CLOCK_GETTIME":"c","SYS_CLOCK_NANOSLEEP":"c","SYS_CLOCK_SETTIME":"c","SYS_CLONE":"c","SYS_CLOSE":"c","SYS_CONNECT":"c","SYS_CREAT":"c","SYS_CREATE_MODULE":"c","SYS_DELETE_MODULE":"c","SYS_DUP":"c","SYS_DUP2":"c","SYS_DUP3":"c","SYS_EPOLL_CREATE":"c","SYS_EPOLL_CREATE1":"c","SYS_EPOLL_CTL":"c","SYS_EPOLL_CTL_OLD":"c","SYS_EPOLL_PWAIT":"c","SYS_EPOLL_WAIT":"c","SYS_EPOLL_WAIT_OLD":"c","SYS_EVENTFD":"c","SYS_EVENTFD2":"c","SYS_EXECVE":"c","SYS_EXIT":"c","SYS_EXIT_GROUP":"c","SYS_FACCESSAT":"c","SYS_FADVISE64":"c","SYS_FALLOCATE":"c","SYS_FANOTIFY_INIT":"c","SYS_FANOTIFY_MARK":"c","SYS_FCHDIR":"c","SYS_FCHMOD":"c","SYS_FCHMODAT":"c","SYS_FCHOWN":"c","SYS_FCHOWNAT":"c","SYS_FCNTL":"c","SYS_FDATASYNC":"c","SYS_FGETXATTR":"c","SYS_FLISTXATTR":"c","SYS_FLOCK":"c","SYS_FORK":"c","SYS_FREMOVEXATTR":"c","SYS_FSETXATTR":"c","SYS_FSTAT":"c","SYS_FSTATFS":"c","SYS_FSYNC":"c","SYS_FTRUNCATE":"c","SYS_FUTEX":"c","SYS_FUTIMESAT":"c","SYS_GETCWD":"c","SYS_GETDENTS":"c","SYS_GETDENTS64":"c","SYS_GETEGID":"c","SYS_GETEUID":"c","SYS_GETGID":"c","SYS_GETGROUPS":"c","SYS_GETITIMER":"c","SYS_GETPEERNAME":"c","SYS_GETPGID":"c","SYS_GETPGRP":"c","SYS_GETPID":"c","SYS_GETPMSG":"c","SYS_GETPPID":"c","SYS_GETPRIORITY":"c","SYS_GETRESGID":"c","SYS_GETRESUID":"c","SYS_GETRLIMIT":"c","SYS_GETRUSAGE":"c","SYS_GETSID":"c","SYS_GETSOCKNAME":"c","SYS_GETSOCKOPT":"c","SYS_GETTID":"c","SYS_GETTIMEOFDAY":"c","SYS_GETUID":"c","SYS_GETXATTR":"c","SYS_GET_KERNEL_SYMS":"c","SYS_GET_MEMPOLICY":"c","SYS_GET_ROBUST_LIST":"c","SYS_GET_THREAD_AREA":"c","SYS_INIT_MODULE":"c","SYS_INOTIFY_ADD_WATCH":"c","SYS_INOTIFY_INIT":"c","SYS_INOTIFY_INIT1":"c","SYS_INOTIFY_RM_WATCH":"c","SYS_IOCTL":"c","SYS_IOPERM":"c","SYS_IOPL":"c","SYS_IOPRIO_GET":"c","SYS_IOPRIO_SET":"c","SYS_IO_CANCEL":"c","SYS_IO_DESTROY":"c","SYS_IO_GETEVENTS":"c","SYS_IO_SETUP":"c","SYS_IO_SUBMIT":"c","SYS_KEXEC_LOAD":"c","SYS_KEYCTL":"c","SYS_KILL":"c","SYS_LCHOWN":"c","SYS_LGETXATTR":"c","SYS_LINK":"c","SYS_LINKAT":"c","SYS_LISTEN":"c","SYS_LISTXATTR":"c","SYS_LLISTXATTR":"c","SYS_LOOKUP_DCOOKIE":"c","SYS_LREMOVEXATTR":"c","SYS_LSEEK":"c","SYS_LSETXATTR":"c","SYS_LSTAT":"c","SYS_MADVISE":"c","SYS_MBIND":"c","SYS_MIGRATE_PAGES":"c","SYS_MINCORE":"c","SYS_MKDIR":"c","SYS_MKDIRAT":"c","SYS_MKNOD":"c","SYS_MKNODAT":"c","SYS_MLOCK":"c","SYS_MLOCKALL":"c","SYS_MMAP":"c","SYS_MODIFY_LDT":"c","SYS_MOUNT":"c","SYS_MOVE_PAGES":"c","SYS_MPROTECT":"c","SYS_MQ_GETSETATTR":"c","SYS_MQ_NOTIFY":"c","SYS_MQ_OPEN":"c","SYS_MQ_TIMEDRECEIVE":"c","SYS_MQ_TIMEDSEND":"c","SYS_MQ_UNLINK":"c","SYS_MREMAP":"c","SYS_MSGCTL":"c","SYS_MSGGET":"c","SYS_MSGRCV":"c","SYS_MSGSND":"c","SYS_MSYNC":"c","SYS_MUNLOCK":"c","SYS_MUNLOCKALL":"c","SYS_MUNMAP":"c","SYS_NANOSLEEP":"c","SYS_NEWFSTATAT":"c","SYS_NFSSERVCTL":"c","SYS_OPEN":"c","SYS_OPENAT":"c","SYS_PAUSE":"c","SYS_PERF_EVENT_OPEN":"c","SYS_PERSONALITY":"c","SYS_PIPE":"c","SYS_PIPE2":"c","SYS_PIVOT_ROOT":"c","SYS_POLL":"c","SYS_PPOLL":"c","SYS_PRCTL":"c","SYS_PREAD64":"c","SYS_PREADV":"c","SYS_PRLIMIT64":"c","SYS_PSELECT6":"c","SYS_PTRACE":"c","SYS_PUTPMSG":"c","SYS_PWRITE64":"c","SYS_PWRITEV":"c","SYS_QUERY_MODULE":"c","SYS_QUOTACTL":"c","SYS_READ":"c","SYS_READAHEAD":"c","SYS_READLINK":"c","SYS_READLINKAT":"c","SYS_READV":"c","SYS_REBOOT":"c","SYS_RECVFROM":"c","SYS_RECVMMSG":"c","SYS_RECVMSG":"c","SYS_REMAP_FILE_PAGES":"c","SYS_REMOVEXATTR":"c","SYS_RENAME":"c","SYS_RENAMEAT":"c","SYS_REQUEST_KEY":"c","SYS_RESTART_SYSCALL":"c","SYS_RMDIR":"c","SYS_RT_SIGACTION":"c","SYS_RT_SIGPENDING":"c","SYS_RT_SIGPROCMASK":"c","SYS_RT_SIGQUEUEINFO":"c","SYS_RT_SIGRETURN":"c","SYS_RT_SIGSUSPEND":"c","SYS_RT_SIGTIMEDWAIT":"c","SYS_RT_TGSIGQUEUEINFO":"c","SYS_SCHED_GETAFFINITY":"c","SYS_SCHED_GETPARAM":"c","SYS_SCHED_GETSCHEDULER":"c","SYS_SCHED_GET_PRIORITY_MAX":"c","SYS_SCHED_GET_PRIORITY_MIN":"c","SYS_SCHED_RR_GET_INTERVAL":"c","SYS_SCHED_SETAFFINITY":"c","SYS_SCHED_SETPARAM":"c","SYS_SCHED_SETSCHEDULER":"c","SYS_SCHED_YIELD":"c","SYS_SECURITY":"c","SYS_SELECT":"c","SYS_SEMCTL":"c","SYS_SEMGET":"c","SYS_SEMOP":"c","SYS_SEMTIMEDOP":"c","SYS_SENDFILE":"c","SYS_SENDMSG":"c","SYS_SENDTO":"c","SYS_SETDOMAINNAME":"c","SYS_SETFSGID":"c","SYS_SETFSUID":"c","SYS_SETGID":"c","SYS_SETGROUPS":"c","SYS_SETHOSTNAME":"c","SYS_SETITIMER":"c","SYS_SETPGID":"c","SYS_SETPRIORITY":"c","SYS_SETREGID":"c","SYS_SETRESGID":"c","SYS_SETRESUID":"c","SYS_SETREUID":"c","SYS_SETRLIMIT":"c","SYS_SETSID":"c","SYS_SETSOCKOPT":"c","SYS_SETTIMEOFDAY":"c","SYS_SETUID":"c","SYS_SETXATTR":"c","SYS_SET_MEMPOLICY":"c","SYS_SET_ROBUST_LIST":"c","SYS_SET_THREAD_AREA":"c","SYS_SET_TID_ADDRESS":"c","SYS_SHMAT":"c","SYS_SHMCTL":"c","SYS_SHMDT":"c","SYS_SHMGET":"c","SYS_SHUTDOWN":"c","SYS_SIGALTSTACK":"c","SYS_SIGNALFD":"c","SYS_SIGNALFD4":"c","SYS_SOCKET":"c","SYS_SOCKETPAIR":"c","SYS_SPLICE":"c","SYS_STAT":"c","SYS_STATFS":"c","SYS_SWAPOFF":"c","SYS_SWAPON":"c","SYS_SYMLINK":"c","SYS_SYMLINKAT":"c","SYS_SYNC":"c","SYS_SYNC_FILE_RANGE":"c","SYS_SYSFS":"c","SYS_SYSINFO":"c","SYS_SYSLOG":"c","SYS_TEE":"c","SYS_TGKILL":"c","SYS_TIME":"c","SYS_TIMERFD_CREATE":"c","SYS_TIMERFD_GETTIME":"c","SYS_TIMERFD_SETTIME":"c","SYS_TIMER_CREATE":"c","SYS_TIMER_DELETE":"c","SYS_TIMER_GETOVERRUN":"c","SYS_TIMER_GETTIME":"c","SYS_TIMER_SETTIME":"c","SYS_TIMES":"c","SYS_TKILL":"c","SYS_TRUNCATE":"c","SYS_TUXCALL":"c","SYS_UMASK":"c","SYS_UMOUNT2":"c","SYS_UNAME":"c","SYS_UNLINK":"c","SYS_UNLINKAT":"c","SYS_UNSHARE":"c","SYS_USELIB":"c","SYS_USTAT":"c","SYS_UTIME":"c","SYS_UTIMENSAT":"c","SYS_UTIMES":"c","SYS_VFORK":"c","SYS_VHANGUP":"c","SYS_VMSPLICE":"c","SYS_VSERVER":"c","SYS_WAIT4":"c","SYS_WAITID":"c","SYS_WRITE":"c","SYS_WRITEV":"c","SYS__SYSCTL":"c","S_BLKSIZE":"c","S_IEXEC":"c","S_IFBLK":"c","S_IFCHR":"c","S_IFDIR":"c","S_IFIFO":"c","S_IFLNK":"c","S_IFMT":"c","S_IFREG":"c","S_IFSOCK":"c","S_IREAD":"c","S_IRGRP":"c","S_IROTH":"c","S_IRUSR":"c","S_IRWXG":"c","S_IRWXO":"c","S_IRWXU":"c","S_ISGID":"c","S_ISUID":"c","S_ISVTX":"c","S_IWGRP":"c","S_IWOTH":"c","S_IWRITE":"c","S_IWUSR":"c","S_IXGRP":"c","S_IXOTH":"c","S_IXUSR":"c","Seek":"f","Select":"f","Sendfile":"f","Sendmsg":"f","SendmsgN":"f","Sendto":"f","SetLsfPromisc":"f","SetNonblock":"f","Setdomainname":"f","Setegid":"f","Setenv":"f","Seteuid":"f","Setfsgid":"f","Setfsuid":"f","Setgid":"f","Setgroups":"f","Sethostname":"f","Setpgid":"f","Setpriority":"f","Setregid":"f","Setresgid":"f","Setresuid":"f","Setreuid":"f","Setrlimit":"f","Setsid":"f","SetsockoptByte":"f","SetsockoptICMPv6Filter":"f","SetsockoptIPMreq":"f","SetsockoptIPMreqn":"f","SetsockoptIPv6Mreq":"f","SetsockoptInet4Addr":"f","SetsockoptInt":"f","SetsockoptLinger":"f","SetsockoptString":"f","SetsockoptTimeval":"f","Settimeofday":"f","Setuid":"f","Setxattr":"f","Shutdown":"f","Signal":"t","Signal.Signal":"m","Signal.String":"m","SizeofCmsghdr":"c","SizeofICMPv6Filter":"c","SizeofIPMreq":"c","SizeofIPMreqn":"c","SizeofIPv6MTUInfo":"c","SizeofIPv6Mreq":"c","SizeofIfAddrmsg":"c","SizeofIfInfomsg":"c","SizeofInet4Pktinfo":"c","SizeofInet6Pktinfo":"c","SizeofInotifyEvent":"c","SizeofLinger":"c","SizeofMsghdr":"c","SizeofNlAttr":"c","SizeofNlMsgerr":"c","SizeofNlMsghdr":"c","SizeofRtAttr":"c","SizeofRtGenmsg":"c","SizeofRtMsg":"c","SizeofRtNexthop":"c","SizeofSockFilter":"c","SizeofSockFprog":"c","SizeofSockaddrAny":"c","SizeofSockaddrInet4":"c","SizeofSockaddrInet6":"c","SizeofSockaddrLinklayer":"c","SizeofSockaddrNetlink":"c","SizeofSockaddrUnix":"c","SizeofTCPInfo":"c","SizeofUcred":"c","SlicePtrFromStrings":"f","SockFilter":"t","SockFprog":"t","Sockaddr":"t","SockaddrInet4":"t","SockaddrInet6":"t","SockaddrLinklayer":"t","SockaddrNetlink":"t","SockaddrUnix":"t","Socket":"f","SocketControlMessage":"t","SocketDisableIPv6":"v","Socketpair":"f","Splice":"f","StartProcess":"f","Stat":"f","Stat_t":"t","Statfs":"f","Statfs_t":"t","Stderr":"v","Stdin":"v","Stdout":"v","StringBytePtr":"f","StringByteSlice":"f","StringSlicePtr":"f","Symlink":"f","Sync":"f","SyncFileRange":"f","SysProcAttr":"t","SysProcIDMap":"t","Syscall":"f","Syscall6":"f","Sysinfo":"f","Sysinfo_t":"t","TCGETS":"c","TCIFLUSH":"c","TCIOFLUSH":"c","TCOFLUSH":"c","TCPInfo":"t","TCP_CONGESTION":"c","TCP_CORK":"c","TCP_DEFER_ACCEPT":"c","TCP_INFO":"c","TCP_KEEPCNT":"c","TCP_KEEPIDLE":"c","TCP_KEEPINTVL":"c","TCP_LINGER2":"c","TCP_MAXSEG":"c","TCP_MAXWIN":"c","TCP_MAX_WINSHIFT":"c","TCP_MD5SIG":"c","TCP_MD5SIG_MAXKEYLEN":"c","TCP_MSS":"c","TCP_NODELAY":"c","TCP_QUICKACK":"c","TCP_SYNCNT":"c","TCP_WINDOW_CLAMP":"c","TCSETS":"c","TIOCCBRK":"c","TIOCCONS":"c","TIOCEXCL":"c","TIOCGDEV":"c","TIOCGETD":"c","TIOCGICOUNT":"c","TIOCGLCKTRMIOS":"c","TIOCGPGRP":"c","TIOCGPTN":"c","TIOCGRS485":"c","TIOCGSERIAL":"c","TIOCGSID":"c","TIOCGSOFTCAR":"c","TIOCGWINSZ":"c","TIOCINQ":"c","TIOCLINUX":"c","TIOCMBIC":"c","TIOCMBIS":"c","TIOCMGET":"c","TIOCMIWAIT":"c","TIOCMSET":"c","TIOCM_CAR":"c","TIOCM_CD":"c","TIOCM_CTS":"c","TIOCM_DSR":"c","TIOCM_DTR":"c","TIOCM_LE":"c","TIOCM_RI":"c","TIOCM_RNG":"c","TIOCM_RTS":"c","TIOCM_SR":"c","TIOCM_ST":"c","TIOCNOTTY":"c","TIOCNXCL":"c","TIOCOUTQ":"c","TIOCPKT":"c","TIOCPKT_DATA":"c","TIOCPKT_DOSTOP":"c","TIOCPKT_FLUSHREAD":"c","TIOCPKT_FLUSHWRITE":"c","TIOCPKT_IOCTL":"c","TIOCPKT_NOSTOP":"c","TIOCPKT_START":"c","TIOCPKT_STOP":"c","TIOCSBRK":"c","TIOCSCTTY":"c","TIOCSERCONFIG":"c","TIOCSERGETLSR":"c","TIOCSERGETMULTI":"c","TIOCSERGSTRUCT":"c","TIOCSERGWILD":"c","TIOCSERSETMULTI":"c","TIOCSERSWILD":"c","TIOCSER_TEMT":"c","TIOCSETD":"c","TIOCSIG":"c","TIOCSLCKTRMIOS":"c","TIOCSPGRP":"c","TIOCSPTLCK":"c","TIOCSRS485":"c","TIOCSSERIAL":"c","TIOCSSOFTCAR":"c","TIOCSTI":"c","TIOCSWINSZ":"c","TOSTOP":"c","TUNATTACHFILTER":"c","TUNDETACHFILTER":"c","TUNGETFEATURES":"c","TUNGETIFF":"c","TUNGETSNDBUF":"c","TUNGETVNETHDRSZ":"c","TUNSETDEBUG":"c","TUNSETGROUP":"c","TUNSETIFF":"c","TUNSETLINK":"c","TUNSETNOCSUM":"c","TUNSETOFFLOAD":"c","TUNSETOWNER":"c","TUNSETPERSIST":"c","TUNSETSNDBUF":"c","TUNSETTXFILTER":"c","TUNSETVNETHDRSZ":"c","Tee":"f","Termios":"t","Tgkill":"f","Time":"f","Time_t":"t","Times":"f","Timespec":"t","Timespec.Nano":"m","Timespec.Unix":"m","TimespecToNsec":"f","Timeval":"t","Timeval.Nano":"m","Timeval.Unix":"m","TimevalToNsec":"f","Timex":"t","Tms":"t","Truncate":"f","Ucred":"t","Umask":"f","Uname":"f","UnixCredentials":"f","UnixRights":"f","Unlink":"f","Unlinkat":"f","Unmount":"f","Unsetenv":"f","Unshare":"f","Ustat":"f","Ustat_t":"t","Utimbuf":"t","Utime":"f","Utimes":"f","UtimesNano":"f","Utsname":"t","VDISCARD":"c","VEOF":"c","VEOL":"c","VEOL2":"c","VERASE":"c","VINTR":"c","VKILL":"c","VLNEXT":"c","VMIN":"c","VQUIT":"c","VREPRINT":"c","VSTART":"c","VSTOP":"c","VSUSP":"c","VSWTC":"c","VTIME":"c","VWERASE":"c","WALL":"c","WCLONE":"c","WCONTINUED":"c","WEXITED":"c","WNOHANG":"c","WNOTHREAD":"c","WNOWAIT":"c","WORDSIZE":"c","WSTOPPED":"c","WUNTRACED":"c","Wait4":"f","WaitStatus":"t","WaitStatus.Continued":"m","WaitStatus.CoreDump":"m","WaitStatus.ExitStatus":"m","WaitStatus.Exited":"m","WaitStatus.Signal":"m","WaitStatus.Signaled":"m","WaitStatus.StopSignal":"m","WaitStatus.Stopped":"m","WaitStatus.TrapCause":"m","Write":"f","XCASE":"c"}},"testing":{"path":"testing","name":"testing","symbols":{"AllocsPerRun":"f","B":"t","B.Elapsed":"m","B.Loop":"m","B.ReportAllocs":"m","B.ReportMetric":"m","B.ResetTimer":"m","B.Run":"m","B.RunParallel":"m","B.SetBytes":"m","B.SetParallelism":"m","B.StartTimer":"m","B.StopTimer":"m","Benchmark":"f","BenchmarkResult":"t","BenchmarkResult.AllocedBytesPerOp":"m","BenchmarkResult.AllocsPerOp":"m","BenchmarkResult.MemString":"m","BenchmarkResult.NsPerOp":"m","BenchmarkResult.String":"m","Cover":"t","CoverBlock":"t","CoverMode":"f","Coverage":"f","F":"t","F.Add":"m","F.Fail":"m","F.Fuzz":"m","F.Helper":"m","F.Skipped":"m","Init":"f","InternalBenchmark":"t","InternalExample":"t","InternalFuzzTarget":"t","InternalTest":"t","M":"t","M.Run":"m","Main":"f","MainStart":"f","PB":"t","PB.Next":"m","RegisterCover":"f","RunBenchmarks":"f","RunExamples":"f","RunTests":"f","Short":"f","T":"t","T.Chdir":"m","T.Deadline":"m","T.Parallel":"m","T.Run":"m","T.Setenv":"m","TB":"t","Testing":"f","Verbose":"f"}},"testing/cryptotest":{"path":"testing/cryptotest","name":"cryptotest","symbols":{"SetGlobalRandom":"f"}},"testing/fstest":{"path":"testing/fstest","name":"fstest","symbols":{"MapFS":"t","MapFS.Glob":"m","MapFS.Lstat":"m","MapFS.Open":"m","MapFS.ReadDir":"m","MapFS.ReadFile":"m","MapFS.ReadLink":"m","MapFS.Stat":"m","MapFS.Sub":"m","MapFile":"t","TestFS":"f"}},"testing/iotest":{"path":"testing/iotest","name":"iotest","symbols":{"DataErrReader":"f","ErrReader":"f","ErrTimeout":"v","HalfReader":"f","NewReadLogger":"f","NewWriteLogger":"f","OneByteReader":"f","TestReader":"f","TimeoutReader":"f","TruncateWriter":"f"}},"testing/quick":{"path":"testing/quick","name":"quick","symbols":{"Check":"f","CheckEqual":"f","CheckEqualError":"t","CheckEqualError.Error":"m","CheckError":"t","CheckError.Error":"m","Config":"t","Generator":"t","SetupError":"t","SetupError.Error":"m","Value":"f"}},"testing/slogtest":{"path":"testing/slogtest","name":"slogtest","symbols":{"Run":"f","TestHandler":"f"}},"testing/synctest":{"path":"testing/synctest","name":"synctest","symbols":{"Test":"f","Wait":"f"}},"text/scanner":{"path":"text/scanner","name":"scanner","symbols":{"Char":"c","Comment":"c","EOF":"c","Float":"c","GoTokens":"c","GoWhitespace":"c","Ident":"c","Int":"c","Position":"t","Position.IsValid":"m","Position.String":"m","RawString":"c","ScanChars":"c","ScanComments":"c","ScanFloats":"c","ScanIdents":"c","ScanInts":"c","ScanRawStrings":"c","ScanStrings":"c","Scanner":"t","Scanner.Init":"m","Scanner.Next":"m","Scanner.Peek":"m","Scanner.Pos":"m","Scanner.Scan":"m","Scanner.TokenText":"m","SkipComments":"c","String":"c","TokenString":"f"}},"text/tabwriter":{"path":"text/tabwriter","name":"tabwriter","symbols":{"AlignRight":"c","Debug":"c","DiscardEmptyColumns":"c","Escape":"c","FilterHTML":"c","NewWriter":"f","StripEscape":"c","TabIndent":"c","Writer":"t","Writer.Flush":"m","Writer.Init":"m","Writer.Write":"m"}},"text/template":{"path":"text/template","name":"template","symbols":{"ExecError":"t","ExecError.Error":"m","ExecError.Unwrap":"m","FuncMap":"t","HTMLEscape":"f","HTMLEscapeString":"f","HTMLEscaper":"f","IsTrue":"f","JSEscape":"f","JSEscapeString":"f","JSEscaper":"f","Must":"f","New":"f","ParseFS":"f","ParseFiles":"f","ParseGlob":"f","Template":"t","Template.AddParseTree":"m","Template.Clone":"m","Template.DefinedTemplates":"m","Template.Delims":"m","Template.Execute":"m","Template.ExecuteTemplate":"m","Template.Funcs":"m","Template.Lookup":"m","Template.Name":"m","Template.New":"m","Template.Option":"m","Template.Parse":"m","Template.ParseFS":"m","Template.ParseFiles":"m","Template.ParseGlob":"m","Template.Templates":"m","URLQueryEscaper":"f"}},"text/template/parse":{"path":"text/template/parse","name":"parse","symbols":{"ActionNode":"t","ActionNode.Copy":"m","ActionNode.String":"m","BoolNode":"t","BoolNode.Copy":"m","BoolNode.String":"m","BranchNode":"t","BranchNode.Copy":"m","BranchNode.String":"m","BreakNode":"t","BreakNode.Copy":"m","BreakNode.String":"m","ChainNode":"t","ChainNode.Add":"m","ChainNode.Copy":"m","ChainNode.String":"m","CommandNode":"t","CommandNode.Copy":"m","CommandNode.String":"m","CommentNode":"t","CommentNode.Copy":"m","CommentNode.String":"m","ContinueNode":"t","ContinueNode.Copy":"m","ContinueNode.String":"m","DotNode":"t","DotNode.Copy":"m","DotNode.String":"m","DotNode.Type":"m","FieldNode":"t","FieldNode.Copy":"m","FieldNode.String":"m","IdentifierNode":"t","IdentifierNode.Copy":"m","IdentifierNode.SetPos":"m","IdentifierNode.SetTree":"m","IdentifierNode.String":"m","IfNode":"t","IfNode.Copy":"m","IsEmptyTree":"f","ListNode":"t","ListNode.Copy":"m","ListNode.CopyList":"m","ListNode.String":"m","Mode":"t","New":"f","NewIdentifier":"f","NilNode":"t","NilNode.Copy":"m","NilNode.String":"m","NilNode.Type":"m","Node":"t","NodeAction":"c","NodeBool":"c","NodeBreak":"c","NodeChain":"c","NodeCommand":"c","NodeComment":"c","NodeContinue":"c","NodeDot":"c","NodeField":"c","NodeIdentifier":"c","NodeIf":"c","NodeList":"c","NodeNil":"c","NodeNumber":"c","NodePipe":"c","NodeRange":"c","NodeString":"c","NodeTemplate":"c","NodeText":"c","NodeType":"t","NodeType.Type":"m","NodeVariable":"c","NodeWith":"c","NumberNode":"t","NumberNode.Copy":"m","NumberNode.String":"m","Parse":"f","ParseComments":"c","PipeNode":"t","PipeNode.Copy":"m","PipeNode.CopyPipe":"m","PipeNode.String":"m","Pos":"t","Pos.Position":"m","RangeNode":"t","RangeNode.Copy":"m","SkipFuncCheck":"c","StringNode":"t","StringNode.Copy":"m","StringNode.String":"m","TemplateNode":"t","TemplateNode.Copy":"m","TemplateNode.String":"m","TextNode":"t","TextNode.Copy":"m","TextNode.String":"m","Tree":"t","Tree.Copy":"m","Tree.ErrorContext":"m","Tree.Parse":"m","VariableNode":"t","VariableNode.Copy":"m","VariableNode.String":"m","WithNode":"t","WithNode.Copy":"m"}},"time":{"path":"time","name":"time","symbols":{"ANSIC":"c","After":"f","AfterFunc":"f","April":"c","August":"c","Date":"f","DateOnly":"c","DateTime":"c","December":"c","Duration":"t","Duration.Abs":"m","Duration.Hours":"m","Duration.Microseconds":"m","Duration.Milliseconds":"m","Duration.Minutes":"m","Duration.Nanoseconds":"m","Duration.Round":"m","Duration.Seconds":"m","Duration.String":"m","Duration.Truncate":"m","February":"c","FixedZone":"f","Friday":"c","Hour":"c","January":"c","July":"c","June":"c","Kitchen":"c","Layout":"c","LoadLocation":"f","LoadLocationFromTZData":"f","Local":"v","Location":"t","Location.String":"m","March":"c","May":"c","Microsecond":"c","Millisecond":"c","Minute":"c","Monday":"c","Month":"t","Month.String":"m","Nanosecond":"c","NewTicker":"f","NewTimer":"f","November":"c","Now":"f","October":"c","Parse":"f","ParseDuration":"f","ParseError":"t","ParseError.Error":"m","ParseInLocation":"f","RFC1123":"c","RFC1123Z":"c","RFC3339":"c","RFC3339Nano":"c","RFC822":"c","RFC822Z":"c","RFC850":"c","RubyDate":"c","Saturday":"c","Second":"c","September":"c","Since":"f","Sleep":"f","Stamp":"c","StampMicro":"c","StampMilli":"c","StampNano":"c","Sunday":"c","Thursday":"c","Tick":"f","Ticker":"t","Ticker.Reset":"m","Ticker.Stop":"m","Time":"t","Time.Add":"m","Time.AddDate":"m","Time.After":"m","Time.AppendBinary":"m","Time.AppendFormat":"m","Time.AppendText":"m","Time.Before":"m","Time.Clock":"m","Time.Compare":"m","Time.Date":"m","Time.Day":"m","Time.Equal":"m","Time.Format":"m","Time.GoString":"m","Time.GobDecode":"m","Time.GobEncode":"m","Time.Hour":"m","Time.ISOWeek":"m","Time.In":"m","Time.IsDST":"m","Time.IsZero":"m","Time.Local":"m","Time.Location":"m","Time.MarshalBinary":"m","Time.MarshalJSON":"m","Time.MarshalText":"m","Time.Minute":"m","Time.Month":"m","Time.Nanosecond":"m","Time.Round":"m","Time.Second":"m","Time.String":"m","Time.Sub":"m","Time.Truncate":"m","Time.UTC":"m","Time.Unix":"m","Time.UnixMicro":"m","Time.UnixMilli":"m","Time.UnixNano":"m","Time.UnmarshalBinary":"m","Time.UnmarshalJSON":"m","Time.UnmarshalText":"m","Time.Weekday":"m","Time.Year":"m","Time.YearDay":"m","Time.Zone":"m","Time.ZoneBounds":"m","TimeOnly":"c","Timer":"t","Timer.Reset":"m","Timer.Stop":"m","Tuesday":"c","UTC":"v","Unix":"f","UnixDate":"c","UnixMicro":"f","UnixMilli":"f","Until":"f","Wednesday":"c","Weekday":"t","Weekday.String":"m"}},"unicode":{"path":"unicode","name":"unicode","symbols":{"ASCII_Hex_Digit":"v","Adlam":"v","Ahom":"v","Anatolian_Hieroglyphs":"v","Arabic":"v","Armenian":"v","Avestan":"v","AzeriCase":"v","Balinese":"v","Bamum":"v","Bassa_Vah":"v","Batak":"v","Bengali":"v","Bhaiksuki":"v","Bidi_Control":"v","Bopomofo":"v","Brahmi":"v","Braille":"v","Buginese":"v","Buhid":"v","C":"v","Canadian_Aboriginal":"v","Carian":"v","CaseRange":"t","CaseRanges":"v","Categories":"v","CategoryAliases":"v","Caucasian_Albanian":"v","Cc":"v","Cf":"v","Chakma":"v","Cham":"v","Cherokee":"v","Chorasmian":"v","Cn":"v","Co":"v","Common":"v","Coptic":"v","Cs":"v","Cuneiform":"v","Cypriot":"v","Cypro_Minoan":"v","Cyrillic":"v","Dash":"v","Deprecated":"v","Deseret":"v","Devanagari":"v","Diacritic":"v","Digit":"v","Dives_Akuru":"v","Dogra":"v","Duployan":"v","Egyptian_Hieroglyphs":"v","Elbasan":"v","Elymaic":"v","Ethiopic":"v","Extender":"v","FoldCategory":"v","FoldScript":"v","Georgian":"v","Glagolitic":"v","Gothic":"v","Grantha":"v","GraphicRanges":"v","Greek":"v","Gujarati":"v","Gunjala_Gondi":"v","Gurmukhi":"v","Han":"v","Hangul":"v","Hanifi_Rohingya":"v","Hanunoo":"v","Hatran":"v","Hebrew":"v","Hex_Digit":"v","Hiragana":"v","Hyphen":"v","IDS_Binary_Operator":"v","IDS_Trinary_Operator":"v","Ideographic":"v","Imperial_Aramaic":"v","In":"f","Inherited":"v","Inscriptional_Pahlavi":"v","Inscriptional_Parthian":"v","Is":"f","IsControl":"f","IsDigit":"f","IsGraphic":"f","IsLetter":"f","IsLower":"f","IsMark":"f","IsNumber":"f","IsOneOf":"f","IsPrint":"f","IsPunct":"f","IsSpace":"f","IsSymbol":"f","IsTitle":"f","IsUpper":"f","Javanese":"v","Join_Control":"v","Kaithi":"v","Kannada":"v","Katakana":"v","Kawi":"v","Kayah_Li":"v","Kharoshthi":"v","Khitan_Small_Script":"v","Khmer":"v","Khojki":"v","Khudawadi":"v","L":"v","LC":"v","Lao":"v","Latin":"v","Lepcha":"v","Letter":"v","Limbu":"v","Linear_A":"v","Linear_B":"v","Lisu":"v","Ll":"v","Lm":"v","Lo":"v","Logical_Order_Exception":"v","Lower":"v","LowerCase":"c","Lt":"v","Lu":"v","Lycian":"v","Lydian":"v","M":"v","Mahajani":"v","Makasar":"v","Malayalam":"v","Mandaic":"v","Manichaean":"v","Marchen":"v","Mark":"v","Masaram_Gondi":"v","MaxASCII":"c","MaxCase":"c","MaxLatin1":"c","MaxRune":"c","Mc":"v","Me":"v","Medefaidrin":"v","Meetei_Mayek":"v","Mende_Kikakui":"v","Meroitic_Cursive":"v","Meroitic_Hieroglyphs":"v","Miao":"v","Mn":"v","Modi":"v","Mongolian":"v","Mro":"v","Multani":"v","Myanmar":"v","N":"v","Nabataean":"v","Nag_Mundari":"v","Nandinagari":"v","Nd":"v","New_Tai_Lue":"v","Newa":"v","Nko":"v","Nl":"v","No":"v","Noncharacter_Code_Point":"v","Number":"v","Nushu":"v","Nyiakeng_Puachue_Hmong":"v","Ogham":"v","Ol_Chiki":"v","Old_Hungarian":"v","Old_Italic":"v","Old_North_Arabian":"v","Old_Permic":"v","Old_Persian":"v","Old_Sogdian":"v","Old_South_Arabian":"v","Old_Turkic":"v","Old_Uyghur":"v","Oriya":"v","Osage":"v","Osmanya":"v","Other":"v","Other_Alphabetic":"v","Other_Default_Ignorable_Code_Point":"v","Other_Grapheme_Extend":"v","Other_ID_Continue":"v","Other_ID_Start":"v","Other_Lowercase":"v","Other_Math":"v","Other_Uppercase":"v","P":"v","Pahawh_Hmong":"v","Palmyrene":"v","Pattern_Syntax":"v","Pattern_White_Space":"v","Pau_Cin_Hau":"v","Pc":"v","Pd":"v","Pe":"v","Pf":"v","Phags_Pa":"v","Phoenician":"v","Pi":"v","Po":"v","Prepended_Concatenation_Mark":"v","PrintRanges":"v","Properties":"v","Ps":"v","Psalter_Pahlavi":"v","Punct":"v","Quotation_Mark":"v","Radical":"v","Range16":"t","Range32":"t","RangeTable":"t","Regional_Indicator":"v","Rejang":"v","ReplacementChar":"c","Runic":"v","S":"v","STerm":"v","Samaritan":"v","Saurashtra":"v","Sc":"v","Scripts":"v","Sentence_Terminal":"v","Sharada":"v","Shavian":"v","Siddham":"v","SignWriting":"v","SimpleFold":"f","Sinhala":"v","Sk":"v","Sm":"v","So":"v","Soft_Dotted":"v","Sogdian":"v","Sora_Sompeng":"v","Soyombo":"v","Space":"v","SpecialCase":"t","SpecialCase.ToLower":"m","SpecialCase.ToTitle":"m","SpecialCase.ToUpper":"m","Sundanese":"v","Syloti_Nagri":"v","Symbol":"v","Syriac":"v","Tagalog":"v","Tagbanwa":"v","Tai_Le":"v","Tai_Tham":"v","Tai_Viet":"v","Takri":"v","Tamil":"v","Tangsa":"v","Tangut":"v","Telugu":"v","Terminal_Punctuation":"v","Thaana":"v","Thai":"v","Tibetan":"v","Tifinagh":"v","Tirhuta":"v","Title":"v","TitleCase":"c","To":"f","ToLower":"f","ToTitle":"f","ToUpper":"f","Toto":"v","TurkishCase":"v","Ugaritic":"v","Unified_Ideograph":"v","Upper":"v","UpperCase":"c","UpperLower":"c","Vai":"v","Variation_Selector":"v","Version":"c","Vithkuqi":"v","Wancho":"v","Warang_Citi":"v","White_Space":"v","Yezidi":"v","Yi":"v","Z":"v","Zanabazar_Square":"v","Zl":"v","Zp":"v","Zs":"v"}},"unicode/utf16":{"path":"unicode/utf16","name":"utf16","symbols":{"AppendRune":"f","Decode":"f","DecodeRune":"f","Encode":"f","EncodeRune":"f","IsSurrogate":"f","RuneLen":"f"}},"unicode/utf8":{"path":"unicode/utf8","name":"utf8","symbols":{"AppendRune":"f","DecodeLastRune":"f","DecodeLastRuneInString":"f","DecodeRune":"f","DecodeRuneInString":"f","EncodeRune":"f","FullRune":"f","FullRuneInString":"f","MaxRune":"c","RuneCount":"f","RuneCountInString":"f","RuneError":"c","RuneLen":"f","RuneSelf":"c","RuneStart":"f","UTFMax":"c","Valid":"f","ValidRune":"f","ValidString":"f"}},"unique":{"path":"unique","name":"unique","symbols":{"Handle":"t","Make":"f"}},"unsafe":{"path":"unsafe","name":"unsafe","symbols":{"Add":"f","Alignof":"f","ArbitraryType":"t","IntegerType":"t","Offsetof":"f","Pointer":"t","Sizeof":"f","Slice":"f","SliceData":"f","String":"f","StringData":"f"}},"weak":{"path":"weak","name":"weak","symbols":{"Make":"f","Pointer":"t"}}} +{"archive/tar":{"path":"archive/tar","name":"tar","symbols":{"ErrFieldTooLong":"v","ErrHeader":"v","ErrInsecurePath":"v","ErrWriteAfterClose":"v","ErrWriteTooLong":"v","FileInfoHeader":"f","FileInfoNames":"t","Format":"t","Format.String":"m","FormatGNU":"c","FormatPAX":"c","FormatUSTAR":"c","FormatUnknown":"c","Header":"t","Header.FileInfo":"m","NewReader":"f","NewWriter":"f","Reader":"t","Reader.Next":"m","Reader.Read":"m","TypeBlock":"c","TypeChar":"c","TypeCont":"c","TypeDir":"c","TypeFifo":"c","TypeGNULongLink":"c","TypeGNULongName":"c","TypeGNUSparse":"c","TypeLink":"c","TypeReg":"c","TypeRegA":"c","TypeSymlink":"c","TypeXGlobalHeader":"c","TypeXHeader":"c","Writer":"t","Writer.AddFS":"m","Writer.Close":"m","Writer.Flush":"m","Writer.Write":"m","Writer.WriteHeader":"m"}},"archive/zip":{"path":"archive/zip","name":"zip","symbols":{"Compressor":"t","Decompressor":"t","Deflate":"c","ErrAlgorithm":"v","ErrChecksum":"v","ErrFormat":"v","ErrInsecurePath":"v","File":"t","File.DataOffset":"m","File.Open":"m","File.OpenRaw":"m","FileHeader":"t","FileHeader.FileInfo":"m","FileHeader.ModTime":"m","FileHeader.Mode":"m","FileHeader.SetModTime":"m","FileHeader.SetMode":"m","FileInfoHeader":"f","NewReader":"f","NewWriter":"f","OpenReader":"f","ReadCloser":"t","ReadCloser.Close":"m","Reader":"t","Reader.Open":"m","Reader.RegisterDecompressor":"m","RegisterCompressor":"f","RegisterDecompressor":"f","Store":"c","Writer":"t","Writer.AddFS":"m","Writer.Close":"m","Writer.Copy":"m","Writer.Create":"m","Writer.CreateHeader":"m","Writer.CreateRaw":"m","Writer.Flush":"m","Writer.RegisterCompressor":"m","Writer.SetComment":"m","Writer.SetOffset":"m"}},"bufio":{"path":"bufio","name":"bufio","symbols":{"ErrAdvanceTooFar":"v","ErrBadReadCount":"v","ErrBufferFull":"v","ErrFinalToken":"v","ErrInvalidUnreadByte":"v","ErrInvalidUnreadRune":"v","ErrNegativeAdvance":"v","ErrNegativeCount":"v","ErrTooLong":"v","MaxScanTokenSize":"c","NewReadWriter":"f","NewReader":"f","NewReaderSize":"f","NewScanner":"f","NewWriter":"f","NewWriterSize":"f","ReadWriter":"t","Reader":"t","Reader.Buffered":"m","Reader.Discard":"m","Reader.Peek":"m","Reader.Read":"m","Reader.ReadByte":"m","Reader.ReadBytes":"m","Reader.ReadLine":"m","Reader.ReadRune":"m","Reader.ReadSlice":"m","Reader.ReadString":"m","Reader.Reset":"m","Reader.Size":"m","Reader.UnreadByte":"m","Reader.UnreadRune":"m","Reader.WriteTo":"m","ScanBytes":"f","ScanLines":"f","ScanRunes":"f","ScanWords":"f","Scanner":"t","Scanner.Buffer":"m","Scanner.Bytes":"m","Scanner.Err":"m","Scanner.Scan":"m","Scanner.Split":"m","Scanner.Text":"m","SplitFunc":"t","Writer":"t","Writer.Available":"m","Writer.AvailableBuffer":"m","Writer.Buffered":"m","Writer.Flush":"m","Writer.ReadFrom":"m","Writer.Reset":"m","Writer.Size":"m","Writer.Write":"m","Writer.WriteByte":"m","Writer.WriteRune":"m","Writer.WriteString":"m"}},"builtin":{"path":"builtin","name":"builtin","symbols":{"ComplexType":"t","FloatType":"t","IntegerType":"t","Type":"t","Type1":"t","TypeOrExpr":"t"}},"bytes":{"path":"bytes","name":"bytes","symbols":{"Buffer":"t","Buffer.Available":"m","Buffer.AvailableBuffer":"m","Buffer.Bytes":"m","Buffer.Cap":"m","Buffer.Grow":"m","Buffer.Len":"m","Buffer.Next":"m","Buffer.Peek":"m","Buffer.Read":"m","Buffer.ReadByte":"m","Buffer.ReadBytes":"m","Buffer.ReadFrom":"m","Buffer.ReadRune":"m","Buffer.ReadString":"m","Buffer.Reset":"m","Buffer.String":"m","Buffer.Truncate":"m","Buffer.UnreadByte":"m","Buffer.UnreadRune":"m","Buffer.Write":"m","Buffer.WriteByte":"m","Buffer.WriteRune":"m","Buffer.WriteString":"m","Buffer.WriteTo":"m","Clone":"f","Compare":"f","Contains":"f","ContainsAny":"f","ContainsFunc":"f","ContainsRune":"f","Count":"f","Cut":"f","CutLast":"f","CutPrefix":"f","CutSuffix":"f","Equal":"f","EqualFold":"f","ErrTooLarge":"v","Fields":"f","FieldsFunc":"f","FieldsFuncSeq":"f","FieldsSeq":"f","HasPrefix":"f","HasSuffix":"f","Index":"f","IndexAny":"f","IndexByte":"f","IndexFunc":"f","IndexRune":"f","Join":"f","LastIndex":"f","LastIndexAny":"f","LastIndexByte":"f","LastIndexFunc":"f","Lines":"f","Map":"f","MinRead":"c","NewBuffer":"f","NewBufferString":"f","NewReader":"f","Reader":"t","Reader.Len":"m","Reader.Read":"m","Reader.ReadAt":"m","Reader.ReadByte":"m","Reader.ReadRune":"m","Reader.Reset":"m","Reader.Seek":"m","Reader.Size":"m","Reader.UnreadByte":"m","Reader.UnreadRune":"m","Reader.WriteTo":"m","Repeat":"f","Replace":"f","ReplaceAll":"f","Runes":"f","Split":"f","SplitAfter":"f","SplitAfterN":"f","SplitAfterSeq":"f","SplitN":"f","SplitSeq":"f","Title":"f","ToLower":"f","ToLowerSpecial":"f","ToTitle":"f","ToTitleSpecial":"f","ToUpper":"f","ToUpperSpecial":"f","ToValidUTF8":"f","Trim":"f","TrimFunc":"f","TrimLeft":"f","TrimLeftFunc":"f","TrimPrefix":"f","TrimRight":"f","TrimRightFunc":"f","TrimSpace":"f","TrimSuffix":"f"}},"cmp":{"path":"cmp","name":"cmp","symbols":{"Compare":"f","Less":"f","Or":"f","Ordered":"t"}},"compress/bzip2":{"path":"compress/bzip2","name":"bzip2","symbols":{"NewReader":"f","StructuralError":"t","StructuralError.Error":"m"}},"compress/flate":{"path":"compress/flate","name":"flate","symbols":{"BestCompression":"c","BestSpeed":"c","CorruptInputError":"t","CorruptInputError.Error":"m","DefaultCompression":"c","HuffmanOnly":"c","InternalError":"t","InternalError.Error":"m","NewReader":"f","NewReaderDict":"f","NewWriter":"f","NewWriterDict":"f","NoCompression":"c","ReadError":"t","ReadError.Error":"m","Reader":"t","Resetter":"t","WriteError":"t","WriteError.Error":"m","Writer":"t","Writer.Close":"m","Writer.Flush":"m","Writer.Reset":"m","Writer.Write":"m"}},"compress/gzip":{"path":"compress/gzip","name":"gzip","symbols":{"BestCompression":"c","BestSpeed":"c","DefaultCompression":"c","ErrChecksum":"v","ErrHeader":"v","Header":"t","HuffmanOnly":"c","NewReader":"f","NewWriter":"f","NewWriterLevel":"f","NoCompression":"c","Reader":"t","Reader.Close":"m","Reader.Multistream":"m","Reader.Read":"m","Reader.Reset":"m","Writer":"t","Writer.Close":"m","Writer.Flush":"m","Writer.Reset":"m","Writer.Write":"m"}},"compress/lzw":{"path":"compress/lzw","name":"lzw","symbols":{"LSB":"c","MSB":"c","NewReader":"f","NewWriter":"f","Order":"t","Reader":"t","Reader.Close":"m","Reader.Read":"m","Reader.Reset":"m","Writer":"t","Writer.Close":"m","Writer.Reset":"m","Writer.Write":"m"}},"compress/zlib":{"path":"compress/zlib","name":"zlib","symbols":{"BestCompression":"c","BestSpeed":"c","DefaultCompression":"c","ErrChecksum":"v","ErrDictionary":"v","ErrHeader":"v","HuffmanOnly":"c","NewReader":"f","NewReaderDict":"f","NewWriter":"f","NewWriterLevel":"f","NewWriterLevelDict":"f","NoCompression":"c","Resetter":"t","Writer":"t","Writer.Close":"m","Writer.Flush":"m","Writer.Reset":"m","Writer.Write":"m"}},"container/heap":{"path":"container/heap","name":"heap","symbols":{"Fix":"f","Init":"f","Interface":"t","Pop":"f","Push":"f","Remove":"f"}},"container/list":{"path":"container/list","name":"list","symbols":{"Element":"t","Element.Next":"m","Element.Prev":"m","List":"t","List.Back":"m","List.Front":"m","List.Init":"m","List.InsertAfter":"m","List.InsertBefore":"m","List.Len":"m","List.MoveAfter":"m","List.MoveBefore":"m","List.MoveToBack":"m","List.MoveToFront":"m","List.PushBack":"m","List.PushBackList":"m","List.PushFront":"m","List.PushFrontList":"m","List.Remove":"m","New":"f"}},"container/ring":{"path":"container/ring","name":"ring","symbols":{"New":"f","Ring":"t","Ring.Do":"m","Ring.Len":"m","Ring.Link":"m","Ring.Move":"m","Ring.Next":"m","Ring.Prev":"m","Ring.Unlink":"m"}},"context":{"path":"context","name":"context","symbols":{"AfterFunc":"f","Background":"f","CancelCauseFunc":"t","CancelFunc":"t","Canceled":"v","Cause":"f","Context":"t","DeadlineExceeded":"v","TODO":"f","WithCancel":"f","WithCancelCause":"f","WithDeadline":"f","WithDeadlineCause":"f","WithTimeout":"f","WithTimeoutCause":"f","WithValue":"f","WithoutCancel":"f"}},"crypto":{"path":"crypto","name":"crypto","symbols":{"BLAKE2b_256":"c","BLAKE2b_384":"c","BLAKE2b_512":"c","BLAKE2s_256":"c","Decapsulator":"t","Decrypter":"t","DecrypterOpts":"t","Encapsulator":"t","Hash":"t","Hash.Available":"m","Hash.HashFunc":"m","Hash.New":"m","Hash.Size":"m","Hash.String":"m","MD4":"c","MD5":"c","MD5SHA1":"c","MLDSAMu":"c","MessageSigner":"t","PrivateKey":"t","PublicKey":"t","RIPEMD160":"c","RegisterHash":"f","SHA1":"c","SHA224":"c","SHA256":"c","SHA384":"c","SHA3_224":"c","SHA3_256":"c","SHA3_384":"c","SHA3_512":"c","SHA512":"c","SHA512_224":"c","SHA512_256":"c","SignMessage":"f","Signer":"t","SignerOpts":"t"}},"crypto/aes":{"path":"crypto/aes","name":"aes","symbols":{"BlockSize":"c","KeySizeError":"t","KeySizeError.Error":"m","NewCipher":"f"}},"crypto/cipher":{"path":"crypto/cipher","name":"cipher","symbols":{"AEAD":"t","Block":"t","BlockMode":"t","NewCBCDecrypter":"f","NewCBCEncrypter":"f","NewCFBDecrypter":"f","NewCFBEncrypter":"f","NewCTR":"f","NewGCM":"f","NewGCMWithNonceSize":"f","NewGCMWithRandomNonce":"f","NewGCMWithTagSize":"f","NewOFB":"f","Stream":"t","StreamReader":"t","StreamReader.Read":"m","StreamWriter":"t","StreamWriter.Close":"m","StreamWriter.Write":"m"}},"crypto/des":{"path":"crypto/des","name":"des","symbols":{"BlockSize":"c","KeySizeError":"t","KeySizeError.Error":"m","NewCipher":"f","NewTripleDESCipher":"f"}},"crypto/dsa":{"path":"crypto/dsa","name":"dsa","symbols":{"ErrInvalidPublicKey":"v","GenerateKey":"f","GenerateParameters":"f","L1024N160":"c","L2048N224":"c","L2048N256":"c","L3072N256":"c","ParameterSizes":"t","Parameters":"t","PrivateKey":"t","PublicKey":"t","Sign":"f","Verify":"f"}},"crypto/ecdh":{"path":"crypto/ecdh","name":"ecdh","symbols":{"Curve":"t","KeyExchanger":"t","P256":"f","P384":"f","P521":"f","PrivateKey":"t","PrivateKey.Bytes":"m","PrivateKey.Curve":"m","PrivateKey.ECDH":"m","PrivateKey.Equal":"m","PrivateKey.Public":"m","PrivateKey.PublicKey":"m","PublicKey":"t","PublicKey.Bytes":"m","PublicKey.Curve":"m","PublicKey.Equal":"m","X25519":"f"}},"crypto/ecdsa":{"path":"crypto/ecdsa","name":"ecdsa","symbols":{"GenerateKey":"f","ParseRawPrivateKey":"f","ParseUncompressedPublicKey":"f","PrivateKey":"t","PrivateKey.Bytes":"m","PrivateKey.ECDH":"m","PrivateKey.Equal":"m","PrivateKey.Public":"m","PrivateKey.Sign":"m","PublicKey":"t","PublicKey.Bytes":"m","PublicKey.ECDH":"m","PublicKey.Equal":"m","Sign":"f","SignASN1":"f","Verify":"f","VerifyASN1":"f"}},"crypto/ed25519":{"path":"crypto/ed25519","name":"ed25519","symbols":{"GenerateKey":"f","NewKeyFromSeed":"f","Options":"t","Options.HashFunc":"m","PrivateKey":"t","PrivateKey.Equal":"m","PrivateKey.Public":"m","PrivateKey.Seed":"m","PrivateKey.Sign":"m","PrivateKeySize":"c","PublicKey":"t","PublicKey.Equal":"m","PublicKeySize":"c","SeedSize":"c","Sign":"f","SignatureSize":"c","Verify":"f","VerifyWithOptions":"f"}},"crypto/elliptic":{"path":"crypto/elliptic","name":"elliptic","symbols":{"Curve":"t","CurveParams":"t","CurveParams.Add":"m","CurveParams.Double":"m","CurveParams.IsOnCurve":"m","CurveParams.Params":"m","CurveParams.ScalarBaseMult":"m","CurveParams.ScalarMult":"m","GenerateKey":"f","Marshal":"f","MarshalCompressed":"f","P224":"f","P256":"f","P384":"f","P521":"f","Unmarshal":"f","UnmarshalCompressed":"f"}},"crypto/fips140":{"path":"crypto/fips140","name":"fips140","symbols":{"Enabled":"f","Enforced":"f","Version":"f","WithoutEnforcement":"f"}},"crypto/hkdf":{"path":"crypto/hkdf","name":"hkdf","symbols":{"Expand":"f","Extract":"f","Key":"f"}},"crypto/hmac":{"path":"crypto/hmac","name":"hmac","symbols":{"Equal":"f","New":"f"}},"crypto/hpke":{"path":"crypto/hpke","name":"hpke","symbols":{"AEAD":"t","AES128GCM":"f","AES256GCM":"f","ChaCha20Poly1305":"f","DHKEM":"f","ExportOnly":"f","HKDFSHA256":"f","HKDFSHA384":"f","HKDFSHA512":"f","KDF":"t","KEM":"t","MLKEM1024":"f","MLKEM1024P384":"f","MLKEM768":"f","MLKEM768P256":"f","MLKEM768X25519":"f","NewAEAD":"f","NewDHKEMPrivateKey":"f","NewDHKEMPublicKey":"f","NewHybridPrivateKey":"f","NewHybridPublicKey":"f","NewKDF":"f","NewKEM":"f","NewMLKEMPrivateKey":"f","NewMLKEMPublicKey":"f","NewRecipient":"f","NewSender":"f","Open":"f","PrivateKey":"t","PublicKey":"t","Recipient":"t","Recipient.Export":"m","Recipient.Open":"m","SHAKE128":"f","SHAKE256":"f","Seal":"f","Sender":"t","Sender.Export":"m","Sender.Seal":"m"}},"crypto/md5":{"path":"crypto/md5","name":"md5","symbols":{"BlockSize":"c","New":"f","Size":"c","Sum":"f"}},"crypto/mldsa":{"path":"crypto/mldsa","name":"mldsa","symbols":{"GenerateKey":"f","MLDSA44":"f","MLDSA44PublicKeySize":"c","MLDSA44SignatureSize":"c","MLDSA65":"f","MLDSA65PublicKeySize":"c","MLDSA65SignatureSize":"c","MLDSA87":"f","MLDSA87PublicKeySize":"c","MLDSA87SignatureSize":"c","NewPrivateKey":"f","NewPublicKey":"f","Options":"t","Options.HashFunc":"m","Parameters":"t","Parameters.PublicKeySize":"m","Parameters.SignatureSize":"m","Parameters.String":"m","PrivateKey":"t","PrivateKey.Bytes":"m","PrivateKey.Equal":"m","PrivateKey.Public":"m","PrivateKey.PublicKey":"m","PrivateKey.Sign":"m","PrivateKey.SignDeterministic":"m","PrivateKeySize":"c","PublicKey":"t","PublicKey.Bytes":"m","PublicKey.Equal":"m","PublicKey.Parameters":"m","Verify":"f"}},"crypto/mlkem":{"path":"crypto/mlkem","name":"mlkem","symbols":{"CiphertextSize1024":"c","CiphertextSize768":"c","DecapsulationKey1024":"t","DecapsulationKey1024.Bytes":"m","DecapsulationKey1024.Decapsulate":"m","DecapsulationKey1024.EncapsulationKey":"m","DecapsulationKey1024.Encapsulator":"m","DecapsulationKey768":"t","DecapsulationKey768.Bytes":"m","DecapsulationKey768.Decapsulate":"m","DecapsulationKey768.EncapsulationKey":"m","DecapsulationKey768.Encapsulator":"m","EncapsulationKey1024":"t","EncapsulationKey1024.Bytes":"m","EncapsulationKey1024.Encapsulate":"m","EncapsulationKey768":"t","EncapsulationKey768.Bytes":"m","EncapsulationKey768.Encapsulate":"m","EncapsulationKeySize1024":"c","EncapsulationKeySize768":"c","GenerateKey1024":"f","GenerateKey768":"f","NewDecapsulationKey1024":"f","NewDecapsulationKey768":"f","NewEncapsulationKey1024":"f","NewEncapsulationKey768":"f","SeedSize":"c","SharedKeySize":"c"}},"crypto/mlkem/mlkemtest":{"path":"crypto/mlkem/mlkemtest","name":"mlkemtest","symbols":{"Encapsulate1024":"f","Encapsulate768":"f"}},"crypto/pbkdf2":{"path":"crypto/pbkdf2","name":"pbkdf2","symbols":{"Key":"f"}},"crypto/rand":{"path":"crypto/rand","name":"rand","symbols":{"Int":"f","Prime":"f","Read":"f","Reader":"v","Text":"f"}},"crypto/rc4":{"path":"crypto/rc4","name":"rc4","symbols":{"Cipher":"t","Cipher.Reset":"m","Cipher.XORKeyStream":"m","KeySizeError":"t","KeySizeError.Error":"m","NewCipher":"f"}},"crypto/rsa":{"path":"crypto/rsa","name":"rsa","symbols":{"CRTValue":"t","DecryptOAEP":"f","DecryptPKCS1v15":"f","DecryptPKCS1v15SessionKey":"f","EncryptOAEP":"f","EncryptOAEPWithOptions":"f","EncryptPKCS1v15":"f","ErrDecryption":"v","ErrMessageTooLong":"v","ErrVerification":"v","GenerateKey":"f","GenerateMultiPrimeKey":"f","OAEPOptions":"t","PKCS1v15DecryptOptions":"t","PSSOptions":"t","PSSOptions.HashFunc":"m","PSSSaltLengthAuto":"c","PSSSaltLengthEqualsHash":"c","PrecomputedValues":"t","PrivateKey":"t","PrivateKey.Decrypt":"m","PrivateKey.Equal":"m","PrivateKey.Precompute":"m","PrivateKey.Public":"m","PrivateKey.Sign":"m","PrivateKey.Validate":"m","PublicKey":"t","PublicKey.Equal":"m","PublicKey.Size":"m","SignPKCS1v15":"f","SignPSS":"f","VerifyPKCS1v15":"f","VerifyPSS":"f"}},"crypto/sha1":{"path":"crypto/sha1","name":"sha1","symbols":{"BlockSize":"c","New":"f","Size":"c","Sum":"f"}},"crypto/sha256":{"path":"crypto/sha256","name":"sha256","symbols":{"BlockSize":"c","New":"f","New224":"f","Size":"c","Size224":"c","Sum224":"f","Sum256":"f"}},"crypto/sha3":{"path":"crypto/sha3","name":"sha3","symbols":{"New224":"f","New256":"f","New384":"f","New512":"f","NewCSHAKE128":"f","NewCSHAKE256":"f","NewSHAKE128":"f","NewSHAKE256":"f","SHA3":"t","SHA3.AppendBinary":"m","SHA3.BlockSize":"m","SHA3.Clone":"m","SHA3.MarshalBinary":"m","SHA3.Reset":"m","SHA3.Size":"m","SHA3.Sum":"m","SHA3.UnmarshalBinary":"m","SHA3.Write":"m","SHAKE":"t","SHAKE.AppendBinary":"m","SHAKE.BlockSize":"m","SHAKE.MarshalBinary":"m","SHAKE.Read":"m","SHAKE.Reset":"m","SHAKE.UnmarshalBinary":"m","SHAKE.Write":"m","Sum224":"f","Sum256":"f","Sum384":"f","Sum512":"f","SumSHAKE128":"f","SumSHAKE256":"f"}},"crypto/sha512":{"path":"crypto/sha512","name":"sha512","symbols":{"BlockSize":"c","New":"f","New384":"f","New512_224":"f","New512_256":"f","Size":"c","Size224":"c","Size256":"c","Size384":"c","Sum384":"f","Sum512":"f","Sum512_224":"f","Sum512_256":"f"}},"crypto/subtle":{"path":"crypto/subtle","name":"subtle","symbols":{"ConstantTimeByteEq":"f","ConstantTimeCompare":"f","ConstantTimeCopy":"f","ConstantTimeEq":"f","ConstantTimeLessOrEq":"f","ConstantTimeSelect":"f","WithDataIndependentTiming":"f","XORBytes":"f"}},"crypto/tls":{"path":"crypto/tls","name":"tls","symbols":{"AlertError":"t","AlertError.Error":"m","Certificate":"t","CertificateRequestInfo":"t","CertificateRequestInfo.Context":"m","CertificateRequestInfo.SupportsCertificate":"m","CertificateVerificationError":"t","CertificateVerificationError.Error":"m","CertificateVerificationError.Unwrap":"m","CipherSuite":"t","CipherSuiteName":"f","CipherSuites":"f","Client":"f","ClientAuthType":"t","ClientAuthType.String":"m","ClientHelloInfo":"t","ClientHelloInfo.Context":"m","ClientHelloInfo.SupportsCertificate":"m","ClientSessionCache":"t","ClientSessionState":"t","ClientSessionState.ResumptionState":"m","Config":"t","Config.BuildNameToCertificate":"m","Config.Clone":"m","Config.DecryptTicket":"m","Config.EncryptTicket":"m","Config.SetSessionTicketKeys":"m","Conn":"t","Conn.Close":"m","Conn.CloseWrite":"m","Conn.ConnectionState":"m","Conn.Handshake":"m","Conn.HandshakeContext":"m","Conn.LocalAddr":"m","Conn.NetConn":"m","Conn.OCSPResponse":"m","Conn.Read":"m","Conn.RemoteAddr":"m","Conn.SetDeadline":"m","Conn.SetReadDeadline":"m","Conn.SetWriteDeadline":"m","Conn.VerifyHostname":"m","Conn.Write":"m","ConnectionState":"t","ConnectionState.ExportKeyingMaterial":"m","CurveID":"t","CurveID.String":"m","CurveP256":"c","CurveP384":"c","CurveP521":"c","Dial":"f","DialWithDialer":"f","Dialer":"t","Dialer.Dial":"m","Dialer.DialContext":"m","ECDSAWithP256AndSHA256":"c","ECDSAWithP384AndSHA384":"c","ECDSAWithP521AndSHA512":"c","ECDSAWithSHA1":"c","ECHRejectionError":"t","ECHRejectionError.Error":"m","Ed25519":"c","EncryptedClientHelloKey":"t","InsecureCipherSuites":"f","Listen":"f","LoadX509KeyPair":"f","MLDSA44":"c","MLDSA65":"c","MLDSA87":"c","MLKEM1024":"c","NewLRUClientSessionCache":"f","NewListener":"f","NewResumptionState":"f","NoClientCert":"c","PKCS1WithSHA1":"c","PKCS1WithSHA256":"c","PKCS1WithSHA384":"c","PKCS1WithSHA512":"c","PSSWithSHA256":"c","PSSWithSHA384":"c","PSSWithSHA512":"c","ParseSessionState":"f","QUICClient":"f","QUICConfig":"t","QUICConn":"t","QUICConn.Close":"m","QUICConn.ConnectionState":"m","QUICConn.HandleData":"m","QUICConn.NextEvent":"m","QUICConn.SendSessionTicket":"m","QUICConn.SetTransportParameters":"m","QUICConn.Start":"m","QUICConn.StoreSession":"m","QUICEncryptionLevel":"t","QUICEncryptionLevel.String":"m","QUICEncryptionLevelApplication":"c","QUICEncryptionLevelEarly":"c","QUICEncryptionLevelHandshake":"c","QUICEncryptionLevelInitial":"c","QUICErrorEvent":"c","QUICEvent":"t","QUICEventKind":"t","QUICHandshakeDone":"c","QUICNoEvent":"c","QUICRejectedEarlyData":"c","QUICResumeSession":"c","QUICServer":"f","QUICSessionTicketOptions":"t","QUICSetReadSecret":"c","QUICSetWriteSecret":"c","QUICStoreSession":"c","QUICTransportParameters":"c","QUICTransportParametersRequired":"c","QUICWriteData":"c","RecordHeaderError":"t","RecordHeaderError.Error":"m","RenegotiateFreelyAsClient":"c","RenegotiateNever":"c","RenegotiateOnceAsClient":"c","RenegotiationSupport":"t","RequestClientCert":"c","RequireAndVerifyClientCert":"c","RequireAnyClientCert":"c","SecP256r1MLKEM768":"c","SecP384r1MLKEM1024":"c","Server":"f","SessionState":"t","SessionState.Bytes":"m","SignatureScheme":"t","SignatureScheme.String":"m","TLS_AES_128_GCM_SHA256":"c","TLS_AES_256_GCM_SHA384":"c","TLS_CHACHA20_POLY1305_SHA256":"c","TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA":"c","TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256":"c","TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256":"c","TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA":"c","TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384":"c","TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305":"c","TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256":"c","TLS_ECDHE_ECDSA_WITH_RC4_128_SHA":"c","TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA":"c","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA":"c","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256":"c","TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256":"c","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA":"c","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384":"c","TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305":"c","TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256":"c","TLS_ECDHE_RSA_WITH_RC4_128_SHA":"c","TLS_FALLBACK_SCSV":"c","TLS_RSA_WITH_3DES_EDE_CBC_SHA":"c","TLS_RSA_WITH_AES_128_CBC_SHA":"c","TLS_RSA_WITH_AES_128_CBC_SHA256":"c","TLS_RSA_WITH_AES_128_GCM_SHA256":"c","TLS_RSA_WITH_AES_256_CBC_SHA":"c","TLS_RSA_WITH_AES_256_GCM_SHA384":"c","TLS_RSA_WITH_RC4_128_SHA":"c","VerifyClientCertIfGiven":"c","VersionName":"f","VersionSSL30":"c","VersionTLS10":"c","VersionTLS11":"c","VersionTLS12":"c","VersionTLS13":"c","X25519":"c","X25519MLKEM768":"c","X509KeyPair":"f"}},"crypto/x509":{"path":"crypto/x509","name":"x509","symbols":{"CANotAuthorizedForExtKeyUsage":"c","CANotAuthorizedForThisName":"c","CertPool":"t","CertPool.AddCert":"m","CertPool.AddCertWithConstraint":"m","CertPool.AppendCertsFromPEM":"m","CertPool.Clone":"m","CertPool.Equal":"m","CertPool.Subjects":"m","Certificate":"t","Certificate.CheckCRLSignature":"m","Certificate.CheckSignature":"m","Certificate.CheckSignatureFrom":"m","Certificate.CreateCRL":"m","Certificate.Equal":"m","Certificate.Verify":"m","Certificate.VerifyHostname":"m","CertificateInvalidError":"t","CertificateInvalidError.Error":"m","CertificateRequest":"t","CertificateRequest.CheckSignature":"m","ConstraintViolationError":"t","ConstraintViolationError.Error":"m","CreateCertificate":"f","CreateCertificateRequest":"f","CreateRevocationList":"f","DSA":"c","DSAWithSHA1":"c","DSAWithSHA256":"c","DecryptPEMBlock":"f","ECDSA":"c","ECDSAWithSHA1":"c","ECDSAWithSHA256":"c","ECDSAWithSHA384":"c","ECDSAWithSHA512":"c","Ed25519":"c","EncryptPEMBlock":"f","ErrUnsupportedAlgorithm":"v","Expired":"c","ExtKeyUsage":"t","ExtKeyUsage.OID":"m","ExtKeyUsage.String":"m","ExtKeyUsageAny":"c","ExtKeyUsageClientAuth":"c","ExtKeyUsageCodeSigning":"c","ExtKeyUsageEmailProtection":"c","ExtKeyUsageIPSECEndSystem":"c","ExtKeyUsageIPSECTunnel":"c","ExtKeyUsageIPSECUser":"c","ExtKeyUsageMicrosoftCommercialCodeSigning":"c","ExtKeyUsageMicrosoftKernelCodeSigning":"c","ExtKeyUsageMicrosoftServerGatedCrypto":"c","ExtKeyUsageNetscapeServerGatedCrypto":"c","ExtKeyUsageOCSPSigning":"c","ExtKeyUsageServerAuth":"c","ExtKeyUsageTimeStamping":"c","HostnameError":"t","HostnameError.Error":"m","IncompatibleUsage":"c","IncorrectPasswordError":"v","InsecureAlgorithmError":"t","InsecureAlgorithmError.Error":"m","InvalidReason":"t","IsEncryptedPEMBlock":"f","KeyUsage":"t","KeyUsage.String":"m","KeyUsageCRLSign":"c","KeyUsageCertSign":"c","KeyUsageContentCommitment":"c","KeyUsageDataEncipherment":"c","KeyUsageDecipherOnly":"c","KeyUsageDigitalSignature":"c","KeyUsageEncipherOnly":"c","KeyUsageKeyAgreement":"c","KeyUsageKeyEncipherment":"c","MD2WithRSA":"c","MD5WithRSA":"c","MLDSA":"c","MLDSA44":"c","MLDSA65":"c","MLDSA87":"c","MarshalECPrivateKey":"f","MarshalPKCS1PrivateKey":"f","MarshalPKCS1PublicKey":"f","MarshalPKCS8PrivateKey":"f","MarshalPKIXPublicKey":"f","NameConstraintsWithoutSANs":"c","NameMismatch":"c","NewCertPool":"f","NoValidChains":"c","NotAuthorizedToSign":"c","OID":"t","OID.AppendBinary":"m","OID.AppendText":"m","OID.Equal":"m","OID.EqualASN1OID":"m","OID.MarshalBinary":"m","OID.MarshalText":"m","OID.String":"m","OID.UnmarshalBinary":"m","OID.UnmarshalText":"m","OIDFromASN1OID":"f","OIDFromInts":"f","PEMCipher":"t","PEMCipher3DES":"c","PEMCipherAES128":"c","PEMCipherAES192":"c","PEMCipherAES256":"c","PEMCipherDES":"c","ParseCRL":"f","ParseCertificate":"f","ParseCertificateRequest":"f","ParseCertificates":"f","ParseDERCRL":"f","ParseECPrivateKey":"f","ParseOID":"f","ParsePKCS1PrivateKey":"f","ParsePKCS1PublicKey":"f","ParsePKCS8PrivateKey":"f","ParsePKIXPublicKey":"f","ParseRevocationList":"f","PolicyMapping":"t","PublicKeyAlgorithm":"t","PublicKeyAlgorithm.String":"m","PureEd25519":"c","RSA":"c","RevocationList":"t","RevocationList.CheckSignatureFrom":"m","RevocationListEntry":"t","SHA1WithRSA":"c","SHA256WithRSA":"c","SHA256WithRSAPSS":"c","SHA384WithRSA":"c","SHA384WithRSAPSS":"c","SHA512WithRSA":"c","SHA512WithRSAPSS":"c","SetFallbackRoots":"f","SignatureAlgorithm":"t","SignatureAlgorithm.String":"m","SystemCertPool":"f","SystemRootsError":"t","SystemRootsError.Error":"m","SystemRootsError.Unwrap":"m","TooManyConstraints":"c","TooManyIntermediates":"c","UnconstrainedName":"c","UnhandledCriticalExtension":"t","UnhandledCriticalExtension.Error":"m","UnknownAuthorityError":"t","UnknownAuthorityError.Error":"m","UnknownPublicKeyAlgorithm":"c","UnknownSignatureAlgorithm":"c","VerifyOptions":"t"}},"crypto/x509/pkix":{"path":"crypto/x509/pkix","name":"pkix","symbols":{"AlgorithmIdentifier":"t","AttributeTypeAndValue":"t","AttributeTypeAndValueSET":"t","CertificateList":"t","CertificateList.HasExpired":"m","Extension":"t","Name":"t","Name.FillFromRDNSequence":"m","Name.String":"m","Name.ToRDNSequence":"m","RDNSequence":"t","RDNSequence.String":"m","RelativeDistinguishedNameSET":"t","RevokedCertificate":"t","TBSCertificateList":"t"}},"database/sql":{"path":"database/sql","name":"sql","symbols":{"ColumnType":"t","ColumnType.DatabaseTypeName":"m","ColumnType.DecimalSize":"m","ColumnType.Length":"m","ColumnType.Name":"m","ColumnType.Nullable":"m","ColumnType.ScanType":"m","Conn":"t","Conn.BeginTx":"m","Conn.Close":"m","Conn.ExecContext":"m","Conn.PingContext":"m","Conn.PrepareContext":"m","Conn.QueryContext":"m","Conn.QueryRowContext":"m","Conn.Raw":"m","ConvertAssign":"f","DB":"t","DB.Begin":"m","DB.BeginTx":"m","DB.Close":"m","DB.Conn":"m","DB.Driver":"m","DB.Exec":"m","DB.ExecContext":"m","DB.Ping":"m","DB.PingContext":"m","DB.Prepare":"m","DB.PrepareContext":"m","DB.Query":"m","DB.QueryContext":"m","DB.QueryRow":"m","DB.QueryRowContext":"m","DB.SetConnMaxIdleTime":"m","DB.SetConnMaxLifetime":"m","DB.SetMaxIdleConns":"m","DB.SetMaxOpenConns":"m","DB.Stats":"m","DBStats":"t","Drivers":"f","ErrConnDone":"v","ErrNoRows":"v","ErrTxDone":"v","IsolationLevel":"t","IsolationLevel.String":"m","LevelDefault":"c","LevelLinearizable":"c","LevelReadCommitted":"c","LevelReadUncommitted":"c","LevelRepeatableRead":"c","LevelSerializable":"c","LevelSnapshot":"c","LevelWriteCommitted":"c","Named":"f","NamedArg":"t","Null":"t","NullBool":"t","NullBool.Scan":"m","NullBool.Value":"m","NullByte":"t","NullByte.Scan":"m","NullByte.Value":"m","NullFloat64":"t","NullFloat64.Scan":"m","NullFloat64.Value":"m","NullInt16":"t","NullInt16.Scan":"m","NullInt16.Value":"m","NullInt32":"t","NullInt32.Scan":"m","NullInt32.Value":"m","NullInt64":"t","NullInt64.Scan":"m","NullInt64.Value":"m","NullString":"t","NullString.Scan":"m","NullString.Value":"m","NullTime":"t","NullTime.Scan":"m","NullTime.Value":"m","Open":"f","OpenDB":"f","Out":"t","RawBytes":"t","Register":"f","Result":"t","Row":"t","Row.Err":"m","Row.Scan":"m","Rows":"t","Rows.Close":"m","Rows.ColumnTypes":"m","Rows.Columns":"m","Rows.Err":"m","Rows.Next":"m","Rows.NextResultSet":"m","Rows.Scan":"m","Scanner":"t","Stmt":"t","Stmt.Close":"m","Stmt.Exec":"m","Stmt.ExecContext":"m","Stmt.Query":"m","Stmt.QueryContext":"m","Stmt.QueryRow":"m","Stmt.QueryRowContext":"m","Tx":"t","Tx.Commit":"m","Tx.Exec":"m","Tx.ExecContext":"m","Tx.Prepare":"m","Tx.PrepareContext":"m","Tx.Query":"m","Tx.QueryContext":"m","Tx.QueryRow":"m","Tx.QueryRowContext":"m","Tx.Rollback":"m","Tx.Stmt":"m","Tx.StmtContext":"m","TxOptions":"t"}},"database/sql/driver":{"path":"database/sql/driver","name":"driver","symbols":{"Bool":"v","ColumnConverter":"t","Conn":"t","ConnBeginTx":"t","ConnPrepareContext":"t","Connector":"t","DefaultParameterConverter":"v","Driver":"t","DriverContext":"t","ErrBadConn":"v","ErrRemoveArgument":"v","ErrSkip":"v","Execer":"t","ExecerContext":"t","Int32":"v","IsScanValue":"f","IsValue":"f","IsolationLevel":"t","NamedValue":"t","NamedValueChecker":"t","NotNull":"t","NotNull.ConvertValue":"m","Null":"t","Null.ConvertValue":"m","Pinger":"t","Queryer":"t","QueryerContext":"t","Result":"t","ResultNoRows":"v","Rows":"t","RowsAffected":"t","RowsAffected.LastInsertId":"m","RowsAffected.RowsAffected":"m","RowsColumnScanner":"t","RowsColumnTypeDatabaseTypeName":"t","RowsColumnTypeLength":"t","RowsColumnTypeNullable":"t","RowsColumnTypePrecisionScale":"t","RowsColumnTypeScanType":"t","RowsNextResultSet":"t","ScanContext":"t","SessionResetter":"t","Stmt":"t","StmtExecContext":"t","StmtQueryContext":"t","String":"v","Tx":"t","TxOptions":"t","Validator":"t","Value":"t","ValueConverter":"t","Valuer":"t"}},"debug/buildinfo":{"path":"debug/buildinfo","name":"buildinfo","symbols":{"BuildInfo":"t","Read":"f","ReadFile":"f"}},"debug/dwarf":{"path":"debug/dwarf","name":"dwarf","symbols":{"AddrType":"t","ArrayType":"t","ArrayType.Size":"m","ArrayType.String":"m","Attr":"t","Attr.GoString":"m","Attr.String":"m","AttrAbstractOrigin":"c","AttrAccessibility":"c","AttrAddrBase":"c","AttrAddrClass":"c","AttrAlignment":"c","AttrAllocated":"c","AttrArtificial":"c","AttrAssociated":"c","AttrBaseTypes":"c","AttrBinaryScale":"c","AttrBitOffset":"c","AttrBitSize":"c","AttrByteSize":"c","AttrCallAllCalls":"c","AttrCallAllSourceCalls":"c","AttrCallAllTailCalls":"c","AttrCallColumn":"c","AttrCallDataLocation":"c","AttrCallDataValue":"c","AttrCallFile":"c","AttrCallLine":"c","AttrCallOrigin":"c","AttrCallPC":"c","AttrCallParameter":"c","AttrCallReturnPC":"c","AttrCallTailCall":"c","AttrCallTarget":"c","AttrCallTargetClobbered":"c","AttrCallValue":"c","AttrCalling":"c","AttrCommonRef":"c","AttrCompDir":"c","AttrConstExpr":"c","AttrConstValue":"c","AttrContainingType":"c","AttrCount":"c","AttrDataBitOffset":"c","AttrDataLocation":"c","AttrDataMemberLoc":"c","AttrDecimalScale":"c","AttrDecimalSign":"c","AttrDeclColumn":"c","AttrDeclFile":"c","AttrDeclLine":"c","AttrDeclaration":"c","AttrDefaultValue":"c","AttrDefaulted":"c","AttrDeleted":"c","AttrDescription":"c","AttrDigitCount":"c","AttrDiscr":"c","AttrDiscrList":"c","AttrDiscrValue":"c","AttrDwoName":"c","AttrElemental":"c","AttrEncoding":"c","AttrEndianity":"c","AttrEntrypc":"c","AttrEnumClass":"c","AttrExplicit":"c","AttrExportSymbols":"c","AttrExtension":"c","AttrExternal":"c","AttrFrameBase":"c","AttrFriend":"c","AttrHighpc":"c","AttrIdentifierCase":"c","AttrImport":"c","AttrInline":"c","AttrIsOptional":"c","AttrLanguage":"c","AttrLinkageName":"c","AttrLocation":"c","AttrLoclistsBase":"c","AttrLowerBound":"c","AttrLowpc":"c","AttrMacroInfo":"c","AttrMacros":"c","AttrMainSubprogram":"c","AttrMutable":"c","AttrName":"c","AttrNamelistItem":"c","AttrNoreturn":"c","AttrObjectPointer":"c","AttrOrdering":"c","AttrPictureString":"c","AttrPriority":"c","AttrProducer":"c","AttrPrototyped":"c","AttrPure":"c","AttrRanges":"c","AttrRank":"c","AttrRecursive":"c","AttrReference":"c","AttrReturnAddr":"c","AttrRnglistsBase":"c","AttrRvalueReference":"c","AttrSegment":"c","AttrSibling":"c","AttrSignature":"c","AttrSmall":"c","AttrSpecification":"c","AttrStartScope":"c","AttrStaticLink":"c","AttrStmtList":"c","AttrStrOffsetsBase":"c","AttrStride":"c","AttrStrideSize":"c","AttrStringLength":"c","AttrStringLengthBitSize":"c","AttrStringLengthByteSize":"c","AttrThreadsScaled":"c","AttrTrampoline":"c","AttrType":"c","AttrUpperBound":"c","AttrUseLocation":"c","AttrUseUTF8":"c","AttrVarParam":"c","AttrVirtuality":"c","AttrVisibility":"c","AttrVtableElemLoc":"c","BasicType":"t","BasicType.Basic":"m","BasicType.String":"m","BoolType":"t","CharType":"t","Class":"t","Class.GoString":"m","Class.String":"m","ClassAddrPtr":"c","ClassAddress":"c","ClassBlock":"c","ClassConstant":"c","ClassExprLoc":"c","ClassFlag":"c","ClassLinePtr":"c","ClassLocList":"c","ClassLocListPtr":"c","ClassMacPtr":"c","ClassRangeListPtr":"c","ClassReference":"c","ClassReferenceAlt":"c","ClassReferenceSig":"c","ClassRngList":"c","ClassRngListsPtr":"c","ClassStrOffsetsPtr":"c","ClassString":"c","ClassStringAlt":"c","ClassUnknown":"c","CommonType":"t","CommonType.Common":"m","CommonType.Size":"m","ComplexType":"t","Data":"t","Data.AddSection":"m","Data.AddTypes":"m","Data.LineReader":"m","Data.Ranges":"m","Data.Reader":"m","Data.Type":"m","DecodeError":"t","DecodeError.Error":"m","DotDotDotType":"t","DotDotDotType.String":"m","Entry":"t","Entry.AttrField":"m","Entry.Val":"m","EnumType":"t","EnumType.String":"m","EnumValue":"t","ErrUnknownPC":"v","Field":"t","FloatType":"t","FuncType":"t","FuncType.String":"m","IntType":"t","LineEntry":"t","LineFile":"t","LineReader":"t","LineReader.Files":"m","LineReader.Next":"m","LineReader.Reset":"m","LineReader.Seek":"m","LineReader.SeekPC":"m","LineReader.Tell":"m","LineReaderPos":"t","New":"f","Offset":"t","PtrType":"t","PtrType.String":"m","QualType":"t","QualType.Size":"m","QualType.String":"m","Reader":"t","Reader.AddressSize":"m","Reader.ByteOrder":"m","Reader.Next":"m","Reader.Seek":"m","Reader.SeekPC":"m","Reader.SkipChildren":"m","StructField":"t","StructType":"t","StructType.Defn":"m","StructType.String":"m","Tag":"t","Tag.GoString":"m","Tag.String":"m","TagAccessDeclaration":"c","TagArrayType":"c","TagAtomicType":"c","TagBaseType":"c","TagCallSite":"c","TagCallSiteParameter":"c","TagCatchDwarfBlock":"c","TagClassType":"c","TagCoarrayType":"c","TagCommonDwarfBlock":"c","TagCommonInclusion":"c","TagCompileUnit":"c","TagCondition":"c","TagConstType":"c","TagConstant":"c","TagDwarfProcedure":"c","TagDynamicType":"c","TagEntryPoint":"c","TagEnumerationType":"c","TagEnumerator":"c","TagFileType":"c","TagFormalParameter":"c","TagFriend":"c","TagGenericSubrange":"c","TagImmutableType":"c","TagImportedDeclaration":"c","TagImportedModule":"c","TagImportedUnit":"c","TagInheritance":"c","TagInlinedSubroutine":"c","TagInterfaceType":"c","TagLabel":"c","TagLexDwarfBlock":"c","TagMember":"c","TagModule":"c","TagMutableType":"c","TagNamelist":"c","TagNamelistItem":"c","TagNamespace":"c","TagPackedType":"c","TagPartialUnit":"c","TagPointerType":"c","TagPtrToMemberType":"c","TagReferenceType":"c","TagRestrictType":"c","TagRvalueReferenceType":"c","TagSetType":"c","TagSharedType":"c","TagSkeletonUnit":"c","TagStringType":"c","TagStructType":"c","TagSubprogram":"c","TagSubrangeType":"c","TagSubroutineType":"c","TagTemplateAlias":"c","TagTemplateTypeParameter":"c","TagTemplateValueParameter":"c","TagThrownType":"c","TagTryDwarfBlock":"c","TagTypeUnit":"c","TagTypedef":"c","TagUnionType":"c","TagUnspecifiedParameters":"c","TagUnspecifiedType":"c","TagVariable":"c","TagVariant":"c","TagVariantPart":"c","TagVolatileType":"c","TagWithStmt":"c","Type":"t","TypedefType":"t","TypedefType.Size":"m","TypedefType.String":"m","UcharType":"t","UintType":"t","UnspecifiedType":"t","UnsupportedType":"t","UnsupportedType.String":"m","VoidType":"t","VoidType.String":"m"}},"debug/elf":{"path":"debug/elf","name":"elf","symbols":{"ARM_MAGIC_TRAMP_NUMBER":"c","COMPRESS_HIOS":"c","COMPRESS_HIPROC":"c","COMPRESS_LOOS":"c","COMPRESS_LOPROC":"c","COMPRESS_ZLIB":"c","COMPRESS_ZSTD":"c","Chdr32":"t","Chdr64":"t","Class":"t","Class.GoString":"m","Class.String":"m","CompressionType":"t","CompressionType.GoString":"m","CompressionType.String":"m","DF_1_CONFALT":"c","DF_1_DIRECT":"c","DF_1_DISPRELDNE":"c","DF_1_DISPRELPND":"c","DF_1_EDITED":"c","DF_1_ENDFILTEE":"c","DF_1_GLOBAL":"c","DF_1_GLOBAUDIT":"c","DF_1_GROUP":"c","DF_1_IGNMULDEF":"c","DF_1_INITFIRST":"c","DF_1_INTERPOSE":"c","DF_1_KMOD":"c","DF_1_LOADFLTR":"c","DF_1_NOCOMMON":"c","DF_1_NODEFLIB":"c","DF_1_NODELETE":"c","DF_1_NODIRECT":"c","DF_1_NODUMP":"c","DF_1_NOHDR":"c","DF_1_NOKSYMS":"c","DF_1_NOOPEN":"c","DF_1_NORELOC":"c","DF_1_NOW":"c","DF_1_ORIGIN":"c","DF_1_PIE":"c","DF_1_SINGLETON":"c","DF_1_STUB":"c","DF_1_SYMINTPOSE":"c","DF_1_TRANS":"c","DF_1_WEAKFILTER":"c","DF_BIND_NOW":"c","DF_ORIGIN":"c","DF_STATIC_TLS":"c","DF_SYMBOLIC":"c","DF_TEXTREL":"c","DT_ADDRRNGHI":"c","DT_ADDRRNGLO":"c","DT_AUDIT":"c","DT_AUXILIARY":"c","DT_BIND_NOW":"c","DT_CHECKSUM":"c","DT_CONFIG":"c","DT_DEBUG":"c","DT_DEPAUDIT":"c","DT_ENCODING":"c","DT_FEATURE":"c","DT_FILTER":"c","DT_FINI":"c","DT_FINI_ARRAY":"c","DT_FINI_ARRAYSZ":"c","DT_FLAGS":"c","DT_FLAGS_1":"c","DT_GNU_CONFLICT":"c","DT_GNU_CONFLICTSZ":"c","DT_GNU_HASH":"c","DT_GNU_LIBLIST":"c","DT_GNU_LIBLISTSZ":"c","DT_GNU_PRELINKED":"c","DT_HASH":"c","DT_HIOS":"c","DT_HIPROC":"c","DT_INIT":"c","DT_INIT_ARRAY":"c","DT_INIT_ARRAYSZ":"c","DT_JMPREL":"c","DT_LOOS":"c","DT_LOPROC":"c","DT_MIPS_AUX_DYNAMIC":"c","DT_MIPS_BASE_ADDRESS":"c","DT_MIPS_COMPACT_SIZE":"c","DT_MIPS_CONFLICT":"c","DT_MIPS_CONFLICTNO":"c","DT_MIPS_CXX_FLAGS":"c","DT_MIPS_DELTA_CLASS":"c","DT_MIPS_DELTA_CLASSSYM":"c","DT_MIPS_DELTA_CLASSSYM_NO":"c","DT_MIPS_DELTA_CLASS_NO":"c","DT_MIPS_DELTA_INSTANCE":"c","DT_MIPS_DELTA_INSTANCE_NO":"c","DT_MIPS_DELTA_RELOC":"c","DT_MIPS_DELTA_RELOC_NO":"c","DT_MIPS_DELTA_SYM":"c","DT_MIPS_DELTA_SYM_NO":"c","DT_MIPS_DYNSTR_ALIGN":"c","DT_MIPS_FLAGS":"c","DT_MIPS_GOTSYM":"c","DT_MIPS_GP_VALUE":"c","DT_MIPS_HIDDEN_GOTIDX":"c","DT_MIPS_HIPAGENO":"c","DT_MIPS_ICHECKSUM":"c","DT_MIPS_INTERFACE":"c","DT_MIPS_INTERFACE_SIZE":"c","DT_MIPS_IVERSION":"c","DT_MIPS_LIBLIST":"c","DT_MIPS_LIBLISTNO":"c","DT_MIPS_LOCALPAGE_GOTIDX":"c","DT_MIPS_LOCAL_GOTIDX":"c","DT_MIPS_LOCAL_GOTNO":"c","DT_MIPS_MSYM":"c","DT_MIPS_OPTIONS":"c","DT_MIPS_PERF_SUFFIX":"c","DT_MIPS_PIXIE_INIT":"c","DT_MIPS_PLTGOT":"c","DT_MIPS_PROTECTED_GOTIDX":"c","DT_MIPS_RLD_MAP":"c","DT_MIPS_RLD_MAP_REL":"c","DT_MIPS_RLD_TEXT_RESOLVE_ADDR":"c","DT_MIPS_RLD_VERSION":"c","DT_MIPS_RWPLT":"c","DT_MIPS_SYMBOL_LIB":"c","DT_MIPS_SYMTABNO":"c","DT_MIPS_TIME_STAMP":"c","DT_MIPS_UNREFEXTNO":"c","DT_MOVEENT":"c","DT_MOVESZ":"c","DT_MOVETAB":"c","DT_NEEDED":"c","DT_NULL":"c","DT_PLTGOT":"c","DT_PLTPAD":"c","DT_PLTPADSZ":"c","DT_PLTREL":"c","DT_PLTRELSZ":"c","DT_POSFLAG_1":"c","DT_PPC64_GLINK":"c","DT_PPC64_OPD":"c","DT_PPC64_OPDSZ":"c","DT_PPC64_OPT":"c","DT_PPC_GOT":"c","DT_PPC_OPT":"c","DT_PREINIT_ARRAY":"c","DT_PREINIT_ARRAYSZ":"c","DT_REL":"c","DT_RELA":"c","DT_RELACOUNT":"c","DT_RELAENT":"c","DT_RELASZ":"c","DT_RELCOUNT":"c","DT_RELENT":"c","DT_RELSZ":"c","DT_RPATH":"c","DT_RUNPATH":"c","DT_SONAME":"c","DT_SPARC_REGISTER":"c","DT_STRSZ":"c","DT_STRTAB":"c","DT_SYMBOLIC":"c","DT_SYMENT":"c","DT_SYMINENT":"c","DT_SYMINFO":"c","DT_SYMINSZ":"c","DT_SYMTAB":"c","DT_SYMTAB_SHNDX":"c","DT_TEXTREL":"c","DT_TLSDESC_GOT":"c","DT_TLSDESC_PLT":"c","DT_USED":"c","DT_VALRNGHI":"c","DT_VALRNGLO":"c","DT_VERDEF":"c","DT_VERDEFNUM":"c","DT_VERNEED":"c","DT_VERNEEDNUM":"c","DT_VERSYM":"c","Data":"t","Data.GoString":"m","Data.String":"m","Dyn32":"t","Dyn64":"t","DynFlag":"t","DynFlag.GoString":"m","DynFlag.String":"m","DynFlag1":"t","DynFlag1.GoString":"m","DynFlag1.String":"m","DynTag":"t","DynTag.GoString":"m","DynTag.String":"m","DynamicVersion":"t","DynamicVersionDep":"t","DynamicVersionFlag":"t","DynamicVersionNeed":"t","EI_ABIVERSION":"c","EI_CLASS":"c","EI_DATA":"c","EI_NIDENT":"c","EI_OSABI":"c","EI_PAD":"c","EI_VERSION":"c","ELFCLASS32":"c","ELFCLASS64":"c","ELFCLASSNONE":"c","ELFDATA2LSB":"c","ELFDATA2MSB":"c","ELFDATANONE":"c","ELFMAG":"c","ELFOSABI_86OPEN":"c","ELFOSABI_AIX":"c","ELFOSABI_ARM":"c","ELFOSABI_AROS":"c","ELFOSABI_CLOUDABI":"c","ELFOSABI_FENIXOS":"c","ELFOSABI_FREEBSD":"c","ELFOSABI_HPUX":"c","ELFOSABI_HURD":"c","ELFOSABI_IRIX":"c","ELFOSABI_LINUX":"c","ELFOSABI_MODESTO":"c","ELFOSABI_NETBSD":"c","ELFOSABI_NONE":"c","ELFOSABI_NSK":"c","ELFOSABI_OPENBSD":"c","ELFOSABI_OPENVMS":"c","ELFOSABI_SOLARIS":"c","ELFOSABI_STANDALONE":"c","ELFOSABI_TRU64":"c","EM_386":"c","EM_486":"c","EM_56800EX":"c","EM_68HC05":"c","EM_68HC08":"c","EM_68HC11":"c","EM_68HC12":"c","EM_68HC16":"c","EM_68K":"c","EM_78KOR":"c","EM_8051":"c","EM_860":"c","EM_88K":"c","EM_960":"c","EM_AARCH64":"c","EM_ALPHA":"c","EM_ALPHA_STD":"c","EM_ALTERA_NIOS2":"c","EM_AMDGPU":"c","EM_ARC":"c","EM_ARCA":"c","EM_ARC_COMPACT":"c","EM_ARC_COMPACT2":"c","EM_ARM":"c","EM_AVR":"c","EM_AVR32":"c","EM_BA1":"c","EM_BA2":"c","EM_BLACKFIN":"c","EM_BPF":"c","EM_C166":"c","EM_CDP":"c","EM_CE":"c","EM_CLOUDSHIELD":"c","EM_COGE":"c","EM_COLDFIRE":"c","EM_COOL":"c","EM_COREA_1ST":"c","EM_COREA_2ND":"c","EM_CR":"c","EM_CR16":"c","EM_CRAYNV2":"c","EM_CRIS":"c","EM_CRX":"c","EM_CSR_KALIMBA":"c","EM_CUDA":"c","EM_CYPRESS_M8C":"c","EM_D10V":"c","EM_D30V":"c","EM_DSP24":"c","EM_DSPIC30F":"c","EM_DXP":"c","EM_ECOG1":"c","EM_ECOG16":"c","EM_ECOG1X":"c","EM_ECOG2":"c","EM_ETPU":"c","EM_EXCESS":"c","EM_F2MC16":"c","EM_FIREPATH":"c","EM_FR20":"c","EM_FR30":"c","EM_FT32":"c","EM_FX66":"c","EM_H8S":"c","EM_H8_300":"c","EM_H8_300H":"c","EM_H8_500":"c","EM_HUANY":"c","EM_IA_64":"c","EM_INTEL205":"c","EM_INTEL206":"c","EM_INTEL207":"c","EM_INTEL208":"c","EM_INTEL209":"c","EM_IP2K":"c","EM_JAVELIN":"c","EM_K10M":"c","EM_KM32":"c","EM_KMX16":"c","EM_KMX32":"c","EM_KMX8":"c","EM_KVARC":"c","EM_L10M":"c","EM_LANAI":"c","EM_LATTICEMICO32":"c","EM_LOONGARCH":"c","EM_M16C":"c","EM_M32":"c","EM_M32C":"c","EM_M32R":"c","EM_MANIK":"c","EM_MAX":"c","EM_MAXQ30":"c","EM_MCHP_PIC":"c","EM_MCST_ELBRUS":"c","EM_ME16":"c","EM_METAG":"c","EM_MICROBLAZE":"c","EM_MIPS":"c","EM_MIPS_RS3_LE":"c","EM_MIPS_RS4_BE":"c","EM_MIPS_X":"c","EM_MMA":"c","EM_MMDSP_PLUS":"c","EM_MMIX":"c","EM_MN10200":"c","EM_MN10300":"c","EM_MOXIE":"c","EM_MSP430":"c","EM_NCPU":"c","EM_NDR1":"c","EM_NDS32":"c","EM_NONE":"c","EM_NORC":"c","EM_NS32K":"c","EM_OPEN8":"c","EM_OPENRISC":"c","EM_PARISC":"c","EM_PCP":"c","EM_PDP10":"c","EM_PDP11":"c","EM_PDSP":"c","EM_PJ":"c","EM_PPC":"c","EM_PPC64":"c","EM_PRISM":"c","EM_QDSP6":"c","EM_R32C":"c","EM_RCE":"c","EM_RH32":"c","EM_RISCV":"c","EM_RL78":"c","EM_RS08":"c","EM_RX":"c","EM_S370":"c","EM_S390":"c","EM_SCORE7":"c","EM_SEP":"c","EM_SE_C17":"c","EM_SE_C33":"c","EM_SH":"c","EM_SHARC":"c","EM_SLE9X":"c","EM_SNP1K":"c","EM_SPARC":"c","EM_SPARC32PLUS":"c","EM_SPARCV9":"c","EM_ST100":"c","EM_ST19":"c","EM_ST200":"c","EM_ST7":"c","EM_ST9PLUS":"c","EM_STARCORE":"c","EM_STM8":"c","EM_STXP7X":"c","EM_SVX":"c","EM_TILE64":"c","EM_TILEGX":"c","EM_TILEPRO":"c","EM_TINYJ":"c","EM_TI_ARP32":"c","EM_TI_C2000":"c","EM_TI_C5500":"c","EM_TI_C6000":"c","EM_TI_PRU":"c","EM_TMM_GPP":"c","EM_TPC":"c","EM_TRICORE":"c","EM_TRIMEDIA":"c","EM_TSK3000":"c","EM_UNICORE":"c","EM_V800":"c","EM_V850":"c","EM_VAX":"c","EM_VIDEOCORE":"c","EM_VIDEOCORE3":"c","EM_VIDEOCORE5":"c","EM_VISIUM":"c","EM_VPP500":"c","EM_X86_64":"c","EM_XCORE":"c","EM_XGATE":"c","EM_XIMO16":"c","EM_XTENSA":"c","EM_Z80":"c","EM_ZSP":"c","ET_CORE":"c","ET_DYN":"c","ET_EXEC":"c","ET_HIOS":"c","ET_HIPROC":"c","ET_LOOS":"c","ET_LOPROC":"c","ET_NONE":"c","ET_REL":"c","EV_CURRENT":"c","EV_NONE":"c","ErrNoSymbols":"v","File":"t","File.Close":"m","File.DWARF":"m","File.DynString":"m","File.DynValue":"m","File.DynamicSymbols":"m","File.DynamicVersionNeeds":"m","File.DynamicVersions":"m","File.ImportedLibraries":"m","File.ImportedSymbols":"m","File.Section":"m","File.SectionByType":"m","File.Symbols":"m","FileHeader":"t","FormatError":"t","FormatError.Error":"m","Header32":"t","Header64":"t","ImportedSymbol":"t","Machine":"t","Machine.GoString":"m","Machine.String":"m","NT_FPREGSET":"c","NT_PRPSINFO":"c","NT_PRSTATUS":"c","NType":"t","NType.GoString":"m","NType.String":"m","NewFile":"f","OSABI":"t","OSABI.GoString":"m","OSABI.String":"m","Open":"f","PF_MASKOS":"c","PF_MASKPROC":"c","PF_R":"c","PF_W":"c","PF_X":"c","PT_AARCH64_ARCHEXT":"c","PT_AARCH64_UNWIND":"c","PT_ARM_ARCHEXT":"c","PT_ARM_EXIDX":"c","PT_DYNAMIC":"c","PT_GNU_EH_FRAME":"c","PT_GNU_MBIND_HI":"c","PT_GNU_MBIND_LO":"c","PT_GNU_PROPERTY":"c","PT_GNU_RELRO":"c","PT_GNU_STACK":"c","PT_HIOS":"c","PT_HIPROC":"c","PT_INTERP":"c","PT_LOAD":"c","PT_LOOS":"c","PT_LOPROC":"c","PT_MIPS_ABIFLAGS":"c","PT_MIPS_OPTIONS":"c","PT_MIPS_REGINFO":"c","PT_MIPS_RTPROC":"c","PT_NOTE":"c","PT_NULL":"c","PT_OPENBSD_BOOTDATA":"c","PT_OPENBSD_NOBTCFI":"c","PT_OPENBSD_RANDOMIZE":"c","PT_OPENBSD_WXNEEDED":"c","PT_PAX_FLAGS":"c","PT_PHDR":"c","PT_RISCV_ATTRIBUTES":"c","PT_S390_PGSTE":"c","PT_SHLIB":"c","PT_SUNWSTACK":"c","PT_SUNW_EH_FRAME":"c","PT_TLS":"c","Prog":"t","Prog.Open":"m","Prog32":"t","Prog64":"t","ProgFlag":"t","ProgFlag.GoString":"m","ProgFlag.String":"m","ProgHeader":"t","ProgType":"t","ProgType.GoString":"m","ProgType.String":"m","R_386":"t","R_386.GoString":"m","R_386.String":"m","R_386_16":"c","R_386_32":"c","R_386_32PLT":"c","R_386_8":"c","R_386_COPY":"c","R_386_GLOB_DAT":"c","R_386_GOT32":"c","R_386_GOT32X":"c","R_386_GOTOFF":"c","R_386_GOTPC":"c","R_386_IRELATIVE":"c","R_386_JMP_SLOT":"c","R_386_NONE":"c","R_386_PC16":"c","R_386_PC32":"c","R_386_PC8":"c","R_386_PLT32":"c","R_386_RELATIVE":"c","R_386_SIZE32":"c","R_386_TLS_DESC":"c","R_386_TLS_DESC_CALL":"c","R_386_TLS_DTPMOD32":"c","R_386_TLS_DTPOFF32":"c","R_386_TLS_GD":"c","R_386_TLS_GD_32":"c","R_386_TLS_GD_CALL":"c","R_386_TLS_GD_POP":"c","R_386_TLS_GD_PUSH":"c","R_386_TLS_GOTDESC":"c","R_386_TLS_GOTIE":"c","R_386_TLS_IE":"c","R_386_TLS_IE_32":"c","R_386_TLS_LDM":"c","R_386_TLS_LDM_32":"c","R_386_TLS_LDM_CALL":"c","R_386_TLS_LDM_POP":"c","R_386_TLS_LDM_PUSH":"c","R_386_TLS_LDO_32":"c","R_386_TLS_LE":"c","R_386_TLS_LE_32":"c","R_386_TLS_TPOFF":"c","R_386_TLS_TPOFF32":"c","R_390":"t","R_390.GoString":"m","R_390.String":"m","R_390_12":"c","R_390_16":"c","R_390_20":"c","R_390_32":"c","R_390_64":"c","R_390_8":"c","R_390_COPY":"c","R_390_GLOB_DAT":"c","R_390_GOT12":"c","R_390_GOT16":"c","R_390_GOT20":"c","R_390_GOT32":"c","R_390_GOT64":"c","R_390_GOTENT":"c","R_390_GOTOFF":"c","R_390_GOTOFF16":"c","R_390_GOTOFF64":"c","R_390_GOTPC":"c","R_390_GOTPCDBL":"c","R_390_GOTPLT12":"c","R_390_GOTPLT16":"c","R_390_GOTPLT20":"c","R_390_GOTPLT32":"c","R_390_GOTPLT64":"c","R_390_GOTPLTENT":"c","R_390_GOTPLTOFF16":"c","R_390_GOTPLTOFF32":"c","R_390_GOTPLTOFF64":"c","R_390_JMP_SLOT":"c","R_390_NONE":"c","R_390_PC16":"c","R_390_PC16DBL":"c","R_390_PC32":"c","R_390_PC32DBL":"c","R_390_PC64":"c","R_390_PLT16DBL":"c","R_390_PLT32":"c","R_390_PLT32DBL":"c","R_390_PLT64":"c","R_390_RELATIVE":"c","R_390_TLS_DTPMOD":"c","R_390_TLS_DTPOFF":"c","R_390_TLS_GD32":"c","R_390_TLS_GD64":"c","R_390_TLS_GDCALL":"c","R_390_TLS_GOTIE12":"c","R_390_TLS_GOTIE20":"c","R_390_TLS_GOTIE32":"c","R_390_TLS_GOTIE64":"c","R_390_TLS_IE32":"c","R_390_TLS_IE64":"c","R_390_TLS_IEENT":"c","R_390_TLS_LDCALL":"c","R_390_TLS_LDM32":"c","R_390_TLS_LDM64":"c","R_390_TLS_LDO32":"c","R_390_TLS_LDO64":"c","R_390_TLS_LE32":"c","R_390_TLS_LE64":"c","R_390_TLS_LOAD":"c","R_390_TLS_TPOFF":"c","R_AARCH64":"t","R_AARCH64.GoString":"m","R_AARCH64.String":"m","R_AARCH64_ABS16":"c","R_AARCH64_ABS32":"c","R_AARCH64_ABS64":"c","R_AARCH64_ADD_ABS_LO12_NC":"c","R_AARCH64_ADR_GOT_PAGE":"c","R_AARCH64_ADR_PREL_LO21":"c","R_AARCH64_ADR_PREL_PG_HI21":"c","R_AARCH64_ADR_PREL_PG_HI21_NC":"c","R_AARCH64_CALL26":"c","R_AARCH64_CONDBR19":"c","R_AARCH64_COPY":"c","R_AARCH64_GLOB_DAT":"c","R_AARCH64_GOT_LD_PREL19":"c","R_AARCH64_IRELATIVE":"c","R_AARCH64_JUMP26":"c","R_AARCH64_JUMP_SLOT":"c","R_AARCH64_LD64_GOTOFF_LO15":"c","R_AARCH64_LD64_GOTPAGE_LO15":"c","R_AARCH64_LD64_GOT_LO12_NC":"c","R_AARCH64_LDST128_ABS_LO12_NC":"c","R_AARCH64_LDST16_ABS_LO12_NC":"c","R_AARCH64_LDST32_ABS_LO12_NC":"c","R_AARCH64_LDST64_ABS_LO12_NC":"c","R_AARCH64_LDST8_ABS_LO12_NC":"c","R_AARCH64_LD_PREL_LO19":"c","R_AARCH64_MOVW_SABS_G0":"c","R_AARCH64_MOVW_SABS_G1":"c","R_AARCH64_MOVW_SABS_G2":"c","R_AARCH64_MOVW_UABS_G0":"c","R_AARCH64_MOVW_UABS_G0_NC":"c","R_AARCH64_MOVW_UABS_G1":"c","R_AARCH64_MOVW_UABS_G1_NC":"c","R_AARCH64_MOVW_UABS_G2":"c","R_AARCH64_MOVW_UABS_G2_NC":"c","R_AARCH64_MOVW_UABS_G3":"c","R_AARCH64_NONE":"c","R_AARCH64_NULL":"c","R_AARCH64_P32_ABS16":"c","R_AARCH64_P32_ABS32":"c","R_AARCH64_P32_ADD_ABS_LO12_NC":"c","R_AARCH64_P32_ADR_GOT_PAGE":"c","R_AARCH64_P32_ADR_PREL_LO21":"c","R_AARCH64_P32_ADR_PREL_PG_HI21":"c","R_AARCH64_P32_CALL26":"c","R_AARCH64_P32_CONDBR19":"c","R_AARCH64_P32_COPY":"c","R_AARCH64_P32_GLOB_DAT":"c","R_AARCH64_P32_GOT_LD_PREL19":"c","R_AARCH64_P32_IRELATIVE":"c","R_AARCH64_P32_JUMP26":"c","R_AARCH64_P32_JUMP_SLOT":"c","R_AARCH64_P32_LD32_GOT_LO12_NC":"c","R_AARCH64_P32_LDST128_ABS_LO12_NC":"c","R_AARCH64_P32_LDST16_ABS_LO12_NC":"c","R_AARCH64_P32_LDST32_ABS_LO12_NC":"c","R_AARCH64_P32_LDST64_ABS_LO12_NC":"c","R_AARCH64_P32_LDST8_ABS_LO12_NC":"c","R_AARCH64_P32_LD_PREL_LO19":"c","R_AARCH64_P32_MOVW_SABS_G0":"c","R_AARCH64_P32_MOVW_UABS_G0":"c","R_AARCH64_P32_MOVW_UABS_G0_NC":"c","R_AARCH64_P32_MOVW_UABS_G1":"c","R_AARCH64_P32_PREL16":"c","R_AARCH64_P32_PREL32":"c","R_AARCH64_P32_RELATIVE":"c","R_AARCH64_P32_TLSDESC":"c","R_AARCH64_P32_TLSDESC_ADD_LO12_NC":"c","R_AARCH64_P32_TLSDESC_ADR_PAGE21":"c","R_AARCH64_P32_TLSDESC_ADR_PREL21":"c","R_AARCH64_P32_TLSDESC_CALL":"c","R_AARCH64_P32_TLSDESC_LD32_LO12_NC":"c","R_AARCH64_P32_TLSDESC_LD_PREL19":"c","R_AARCH64_P32_TLSGD_ADD_LO12_NC":"c","R_AARCH64_P32_TLSGD_ADR_PAGE21":"c","R_AARCH64_P32_TLSIE_ADR_GOTTPREL_PAGE21":"c","R_AARCH64_P32_TLSIE_LD32_GOTTPREL_LO12_NC":"c","R_AARCH64_P32_TLSIE_LD_GOTTPREL_PREL19":"c","R_AARCH64_P32_TLSLE_ADD_TPREL_HI12":"c","R_AARCH64_P32_TLSLE_ADD_TPREL_LO12":"c","R_AARCH64_P32_TLSLE_ADD_TPREL_LO12_NC":"c","R_AARCH64_P32_TLSLE_MOVW_TPREL_G0":"c","R_AARCH64_P32_TLSLE_MOVW_TPREL_G0_NC":"c","R_AARCH64_P32_TLSLE_MOVW_TPREL_G1":"c","R_AARCH64_P32_TLS_DTPMOD":"c","R_AARCH64_P32_TLS_DTPREL":"c","R_AARCH64_P32_TLS_TPREL":"c","R_AARCH64_P32_TSTBR14":"c","R_AARCH64_PREL16":"c","R_AARCH64_PREL32":"c","R_AARCH64_PREL64":"c","R_AARCH64_RELATIVE":"c","R_AARCH64_TLSDESC":"c","R_AARCH64_TLSDESC_ADD":"c","R_AARCH64_TLSDESC_ADD_LO12_NC":"c","R_AARCH64_TLSDESC_ADR_PAGE21":"c","R_AARCH64_TLSDESC_ADR_PREL21":"c","R_AARCH64_TLSDESC_CALL":"c","R_AARCH64_TLSDESC_LD64_LO12_NC":"c","R_AARCH64_TLSDESC_LDR":"c","R_AARCH64_TLSDESC_LD_PREL19":"c","R_AARCH64_TLSDESC_OFF_G0_NC":"c","R_AARCH64_TLSDESC_OFF_G1":"c","R_AARCH64_TLSGD_ADD_LO12_NC":"c","R_AARCH64_TLSGD_ADR_PAGE21":"c","R_AARCH64_TLSGD_ADR_PREL21":"c","R_AARCH64_TLSGD_MOVW_G0_NC":"c","R_AARCH64_TLSGD_MOVW_G1":"c","R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21":"c","R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC":"c","R_AARCH64_TLSIE_LD_GOTTPREL_PREL19":"c","R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC":"c","R_AARCH64_TLSIE_MOVW_GOTTPREL_G1":"c","R_AARCH64_TLSLD_ADR_PAGE21":"c","R_AARCH64_TLSLD_ADR_PREL21":"c","R_AARCH64_TLSLD_LDST128_DTPREL_LO12":"c","R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC":"c","R_AARCH64_TLSLE_ADD_TPREL_HI12":"c","R_AARCH64_TLSLE_ADD_TPREL_LO12":"c","R_AARCH64_TLSLE_ADD_TPREL_LO12_NC":"c","R_AARCH64_TLSLE_LDST128_TPREL_LO12":"c","R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC":"c","R_AARCH64_TLSLE_MOVW_TPREL_G0":"c","R_AARCH64_TLSLE_MOVW_TPREL_G0_NC":"c","R_AARCH64_TLSLE_MOVW_TPREL_G1":"c","R_AARCH64_TLSLE_MOVW_TPREL_G1_NC":"c","R_AARCH64_TLSLE_MOVW_TPREL_G2":"c","R_AARCH64_TLS_DTPMOD64":"c","R_AARCH64_TLS_DTPREL64":"c","R_AARCH64_TLS_TPREL64":"c","R_AARCH64_TSTBR14":"c","R_ALPHA":"t","R_ALPHA.GoString":"m","R_ALPHA.String":"m","R_ALPHA_BRADDR":"c","R_ALPHA_COPY":"c","R_ALPHA_GLOB_DAT":"c","R_ALPHA_GPDISP":"c","R_ALPHA_GPREL32":"c","R_ALPHA_GPRELHIGH":"c","R_ALPHA_GPRELLOW":"c","R_ALPHA_GPVALUE":"c","R_ALPHA_HINT":"c","R_ALPHA_IMMED_BR_HI32":"c","R_ALPHA_IMMED_GP_16":"c","R_ALPHA_IMMED_GP_HI32":"c","R_ALPHA_IMMED_LO32":"c","R_ALPHA_IMMED_SCN_HI32":"c","R_ALPHA_JMP_SLOT":"c","R_ALPHA_LITERAL":"c","R_ALPHA_LITUSE":"c","R_ALPHA_NONE":"c","R_ALPHA_OP_PRSHIFT":"c","R_ALPHA_OP_PSUB":"c","R_ALPHA_OP_PUSH":"c","R_ALPHA_OP_STORE":"c","R_ALPHA_REFLONG":"c","R_ALPHA_REFQUAD":"c","R_ALPHA_RELATIVE":"c","R_ALPHA_SREL16":"c","R_ALPHA_SREL32":"c","R_ALPHA_SREL64":"c","R_ARM":"t","R_ARM.GoString":"m","R_ARM.String":"m","R_ARM_ABS12":"c","R_ARM_ABS16":"c","R_ARM_ABS32":"c","R_ARM_ABS32_NOI":"c","R_ARM_ABS8":"c","R_ARM_ALU_PCREL_15_8":"c","R_ARM_ALU_PCREL_23_15":"c","R_ARM_ALU_PCREL_7_0":"c","R_ARM_ALU_PC_G0":"c","R_ARM_ALU_PC_G0_NC":"c","R_ARM_ALU_PC_G1":"c","R_ARM_ALU_PC_G1_NC":"c","R_ARM_ALU_PC_G2":"c","R_ARM_ALU_SBREL_19_12_NC":"c","R_ARM_ALU_SBREL_27_20_CK":"c","R_ARM_ALU_SB_G0":"c","R_ARM_ALU_SB_G0_NC":"c","R_ARM_ALU_SB_G1":"c","R_ARM_ALU_SB_G1_NC":"c","R_ARM_ALU_SB_G2":"c","R_ARM_AMP_VCALL9":"c","R_ARM_BASE_ABS":"c","R_ARM_CALL":"c","R_ARM_COPY":"c","R_ARM_GLOB_DAT":"c","R_ARM_GNU_VTENTRY":"c","R_ARM_GNU_VTINHERIT":"c","R_ARM_GOT32":"c","R_ARM_GOTOFF":"c","R_ARM_GOTOFF12":"c","R_ARM_GOTPC":"c","R_ARM_GOTRELAX":"c","R_ARM_GOT_ABS":"c","R_ARM_GOT_BREL12":"c","R_ARM_GOT_PREL":"c","R_ARM_IRELATIVE":"c","R_ARM_JUMP24":"c","R_ARM_JUMP_SLOT":"c","R_ARM_LDC_PC_G0":"c","R_ARM_LDC_PC_G1":"c","R_ARM_LDC_PC_G2":"c","R_ARM_LDC_SB_G0":"c","R_ARM_LDC_SB_G1":"c","R_ARM_LDC_SB_G2":"c","R_ARM_LDRS_PC_G0":"c","R_ARM_LDRS_PC_G1":"c","R_ARM_LDRS_PC_G2":"c","R_ARM_LDRS_SB_G0":"c","R_ARM_LDRS_SB_G1":"c","R_ARM_LDRS_SB_G2":"c","R_ARM_LDR_PC_G1":"c","R_ARM_LDR_PC_G2":"c","R_ARM_LDR_SBREL_11_10_NC":"c","R_ARM_LDR_SB_G0":"c","R_ARM_LDR_SB_G1":"c","R_ARM_LDR_SB_G2":"c","R_ARM_ME_TOO":"c","R_ARM_MOVT_ABS":"c","R_ARM_MOVT_BREL":"c","R_ARM_MOVT_PREL":"c","R_ARM_MOVW_ABS_NC":"c","R_ARM_MOVW_BREL":"c","R_ARM_MOVW_BREL_NC":"c","R_ARM_MOVW_PREL_NC":"c","R_ARM_NONE":"c","R_ARM_PC13":"c","R_ARM_PC24":"c","R_ARM_PLT32":"c","R_ARM_PLT32_ABS":"c","R_ARM_PREL31":"c","R_ARM_PRIVATE_0":"c","R_ARM_PRIVATE_1":"c","R_ARM_PRIVATE_10":"c","R_ARM_PRIVATE_11":"c","R_ARM_PRIVATE_12":"c","R_ARM_PRIVATE_13":"c","R_ARM_PRIVATE_14":"c","R_ARM_PRIVATE_15":"c","R_ARM_PRIVATE_2":"c","R_ARM_PRIVATE_3":"c","R_ARM_PRIVATE_4":"c","R_ARM_PRIVATE_5":"c","R_ARM_PRIVATE_6":"c","R_ARM_PRIVATE_7":"c","R_ARM_PRIVATE_8":"c","R_ARM_PRIVATE_9":"c","R_ARM_RABS32":"c","R_ARM_RBASE":"c","R_ARM_REL32":"c","R_ARM_REL32_NOI":"c","R_ARM_RELATIVE":"c","R_ARM_RPC24":"c","R_ARM_RREL32":"c","R_ARM_RSBREL32":"c","R_ARM_RXPC25":"c","R_ARM_SBREL31":"c","R_ARM_SBREL32":"c","R_ARM_SWI24":"c","R_ARM_TARGET1":"c","R_ARM_TARGET2":"c","R_ARM_THM_ABS5":"c","R_ARM_THM_ALU_ABS_G0_NC":"c","R_ARM_THM_ALU_ABS_G1_NC":"c","R_ARM_THM_ALU_ABS_G2_NC":"c","R_ARM_THM_ALU_ABS_G3":"c","R_ARM_THM_ALU_PREL_11_0":"c","R_ARM_THM_GOT_BREL12":"c","R_ARM_THM_JUMP11":"c","R_ARM_THM_JUMP19":"c","R_ARM_THM_JUMP24":"c","R_ARM_THM_JUMP6":"c","R_ARM_THM_JUMP8":"c","R_ARM_THM_MOVT_ABS":"c","R_ARM_THM_MOVT_BREL":"c","R_ARM_THM_MOVT_PREL":"c","R_ARM_THM_MOVW_ABS_NC":"c","R_ARM_THM_MOVW_BREL":"c","R_ARM_THM_MOVW_BREL_NC":"c","R_ARM_THM_MOVW_PREL_NC":"c","R_ARM_THM_PC12":"c","R_ARM_THM_PC22":"c","R_ARM_THM_PC8":"c","R_ARM_THM_RPC22":"c","R_ARM_THM_SWI8":"c","R_ARM_THM_TLS_CALL":"c","R_ARM_THM_TLS_DESCSEQ16":"c","R_ARM_THM_TLS_DESCSEQ32":"c","R_ARM_THM_XPC22":"c","R_ARM_TLS_CALL":"c","R_ARM_TLS_DESCSEQ":"c","R_ARM_TLS_DTPMOD32":"c","R_ARM_TLS_DTPOFF32":"c","R_ARM_TLS_GD32":"c","R_ARM_TLS_GOTDESC":"c","R_ARM_TLS_IE12GP":"c","R_ARM_TLS_IE32":"c","R_ARM_TLS_LDM32":"c","R_ARM_TLS_LDO12":"c","R_ARM_TLS_LDO32":"c","R_ARM_TLS_LE12":"c","R_ARM_TLS_LE32":"c","R_ARM_TLS_TPOFF32":"c","R_ARM_V4BX":"c","R_ARM_XPC25":"c","R_INFO":"f","R_INFO32":"f","R_LARCH":"t","R_LARCH.GoString":"m","R_LARCH.String":"m","R_LARCH_32":"c","R_LARCH_32_PCREL":"c","R_LARCH_64":"c","R_LARCH_64_PCREL":"c","R_LARCH_ABS64_HI12":"c","R_LARCH_ABS64_LO20":"c","R_LARCH_ABS_HI20":"c","R_LARCH_ABS_LO12":"c","R_LARCH_ADD16":"c","R_LARCH_ADD24":"c","R_LARCH_ADD32":"c","R_LARCH_ADD6":"c","R_LARCH_ADD64":"c","R_LARCH_ADD8":"c","R_LARCH_ADD_ULEB128":"c","R_LARCH_ALIGN":"c","R_LARCH_B16":"c","R_LARCH_B21":"c","R_LARCH_B26":"c","R_LARCH_CALL36":"c","R_LARCH_CFA":"c","R_LARCH_COPY":"c","R_LARCH_DELETE":"c","R_LARCH_GNU_VTENTRY":"c","R_LARCH_GNU_VTINHERIT":"c","R_LARCH_GOT64_HI12":"c","R_LARCH_GOT64_LO20":"c","R_LARCH_GOT64_PC_HI12":"c","R_LARCH_GOT64_PC_LO20":"c","R_LARCH_GOT_HI20":"c","R_LARCH_GOT_LO12":"c","R_LARCH_GOT_PC_HI20":"c","R_LARCH_GOT_PC_LO12":"c","R_LARCH_IRELATIVE":"c","R_LARCH_JUMP_SLOT":"c","R_LARCH_MARK_LA":"c","R_LARCH_MARK_PCREL":"c","R_LARCH_NONE":"c","R_LARCH_PCALA64_HI12":"c","R_LARCH_PCALA64_LO20":"c","R_LARCH_PCALA_HI20":"c","R_LARCH_PCALA_LO12":"c","R_LARCH_PCREL20_S2":"c","R_LARCH_RELATIVE":"c","R_LARCH_RELAX":"c","R_LARCH_SOP_ADD":"c","R_LARCH_SOP_AND":"c","R_LARCH_SOP_ASSERT":"c","R_LARCH_SOP_IF_ELSE":"c","R_LARCH_SOP_NOT":"c","R_LARCH_SOP_POP_32_S_0_10_10_16_S2":"c","R_LARCH_SOP_POP_32_S_0_5_10_16_S2":"c","R_LARCH_SOP_POP_32_S_10_12":"c","R_LARCH_SOP_POP_32_S_10_16":"c","R_LARCH_SOP_POP_32_S_10_16_S2":"c","R_LARCH_SOP_POP_32_S_10_5":"c","R_LARCH_SOP_POP_32_S_5_20":"c","R_LARCH_SOP_POP_32_U":"c","R_LARCH_SOP_POP_32_U_10_12":"c","R_LARCH_SOP_PUSH_ABSOLUTE":"c","R_LARCH_SOP_PUSH_DUP":"c","R_LARCH_SOP_PUSH_GPREL":"c","R_LARCH_SOP_PUSH_PCREL":"c","R_LARCH_SOP_PUSH_PLT_PCREL":"c","R_LARCH_SOP_PUSH_TLS_GD":"c","R_LARCH_SOP_PUSH_TLS_GOT":"c","R_LARCH_SOP_PUSH_TLS_TPREL":"c","R_LARCH_SOP_SL":"c","R_LARCH_SOP_SR":"c","R_LARCH_SOP_SUB":"c","R_LARCH_SUB16":"c","R_LARCH_SUB24":"c","R_LARCH_SUB32":"c","R_LARCH_SUB6":"c","R_LARCH_SUB64":"c","R_LARCH_SUB8":"c","R_LARCH_SUB_ULEB128":"c","R_LARCH_TLS_DESC32":"c","R_LARCH_TLS_DESC64":"c","R_LARCH_TLS_DESC64_HI12":"c","R_LARCH_TLS_DESC64_LO20":"c","R_LARCH_TLS_DESC64_PC_HI12":"c","R_LARCH_TLS_DESC64_PC_LO20":"c","R_LARCH_TLS_DESC_CALL":"c","R_LARCH_TLS_DESC_HI20":"c","R_LARCH_TLS_DESC_LD":"c","R_LARCH_TLS_DESC_LO12":"c","R_LARCH_TLS_DESC_PCREL20_S2":"c","R_LARCH_TLS_DESC_PC_HI20":"c","R_LARCH_TLS_DESC_PC_LO12":"c","R_LARCH_TLS_DTPMOD32":"c","R_LARCH_TLS_DTPMOD64":"c","R_LARCH_TLS_DTPREL32":"c","R_LARCH_TLS_DTPREL64":"c","R_LARCH_TLS_GD_HI20":"c","R_LARCH_TLS_GD_PCREL20_S2":"c","R_LARCH_TLS_GD_PC_HI20":"c","R_LARCH_TLS_IE64_HI12":"c","R_LARCH_TLS_IE64_LO20":"c","R_LARCH_TLS_IE64_PC_HI12":"c","R_LARCH_TLS_IE64_PC_LO20":"c","R_LARCH_TLS_IE_HI20":"c","R_LARCH_TLS_IE_LO12":"c","R_LARCH_TLS_IE_PC_HI20":"c","R_LARCH_TLS_IE_PC_LO12":"c","R_LARCH_TLS_LD_HI20":"c","R_LARCH_TLS_LD_PCREL20_S2":"c","R_LARCH_TLS_LD_PC_HI20":"c","R_LARCH_TLS_LE64_HI12":"c","R_LARCH_TLS_LE64_LO20":"c","R_LARCH_TLS_LE_ADD_R":"c","R_LARCH_TLS_LE_HI20":"c","R_LARCH_TLS_LE_HI20_R":"c","R_LARCH_TLS_LE_LO12":"c","R_LARCH_TLS_LE_LO12_R":"c","R_LARCH_TLS_TPREL32":"c","R_LARCH_TLS_TPREL64":"c","R_MIPS":"t","R_MIPS.GoString":"m","R_MIPS.String":"m","R_MIPS_16":"c","R_MIPS_26":"c","R_MIPS_32":"c","R_MIPS_64":"c","R_MIPS_ADD_IMMEDIATE":"c","R_MIPS_CALL16":"c","R_MIPS_CALL_HI16":"c","R_MIPS_CALL_LO16":"c","R_MIPS_DELETE":"c","R_MIPS_GOT16":"c","R_MIPS_GOT_DISP":"c","R_MIPS_GOT_HI16":"c","R_MIPS_GOT_LO16":"c","R_MIPS_GOT_OFST":"c","R_MIPS_GOT_PAGE":"c","R_MIPS_GPREL16":"c","R_MIPS_GPREL32":"c","R_MIPS_HI16":"c","R_MIPS_HIGHER":"c","R_MIPS_HIGHEST":"c","R_MIPS_INSERT_A":"c","R_MIPS_INSERT_B":"c","R_MIPS_JALR":"c","R_MIPS_LITERAL":"c","R_MIPS_LO16":"c","R_MIPS_NONE":"c","R_MIPS_PC16":"c","R_MIPS_PC32":"c","R_MIPS_PJUMP":"c","R_MIPS_REL16":"c","R_MIPS_REL32":"c","R_MIPS_RELGOT":"c","R_MIPS_SCN_DISP":"c","R_MIPS_SHIFT5":"c","R_MIPS_SHIFT6":"c","R_MIPS_SUB":"c","R_MIPS_TLS_DTPMOD32":"c","R_MIPS_TLS_DTPMOD64":"c","R_MIPS_TLS_DTPREL32":"c","R_MIPS_TLS_DTPREL64":"c","R_MIPS_TLS_DTPREL_HI16":"c","R_MIPS_TLS_DTPREL_LO16":"c","R_MIPS_TLS_GD":"c","R_MIPS_TLS_GOTTPREL":"c","R_MIPS_TLS_LDM":"c","R_MIPS_TLS_TPREL32":"c","R_MIPS_TLS_TPREL64":"c","R_MIPS_TLS_TPREL_HI16":"c","R_MIPS_TLS_TPREL_LO16":"c","R_PPC":"t","R_PPC.GoString":"m","R_PPC.String":"m","R_PPC64":"t","R_PPC64.GoString":"m","R_PPC64.String":"m","R_PPC64_ADDR14":"c","R_PPC64_ADDR14_BRNTAKEN":"c","R_PPC64_ADDR14_BRTAKEN":"c","R_PPC64_ADDR16":"c","R_PPC64_ADDR16_DS":"c","R_PPC64_ADDR16_HA":"c","R_PPC64_ADDR16_HI":"c","R_PPC64_ADDR16_HIGH":"c","R_PPC64_ADDR16_HIGHA":"c","R_PPC64_ADDR16_HIGHER":"c","R_PPC64_ADDR16_HIGHER34":"c","R_PPC64_ADDR16_HIGHERA":"c","R_PPC64_ADDR16_HIGHERA34":"c","R_PPC64_ADDR16_HIGHEST":"c","R_PPC64_ADDR16_HIGHEST34":"c","R_PPC64_ADDR16_HIGHESTA":"c","R_PPC64_ADDR16_HIGHESTA34":"c","R_PPC64_ADDR16_LO":"c","R_PPC64_ADDR16_LO_DS":"c","R_PPC64_ADDR24":"c","R_PPC64_ADDR32":"c","R_PPC64_ADDR64":"c","R_PPC64_ADDR64_LOCAL":"c","R_PPC64_COPY":"c","R_PPC64_D28":"c","R_PPC64_D34":"c","R_PPC64_D34_HA30":"c","R_PPC64_D34_HI30":"c","R_PPC64_D34_LO":"c","R_PPC64_DTPMOD64":"c","R_PPC64_DTPREL16":"c","R_PPC64_DTPREL16_DS":"c","R_PPC64_DTPREL16_HA":"c","R_PPC64_DTPREL16_HI":"c","R_PPC64_DTPREL16_HIGH":"c","R_PPC64_DTPREL16_HIGHA":"c","R_PPC64_DTPREL16_HIGHER":"c","R_PPC64_DTPREL16_HIGHERA":"c","R_PPC64_DTPREL16_HIGHEST":"c","R_PPC64_DTPREL16_HIGHESTA":"c","R_PPC64_DTPREL16_LO":"c","R_PPC64_DTPREL16_LO_DS":"c","R_PPC64_DTPREL34":"c","R_PPC64_DTPREL64":"c","R_PPC64_ENTRY":"c","R_PPC64_GLOB_DAT":"c","R_PPC64_GNU_VTENTRY":"c","R_PPC64_GNU_VTINHERIT":"c","R_PPC64_GOT16":"c","R_PPC64_GOT16_DS":"c","R_PPC64_GOT16_HA":"c","R_PPC64_GOT16_HI":"c","R_PPC64_GOT16_LO":"c","R_PPC64_GOT16_LO_DS":"c","R_PPC64_GOT_DTPREL16_DS":"c","R_PPC64_GOT_DTPREL16_HA":"c","R_PPC64_GOT_DTPREL16_HI":"c","R_PPC64_GOT_DTPREL16_LO_DS":"c","R_PPC64_GOT_DTPREL_PCREL34":"c","R_PPC64_GOT_PCREL34":"c","R_PPC64_GOT_TLSGD16":"c","R_PPC64_GOT_TLSGD16_HA":"c","R_PPC64_GOT_TLSGD16_HI":"c","R_PPC64_GOT_TLSGD16_LO":"c","R_PPC64_GOT_TLSGD_PCREL34":"c","R_PPC64_GOT_TLSLD16":"c","R_PPC64_GOT_TLSLD16_HA":"c","R_PPC64_GOT_TLSLD16_HI":"c","R_PPC64_GOT_TLSLD16_LO":"c","R_PPC64_GOT_TLSLD_PCREL34":"c","R_PPC64_GOT_TPREL16_DS":"c","R_PPC64_GOT_TPREL16_HA":"c","R_PPC64_GOT_TPREL16_HI":"c","R_PPC64_GOT_TPREL16_LO_DS":"c","R_PPC64_GOT_TPREL_PCREL34":"c","R_PPC64_IRELATIVE":"c","R_PPC64_JMP_IREL":"c","R_PPC64_JMP_SLOT":"c","R_PPC64_NONE":"c","R_PPC64_PCREL28":"c","R_PPC64_PCREL34":"c","R_PPC64_PCREL_OPT":"c","R_PPC64_PLT16_HA":"c","R_PPC64_PLT16_HI":"c","R_PPC64_PLT16_LO":"c","R_PPC64_PLT16_LO_DS":"c","R_PPC64_PLT32":"c","R_PPC64_PLT64":"c","R_PPC64_PLTCALL":"c","R_PPC64_PLTCALL_NOTOC":"c","R_PPC64_PLTGOT16":"c","R_PPC64_PLTGOT16_DS":"c","R_PPC64_PLTGOT16_HA":"c","R_PPC64_PLTGOT16_HI":"c","R_PPC64_PLTGOT16_LO":"c","R_PPC64_PLTGOT_LO_DS":"c","R_PPC64_PLTREL32":"c","R_PPC64_PLTREL64":"c","R_PPC64_PLTSEQ":"c","R_PPC64_PLTSEQ_NOTOC":"c","R_PPC64_PLT_PCREL34":"c","R_PPC64_PLT_PCREL34_NOTOC":"c","R_PPC64_REL14":"c","R_PPC64_REL14_BRNTAKEN":"c","R_PPC64_REL14_BRTAKEN":"c","R_PPC64_REL16":"c","R_PPC64_REL16DX_HA":"c","R_PPC64_REL16_HA":"c","R_PPC64_REL16_HI":"c","R_PPC64_REL16_HIGH":"c","R_PPC64_REL16_HIGHA":"c","R_PPC64_REL16_HIGHER":"c","R_PPC64_REL16_HIGHER34":"c","R_PPC64_REL16_HIGHERA":"c","R_PPC64_REL16_HIGHERA34":"c","R_PPC64_REL16_HIGHEST":"c","R_PPC64_REL16_HIGHEST34":"c","R_PPC64_REL16_HIGHESTA":"c","R_PPC64_REL16_HIGHESTA34":"c","R_PPC64_REL16_LO":"c","R_PPC64_REL24":"c","R_PPC64_REL24_NOTOC":"c","R_PPC64_REL24_P9NOTOC":"c","R_PPC64_REL30":"c","R_PPC64_REL32":"c","R_PPC64_REL64":"c","R_PPC64_RELATIVE":"c","R_PPC64_SECTOFF":"c","R_PPC64_SECTOFF_DS":"c","R_PPC64_SECTOFF_HA":"c","R_PPC64_SECTOFF_HI":"c","R_PPC64_SECTOFF_LO":"c","R_PPC64_SECTOFF_LO_DS":"c","R_PPC64_TLS":"c","R_PPC64_TLSGD":"c","R_PPC64_TLSLD":"c","R_PPC64_TOC":"c","R_PPC64_TOC16":"c","R_PPC64_TOC16_DS":"c","R_PPC64_TOC16_HA":"c","R_PPC64_TOC16_HI":"c","R_PPC64_TOC16_LO":"c","R_PPC64_TOC16_LO_DS":"c","R_PPC64_TOCSAVE":"c","R_PPC64_TPREL16":"c","R_PPC64_TPREL16_DS":"c","R_PPC64_TPREL16_HA":"c","R_PPC64_TPREL16_HI":"c","R_PPC64_TPREL16_HIGH":"c","R_PPC64_TPREL16_HIGHA":"c","R_PPC64_TPREL16_HIGHER":"c","R_PPC64_TPREL16_HIGHERA":"c","R_PPC64_TPREL16_HIGHEST":"c","R_PPC64_TPREL16_HIGHESTA":"c","R_PPC64_TPREL16_LO":"c","R_PPC64_TPREL16_LO_DS":"c","R_PPC64_TPREL34":"c","R_PPC64_TPREL64":"c","R_PPC64_UADDR16":"c","R_PPC64_UADDR32":"c","R_PPC64_UADDR64":"c","R_PPC_ADDR14":"c","R_PPC_ADDR14_BRNTAKEN":"c","R_PPC_ADDR14_BRTAKEN":"c","R_PPC_ADDR16":"c","R_PPC_ADDR16_HA":"c","R_PPC_ADDR16_HI":"c","R_PPC_ADDR16_LO":"c","R_PPC_ADDR24":"c","R_PPC_ADDR32":"c","R_PPC_COPY":"c","R_PPC_DTPMOD32":"c","R_PPC_DTPREL16":"c","R_PPC_DTPREL16_HA":"c","R_PPC_DTPREL16_HI":"c","R_PPC_DTPREL16_LO":"c","R_PPC_DTPREL32":"c","R_PPC_EMB_BIT_FLD":"c","R_PPC_EMB_MRKREF":"c","R_PPC_EMB_NADDR16":"c","R_PPC_EMB_NADDR16_HA":"c","R_PPC_EMB_NADDR16_HI":"c","R_PPC_EMB_NADDR16_LO":"c","R_PPC_EMB_NADDR32":"c","R_PPC_EMB_RELSDA":"c","R_PPC_EMB_RELSEC16":"c","R_PPC_EMB_RELST_HA":"c","R_PPC_EMB_RELST_HI":"c","R_PPC_EMB_RELST_LO":"c","R_PPC_EMB_SDA21":"c","R_PPC_EMB_SDA2I16":"c","R_PPC_EMB_SDA2REL":"c","R_PPC_EMB_SDAI16":"c","R_PPC_GLOB_DAT":"c","R_PPC_GOT16":"c","R_PPC_GOT16_HA":"c","R_PPC_GOT16_HI":"c","R_PPC_GOT16_LO":"c","R_PPC_GOT_TLSGD16":"c","R_PPC_GOT_TLSGD16_HA":"c","R_PPC_GOT_TLSGD16_HI":"c","R_PPC_GOT_TLSGD16_LO":"c","R_PPC_GOT_TLSLD16":"c","R_PPC_GOT_TLSLD16_HA":"c","R_PPC_GOT_TLSLD16_HI":"c","R_PPC_GOT_TLSLD16_LO":"c","R_PPC_GOT_TPREL16":"c","R_PPC_GOT_TPREL16_HA":"c","R_PPC_GOT_TPREL16_HI":"c","R_PPC_GOT_TPREL16_LO":"c","R_PPC_JMP_SLOT":"c","R_PPC_LOCAL24PC":"c","R_PPC_NONE":"c","R_PPC_PLT16_HA":"c","R_PPC_PLT16_HI":"c","R_PPC_PLT16_LO":"c","R_PPC_PLT32":"c","R_PPC_PLTREL24":"c","R_PPC_PLTREL32":"c","R_PPC_REL14":"c","R_PPC_REL14_BRNTAKEN":"c","R_PPC_REL14_BRTAKEN":"c","R_PPC_REL24":"c","R_PPC_REL32":"c","R_PPC_RELATIVE":"c","R_PPC_SDAREL16":"c","R_PPC_SECTOFF":"c","R_PPC_SECTOFF_HA":"c","R_PPC_SECTOFF_HI":"c","R_PPC_SECTOFF_LO":"c","R_PPC_TLS":"c","R_PPC_TPREL16":"c","R_PPC_TPREL16_HA":"c","R_PPC_TPREL16_HI":"c","R_PPC_TPREL16_LO":"c","R_PPC_TPREL32":"c","R_PPC_UADDR16":"c","R_PPC_UADDR32":"c","R_RISCV":"t","R_RISCV.GoString":"m","R_RISCV.String":"m","R_RISCV_32":"c","R_RISCV_32_PCREL":"c","R_RISCV_64":"c","R_RISCV_ADD16":"c","R_RISCV_ADD32":"c","R_RISCV_ADD64":"c","R_RISCV_ADD8":"c","R_RISCV_ALIGN":"c","R_RISCV_BRANCH":"c","R_RISCV_CALL":"c","R_RISCV_CALL_PLT":"c","R_RISCV_COPY":"c","R_RISCV_GNU_VTENTRY":"c","R_RISCV_GNU_VTINHERIT":"c","R_RISCV_GOT_HI20":"c","R_RISCV_GPREL_I":"c","R_RISCV_GPREL_S":"c","R_RISCV_HI20":"c","R_RISCV_JAL":"c","R_RISCV_JUMP_SLOT":"c","R_RISCV_LO12_I":"c","R_RISCV_LO12_S":"c","R_RISCV_NONE":"c","R_RISCV_PCREL_HI20":"c","R_RISCV_PCREL_LO12_I":"c","R_RISCV_PCREL_LO12_S":"c","R_RISCV_RELATIVE":"c","R_RISCV_RELAX":"c","R_RISCV_RVC_BRANCH":"c","R_RISCV_RVC_JUMP":"c","R_RISCV_RVC_LUI":"c","R_RISCV_SET16":"c","R_RISCV_SET32":"c","R_RISCV_SET6":"c","R_RISCV_SET8":"c","R_RISCV_SUB16":"c","R_RISCV_SUB32":"c","R_RISCV_SUB6":"c","R_RISCV_SUB64":"c","R_RISCV_SUB8":"c","R_RISCV_TLS_DTPMOD32":"c","R_RISCV_TLS_DTPMOD64":"c","R_RISCV_TLS_DTPREL32":"c","R_RISCV_TLS_DTPREL64":"c","R_RISCV_TLS_GD_HI20":"c","R_RISCV_TLS_GOT_HI20":"c","R_RISCV_TLS_TPREL32":"c","R_RISCV_TLS_TPREL64":"c","R_RISCV_TPREL_ADD":"c","R_RISCV_TPREL_HI20":"c","R_RISCV_TPREL_I":"c","R_RISCV_TPREL_LO12_I":"c","R_RISCV_TPREL_LO12_S":"c","R_RISCV_TPREL_S":"c","R_SPARC":"t","R_SPARC.GoString":"m","R_SPARC.String":"m","R_SPARC_10":"c","R_SPARC_11":"c","R_SPARC_13":"c","R_SPARC_16":"c","R_SPARC_22":"c","R_SPARC_32":"c","R_SPARC_5":"c","R_SPARC_6":"c","R_SPARC_64":"c","R_SPARC_7":"c","R_SPARC_8":"c","R_SPARC_COPY":"c","R_SPARC_DISP16":"c","R_SPARC_DISP32":"c","R_SPARC_DISP64":"c","R_SPARC_DISP8":"c","R_SPARC_GLOB_DAT":"c","R_SPARC_GLOB_JMP":"c","R_SPARC_GOT10":"c","R_SPARC_GOT13":"c","R_SPARC_GOT22":"c","R_SPARC_H44":"c","R_SPARC_HH22":"c","R_SPARC_HI22":"c","R_SPARC_HIPLT22":"c","R_SPARC_HIX22":"c","R_SPARC_HM10":"c","R_SPARC_JMP_SLOT":"c","R_SPARC_L44":"c","R_SPARC_LM22":"c","R_SPARC_LO10":"c","R_SPARC_LOPLT10":"c","R_SPARC_LOX10":"c","R_SPARC_M44":"c","R_SPARC_NONE":"c","R_SPARC_OLO10":"c","R_SPARC_PC10":"c","R_SPARC_PC22":"c","R_SPARC_PCPLT10":"c","R_SPARC_PCPLT22":"c","R_SPARC_PCPLT32":"c","R_SPARC_PC_HH22":"c","R_SPARC_PC_HM10":"c","R_SPARC_PC_LM22":"c","R_SPARC_PLT32":"c","R_SPARC_PLT64":"c","R_SPARC_REGISTER":"c","R_SPARC_RELATIVE":"c","R_SPARC_UA16":"c","R_SPARC_UA32":"c","R_SPARC_UA64":"c","R_SPARC_WDISP16":"c","R_SPARC_WDISP19":"c","R_SPARC_WDISP22":"c","R_SPARC_WDISP30":"c","R_SPARC_WPLT30":"c","R_SYM32":"f","R_SYM64":"f","R_TYPE32":"f","R_TYPE64":"f","R_X86_64":"t","R_X86_64.GoString":"m","R_X86_64.String":"m","R_X86_64_16":"c","R_X86_64_32":"c","R_X86_64_32S":"c","R_X86_64_64":"c","R_X86_64_8":"c","R_X86_64_COPY":"c","R_X86_64_DTPMOD64":"c","R_X86_64_DTPOFF32":"c","R_X86_64_DTPOFF64":"c","R_X86_64_GLOB_DAT":"c","R_X86_64_GOT32":"c","R_X86_64_GOT64":"c","R_X86_64_GOTOFF64":"c","R_X86_64_GOTPC32":"c","R_X86_64_GOTPC32_TLSDESC":"c","R_X86_64_GOTPC64":"c","R_X86_64_GOTPCREL":"c","R_X86_64_GOTPCREL64":"c","R_X86_64_GOTPCRELX":"c","R_X86_64_GOTPLT64":"c","R_X86_64_GOTTPOFF":"c","R_X86_64_IRELATIVE":"c","R_X86_64_JMP_SLOT":"c","R_X86_64_NONE":"c","R_X86_64_PC16":"c","R_X86_64_PC32":"c","R_X86_64_PC32_BND":"c","R_X86_64_PC64":"c","R_X86_64_PC8":"c","R_X86_64_PLT32":"c","R_X86_64_PLT32_BND":"c","R_X86_64_PLTOFF64":"c","R_X86_64_RELATIVE":"c","R_X86_64_RELATIVE64":"c","R_X86_64_REX_GOTPCRELX":"c","R_X86_64_SIZE32":"c","R_X86_64_SIZE64":"c","R_X86_64_TLSDESC":"c","R_X86_64_TLSDESC_CALL":"c","R_X86_64_TLSGD":"c","R_X86_64_TLSLD":"c","R_X86_64_TPOFF32":"c","R_X86_64_TPOFF64":"c","Rel32":"t","Rel64":"t","Rela32":"t","Rela64":"t","SHF_ALLOC":"c","SHF_COMPRESSED":"c","SHF_EXECINSTR":"c","SHF_GROUP":"c","SHF_INFO_LINK":"c","SHF_LINK_ORDER":"c","SHF_MASKOS":"c","SHF_MASKPROC":"c","SHF_MERGE":"c","SHF_OS_NONCONFORMING":"c","SHF_STRINGS":"c","SHF_TLS":"c","SHF_WRITE":"c","SHN_ABS":"c","SHN_COMMON":"c","SHN_HIOS":"c","SHN_HIPROC":"c","SHN_HIRESERVE":"c","SHN_LOOS":"c","SHN_LOPROC":"c","SHN_LORESERVE":"c","SHN_UNDEF":"c","SHN_XINDEX":"c","SHT_DYNAMIC":"c","SHT_DYNSYM":"c","SHT_FINI_ARRAY":"c","SHT_GNU_ATTRIBUTES":"c","SHT_GNU_HASH":"c","SHT_GNU_LIBLIST":"c","SHT_GNU_VERDEF":"c","SHT_GNU_VERNEED":"c","SHT_GNU_VERSYM":"c","SHT_GROUP":"c","SHT_HASH":"c","SHT_HIOS":"c","SHT_HIPROC":"c","SHT_HIUSER":"c","SHT_INIT_ARRAY":"c","SHT_LOOS":"c","SHT_LOPROC":"c","SHT_LOUSER":"c","SHT_MIPS_ABIFLAGS":"c","SHT_NOBITS":"c","SHT_NOTE":"c","SHT_NULL":"c","SHT_PREINIT_ARRAY":"c","SHT_PROGBITS":"c","SHT_REL":"c","SHT_RELA":"c","SHT_RISCV_ATTRIBUTES":"c","SHT_SHLIB":"c","SHT_STRTAB":"c","SHT_SYMTAB":"c","SHT_SYMTAB_SHNDX":"c","STB_GLOBAL":"c","STB_HIOS":"c","STB_HIPROC":"c","STB_LOCAL":"c","STB_LOOS":"c","STB_LOPROC":"c","STB_WEAK":"c","STT_COMMON":"c","STT_FILE":"c","STT_FUNC":"c","STT_GNU_IFUNC":"c","STT_HIOS":"c","STT_HIPROC":"c","STT_LOOS":"c","STT_LOPROC":"c","STT_NOTYPE":"c","STT_OBJECT":"c","STT_RELC":"c","STT_SECTION":"c","STT_SRELC":"c","STT_TLS":"c","STV_DEFAULT":"c","STV_HIDDEN":"c","STV_INTERNAL":"c","STV_PROTECTED":"c","ST_BIND":"f","ST_INFO":"f","ST_TYPE":"f","ST_VISIBILITY":"f","Section":"t","Section.Data":"m","Section.Open":"m","Section32":"t","Section64":"t","SectionFlag":"t","SectionFlag.GoString":"m","SectionFlag.String":"m","SectionHeader":"t","SectionIndex":"t","SectionIndex.GoString":"m","SectionIndex.String":"m","SectionType":"t","SectionType.GoString":"m","SectionType.String":"m","Sym32":"t","Sym32Size":"c","Sym64":"t","Sym64Size":"c","SymBind":"t","SymBind.GoString":"m","SymBind.String":"m","SymType":"t","SymType.GoString":"m","SymType.String":"m","SymVis":"t","SymVis.GoString":"m","SymVis.String":"m","Symbol":"t","Type":"t","Type.GoString":"m","Type.String":"m","VER_FLG_BASE":"c","VER_FLG_INFO":"c","VER_FLG_WEAK":"c","Version":"t","Version.GoString":"m","Version.String":"m","VersionIndex":"t","VersionIndex.Index":"m","VersionIndex.IsHidden":"m"}},"debug/gosym":{"path":"debug/gosym","name":"gosym","symbols":{"DecodingError":"t","DecodingError.Error":"m","Func":"t","LineTable":"t","LineTable.LineToPC":"m","LineTable.PCToLine":"m","NewLineTable":"f","NewTable":"f","Obj":"t","Sym":"t","Sym.BaseName":"m","Sym.PackageName":"m","Sym.ReceiverName":"m","Sym.Static":"m","Table":"t","Table.LineToPC":"m","Table.LookupFunc":"m","Table.LookupSym":"m","Table.PCToFunc":"m","Table.PCToLine":"m","Table.SymByAddr":"m","UnknownFileError":"t","UnknownFileError.Error":"m","UnknownLineError":"t","UnknownLineError.Error":"m"}},"debug/macho":{"path":"debug/macho","name":"macho","symbols":{"ARM64_RELOC_ADDEND":"c","ARM64_RELOC_BRANCH26":"c","ARM64_RELOC_GOT_LOAD_PAGE21":"c","ARM64_RELOC_GOT_LOAD_PAGEOFF12":"c","ARM64_RELOC_PAGE21":"c","ARM64_RELOC_PAGEOFF12":"c","ARM64_RELOC_POINTER_TO_GOT":"c","ARM64_RELOC_SUBTRACTOR":"c","ARM64_RELOC_TLVP_LOAD_PAGE21":"c","ARM64_RELOC_TLVP_LOAD_PAGEOFF12":"c","ARM64_RELOC_UNSIGNED":"c","ARM_RELOC_BR24":"c","ARM_RELOC_HALF":"c","ARM_RELOC_HALF_SECTDIFF":"c","ARM_RELOC_LOCAL_SECTDIFF":"c","ARM_RELOC_PAIR":"c","ARM_RELOC_PB_LA_PTR":"c","ARM_RELOC_SECTDIFF":"c","ARM_RELOC_VANILLA":"c","ARM_THUMB_32BIT_BRANCH":"c","ARM_THUMB_RELOC_BR22":"c","Cpu":"t","Cpu.GoString":"m","Cpu.String":"m","Cpu386":"c","CpuAmd64":"c","CpuArm":"c","CpuArm64":"c","CpuPpc":"c","CpuPpc64":"c","Dylib":"t","DylibCmd":"t","Dysymtab":"t","DysymtabCmd":"t","ErrNotFat":"v","FatArch":"t","FatArchHeader":"t","FatFile":"t","FatFile.Close":"m","File":"t","File.Close":"m","File.DWARF":"m","File.ImportedLibraries":"m","File.ImportedSymbols":"m","File.Section":"m","File.Segment":"m","FileHeader":"t","FlagAllModsBound":"c","FlagAllowStackExecution":"c","FlagAppExtensionSafe":"c","FlagBindAtLoad":"c","FlagBindsToWeak":"c","FlagCanonical":"c","FlagDeadStrippableDylib":"c","FlagDyldLink":"c","FlagForceFlat":"c","FlagHasTLVDescriptors":"c","FlagIncrLink":"c","FlagLazyInit":"c","FlagNoFixPrebinding":"c","FlagNoHeapExecution":"c","FlagNoMultiDefs":"c","FlagNoReexportedDylibs":"c","FlagNoUndefs":"c","FlagPIE":"c","FlagPrebindable":"c","FlagPrebound":"c","FlagRootSafe":"c","FlagSetuidSafe":"c","FlagSplitSegs":"c","FlagSubsectionsViaSymbols":"c","FlagTwoLevel":"c","FlagWeakDefines":"c","FormatError":"t","FormatError.Error":"m","GENERIC_RELOC_LOCAL_SECTDIFF":"c","GENERIC_RELOC_PAIR":"c","GENERIC_RELOC_PB_LA_PTR":"c","GENERIC_RELOC_SECTDIFF":"c","GENERIC_RELOC_TLV":"c","GENERIC_RELOC_VANILLA":"c","Load":"t","LoadBytes":"t","LoadBytes.Raw":"m","LoadCmd":"t","LoadCmd.GoString":"m","LoadCmd.String":"m","LoadCmdDylib":"c","LoadCmdDylinker":"c","LoadCmdDysymtab":"c","LoadCmdRpath":"c","LoadCmdSegment":"c","LoadCmdSegment64":"c","LoadCmdSymtab":"c","LoadCmdThread":"c","LoadCmdUnixThread":"c","Magic32":"c","Magic64":"c","MagicFat":"c","NewFatFile":"f","NewFile":"f","Nlist32":"t","Nlist64":"t","Open":"f","OpenFat":"f","Regs386":"t","RegsAMD64":"t","Reloc":"t","RelocTypeARM":"t","RelocTypeARM.GoString":"m","RelocTypeARM.String":"m","RelocTypeARM64":"t","RelocTypeARM64.GoString":"m","RelocTypeARM64.String":"m","RelocTypeGeneric":"t","RelocTypeGeneric.GoString":"m","RelocTypeGeneric.String":"m","RelocTypeX86_64":"t","RelocTypeX86_64.GoString":"m","RelocTypeX86_64.String":"m","Rpath":"t","RpathCmd":"t","Section":"t","Section.Data":"m","Section.Open":"m","Section32":"t","Section64":"t","SectionHeader":"t","Segment":"t","Segment.Data":"m","Segment.Open":"m","Segment32":"t","Segment64":"t","SegmentHeader":"t","Symbol":"t","Symtab":"t","SymtabCmd":"t","Thread":"t","Type":"t","Type.GoString":"m","Type.String":"m","TypeBundle":"c","TypeDylib":"c","TypeExec":"c","TypeObj":"c","X86_64_RELOC_BRANCH":"c","X86_64_RELOC_GOT":"c","X86_64_RELOC_GOT_LOAD":"c","X86_64_RELOC_SIGNED":"c","X86_64_RELOC_SIGNED_1":"c","X86_64_RELOC_SIGNED_2":"c","X86_64_RELOC_SIGNED_4":"c","X86_64_RELOC_SUBTRACTOR":"c","X86_64_RELOC_TLV":"c","X86_64_RELOC_UNSIGNED":"c"}},"debug/pe":{"path":"debug/pe","name":"pe","symbols":{"COFFSymbol":"t","COFFSymbol.FullName":"m","COFFSymbolAuxFormat5":"t","COFFSymbolSize":"c","DataDirectory":"t","File":"t","File.COFFSymbolReadSectionDefAux":"m","File.Close":"m","File.DWARF":"m","File.ImportedLibraries":"m","File.ImportedSymbols":"m","File.Section":"m","FileHeader":"t","FormatError":"t","FormatError.Error":"m","IMAGE_COMDAT_SELECT_ANY":"c","IMAGE_COMDAT_SELECT_ASSOCIATIVE":"c","IMAGE_COMDAT_SELECT_EXACT_MATCH":"c","IMAGE_COMDAT_SELECT_LARGEST":"c","IMAGE_COMDAT_SELECT_NODUPLICATES":"c","IMAGE_COMDAT_SELECT_SAME_SIZE":"c","IMAGE_DIRECTORY_ENTRY_ARCHITECTURE":"c","IMAGE_DIRECTORY_ENTRY_BASERELOC":"c","IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT":"c","IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR":"c","IMAGE_DIRECTORY_ENTRY_DEBUG":"c","IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT":"c","IMAGE_DIRECTORY_ENTRY_EXCEPTION":"c","IMAGE_DIRECTORY_ENTRY_EXPORT":"c","IMAGE_DIRECTORY_ENTRY_GLOBALPTR":"c","IMAGE_DIRECTORY_ENTRY_IAT":"c","IMAGE_DIRECTORY_ENTRY_IMPORT":"c","IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG":"c","IMAGE_DIRECTORY_ENTRY_RESOURCE":"c","IMAGE_DIRECTORY_ENTRY_SECURITY":"c","IMAGE_DIRECTORY_ENTRY_TLS":"c","IMAGE_DLLCHARACTERISTICS_APPCONTAINER":"c","IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE":"c","IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY":"c","IMAGE_DLLCHARACTERISTICS_GUARD_CF":"c","IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA":"c","IMAGE_DLLCHARACTERISTICS_NO_BIND":"c","IMAGE_DLLCHARACTERISTICS_NO_ISOLATION":"c","IMAGE_DLLCHARACTERISTICS_NO_SEH":"c","IMAGE_DLLCHARACTERISTICS_NX_COMPAT":"c","IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE":"c","IMAGE_DLLCHARACTERISTICS_WDM_DRIVER":"c","IMAGE_FILE_32BIT_MACHINE":"c","IMAGE_FILE_AGGRESIVE_WS_TRIM":"c","IMAGE_FILE_BYTES_REVERSED_HI":"c","IMAGE_FILE_BYTES_REVERSED_LO":"c","IMAGE_FILE_DEBUG_STRIPPED":"c","IMAGE_FILE_DLL":"c","IMAGE_FILE_EXECUTABLE_IMAGE":"c","IMAGE_FILE_LARGE_ADDRESS_AWARE":"c","IMAGE_FILE_LINE_NUMS_STRIPPED":"c","IMAGE_FILE_LOCAL_SYMS_STRIPPED":"c","IMAGE_FILE_MACHINE_AM33":"c","IMAGE_FILE_MACHINE_AMD64":"c","IMAGE_FILE_MACHINE_ARM":"c","IMAGE_FILE_MACHINE_ARM64":"c","IMAGE_FILE_MACHINE_ARMNT":"c","IMAGE_FILE_MACHINE_EBC":"c","IMAGE_FILE_MACHINE_I386":"c","IMAGE_FILE_MACHINE_IA64":"c","IMAGE_FILE_MACHINE_LOONGARCH32":"c","IMAGE_FILE_MACHINE_LOONGARCH64":"c","IMAGE_FILE_MACHINE_M32R":"c","IMAGE_FILE_MACHINE_MIPS16":"c","IMAGE_FILE_MACHINE_MIPSFPU":"c","IMAGE_FILE_MACHINE_MIPSFPU16":"c","IMAGE_FILE_MACHINE_POWERPC":"c","IMAGE_FILE_MACHINE_POWERPCFP":"c","IMAGE_FILE_MACHINE_R4000":"c","IMAGE_FILE_MACHINE_RISCV128":"c","IMAGE_FILE_MACHINE_RISCV32":"c","IMAGE_FILE_MACHINE_RISCV64":"c","IMAGE_FILE_MACHINE_SH3":"c","IMAGE_FILE_MACHINE_SH3DSP":"c","IMAGE_FILE_MACHINE_SH4":"c","IMAGE_FILE_MACHINE_SH5":"c","IMAGE_FILE_MACHINE_THUMB":"c","IMAGE_FILE_MACHINE_UNKNOWN":"c","IMAGE_FILE_MACHINE_WCEMIPSV2":"c","IMAGE_FILE_NET_RUN_FROM_SWAP":"c","IMAGE_FILE_RELOCS_STRIPPED":"c","IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP":"c","IMAGE_FILE_SYSTEM":"c","IMAGE_FILE_UP_SYSTEM_ONLY":"c","IMAGE_SCN_CNT_CODE":"c","IMAGE_SCN_CNT_INITIALIZED_DATA":"c","IMAGE_SCN_CNT_UNINITIALIZED_DATA":"c","IMAGE_SCN_LNK_COMDAT":"c","IMAGE_SCN_MEM_DISCARDABLE":"c","IMAGE_SCN_MEM_EXECUTE":"c","IMAGE_SCN_MEM_READ":"c","IMAGE_SCN_MEM_WRITE":"c","IMAGE_SUBSYSTEM_EFI_APPLICATION":"c","IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER":"c","IMAGE_SUBSYSTEM_EFI_ROM":"c","IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER":"c","IMAGE_SUBSYSTEM_NATIVE":"c","IMAGE_SUBSYSTEM_NATIVE_WINDOWS":"c","IMAGE_SUBSYSTEM_OS2_CUI":"c","IMAGE_SUBSYSTEM_POSIX_CUI":"c","IMAGE_SUBSYSTEM_UNKNOWN":"c","IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION":"c","IMAGE_SUBSYSTEM_WINDOWS_CE_GUI":"c","IMAGE_SUBSYSTEM_WINDOWS_CUI":"c","IMAGE_SUBSYSTEM_WINDOWS_GUI":"c","IMAGE_SUBSYSTEM_XBOX":"c","ImportDirectory":"t","NewFile":"f","Open":"f","OptionalHeader32":"t","OptionalHeader64":"t","Reloc":"t","Section":"t","Section.Data":"m","Section.Open":"m","SectionHeader":"t","SectionHeader32":"t","StringTable":"t","StringTable.String":"m","Symbol":"t"}},"debug/plan9obj":{"path":"debug/plan9obj","name":"plan9obj","symbols":{"ErrNoSymbols":"v","File":"t","File.Close":"m","File.Section":"m","File.Symbols":"m","FileHeader":"t","Magic386":"c","Magic64":"c","MagicAMD64":"c","MagicARM":"c","NewFile":"f","Open":"f","Section":"t","Section.Data":"m","Section.Open":"m","SectionHeader":"t","Sym":"t"}},"embed":{"path":"embed","name":"embed","symbols":{"FS":"t","FS.Open":"m","FS.ReadDir":"m","FS.ReadFile":"m"}},"encoding":{"path":"encoding","name":"encoding","symbols":{"BinaryAppender":"t","BinaryMarshaler":"t","BinaryUnmarshaler":"t","TextAppender":"t","TextMarshaler":"t","TextUnmarshaler":"t"}},"encoding/ascii85":{"path":"encoding/ascii85","name":"ascii85","symbols":{"CorruptInputError":"t","CorruptInputError.Error":"m","Decode":"f","Encode":"f","MaxEncodedLen":"f","NewDecoder":"f","NewEncoder":"f"}},"encoding/asn1":{"path":"encoding/asn1","name":"asn1","symbols":{"BitString":"t","BitString.At":"m","BitString.RightAlign":"m","ClassApplication":"c","ClassContextSpecific":"c","ClassPrivate":"c","ClassUniversal":"c","Enumerated":"t","Flag":"t","Marshal":"f","MarshalWithParams":"f","NullBytes":"v","NullRawValue":"v","ObjectIdentifier":"t","ObjectIdentifier.Equal":"m","ObjectIdentifier.String":"m","RawContent":"t","RawValue":"t","StructuralError":"t","StructuralError.Error":"m","SyntaxError":"t","SyntaxError.Error":"m","TagBMPString":"c","TagBitString":"c","TagBoolean":"c","TagEnum":"c","TagGeneralString":"c","TagGeneralizedTime":"c","TagIA5String":"c","TagInteger":"c","TagNull":"c","TagNumericString":"c","TagOID":"c","TagOctetString":"c","TagPrintableString":"c","TagSequence":"c","TagSet":"c","TagT61String":"c","TagUTCTime":"c","TagUTF8String":"c","Unmarshal":"f","UnmarshalWithParams":"f"}},"encoding/base32":{"path":"encoding/base32","name":"base32","symbols":{"CorruptInputError":"t","CorruptInputError.Error":"m","Encoding":"t","Encoding.AppendDecode":"m","Encoding.AppendEncode":"m","Encoding.Decode":"m","Encoding.DecodeString":"m","Encoding.DecodedLen":"m","Encoding.Encode":"m","Encoding.EncodeToString":"m","Encoding.EncodedLen":"m","Encoding.WithPadding":"m","HexEncoding":"v","NewDecoder":"f","NewEncoder":"f","NewEncoding":"f","NoPadding":"c","StdEncoding":"v","StdPadding":"c"}},"encoding/base64":{"path":"encoding/base64","name":"base64","symbols":{"CorruptInputError":"t","CorruptInputError.Error":"m","Encoding":"t","Encoding.AppendDecode":"m","Encoding.AppendEncode":"m","Encoding.Decode":"m","Encoding.DecodeString":"m","Encoding.DecodedLen":"m","Encoding.Encode":"m","Encoding.EncodeToString":"m","Encoding.EncodedLen":"m","Encoding.Strict":"m","Encoding.WithPadding":"m","NewDecoder":"f","NewEncoder":"f","NewEncoding":"f","NoPadding":"c","RawStdEncoding":"v","RawURLEncoding":"v","StdEncoding":"v","StdPadding":"c","URLEncoding":"v"}},"encoding/binary":{"path":"encoding/binary","name":"binary","symbols":{"Append":"f","AppendByteOrder":"t","AppendUvarint":"f","AppendVarint":"f","BigEndian":"v","ByteOrder":"t","Decode":"f","Encode":"f","LittleEndian":"v","MaxVarintLen16":"c","MaxVarintLen32":"c","MaxVarintLen64":"c","NativeEndian":"v","PutUvarint":"f","PutVarint":"f","Read":"f","ReadUvarint":"f","ReadVarint":"f","Size":"f","Uvarint":"f","Varint":"f","Write":"f"}},"encoding/csv":{"path":"encoding/csv","name":"csv","symbols":{"ErrBareQuote":"v","ErrFieldCount":"v","ErrQuote":"v","ErrTrailingComma":"v","NewReader":"f","NewWriter":"f","ParseError":"t","ParseError.Error":"m","ParseError.Unwrap":"m","Reader":"t","Reader.FieldPos":"m","Reader.InputOffset":"m","Reader.Read":"m","Reader.ReadAll":"m","Writer":"t","Writer.Error":"m","Writer.Flush":"m","Writer.Write":"m","Writer.WriteAll":"m"}},"encoding/gob":{"path":"encoding/gob","name":"gob","symbols":{"CommonType":"t","Decoder":"t","Decoder.Decode":"m","Decoder.DecodeValue":"m","Encoder":"t","Encoder.Encode":"m","Encoder.EncodeValue":"m","GobDecoder":"t","GobEncoder":"t","NewDecoder":"f","NewEncoder":"f","Register":"f","RegisterName":"f"}},"encoding/hex":{"path":"encoding/hex","name":"hex","symbols":{"AppendDecode":"f","AppendEncode":"f","Decode":"f","DecodeString":"f","DecodedLen":"f","Dump":"f","Dumper":"f","Encode":"f","EncodeToString":"f","EncodedLen":"f","ErrLength":"v","InvalidByteError":"t","InvalidByteError.Error":"m","NewDecoder":"f","NewEncoder":"f"}},"encoding/json":{"path":"encoding/json","name":"json","symbols":{"CallMethodsWithLegacySemantics":"f","Compact":"f","Decoder":"t","Decoder.Buffered":"m","Decoder.Decode":"m","Decoder.DisallowUnknownFields":"m","Decoder.InputOffset":"m","Decoder.More":"m","Decoder.Token":"m","Decoder.UseNumber":"m","DefaultOptionsV1":"f","Delim":"t","Delim.String":"m","Encoder":"t","Encoder.Encode":"m","Encoder.SetEscapeHTML":"m","Encoder.SetIndent":"m","FormatByteArrayAsArray":"f","FormatBytesWithLegacySemantics":"f","FormatDurationAsNano":"f","HTMLEscape":"f","Indent":"f","InvalidUTF8Error":"t","InvalidUTF8Error.Error":"m","InvalidUnmarshalError":"t","InvalidUnmarshalError.Error":"m","Marshal":"f","MarshalIndent":"f","Marshaler":"t","MarshalerError":"t","MarshalerError.Error":"m","MarshalerError.Unwrap":"m","MatchCaseSensitiveDelimiter":"f","MergeWithLegacySemantics":"f","NewDecoder":"f","NewEncoder":"f","Number":"t","Number.Float64":"m","Number.Int64":"m","Number.MarshalJSONTo":"m","Number.String":"m","Number.UnmarshalJSONFrom":"m","OmitEmptyWithLegacySemantics":"f","Options":"t","ParseBytesWithLooseRFC4648":"f","ParseTimeWithLooseRFC3339":"f","RawMessage":"t","ReportErrorsWithLegacySemantics":"f","StringifyWithLegacySemantics":"f","SyntaxError":"t","SyntaxError.Error":"m","Token":"t","Unmarshal":"f","UnmarshalArrayFromAnyLength":"f","UnmarshalFieldError":"t","UnmarshalFieldError.Error":"m","UnmarshalTypeError":"t","UnmarshalTypeError.Error":"m","UnmarshalTypeError.Unwrap":"m","Unmarshaler":"t","UnsupportedTypeError":"t","UnsupportedTypeError.Error":"m","UnsupportedValueError":"t","UnsupportedValueError.Error":"m","Valid":"f"}},"encoding/json/jsontext":{"path":"encoding/json/jsontext","name":"jsontext","symbols":{"AllowDuplicateNames":"f","AllowInvalidUTF8":"f","AppendFloat":"f","AppendFormat":"f","AppendQuote":"f","AppendUnquote":"f","BeginArray":"v","BeginObject":"v","Bool":"f","CanonicalizeRawFloats":"f","CanonicalizeRawInts":"f","Decoder":"t","Decoder.InputOffset":"m","Decoder.Options":"m","Decoder.PeekKind":"m","Decoder.ReadToken":"m","Decoder.ReadValue":"m","Decoder.Reset":"m","Decoder.SkipValue":"m","Decoder.StackDepth":"m","Decoder.StackIndex":"m","Decoder.StackPointer":"m","Decoder.UnreadBuffer":"m","Encoder":"t","Encoder.AvailableBuffer":"m","Encoder.Options":"m","Encoder.OutputOffset":"m","Encoder.Reset":"m","Encoder.StackDepth":"m","Encoder.StackIndex":"m","Encoder.StackPointer":"m","Encoder.WriteToken":"m","Encoder.WriteValue":"m","EndArray":"v","EndObject":"v","ErrDuplicateName":"v","ErrNonStringName":"v","EscapeForHTML":"f","EscapeForJS":"f","False":"v","Float":"f","Float32":"f","Int":"f","Internal":"v","Kind":"t","Kind.String":"m","KindBeginArray":"c","KindBeginObject":"c","KindEndArray":"c","KindEndObject":"c","KindFalse":"c","KindInvalid":"c","KindNull":"c","KindNumber":"c","KindString":"c","KindTrue":"c","Multiline":"f","NewDecoder":"f","NewEncoder":"f","Null":"v","Options":"t","Pointer":"t","Pointer.AppendToken":"m","Pointer.Contains":"m","Pointer.IsValid":"m","Pointer.LastToken":"m","Pointer.Parent":"m","Pointer.Tokens":"m","PreserveRawStrings":"f","ReorderRawObjects":"f","SpaceAfterColon":"f","SpaceAfterComma":"f","String":"f","SyntacticError":"t","SyntacticError.Error":"m","SyntacticError.Unwrap":"m","Token":"t","Token.Bool":"m","Token.Clone":"m","Token.Float":"m","Token.Float32":"m","Token.Int":"m","Token.Kind":"m","Token.String":"m","Token.Uint":"m","True":"v","Uint":"f","Value":"t","Value.Canonicalize":"m","Value.Clone":"m","Value.Compact":"m","Value.Format":"m","Value.Indent":"m","Value.IsValid":"m","Value.Kind":"m","Value.MarshalJSON":"m","Value.String":"m","Value.UnmarshalJSON":"m","WithIndent":"f","WithIndentPrefix":"f"}},"encoding/json/v2":{"path":"encoding/json/v2","name":"json","symbols":{"DefaultOptionsV2":"f","Deterministic":"f","ErrUnknownName":"v","FormatNilMapAsNull":"f","FormatNilSliceAsNull":"f","GetOption":"f","JoinMarshalers":"f","JoinOptions":"f","JoinUnmarshalers":"f","Marshal":"f","MarshalEncode":"f","MarshalFunc":"f","MarshalToFunc":"f","MarshalWrite":"f","Marshaler":"t","MarshalerTo":"t","Marshalers":"t","MatchCaseInsensitiveNames":"f","OmitZeroStructFields":"f","Options":"t","RejectUnknownMembers":"f","SemanticError":"t","SemanticError.Error":"m","SemanticError.Unwrap":"m","StringifyNumbers":"f","Unmarshal":"f","UnmarshalDecode":"f","UnmarshalFromFunc":"f","UnmarshalFunc":"f","UnmarshalRead":"f","Unmarshaler":"t","UnmarshalerFrom":"t","Unmarshalers":"t","WithMarshalers":"f","WithUnmarshalers":"f"}},"encoding/pem":{"path":"encoding/pem","name":"pem","symbols":{"Block":"t","Decode":"f","Encode":"f","EncodeToMemory":"f"}},"encoding/xml":{"path":"encoding/xml","name":"xml","symbols":{"Attr":"t","CharData":"t","CharData.Copy":"m","Comment":"t","Comment.Copy":"m","CopyToken":"f","Decoder":"t","Decoder.Decode":"m","Decoder.DecodeElement":"m","Decoder.InputOffset":"m","Decoder.InputPos":"m","Decoder.RawToken":"m","Decoder.Skip":"m","Decoder.Token":"m","Directive":"t","Directive.Copy":"m","Encoder":"t","Encoder.Close":"m","Encoder.Encode":"m","Encoder.EncodeElement":"m","Encoder.EncodeToken":"m","Encoder.Flush":"m","Encoder.Indent":"m","EndElement":"t","Escape":"f","EscapeText":"f","HTMLAutoClose":"v","HTMLEntity":"v","Header":"c","Marshal":"f","MarshalIndent":"f","Marshaler":"t","MarshalerAttr":"t","Name":"t","NewDecoder":"f","NewEncoder":"f","NewTokenDecoder":"f","ProcInst":"t","ProcInst.Copy":"m","StartElement":"t","StartElement.Copy":"m","StartElement.End":"m","SyntaxError":"t","SyntaxError.Error":"m","TagPathError":"t","TagPathError.Error":"m","Token":"t","TokenReader":"t","Unmarshal":"f","UnmarshalError":"t","UnmarshalError.Error":"m","Unmarshaler":"t","UnmarshalerAttr":"t","UnsupportedTypeError":"t","UnsupportedTypeError.Error":"m"}},"errors":{"path":"errors","name":"errors","symbols":{"As":"f","AsType":"f","ErrUnsupported":"v","Is":"f","Join":"f","New":"f","Unwrap":"f"}},"expvar":{"path":"expvar","name":"expvar","symbols":{"Do":"f","Float":"t","Float.Add":"m","Float.Set":"m","Float.String":"m","Float.Value":"m","Func":"t","Func.String":"m","Func.Value":"m","Get":"f","Handler":"f","Int":"t","Int.Add":"m","Int.Set":"m","Int.String":"m","Int.Value":"m","KeyValue":"t","Map":"t","Map.Add":"m","Map.AddFloat":"m","Map.Delete":"m","Map.Do":"m","Map.Get":"m","Map.Init":"m","Map.Set":"m","Map.String":"m","NewFloat":"f","NewInt":"f","NewMap":"f","NewString":"f","Publish":"f","String":"t","String.Set":"m","String.String":"m","String.Value":"m","Var":"t"}},"flag":{"path":"flag","name":"flag","symbols":{"Arg":"f","Args":"f","Bool":"f","BoolFunc":"f","BoolVar":"f","CommandLine":"v","ContinueOnError":"c","Duration":"f","DurationVar":"f","ErrHelp":"v","ErrorHandling":"t","ExitOnError":"c","Flag":"t","FlagSet":"t","FlagSet.Arg":"m","FlagSet.Args":"m","FlagSet.Bool":"m","FlagSet.BoolFunc":"m","FlagSet.BoolVar":"m","FlagSet.Duration":"m","FlagSet.DurationVar":"m","FlagSet.ErrorHandling":"m","FlagSet.Float64":"m","FlagSet.Float64Var":"m","FlagSet.Func":"m","FlagSet.Init":"m","FlagSet.Int":"m","FlagSet.Int64":"m","FlagSet.Int64Var":"m","FlagSet.IntVar":"m","FlagSet.Lookup":"m","FlagSet.NArg":"m","FlagSet.NFlag":"m","FlagSet.Name":"m","FlagSet.Output":"m","FlagSet.Parse":"m","FlagSet.Parsed":"m","FlagSet.PrintDefaults":"m","FlagSet.Set":"m","FlagSet.SetOutput":"m","FlagSet.String":"m","FlagSet.StringVar":"m","FlagSet.TextVar":"m","FlagSet.Uint":"m","FlagSet.Uint64":"m","FlagSet.Uint64Var":"m","FlagSet.UintVar":"m","FlagSet.Var":"m","FlagSet.Visit":"m","FlagSet.VisitAll":"m","Float64":"f","Float64Var":"f","Func":"f","Getter":"t","Int":"f","Int64":"f","Int64Var":"f","IntVar":"f","Lookup":"f","NArg":"f","NFlag":"f","NewFlagSet":"f","PanicOnError":"c","Parse":"f","Parsed":"f","PrintDefaults":"f","Set":"f","String":"f","StringVar":"f","TextVar":"f","Uint":"f","Uint64":"f","Uint64Var":"f","UintVar":"f","UnquoteUsage":"f","Usage":"v","Value":"t","Var":"f","Visit":"f","VisitAll":"f"}},"fmt":{"path":"fmt","name":"fmt","symbols":{"Append":"f","Appendf":"f","Appendln":"f","Errorf":"f","FormatString":"f","Formatter":"t","Fprint":"f","Fprintf":"f","Fprintln":"f","Fscan":"f","Fscanf":"f","Fscanln":"f","GoStringer":"t","Print":"f","Printf":"f","Println":"f","Scan":"f","ScanState":"t","Scanf":"f","Scanln":"f","Scanner":"t","Sprint":"f","Sprintf":"f","Sprintln":"f","Sscan":"f","Sscanf":"f","Sscanln":"f","State":"t","Stringer":"t"}},"go/ast":{"path":"go/ast","name":"ast","symbols":{"ArrayType":"t","ArrayType.End":"m","ArrayType.Pos":"m","AssignStmt":"t","AssignStmt.End":"m","AssignStmt.Pos":"m","Bad":"c","BadDecl":"t","BadDecl.End":"m","BadDecl.Pos":"m","BadExpr":"t","BadExpr.End":"m","BadExpr.Pos":"m","BadStmt":"t","BadStmt.End":"m","BadStmt.Pos":"m","BasicLit":"t","BasicLit.End":"m","BasicLit.Pos":"m","BinaryExpr":"t","BinaryExpr.End":"m","BinaryExpr.Pos":"m","BlockStmt":"t","BlockStmt.End":"m","BlockStmt.Pos":"m","BranchStmt":"t","BranchStmt.End":"m","BranchStmt.Pos":"m","CallExpr":"t","CallExpr.End":"m","CallExpr.Pos":"m","CaseClause":"t","CaseClause.End":"m","CaseClause.Pos":"m","ChanDir":"t","ChanType":"t","ChanType.End":"m","ChanType.Pos":"m","CommClause":"t","CommClause.End":"m","CommClause.Pos":"m","Comment":"t","Comment.End":"m","Comment.Pos":"m","CommentGroup":"t","CommentGroup.End":"m","CommentGroup.Pos":"m","CommentGroup.Text":"m","CommentMap":"t","CommentMap.Comments":"m","CommentMap.Filter":"m","CommentMap.String":"m","CommentMap.Update":"m","CompositeLit":"t","CompositeLit.End":"m","CompositeLit.Pos":"m","Con":"c","Decl":"t","DeclStmt":"t","DeclStmt.End":"m","DeclStmt.Pos":"m","DeferStmt":"t","DeferStmt.End":"m","DeferStmt.Pos":"m","Directive":"t","Directive.End":"m","Directive.ParseArgs":"m","Directive.Pos":"m","DirectiveArg":"t","Ellipsis":"t","Ellipsis.End":"m","Ellipsis.Pos":"m","EmptyStmt":"t","EmptyStmt.End":"m","EmptyStmt.Pos":"m","Expr":"t","ExprStmt":"t","ExprStmt.End":"m","ExprStmt.Pos":"m","Field":"t","Field.End":"m","Field.Pos":"m","FieldFilter":"t","FieldList":"t","FieldList.End":"m","FieldList.NumFields":"m","FieldList.Pos":"m","File":"t","File.End":"m","File.Pos":"m","FileExports":"f","Filter":"t","FilterDecl":"f","FilterFile":"f","FilterFuncDuplicates":"c","FilterImportDuplicates":"c","FilterPackage":"f","FilterUnassociatedComments":"c","ForStmt":"t","ForStmt.End":"m","ForStmt.Pos":"m","Fprint":"f","Fun":"c","FuncDecl":"t","FuncDecl.End":"m","FuncDecl.Pos":"m","FuncLit":"t","FuncLit.End":"m","FuncLit.Pos":"m","FuncType":"t","FuncType.End":"m","FuncType.Pos":"m","GenDecl":"t","GenDecl.End":"m","GenDecl.Pos":"m","GoStmt":"t","GoStmt.End":"m","GoStmt.Pos":"m","Ident":"t","Ident.End":"m","Ident.IsExported":"m","Ident.Pos":"m","Ident.String":"m","IfStmt":"t","IfStmt.End":"m","IfStmt.Pos":"m","ImportSpec":"t","ImportSpec.End":"m","ImportSpec.Pos":"m","Importer":"t","IncDecStmt":"t","IncDecStmt.End":"m","IncDecStmt.Pos":"m","IndexExpr":"t","IndexExpr.End":"m","IndexExpr.Pos":"m","IndexListExpr":"t","IndexListExpr.End":"m","IndexListExpr.Pos":"m","Inspect":"f","InterfaceType":"t","InterfaceType.End":"m","InterfaceType.Pos":"m","IsExported":"f","IsGenerated":"f","KeyValueExpr":"t","KeyValueExpr.End":"m","KeyValueExpr.Pos":"m","LabeledStmt":"t","LabeledStmt.End":"m","LabeledStmt.Pos":"m","Lbl":"c","MapType":"t","MapType.End":"m","MapType.Pos":"m","MergeMode":"t","MergePackageFiles":"f","NewCommentMap":"f","NewIdent":"f","NewObj":"f","NewPackage":"f","NewScope":"f","Node":"t","NotNilFilter":"f","ObjKind":"t","ObjKind.String":"m","Object":"t","Object.Pos":"m","Package":"t","Package.End":"m","Package.Pos":"m","PackageExports":"f","ParenExpr":"t","ParenExpr.End":"m","ParenExpr.Pos":"m","ParseDirective":"f","Pkg":"c","Preorder":"f","PreorderStack":"f","Print":"f","RECV":"c","RangeStmt":"t","RangeStmt.End":"m","RangeStmt.Pos":"m","ReturnStmt":"t","ReturnStmt.End":"m","ReturnStmt.Pos":"m","SEND":"c","Scope":"t","Scope.Insert":"m","Scope.Lookup":"m","Scope.String":"m","SelectStmt":"t","SelectStmt.End":"m","SelectStmt.Pos":"m","SelectorExpr":"t","SelectorExpr.End":"m","SelectorExpr.Pos":"m","SendStmt":"t","SendStmt.End":"m","SendStmt.Pos":"m","SliceExpr":"t","SliceExpr.End":"m","SliceExpr.Pos":"m","SortImports":"f","Spec":"t","StarExpr":"t","StarExpr.End":"m","StarExpr.Pos":"m","Stmt":"t","StructType":"t","StructType.End":"m","StructType.Pos":"m","SwitchStmt":"t","SwitchStmt.End":"m","SwitchStmt.Pos":"m","Typ":"c","TypeAssertExpr":"t","TypeAssertExpr.End":"m","TypeAssertExpr.Pos":"m","TypeSpec":"t","TypeSpec.End":"m","TypeSpec.Pos":"m","TypeSwitchStmt":"t","TypeSwitchStmt.End":"m","TypeSwitchStmt.Pos":"m","UnaryExpr":"t","UnaryExpr.End":"m","UnaryExpr.Pos":"m","Unparen":"f","ValueSpec":"t","ValueSpec.End":"m","ValueSpec.Pos":"m","Var":"c","Visitor":"t","Walk":"f"}},"go/build":{"path":"go/build","name":"build","symbols":{"AllowBinary":"c","ArchChar":"f","Context":"t","Context.Import":"m","Context.ImportDir":"m","Context.MatchFile":"m","Context.SrcDirs":"m","Default":"v","Directive":"t","FindOnly":"c","IgnoreVendor":"c","Import":"f","ImportComment":"c","ImportDir":"f","ImportMode":"t","IsLocalImport":"f","MultiplePackageError":"t","MultiplePackageError.Error":"m","NoGoError":"t","NoGoError.Error":"m","Package":"t","Package.IsCommand":"m","ToolDir":"v"}},"go/build/constraint":{"path":"go/build/constraint","name":"constraint","symbols":{"AndExpr":"t","AndExpr.Eval":"m","AndExpr.String":"m","Expr":"t","GoVersion":"f","IsGoBuild":"f","IsPlusBuild":"f","NotExpr":"t","NotExpr.Eval":"m","NotExpr.String":"m","OrExpr":"t","OrExpr.Eval":"m","OrExpr.String":"m","Parse":"f","PlusBuildLines":"f","SyntaxError":"t","SyntaxError.Error":"m","TagExpr":"t","TagExpr.Eval":"m","TagExpr.String":"m"}},"go/constant":{"path":"go/constant","name":"constant","symbols":{"BinaryOp":"f","BitLen":"f","Bool":"c","BoolVal":"f","Bytes":"f","Compare":"f","Complex":"c","Denom":"f","Float":"c","Float32Val":"f","Float64Val":"f","Imag":"f","Int":"c","Int64Val":"f","Kind":"t","Kind.String":"m","Make":"f","MakeBool":"f","MakeFloat64":"f","MakeFromBytes":"f","MakeFromLiteral":"f","MakeImag":"f","MakeInt64":"f","MakeString":"f","MakeUint64":"f","MakeUnknown":"f","Num":"f","Real":"f","Shift":"f","Sign":"f","String":"c","StringLen":"f","StringVal":"f","ToComplex":"f","ToFloat":"f","ToInt":"f","Uint64Val":"f","UnaryOp":"f","Unknown":"c","Val":"f","Value":"t"}},"go/doc":{"path":"go/doc","name":"doc","symbols":{"AllDecls":"c","AllMethods":"c","Example":"t","Examples":"f","Filter":"t","Func":"t","IllegalPrefixes":"v","IsPredeclared":"f","Mode":"t","New":"f","NewFromFiles":"f","Note":"t","Package":"t","Package.Filter":"m","Package.HTML":"m","Package.Markdown":"m","Package.Parser":"m","Package.Printer":"m","Package.Synopsis":"m","Package.Text":"m","PreserveAST":"c","Synopsis":"f","ToHTML":"f","ToText":"f","Type":"t","Value":"t"}},"go/doc/comment":{"path":"go/doc/comment","name":"comment","symbols":{"Block":"t","Code":"t","DefaultLookupPackage":"f","Doc":"t","DocLink":"t","DocLink.DefaultURL":"m","Heading":"t","Heading.DefaultID":"m","Italic":"t","Link":"t","LinkDef":"t","List":"t","List.BlankBefore":"m","List.BlankBetween":"m","ListItem":"t","Paragraph":"t","Parser":"t","Parser.Parse":"m","Plain":"t","Printer":"t","Printer.Comment":"m","Printer.HTML":"m","Printer.Markdown":"m","Printer.Text":"m","Text":"t"}},"go/format":{"path":"go/format","name":"format","symbols":{"Node":"f","Source":"f"}},"go/importer":{"path":"go/importer","name":"importer","symbols":{"Default":"f","For":"f","ForCompiler":"f","Lookup":"t"}},"go/parser":{"path":"go/parser","name":"parser","symbols":{"AllErrors":"c","DeclarationErrors":"c","ImportsOnly":"c","Mode":"t","PackageClauseOnly":"c","ParseComments":"c","ParseDir":"f","ParseExpr":"f","ParseExprFrom":"f","ParseFile":"f","SkipObjectResolution":"c","SpuriousErrors":"c","Trace":"c"}},"go/printer":{"path":"go/printer","name":"printer","symbols":{"CommentedNode":"t","Config":"t","Config.Fprint":"m","Fprint":"f","Mode":"t","RawFormat":"c","SourcePos":"c","TabIndent":"c","UseSpaces":"c"}},"go/scanner":{"path":"go/scanner","name":"scanner","symbols":{"Error":"t","Error.Error":"m","ErrorHandler":"t","ErrorList":"t","ErrorList.Add":"m","ErrorList.Err":"m","ErrorList.Error":"m","ErrorList.Len":"m","ErrorList.Less":"m","ErrorList.RemoveMultiples":"m","ErrorList.Reset":"m","ErrorList.Sort":"m","ErrorList.Swap":"m","Mode":"t","PrintError":"f","ScanComments":"c","Scanner":"t","Scanner.End":"m","Scanner.Init":"m","Scanner.Scan":"m"}},"go/token":{"path":"go/token","name":"token","symbols":{"ADD":"c","ADD_ASSIGN":"c","AND":"c","AND_ASSIGN":"c","AND_NOT":"c","AND_NOT_ASSIGN":"c","ARROW":"c","ASSIGN":"c","BREAK":"c","CASE":"c","CHAN":"c","CHAR":"c","COLON":"c","COMMA":"c","COMMENT":"c","CONST":"c","CONTINUE":"c","DEC":"c","DEFAULT":"c","DEFER":"c","DEFINE":"c","ELLIPSIS":"c","ELSE":"c","EOF":"c","EQL":"c","FALLTHROUGH":"c","FLOAT":"c","FOR":"c","FUNC":"c","File":"t","File.AddLine":"m","File.AddLineColumnInfo":"m","File.AddLineInfo":"m","File.Base":"m","File.End":"m","File.Line":"m","File.LineCount":"m","File.LineStart":"m","File.Lines":"m","File.MergeLine":"m","File.Name":"m","File.Offset":"m","File.Pos":"m","File.Position":"m","File.PositionFor":"m","File.SetLines":"m","File.SetLinesForContent":"m","File.Size":"m","File.String":"m","FileSet":"t","FileSet.AddExistingFiles":"m","FileSet.AddFile":"m","FileSet.Base":"m","FileSet.File":"m","FileSet.Iterate":"m","FileSet.Position":"m","FileSet.PositionFor":"m","FileSet.Read":"m","FileSet.RemoveFile":"m","FileSet.Write":"m","GEQ":"c","GO":"c","GOTO":"c","GTR":"c","HighestPrec":"c","IDENT":"c","IF":"c","ILLEGAL":"c","IMAG":"c","IMPORT":"c","INC":"c","INT":"c","INTERFACE":"c","IsExported":"f","IsIdentifier":"f","IsKeyword":"f","LAND":"c","LBRACE":"c","LBRACK":"c","LEQ":"c","LOR":"c","LPAREN":"c","LSS":"c","Lookup":"f","LowestPrec":"c","MAP":"c","MUL":"c","MUL_ASSIGN":"c","NEQ":"c","NOT":"c","NewFileSet":"f","NoPos":"c","OR":"c","OR_ASSIGN":"c","PACKAGE":"c","PERIOD":"c","Pos":"t","Pos.IsValid":"m","Position":"t","Position.IsValid":"m","Position.String":"m","QUO":"c","QUO_ASSIGN":"c","RANGE":"c","RBRACE":"c","RBRACK":"c","REM":"c","REM_ASSIGN":"c","RETURN":"c","RPAREN":"c","SELECT":"c","SEMICOLON":"c","SHL":"c","SHL_ASSIGN":"c","SHR":"c","SHR_ASSIGN":"c","STRING":"c","STRUCT":"c","SUB":"c","SUB_ASSIGN":"c","SWITCH":"c","TILDE":"c","TYPE":"c","Token":"t","Token.IsKeyword":"m","Token.IsLiteral":"m","Token.IsOperator":"m","Token.Precedence":"m","Token.String":"m","UnaryPrec":"c","VAR":"c","XOR":"c","XOR_ASSIGN":"c"}},"go/types":{"path":"go/types","name":"types","symbols":{"Alias":"t","Alias.Obj":"m","Alias.Origin":"m","Alias.Rhs":"m","Alias.SetTypeParams":"m","Alias.String":"m","Alias.TypeArgs":"m","Alias.TypeParams":"m","Alias.Underlying":"m","ArgumentError":"t","ArgumentError.Error":"m","ArgumentError.Unwrap":"m","Array":"t","Array.Elem":"m","Array.Len":"m","Array.String":"m","Array.Underlying":"m","AssertableTo":"f","AssignableTo":"f","Basic":"t","Basic.Info":"m","Basic.Kind":"m","Basic.Name":"m","Basic.String":"m","Basic.Underlying":"m","BasicInfo":"t","BasicKind":"t","Bool":"c","Builtin":"t","Builtin.String":"m","Byte":"c","Chan":"t","Chan.Dir":"m","Chan.Elem":"m","Chan.String":"m","Chan.Underlying":"m","ChanDir":"t","CheckExpr":"f","Checker":"t","Checker.Files":"m","Comparable":"f","Complex128":"c","Complex64":"c","Config":"t","Config.Check":"m","Const":"t","Const.String":"m","Const.Val":"m","Context":"t","ConvertibleTo":"f","DefPredeclaredTestFuncs":"f","Default":"f","Error":"t","Error.Error":"m","Eval":"f","ExprString":"f","FieldVal":"c","FieldVar":"c","Float32":"c","Float64":"c","Func":"t","Func.FullName":"m","Func.Origin":"m","Func.Pkg":"m","Func.Scope":"m","Func.Signature":"m","Func.String":"m","Hasher":"t","Hasher.Equal":"m","Hasher.Hash":"m","HasherIgnoreTags":"t","HasherIgnoreTags.Equal":"m","HasherIgnoreTags.Hash":"m","Id":"f","Identical":"f","IdenticalIgnoreTags":"f","Implements":"f","ImportMode":"t","Importer":"t","ImporterFrom":"t","Info":"t","Info.ObjectOf":"m","Info.PkgNameOf":"m","Info.TypeOf":"m","Initializer":"t","Initializer.String":"m","Instance":"t","Instance.String":"m","Instantiate":"f","Int":"c","Int16":"c","Int32":"c","Int64":"c","Int8":"c","Interface":"t","Interface.Complete":"m","Interface.Embedded":"m","Interface.EmbeddedType":"m","Interface.EmbeddedTypes":"m","Interface.Empty":"m","Interface.ExplicitMethod":"m","Interface.ExplicitMethods":"m","Interface.IsComparable":"m","Interface.IsImplicit":"m","Interface.IsMethodSet":"m","Interface.MarkImplicit":"m","Interface.Method":"m","Interface.Methods":"m","Interface.NumEmbeddeds":"m","Interface.NumExplicitMethods":"m","Interface.NumMethods":"m","Interface.String":"m","Interface.Underlying":"m","Invalid":"c","IsBoolean":"c","IsComplex":"c","IsConstType":"c","IsFloat":"c","IsInteger":"c","IsInterface":"f","IsNumeric":"c","IsOrdered":"c","IsString":"c","IsUnsigned":"c","IsUntyped":"c","Label":"t","Label.String":"m","LocalVar":"c","LookupFieldOrMethod":"f","LookupSelection":"f","Map":"t","Map.Elem":"m","Map.Key":"m","Map.String":"m","Map.Underlying":"m","MethodExpr":"c","MethodSet":"t","MethodSet.At":"m","MethodSet.Len":"m","MethodSet.Lookup":"m","MethodSet.Methods":"m","MethodSet.String":"m","MethodVal":"c","MissingMethod":"f","Named":"t","Named.AddMethod":"m","Named.Method":"m","Named.Methods":"m","Named.NumMethods":"m","Named.Obj":"m","Named.Origin":"m","Named.SetTypeParams":"m","Named.SetUnderlying":"m","Named.String":"m","Named.TypeArgs":"m","Named.TypeParams":"m","Named.Underlying":"m","NewAlias":"f","NewArray":"f","NewChan":"f","NewChecker":"f","NewConst":"f","NewContext":"f","NewField":"f","NewFunc":"f","NewInterface":"f","NewInterfaceType":"f","NewLabel":"f","NewMap":"f","NewMethodSet":"f","NewNamed":"f","NewPackage":"f","NewParam":"f","NewPkgName":"f","NewPointer":"f","NewScope":"f","NewSignature":"f","NewSignatureType":"f","NewSlice":"f","NewStruct":"f","NewTerm":"f","NewTuple":"f","NewTypeName":"f","NewTypeParam":"f","NewUnion":"f","NewVar":"f","Nil":"t","Nil.String":"m","Object":"t","ObjectString":"f","Package":"t","Package.Complete":"m","Package.GoVersion":"m","Package.Imports":"m","Package.MarkComplete":"m","Package.Name":"m","Package.Path":"m","Package.Scope":"m","Package.SetImports":"m","Package.SetName":"m","Package.String":"m","PackageVar":"c","ParamVar":"c","PkgName":"t","PkgName.Imported":"m","PkgName.String":"m","Pointer":"t","Pointer.Elem":"m","Pointer.String":"m","Pointer.Underlying":"m","Qualifier":"t","RecvOnly":"c","RecvVar":"c","RelativeTo":"f","ResultVar":"c","Rune":"c","Satisfies":"f","Scope":"t","Scope.Child":"m","Scope.Children":"m","Scope.Contains":"m","Scope.End":"m","Scope.Innermost":"m","Scope.Insert":"m","Scope.Len":"m","Scope.Lookup":"m","Scope.LookupParent":"m","Scope.Names":"m","Scope.NumChildren":"m","Scope.Parent":"m","Scope.Pos":"m","Scope.String":"m","Scope.WriteTo":"m","Selection":"t","Selection.Index":"m","Selection.Indirect":"m","Selection.Kind":"m","Selection.Obj":"m","Selection.Recv":"m","Selection.String":"m","Selection.Type":"m","SelectionKind":"t","SelectionString":"f","SendOnly":"c","SendRecv":"c","Signature":"t","Signature.Params":"m","Signature.Recv":"m","Signature.RecvTypeParams":"m","Signature.Results":"m","Signature.String":"m","Signature.TypeParams":"m","Signature.Underlying":"m","Signature.Variadic":"m","Sizes":"t","SizesFor":"f","Slice":"t","Slice.Elem":"m","Slice.String":"m","Slice.Underlying":"m","StdSizes":"t","StdSizes.Alignof":"m","StdSizes.Offsetsof":"m","StdSizes.Sizeof":"m","String":"c","Struct":"t","Struct.Field":"m","Struct.Fields":"m","Struct.NumFields":"m","Struct.String":"m","Struct.Tag":"m","Struct.Underlying":"m","Term":"t","Term.String":"m","Term.Tilde":"m","Term.Type":"m","Tuple":"t","Tuple.At":"m","Tuple.Len":"m","Tuple.String":"m","Tuple.Underlying":"m","Tuple.Variables":"m","Typ":"v","Type":"t","TypeAndValue":"t","TypeAndValue.Addressable":"m","TypeAndValue.Assignable":"m","TypeAndValue.HasOk":"m","TypeAndValue.IsBuiltin":"m","TypeAndValue.IsNil":"m","TypeAndValue.IsType":"m","TypeAndValue.IsValue":"m","TypeAndValue.IsVoid":"m","TypeList":"t","TypeList.At":"m","TypeList.Len":"m","TypeList.String":"m","TypeList.Types":"m","TypeName":"t","TypeName.IsAlias":"m","TypeName.String":"m","TypeParam":"t","TypeParam.Constraint":"m","TypeParam.Index":"m","TypeParam.Obj":"m","TypeParam.SetConstraint":"m","TypeParam.String":"m","TypeParam.Underlying":"m","TypeParamList":"t","TypeParamList.At":"m","TypeParamList.Len":"m","TypeParamList.String":"m","TypeParamList.TypeParams":"m","TypeString":"f","Uint":"c","Uint16":"c","Uint32":"c","Uint64":"c","Uint8":"c","Uintptr":"c","Unalias":"f","Union":"t","Union.Len":"m","Union.String":"m","Union.Term":"m","Union.Terms":"m","Union.Underlying":"m","Universe":"v","Unsafe":"v","UnsafePointer":"c","UntypedBool":"c","UntypedComplex":"c","UntypedFloat":"c","UntypedInt":"c","UntypedNil":"c","UntypedRune":"c","UntypedString":"c","Var":"t","Var.Anonymous":"m","Var.Embedded":"m","Var.IsField":"m","Var.Kind":"m","Var.Origin":"m","Var.SetKind":"m","Var.String":"m","VarKind":"t","VarKind.String":"m","WriteExpr":"f","WriteSignature":"f","WriteType":"f"}},"go/version":{"path":"go/version","name":"version","symbols":{"Compare":"f","IsValid":"f","Lang":"f"}},"hash":{"path":"hash","name":"hash","symbols":{"Cloner":"t","Hash":"t","Hash32":"t","Hash64":"t","XOF":"t"}},"hash/adler32":{"path":"hash/adler32","name":"adler32","symbols":{"Checksum":"f","New":"f","Size":"c"}},"hash/crc32":{"path":"hash/crc32","name":"crc32","symbols":{"Castagnoli":"c","Checksum":"f","ChecksumIEEE":"f","IEEE":"c","IEEETable":"v","Koopman":"c","MakeTable":"f","New":"f","NewIEEE":"f","Size":"c","Table":"t","Update":"f"}},"hash/crc64":{"path":"hash/crc64","name":"crc64","symbols":{"Checksum":"f","ECMA":"c","ISO":"c","MakeTable":"f","New":"f","Size":"c","Table":"t","Update":"f"}},"hash/fnv":{"path":"hash/fnv","name":"fnv","symbols":{"New128":"f","New128a":"f","New32":"f","New32a":"f","New64":"f","New64a":"f"}},"hash/maphash":{"path":"hash/maphash","name":"maphash","symbols":{"Bytes":"f","Comparable":"f","ComparableHasher":"t","Hash":"t","Hash.BlockSize":"m","Hash.Clone":"m","Hash.Reset":"m","Hash.Seed":"m","Hash.SetSeed":"m","Hash.Size":"m","Hash.Sum":"m","Hash.Sum64":"m","Hash.Write":"m","Hash.WriteByte":"m","Hash.WriteString":"m","Hasher":"t","MakeSeed":"f","Seed":"t","String":"f","WriteComparable":"f"}},"html":{"path":"html","name":"html","symbols":{"EscapeString":"f","UnescapeString":"f"}},"html/template":{"path":"html/template","name":"template","symbols":{"CSS":"t","ErrAmbigContext":"c","ErrBadHTML":"c","ErrBranchEnd":"c","ErrEndContext":"c","ErrJSTemplate":"c","ErrNoSuchTemplate":"c","ErrOutputContext":"c","ErrPartialCharset":"c","ErrPartialEscape":"c","ErrPredefinedEscaper":"c","ErrRangeLoopReentry":"c","ErrSlashAmbig":"c","Error":"t","Error.Error":"m","ErrorCode":"t","FuncMap":"t","HTML":"t","HTMLAttr":"t","HTMLEscape":"f","HTMLEscapeString":"f","HTMLEscaper":"f","IsTrue":"f","JS":"t","JSEscape":"f","JSEscapeString":"f","JSEscaper":"f","JSStr":"t","Must":"f","New":"f","OK":"c","ParseFS":"f","ParseFiles":"f","ParseGlob":"f","Srcset":"t","Template":"t","Template.AddParseTree":"m","Template.Clone":"m","Template.DefinedTemplates":"m","Template.Delims":"m","Template.Execute":"m","Template.ExecuteTemplate":"m","Template.Funcs":"m","Template.Lookup":"m","Template.Name":"m","Template.New":"m","Template.Option":"m","Template.Parse":"m","Template.ParseFS":"m","Template.ParseFiles":"m","Template.ParseGlob":"m","Template.Templates":"m","URL":"t","URLQueryEscaper":"f"}},"image":{"path":"image","name":"image","symbols":{"Alpha":"t","Alpha.AlphaAt":"m","Alpha.At":"m","Alpha.Bounds":"m","Alpha.ColorModel":"m","Alpha.Opaque":"m","Alpha.PixOffset":"m","Alpha.RGBA64At":"m","Alpha.Set":"m","Alpha.SetAlpha":"m","Alpha.SetRGBA64":"m","Alpha.SubImage":"m","Alpha16":"t","Alpha16.Alpha16At":"m","Alpha16.At":"m","Alpha16.Bounds":"m","Alpha16.ColorModel":"m","Alpha16.Opaque":"m","Alpha16.PixOffset":"m","Alpha16.RGBA64At":"m","Alpha16.Set":"m","Alpha16.SetAlpha16":"m","Alpha16.SetRGBA64":"m","Alpha16.SubImage":"m","Black":"v","CMYK":"t","CMYK.At":"m","CMYK.Bounds":"m","CMYK.CMYKAt":"m","CMYK.ColorModel":"m","CMYK.Opaque":"m","CMYK.PixOffset":"m","CMYK.RGBA64At":"m","CMYK.Set":"m","CMYK.SetCMYK":"m","CMYK.SetRGBA64":"m","CMYK.SubImage":"m","Config":"t","Decode":"f","DecodeConfig":"f","ErrFormat":"v","Gray":"t","Gray.At":"m","Gray.Bounds":"m","Gray.ColorModel":"m","Gray.GrayAt":"m","Gray.Opaque":"m","Gray.PixOffset":"m","Gray.RGBA64At":"m","Gray.Set":"m","Gray.SetGray":"m","Gray.SetRGBA64":"m","Gray.SubImage":"m","Gray16":"t","Gray16.At":"m","Gray16.Bounds":"m","Gray16.ColorModel":"m","Gray16.Gray16At":"m","Gray16.Opaque":"m","Gray16.PixOffset":"m","Gray16.RGBA64At":"m","Gray16.Set":"m","Gray16.SetGray16":"m","Gray16.SetRGBA64":"m","Gray16.SubImage":"m","Image":"t","NRGBA":"t","NRGBA.At":"m","NRGBA.Bounds":"m","NRGBA.ColorModel":"m","NRGBA.NRGBAAt":"m","NRGBA.Opaque":"m","NRGBA.PixOffset":"m","NRGBA.RGBA64At":"m","NRGBA.Set":"m","NRGBA.SetNRGBA":"m","NRGBA.SetRGBA64":"m","NRGBA.SubImage":"m","NRGBA64":"t","NRGBA64.At":"m","NRGBA64.Bounds":"m","NRGBA64.ColorModel":"m","NRGBA64.NRGBA64At":"m","NRGBA64.Opaque":"m","NRGBA64.PixOffset":"m","NRGBA64.RGBA64At":"m","NRGBA64.Set":"m","NRGBA64.SetNRGBA64":"m","NRGBA64.SetRGBA64":"m","NRGBA64.SubImage":"m","NYCbCrA":"t","NYCbCrA.AOffset":"m","NYCbCrA.At":"m","NYCbCrA.ColorModel":"m","NYCbCrA.NYCbCrAAt":"m","NYCbCrA.Opaque":"m","NYCbCrA.RGBA64At":"m","NYCbCrA.SubImage":"m","NewAlpha":"f","NewAlpha16":"f","NewCMYK":"f","NewGray":"f","NewGray16":"f","NewNRGBA":"f","NewNRGBA64":"f","NewNYCbCrA":"f","NewPaletted":"f","NewRGBA":"f","NewRGBA64":"f","NewUniform":"f","NewYCbCr":"f","Opaque":"v","Paletted":"t","Paletted.At":"m","Paletted.Bounds":"m","Paletted.ColorIndexAt":"m","Paletted.ColorModel":"m","Paletted.Opaque":"m","Paletted.PixOffset":"m","Paletted.RGBA64At":"m","Paletted.Set":"m","Paletted.SetColorIndex":"m","Paletted.SetRGBA64":"m","Paletted.SubImage":"m","PalettedImage":"t","Point":"t","Point.Add":"m","Point.Div":"m","Point.Eq":"m","Point.In":"m","Point.Mod":"m","Point.Mul":"m","Point.String":"m","Point.Sub":"m","Pt":"f","RGBA":"t","RGBA.At":"m","RGBA.Bounds":"m","RGBA.ColorModel":"m","RGBA.Opaque":"m","RGBA.PixOffset":"m","RGBA.RGBA64At":"m","RGBA.RGBAAt":"m","RGBA.Set":"m","RGBA.SetRGBA":"m","RGBA.SetRGBA64":"m","RGBA.SubImage":"m","RGBA64":"t","RGBA64.At":"m","RGBA64.Bounds":"m","RGBA64.ColorModel":"m","RGBA64.Opaque":"m","RGBA64.PixOffset":"m","RGBA64.RGBA64At":"m","RGBA64.Set":"m","RGBA64.SetRGBA64":"m","RGBA64.SubImage":"m","RGBA64Image":"t","Rect":"f","Rectangle":"t","Rectangle.Add":"m","Rectangle.At":"m","Rectangle.Bounds":"m","Rectangle.Canon":"m","Rectangle.ColorModel":"m","Rectangle.Dx":"m","Rectangle.Dy":"m","Rectangle.Empty":"m","Rectangle.Eq":"m","Rectangle.In":"m","Rectangle.Inset":"m","Rectangle.Intersect":"m","Rectangle.Overlaps":"m","Rectangle.RGBA64At":"m","Rectangle.Size":"m","Rectangle.String":"m","Rectangle.Sub":"m","Rectangle.Union":"m","RegisterFormat":"f","Transparent":"v","Uniform":"t","Uniform.At":"m","Uniform.Bounds":"m","Uniform.ColorModel":"m","Uniform.Convert":"m","Uniform.Opaque":"m","Uniform.RGBA":"m","Uniform.RGBA64At":"m","White":"v","YCbCr":"t","YCbCr.At":"m","YCbCr.Bounds":"m","YCbCr.COffset":"m","YCbCr.ColorModel":"m","YCbCr.Opaque":"m","YCbCr.RGBA64At":"m","YCbCr.SubImage":"m","YCbCr.YCbCrAt":"m","YCbCr.YOffset":"m","YCbCrSubsampleRatio":"t","YCbCrSubsampleRatio.String":"m","YCbCrSubsampleRatio410":"c","YCbCrSubsampleRatio411":"c","YCbCrSubsampleRatio420":"c","YCbCrSubsampleRatio422":"c","YCbCrSubsampleRatio440":"c","YCbCrSubsampleRatio444":"c","ZP":"v","ZR":"v"}},"image/color":{"path":"image/color","name":"color","symbols":{"Alpha":"t","Alpha.RGBA":"m","Alpha16":"t","Alpha16.RGBA":"m","Alpha16Model":"v","AlphaModel":"v","Black":"v","CMYK":"t","CMYK.RGBA":"m","CMYKModel":"v","CMYKToRGB":"f","Color":"t","Gray":"t","Gray.RGBA":"m","Gray16":"t","Gray16.RGBA":"m","Gray16Model":"v","GrayModel":"v","Model":"t","ModelFunc":"f","NRGBA":"t","NRGBA.RGBA":"m","NRGBA64":"t","NRGBA64.RGBA":"m","NRGBA64Model":"v","NRGBAModel":"v","NYCbCrA":"t","NYCbCrA.RGBA":"m","NYCbCrAModel":"v","Opaque":"v","Palette":"t","Palette.Convert":"m","Palette.Index":"m","RGBA":"t","RGBA.RGBA":"m","RGBA64":"t","RGBA64.RGBA":"m","RGBA64Model":"v","RGBAModel":"v","RGBToCMYK":"f","RGBToYCbCr":"f","Transparent":"v","White":"v","YCbCr":"t","YCbCr.RGBA":"m","YCbCrModel":"v","YCbCrToRGB":"f"}},"image/color/palette":{"path":"image/color/palette","name":"palette","symbols":{"Plan9":"v","WebSafe":"v"}},"image/draw":{"path":"image/draw","name":"draw","symbols":{"Draw":"f","DrawMask":"f","Drawer":"t","FloydSteinberg":"v","Image":"t","Op":"t","Op.Draw":"m","Over":"c","Quantizer":"t","RGBA64Image":"t","Src":"c"}},"image/gif":{"path":"image/gif","name":"gif","symbols":{"Decode":"f","DecodeAll":"f","DecodeConfig":"f","DisposalBackground":"c","DisposalNone":"c","DisposalPrevious":"c","Encode":"f","EncodeAll":"f","GIF":"t","Options":"t"}},"image/jpeg":{"path":"image/jpeg","name":"jpeg","symbols":{"Decode":"f","DecodeConfig":"f","DefaultQuality":"c","Encode":"f","FormatError":"t","FormatError.Error":"m","Options":"t","Reader":"t","UnsupportedError":"t","UnsupportedError.Error":"m"}},"image/png":{"path":"image/png","name":"png","symbols":{"BestCompression":"c","BestSpeed":"c","CompressionLevel":"t","Decode":"f","DecodeConfig":"f","DefaultCompression":"c","Encode":"f","Encoder":"t","Encoder.Encode":"m","EncoderBuffer":"t","EncoderBufferPool":"t","FormatError":"t","FormatError.Error":"m","NoCompression":"c","UnsupportedError":"t","UnsupportedError.Error":"m"}},"index/suffixarray":{"path":"index/suffixarray","name":"suffixarray","symbols":{"Index":"t","Index.Bytes":"m","Index.FindAllIndex":"m","Index.Lookup":"m","Index.Read":"m","Index.Write":"m","New":"f"}},"io":{"path":"io","name":"io","symbols":{"ByteReader":"t","ByteScanner":"t","ByteWriter":"t","Closer":"t","Copy":"f","CopyBuffer":"f","CopyN":"f","Discard":"v","EOF":"v","ErrClosedPipe":"v","ErrNoProgress":"v","ErrShortBuffer":"v","ErrShortWrite":"v","ErrUnexpectedEOF":"v","LimitReader":"f","LimitedReader":"t","LimitedReader.Read":"m","MultiReader":"f","MultiWriter":"f","NewOffsetWriter":"f","NewSectionReader":"f","NopCloser":"f","OffsetWriter":"t","OffsetWriter.Seek":"m","OffsetWriter.Write":"m","OffsetWriter.WriteAt":"m","Pipe":"f","PipeReader":"t","PipeReader.Close":"m","PipeReader.CloseWithError":"m","PipeReader.Read":"m","PipeWriter":"t","PipeWriter.Close":"m","PipeWriter.CloseWithError":"m","PipeWriter.Write":"m","ReadAll":"f","ReadAtLeast":"f","ReadCloser":"t","ReadFull":"f","ReadSeekCloser":"t","ReadSeeker":"t","ReadWriteCloser":"t","ReadWriteSeeker":"t","ReadWriter":"t","Reader":"t","ReaderAt":"t","ReaderFrom":"t","RuneReader":"t","RuneScanner":"t","SectionReader":"t","SectionReader.Outer":"m","SectionReader.Read":"m","SectionReader.ReadAt":"m","SectionReader.Seek":"m","SectionReader.Size":"m","SeekCurrent":"c","SeekEnd":"c","SeekStart":"c","Seeker":"t","StringWriter":"t","TeeReader":"f","WriteCloser":"t","WriteSeeker":"t","WriteString":"f","Writer":"t","WriterAt":"t","WriterTo":"t"}},"io/fs":{"path":"io/fs","name":"fs","symbols":{"DirEntry":"t","ErrClosed":"v","ErrExist":"v","ErrInvalid":"v","ErrNotExist":"v","ErrPermission":"v","FS":"t","File":"t","FileInfo":"t","FileInfoToDirEntry":"f","FileMode":"t","FileMode.IsDir":"m","FileMode.IsRegular":"m","FileMode.Perm":"m","FileMode.String":"m","FileMode.Type":"m","FormatDirEntry":"f","FormatFileInfo":"f","Glob":"f","GlobFS":"t","Lstat":"f","ModeAppend":"c","ModeCharDevice":"c","ModeDevice":"c","ModeDir":"c","ModeExclusive":"c","ModeIrregular":"c","ModeNamedPipe":"c","ModePerm":"c","ModeSetgid":"c","ModeSetuid":"c","ModeSocket":"c","ModeSticky":"c","ModeSymlink":"c","ModeTemporary":"c","ModeType":"c","PathError":"t","PathError.Error":"m","PathError.Timeout":"m","PathError.Unwrap":"m","ReadDir":"f","ReadDirFS":"t","ReadDirFile":"t","ReadFile":"f","ReadFileFS":"t","ReadLink":"f","ReadLinkFS":"t","SkipAll":"v","SkipDir":"v","Stat":"f","StatFS":"t","Sub":"f","SubFS":"t","ValidPath":"f","WalkDir":"f","WalkDirFunc":"t"}},"io/ioutil":{"path":"io/ioutil","name":"ioutil","symbols":{"Discard":"v","NopCloser":"f","ReadAll":"f","ReadDir":"f","ReadFile":"f","TempDir":"f","TempFile":"f","WriteFile":"f"}},"iter":{"path":"iter","name":"iter","symbols":{"Pull":"f","Pull2":"f","Seq":"t","Seq2":"t"}},"log":{"path":"log","name":"log","symbols":{"Default":"f","Fatal":"f","Fatalf":"f","Fatalln":"f","Flags":"f","LUTC":"c","Ldate":"c","Llongfile":"c","Lmicroseconds":"c","Lmsgprefix":"c","Logger":"t","Logger.Fatal":"m","Logger.Fatalf":"m","Logger.Fatalln":"m","Logger.Flags":"m","Logger.Output":"m","Logger.Panic":"m","Logger.Panicf":"m","Logger.Panicln":"m","Logger.Prefix":"m","Logger.Print":"m","Logger.Printf":"m","Logger.Println":"m","Logger.SetFlags":"m","Logger.SetOutput":"m","Logger.SetPrefix":"m","Logger.Writer":"m","Lshortfile":"c","LstdFlags":"c","Ltime":"c","New":"f","Output":"f","Panic":"f","Panicf":"f","Panicln":"f","Prefix":"f","Print":"f","Printf":"f","Println":"f","SetFlags":"f","SetOutput":"f","SetPrefix":"f","Writer":"f"}},"log/slog":{"path":"log/slog","name":"slog","symbols":{"Any":"f","AnyValue":"f","Attr":"t","Attr.Equal":"m","Attr.String":"m","Bool":"f","BoolValue":"f","Debug":"f","DebugContext":"f","Default":"f","DiscardHandler":"v","Duration":"f","DurationValue":"f","Error":"f","ErrorContext":"f","Float64":"f","Float64Value":"f","Group":"f","GroupAttrs":"f","GroupValue":"f","Handler":"t","HandlerOptions":"t","Info":"f","InfoContext":"f","Int":"f","Int64":"f","Int64Value":"f","IntValue":"f","JSONHandler":"t","JSONHandler.Enabled":"m","JSONHandler.Handle":"m","JSONHandler.WithAttrs":"m","JSONHandler.WithGroup":"m","Kind":"t","Kind.String":"m","KindAny":"c","KindBool":"c","KindDuration":"c","KindFloat64":"c","KindGroup":"c","KindInt64":"c","KindLogValuer":"c","KindString":"c","KindTime":"c","KindUint64":"c","Level":"t","Level.AppendText":"m","Level.Level":"m","Level.MarshalJSON":"m","Level.MarshalText":"m","Level.String":"m","Level.UnmarshalJSON":"m","Level.UnmarshalText":"m","LevelDebug":"c","LevelError":"c","LevelInfo":"c","LevelKey":"c","LevelVar":"t","LevelVar.AppendText":"m","LevelVar.Level":"m","LevelVar.MarshalText":"m","LevelVar.Set":"m","LevelVar.String":"m","LevelVar.UnmarshalText":"m","LevelWarn":"c","Leveler":"t","Log":"f","LogAttrs":"f","LogValuer":"t","Logger":"t","Logger.Debug":"m","Logger.DebugContext":"m","Logger.Enabled":"m","Logger.Error":"m","Logger.ErrorContext":"m","Logger.Handler":"m","Logger.Info":"m","Logger.InfoContext":"m","Logger.Log":"m","Logger.LogAttrs":"m","Logger.Warn":"m","Logger.WarnContext":"m","Logger.With":"m","Logger.WithGroup":"m","MessageKey":"c","MultiHandler":"t","MultiHandler.Enabled":"m","MultiHandler.Handle":"m","MultiHandler.WithAttrs":"m","MultiHandler.WithGroup":"m","New":"f","NewJSONHandler":"f","NewLogLogger":"f","NewMultiHandler":"f","NewRecord":"f","NewTextHandler":"f","Record":"t","Record.Add":"m","Record.AddAttrs":"m","Record.Attrs":"m","Record.Clone":"m","Record.NumAttrs":"m","Record.Source":"m","SetDefault":"f","SetLogLoggerLevel":"f","Source":"t","SourceKey":"c","String":"f","StringValue":"f","TextHandler":"t","TextHandler.Enabled":"m","TextHandler.Handle":"m","TextHandler.WithAttrs":"m","TextHandler.WithGroup":"m","Time":"f","TimeKey":"c","TimeValue":"f","Uint64":"f","Uint64Value":"f","Value":"t","Value.Any":"m","Value.Bool":"m","Value.Duration":"m","Value.Equal":"m","Value.Float64":"m","Value.Group":"m","Value.Int64":"m","Value.Kind":"m","Value.LogValuer":"m","Value.Resolve":"m","Value.String":"m","Value.Time":"m","Value.Uint64":"m","Warn":"f","WarnContext":"f","With":"f"}},"log/syslog":{"path":"log/syslog","name":"syslog","symbols":{"Dial":"f","LOG_ALERT":"c","LOG_AUTH":"c","LOG_AUTHPRIV":"c","LOG_CRIT":"c","LOG_CRON":"c","LOG_DAEMON":"c","LOG_DEBUG":"c","LOG_EMERG":"c","LOG_ERR":"c","LOG_FTP":"c","LOG_INFO":"c","LOG_KERN":"c","LOG_LOCAL0":"c","LOG_LOCAL1":"c","LOG_LOCAL2":"c","LOG_LOCAL3":"c","LOG_LOCAL4":"c","LOG_LOCAL5":"c","LOG_LOCAL6":"c","LOG_LOCAL7":"c","LOG_LPR":"c","LOG_MAIL":"c","LOG_NEWS":"c","LOG_NOTICE":"c","LOG_SYSLOG":"c","LOG_USER":"c","LOG_UUCP":"c","LOG_WARNING":"c","New":"f","NewLogger":"f","Priority":"t","Writer":"t","Writer.Alert":"m","Writer.Close":"m","Writer.Crit":"m","Writer.Debug":"m","Writer.Emerg":"m","Writer.Err":"m","Writer.Info":"m","Writer.Notice":"m","Writer.Warning":"m","Writer.Write":"m"}},"maps":{"path":"maps","name":"maps","symbols":{"All":"f","Clone":"f","Collect":"f","Copy":"f","DeleteFunc":"f","Equal":"f","EqualFunc":"f","Insert":"f","Keys":"f","Values":"f"}},"math":{"path":"math","name":"math","symbols":{"Abs":"f","Acos":"f","Acosh":"f","Asin":"f","Asinh":"f","Atan":"f","Atan2":"f","Atanh":"f","Cbrt":"f","Ceil":"f","Copysign":"f","Cos":"f","Cosh":"f","Dim":"f","E":"c","Erf":"f","Erfc":"f","Erfcinv":"f","Erfinv":"f","Exp":"f","Exp2":"f","Expm1":"f","FMA":"f","Float32bits":"f","Float32frombits":"f","Float64bits":"f","Float64frombits":"f","Floor":"f","Frexp":"f","Gamma":"f","Hypot":"f","Ilogb":"f","Inf":"f","IsInf":"f","IsNaN":"f","J0":"f","J1":"f","Jn":"f","Ldexp":"f","Lgamma":"f","Ln10":"c","Ln2":"c","Log":"f","Log10":"f","Log10E":"c","Log1p":"f","Log2":"f","Log2E":"c","Logb":"f","Max":"f","MaxFloat32":"c","MaxFloat64":"c","MaxInt":"c","MaxInt16":"c","MaxInt32":"c","MaxInt64":"c","MaxInt8":"c","MaxUint":"c","MaxUint16":"c","MaxUint32":"c","MaxUint64":"c","MaxUint8":"c","Min":"f","MinInt":"c","MinInt16":"c","MinInt32":"c","MinInt64":"c","MinInt8":"c","Mod":"f","Modf":"f","NaN":"f","Nextafter":"f","Nextafter32":"f","Phi":"c","Pi":"c","Pow":"f","Pow10":"f","Remainder":"f","Round":"f","RoundToEven":"f","Signbit":"f","Sin":"f","Sincos":"f","Sinh":"f","SmallestNonzeroFloat32":"c","SmallestNonzeroFloat64":"c","Sqrt":"f","Sqrt2":"c","SqrtE":"c","SqrtPhi":"c","SqrtPi":"c","Tan":"f","Tanh":"f","Trunc":"f","Y0":"f","Y1":"f","Yn":"f"}},"math/big":{"path":"math/big","name":"big","symbols":{"Above":"c","Accuracy":"t","Accuracy.String":"m","AwayFromZero":"c","Below":"c","Ceil":"c","ErrNaN":"t","ErrNaN.Error":"m","Exact":"c","Float":"t","Float.Abs":"m","Float.Acc":"m","Float.Add":"m","Float.Append":"m","Float.AppendText":"m","Float.Cmp":"m","Float.Copy":"m","Float.Float32":"m","Float.Float64":"m","Float.Format":"m","Float.GobDecode":"m","Float.GobEncode":"m","Float.Int":"m","Float.Int64":"m","Float.IsInf":"m","Float.IsInt":"m","Float.MantExp":"m","Float.MarshalText":"m","Float.MinPrec":"m","Float.Mode":"m","Float.Mul":"m","Float.Neg":"m","Float.Parse":"m","Float.Prec":"m","Float.Quo":"m","Float.Rat":"m","Float.Scan":"m","Float.Set":"m","Float.SetFloat64":"m","Float.SetInf":"m","Float.SetInt":"m","Float.SetInt64":"m","Float.SetMantExp":"m","Float.SetMode":"m","Float.SetPrec":"m","Float.SetRat":"m","Float.SetString":"m","Float.SetUint64":"m","Float.Sign":"m","Float.Signbit":"m","Float.Sqrt":"m","Float.String":"m","Float.Sub":"m","Float.Text":"m","Float.Uint64":"m","Float.UnmarshalText":"m","Floor":"c","Int":"t","Int.Abs":"m","Int.Add":"m","Int.And":"m","Int.AndNot":"m","Int.Append":"m","Int.AppendText":"m","Int.Binomial":"m","Int.Bit":"m","Int.BitLen":"m","Int.Bits":"m","Int.Bytes":"m","Int.Cmp":"m","Int.CmpAbs":"m","Int.Div":"m","Int.DivMod":"m","Int.Divide":"m","Int.Exp":"m","Int.FillBytes":"m","Int.Float64":"m","Int.Format":"m","Int.GCD":"m","Int.GobDecode":"m","Int.GobEncode":"m","Int.Int64":"m","Int.IsInt64":"m","Int.IsUint64":"m","Int.Lsh":"m","Int.MarshalJSON":"m","Int.MarshalText":"m","Int.Mod":"m","Int.ModInverse":"m","Int.ModSqrt":"m","Int.Mul":"m","Int.MulRange":"m","Int.Neg":"m","Int.Not":"m","Int.Or":"m","Int.ProbablyPrime":"m","Int.Quo":"m","Int.QuoRem":"m","Int.Rand":"m","Int.Rem":"m","Int.Rsh":"m","Int.Scan":"m","Int.Set":"m","Int.SetBit":"m","Int.SetBits":"m","Int.SetBytes":"m","Int.SetInt64":"m","Int.SetString":"m","Int.SetUint64":"m","Int.Sign":"m","Int.Sqrt":"m","Int.String":"m","Int.Sub":"m","Int.Text":"m","Int.TrailingZeroBits":"m","Int.Uint64":"m","Int.UnmarshalJSON":"m","Int.UnmarshalText":"m","Int.Xor":"m","Jacobi":"f","MaxBase":"c","MaxExp":"c","MaxPrec":"c","MinExp":"c","NewFloat":"f","NewInt":"f","NewRat":"f","ParseFloat":"f","Rat":"t","Rat.Abs":"m","Rat.Add":"m","Rat.AppendText":"m","Rat.Cmp":"m","Rat.Denom":"m","Rat.Float32":"m","Rat.Float64":"m","Rat.FloatPrec":"m","Rat.FloatString":"m","Rat.GobDecode":"m","Rat.GobEncode":"m","Rat.Inv":"m","Rat.IsInt":"m","Rat.MarshalText":"m","Rat.Mul":"m","Rat.Neg":"m","Rat.Num":"m","Rat.Quo":"m","Rat.RatString":"m","Rat.Scan":"m","Rat.Set":"m","Rat.SetFloat64":"m","Rat.SetFrac":"m","Rat.SetFrac64":"m","Rat.SetInt":"m","Rat.SetInt64":"m","Rat.SetString":"m","Rat.SetUint64":"m","Rat.Sign":"m","Rat.String":"m","Rat.Sub":"m","Rat.UnmarshalText":"m","Round":"c","RoundingMode":"t","RoundingMode.String":"m","ToNearestAway":"c","ToNearestEven":"c","ToNegativeInf":"c","ToPositiveInf":"c","ToZero":"c","Trunc":"c","Word":"t"}},"math/bits":{"path":"math/bits","name":"bits","symbols":{"Add":"f","Add32":"f","Add64":"f","Div":"f","Div32":"f","Div64":"f","LeadingZeros":"f","LeadingZeros16":"f","LeadingZeros32":"f","LeadingZeros64":"f","LeadingZeros8":"f","Len":"f","Len16":"f","Len32":"f","Len64":"f","Len8":"f","Mul":"f","Mul32":"f","Mul64":"f","OnesCount":"f","OnesCount16":"f","OnesCount32":"f","OnesCount64":"f","OnesCount8":"f","Rem":"f","Rem32":"f","Rem64":"f","Reverse":"f","Reverse16":"f","Reverse32":"f","Reverse64":"f","Reverse8":"f","ReverseBytes":"f","ReverseBytes16":"f","ReverseBytes32":"f","ReverseBytes64":"f","RotateLeft":"f","RotateLeft16":"f","RotateLeft32":"f","RotateLeft64":"f","RotateLeft8":"f","Sub":"f","Sub32":"f","Sub64":"f","TrailingZeros":"f","TrailingZeros16":"f","TrailingZeros32":"f","TrailingZeros64":"f","TrailingZeros8":"f","UintSize":"c"}},"math/cmplx":{"path":"math/cmplx","name":"cmplx","symbols":{"Abs":"f","Acos":"f","Acosh":"f","Asin":"f","Asinh":"f","Atan":"f","Atanh":"f","Conj":"f","Cos":"f","Cosh":"f","Cot":"f","Exp":"f","Inf":"f","IsInf":"f","IsNaN":"f","Log":"f","Log10":"f","NaN":"f","Phase":"f","Polar":"f","Pow":"f","Rect":"f","Sin":"f","Sinh":"f","Sqrt":"f","Tan":"f","Tanh":"f"}},"math/rand":{"path":"math/rand","name":"rand","symbols":{"ExpFloat64":"f","Float32":"f","Float64":"f","Int":"f","Int31":"f","Int31n":"f","Int63":"f","Int63n":"f","Intn":"f","New":"f","NewSource":"f","NewZipf":"f","NormFloat64":"f","Perm":"f","Rand":"t","Rand.ExpFloat64":"m","Rand.Float32":"m","Rand.Float64":"m","Rand.Int":"m","Rand.Int31":"m","Rand.Int31n":"m","Rand.Int63":"m","Rand.Int63n":"m","Rand.Intn":"m","Rand.NormFloat64":"m","Rand.Perm":"m","Rand.Read":"m","Rand.Seed":"m","Rand.Shuffle":"m","Rand.Uint32":"m","Rand.Uint64":"m","Read":"f","Seed":"f","Shuffle":"f","Source":"t","Source64":"t","Uint32":"f","Uint64":"f","Zipf":"t","Zipf.Uint64":"m"}},"math/rand/v2":{"path":"math/rand/v2","name":"rand","symbols":{"ChaCha8":"t","ChaCha8.AppendBinary":"m","ChaCha8.MarshalBinary":"m","ChaCha8.Read":"m","ChaCha8.Seed":"m","ChaCha8.Uint64":"m","ChaCha8.UnmarshalBinary":"m","ExpFloat64":"f","Float32":"f","Float64":"f","Int":"f","Int32":"f","Int32N":"f","Int64":"f","Int64N":"f","IntN":"f","N":"f","New":"f","NewChaCha8":"f","NewPCG":"f","NewZipf":"f","NormFloat64":"f","PCG":"t","PCG.AppendBinary":"m","PCG.MarshalBinary":"m","PCG.Seed":"m","PCG.Uint64":"m","PCG.UnmarshalBinary":"m","Perm":"f","Rand":"t","Rand.ExpFloat64":"m","Rand.Float32":"m","Rand.Float64":"m","Rand.Int":"m","Rand.Int32":"m","Rand.Int32N":"m","Rand.Int64":"m","Rand.Int64N":"m","Rand.IntN":"m","Rand.N":"m","Rand.NormFloat64":"m","Rand.Perm":"m","Rand.Shuffle":"m","Rand.Uint":"m","Rand.Uint32":"m","Rand.Uint32N":"m","Rand.Uint64":"m","Rand.Uint64N":"m","Rand.UintN":"m","Shuffle":"f","Source":"t","Uint":"f","Uint32":"f","Uint32N":"f","Uint64":"f","Uint64N":"f","UintN":"f","Zipf":"t","Zipf.Uint64":"m"}},"mime":{"path":"mime","name":"mime","symbols":{"AddExtensionType":"f","BEncoding":"c","ErrInvalidMediaParameter":"v","ExtensionsByType":"f","FormatMediaType":"f","ParseMediaType":"f","QEncoding":"c","TypeByExtension":"f","WordDecoder":"t","WordDecoder.Decode":"m","WordDecoder.DecodeHeader":"m","WordEncoder":"t","WordEncoder.Encode":"m"}},"mime/multipart":{"path":"mime/multipart","name":"multipart","symbols":{"ErrMessageTooLarge":"v","File":"t","FileContentDisposition":"f","FileHeader":"t","FileHeader.Open":"m","Form":"t","Form.RemoveAll":"m","NewReader":"f","NewWriter":"f","Part":"t","Part.Close":"m","Part.FileName":"m","Part.FormName":"m","Part.Read":"m","Reader":"t","Reader.NextPart":"m","Reader.NextRawPart":"m","Reader.ReadForm":"m","Writer":"t","Writer.Boundary":"m","Writer.Close":"m","Writer.CreateFormField":"m","Writer.CreateFormFile":"m","Writer.CreatePart":"m","Writer.FormDataContentType":"m","Writer.SetBoundary":"m","Writer.WriteField":"m"}},"mime/quotedprintable":{"path":"mime/quotedprintable","name":"quotedprintable","symbols":{"NewReader":"f","NewWriter":"f","Reader":"t","Reader.Read":"m","Writer":"t","Writer.Close":"m","Writer.Write":"m"}},"net":{"path":"net","name":"net","symbols":{"Addr":"t","AddrError":"t","AddrError.Error":"m","AddrError.Temporary":"m","AddrError.Timeout":"m","Buffers":"t","Buffers.Read":"m","Buffers.WriteTo":"m","CIDRMask":"f","Conn":"t","DNSConfigError":"t","DNSConfigError.Error":"m","DNSConfigError.Temporary":"m","DNSConfigError.Timeout":"m","DNSConfigError.Unwrap":"m","DNSError":"t","DNSError.Error":"m","DNSError.Temporary":"m","DNSError.Timeout":"m","DNSError.Unwrap":"m","DefaultResolver":"v","Dial":"f","DialIP":"f","DialTCP":"f","DialTimeout":"f","DialUDP":"f","DialUnix":"f","Dialer":"t","Dialer.Dial":"m","Dialer.DialContext":"m","Dialer.DialIP":"m","Dialer.DialTCP":"m","Dialer.DialUDP":"m","Dialer.DialUnix":"m","Dialer.MultipathTCP":"m","Dialer.SetMultipathTCP":"m","ErrClosed":"v","ErrWriteToConnected":"v","Error":"t","FileConn":"f","FileListener":"f","FilePacketConn":"f","FlagBroadcast":"c","FlagLoopback":"c","FlagMulticast":"c","FlagPointToPoint":"c","FlagRunning":"c","FlagUp":"c","Flags":"t","Flags.String":"m","HardwareAddr":"t","HardwareAddr.String":"m","IP":"t","IP.AppendText":"m","IP.DefaultMask":"m","IP.Equal":"m","IP.IsGlobalUnicast":"m","IP.IsInterfaceLocalMulticast":"m","IP.IsLinkLocalMulticast":"m","IP.IsLinkLocalUnicast":"m","IP.IsLoopback":"m","IP.IsMulticast":"m","IP.IsPrivate":"m","IP.IsUnspecified":"m","IP.MarshalText":"m","IP.Mask":"m","IP.String":"m","IP.To16":"m","IP.To4":"m","IP.UnmarshalText":"m","IPAddr":"t","IPAddr.Network":"m","IPAddr.String":"m","IPConn":"t","IPConn.ReadFrom":"m","IPConn.ReadFromIP":"m","IPConn.ReadMsgIP":"m","IPConn.SyscallConn":"m","IPConn.WriteMsgIP":"m","IPConn.WriteTo":"m","IPConn.WriteToIP":"m","IPMask":"t","IPMask.Size":"m","IPMask.String":"m","IPNet":"t","IPNet.Contains":"m","IPNet.Network":"m","IPNet.String":"m","IPv4":"f","IPv4Mask":"f","IPv4allrouter":"v","IPv4allsys":"v","IPv4bcast":"v","IPv4len":"c","IPv4zero":"v","IPv6interfacelocalallnodes":"v","IPv6len":"c","IPv6linklocalallnodes":"v","IPv6linklocalallrouters":"v","IPv6loopback":"v","IPv6unspecified":"v","IPv6zero":"v","Interface":"t","Interface.Addrs":"m","Interface.MulticastAddrs":"m","InterfaceAddrs":"f","InterfaceByIndex":"f","InterfaceByName":"f","Interfaces":"f","InvalidAddrError":"t","InvalidAddrError.Error":"m","InvalidAddrError.Temporary":"m","InvalidAddrError.Timeout":"m","JoinHostPort":"f","KeepAliveConfig":"t","Listen":"f","ListenConfig":"t","ListenConfig.Listen":"m","ListenConfig.ListenPacket":"m","ListenConfig.MultipathTCP":"m","ListenConfig.SetMultipathTCP":"m","ListenIP":"f","ListenMulticastUDP":"f","ListenPacket":"f","ListenTCP":"f","ListenUDP":"f","ListenUnix":"f","ListenUnixgram":"f","Listener":"t","LookupAddr":"f","LookupCNAME":"f","LookupHost":"f","LookupIP":"f","LookupMX":"f","LookupNS":"f","LookupPort":"f","LookupSRV":"f","LookupTXT":"f","MX":"t","NS":"t","OpError":"t","OpError.Error":"m","OpError.Temporary":"m","OpError.Timeout":"m","OpError.Unwrap":"m","PacketConn":"t","ParseCIDR":"f","ParseError":"t","ParseError.Error":"m","ParseError.Temporary":"m","ParseError.Timeout":"m","ParseIP":"f","ParseMAC":"f","Pipe":"f","ResolveIPAddr":"f","ResolveTCPAddr":"f","ResolveUDPAddr":"f","ResolveUnixAddr":"f","Resolver":"t","Resolver.LookupAddr":"m","Resolver.LookupCNAME":"m","Resolver.LookupHost":"m","Resolver.LookupIP":"m","Resolver.LookupIPAddr":"m","Resolver.LookupMX":"m","Resolver.LookupNS":"m","Resolver.LookupNetIP":"m","Resolver.LookupPort":"m","Resolver.LookupSRV":"m","Resolver.LookupTXT":"m","SRV":"t","SplitHostPort":"f","TCPAddr":"t","TCPAddr.AddrPort":"m","TCPAddr.Network":"m","TCPAddr.String":"m","TCPAddrFromAddrPort":"f","TCPConn":"t","TCPConn.CloseRead":"m","TCPConn.CloseWrite":"m","TCPConn.MultipathTCP":"m","TCPConn.ReadFrom":"m","TCPConn.SetKeepAlive":"m","TCPConn.SetKeepAliveConfig":"m","TCPConn.SetKeepAlivePeriod":"m","TCPConn.SetLinger":"m","TCPConn.SetNoDelay":"m","TCPConn.SyscallConn":"m","TCPConn.WriteTo":"m","TCPListener":"t","TCPListener.Accept":"m","TCPListener.AcceptTCP":"m","TCPListener.Addr":"m","TCPListener.Close":"m","TCPListener.File":"m","TCPListener.SetDeadline":"m","TCPListener.SyscallConn":"m","UDPAddr":"t","UDPAddr.AddrPort":"m","UDPAddr.Network":"m","UDPAddr.String":"m","UDPAddrFromAddrPort":"f","UDPConn":"t","UDPConn.ReadFrom":"m","UDPConn.ReadFromUDP":"m","UDPConn.ReadFromUDPAddrPort":"m","UDPConn.ReadMsgUDP":"m","UDPConn.ReadMsgUDPAddrPort":"m","UDPConn.SyscallConn":"m","UDPConn.WriteMsgUDP":"m","UDPConn.WriteMsgUDPAddrPort":"m","UDPConn.WriteTo":"m","UDPConn.WriteToUDP":"m","UDPConn.WriteToUDPAddrPort":"m","UnixAddr":"t","UnixAddr.Network":"m","UnixAddr.String":"m","UnixConn":"t","UnixConn.CloseRead":"m","UnixConn.CloseWrite":"m","UnixConn.ReadFrom":"m","UnixConn.ReadFromUnix":"m","UnixConn.ReadMsgUnix":"m","UnixConn.SyscallConn":"m","UnixConn.WriteMsgUnix":"m","UnixConn.WriteTo":"m","UnixConn.WriteToUnix":"m","UnixListener":"t","UnixListener.Accept":"m","UnixListener.AcceptUnix":"m","UnixListener.Addr":"m","UnixListener.Close":"m","UnixListener.File":"m","UnixListener.SetDeadline":"m","UnixListener.SetUnlinkOnClose":"m","UnixListener.SyscallConn":"m","UnknownNetworkError":"t","UnknownNetworkError.Error":"m","UnknownNetworkError.Temporary":"m","UnknownNetworkError.Timeout":"m"}},"net/http":{"path":"net/http","name":"http","symbols":{"AllowQuerySemicolons":"f","CanonicalHeaderKey":"f","Client":"t","Client.CloseIdleConnections":"m","Client.Do":"m","Client.Get":"m","Client.Head":"m","Client.Post":"m","Client.PostForm":"m","ClientConn":"t","ClientConn.Available":"m","ClientConn.Close":"m","ClientConn.Err":"m","ClientConn.InFlight":"m","ClientConn.Release":"m","ClientConn.Reserve":"m","ClientConn.RoundTrip":"m","ClientConn.SetStateHook":"m","CloseNotifier":"t","ConnState":"t","ConnState.String":"m","Cookie":"t","Cookie.String":"m","Cookie.Valid":"m","CookieJar":"t","CrossOriginProtection":"t","CrossOriginProtection.AddInsecureBypassPattern":"m","CrossOriginProtection.AddTrustedOrigin":"m","CrossOriginProtection.Check":"m","CrossOriginProtection.Handler":"m","CrossOriginProtection.SetDenyHandler":"m","DefaultClient":"v","DefaultMaxHeaderBytes":"c","DefaultMaxHeaderValueCount":"c","DefaultMaxIdleConnsPerHost":"c","DefaultServeMux":"v","DefaultTransport":"v","DetectContentType":"f","Dir":"t","Dir.Open":"m","ErrAbortHandler":"v","ErrBodyNotAllowed":"v","ErrBodyReadAfterClose":"v","ErrContentLength":"v","ErrHandlerTimeout":"v","ErrHeaderTooLong":"v","ErrHijacked":"v","ErrLineTooLong":"v","ErrMissingBoundary":"v","ErrMissingContentLength":"v","ErrMissingFile":"v","ErrNoCookie":"v","ErrNoLocation":"v","ErrNotMultipart":"v","ErrNotSupported":"v","ErrSchemeMismatch":"v","ErrServerClosed":"v","ErrShortBody":"v","ErrSkipAltProtocol":"v","ErrUnexpectedTrailer":"v","ErrUseLastResponse":"v","ErrWriteAfterFlush":"v","Error":"f","FS":"f","File":"t","FileServer":"f","FileServerFS":"f","FileSystem":"t","Flusher":"t","Get":"f","HTTP2Config":"t","Handle":"f","HandleFunc":"f","Handler":"t","HandlerFunc":"t","HandlerFunc.ServeHTTP":"m","Head":"f","Header":"t","Header.Add":"m","Header.Clone":"m","Header.Del":"m","Header.Get":"m","Header.Set":"m","Header.Values":"m","Header.Write":"m","Header.WriteSubset":"m","Hijacker":"t","ListenAndServe":"f","ListenAndServeTLS":"f","LocalAddrContextKey":"v","MaxBytesError":"t","MaxBytesError.Error":"m","MaxBytesHandler":"f","MaxBytesReader":"f","MethodConnect":"c","MethodDelete":"c","MethodGet":"c","MethodHead":"c","MethodOptions":"c","MethodPatch":"c","MethodPost":"c","MethodPut":"c","MethodTrace":"c","NewCrossOriginProtection":"f","NewFileTransport":"f","NewFileTransportFS":"f","NewRequest":"f","NewRequestWithContext":"f","NewResponseController":"f","NewServeMux":"f","NoBody":"v","NotFound":"f","NotFoundHandler":"f","ParseCookie":"f","ParseHTTPVersion":"f","ParseSetCookie":"f","ParseTime":"f","Post":"f","PostForm":"f","ProtocolError":"t","ProtocolError.Error":"m","ProtocolError.Is":"m","Protocols":"t","Protocols.HTTP1":"m","Protocols.HTTP2":"m","Protocols.SetHTTP1":"m","Protocols.SetHTTP2":"m","Protocols.SetUnencryptedHTTP2":"m","Protocols.String":"m","Protocols.UnencryptedHTTP2":"m","ProxyFromEnvironment":"f","ProxyURL":"f","PushOptions":"t","Pusher":"t","ReadRequest":"f","ReadResponse":"f","Redirect":"f","RedirectHandler":"f","Request":"t","Request.AddCookie":"m","Request.BasicAuth":"m","Request.Clone":"m","Request.Context":"m","Request.Cookie":"m","Request.Cookies":"m","Request.CookiesNamed":"m","Request.FormFile":"m","Request.FormValue":"m","Request.MultipartReader":"m","Request.ParseForm":"m","Request.ParseMultipartForm":"m","Request.PathValue":"m","Request.PostFormValue":"m","Request.ProtoAtLeast":"m","Request.Referer":"m","Request.SetBasicAuth":"m","Request.SetPathValue":"m","Request.UserAgent":"m","Request.WithContext":"m","Request.Write":"m","Request.WriteProxy":"m","Response":"t","Response.Cookies":"m","Response.Location":"m","Response.ProtoAtLeast":"m","Response.Write":"m","ResponseController":"t","ResponseController.EnableFullDuplex":"m","ResponseController.Flush":"m","ResponseController.Hijack":"m","ResponseController.SetReadDeadline":"m","ResponseController.SetWriteDeadline":"m","ResponseWriter":"t","RoundTripper":"t","SameSite":"t","SameSiteDefaultMode":"c","SameSiteLaxMode":"c","SameSiteNoneMode":"c","SameSiteStrictMode":"c","Serve":"f","ServeContent":"f","ServeFile":"f","ServeFileFS":"f","ServeMux":"t","ServeMux.Handle":"m","ServeMux.HandleFunc":"m","ServeMux.Handler":"m","ServeMux.ServeHTTP":"m","ServeTLS":"f","Server":"t","Server.Close":"m","Server.ListenAndServe":"m","Server.ListenAndServeTLS":"m","Server.RegisterOnShutdown":"m","Server.Serve":"m","Server.ServeTLS":"m","Server.SetKeepAlivesEnabled":"m","Server.Shutdown":"m","ServerContextKey":"v","SetCookie":"f","StateActive":"c","StateClosed":"c","StateHijacked":"c","StateIdle":"c","StateNew":"c","StatusAccepted":"c","StatusAlreadyReported":"c","StatusBadGateway":"c","StatusBadRequest":"c","StatusConflict":"c","StatusContinue":"c","StatusCreated":"c","StatusEarlyHints":"c","StatusExpectationFailed":"c","StatusFailedDependency":"c","StatusForbidden":"c","StatusFound":"c","StatusGatewayTimeout":"c","StatusGone":"c","StatusHTTPVersionNotSupported":"c","StatusIMUsed":"c","StatusInsufficientStorage":"c","StatusInternalServerError":"c","StatusLengthRequired":"c","StatusLocked":"c","StatusLoopDetected":"c","StatusMethodNotAllowed":"c","StatusMisdirectedRequest":"c","StatusMovedPermanently":"c","StatusMultiStatus":"c","StatusMultipleChoices":"c","StatusNetworkAuthenticationRequired":"c","StatusNoContent":"c","StatusNonAuthoritativeInfo":"c","StatusNotAcceptable":"c","StatusNotExtended":"c","StatusNotFound":"c","StatusNotImplemented":"c","StatusNotModified":"c","StatusOK":"c","StatusPartialContent":"c","StatusPaymentRequired":"c","StatusPermanentRedirect":"c","StatusPreconditionFailed":"c","StatusPreconditionRequired":"c","StatusProcessing":"c","StatusProxyAuthRequired":"c","StatusRequestEntityTooLarge":"c","StatusRequestHeaderFieldsTooLarge":"c","StatusRequestTimeout":"c","StatusRequestURITooLong":"c","StatusRequestedRangeNotSatisfiable":"c","StatusResetContent":"c","StatusSeeOther":"c","StatusServiceUnavailable":"c","StatusSwitchingProtocols":"c","StatusTeapot":"c","StatusTemporaryRedirect":"c","StatusText":"f","StatusTooEarly":"c","StatusTooManyRequests":"c","StatusUnauthorized":"c","StatusUnavailableForLegalReasons":"c","StatusUnprocessableEntity":"c","StatusUnsupportedMediaType":"c","StatusUpgradeRequired":"c","StatusUseProxy":"c","StatusVariantAlsoNegotiates":"c","StripPrefix":"f","TimeFormat":"c","TimeoutHandler":"f","TrailerPrefix":"c","Transport":"t","Transport.CancelRequest":"m","Transport.Clone":"m","Transport.CloseIdleConnections":"m","Transport.NewClientConn":"m","Transport.RegisterProtocol":"m","Transport.RoundTrip":"m"}},"net/http/cgi":{"path":"net/http/cgi","name":"cgi","symbols":{"Handler":"t","Handler.ServeHTTP":"m","Request":"f","RequestFromMap":"f","Serve":"f"}},"net/http/cookiejar":{"path":"net/http/cookiejar","name":"cookiejar","symbols":{"Jar":"t","Jar.Cookies":"m","Jar.SetCookies":"m","New":"f","Options":"t","PublicSuffixList":"t"}},"net/http/fcgi":{"path":"net/http/fcgi","name":"fcgi","symbols":{"ErrConnClosed":"v","ErrRequestAborted":"v","ProcessEnv":"f","Serve":"f"}},"net/http/httptest":{"path":"net/http/httptest","name":"httptest","symbols":{"DefaultRemoteAddr":"c","NewRecorder":"f","NewRequest":"f","NewRequestWithContext":"f","NewServer":"f","NewTLSServer":"f","NewTestServer":"f","NewUnstartedServer":"f","ResponseRecorder":"t","ResponseRecorder.Flush":"m","ResponseRecorder.Header":"m","ResponseRecorder.Result":"m","ResponseRecorder.Write":"m","ResponseRecorder.WriteHeader":"m","ResponseRecorder.WriteString":"m","Server":"t","Server.Certificate":"m","Server.Client":"m","Server.Close":"m","Server.CloseClientConnections":"m","Server.Start":"m","Server.StartTLS":"m"}},"net/http/httptrace":{"path":"net/http/httptrace","name":"httptrace","symbols":{"ClientTrace":"t","ContextClientTrace":"f","DNSDoneInfo":"t","DNSStartInfo":"t","GotConnInfo":"t","WithClientTrace":"f","WroteRequestInfo":"t"}},"net/http/httputil":{"path":"net/http/httputil","name":"httputil","symbols":{"BufferPool":"t","ClientConn":"t","ClientConn.Close":"m","ClientConn.Do":"m","ClientConn.Hijack":"m","ClientConn.Pending":"m","ClientConn.Read":"m","ClientConn.Write":"m","DumpRequest":"f","DumpRequestOut":"f","DumpResponse":"f","ErrClosed":"v","ErrLineTooLong":"v","ErrPersistEOF":"v","ErrPipeline":"v","NewChunkedReader":"f","NewChunkedWriter":"f","NewClientConn":"f","NewProxyClientConn":"f","NewServerConn":"f","NewSingleHostReverseProxy":"f","ProxyRequest":"t","ProxyRequest.SetURL":"m","ProxyRequest.SetXForwarded":"m","ReverseProxy":"t","ReverseProxy.ServeHTTP":"m","ServerConn":"t","ServerConn.Close":"m","ServerConn.Hijack":"m","ServerConn.Pending":"m","ServerConn.Read":"m","ServerConn.Write":"m"}},"net/http/pprof":{"path":"net/http/pprof","name":"pprof","symbols":{"Cmdline":"f","Handler":"f","Index":"f","Profile":"f","Symbol":"f","Trace":"f"}},"net/mail":{"path":"net/mail","name":"mail","symbols":{"Address":"t","Address.String":"m","AddressParser":"t","AddressParser.Parse":"m","AddressParser.ParseList":"m","ErrHeaderNotPresent":"v","Header":"t","Header.AddressList":"m","Header.Date":"m","Header.Get":"m","Message":"t","ParseAddress":"f","ParseAddressList":"f","ParseDate":"f","ReadMessage":"f"}},"net/netip":{"path":"net/netip","name":"netip","symbols":{"Addr":"t","Addr.AppendBinary":"m","Addr.AppendText":"m","Addr.AppendTo":"m","Addr.As16":"m","Addr.As4":"m","Addr.AsSlice":"m","Addr.BitLen":"m","Addr.Compare":"m","Addr.Is4":"m","Addr.Is4In6":"m","Addr.Is6":"m","Addr.IsGlobalUnicast":"m","Addr.IsInterfaceLocalMulticast":"m","Addr.IsLinkLocalMulticast":"m","Addr.IsLinkLocalUnicast":"m","Addr.IsLoopback":"m","Addr.IsMulticast":"m","Addr.IsPrivate":"m","Addr.IsUnspecified":"m","Addr.IsValid":"m","Addr.Less":"m","Addr.MarshalBinary":"m","Addr.MarshalText":"m","Addr.Next":"m","Addr.Prefix":"m","Addr.Prev":"m","Addr.String":"m","Addr.StringExpanded":"m","Addr.Unmap":"m","Addr.UnmarshalBinary":"m","Addr.UnmarshalText":"m","Addr.WithZone":"m","Addr.Zone":"m","AddrFrom16":"f","AddrFrom4":"f","AddrFromSlice":"f","AddrPort":"t","AddrPort.Addr":"m","AddrPort.AppendBinary":"m","AddrPort.AppendText":"m","AddrPort.AppendTo":"m","AddrPort.Compare":"m","AddrPort.IsValid":"m","AddrPort.MarshalBinary":"m","AddrPort.MarshalText":"m","AddrPort.Port":"m","AddrPort.String":"m","AddrPort.UnmarshalBinary":"m","AddrPort.UnmarshalText":"m","AddrPortFrom":"f","IPv4Unspecified":"f","IPv6LinkLocalAllNodes":"f","IPv6LinkLocalAllRouters":"f","IPv6Loopback":"f","IPv6Unspecified":"f","MustParseAddr":"f","MustParseAddrPort":"f","MustParsePrefix":"f","ParseAddr":"f","ParseAddrPort":"f","ParsePrefix":"f","Prefix":"t","Prefix.Addr":"m","Prefix.AppendBinary":"m","Prefix.AppendText":"m","Prefix.AppendTo":"m","Prefix.Bits":"m","Prefix.Compare":"m","Prefix.Contains":"m","Prefix.IsSingleIP":"m","Prefix.IsValid":"m","Prefix.MarshalBinary":"m","Prefix.MarshalText":"m","Prefix.Masked":"m","Prefix.Overlaps":"m","Prefix.String":"m","Prefix.UnmarshalBinary":"m","Prefix.UnmarshalText":"m","PrefixFrom":"f"}},"net/rpc":{"path":"net/rpc","name":"rpc","symbols":{"Accept":"f","Call":"t","Client":"t","Client.Call":"m","Client.Close":"m","Client.Go":"m","ClientCodec":"t","DefaultDebugPath":"c","DefaultRPCPath":"c","DefaultServer":"v","Dial":"f","DialHTTP":"f","DialHTTPPath":"f","ErrShutdown":"v","HandleHTTP":"f","NewClient":"f","NewClientWithCodec":"f","NewServer":"f","Register":"f","RegisterName":"f","Request":"t","Response":"t","ServeCodec":"f","ServeConn":"f","ServeRequest":"f","Server":"t","Server.Accept":"m","Server.HandleHTTP":"m","Server.Register":"m","Server.RegisterName":"m","Server.ServeCodec":"m","Server.ServeConn":"m","Server.ServeHTTP":"m","Server.ServeRequest":"m","ServerCodec":"t","ServerError":"t","ServerError.Error":"m"}},"net/rpc/jsonrpc":{"path":"net/rpc/jsonrpc","name":"jsonrpc","symbols":{"Dial":"f","NewClient":"f","NewClientCodec":"f","NewServerCodec":"f","ServeConn":"f"}},"net/smtp":{"path":"net/smtp","name":"smtp","symbols":{"Auth":"t","CRAMMD5Auth":"f","Client":"t","Client.Auth":"m","Client.Close":"m","Client.Data":"m","Client.Extension":"m","Client.Hello":"m","Client.Mail":"m","Client.Noop":"m","Client.Quit":"m","Client.Rcpt":"m","Client.Reset":"m","Client.StartTLS":"m","Client.TLSConnectionState":"m","Client.Verify":"m","Dial":"f","NewClient":"f","PlainAuth":"f","SendMail":"f","ServerInfo":"t"}},"net/textproto":{"path":"net/textproto","name":"textproto","symbols":{"CanonicalMIMEHeaderKey":"f","Conn":"t","Conn.Close":"m","Conn.Cmd":"m","Dial":"f","Error":"t","Error.Error":"m","MIMEHeader":"t","MIMEHeader.Add":"m","MIMEHeader.Del":"m","MIMEHeader.Get":"m","MIMEHeader.Set":"m","MIMEHeader.Values":"m","NewConn":"f","NewReader":"f","NewWriter":"f","Pipeline":"t","Pipeline.EndRequest":"m","Pipeline.EndResponse":"m","Pipeline.Next":"m","Pipeline.StartRequest":"m","Pipeline.StartResponse":"m","ProtocolError":"t","ProtocolError.Error":"m","Reader":"t","Reader.DotReader":"m","Reader.ReadCodeLine":"m","Reader.ReadContinuedLine":"m","Reader.ReadContinuedLineBytes":"m","Reader.ReadDotBytes":"m","Reader.ReadDotLines":"m","Reader.ReadLine":"m","Reader.ReadLineBytes":"m","Reader.ReadMIMEHeader":"m","Reader.ReadResponse":"m","TrimBytes":"f","TrimString":"f","Writer":"t","Writer.DotWriter":"m","Writer.PrintfLine":"m"}},"net/url":{"path":"net/url","name":"url","symbols":{"Error":"t","Error.Error":"m","Error.Temporary":"m","Error.Timeout":"m","Error.Unwrap":"m","EscapeError":"t","EscapeError.Error":"m","InvalidHostError":"t","InvalidHostError.Error":"m","JoinPath":"f","Parse":"f","ParseQuery":"f","ParseRequestURI":"f","PathEscape":"f","PathUnescape":"f","QueryEscape":"f","QueryUnescape":"f","URL":"t","URL.AppendBinary":"m","URL.Clone":"m","URL.EscapedFragment":"m","URL.EscapedPath":"m","URL.Hostname":"m","URL.IsAbs":"m","URL.JoinPath":"m","URL.MarshalBinary":"m","URL.Parse":"m","URL.Port":"m","URL.Query":"m","URL.Redacted":"m","URL.RequestURI":"m","URL.ResolveReference":"m","URL.String":"m","URL.UnmarshalBinary":"m","User":"f","UserPassword":"f","Userinfo":"t","Userinfo.Password":"m","Userinfo.String":"m","Userinfo.Username":"m","Values":"t","Values.Add":"m","Values.Clone":"m","Values.Del":"m","Values.Encode":"m","Values.Get":"m","Values.Has":"m","Values.Set":"m"}},"os":{"path":"os","name":"os","symbols":{"Args":"v","Chdir":"f","Chmod":"f","Chown":"f","Chtimes":"f","Clearenv":"f","CopyFS":"f","Create":"f","CreateTemp":"f","DevNull":"c","DirEntry":"t","DirFS":"f","Environ":"f","ErrClosed":"v","ErrDeadlineExceeded":"v","ErrExist":"v","ErrInvalid":"v","ErrNoDeadline":"v","ErrNoHandle":"v","ErrNotExist":"v","ErrPermission":"v","ErrProcessDone":"v","Executable":"f","Exit":"f","Expand":"f","ExpandEnv":"f","File":"t","File.Chdir":"m","File.Chmod":"m","File.Chown":"m","File.Close":"m","File.Fd":"m","File.Name":"m","File.Read":"m","File.ReadAt":"m","File.ReadDir":"m","File.ReadFrom":"m","File.Readdir":"m","File.Readdirnames":"m","File.Seek":"m","File.SetDeadline":"m","File.SetReadDeadline":"m","File.SetWriteDeadline":"m","File.Stat":"m","File.Sync":"m","File.SyscallConn":"m","File.Truncate":"m","File.Write":"m","File.WriteAt":"m","File.WriteString":"m","File.WriteTo":"m","FileInfo":"t","FileMode":"t","FindProcess":"f","Getegid":"f","Getenv":"f","Geteuid":"f","Getgid":"f","Getgroups":"f","Getpagesize":"f","Getpid":"f","Getppid":"f","Getuid":"f","Getwd":"f","Hostname":"f","Interrupt":"v","IsExist":"f","IsNotExist":"f","IsPathSeparator":"f","IsPermission":"f","IsTimeout":"f","Kill":"v","Lchown":"f","Link":"f","LinkError":"t","LinkError.Error":"m","LinkError.Unwrap":"m","LookupEnv":"f","Lstat":"f","Mkdir":"f","MkdirAll":"f","MkdirTemp":"f","ModeAppend":"c","ModeCharDevice":"c","ModeDevice":"c","ModeDir":"c","ModeExclusive":"c","ModeIrregular":"c","ModeNamedPipe":"c","ModePerm":"c","ModeSetgid":"c","ModeSetuid":"c","ModeSocket":"c","ModeSticky":"c","ModeSymlink":"c","ModeTemporary":"c","ModeType":"c","NewFile":"f","NewSyscallError":"f","O_APPEND":"c","O_CREATE":"c","O_EXCL":"c","O_RDONLY":"c","O_RDWR":"c","O_SYNC":"c","O_TRUNC":"c","O_WRONLY":"c","Open":"f","OpenFile":"f","OpenInRoot":"f","OpenRoot":"f","PathError":"t","PathListSeparator":"c","PathSeparator":"c","Pipe":"f","ProcAttr":"t","Process":"t","Process.Kill":"m","Process.Release":"m","Process.Signal":"m","Process.Wait":"m","Process.WithHandle":"m","ProcessState":"t","ProcessState.ExitCode":"m","ProcessState.Exited":"m","ProcessState.Pid":"m","ProcessState.String":"m","ProcessState.Success":"m","ProcessState.Sys":"m","ProcessState.SysUsage":"m","ProcessState.SystemTime":"m","ProcessState.UserTime":"m","ReadDir":"f","ReadFile":"f","Readlink":"f","Remove":"f","RemoveAll":"f","Rename":"f","Root":"t","Root.Chmod":"m","Root.Chown":"m","Root.Chtimes":"m","Root.Close":"m","Root.Create":"m","Root.FS":"m","Root.Lchown":"m","Root.Link":"m","Root.Lstat":"m","Root.Mkdir":"m","Root.MkdirAll":"m","Root.Name":"m","Root.Open":"m","Root.OpenFile":"m","Root.OpenRoot":"m","Root.ReadFile":"m","Root.Readlink":"m","Root.Remove":"m","Root.RemoveAll":"m","Root.Rename":"m","Root.Stat":"m","Root.Symlink":"m","Root.WriteFile":"m","SEEK_CUR":"c","SEEK_END":"c","SEEK_SET":"c","SameFile":"f","Setenv":"f","Signal":"t","StartProcess":"f","Stat":"f","Stderr":"v","Stdin":"v","Stdout":"v","Symlink":"f","SyscallError":"t","SyscallError.Error":"m","SyscallError.Timeout":"m","SyscallError.Unwrap":"m","TempDir":"f","Truncate":"f","Unsetenv":"f","UserCacheDir":"f","UserConfigDir":"f","UserHomeDir":"f","WriteFile":"f"}},"os/exec":{"path":"os/exec","name":"exec","symbols":{"Cmd":"t","Cmd.CombinedOutput":"m","Cmd.Environ":"m","Cmd.Output":"m","Cmd.Run":"m","Cmd.Start":"m","Cmd.StderrPipe":"m","Cmd.StdinPipe":"m","Cmd.StdoutPipe":"m","Cmd.String":"m","Cmd.Wait":"m","Command":"f","CommandContext":"f","ErrDot":"v","ErrNotFound":"v","ErrWaitDelay":"v","Error":"t","Error.Error":"m","Error.Unwrap":"m","ExitError":"t","ExitError.Error":"m","LookPath":"f"}},"os/signal":{"path":"os/signal","name":"signal","symbols":{"Ignore":"f","Ignored":"f","Notify":"f","NotifyContext":"f","Reset":"f","Stop":"f"}},"os/user":{"path":"os/user","name":"user","symbols":{"Current":"f","Group":"t","Lookup":"f","LookupGroup":"f","LookupGroupId":"f","LookupId":"f","UnknownGroupError":"t","UnknownGroupError.Error":"m","UnknownGroupIdError":"t","UnknownGroupIdError.Error":"m","UnknownUserError":"t","UnknownUserError.Error":"m","UnknownUserIdError":"t","UnknownUserIdError.Error":"m","User":"t","User.GroupIds":"m"}},"path":{"path":"path","name":"path","symbols":{"Base":"f","Clean":"f","Dir":"f","ErrBadPattern":"v","Ext":"f","IsAbs":"f","Join":"f","Match":"f","Split":"f"}},"path/filepath":{"path":"path/filepath","name":"filepath","symbols":{"Abs":"f","Base":"f","Clean":"f","Dir":"f","ErrBadPattern":"v","EvalSymlinks":"f","Ext":"f","FromSlash":"f","Glob":"f","HasPrefix":"f","IsAbs":"f","IsLocal":"f","Join":"f","ListSeparator":"c","Localize":"f","Match":"f","Rel":"f","Separator":"c","SkipAll":"v","SkipDir":"v","Split":"f","SplitList":"f","ToSlash":"f","VolumeName":"f","Walk":"f","WalkDir":"f","WalkFunc":"t"}},"plugin":{"path":"plugin","name":"plugin","symbols":{"Open":"f","Plugin":"t","Plugin.Lookup":"m","Symbol":"t"}},"reflect":{"path":"reflect","name":"reflect","symbols":{"Append":"f","AppendSlice":"f","Array":"c","ArrayOf":"f","Bool":"c","BothDir":"c","Chan":"c","ChanDir":"t","ChanDir.String":"m","ChanOf":"f","Complex128":"c","Complex64":"c","Copy":"f","DeepEqual":"f","Float32":"c","Float64":"c","Func":"c","FuncOf":"f","Indirect":"f","Int":"c","Int16":"c","Int32":"c","Int64":"c","Int8":"c","Interface":"c","Invalid":"c","Kind":"t","Kind.String":"m","MakeChan":"f","MakeFunc":"f","MakeMap":"f","MakeMapWithSize":"f","MakeSlice":"f","Map":"c","MapIter":"t","MapIter.Key":"m","MapIter.Next":"m","MapIter.Reset":"m","MapIter.Value":"m","MapOf":"f","Method":"t","Method.IsExported":"m","New":"f","NewAt":"f","Pointer":"c","PointerTo":"f","Ptr":"c","PtrTo":"f","RecvDir":"c","Select":"f","SelectCase":"t","SelectDefault":"c","SelectDir":"t","SelectRecv":"c","SelectSend":"c","SendDir":"c","Slice":"c","SliceAt":"f","SliceHeader":"t","SliceOf":"f","String":"c","StringHeader":"t","Struct":"c","StructField":"t","StructField.IsExported":"m","StructOf":"f","StructTag":"t","StructTag.Get":"m","StructTag.Lookup":"m","Swapper":"f","Type":"t","TypeAssert":"f","TypeFor":"f","TypeOf":"f","Uint":"c","Uint16":"c","Uint32":"c","Uint64":"c","Uint8":"c","Uintptr":"c","UnsafePointer":"c","Value":"t","Value.Addr":"m","Value.Bool":"m","Value.Bytes":"m","Value.Call":"m","Value.CallSlice":"m","Value.CanAddr":"m","Value.CanComplex":"m","Value.CanConvert":"m","Value.CanFloat":"m","Value.CanInt":"m","Value.CanInterface":"m","Value.CanSet":"m","Value.CanUint":"m","Value.Cap":"m","Value.Clear":"m","Value.Close":"m","Value.Comparable":"m","Value.Complex":"m","Value.Convert":"m","Value.Elem":"m","Value.Equal":"m","Value.Field":"m","Value.FieldByIndex":"m","Value.FieldByIndexErr":"m","Value.FieldByName":"m","Value.FieldByNameFunc":"m","Value.Fields":"m","Value.Float":"m","Value.Grow":"m","Value.Index":"m","Value.Int":"m","Value.Interface":"m","Value.InterfaceData":"m","Value.IsNil":"m","Value.IsValid":"m","Value.IsZero":"m","Value.Kind":"m","Value.Len":"m","Value.MapIndex":"m","Value.MapKeys":"m","Value.MapRange":"m","Value.Method":"m","Value.MethodByName":"m","Value.Methods":"m","Value.NumField":"m","Value.NumMethod":"m","Value.OverflowComplex":"m","Value.OverflowFloat":"m","Value.OverflowInt":"m","Value.OverflowUint":"m","Value.Pointer":"m","Value.Recv":"m","Value.Send":"m","Value.Seq":"m","Value.Seq2":"m","Value.Set":"m","Value.SetBool":"m","Value.SetBytes":"m","Value.SetCap":"m","Value.SetComplex":"m","Value.SetFloat":"m","Value.SetInt":"m","Value.SetIterKey":"m","Value.SetIterValue":"m","Value.SetLen":"m","Value.SetMapIndex":"m","Value.SetPointer":"m","Value.SetString":"m","Value.SetUint":"m","Value.SetZero":"m","Value.Slice":"m","Value.Slice3":"m","Value.String":"m","Value.TryRecv":"m","Value.TrySend":"m","Value.Type":"m","Value.Uint":"m","Value.UnsafeAddr":"m","Value.UnsafePointer":"m","ValueError":"t","ValueError.Error":"m","ValueOf":"f","VisibleFields":"f","Zero":"f"}},"regexp":{"path":"regexp","name":"regexp","symbols":{"Compile":"f","CompilePOSIX":"f","Match":"f","MatchReader":"f","MatchString":"f","MustCompile":"f","MustCompilePOSIX":"f","QuoteMeta":"f","Regexp":"t","Regexp.AppendText":"m","Regexp.Copy":"m","Regexp.Expand":"m","Regexp.ExpandString":"m","Regexp.Find":"m","Regexp.FindAll":"m","Regexp.FindAllIndex":"m","Regexp.FindAllString":"m","Regexp.FindAllStringIndex":"m","Regexp.FindAllStringSubmatch":"m","Regexp.FindAllStringSubmatchIndex":"m","Regexp.FindAllSubmatch":"m","Regexp.FindAllSubmatchIndex":"m","Regexp.FindIndex":"m","Regexp.FindReaderIndex":"m","Regexp.FindReaderSubmatchIndex":"m","Regexp.FindString":"m","Regexp.FindStringIndex":"m","Regexp.FindStringSubmatch":"m","Regexp.FindStringSubmatchIndex":"m","Regexp.FindSubmatch":"m","Regexp.FindSubmatchIndex":"m","Regexp.LiteralPrefix":"m","Regexp.Longest":"m","Regexp.MarshalText":"m","Regexp.Match":"m","Regexp.MatchReader":"m","Regexp.MatchString":"m","Regexp.NumSubexp":"m","Regexp.ReplaceAll":"m","Regexp.ReplaceAllFunc":"m","Regexp.ReplaceAllLiteral":"m","Regexp.ReplaceAllLiteralString":"m","Regexp.ReplaceAllString":"m","Regexp.ReplaceAllStringFunc":"m","Regexp.Split":"m","Regexp.String":"m","Regexp.SubexpIndex":"m","Regexp.SubexpNames":"m","Regexp.UnmarshalText":"m"}},"regexp/syntax":{"path":"regexp/syntax","name":"syntax","symbols":{"ClassNL":"c","Compile":"f","DotNL":"c","EmptyBeginLine":"c","EmptyBeginText":"c","EmptyEndLine":"c","EmptyEndText":"c","EmptyNoWordBoundary":"c","EmptyOp":"t","EmptyOpContext":"f","EmptyWordBoundary":"c","ErrInternalError":"c","ErrInvalidCharClass":"c","ErrInvalidCharRange":"c","ErrInvalidEscape":"c","ErrInvalidNamedCapture":"c","ErrInvalidPerlOp":"c","ErrInvalidRepeatOp":"c","ErrInvalidRepeatSize":"c","ErrInvalidUTF8":"c","ErrLarge":"c","ErrMissingBracket":"c","ErrMissingParen":"c","ErrMissingRepeatArgument":"c","ErrNestingDepth":"c","ErrTrailingBackslash":"c","ErrUnexpectedParen":"c","Error":"t","Error.Error":"m","ErrorCode":"t","ErrorCode.String":"m","Flags":"t","FoldCase":"c","Inst":"t","Inst.MatchEmptyWidth":"m","Inst.MatchRune":"m","Inst.MatchRunePos":"m","Inst.String":"m","InstAlt":"c","InstAltMatch":"c","InstCapture":"c","InstEmptyWidth":"c","InstFail":"c","InstMatch":"c","InstNop":"c","InstOp":"t","InstOp.String":"m","InstRune":"c","InstRune1":"c","InstRuneAny":"c","InstRuneAnyNotNL":"c","IsWordChar":"f","Literal":"c","MatchNL":"c","NonGreedy":"c","OneLine":"c","Op":"t","Op.String":"m","OpAlternate":"c","OpAnyChar":"c","OpAnyCharNotNL":"c","OpBeginLine":"c","OpBeginText":"c","OpCapture":"c","OpCharClass":"c","OpConcat":"c","OpEmptyMatch":"c","OpEndLine":"c","OpEndText":"c","OpLiteral":"c","OpNoMatch":"c","OpNoWordBoundary":"c","OpPlus":"c","OpQuest":"c","OpRepeat":"c","OpStar":"c","OpWordBoundary":"c","POSIX":"c","Parse":"f","Perl":"c","PerlX":"c","Prog":"t","Prog.Prefix":"m","Prog.StartCond":"m","Prog.String":"m","Regexp":"t","Regexp.CapNames":"m","Regexp.Equal":"m","Regexp.MaxCap":"m","Regexp.Simplify":"m","Regexp.String":"m","Simple":"c","UnicodeGroups":"c","WasDollar":"c"}},"runtime":{"path":"runtime","name":"runtime","symbols":{"AddCleanup":"f","BlockProfile":"f","BlockProfileRecord":"t","Breakpoint":"f","CPUProfile":"f","Caller":"f","Callers":"f","CallersFrames":"f","Cleanup":"t","Cleanup.Stop":"m","Compiler":"c","Error":"t","Frame":"t","Frames":"t","Frames.Next":"m","Func":"t","Func.Entry":"m","Func.FileLine":"m","Func.Name":"m","FuncForPC":"f","GC":"f","GOARCH":"c","GOMAXPROCS":"f","GOOS":"c","GOROOT":"f","Goexit":"f","GoroutineProfile":"f","Gosched":"f","KeepAlive":"f","LockOSThread":"f","MemProfile":"f","MemProfileRate":"v","MemProfileRecord":"t","MemProfileRecord.InUseBytes":"m","MemProfileRecord.InUseObjects":"m","MemProfileRecord.Stack":"m","MemStats":"t","MutexProfile":"f","NumCPU":"f","NumCgoCall":"f","NumGoroutine":"f","PanicNilError":"t","PanicNilError.Error":"m","PanicNilError.RuntimeError":"m","Pinner":"t","Pinner.Pin":"m","Pinner.Unpin":"m","ReadMemStats":"f","ReadTrace":"f","SetBlockProfileRate":"f","SetCPUProfileRate":"f","SetCgoTraceback":"f","SetDefaultGOMAXPROCS":"f","SetFinalizer":"f","SetMutexProfileFraction":"f","Stack":"f","StackRecord":"t","StackRecord.Stack":"m","StartTrace":"f","StopTrace":"f","ThreadCreateProfile":"f","TypeAssertionError":"t","TypeAssertionError.Error":"m","TypeAssertionError.RuntimeError":"m","UnlockOSThread":"f","Version":"f"}},"runtime/cgo":{"path":"runtime/cgo","name":"cgo","symbols":{"Handle":"t","Handle.Delete":"m","Handle.Value":"m","Incomplete":"t","NewHandle":"f"}},"runtime/coverage":{"path":"runtime/coverage","name":"coverage","symbols":{"ClearCounters":"f","WriteCounters":"f","WriteCountersDir":"f","WriteMeta":"f","WriteMetaDir":"f"}},"runtime/debug":{"path":"runtime/debug","name":"debug","symbols":{"BuildInfo":"t","BuildInfo.String":"m","BuildSetting":"t","CrashOptions":"t","FreeOSMemory":"f","GCStats":"t","Module":"t","ParseBuildInfo":"f","PrintStack":"f","ReadBuildInfo":"f","ReadGCStats":"f","SetCrashOutput":"f","SetGCPercent":"f","SetMaxStack":"f","SetMaxThreads":"f","SetMemoryLimit":"f","SetPanicOnFault":"f","SetTraceback":"f","Stack":"f","WriteHeapDump":"f"}},"runtime/metrics":{"path":"runtime/metrics","name":"metrics","symbols":{"All":"f","Description":"t","Float64Histogram":"t","KindBad":"c","KindFloat64":"c","KindFloat64Histogram":"c","KindUint64":"c","Read":"f","Sample":"t","Value":"t","Value.Float64":"m","Value.Float64Histogram":"m","Value.Kind":"m","Value.Uint64":"m","ValueKind":"t"}},"runtime/pprof":{"path":"runtime/pprof","name":"pprof","symbols":{"Do":"f","ForLabels":"f","Label":"f","LabelSet":"t","Labels":"f","Lookup":"f","NewProfile":"f","Profile":"t","Profile.Add":"m","Profile.Count":"m","Profile.Name":"m","Profile.Remove":"m","Profile.WriteTo":"m","Profiles":"f","SetGoroutineLabels":"f","StartCPUProfile":"f","StopCPUProfile":"f","WithLabels":"f","WriteHeapProfile":"f"}},"runtime/trace":{"path":"runtime/trace","name":"trace","symbols":{"FlightRecorder":"t","FlightRecorder.Enabled":"m","FlightRecorder.Start":"m","FlightRecorder.Stop":"m","FlightRecorder.WriteTo":"m","FlightRecorderConfig":"t","IsEnabled":"f","Log":"f","Logf":"f","NewFlightRecorder":"f","NewTask":"f","Region":"t","Region.End":"m","Start":"f","StartRegion":"f","Stop":"f","Task":"t","Task.End":"m","WithRegion":"f"}},"slices":{"path":"slices","name":"slices","symbols":{"All":"f","AppendSeq":"f","Backward":"f","BinarySearch":"f","BinarySearchFunc":"f","Chunk":"f","Clip":"f","Clone":"f","Collect":"f","Compact":"f","CompactFunc":"f","Compare":"f","CompareFunc":"f","Concat":"f","Contains":"f","ContainsFunc":"f","Delete":"f","DeleteFunc":"f","Equal":"f","EqualFunc":"f","Grow":"f","Index":"f","IndexFunc":"f","Insert":"f","IsSorted":"f","IsSortedFunc":"f","Max":"f","MaxFunc":"f","Min":"f","MinFunc":"f","Repeat":"f","Replace":"f","Reverse":"f","Sort":"f","SortFunc":"f","SortStableFunc":"f","Sorted":"f","SortedFunc":"f","SortedStableFunc":"f","Values":"f"}},"sort":{"path":"sort","name":"sort","symbols":{"Find":"f","Float64Slice":"t","Float64Slice.Len":"m","Float64Slice.Less":"m","Float64Slice.Search":"m","Float64Slice.Sort":"m","Float64Slice.Swap":"m","Float64s":"f","Float64sAreSorted":"f","IntSlice":"t","IntSlice.Len":"m","IntSlice.Less":"m","IntSlice.Search":"m","IntSlice.Sort":"m","IntSlice.Swap":"m","Interface":"t","Ints":"f","IntsAreSorted":"f","IsSorted":"f","Reverse":"f","Search":"f","SearchFloat64s":"f","SearchInts":"f","SearchStrings":"f","Slice":"f","SliceIsSorted":"f","SliceStable":"f","Sort":"f","Stable":"f","StringSlice":"t","StringSlice.Len":"m","StringSlice.Less":"m","StringSlice.Search":"m","StringSlice.Sort":"m","StringSlice.Swap":"m","Strings":"f","StringsAreSorted":"f"}},"strconv":{"path":"strconv","name":"strconv","symbols":{"AppendBool":"f","AppendFloat":"f","AppendInt":"f","AppendQuote":"f","AppendQuoteRune":"f","AppendQuoteRuneToASCII":"f","AppendQuoteRuneToGraphic":"f","AppendQuoteToASCII":"f","AppendQuoteToGraphic":"f","AppendUint":"f","Atoi":"f","CanBackquote":"f","ErrRange":"v","ErrSyntax":"v","FormatBool":"f","FormatComplex":"f","FormatFloat":"f","FormatInt":"f","FormatUint":"f","IntSize":"c","IsGraphic":"f","IsPrint":"f","Itoa":"f","NumError":"t","NumError.Error":"m","NumError.Unwrap":"m","ParseBool":"f","ParseComplex":"f","ParseFloat":"f","ParseInt":"f","ParseUint":"f","Quote":"f","QuoteRune":"f","QuoteRuneToASCII":"f","QuoteRuneToGraphic":"f","QuoteToASCII":"f","QuoteToGraphic":"f","QuotedPrefix":"f","Unquote":"f","UnquoteChar":"f"}},"strings":{"path":"strings","name":"strings","symbols":{"Builder":"t","Builder.Cap":"m","Builder.Grow":"m","Builder.Len":"m","Builder.Reset":"m","Builder.String":"m","Builder.Write":"m","Builder.WriteByte":"m","Builder.WriteRune":"m","Builder.WriteString":"m","Clone":"f","Compare":"f","Contains":"f","ContainsAny":"f","ContainsFunc":"f","ContainsRune":"f","Count":"f","Cut":"f","CutLast":"f","CutPrefix":"f","CutSuffix":"f","EqualFold":"f","Fields":"f","FieldsFunc":"f","FieldsFuncSeq":"f","FieldsSeq":"f","HasPrefix":"f","HasSuffix":"f","Index":"f","IndexAny":"f","IndexByte":"f","IndexFunc":"f","IndexRune":"f","Join":"f","LastIndex":"f","LastIndexAny":"f","LastIndexByte":"f","LastIndexFunc":"f","Lines":"f","Map":"f","NewReader":"f","NewReplacer":"f","Reader":"t","Reader.Len":"m","Reader.Read":"m","Reader.ReadAt":"m","Reader.ReadByte":"m","Reader.ReadRune":"m","Reader.Reset":"m","Reader.Seek":"m","Reader.Size":"m","Reader.UnreadByte":"m","Reader.UnreadRune":"m","Reader.WriteTo":"m","Repeat":"f","Replace":"f","ReplaceAll":"f","Replacer":"t","Replacer.Replace":"m","Replacer.WriteString":"m","Split":"f","SplitAfter":"f","SplitAfterN":"f","SplitAfterSeq":"f","SplitN":"f","SplitSeq":"f","Title":"f","ToLower":"f","ToLowerSpecial":"f","ToTitle":"f","ToTitleSpecial":"f","ToUpper":"f","ToUpperSpecial":"f","ToValidUTF8":"f","Trim":"f","TrimFunc":"f","TrimLeft":"f","TrimLeftFunc":"f","TrimPrefix":"f","TrimRight":"f","TrimRightFunc":"f","TrimSpace":"f","TrimSuffix":"f"}},"structs":{"path":"structs","name":"structs","symbols":{"HostLayout":"t"}},"sync":{"path":"sync","name":"sync","symbols":{"Cond":"t","Cond.Broadcast":"m","Cond.Signal":"m","Cond.Wait":"m","Locker":"t","Map":"t","Map.Clear":"m","Map.CompareAndDelete":"m","Map.CompareAndSwap":"m","Map.Delete":"m","Map.Load":"m","Map.LoadAndDelete":"m","Map.LoadOrStore":"m","Map.Range":"m","Map.Store":"m","Map.Swap":"m","Mutex":"t","Mutex.Lock":"m","Mutex.TryLock":"m","Mutex.Unlock":"m","NewCond":"f","Once":"t","Once.Do":"m","OnceFunc":"f","OnceValue":"f","OnceValues":"f","Pool":"t","Pool.Get":"m","Pool.Put":"m","RWMutex":"t","RWMutex.Lock":"m","RWMutex.RLock":"m","RWMutex.RLocker":"m","RWMutex.RUnlock":"m","RWMutex.TryLock":"m","RWMutex.TryRLock":"m","RWMutex.Unlock":"m","WaitGroup":"t","WaitGroup.Add":"m","WaitGroup.Done":"m","WaitGroup.Go":"m","WaitGroup.Wait":"m"}},"sync/atomic":{"path":"sync/atomic","name":"atomic","symbols":{"AddInt32":"f","AddInt64":"f","AddUint32":"f","AddUint64":"f","AddUintptr":"f","AndInt32":"f","AndInt64":"f","AndUint32":"f","AndUint64":"f","AndUintptr":"f","Bool":"t","Bool.CompareAndSwap":"m","Bool.Load":"m","Bool.Store":"m","Bool.Swap":"m","CompareAndSwapInt32":"f","CompareAndSwapInt64":"f","CompareAndSwapPointer":"f","CompareAndSwapUint32":"f","CompareAndSwapUint64":"f","CompareAndSwapUintptr":"f","Int32":"t","Int32.Add":"m","Int32.And":"m","Int32.CompareAndSwap":"m","Int32.Load":"m","Int32.Or":"m","Int32.Store":"m","Int32.Swap":"m","Int64":"t","Int64.Add":"m","Int64.And":"m","Int64.CompareAndSwap":"m","Int64.Load":"m","Int64.Or":"m","Int64.Store":"m","Int64.Swap":"m","LoadInt32":"f","LoadInt64":"f","LoadPointer":"f","LoadUint32":"f","LoadUint64":"f","LoadUintptr":"f","OrInt32":"f","OrInt64":"f","OrUint32":"f","OrUint64":"f","OrUintptr":"f","Pointer":"t","StoreInt32":"f","StoreInt64":"f","StorePointer":"f","StoreUint32":"f","StoreUint64":"f","StoreUintptr":"f","SwapInt32":"f","SwapInt64":"f","SwapPointer":"f","SwapUint32":"f","SwapUint64":"f","SwapUintptr":"f","Uint32":"t","Uint32.Add":"m","Uint32.And":"m","Uint32.CompareAndSwap":"m","Uint32.Load":"m","Uint32.Or":"m","Uint32.Store":"m","Uint32.Swap":"m","Uint64":"t","Uint64.Add":"m","Uint64.And":"m","Uint64.CompareAndSwap":"m","Uint64.Load":"m","Uint64.Or":"m","Uint64.Store":"m","Uint64.Swap":"m","Uintptr":"t","Uintptr.Add":"m","Uintptr.And":"m","Uintptr.CompareAndSwap":"m","Uintptr.Load":"m","Uintptr.Or":"m","Uintptr.Store":"m","Uintptr.Swap":"m","Value":"t","Value.CompareAndSwap":"m","Value.Load":"m","Value.Store":"m","Value.Swap":"m"}},"syscall":{"path":"syscall","name":"syscall","symbols":{"AF_ALG":"c","AF_APPLETALK":"c","AF_ASH":"c","AF_ATMPVC":"c","AF_ATMSVC":"c","AF_AX25":"c","AF_BLUETOOTH":"c","AF_BRIDGE":"c","AF_CAIF":"c","AF_CAN":"c","AF_DECnet":"c","AF_ECONET":"c","AF_FILE":"c","AF_IEEE802154":"c","AF_INET":"c","AF_INET6":"c","AF_IPX":"c","AF_IRDA":"c","AF_ISDN":"c","AF_IUCV":"c","AF_KEY":"c","AF_LLC":"c","AF_LOCAL":"c","AF_MAX":"c","AF_NETBEUI":"c","AF_NETLINK":"c","AF_NETROM":"c","AF_PACKET":"c","AF_PHONET":"c","AF_PPPOX":"c","AF_RDS":"c","AF_ROSE":"c","AF_ROUTE":"c","AF_RXRPC":"c","AF_SECURITY":"c","AF_SNA":"c","AF_TIPC":"c","AF_UNIX":"c","AF_UNSPEC":"c","AF_WANPIPE":"c","AF_X25":"c","ARPHRD_ADAPT":"c","ARPHRD_APPLETLK":"c","ARPHRD_ARCNET":"c","ARPHRD_ASH":"c","ARPHRD_ATM":"c","ARPHRD_AX25":"c","ARPHRD_BIF":"c","ARPHRD_CHAOS":"c","ARPHRD_CISCO":"c","ARPHRD_CSLIP":"c","ARPHRD_CSLIP6":"c","ARPHRD_DDCMP":"c","ARPHRD_DLCI":"c","ARPHRD_ECONET":"c","ARPHRD_EETHER":"c","ARPHRD_ETHER":"c","ARPHRD_EUI64":"c","ARPHRD_FCAL":"c","ARPHRD_FCFABRIC":"c","ARPHRD_FCPL":"c","ARPHRD_FCPP":"c","ARPHRD_FDDI":"c","ARPHRD_FRAD":"c","ARPHRD_HDLC":"c","ARPHRD_HIPPI":"c","ARPHRD_HWX25":"c","ARPHRD_IEEE1394":"c","ARPHRD_IEEE802":"c","ARPHRD_IEEE80211":"c","ARPHRD_IEEE80211_PRISM":"c","ARPHRD_IEEE80211_RADIOTAP":"c","ARPHRD_IEEE802154":"c","ARPHRD_IEEE802154_PHY":"c","ARPHRD_IEEE802_TR":"c","ARPHRD_INFINIBAND":"c","ARPHRD_IPDDP":"c","ARPHRD_IPGRE":"c","ARPHRD_IRDA":"c","ARPHRD_LAPB":"c","ARPHRD_LOCALTLK":"c","ARPHRD_LOOPBACK":"c","ARPHRD_METRICOM":"c","ARPHRD_NETROM":"c","ARPHRD_NONE":"c","ARPHRD_PIMREG":"c","ARPHRD_PPP":"c","ARPHRD_PRONET":"c","ARPHRD_RAWHDLC":"c","ARPHRD_ROSE":"c","ARPHRD_RSRVD":"c","ARPHRD_SIT":"c","ARPHRD_SKIP":"c","ARPHRD_SLIP":"c","ARPHRD_SLIP6":"c","ARPHRD_TUNNEL":"c","ARPHRD_TUNNEL6":"c","ARPHRD_VOID":"c","ARPHRD_X25":"c","Accept":"f","Accept4":"f","Access":"f","Acct":"f","Adjtimex":"f","AllThreadsSyscall":"f","AllThreadsSyscall6":"f","AttachLsf":"f","B0":"c","B1000000":"c","B110":"c","B115200":"c","B1152000":"c","B1200":"c","B134":"c","B150":"c","B1500000":"c","B1800":"c","B19200":"c","B200":"c","B2000000":"c","B230400":"c","B2400":"c","B2500000":"c","B300":"c","B3000000":"c","B3500000":"c","B38400":"c","B4000000":"c","B460800":"c","B4800":"c","B50":"c","B500000":"c","B57600":"c","B576000":"c","B600":"c","B75":"c","B921600":"c","B9600":"c","BPF_A":"c","BPF_ABS":"c","BPF_ADD":"c","BPF_ALU":"c","BPF_AND":"c","BPF_B":"c","BPF_DIV":"c","BPF_H":"c","BPF_IMM":"c","BPF_IND":"c","BPF_JA":"c","BPF_JEQ":"c","BPF_JGE":"c","BPF_JGT":"c","BPF_JMP":"c","BPF_JSET":"c","BPF_K":"c","BPF_LD":"c","BPF_LDX":"c","BPF_LEN":"c","BPF_LSH":"c","BPF_MAJOR_VERSION":"c","BPF_MAXINSNS":"c","BPF_MEM":"c","BPF_MEMWORDS":"c","BPF_MINOR_VERSION":"c","BPF_MISC":"c","BPF_MSH":"c","BPF_MUL":"c","BPF_NEG":"c","BPF_OR":"c","BPF_RET":"c","BPF_RSH":"c","BPF_ST":"c","BPF_STX":"c","BPF_SUB":"c","BPF_TAX":"c","BPF_TXA":"c","BPF_W":"c","BPF_X":"c","BRKINT":"c","Bind":"f","BindToDevice":"f","BytePtrFromString":"f","ByteSliceFromString":"f","CLOCAL":"c","CLONE_CHILD_CLEARTID":"c","CLONE_CHILD_SETTID":"c","CLONE_CLEAR_SIGHAND":"c","CLONE_DETACHED":"c","CLONE_FILES":"c","CLONE_FS":"c","CLONE_INTO_CGROUP":"c","CLONE_IO":"c","CLONE_NEWCGROUP":"c","CLONE_NEWIPC":"c","CLONE_NEWNET":"c","CLONE_NEWNS":"c","CLONE_NEWPID":"c","CLONE_NEWTIME":"c","CLONE_NEWUSER":"c","CLONE_NEWUTS":"c","CLONE_PARENT":"c","CLONE_PARENT_SETTID":"c","CLONE_PIDFD":"c","CLONE_PTRACE":"c","CLONE_SETTLS":"c","CLONE_SIGHAND":"c","CLONE_SYSVSEM":"c","CLONE_THREAD":"c","CLONE_UNTRACED":"c","CLONE_VFORK":"c","CLONE_VM":"c","CREAD":"c","CS5":"c","CS6":"c","CS7":"c","CS8":"c","CSIZE":"c","CSTOPB":"c","Chdir":"f","Chmod":"f","Chown":"f","Chroot":"f","Clearenv":"f","Close":"f","CloseOnExec":"f","CmsgLen":"f","CmsgSpace":"f","Cmsghdr":"t","Cmsghdr.SetLen":"m","Conn":"t","Connect":"f","Creat":"f","Credential":"t","DT_BLK":"c","DT_CHR":"c","DT_DIR":"c","DT_FIFO":"c","DT_LNK":"c","DT_REG":"c","DT_SOCK":"c","DT_UNKNOWN":"c","DT_WHT":"c","DetachLsf":"f","Dirent":"t","Dup":"f","Dup2":"f","Dup3":"f","E2BIG":"c","EACCES":"c","EADDRINUSE":"c","EADDRNOTAVAIL":"c","EADV":"c","EAFNOSUPPORT":"c","EAGAIN":"c","EALREADY":"c","EBADE":"c","EBADF":"c","EBADFD":"c","EBADMSG":"c","EBADR":"c","EBADRQC":"c","EBADSLT":"c","EBFONT":"c","EBUSY":"c","ECANCELED":"c","ECHILD":"c","ECHO":"c","ECHOCTL":"c","ECHOE":"c","ECHOK":"c","ECHOKE":"c","ECHONL":"c","ECHOPRT":"c","ECHRNG":"c","ECOMM":"c","ECONNABORTED":"c","ECONNREFUSED":"c","ECONNRESET":"c","EDEADLK":"c","EDEADLOCK":"c","EDESTADDRREQ":"c","EDOM":"c","EDOTDOT":"c","EDQUOT":"c","EEXIST":"c","EFAULT":"c","EFBIG":"c","EHOSTDOWN":"c","EHOSTUNREACH":"c","EIDRM":"c","EILSEQ":"c","EINPROGRESS":"c","EINTR":"c","EINVAL":"c","EIO":"c","EISCONN":"c","EISDIR":"c","EISNAM":"c","EKEYEXPIRED":"c","EKEYREJECTED":"c","EKEYREVOKED":"c","EL2HLT":"c","EL2NSYNC":"c","EL3HLT":"c","EL3RST":"c","ELIBACC":"c","ELIBBAD":"c","ELIBEXEC":"c","ELIBMAX":"c","ELIBSCN":"c","ELNRNG":"c","ELOOP":"c","EMEDIUMTYPE":"c","EMFILE":"c","EMLINK":"c","EMSGSIZE":"c","EMULTIHOP":"c","ENAMETOOLONG":"c","ENAVAIL":"c","ENETDOWN":"c","ENETRESET":"c","ENETUNREACH":"c","ENFILE":"c","ENOANO":"c","ENOBUFS":"c","ENOCSI":"c","ENODATA":"c","ENODEV":"c","ENOENT":"c","ENOEXEC":"c","ENOKEY":"c","ENOLCK":"c","ENOLINK":"c","ENOMEDIUM":"c","ENOMEM":"c","ENOMSG":"c","ENONET":"c","ENOPKG":"c","ENOPROTOOPT":"c","ENOSPC":"c","ENOSR":"c","ENOSTR":"c","ENOSYS":"c","ENOTBLK":"c","ENOTCONN":"c","ENOTDIR":"c","ENOTEMPTY":"c","ENOTNAM":"c","ENOTRECOVERABLE":"c","ENOTSOCK":"c","ENOTSUP":"c","ENOTTY":"c","ENOTUNIQ":"c","ENXIO":"c","EOPNOTSUPP":"c","EOVERFLOW":"c","EOWNERDEAD":"c","EPERM":"c","EPFNOSUPPORT":"c","EPIPE":"c","EPOLLERR":"c","EPOLLET":"c","EPOLLHUP":"c","EPOLLIN":"c","EPOLLMSG":"c","EPOLLONESHOT":"c","EPOLLOUT":"c","EPOLLPRI":"c","EPOLLRDBAND":"c","EPOLLRDHUP":"c","EPOLLRDNORM":"c","EPOLLWRBAND":"c","EPOLLWRNORM":"c","EPOLL_CLOEXEC":"c","EPOLL_CTL_ADD":"c","EPOLL_CTL_DEL":"c","EPOLL_CTL_MOD":"c","EPOLL_NONBLOCK":"c","EPROTO":"c","EPROTONOSUPPORT":"c","EPROTOTYPE":"c","ERANGE":"c","EREMCHG":"c","EREMOTE":"c","EREMOTEIO":"c","ERESTART":"c","ERFKILL":"c","EROFS":"c","ESHUTDOWN":"c","ESOCKTNOSUPPORT":"c","ESPIPE":"c","ESRCH":"c","ESRMNT":"c","ESTALE":"c","ESTRPIPE":"c","ETH_P_1588":"c","ETH_P_8021Q":"c","ETH_P_802_2":"c","ETH_P_802_3":"c","ETH_P_AARP":"c","ETH_P_ALL":"c","ETH_P_AOE":"c","ETH_P_ARCNET":"c","ETH_P_ARP":"c","ETH_P_ATALK":"c","ETH_P_ATMFATE":"c","ETH_P_ATMMPOA":"c","ETH_P_AX25":"c","ETH_P_BPQ":"c","ETH_P_CAIF":"c","ETH_P_CAN":"c","ETH_P_CONTROL":"c","ETH_P_CUST":"c","ETH_P_DDCMP":"c","ETH_P_DEC":"c","ETH_P_DIAG":"c","ETH_P_DNA_DL":"c","ETH_P_DNA_RC":"c","ETH_P_DNA_RT":"c","ETH_P_DSA":"c","ETH_P_ECONET":"c","ETH_P_EDSA":"c","ETH_P_FCOE":"c","ETH_P_FIP":"c","ETH_P_HDLC":"c","ETH_P_IEEE802154":"c","ETH_P_IEEEPUP":"c","ETH_P_IEEEPUPAT":"c","ETH_P_IP":"c","ETH_P_IPV6":"c","ETH_P_IPX":"c","ETH_P_IRDA":"c","ETH_P_LAT":"c","ETH_P_LINK_CTL":"c","ETH_P_LOCALTALK":"c","ETH_P_LOOP":"c","ETH_P_MOBITEX":"c","ETH_P_MPLS_MC":"c","ETH_P_MPLS_UC":"c","ETH_P_PAE":"c","ETH_P_PAUSE":"c","ETH_P_PHONET":"c","ETH_P_PPPTALK":"c","ETH_P_PPP_DISC":"c","ETH_P_PPP_MP":"c","ETH_P_PPP_SES":"c","ETH_P_PUP":"c","ETH_P_PUPAT":"c","ETH_P_RARP":"c","ETH_P_SCA":"c","ETH_P_SLOW":"c","ETH_P_SNAP":"c","ETH_P_TEB":"c","ETH_P_TIPC":"c","ETH_P_TRAILER":"c","ETH_P_TR_802_2":"c","ETH_P_WAN_PPP":"c","ETH_P_WCCP":"c","ETH_P_X25":"c","ETIME":"c","ETIMEDOUT":"c","ETOOMANYREFS":"c","ETXTBSY":"c","EUCLEAN":"c","EUNATCH":"c","EUSERS":"c","EWOULDBLOCK":"c","EXDEV":"c","EXFULL":"c","Environ":"f","EpollCreate":"f","EpollCreate1":"f","EpollCtl":"f","EpollEvent":"t","EpollWait":"f","Errno":"t","Errno.Error":"m","Errno.Is":"m","Errno.Temporary":"m","Errno.Timeout":"m","Exec":"f","Exit":"f","FD_CLOEXEC":"c","FD_SETSIZE":"c","FLUSHO":"c","F_DUPFD":"c","F_DUPFD_CLOEXEC":"c","F_EXLCK":"c","F_GETFD":"c","F_GETFL":"c","F_GETLEASE":"c","F_GETLK":"c","F_GETLK64":"c","F_GETOWN":"c","F_GETOWN_EX":"c","F_GETPIPE_SZ":"c","F_GETSIG":"c","F_LOCK":"c","F_NOTIFY":"c","F_OK":"c","F_RDLCK":"c","F_SETFD":"c","F_SETFL":"c","F_SETLEASE":"c","F_SETLK":"c","F_SETLK64":"c","F_SETLKW":"c","F_SETLKW64":"c","F_SETOWN":"c","F_SETOWN_EX":"c","F_SETPIPE_SZ":"c","F_SETSIG":"c","F_SHLCK":"c","F_TEST":"c","F_TLOCK":"c","F_ULOCK":"c","F_UNLCK":"c","F_WRLCK":"c","Faccessat":"f","Fallocate":"f","Fchdir":"f","Fchmod":"f","Fchmodat":"f","Fchown":"f","Fchownat":"f","FcntlFlock":"f","FdSet":"t","Fdatasync":"f","Flock":"f","Flock_t":"t","ForkExec":"f","ForkLock":"v","Fsid":"t","Fstat":"f","Fstatfs":"f","Fsync":"f","Ftruncate":"f","Futimes":"f","Futimesat":"f","Getcwd":"f","Getdents":"f","Getegid":"f","Getenv":"f","Geteuid":"f","Getgid":"f","Getgroups":"f","Getpagesize":"f","Getpeername":"f","Getpgid":"f","Getpgrp":"f","Getpid":"f","Getppid":"f","Getpriority":"f","Getrlimit":"f","Getrusage":"f","Getsockname":"f","GetsockoptICMPv6Filter":"f","GetsockoptIPMreq":"f","GetsockoptIPMreqn":"f","GetsockoptIPv6MTUInfo":"f","GetsockoptIPv6Mreq":"f","GetsockoptInet4Addr":"f","GetsockoptInt":"f","GetsockoptUcred":"f","Gettid":"f","Gettimeofday":"f","Getuid":"f","Getwd":"f","Getxattr":"f","HUPCL":"c","ICANON":"c","ICMPV6_FILTER":"c","ICMPv6Filter":"t","ICRNL":"c","IEXTEN":"c","IFA_ADDRESS":"c","IFA_ANYCAST":"c","IFA_BROADCAST":"c","IFA_CACHEINFO":"c","IFA_F_DADFAILED":"c","IFA_F_DEPRECATED":"c","IFA_F_HOMEADDRESS":"c","IFA_F_NODAD":"c","IFA_F_OPTIMISTIC":"c","IFA_F_PERMANENT":"c","IFA_F_SECONDARY":"c","IFA_F_TEMPORARY":"c","IFA_F_TENTATIVE":"c","IFA_LABEL":"c","IFA_LOCAL":"c","IFA_MAX":"c","IFA_MULTICAST":"c","IFA_UNSPEC":"c","IFF_ALLMULTI":"c","IFF_AUTOMEDIA":"c","IFF_BROADCAST":"c","IFF_DEBUG":"c","IFF_DYNAMIC":"c","IFF_LOOPBACK":"c","IFF_MASTER":"c","IFF_MULTICAST":"c","IFF_NOARP":"c","IFF_NOTRAILERS":"c","IFF_NO_PI":"c","IFF_ONE_QUEUE":"c","IFF_POINTOPOINT":"c","IFF_PORTSEL":"c","IFF_PROMISC":"c","IFF_RUNNING":"c","IFF_SLAVE":"c","IFF_TAP":"c","IFF_TUN":"c","IFF_TUN_EXCL":"c","IFF_UP":"c","IFF_VNET_HDR":"c","IFLA_ADDRESS":"c","IFLA_BROADCAST":"c","IFLA_COST":"c","IFLA_IFALIAS":"c","IFLA_IFNAME":"c","IFLA_LINK":"c","IFLA_LINKINFO":"c","IFLA_LINKMODE":"c","IFLA_MAP":"c","IFLA_MASTER":"c","IFLA_MAX":"c","IFLA_MTU":"c","IFLA_NET_NS_PID":"c","IFLA_OPERSTATE":"c","IFLA_PRIORITY":"c","IFLA_PROTINFO":"c","IFLA_QDISC":"c","IFLA_STATS":"c","IFLA_TXQLEN":"c","IFLA_UNSPEC":"c","IFLA_WEIGHT":"c","IFLA_WIRELESS":"c","IFNAMSIZ":"c","IGNBRK":"c","IGNCR":"c","IGNPAR":"c","IMAXBEL":"c","INLCR":"c","INPCK":"c","IN_ACCESS":"c","IN_ALL_EVENTS":"c","IN_ATTRIB":"c","IN_CLASSA_HOST":"c","IN_CLASSA_MAX":"c","IN_CLASSA_NET":"c","IN_CLASSA_NSHIFT":"c","IN_CLASSB_HOST":"c","IN_CLASSB_MAX":"c","IN_CLASSB_NET":"c","IN_CLASSB_NSHIFT":"c","IN_CLASSC_HOST":"c","IN_CLASSC_NET":"c","IN_CLASSC_NSHIFT":"c","IN_CLOEXEC":"c","IN_CLOSE":"c","IN_CLOSE_NOWRITE":"c","IN_CLOSE_WRITE":"c","IN_CREATE":"c","IN_DELETE":"c","IN_DELETE_SELF":"c","IN_DONT_FOLLOW":"c","IN_EXCL_UNLINK":"c","IN_IGNORED":"c","IN_ISDIR":"c","IN_LOOPBACKNET":"c","IN_MASK_ADD":"c","IN_MODIFY":"c","IN_MOVE":"c","IN_MOVED_FROM":"c","IN_MOVED_TO":"c","IN_MOVE_SELF":"c","IN_NONBLOCK":"c","IN_ONESHOT":"c","IN_ONLYDIR":"c","IN_OPEN":"c","IN_Q_OVERFLOW":"c","IN_UNMOUNT":"c","IPMreq":"t","IPMreqn":"t","IPPROTO_AH":"c","IPPROTO_COMP":"c","IPPROTO_DCCP":"c","IPPROTO_DSTOPTS":"c","IPPROTO_EGP":"c","IPPROTO_ENCAP":"c","IPPROTO_ESP":"c","IPPROTO_FRAGMENT":"c","IPPROTO_GRE":"c","IPPROTO_HOPOPTS":"c","IPPROTO_ICMP":"c","IPPROTO_ICMPV6":"c","IPPROTO_IDP":"c","IPPROTO_IGMP":"c","IPPROTO_IP":"c","IPPROTO_IPIP":"c","IPPROTO_IPV6":"c","IPPROTO_MTP":"c","IPPROTO_NONE":"c","IPPROTO_PIM":"c","IPPROTO_PUP":"c","IPPROTO_RAW":"c","IPPROTO_ROUTING":"c","IPPROTO_RSVP":"c","IPPROTO_SCTP":"c","IPPROTO_TCP":"c","IPPROTO_TP":"c","IPPROTO_UDP":"c","IPPROTO_UDPLITE":"c","IPV6_2292DSTOPTS":"c","IPV6_2292HOPLIMIT":"c","IPV6_2292HOPOPTS":"c","IPV6_2292PKTINFO":"c","IPV6_2292PKTOPTIONS":"c","IPV6_2292RTHDR":"c","IPV6_ADDRFORM":"c","IPV6_ADD_MEMBERSHIP":"c","IPV6_AUTHHDR":"c","IPV6_CHECKSUM":"c","IPV6_DROP_MEMBERSHIP":"c","IPV6_DSTOPTS":"c","IPV6_HOPLIMIT":"c","IPV6_HOPOPTS":"c","IPV6_IPSEC_POLICY":"c","IPV6_JOIN_ANYCAST":"c","IPV6_JOIN_GROUP":"c","IPV6_LEAVE_ANYCAST":"c","IPV6_LEAVE_GROUP":"c","IPV6_MTU":"c","IPV6_MTU_DISCOVER":"c","IPV6_MULTICAST_HOPS":"c","IPV6_MULTICAST_IF":"c","IPV6_MULTICAST_LOOP":"c","IPV6_NEXTHOP":"c","IPV6_PKTINFO":"c","IPV6_PMTUDISC_DO":"c","IPV6_PMTUDISC_DONT":"c","IPV6_PMTUDISC_PROBE":"c","IPV6_PMTUDISC_WANT":"c","IPV6_RECVDSTOPTS":"c","IPV6_RECVERR":"c","IPV6_RECVHOPLIMIT":"c","IPV6_RECVHOPOPTS":"c","IPV6_RECVPKTINFO":"c","IPV6_RECVRTHDR":"c","IPV6_RECVTCLASS":"c","IPV6_ROUTER_ALERT":"c","IPV6_RTHDR":"c","IPV6_RTHDRDSTOPTS":"c","IPV6_RTHDR_LOOSE":"c","IPV6_RTHDR_STRICT":"c","IPV6_RTHDR_TYPE_0":"c","IPV6_RXDSTOPTS":"c","IPV6_RXHOPOPTS":"c","IPV6_TCLASS":"c","IPV6_UNICAST_HOPS":"c","IPV6_V6ONLY":"c","IPV6_XFRM_POLICY":"c","IP_ADD_MEMBERSHIP":"c","IP_ADD_SOURCE_MEMBERSHIP":"c","IP_BLOCK_SOURCE":"c","IP_DEFAULT_MULTICAST_LOOP":"c","IP_DEFAULT_MULTICAST_TTL":"c","IP_DF":"c","IP_DROP_MEMBERSHIP":"c","IP_DROP_SOURCE_MEMBERSHIP":"c","IP_FREEBIND":"c","IP_HDRINCL":"c","IP_IPSEC_POLICY":"c","IP_MAXPACKET":"c","IP_MAX_MEMBERSHIPS":"c","IP_MF":"c","IP_MINTTL":"c","IP_MSFILTER":"c","IP_MSS":"c","IP_MTU":"c","IP_MTU_DISCOVER":"c","IP_MULTICAST_IF":"c","IP_MULTICAST_LOOP":"c","IP_MULTICAST_TTL":"c","IP_OFFMASK":"c","IP_OPTIONS":"c","IP_ORIGDSTADDR":"c","IP_PASSSEC":"c","IP_PKTINFO":"c","IP_PKTOPTIONS":"c","IP_PMTUDISC":"c","IP_PMTUDISC_DO":"c","IP_PMTUDISC_DONT":"c","IP_PMTUDISC_PROBE":"c","IP_PMTUDISC_WANT":"c","IP_RECVERR":"c","IP_RECVOPTS":"c","IP_RECVORIGDSTADDR":"c","IP_RECVRETOPTS":"c","IP_RECVTOS":"c","IP_RECVTTL":"c","IP_RETOPTS":"c","IP_RF":"c","IP_ROUTER_ALERT":"c","IP_TOS":"c","IP_TRANSPARENT":"c","IP_TTL":"c","IP_UNBLOCK_SOURCE":"c","IP_XFRM_POLICY":"c","IPv6MTUInfo":"t","IPv6Mreq":"t","ISIG":"c","ISTRIP":"c","IUCLC":"c","IUTF8":"c","IXANY":"c","IXOFF":"c","IXON":"c","IfAddrmsg":"t","IfInfomsg":"t","ImplementsGetwd":"c","Inet4Pktinfo":"t","Inet6Pktinfo":"t","InotifyAddWatch":"f","InotifyEvent":"t","InotifyInit":"f","InotifyInit1":"f","InotifyRmWatch":"f","Ioperm":"f","Iopl":"f","Iovec":"t","Iovec.SetLen":"m","Kill":"f","Klogctl":"f","LINUX_REBOOT_CMD_CAD_OFF":"c","LINUX_REBOOT_CMD_CAD_ON":"c","LINUX_REBOOT_CMD_HALT":"c","LINUX_REBOOT_CMD_KEXEC":"c","LINUX_REBOOT_CMD_POWER_OFF":"c","LINUX_REBOOT_CMD_RESTART":"c","LINUX_REBOOT_CMD_RESTART2":"c","LINUX_REBOOT_CMD_SW_SUSPEND":"c","LINUX_REBOOT_MAGIC1":"c","LINUX_REBOOT_MAGIC2":"c","LOCK_EX":"c","LOCK_NB":"c","LOCK_SH":"c","LOCK_UN":"c","Lchown":"f","Linger":"t","Link":"f","Listen":"f","Listxattr":"f","LsfJump":"f","LsfSocket":"f","LsfStmt":"f","Lstat":"f","MADV_DOFORK":"c","MADV_DONTFORK":"c","MADV_DONTNEED":"c","MADV_HUGEPAGE":"c","MADV_HWPOISON":"c","MADV_MERGEABLE":"c","MADV_NOHUGEPAGE":"c","MADV_NORMAL":"c","MADV_RANDOM":"c","MADV_REMOVE":"c","MADV_SEQUENTIAL":"c","MADV_UNMERGEABLE":"c","MADV_WILLNEED":"c","MAP_32BIT":"c","MAP_ANON":"c","MAP_ANONYMOUS":"c","MAP_DENYWRITE":"c","MAP_EXECUTABLE":"c","MAP_FILE":"c","MAP_FIXED":"c","MAP_GROWSDOWN":"c","MAP_HUGETLB":"c","MAP_LOCKED":"c","MAP_NONBLOCK":"c","MAP_NORESERVE":"c","MAP_POPULATE":"c","MAP_PRIVATE":"c","MAP_SHARED":"c","MAP_STACK":"c","MAP_TYPE":"c","MCL_CURRENT":"c","MCL_FUTURE":"c","MNT_DETACH":"c","MNT_EXPIRE":"c","MNT_FORCE":"c","MSG_CMSG_CLOEXEC":"c","MSG_CONFIRM":"c","MSG_CTRUNC":"c","MSG_DONTROUTE":"c","MSG_DONTWAIT":"c","MSG_EOR":"c","MSG_ERRQUEUE":"c","MSG_FASTOPEN":"c","MSG_FIN":"c","MSG_MORE":"c","MSG_NOSIGNAL":"c","MSG_OOB":"c","MSG_PEEK":"c","MSG_PROXY":"c","MSG_RST":"c","MSG_SYN":"c","MSG_TRUNC":"c","MSG_TRYHARD":"c","MSG_WAITALL":"c","MSG_WAITFORONE":"c","MS_ACTIVE":"c","MS_ASYNC":"c","MS_BIND":"c","MS_DIRSYNC":"c","MS_INVALIDATE":"c","MS_I_VERSION":"c","MS_KERNMOUNT":"c","MS_MANDLOCK":"c","MS_MGC_MSK":"c","MS_MGC_VAL":"c","MS_MOVE":"c","MS_NOATIME":"c","MS_NODEV":"c","MS_NODIRATIME":"c","MS_NOEXEC":"c","MS_NOSUID":"c","MS_NOUSER":"c","MS_POSIXACL":"c","MS_PRIVATE":"c","MS_RDONLY":"c","MS_REC":"c","MS_RELATIME":"c","MS_REMOUNT":"c","MS_RMT_MASK":"c","MS_SHARED":"c","MS_SILENT":"c","MS_SLAVE":"c","MS_STRICTATIME":"c","MS_SYNC":"c","MS_SYNCHRONOUS":"c","MS_UNBINDABLE":"c","Madvise":"f","Mkdir":"f","Mkdirat":"f","Mkfifo":"f","Mknod":"f","Mknodat":"f","Mlock":"f","Mlockall":"f","Mmap":"f","Mount":"f","Mprotect":"f","Msghdr":"t","Msghdr.SetControllen":"m","Munlock":"f","Munlockall":"f","Munmap":"f","NAME_MAX":"c","NETLINK_ADD_MEMBERSHIP":"c","NETLINK_AUDIT":"c","NETLINK_BROADCAST_ERROR":"c","NETLINK_CONNECTOR":"c","NETLINK_DNRTMSG":"c","NETLINK_DROP_MEMBERSHIP":"c","NETLINK_ECRYPTFS":"c","NETLINK_FIB_LOOKUP":"c","NETLINK_FIREWALL":"c","NETLINK_GENERIC":"c","NETLINK_INET_DIAG":"c","NETLINK_IP6_FW":"c","NETLINK_ISCSI":"c","NETLINK_KOBJECT_UEVENT":"c","NETLINK_NETFILTER":"c","NETLINK_NFLOG":"c","NETLINK_NO_ENOBUFS":"c","NETLINK_PKTINFO":"c","NETLINK_ROUTE":"c","NETLINK_SCSITRANSPORT":"c","NETLINK_SELINUX":"c","NETLINK_UNUSED":"c","NETLINK_USERSOCK":"c","NETLINK_XFRM":"c","NLA_ALIGNTO":"c","NLA_F_NESTED":"c","NLA_F_NET_BYTEORDER":"c","NLA_HDRLEN":"c","NLMSG_ALIGNTO":"c","NLMSG_DONE":"c","NLMSG_ERROR":"c","NLMSG_HDRLEN":"c","NLMSG_MIN_TYPE":"c","NLMSG_NOOP":"c","NLMSG_OVERRUN":"c","NLM_F_ACK":"c","NLM_F_APPEND":"c","NLM_F_ATOMIC":"c","NLM_F_CREATE":"c","NLM_F_DUMP":"c","NLM_F_ECHO":"c","NLM_F_EXCL":"c","NLM_F_MATCH":"c","NLM_F_MULTI":"c","NLM_F_REPLACE":"c","NLM_F_REQUEST":"c","NLM_F_ROOT":"c","NOFLSH":"c","Nanosleep":"f","NetlinkMessage":"t","NetlinkRIB":"f","NetlinkRouteAttr":"t","NetlinkRouteRequest":"t","NlAttr":"t","NlMsgerr":"t","NlMsghdr":"t","NsecToTimespec":"f","NsecToTimeval":"f","OCRNL":"c","OFDEL":"c","OFILL":"c","OLCUC":"c","ONLCR":"c","ONLRET":"c","ONOCR":"c","OPOST":"c","O_ACCMODE":"c","O_APPEND":"c","O_ASYNC":"c","O_CLOEXEC":"c","O_CREAT":"c","O_DIRECT":"c","O_DIRECTORY":"c","O_DSYNC":"c","O_EXCL":"c","O_FSYNC":"c","O_LARGEFILE":"c","O_NDELAY":"c","O_NOATIME":"c","O_NOCTTY":"c","O_NOFOLLOW":"c","O_NONBLOCK":"c","O_RDONLY":"c","O_RDWR":"c","O_RSYNC":"c","O_SYNC":"c","O_TRUNC":"c","O_WRONLY":"c","Open":"f","Openat":"f","PACKET_ADD_MEMBERSHIP":"c","PACKET_BROADCAST":"c","PACKET_DROP_MEMBERSHIP":"c","PACKET_FASTROUTE":"c","PACKET_HOST":"c","PACKET_LOOPBACK":"c","PACKET_MR_ALLMULTI":"c","PACKET_MR_MULTICAST":"c","PACKET_MR_PROMISC":"c","PACKET_MULTICAST":"c","PACKET_OTHERHOST":"c","PACKET_OUTGOING":"c","PACKET_RECV_OUTPUT":"c","PACKET_RX_RING":"c","PACKET_STATISTICS":"c","PARENB":"c","PARMRK":"c","PARODD":"c","PENDIN":"c","PRIO_PGRP":"c","PRIO_PROCESS":"c","PRIO_USER":"c","PROT_EXEC":"c","PROT_GROWSDOWN":"c","PROT_GROWSUP":"c","PROT_NONE":"c","PROT_READ":"c","PROT_WRITE":"c","PR_CAPBSET_DROP":"c","PR_CAPBSET_READ":"c","PR_ENDIAN_BIG":"c","PR_ENDIAN_LITTLE":"c","PR_ENDIAN_PPC_LITTLE":"c","PR_FPEMU_NOPRINT":"c","PR_FPEMU_SIGFPE":"c","PR_FP_EXC_ASYNC":"c","PR_FP_EXC_DISABLED":"c","PR_FP_EXC_DIV":"c","PR_FP_EXC_INV":"c","PR_FP_EXC_NONRECOV":"c","PR_FP_EXC_OVF":"c","PR_FP_EXC_PRECISE":"c","PR_FP_EXC_RES":"c","PR_FP_EXC_SW_ENABLE":"c","PR_FP_EXC_UND":"c","PR_GET_DUMPABLE":"c","PR_GET_ENDIAN":"c","PR_GET_FPEMU":"c","PR_GET_FPEXC":"c","PR_GET_KEEPCAPS":"c","PR_GET_NAME":"c","PR_GET_PDEATHSIG":"c","PR_GET_SECCOMP":"c","PR_GET_SECUREBITS":"c","PR_GET_TIMERSLACK":"c","PR_GET_TIMING":"c","PR_GET_TSC":"c","PR_GET_UNALIGN":"c","PR_MCE_KILL":"c","PR_MCE_KILL_CLEAR":"c","PR_MCE_KILL_DEFAULT":"c","PR_MCE_KILL_EARLY":"c","PR_MCE_KILL_GET":"c","PR_MCE_KILL_LATE":"c","PR_MCE_KILL_SET":"c","PR_SET_DUMPABLE":"c","PR_SET_ENDIAN":"c","PR_SET_FPEMU":"c","PR_SET_FPEXC":"c","PR_SET_KEEPCAPS":"c","PR_SET_NAME":"c","PR_SET_PDEATHSIG":"c","PR_SET_PTRACER":"c","PR_SET_SECCOMP":"c","PR_SET_SECUREBITS":"c","PR_SET_TIMERSLACK":"c","PR_SET_TIMING":"c","PR_SET_TSC":"c","PR_SET_UNALIGN":"c","PR_TASK_PERF_EVENTS_DISABLE":"c","PR_TASK_PERF_EVENTS_ENABLE":"c","PR_TIMING_STATISTICAL":"c","PR_TIMING_TIMESTAMP":"c","PR_TSC_ENABLE":"c","PR_TSC_SIGSEGV":"c","PR_UNALIGN_NOPRINT":"c","PR_UNALIGN_SIGBUS":"c","PTRACE_ARCH_PRCTL":"c","PTRACE_ATTACH":"c","PTRACE_CONT":"c","PTRACE_DETACH":"c","PTRACE_EVENT_CLONE":"c","PTRACE_EVENT_EXEC":"c","PTRACE_EVENT_EXIT":"c","PTRACE_EVENT_FORK":"c","PTRACE_EVENT_VFORK":"c","PTRACE_EVENT_VFORK_DONE":"c","PTRACE_GETEVENTMSG":"c","PTRACE_GETFPREGS":"c","PTRACE_GETFPXREGS":"c","PTRACE_GETREGS":"c","PTRACE_GETREGSET":"c","PTRACE_GETSIGINFO":"c","PTRACE_GET_THREAD_AREA":"c","PTRACE_KILL":"c","PTRACE_OLDSETOPTIONS":"c","PTRACE_O_MASK":"c","PTRACE_O_TRACECLONE":"c","PTRACE_O_TRACEEXEC":"c","PTRACE_O_TRACEEXIT":"c","PTRACE_O_TRACEFORK":"c","PTRACE_O_TRACESYSGOOD":"c","PTRACE_O_TRACEVFORK":"c","PTRACE_O_TRACEVFORKDONE":"c","PTRACE_PEEKDATA":"c","PTRACE_PEEKTEXT":"c","PTRACE_PEEKUSR":"c","PTRACE_POKEDATA":"c","PTRACE_POKETEXT":"c","PTRACE_POKEUSR":"c","PTRACE_SETFPREGS":"c","PTRACE_SETFPXREGS":"c","PTRACE_SETOPTIONS":"c","PTRACE_SETREGS":"c","PTRACE_SETREGSET":"c","PTRACE_SETSIGINFO":"c","PTRACE_SET_THREAD_AREA":"c","PTRACE_SINGLEBLOCK":"c","PTRACE_SINGLESTEP":"c","PTRACE_SYSCALL":"c","PTRACE_SYSEMU":"c","PTRACE_SYSEMU_SINGLESTEP":"c","PTRACE_TRACEME":"c","ParseDirent":"f","ParseNetlinkMessage":"f","ParseNetlinkRouteAttr":"f","ParseSocketControlMessage":"f","ParseUnixCredentials":"f","ParseUnixRights":"f","PathMax":"c","Pause":"f","Pipe":"f","Pipe2":"f","PivotRoot":"f","Pread":"f","ProcAttr":"t","PtraceAttach":"f","PtraceCont":"f","PtraceDetach":"f","PtraceGetEventMsg":"f","PtraceGetRegs":"f","PtracePeekData":"f","PtracePeekText":"f","PtracePokeData":"f","PtracePokeText":"f","PtraceRegs":"t","PtraceRegs.PC":"m","PtraceRegs.SetPC":"m","PtraceSetOptions":"f","PtraceSetRegs":"f","PtraceSingleStep":"f","PtraceSyscall":"f","Pwrite":"f","RLIMIT_AS":"c","RLIMIT_CORE":"c","RLIMIT_CPU":"c","RLIMIT_DATA":"c","RLIMIT_FSIZE":"c","RLIMIT_NOFILE":"c","RLIMIT_STACK":"c","RLIM_INFINITY":"c","RTAX_ADVMSS":"c","RTAX_CWND":"c","RTAX_FEATURES":"c","RTAX_FEATURE_ALLFRAG":"c","RTAX_FEATURE_ECN":"c","RTAX_FEATURE_SACK":"c","RTAX_FEATURE_TIMESTAMP":"c","RTAX_HOPLIMIT":"c","RTAX_INITCWND":"c","RTAX_INITRWND":"c","RTAX_LOCK":"c","RTAX_MAX":"c","RTAX_MTU":"c","RTAX_REORDERING":"c","RTAX_RTO_MIN":"c","RTAX_RTT":"c","RTAX_RTTVAR":"c","RTAX_SSTHRESH":"c","RTAX_UNSPEC":"c","RTAX_WINDOW":"c","RTA_ALIGNTO":"c","RTA_CACHEINFO":"c","RTA_DST":"c","RTA_FLOW":"c","RTA_GATEWAY":"c","RTA_IIF":"c","RTA_MAX":"c","RTA_METRICS":"c","RTA_MULTIPATH":"c","RTA_OIF":"c","RTA_PREFSRC":"c","RTA_PRIORITY":"c","RTA_SRC":"c","RTA_TABLE":"c","RTA_UNSPEC":"c","RTCF_DIRECTSRC":"c","RTCF_DOREDIRECT":"c","RTCF_LOG":"c","RTCF_MASQ":"c","RTCF_NAT":"c","RTCF_VALVE":"c","RTF_ADDRCLASSMASK":"c","RTF_ADDRCONF":"c","RTF_ALLONLINK":"c","RTF_BROADCAST":"c","RTF_CACHE":"c","RTF_DEFAULT":"c","RTF_DYNAMIC":"c","RTF_FLOW":"c","RTF_GATEWAY":"c","RTF_HOST":"c","RTF_INTERFACE":"c","RTF_IRTT":"c","RTF_LINKRT":"c","RTF_LOCAL":"c","RTF_MODIFIED":"c","RTF_MSS":"c","RTF_MTU":"c","RTF_MULTICAST":"c","RTF_NAT":"c","RTF_NOFORWARD":"c","RTF_NONEXTHOP":"c","RTF_NOPMTUDISC":"c","RTF_POLICY":"c","RTF_REINSTATE":"c","RTF_REJECT":"c","RTF_STATIC":"c","RTF_THROW":"c","RTF_UP":"c","RTF_WINDOW":"c","RTF_XRESOLVE":"c","RTM_BASE":"c","RTM_DELACTION":"c","RTM_DELADDR":"c","RTM_DELADDRLABEL":"c","RTM_DELLINK":"c","RTM_DELNEIGH":"c","RTM_DELQDISC":"c","RTM_DELROUTE":"c","RTM_DELRULE":"c","RTM_DELTCLASS":"c","RTM_DELTFILTER":"c","RTM_F_CLONED":"c","RTM_F_EQUALIZE":"c","RTM_F_NOTIFY":"c","RTM_F_PREFIX":"c","RTM_GETACTION":"c","RTM_GETADDR":"c","RTM_GETADDRLABEL":"c","RTM_GETANYCAST":"c","RTM_GETDCB":"c","RTM_GETLINK":"c","RTM_GETMULTICAST":"c","RTM_GETNEIGH":"c","RTM_GETNEIGHTBL":"c","RTM_GETQDISC":"c","RTM_GETROUTE":"c","RTM_GETRULE":"c","RTM_GETTCLASS":"c","RTM_GETTFILTER":"c","RTM_MAX":"c","RTM_NEWACTION":"c","RTM_NEWADDR":"c","RTM_NEWADDRLABEL":"c","RTM_NEWLINK":"c","RTM_NEWNDUSEROPT":"c","RTM_NEWNEIGH":"c","RTM_NEWNEIGHTBL":"c","RTM_NEWPREFIX":"c","RTM_NEWQDISC":"c","RTM_NEWROUTE":"c","RTM_NEWRULE":"c","RTM_NEWTCLASS":"c","RTM_NEWTFILTER":"c","RTM_NR_FAMILIES":"c","RTM_NR_MSGTYPES":"c","RTM_SETDCB":"c","RTM_SETLINK":"c","RTM_SETNEIGHTBL":"c","RTNH_ALIGNTO":"c","RTNH_F_DEAD":"c","RTNH_F_ONLINK":"c","RTNH_F_PERVASIVE":"c","RTNLGRP_IPV4_IFADDR":"c","RTNLGRP_IPV4_MROUTE":"c","RTNLGRP_IPV4_ROUTE":"c","RTNLGRP_IPV4_RULE":"c","RTNLGRP_IPV6_IFADDR":"c","RTNLGRP_IPV6_IFINFO":"c","RTNLGRP_IPV6_MROUTE":"c","RTNLGRP_IPV6_PREFIX":"c","RTNLGRP_IPV6_ROUTE":"c","RTNLGRP_IPV6_RULE":"c","RTNLGRP_LINK":"c","RTNLGRP_ND_USEROPT":"c","RTNLGRP_NEIGH":"c","RTNLGRP_NONE":"c","RTNLGRP_NOTIFY":"c","RTNLGRP_TC":"c","RTN_ANYCAST":"c","RTN_BLACKHOLE":"c","RTN_BROADCAST":"c","RTN_LOCAL":"c","RTN_MAX":"c","RTN_MULTICAST":"c","RTN_NAT":"c","RTN_PROHIBIT":"c","RTN_THROW":"c","RTN_UNICAST":"c","RTN_UNREACHABLE":"c","RTN_UNSPEC":"c","RTN_XRESOLVE":"c","RTPROT_BIRD":"c","RTPROT_BOOT":"c","RTPROT_DHCP":"c","RTPROT_DNROUTED":"c","RTPROT_GATED":"c","RTPROT_KERNEL":"c","RTPROT_MRT":"c","RTPROT_NTK":"c","RTPROT_RA":"c","RTPROT_REDIRECT":"c","RTPROT_STATIC":"c","RTPROT_UNSPEC":"c","RTPROT_XORP":"c","RTPROT_ZEBRA":"c","RT_CLASS_DEFAULT":"c","RT_CLASS_LOCAL":"c","RT_CLASS_MAIN":"c","RT_CLASS_MAX":"c","RT_CLASS_UNSPEC":"c","RT_SCOPE_HOST":"c","RT_SCOPE_LINK":"c","RT_SCOPE_NOWHERE":"c","RT_SCOPE_SITE":"c","RT_SCOPE_UNIVERSE":"c","RT_TABLE_COMPAT":"c","RT_TABLE_DEFAULT":"c","RT_TABLE_LOCAL":"c","RT_TABLE_MAIN":"c","RT_TABLE_MAX":"c","RT_TABLE_UNSPEC":"c","RUSAGE_CHILDREN":"c","RUSAGE_SELF":"c","RUSAGE_THREAD":"c","RawConn":"t","RawSockaddr":"t","RawSockaddrAny":"t","RawSockaddrInet4":"t","RawSockaddrInet6":"t","RawSockaddrLinklayer":"t","RawSockaddrNetlink":"t","RawSockaddrUnix":"t","RawSyscall":"f","RawSyscall6":"f","Read":"f","ReadDirent":"f","Readlink":"f","Reboot":"f","Recvfrom":"f","Recvmsg":"f","Removexattr":"f","Rename":"f","Renameat":"f","Rlimit":"t","Rmdir":"f","RtAttr":"t","RtGenmsg":"t","RtMsg":"t","RtNexthop":"t","Rusage":"t","SCM_CREDENTIALS":"c","SCM_RIGHTS":"c","SCM_TIMESTAMP":"c","SCM_TIMESTAMPING":"c","SCM_TIMESTAMPNS":"c","SHUT_RD":"c","SHUT_RDWR":"c","SHUT_WR":"c","SIGABRT":"c","SIGALRM":"c","SIGBUS":"c","SIGCHLD":"c","SIGCLD":"c","SIGCONT":"c","SIGFPE":"c","SIGHUP":"c","SIGILL":"c","SIGINT":"c","SIGIO":"c","SIGIOT":"c","SIGKILL":"c","SIGPIPE":"c","SIGPOLL":"c","SIGPROF":"c","SIGPWR":"c","SIGQUIT":"c","SIGSEGV":"c","SIGSTKFLT":"c","SIGSTOP":"c","SIGSYS":"c","SIGTERM":"c","SIGTRAP":"c","SIGTSTP":"c","SIGTTIN":"c","SIGTTOU":"c","SIGUNUSED":"c","SIGURG":"c","SIGUSR1":"c","SIGUSR2":"c","SIGVTALRM":"c","SIGWINCH":"c","SIGXCPU":"c","SIGXFSZ":"c","SIOCADDDLCI":"c","SIOCADDMULTI":"c","SIOCADDRT":"c","SIOCATMARK":"c","SIOCDARP":"c","SIOCDELDLCI":"c","SIOCDELMULTI":"c","SIOCDELRT":"c","SIOCDEVPRIVATE":"c","SIOCDIFADDR":"c","SIOCDRARP":"c","SIOCGARP":"c","SIOCGIFADDR":"c","SIOCGIFBR":"c","SIOCGIFBRDADDR":"c","SIOCGIFCONF":"c","SIOCGIFCOUNT":"c","SIOCGIFDSTADDR":"c","SIOCGIFENCAP":"c","SIOCGIFFLAGS":"c","SIOCGIFHWADDR":"c","SIOCGIFINDEX":"c","SIOCGIFMAP":"c","SIOCGIFMEM":"c","SIOCGIFMETRIC":"c","SIOCGIFMTU":"c","SIOCGIFNAME":"c","SIOCGIFNETMASK":"c","SIOCGIFPFLAGS":"c","SIOCGIFSLAVE":"c","SIOCGIFTXQLEN":"c","SIOCGPGRP":"c","SIOCGRARP":"c","SIOCGSTAMP":"c","SIOCGSTAMPNS":"c","SIOCPROTOPRIVATE":"c","SIOCRTMSG":"c","SIOCSARP":"c","SIOCSIFADDR":"c","SIOCSIFBR":"c","SIOCSIFBRDADDR":"c","SIOCSIFDSTADDR":"c","SIOCSIFENCAP":"c","SIOCSIFFLAGS":"c","SIOCSIFHWADDR":"c","SIOCSIFHWBROADCAST":"c","SIOCSIFLINK":"c","SIOCSIFMAP":"c","SIOCSIFMEM":"c","SIOCSIFMETRIC":"c","SIOCSIFMTU":"c","SIOCSIFNAME":"c","SIOCSIFNETMASK":"c","SIOCSIFPFLAGS":"c","SIOCSIFSLAVE":"c","SIOCSIFTXQLEN":"c","SIOCSPGRP":"c","SIOCSRARP":"c","SOCK_CLOEXEC":"c","SOCK_DCCP":"c","SOCK_DGRAM":"c","SOCK_NONBLOCK":"c","SOCK_PACKET":"c","SOCK_RAW":"c","SOCK_RDM":"c","SOCK_SEQPACKET":"c","SOCK_STREAM":"c","SOL_AAL":"c","SOL_ATM":"c","SOL_DECNET":"c","SOL_ICMPV6":"c","SOL_IP":"c","SOL_IPV6":"c","SOL_IRDA":"c","SOL_PACKET":"c","SOL_RAW":"c","SOL_SOCKET":"c","SOL_TCP":"c","SOL_X25":"c","SOMAXCONN":"c","SO_ACCEPTCONN":"c","SO_ATTACH_FILTER":"c","SO_BINDTODEVICE":"c","SO_BROADCAST":"c","SO_BSDCOMPAT":"c","SO_DEBUG":"c","SO_DETACH_FILTER":"c","SO_DOMAIN":"c","SO_DONTROUTE":"c","SO_ERROR":"c","SO_KEEPALIVE":"c","SO_LINGER":"c","SO_MARK":"c","SO_NO_CHECK":"c","SO_OOBINLINE":"c","SO_PASSCRED":"c","SO_PASSSEC":"c","SO_PEERCRED":"c","SO_PEERNAME":"c","SO_PEERSEC":"c","SO_PRIORITY":"c","SO_PROTOCOL":"c","SO_RCVBUF":"c","SO_RCVBUFFORCE":"c","SO_RCVLOWAT":"c","SO_RCVTIMEO":"c","SO_REUSEADDR":"c","SO_RXQ_OVFL":"c","SO_SECURITY_AUTHENTICATION":"c","SO_SECURITY_ENCRYPTION_NETWORK":"c","SO_SECURITY_ENCRYPTION_TRANSPORT":"c","SO_SNDBUF":"c","SO_SNDBUFFORCE":"c","SO_SNDLOWAT":"c","SO_SNDTIMEO":"c","SO_TIMESTAMP":"c","SO_TIMESTAMPING":"c","SO_TIMESTAMPNS":"c","SO_TYPE":"c","SYS_ACCEPT":"c","SYS_ACCEPT4":"c","SYS_ACCESS":"c","SYS_ACCT":"c","SYS_ADD_KEY":"c","SYS_ADJTIMEX":"c","SYS_AFS_SYSCALL":"c","SYS_ALARM":"c","SYS_ARCH_PRCTL":"c","SYS_BIND":"c","SYS_BRK":"c","SYS_CAPGET":"c","SYS_CAPSET":"c","SYS_CHDIR":"c","SYS_CHMOD":"c","SYS_CHOWN":"c","SYS_CHROOT":"c","SYS_CLOCK_GETRES":"c","SYS_CLOCK_GETTIME":"c","SYS_CLOCK_NANOSLEEP":"c","SYS_CLOCK_SETTIME":"c","SYS_CLONE":"c","SYS_CLOSE":"c","SYS_CONNECT":"c","SYS_CREAT":"c","SYS_CREATE_MODULE":"c","SYS_DELETE_MODULE":"c","SYS_DUP":"c","SYS_DUP2":"c","SYS_DUP3":"c","SYS_EPOLL_CREATE":"c","SYS_EPOLL_CREATE1":"c","SYS_EPOLL_CTL":"c","SYS_EPOLL_CTL_OLD":"c","SYS_EPOLL_PWAIT":"c","SYS_EPOLL_WAIT":"c","SYS_EPOLL_WAIT_OLD":"c","SYS_EVENTFD":"c","SYS_EVENTFD2":"c","SYS_EXECVE":"c","SYS_EXIT":"c","SYS_EXIT_GROUP":"c","SYS_FACCESSAT":"c","SYS_FADVISE64":"c","SYS_FALLOCATE":"c","SYS_FANOTIFY_INIT":"c","SYS_FANOTIFY_MARK":"c","SYS_FCHDIR":"c","SYS_FCHMOD":"c","SYS_FCHMODAT":"c","SYS_FCHOWN":"c","SYS_FCHOWNAT":"c","SYS_FCNTL":"c","SYS_FDATASYNC":"c","SYS_FGETXATTR":"c","SYS_FLISTXATTR":"c","SYS_FLOCK":"c","SYS_FORK":"c","SYS_FREMOVEXATTR":"c","SYS_FSETXATTR":"c","SYS_FSTAT":"c","SYS_FSTATFS":"c","SYS_FSYNC":"c","SYS_FTRUNCATE":"c","SYS_FUTEX":"c","SYS_FUTIMESAT":"c","SYS_GETCWD":"c","SYS_GETDENTS":"c","SYS_GETDENTS64":"c","SYS_GETEGID":"c","SYS_GETEUID":"c","SYS_GETGID":"c","SYS_GETGROUPS":"c","SYS_GETITIMER":"c","SYS_GETPEERNAME":"c","SYS_GETPGID":"c","SYS_GETPGRP":"c","SYS_GETPID":"c","SYS_GETPMSG":"c","SYS_GETPPID":"c","SYS_GETPRIORITY":"c","SYS_GETRESGID":"c","SYS_GETRESUID":"c","SYS_GETRLIMIT":"c","SYS_GETRUSAGE":"c","SYS_GETSID":"c","SYS_GETSOCKNAME":"c","SYS_GETSOCKOPT":"c","SYS_GETTID":"c","SYS_GETTIMEOFDAY":"c","SYS_GETUID":"c","SYS_GETXATTR":"c","SYS_GET_KERNEL_SYMS":"c","SYS_GET_MEMPOLICY":"c","SYS_GET_ROBUST_LIST":"c","SYS_GET_THREAD_AREA":"c","SYS_INIT_MODULE":"c","SYS_INOTIFY_ADD_WATCH":"c","SYS_INOTIFY_INIT":"c","SYS_INOTIFY_INIT1":"c","SYS_INOTIFY_RM_WATCH":"c","SYS_IOCTL":"c","SYS_IOPERM":"c","SYS_IOPL":"c","SYS_IOPRIO_GET":"c","SYS_IOPRIO_SET":"c","SYS_IO_CANCEL":"c","SYS_IO_DESTROY":"c","SYS_IO_GETEVENTS":"c","SYS_IO_SETUP":"c","SYS_IO_SUBMIT":"c","SYS_KEXEC_LOAD":"c","SYS_KEYCTL":"c","SYS_KILL":"c","SYS_LCHOWN":"c","SYS_LGETXATTR":"c","SYS_LINK":"c","SYS_LINKAT":"c","SYS_LISTEN":"c","SYS_LISTXATTR":"c","SYS_LLISTXATTR":"c","SYS_LOOKUP_DCOOKIE":"c","SYS_LREMOVEXATTR":"c","SYS_LSEEK":"c","SYS_LSETXATTR":"c","SYS_LSTAT":"c","SYS_MADVISE":"c","SYS_MBIND":"c","SYS_MIGRATE_PAGES":"c","SYS_MINCORE":"c","SYS_MKDIR":"c","SYS_MKDIRAT":"c","SYS_MKNOD":"c","SYS_MKNODAT":"c","SYS_MLOCK":"c","SYS_MLOCKALL":"c","SYS_MMAP":"c","SYS_MODIFY_LDT":"c","SYS_MOUNT":"c","SYS_MOVE_PAGES":"c","SYS_MPROTECT":"c","SYS_MQ_GETSETATTR":"c","SYS_MQ_NOTIFY":"c","SYS_MQ_OPEN":"c","SYS_MQ_TIMEDRECEIVE":"c","SYS_MQ_TIMEDSEND":"c","SYS_MQ_UNLINK":"c","SYS_MREMAP":"c","SYS_MSGCTL":"c","SYS_MSGGET":"c","SYS_MSGRCV":"c","SYS_MSGSND":"c","SYS_MSYNC":"c","SYS_MUNLOCK":"c","SYS_MUNLOCKALL":"c","SYS_MUNMAP":"c","SYS_NANOSLEEP":"c","SYS_NEWFSTATAT":"c","SYS_NFSSERVCTL":"c","SYS_OPEN":"c","SYS_OPENAT":"c","SYS_PAUSE":"c","SYS_PERF_EVENT_OPEN":"c","SYS_PERSONALITY":"c","SYS_PIPE":"c","SYS_PIPE2":"c","SYS_PIVOT_ROOT":"c","SYS_POLL":"c","SYS_PPOLL":"c","SYS_PRCTL":"c","SYS_PREAD64":"c","SYS_PREADV":"c","SYS_PRLIMIT64":"c","SYS_PSELECT6":"c","SYS_PTRACE":"c","SYS_PUTPMSG":"c","SYS_PWRITE64":"c","SYS_PWRITEV":"c","SYS_QUERY_MODULE":"c","SYS_QUOTACTL":"c","SYS_READ":"c","SYS_READAHEAD":"c","SYS_READLINK":"c","SYS_READLINKAT":"c","SYS_READV":"c","SYS_REBOOT":"c","SYS_RECVFROM":"c","SYS_RECVMMSG":"c","SYS_RECVMSG":"c","SYS_REMAP_FILE_PAGES":"c","SYS_REMOVEXATTR":"c","SYS_RENAME":"c","SYS_RENAMEAT":"c","SYS_REQUEST_KEY":"c","SYS_RESTART_SYSCALL":"c","SYS_RMDIR":"c","SYS_RT_SIGACTION":"c","SYS_RT_SIGPENDING":"c","SYS_RT_SIGPROCMASK":"c","SYS_RT_SIGQUEUEINFO":"c","SYS_RT_SIGRETURN":"c","SYS_RT_SIGSUSPEND":"c","SYS_RT_SIGTIMEDWAIT":"c","SYS_RT_TGSIGQUEUEINFO":"c","SYS_SCHED_GETAFFINITY":"c","SYS_SCHED_GETPARAM":"c","SYS_SCHED_GETSCHEDULER":"c","SYS_SCHED_GET_PRIORITY_MAX":"c","SYS_SCHED_GET_PRIORITY_MIN":"c","SYS_SCHED_RR_GET_INTERVAL":"c","SYS_SCHED_SETAFFINITY":"c","SYS_SCHED_SETPARAM":"c","SYS_SCHED_SETSCHEDULER":"c","SYS_SCHED_YIELD":"c","SYS_SECURITY":"c","SYS_SELECT":"c","SYS_SEMCTL":"c","SYS_SEMGET":"c","SYS_SEMOP":"c","SYS_SEMTIMEDOP":"c","SYS_SENDFILE":"c","SYS_SENDMSG":"c","SYS_SENDTO":"c","SYS_SETDOMAINNAME":"c","SYS_SETFSGID":"c","SYS_SETFSUID":"c","SYS_SETGID":"c","SYS_SETGROUPS":"c","SYS_SETHOSTNAME":"c","SYS_SETITIMER":"c","SYS_SETPGID":"c","SYS_SETPRIORITY":"c","SYS_SETREGID":"c","SYS_SETRESGID":"c","SYS_SETRESUID":"c","SYS_SETREUID":"c","SYS_SETRLIMIT":"c","SYS_SETSID":"c","SYS_SETSOCKOPT":"c","SYS_SETTIMEOFDAY":"c","SYS_SETUID":"c","SYS_SETXATTR":"c","SYS_SET_MEMPOLICY":"c","SYS_SET_ROBUST_LIST":"c","SYS_SET_THREAD_AREA":"c","SYS_SET_TID_ADDRESS":"c","SYS_SHMAT":"c","SYS_SHMCTL":"c","SYS_SHMDT":"c","SYS_SHMGET":"c","SYS_SHUTDOWN":"c","SYS_SIGALTSTACK":"c","SYS_SIGNALFD":"c","SYS_SIGNALFD4":"c","SYS_SOCKET":"c","SYS_SOCKETPAIR":"c","SYS_SPLICE":"c","SYS_STAT":"c","SYS_STATFS":"c","SYS_SWAPOFF":"c","SYS_SWAPON":"c","SYS_SYMLINK":"c","SYS_SYMLINKAT":"c","SYS_SYNC":"c","SYS_SYNC_FILE_RANGE":"c","SYS_SYSFS":"c","SYS_SYSINFO":"c","SYS_SYSLOG":"c","SYS_TEE":"c","SYS_TGKILL":"c","SYS_TIME":"c","SYS_TIMERFD_CREATE":"c","SYS_TIMERFD_GETTIME":"c","SYS_TIMERFD_SETTIME":"c","SYS_TIMER_CREATE":"c","SYS_TIMER_DELETE":"c","SYS_TIMER_GETOVERRUN":"c","SYS_TIMER_GETTIME":"c","SYS_TIMER_SETTIME":"c","SYS_TIMES":"c","SYS_TKILL":"c","SYS_TRUNCATE":"c","SYS_TUXCALL":"c","SYS_UMASK":"c","SYS_UMOUNT2":"c","SYS_UNAME":"c","SYS_UNLINK":"c","SYS_UNLINKAT":"c","SYS_UNSHARE":"c","SYS_USELIB":"c","SYS_USTAT":"c","SYS_UTIME":"c","SYS_UTIMENSAT":"c","SYS_UTIMES":"c","SYS_VFORK":"c","SYS_VHANGUP":"c","SYS_VMSPLICE":"c","SYS_VSERVER":"c","SYS_WAIT4":"c","SYS_WAITID":"c","SYS_WRITE":"c","SYS_WRITEV":"c","SYS__SYSCTL":"c","S_BLKSIZE":"c","S_IEXEC":"c","S_IFBLK":"c","S_IFCHR":"c","S_IFDIR":"c","S_IFIFO":"c","S_IFLNK":"c","S_IFMT":"c","S_IFREG":"c","S_IFSOCK":"c","S_IREAD":"c","S_IRGRP":"c","S_IROTH":"c","S_IRUSR":"c","S_IRWXG":"c","S_IRWXO":"c","S_IRWXU":"c","S_ISGID":"c","S_ISUID":"c","S_ISVTX":"c","S_IWGRP":"c","S_IWOTH":"c","S_IWRITE":"c","S_IWUSR":"c","S_IXGRP":"c","S_IXOTH":"c","S_IXUSR":"c","Seek":"f","Select":"f","Sendfile":"f","Sendmsg":"f","SendmsgN":"f","Sendto":"f","SetLsfPromisc":"f","SetNonblock":"f","Setdomainname":"f","Setegid":"f","Setenv":"f","Seteuid":"f","Setfsgid":"f","Setfsuid":"f","Setgid":"f","Setgroups":"f","Sethostname":"f","Setpgid":"f","Setpriority":"f","Setregid":"f","Setresgid":"f","Setresuid":"f","Setreuid":"f","Setrlimit":"f","Setsid":"f","SetsockoptByte":"f","SetsockoptICMPv6Filter":"f","SetsockoptIPMreq":"f","SetsockoptIPMreqn":"f","SetsockoptIPv6Mreq":"f","SetsockoptInet4Addr":"f","SetsockoptInt":"f","SetsockoptLinger":"f","SetsockoptString":"f","SetsockoptTimeval":"f","Settimeofday":"f","Setuid":"f","Setxattr":"f","Shutdown":"f","Signal":"t","Signal.Signal":"m","Signal.String":"m","SizeofCmsghdr":"c","SizeofICMPv6Filter":"c","SizeofIPMreq":"c","SizeofIPMreqn":"c","SizeofIPv6MTUInfo":"c","SizeofIPv6Mreq":"c","SizeofIfAddrmsg":"c","SizeofIfInfomsg":"c","SizeofInet4Pktinfo":"c","SizeofInet6Pktinfo":"c","SizeofInotifyEvent":"c","SizeofLinger":"c","SizeofMsghdr":"c","SizeofNlAttr":"c","SizeofNlMsgerr":"c","SizeofNlMsghdr":"c","SizeofRtAttr":"c","SizeofRtGenmsg":"c","SizeofRtMsg":"c","SizeofRtNexthop":"c","SizeofSockFilter":"c","SizeofSockFprog":"c","SizeofSockaddrAny":"c","SizeofSockaddrInet4":"c","SizeofSockaddrInet6":"c","SizeofSockaddrLinklayer":"c","SizeofSockaddrNetlink":"c","SizeofSockaddrUnix":"c","SizeofTCPInfo":"c","SizeofUcred":"c","SlicePtrFromStrings":"f","SockFilter":"t","SockFprog":"t","Sockaddr":"t","SockaddrInet4":"t","SockaddrInet6":"t","SockaddrLinklayer":"t","SockaddrNetlink":"t","SockaddrUnix":"t","Socket":"f","SocketControlMessage":"t","SocketDisableIPv6":"v","Socketpair":"f","Splice":"f","StartProcess":"f","Stat":"f","Stat_t":"t","Statfs":"f","Statfs_t":"t","Stderr":"v","Stdin":"v","Stdout":"v","StringBytePtr":"f","StringByteSlice":"f","StringSlicePtr":"f","Symlink":"f","Sync":"f","SyncFileRange":"f","SysProcAttr":"t","SysProcIDMap":"t","Syscall":"f","Syscall6":"f","Sysinfo":"f","Sysinfo_t":"t","TCGETS":"c","TCIFLUSH":"c","TCIOFLUSH":"c","TCOFLUSH":"c","TCPInfo":"t","TCP_CONGESTION":"c","TCP_CORK":"c","TCP_DEFER_ACCEPT":"c","TCP_INFO":"c","TCP_KEEPCNT":"c","TCP_KEEPIDLE":"c","TCP_KEEPINTVL":"c","TCP_LINGER2":"c","TCP_MAXSEG":"c","TCP_MAXWIN":"c","TCP_MAX_WINSHIFT":"c","TCP_MD5SIG":"c","TCP_MD5SIG_MAXKEYLEN":"c","TCP_MSS":"c","TCP_NODELAY":"c","TCP_QUICKACK":"c","TCP_SYNCNT":"c","TCP_WINDOW_CLAMP":"c","TCSETS":"c","TIOCCBRK":"c","TIOCCONS":"c","TIOCEXCL":"c","TIOCGDEV":"c","TIOCGETD":"c","TIOCGICOUNT":"c","TIOCGLCKTRMIOS":"c","TIOCGPGRP":"c","TIOCGPTN":"c","TIOCGRS485":"c","TIOCGSERIAL":"c","TIOCGSID":"c","TIOCGSOFTCAR":"c","TIOCGWINSZ":"c","TIOCINQ":"c","TIOCLINUX":"c","TIOCMBIC":"c","TIOCMBIS":"c","TIOCMGET":"c","TIOCMIWAIT":"c","TIOCMSET":"c","TIOCM_CAR":"c","TIOCM_CD":"c","TIOCM_CTS":"c","TIOCM_DSR":"c","TIOCM_DTR":"c","TIOCM_LE":"c","TIOCM_RI":"c","TIOCM_RNG":"c","TIOCM_RTS":"c","TIOCM_SR":"c","TIOCM_ST":"c","TIOCNOTTY":"c","TIOCNXCL":"c","TIOCOUTQ":"c","TIOCPKT":"c","TIOCPKT_DATA":"c","TIOCPKT_DOSTOP":"c","TIOCPKT_FLUSHREAD":"c","TIOCPKT_FLUSHWRITE":"c","TIOCPKT_IOCTL":"c","TIOCPKT_NOSTOP":"c","TIOCPKT_START":"c","TIOCPKT_STOP":"c","TIOCSBRK":"c","TIOCSCTTY":"c","TIOCSERCONFIG":"c","TIOCSERGETLSR":"c","TIOCSERGETMULTI":"c","TIOCSERGSTRUCT":"c","TIOCSERGWILD":"c","TIOCSERSETMULTI":"c","TIOCSERSWILD":"c","TIOCSER_TEMT":"c","TIOCSETD":"c","TIOCSIG":"c","TIOCSLCKTRMIOS":"c","TIOCSPGRP":"c","TIOCSPTLCK":"c","TIOCSRS485":"c","TIOCSSERIAL":"c","TIOCSSOFTCAR":"c","TIOCSTI":"c","TIOCSWINSZ":"c","TOSTOP":"c","TUNATTACHFILTER":"c","TUNDETACHFILTER":"c","TUNGETFEATURES":"c","TUNGETIFF":"c","TUNGETSNDBUF":"c","TUNGETVNETHDRSZ":"c","TUNSETDEBUG":"c","TUNSETGROUP":"c","TUNSETIFF":"c","TUNSETLINK":"c","TUNSETNOCSUM":"c","TUNSETOFFLOAD":"c","TUNSETOWNER":"c","TUNSETPERSIST":"c","TUNSETSNDBUF":"c","TUNSETTXFILTER":"c","TUNSETVNETHDRSZ":"c","Tee":"f","Termios":"t","Tgkill":"f","Time":"f","Time_t":"t","Times":"f","Timespec":"t","Timespec.Nano":"m","Timespec.Unix":"m","TimespecToNsec":"f","Timeval":"t","Timeval.Nano":"m","Timeval.Unix":"m","TimevalToNsec":"f","Timex":"t","Tms":"t","Truncate":"f","Ucred":"t","Umask":"f","Uname":"f","UnixCredentials":"f","UnixRights":"f","Unlink":"f","Unlinkat":"f","Unmount":"f","Unsetenv":"f","Unshare":"f","Ustat":"f","Ustat_t":"t","Utimbuf":"t","Utime":"f","Utimes":"f","UtimesNano":"f","Utsname":"t","VDISCARD":"c","VEOF":"c","VEOL":"c","VEOL2":"c","VERASE":"c","VINTR":"c","VKILL":"c","VLNEXT":"c","VMIN":"c","VQUIT":"c","VREPRINT":"c","VSTART":"c","VSTOP":"c","VSUSP":"c","VSWTC":"c","VTIME":"c","VWERASE":"c","WALL":"c","WCLONE":"c","WCONTINUED":"c","WEXITED":"c","WNOHANG":"c","WNOTHREAD":"c","WNOWAIT":"c","WORDSIZE":"c","WSTOPPED":"c","WUNTRACED":"c","Wait4":"f","WaitStatus":"t","WaitStatus.Continued":"m","WaitStatus.CoreDump":"m","WaitStatus.ExitStatus":"m","WaitStatus.Exited":"m","WaitStatus.Signal":"m","WaitStatus.Signaled":"m","WaitStatus.StopSignal":"m","WaitStatus.Stopped":"m","WaitStatus.TrapCause":"m","Write":"f","XCASE":"c"}},"testing":{"path":"testing","name":"testing","symbols":{"AllocsPerRun":"f","B":"t","B.Elapsed":"m","B.Loop":"m","B.ReportAllocs":"m","B.ReportMetric":"m","B.ResetTimer":"m","B.Run":"m","B.RunParallel":"m","B.SetBytes":"m","B.SetParallelism":"m","B.StartTimer":"m","B.StopTimer":"m","Benchmark":"f","BenchmarkResult":"t","BenchmarkResult.AllocedBytesPerOp":"m","BenchmarkResult.AllocsPerOp":"m","BenchmarkResult.MemString":"m","BenchmarkResult.NsPerOp":"m","BenchmarkResult.String":"m","Cover":"t","CoverBlock":"t","CoverMode":"f","Coverage":"f","F":"t","F.Add":"m","F.Fail":"m","F.Fuzz":"m","F.Helper":"m","F.Skipped":"m","Init":"f","InternalBenchmark":"t","InternalExample":"t","InternalFuzzTarget":"t","InternalTest":"t","M":"t","M.Run":"m","Main":"f","MainStart":"f","PB":"t","PB.Next":"m","RegisterCover":"f","RunBenchmarks":"f","RunExamples":"f","RunTests":"f","Short":"f","T":"t","T.Chdir":"m","T.Deadline":"m","T.Parallel":"m","T.Run":"m","T.Setenv":"m","TB":"t","Testing":"f","Verbose":"f"}},"testing/cryptotest":{"path":"testing/cryptotest","name":"cryptotest","symbols":{"SetGlobalRandom":"f"}},"testing/fstest":{"path":"testing/fstest","name":"fstest","symbols":{"MapFS":"t","MapFS.Glob":"m","MapFS.Lstat":"m","MapFS.Open":"m","MapFS.ReadDir":"m","MapFS.ReadFile":"m","MapFS.ReadLink":"m","MapFS.Stat":"m","MapFS.Sub":"m","MapFile":"t","TestFS":"f"}},"testing/iotest":{"path":"testing/iotest","name":"iotest","symbols":{"DataErrReader":"f","ErrReader":"f","ErrTimeout":"v","HalfReader":"f","NewReadLogger":"f","NewWriteLogger":"f","OneByteReader":"f","TestReader":"f","TimeoutReader":"f","TruncateWriter":"f"}},"testing/quick":{"path":"testing/quick","name":"quick","symbols":{"Check":"f","CheckEqual":"f","CheckEqualError":"t","CheckEqualError.Error":"m","CheckError":"t","CheckError.Error":"m","Config":"t","Generator":"t","SetupError":"t","SetupError.Error":"m","Value":"f"}},"testing/slogtest":{"path":"testing/slogtest","name":"slogtest","symbols":{"Run":"f","TestHandler":"f"}},"testing/synctest":{"path":"testing/synctest","name":"synctest","symbols":{"Sleep":"f","Test":"f","Wait":"f"}},"text/scanner":{"path":"text/scanner","name":"scanner","symbols":{"Char":"c","Comment":"c","EOF":"c","Float":"c","GoTokens":"c","GoWhitespace":"c","Ident":"c","Int":"c","Position":"t","Position.IsValid":"m","Position.String":"m","RawString":"c","ScanChars":"c","ScanComments":"c","ScanFloats":"c","ScanIdents":"c","ScanInts":"c","ScanRawStrings":"c","ScanStrings":"c","Scanner":"t","Scanner.Init":"m","Scanner.Next":"m","Scanner.Peek":"m","Scanner.Pos":"m","Scanner.Scan":"m","Scanner.TokenText":"m","SkipComments":"c","String":"c","TokenString":"f"}},"text/tabwriter":{"path":"text/tabwriter","name":"tabwriter","symbols":{"AlignRight":"c","Debug":"c","DiscardEmptyColumns":"c","Escape":"c","FilterHTML":"c","NewWriter":"f","StripEscape":"c","TabIndent":"c","Writer":"t","Writer.Flush":"m","Writer.Init":"m","Writer.Write":"m"}},"text/template":{"path":"text/template","name":"template","symbols":{"ExecError":"t","ExecError.Error":"m","ExecError.Unwrap":"m","FuncMap":"t","HTMLEscape":"f","HTMLEscapeString":"f","HTMLEscaper":"f","IsTrue":"f","JSEscape":"f","JSEscapeString":"f","JSEscaper":"f","Must":"f","New":"f","ParseFS":"f","ParseFiles":"f","ParseGlob":"f","Template":"t","Template.AddParseTree":"m","Template.Clone":"m","Template.DefinedTemplates":"m","Template.Delims":"m","Template.Execute":"m","Template.ExecuteTemplate":"m","Template.Funcs":"m","Template.Lookup":"m","Template.Name":"m","Template.New":"m","Template.Option":"m","Template.Parse":"m","Template.ParseFS":"m","Template.ParseFiles":"m","Template.ParseGlob":"m","Template.Templates":"m","URLQueryEscaper":"f"}},"text/template/parse":{"path":"text/template/parse","name":"parse","symbols":{"ActionNode":"t","ActionNode.Copy":"m","ActionNode.String":"m","BoolNode":"t","BoolNode.Copy":"m","BoolNode.String":"m","BranchNode":"t","BranchNode.Copy":"m","BranchNode.String":"m","BreakNode":"t","BreakNode.Copy":"m","BreakNode.String":"m","ChainNode":"t","ChainNode.Add":"m","ChainNode.Copy":"m","ChainNode.String":"m","CommandNode":"t","CommandNode.Copy":"m","CommandNode.String":"m","CommentNode":"t","CommentNode.Copy":"m","CommentNode.String":"m","ContinueNode":"t","ContinueNode.Copy":"m","ContinueNode.String":"m","DotNode":"t","DotNode.Copy":"m","DotNode.String":"m","DotNode.Type":"m","FieldNode":"t","FieldNode.Copy":"m","FieldNode.String":"m","IdentifierNode":"t","IdentifierNode.Copy":"m","IdentifierNode.SetPos":"m","IdentifierNode.SetTree":"m","IdentifierNode.String":"m","IfNode":"t","IfNode.Copy":"m","IsEmptyTree":"f","ListNode":"t","ListNode.Copy":"m","ListNode.CopyList":"m","ListNode.String":"m","Mode":"t","New":"f","NewIdentifier":"f","NilNode":"t","NilNode.Copy":"m","NilNode.String":"m","NilNode.Type":"m","Node":"t","NodeAction":"c","NodeBool":"c","NodeBreak":"c","NodeChain":"c","NodeCommand":"c","NodeComment":"c","NodeContinue":"c","NodeDot":"c","NodeField":"c","NodeIdentifier":"c","NodeIf":"c","NodeList":"c","NodeNil":"c","NodeNumber":"c","NodePipe":"c","NodeRange":"c","NodeString":"c","NodeTemplate":"c","NodeText":"c","NodeType":"t","NodeType.Type":"m","NodeVariable":"c","NodeWith":"c","NumberNode":"t","NumberNode.Copy":"m","NumberNode.String":"m","Parse":"f","ParseComments":"c","PipeNode":"t","PipeNode.Copy":"m","PipeNode.CopyPipe":"m","PipeNode.String":"m","Pos":"t","Pos.Position":"m","RangeNode":"t","RangeNode.Copy":"m","SkipFuncCheck":"c","StringNode":"t","StringNode.Copy":"m","StringNode.String":"m","TemplateNode":"t","TemplateNode.Copy":"m","TemplateNode.String":"m","TextNode":"t","TextNode.Copy":"m","TextNode.String":"m","Tree":"t","Tree.Copy":"m","Tree.ErrorContext":"m","Tree.Parse":"m","VariableNode":"t","VariableNode.Copy":"m","VariableNode.String":"m","WithNode":"t","WithNode.Copy":"m"}},"time":{"path":"time","name":"time","symbols":{"ANSIC":"c","After":"f","AfterFunc":"f","April":"c","August":"c","Date":"f","DateOnly":"c","DateTime":"c","December":"c","Duration":"t","Duration.Abs":"m","Duration.Hours":"m","Duration.Microseconds":"m","Duration.Milliseconds":"m","Duration.Minutes":"m","Duration.Nanoseconds":"m","Duration.Round":"m","Duration.Seconds":"m","Duration.String":"m","Duration.Truncate":"m","February":"c","FixedZone":"f","Friday":"c","Hour":"c","January":"c","July":"c","June":"c","Kitchen":"c","Layout":"c","LoadLocation":"f","LoadLocationFromTZData":"f","Local":"v","Location":"t","Location.String":"m","March":"c","May":"c","Microsecond":"c","Millisecond":"c","Minute":"c","Monday":"c","Month":"t","Month.String":"m","Nanosecond":"c","NewTicker":"f","NewTimer":"f","November":"c","Now":"f","October":"c","Parse":"f","ParseDuration":"f","ParseError":"t","ParseError.Error":"m","ParseInLocation":"f","RFC1123":"c","RFC1123Z":"c","RFC3339":"c","RFC3339Nano":"c","RFC822":"c","RFC822Z":"c","RFC850":"c","RubyDate":"c","Saturday":"c","Second":"c","September":"c","Since":"f","Sleep":"f","Stamp":"c","StampMicro":"c","StampMilli":"c","StampNano":"c","Sunday":"c","Thursday":"c","Tick":"f","Ticker":"t","Ticker.Reset":"m","Ticker.Stop":"m","Time":"t","Time.Add":"m","Time.AddDate":"m","Time.After":"m","Time.AppendBinary":"m","Time.AppendFormat":"m","Time.AppendText":"m","Time.Before":"m","Time.Clock":"m","Time.Compare":"m","Time.Date":"m","Time.Day":"m","Time.Equal":"m","Time.Format":"m","Time.GoString":"m","Time.GobDecode":"m","Time.GobEncode":"m","Time.Hour":"m","Time.ISOWeek":"m","Time.In":"m","Time.IsDST":"m","Time.IsZero":"m","Time.Local":"m","Time.Location":"m","Time.MarshalBinary":"m","Time.MarshalJSON":"m","Time.MarshalText":"m","Time.Minute":"m","Time.Month":"m","Time.Nanosecond":"m","Time.Round":"m","Time.Second":"m","Time.String":"m","Time.Sub":"m","Time.Truncate":"m","Time.UTC":"m","Time.Unix":"m","Time.UnixMicro":"m","Time.UnixMilli":"m","Time.UnixNano":"m","Time.UnmarshalBinary":"m","Time.UnmarshalJSON":"m","Time.UnmarshalText":"m","Time.Weekday":"m","Time.Year":"m","Time.YearDay":"m","Time.Zone":"m","Time.ZoneBounds":"m","TimeOnly":"c","Timer":"t","Timer.Reset":"m","Timer.Stop":"m","Tuesday":"c","UTC":"v","Unix":"f","UnixDate":"c","UnixMicro":"f","UnixMilli":"f","Until":"f","Wednesday":"c","Weekday":"t","Weekday.String":"m"}},"unicode":{"path":"unicode","name":"unicode","symbols":{"ASCII_Hex_Digit":"v","Adlam":"v","Ahom":"v","Anatolian_Hieroglyphs":"v","Arabic":"v","Armenian":"v","Avestan":"v","AzeriCase":"v","Balinese":"v","Bamum":"v","Bassa_Vah":"v","Batak":"v","Bengali":"v","Beria_Erfe":"v","Bhaiksuki":"v","Bidi_Control":"v","Bopomofo":"v","Brahmi":"v","Braille":"v","Buginese":"v","Buhid":"v","C":"v","Canadian_Aboriginal":"v","Carian":"v","CaseRange":"t","CaseRanges":"v","Categories":"v","CategoryAliases":"v","Caucasian_Albanian":"v","Cc":"v","Cf":"v","Chakma":"v","Cham":"v","Cherokee":"v","Chorasmian":"v","Cn":"v","Co":"v","Common":"v","Coptic":"v","Cs":"v","Cuneiform":"v","Cypriot":"v","Cypro_Minoan":"v","Cyrillic":"v","Dash":"v","Deprecated":"v","Deseret":"v","Devanagari":"v","Diacritic":"v","Digit":"v","Dives_Akuru":"v","Dogra":"v","Duployan":"v","Egyptian_Hieroglyphs":"v","Elbasan":"v","Elymaic":"v","Ethiopic":"v","Extender":"v","FoldCategory":"v","FoldScript":"v","Garay":"v","Georgian":"v","Glagolitic":"v","Gothic":"v","Grantha":"v","GraphicRanges":"v","Greek":"v","Gujarati":"v","Gunjala_Gondi":"v","Gurmukhi":"v","Gurung_Khema":"v","Han":"v","Hangul":"v","Hanifi_Rohingya":"v","Hanunoo":"v","Hatran":"v","Hebrew":"v","Hex_Digit":"v","Hiragana":"v","Hyphen":"v","IDS_Binary_Operator":"v","IDS_Trinary_Operator":"v","IDS_Unary_Operator":"v","ID_Compat_Math_Continue":"v","ID_Compat_Math_Start":"v","Ideographic":"v","Imperial_Aramaic":"v","In":"f","Inherited":"v","Inscriptional_Pahlavi":"v","Inscriptional_Parthian":"v","Is":"f","IsControl":"f","IsDigit":"f","IsGraphic":"f","IsLetter":"f","IsLower":"f","IsMark":"f","IsNumber":"f","IsOneOf":"f","IsPrint":"f","IsPunct":"f","IsSpace":"f","IsSymbol":"f","IsTitle":"f","IsUpper":"f","Javanese":"v","Join_Control":"v","Kaithi":"v","Kannada":"v","Katakana":"v","Kawi":"v","Kayah_Li":"v","Kharoshthi":"v","Khitan_Small_Script":"v","Khmer":"v","Khojki":"v","Khudawadi":"v","Kirat_Rai":"v","L":"v","LC":"v","Lao":"v","Latin":"v","Lepcha":"v","Letter":"v","Limbu":"v","Linear_A":"v","Linear_B":"v","Lisu":"v","Ll":"v","Lm":"v","Lo":"v","Logical_Order_Exception":"v","Lower":"v","LowerCase":"c","Lt":"v","Lu":"v","Lycian":"v","Lydian":"v","M":"v","Mahajani":"v","Makasar":"v","Malayalam":"v","Mandaic":"v","Manichaean":"v","Marchen":"v","Mark":"v","Masaram_Gondi":"v","MaxASCII":"c","MaxCase":"c","MaxLatin1":"c","MaxRune":"c","Mc":"v","Me":"v","Medefaidrin":"v","Meetei_Mayek":"v","Mende_Kikakui":"v","Meroitic_Cursive":"v","Meroitic_Hieroglyphs":"v","Miao":"v","Mn":"v","Modi":"v","Modifier_Combining_Mark":"v","Mongolian":"v","Mro":"v","Multani":"v","Myanmar":"v","N":"v","Nabataean":"v","Nag_Mundari":"v","Nandinagari":"v","Nd":"v","New_Tai_Lue":"v","Newa":"v","Nko":"v","Nl":"v","No":"v","Noncharacter_Code_Point":"v","Number":"v","Nushu":"v","Nyiakeng_Puachue_Hmong":"v","Ogham":"v","Ol_Chiki":"v","Ol_Onal":"v","Old_Hungarian":"v","Old_Italic":"v","Old_North_Arabian":"v","Old_Permic":"v","Old_Persian":"v","Old_Sogdian":"v","Old_South_Arabian":"v","Old_Turkic":"v","Old_Uyghur":"v","Oriya":"v","Osage":"v","Osmanya":"v","Other":"v","Other_Alphabetic":"v","Other_Default_Ignorable_Code_Point":"v","Other_Grapheme_Extend":"v","Other_ID_Continue":"v","Other_ID_Start":"v","Other_Lowercase":"v","Other_Math":"v","Other_Uppercase":"v","P":"v","Pahawh_Hmong":"v","Palmyrene":"v","Pattern_Syntax":"v","Pattern_White_Space":"v","Pau_Cin_Hau":"v","Pc":"v","Pd":"v","Pe":"v","Pf":"v","Phags_Pa":"v","Phoenician":"v","Pi":"v","Po":"v","Prepended_Concatenation_Mark":"v","PrintRanges":"v","Properties":"v","Ps":"v","Psalter_Pahlavi":"v","Punct":"v","Quotation_Mark":"v","Radical":"v","Range16":"t","Range32":"t","RangeTable":"t","Regional_Indicator":"v","Rejang":"v","ReplacementChar":"c","Runic":"v","S":"v","STerm":"v","Samaritan":"v","Saurashtra":"v","Sc":"v","Scripts":"v","Sentence_Terminal":"v","Sharada":"v","Shavian":"v","Siddham":"v","Sidetic":"v","SignWriting":"v","SimpleFold":"f","Sinhala":"v","Sk":"v","Sm":"v","So":"v","Soft_Dotted":"v","Sogdian":"v","Sora_Sompeng":"v","Soyombo":"v","Space":"v","SpecialCase":"t","SpecialCase.ToLower":"m","SpecialCase.ToTitle":"m","SpecialCase.ToUpper":"m","Sundanese":"v","Sunuwar":"v","Syloti_Nagri":"v","Symbol":"v","Syriac":"v","Tagalog":"v","Tagbanwa":"v","Tai_Le":"v","Tai_Tham":"v","Tai_Viet":"v","Tai_Yo":"v","Takri":"v","Tamil":"v","Tangsa":"v","Tangut":"v","Telugu":"v","Terminal_Punctuation":"v","Thaana":"v","Thai":"v","Tibetan":"v","Tifinagh":"v","Tirhuta":"v","Title":"v","TitleCase":"c","To":"f","ToLower":"f","ToTitle":"f","ToUpper":"f","Todhri":"v","Tolong_Siki":"v","Toto":"v","Tulu_Tigalari":"v","TurkishCase":"v","Ugaritic":"v","Unified_Ideograph":"v","Upper":"v","UpperCase":"c","UpperLower":"c","Vai":"v","Variation_Selector":"v","Version":"c","Vithkuqi":"v","Wancho":"v","Warang_Citi":"v","White_Space":"v","Yezidi":"v","Yi":"v","Z":"v","Zanabazar_Square":"v","Zl":"v","Zp":"v","Zs":"v"}},"unicode/utf16":{"path":"unicode/utf16","name":"utf16","symbols":{"AppendRune":"f","Decode":"f","DecodeRune":"f","Encode":"f","EncodeRune":"f","IsSurrogate":"f","RuneLen":"f"}},"unicode/utf8":{"path":"unicode/utf8","name":"utf8","symbols":{"AppendRune":"f","DecodeLastRune":"f","DecodeLastRuneInString":"f","DecodeRune":"f","DecodeRuneInString":"f","EncodeRune":"f","FullRune":"f","FullRuneInString":"f","MaxRune":"c","RuneCount":"f","RuneCountInString":"f","RuneError":"c","RuneLen":"f","RuneSelf":"c","RuneStart":"f","UTFMax":"c","Valid":"f","ValidRune":"f","ValidString":"f"}},"unique":{"path":"unique","name":"unique","symbols":{"Handle":"t","Make":"f"}},"unsafe":{"path":"unsafe","name":"unsafe","symbols":{"Add":"f","Alignof":"f","ArbitraryType":"t","IntegerType":"t","Offsetof":"f","Pointer":"t","Sizeof":"f","Slice":"f","SliceData":"f","String":"f","StringData":"f"}},"uuid":{"path":"uuid","name":"uuid","symbols":{"Max":"f","MustParse":"f","New":"f","NewV4":"f","NewV7":"f","Nil":"f","Parse":"f","UUID":"t","UUID.AppendText":"m","UUID.Compare":"m","UUID.MarshalText":"m","UUID.String":"m","UUID.UnmarshalText":"m"}},"weak":{"path":"weak","name":"weak","symbols":{"Make":"f","Pointer":"t"}}} \ No newline at end of file diff --git a/vendor/github.com/gofrs/flock/.golangci.yml b/vendor/github.com/gofrs/flock/.golangci.yml index bc837b26..b35be7de 100644 --- a/vendor/github.com/gofrs/flock/.golangci.yml +++ b/vendor/github.com/gofrs/flock/.golangci.yml @@ -6,7 +6,9 @@ formatters: - goimports settings: gofumpt: - extra-rules: true + extra: + clothe-returns: true + group-params: true linters: enable: diff --git a/vendor/github.com/gofrs/flock/flock.go b/vendor/github.com/gofrs/flock/flock.go index 4cb0746a..156c4bf2 100644 --- a/vendor/github.com/gofrs/flock/flock.go +++ b/vendor/github.com/gofrs/flock/flock.go @@ -1,5 +1,5 @@ // Copyright 2015 Tim Heckman. All rights reserved. -// Copyright 2018-2025 The Gofrs. All rights reserved. +// Copyright 2018-2026 The Gofrs. All rights reserved. // Use of this source code is governed by the BSD 3-Clause // license that can be found in the LICENSE file. @@ -100,7 +100,7 @@ func (f *Flock) Close() error { return f.Unlock() } -// Path returns the path as provided in NewFlock(). +// Path returns the path as provided in New(). func (f *Flock) Path() string { return f.path } diff --git a/vendor/github.com/gofrs/flock/flock_others.go b/vendor/github.com/gofrs/flock/flock_others.go index 92d0f7e9..822ace0d 100644 --- a/vendor/github.com/gofrs/flock/flock_others.go +++ b/vendor/github.com/gofrs/flock/flock_others.go @@ -1,5 +1,5 @@ // Copyright 2015 Tim Heckman. All rights reserved. -// Copyright 2018-2025 The Gofrs. All rights reserved. +// Copyright 2018-2026 The Gofrs. All rights reserved. // Use of this source code is governed by the BSD 3-Clause // license that can be found in the LICENSE file. diff --git a/vendor/github.com/gofrs/flock/flock_unix.go b/vendor/github.com/gofrs/flock/flock_unix.go index 77de7a88..c486c5e6 100644 --- a/vendor/github.com/gofrs/flock/flock_unix.go +++ b/vendor/github.com/gofrs/flock/flock_unix.go @@ -1,5 +1,5 @@ // Copyright 2015 Tim Heckman. All rights reserved. -// Copyright 2018-2025 The Gofrs. All rights reserved. +// Copyright 2018-2026 The Gofrs. All rights reserved. // Use of this source code is governed by the BSD 3-Clause // license that can be found in the LICENSE file. diff --git a/vendor/github.com/gofrs/flock/flock_unix_fcntl.go b/vendor/github.com/gofrs/flock/flock_unix_fcntl.go index 05c2f88c..76a29fc0 100644 --- a/vendor/github.com/gofrs/flock/flock_unix_fcntl.go +++ b/vendor/github.com/gofrs/flock/flock_unix_fcntl.go @@ -1,5 +1,5 @@ // Copyright 2015 Tim Heckman. All rights reserved. -// Copyright 2018-2025 The Gofrs. All rights reserved. +// Copyright 2018-2026 The Gofrs. All rights reserved. // Use of this source code is governed by the BSD 3-Clause // license that can be found in the LICENSE file. diff --git a/vendor/github.com/gofrs/flock/flock_windows.go b/vendor/github.com/gofrs/flock/flock_windows.go index aa144f15..d9f9f883 100644 --- a/vendor/github.com/gofrs/flock/flock_windows.go +++ b/vendor/github.com/gofrs/flock/flock_windows.go @@ -1,5 +1,5 @@ // Copyright 2015 Tim Heckman. All rights reserved. -// Copyright 2018-2025 The Gofrs. All rights reserved. +// Copyright 2018-2026 The Gofrs. All rights reserved. // Use of this source code is governed by the BSD 3-Clause // license that can be found in the LICENSE file. diff --git a/vendor/github.com/gofrs/flock/zizmor.yml b/vendor/github.com/gofrs/flock/zizmor.yml new file mode 100644 index 00000000..39d1b180 --- /dev/null +++ b/vendor/github.com/gofrs/flock/zizmor.yml @@ -0,0 +1,3 @@ +rules: + secrets-outside-env: + disable: true diff --git a/vendor/github.com/golangci/golangci-lint/v2/jsonschema/golangci.jsonschema.json b/vendor/github.com/golangci/golangci-lint/v2/jsonschema/golangci.jsonschema.json index bb4f0398..0d8b5be5 100644 --- a/vendor/github.com/golangci/golangci-lint/v2/jsonschema/golangci.jsonschema.json +++ b/vendor/github.com/golangci/golangci-lint/v2/jsonschema/golangci.jsonschema.json @@ -1087,6 +1087,23 @@ } } }, + "canonicalheaderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-default-exclusions": { + "type": "boolean", + "default": true + }, + "exclusions": { + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + } + } + }, "cyclopSettings": { "type": "object", "additionalProperties": false, @@ -5085,6 +5102,9 @@ "bodyclose": { "$ref": "#/definitions/settings/definitions/bodycloseSettings" }, + "canonicalheader": { + "$ref": "#/definitions/settings/definitions/canonicalheaderSettings" + }, "cyclop": { "$ref": "#/definitions/settings/definitions/cyclopSettings" }, diff --git a/vendor/github.com/golangci/golangci-lint/v2/jsonschema/golangci.next.jsonschema.json b/vendor/github.com/golangci/golangci-lint/v2/jsonschema/golangci.next.jsonschema.json index 0d8b5be5..249a9464 100644 --- a/vendor/github.com/golangci/golangci-lint/v2/jsonschema/golangci.next.jsonschema.json +++ b/vendor/github.com/golangci/golangci-lint/v2/jsonschema/golangci.next.jsonschema.json @@ -533,6 +533,7 @@ "G404", "G405", "G406", + "G407", "G408", "G501", "G502", @@ -663,18 +664,20 @@ "indent-error-flow", "inefficient-map-lookup", "line-length-limit", + "marshal-receiver", "max-control-nesting", "max-public-structs", "modifies-parameter", "modifies-value-receiver", + "multiline-if-init", "nested-structs", "optimize-operands-order", "package-comments", - "package-naming", "package-directory-mismatch", + "package-naming", + "range", "range-val-address", "range-val-in-closure", - "range", "receiver-naming", "redefines-builtin-id", "redundant-build-tag", @@ -702,6 +705,7 @@ "use-any", "use-errors-new", "use-fmt-print", + "use-slices-concat", "use-slices-sort", "use-waitgroup-go", "useless-break", @@ -1513,6 +1517,11 @@ "type": "boolean", "default": false }, + "allow-empty-blank-assignments": { + "description": "Allow empty literals the blank identifier receives.", + "type": "boolean", + "default": false + }, "explicit-mode":{ "description": "When true, only types marked with //exhaustruct:enforce directive or matching enforce-rx patterns are checked.", "type": "boolean", @@ -3453,7 +3462,7 @@ "properties": { "name": { "type": "string", - "enum": ["specify-disable-reason"] + "enum": ["specify-disable-reason", "specify-disable-rule"] }, "severity": { "type": "string", diff --git a/vendor/github.com/golangci/golangci-lint/v2/pkg/commands/run.go b/vendor/github.com/golangci/golangci-lint/v2/pkg/commands/run.go index 58417f9d..b019b8e9 100644 --- a/vendor/github.com/golangci/golangci-lint/v2/pkg/commands/run.go +++ b/vendor/github.com/golangci/golangci-lint/v2/pkg/commands/run.go @@ -690,7 +690,7 @@ func computeConfigSalt(cfg *config.Config) ([]byte, error) { configData := bytes.NewBufferString("linters.settings=") configData.Write(lintersSettingsBytes) - configData.WriteString("\nbuild-tags=%s" + strings.Join(cfg.Run.BuildTags, ",")) + configData.WriteString("\nbuild-tags=" + strings.Join(cfg.Run.BuildTags, ",")) h := sha256.New() if _, err := h.Write(configData.Bytes()); err != nil { diff --git a/vendor/github.com/golangci/golangci-lint/v2/pkg/config/linters_settings.go b/vendor/github.com/golangci/golangci-lint/v2/pkg/config/linters_settings.go index 527c5f6f..ed4567c2 100644 --- a/vendor/github.com/golangci/golangci-lint/v2/pkg/config/linters_settings.go +++ b/vendor/github.com/golangci/golangci-lint/v2/pkg/config/linters_settings.go @@ -490,14 +490,15 @@ type ExhaustructSettings struct { } type ExhaustructV5Settings struct { - EnforcePatterns []string `mapstructure:"enforce-patterns"` - IgnorePatterns []string `mapstructure:"ignore-patterns"` - OptionalPatterns []string `mapstructure:"optional-patterns"` - AllowEmpty bool `mapstructure:"allow-empty"` - AllowEmptyPatterns []string `mapstructure:"allow-empty-patterns"` - AllowEmptyReturns bool `mapstructure:"allow-empty-returns"` - AllowEmptyDeclarations bool `mapstructure:"allow-empty-declarations"` - ExplicitMode bool `mapstructure:"explicit-mode"` + EnforcePatterns []string `mapstructure:"enforce-patterns"` + IgnorePatterns []string `mapstructure:"ignore-patterns"` + OptionalPatterns []string `mapstructure:"optional-patterns"` + AllowEmpty bool `mapstructure:"allow-empty"` + AllowEmptyPatterns []string `mapstructure:"allow-empty-patterns"` + AllowEmptyReturns bool `mapstructure:"allow-empty-returns"` + AllowEmptyDeclarations bool `mapstructure:"allow-empty-declarations"` + AllowEmptyBlankAssignments bool `mapstructure:"allow-empty-blank-assignments"` + ExplicitMode bool `mapstructure:"explicit-mode"` } type FatcontextSettings struct { diff --git a/vendor/github.com/golangci/golangci-lint/v2/pkg/goanalysis/runner_action_cache.go b/vendor/github.com/golangci/golangci-lint/v2/pkg/goanalysis/runner_action_cache.go index 8fcacf6e..233db8cb 100644 --- a/vendor/github.com/golangci/golangci-lint/v2/pkg/goanalysis/runner_action_cache.go +++ b/vendor/github.com/golangci/golangci-lint/v2/pkg/goanalysis/runner_action_cache.go @@ -16,40 +16,49 @@ type Fact struct { Fact analysis.Fact } -func (act *action) loadCachedFacts() bool { - if act.loadCachedFactsDone { // can't be set in parallel +func (act *action) loadActionCachedFacts(reload bool) bool { + if reload { + if !act.loadCachedFactsOk { + return act.loadCachedFactsOk + } + } else if act.loadCachedFactsDone { // can't be set in parallel return act.loadCachedFactsOk } - res := func() bool { - if act.isInitialPkg { - return true // load cached facts only for non-initial packages - } + act.loadCachedFactsOk = act.loadCacheFacts(reload) + act.loadCachedFactsDone = true - if len(act.Analyzer.FactTypes) == 0 { - return true // no need to load facts - } + return act.loadCachedFactsOk +} - if !act.loadPersistedFacts() { - return false - } +func (act *action) loadCacheFacts(reset bool) bool { + if act.isInitialPkg { + return true // load cached facts only for non-initial packages + } - // The cache only stores the facts a package produces about its own objects. - // The facts a package re-exports from its dependencies (see exportedFrom) are not persisted, - // to avoid duplicating them in every cache entry (which grows quadratically with the import graph). - // Instead, we rebuild them in memory here by inheriting from the dependencies, - // exactly like analyze() does for packages analyzed from source. - // This is safe because every dependency is fully analyzed (from cache or source) before this package is loaded, - // so their facts are already available. - act.inheritFactsFromDeps() + if len(act.Analyzer.FactTypes) == 0 { + return true // no need to load facts + } - return true - }() + if reset { + act.objectFacts = make(map[objectFactKey]analysis.Fact) + act.packageFacts = make(map[packageFactKey]analysis.Fact) + } - act.loadCachedFactsDone = true - act.loadCachedFactsOk = res + if !act.loadPersistedFacts() { + return false + } + + // The cache only stores the facts a package produces about its own objects. + // The facts a package re-exports from its dependencies (see exportedFrom) are not persisted, + // to avoid duplicating them in every cache entry (which grows quadratically with the import graph). + // Instead, we rebuild them in memory here by inheriting from the dependencies, + // exactly like analyze() does for packages analyzed from source. + // This is safe because every dependency is fully analyzed (from cache or source) before this package is loaded, + // so their facts are already available. + act.inheritFactsFromDeps() - return res + return true } // inheritFactsFromDeps rebuilds, in memory, diff --git a/vendor/github.com/golangci/golangci-lint/v2/pkg/goanalysis/runner_loadingpackage.go b/vendor/github.com/golangci/golangci-lint/v2/pkg/goanalysis/runner_loadingpackage.go index f918be63..496eeada 100644 --- a/vendor/github.com/golangci/golangci-lint/v2/pkg/goanalysis/runner_loadingpackage.go +++ b/vendor/github.com/golangci/golangci-lint/v2/pkg/goanalysis/runner_loadingpackage.go @@ -296,7 +296,7 @@ func (lp *loadingPackage) loadWithFacts(loadMode LoadMode) error { // Try load cached facts for it. for _, act := range lp.actions { - if !act.loadCachedFacts() { + if !act.loadActionCachedFacts(false) { // Cached facts loading failed: analyze later the action from source. act.needAnalyzeSource = true factsCacheDebugf("Loading of facts for already loaded %s failed, analyze it from source later", act) @@ -349,7 +349,7 @@ func (lp *loadingPackage) loadImportedPackageWithFacts(loadMode LoadMode) error needLoadFromSource := false for _, act := range lp.actions { - if act.loadCachedFacts() { + if act.loadActionCachedFacts(false) { continue } @@ -369,7 +369,34 @@ func (lp *loadingPackage) loadImportedPackageWithFacts(loadMode LoadMode) error if loadMode >= LoadModeTypesInfo { pkg.Types = types.NewPackage(pkg.PkgPath, pkg.Name) } - return lp.loadFromSource(loadMode) + + if err := lp.loadFromSource(loadMode); err != nil { + return err + } + + // As `pkg.Types` has been reassigned (pointer), the facts are related to discarded types. + // The fact references need to be updated to use the new types. + if loadMode >= LoadModeTypesInfo { + for _, act := range lp.actions { + // If the action needs an analysis from source, the existing types related to cache are not used. + if act.needAnalyzeSource { + continue + } + + // Resets the current facts and reload them from cache with the updated types. + if act.loadActionCachedFacts(true) { + continue + } + + // This should not happen because the facts has been already successfully loaded in the initial facts loading. + // But it can happen if the cache is corrupted. + factsCacheDebugf("Reloading of facts for %s failed, analyze it from source later", act) + act.needAnalyzeSource = true + act.markDepsForAnalyzingSource() + } + } + + return nil } return nil diff --git a/vendor/github.com/golangci/golangci-lint/v2/pkg/goanalysis/runners.go b/vendor/github.com/golangci/golangci-lint/v2/pkg/goanalysis/runners.go index bcbc0033..56a41740 100644 --- a/vendor/github.com/golangci/golangci-lint/v2/pkg/goanalysis/runners.go +++ b/vendor/github.com/golangci/golangci-lint/v2/pkg/goanalysis/runners.go @@ -109,6 +109,14 @@ func buildIssues(diags []*Diagnostic, linterNameBuilder func(diag *Diagnostic) s nsf := analysis.SuggestedFix{Message: sf.Message} for _, edit := range sf.TextEdits { + if isOutsideFile(diag.File, edit.Pos) { + continue + } + + if edit.End.IsValid() && isOutsideFile(diag.File, edit.End) { + continue + } + end := edit.End if !end.IsValid() { @@ -154,3 +162,7 @@ func buildIssues(diags []*Diagnostic, linterNameBuilder func(diag *Diagnostic) s } return issues } + +func isOutsideFile(f *token.File, p token.Pos) bool { + return int(p) < f.Base() || int(p) > f.Base()+f.Size() +} diff --git a/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/exhaustruct/exhaustruct_v5.go b/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/exhaustruct/exhaustruct_v5.go index eabfe1ae..6fd6240c 100644 --- a/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/exhaustruct/exhaustruct_v5.go +++ b/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/exhaustruct/exhaustruct_v5.go @@ -19,6 +19,7 @@ func NewV5(settings *config.ExhaustructV5Settings) *goanalysis.Linter { cfg.AllowEmptyPatterns = settings.AllowEmptyPatterns cfg.AllowEmptyReturns = settings.AllowEmptyReturns cfg.AllowEmptyDeclarations = settings.AllowEmptyDeclarations + cfg.AllowEmptyBlankAssignments = settings.AllowEmptyBlankAssignments cfg.ExplicitMode = settings.ExplicitMode } diff --git a/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/gochecksumtype/gochecksumtype.go b/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/gochecksumtype/gochecksumtype.go index 825975f1..0fbf8a68 100644 --- a/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/gochecksumtype/gochecksumtype.go +++ b/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/gochecksumtype/gochecksumtype.go @@ -1,82 +1,28 @@ package gochecksumtype import ( - "strings" - "sync" - gochecksumtype "github.com/alecthomas/go-check-sumtype" - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/packages" "github.com/golangci/golangci-lint/v2/pkg/config" "github.com/golangci/golangci-lint/v2/pkg/goanalysis" - "github.com/golangci/golangci-lint/v2/pkg/lint/linter" - "github.com/golangci/golangci-lint/v2/pkg/result" ) const linterName = "gochecksumtype" func New(settings *config.GoChecksumTypeSettings) *goanalysis.Linter { - var mu sync.Mutex - var resIssues []*goanalysis.Issue - - return goanalysis. - NewLinterFromAnalyzer(&analysis.Analyzer{ - Name: linterName, - Doc: `Run exhaustiveness checks on Go "sum types"`, - Run: func(pass *analysis.Pass) (any, error) { - issues, err := runGoCheckSumType(pass, settings) - if err != nil { - return nil, err - } - - if len(issues) == 0 { - return nil, nil - } - - mu.Lock() - resIssues = append(resIssues, issues...) - mu.Unlock() - - return nil, nil - }, - }). - WithIssuesReporter(func(_ *linter.Context) []*goanalysis.Issue { - return resIssues - }). - WithLoadMode(goanalysis.LoadModeTypesInfo) -} + analyzer := gochecksumtype.Analyzer + analyzer.Name = linterName -func runGoCheckSumType(pass *analysis.Pass, settings *config.GoChecksumTypeSettings) ([]*goanalysis.Issue, error) { - var resIssues []*goanalysis.Issue + var cfg map[string]any - pkg := &packages.Package{ - Fset: pass.Fset, - Syntax: pass.Files, - Types: pass.Pkg, - TypesInfo: pass.TypesInfo, - } - - cfg := gochecksumtype.Config{ - DefaultSignifiesExhaustive: settings.DefaultSignifiesExhaustive, - IncludeSharedInterfaces: settings.IncludeSharedInterfaces, - } - - var unknownError error - errors := gochecksumtype.Run([]*packages.Package{pkg}, cfg) - for _, err := range errors { - err, ok := err.(gochecksumtype.Error) - if !ok { - unknownError = err - continue + if settings != nil { + cfg = map[string]any{ + "default-signifies-exhaustive": settings.DefaultSignifiesExhaustive, + "include-shared-interfaces": settings.IncludeSharedInterfaces, } - - resIssues = append(resIssues, goanalysis.NewIssue(&result.Issue{ - FromLinter: linterName, - Text: strings.TrimPrefix(err.Error(), err.Pos().String()+": "), - Pos: err.Pos(), - }, pass)) } - return resIssues, unknownError + return goanalysis.NewLinterFromAnalyzer(analyzer). + WithConfig(cfg). + WithLoadMode(goanalysis.LoadModeTypesInfo) } diff --git a/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/gosec/gosec.go b/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/gosec/gosec.go index 66d22929..d67f0875 100644 --- a/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/gosec/gosec.go +++ b/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/gosec/gosec.go @@ -33,11 +33,6 @@ func New(settings *config.GoSecSettings) *goanalysis.Linter { var ruleFilters []rules.RuleFilter var analyzerFilters []analyzers.AnalyzerFilter if settings != nil { - // TODO(ldez) to remove when the problem will be fixed by gosec. - // https://github.com/securego/gosec/issues/1211 - // https://github.com/securego/gosec/issues/1209 - settings.Excludes = append(settings.Excludes, "G407") - ruleFilters = createRuleFilters(settings.Includes, settings.Excludes) analyzerFilters = createAnalyzerFilters(settings.Includes, settings.Excludes) conf = toGosecConfig(settings) diff --git a/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/internal/util.go b/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/internal/util.go index 86137cf6..14591def 100644 --- a/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/internal/util.go +++ b/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/internal/util.go @@ -14,7 +14,7 @@ func FormatCode(code string) string { return code // TODO: properly escape or remove } - return fmt.Sprintf("`%s`", code) + return fmt.Sprintf("%#q", code) } func GetGoFileNames(pass *analysis.Pass) []string { diff --git a/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/misspell/misspell.go b/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/misspell/misspell.go index cbf37850..8524a1ba 100644 --- a/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/misspell/misspell.go +++ b/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/misspell/misspell.go @@ -102,7 +102,7 @@ func runMisspellOnFile(pass *analysis.Pass, file *ast.File, replacer *misspell.R _, diffs := replace(string(fileContent)) for _, diff := range diffs { - text := fmt.Sprintf("`%s` is a misspelling of `%s`", diff.Original, diff.Corrected) + text := fmt.Sprintf("%#q is a misspelling of %#q", diff.Original, diff.Corrected) start := f.LineStart(diff.Line) + token.Pos(diff.Column) end := f.LineStart(diff.Line) + token.Pos(diff.Column+len(diff.Original)) diff --git a/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/nolintlint/internal/issues.go b/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/nolintlint/internal/issues.go index 5e9ba411..4312d396 100644 --- a/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/nolintlint/internal/issues.go +++ b/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/nolintlint/internal/issues.go @@ -7,33 +7,33 @@ import ( ) func formatExtraLeadingSpace(fullDirective string) string { - return fmt.Sprintf("directive `%s` should not have more than one leading space", fullDirective) + return fmt.Sprintf("directive %#q should not have more than one leading space", fullDirective) } func formatNotMachine(fullDirective string) string { expected := fullDirective[:2] + strings.TrimLeftFunc(fullDirective[2:], unicode.IsSpace) - return fmt.Sprintf("directive `%s` should be written without leading space as `%s`", + return fmt.Sprintf("directive %#q should be written without leading space as %#q", fullDirective, expected) } func formatNotSpecific(fullDirective, directiveWithOptionalLeadingSpace string) string { - return fmt.Sprintf("directive `%s` should mention specific linter such as `%s:my-linter`", + return fmt.Sprintf("directive %#q should mention specific linter such as `%s:my-linter`", fullDirective, directiveWithOptionalLeadingSpace) } func formatParseError(fullDirective, directiveWithOptionalLeadingSpace string) string { - return fmt.Sprintf("directive `%s` should match `%s[:] [// ]`", + return fmt.Sprintf("directive %#q should match `%s[:] [// ]`", fullDirective, directiveWithOptionalLeadingSpace) } func formatNoExplanation(fullDirective, fullDirectiveWithoutExplanation string) string { - return fmt.Sprintf("directive `%s` should provide explanation such as `%s // this is why`", + return fmt.Sprintf("directive %#q should provide explanation such as `%s // this is why`", fullDirective, fullDirectiveWithoutExplanation) } func formatUnusedCandidate(fullDirective, expectedLinter string) string { - details := fmt.Sprintf("directive `%s` is unused", fullDirective) + details := fmt.Sprintf("directive %#q is unused", fullDirective) if expectedLinter != "" { details += fmt.Sprintf(" for linter %q", expectedLinter) } diff --git a/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/revive/revive.go b/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/revive/revive.go index 7fe736f2..5b3fe2d8 100644 --- a/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/revive/revive.go +++ b/vendor/github.com/golangci/golangci-lint/v2/pkg/golinters/revive/revive.go @@ -133,7 +133,7 @@ func (w *wrapper) toIssue(pass *analysis.Pass, failure *lint.Failure) *goanalysi } issue := &result.Issue{ - Severity: string(severity(w.conf, failure)), + Severity: string(failure.SeverityFor(w.conf)), Text: fmt.Sprintf("%s: %s", failure.RuleName, failure.Failure), Pos: token.Position{ Filename: failure.Position.Start.Filename, @@ -171,10 +171,10 @@ func (w *wrapper) toIssue(pass *analysis.Pass, failure *lint.Failure) *goanalysi // This function mimics the GetConfig function of revive. // This allows to get default values and right types. // https://github.com/golangci/golangci-lint/issues/1745 -// https://github.com/mgechev/revive/blob/v1.13.0/config/config.go#L249 -// https://github.com/mgechev/revive/blob/v1.13.0/config/config.go#L198-L204 +// https://github.com/revive-lint/revive/blob/v1.16.0/config/config.go#L333 +// https://github.com/revive-lint/revive/blob/v1.16.0/config/config.go#L255-L261 func getConfig(cfg *config.ReviveSettings) (*lint.Config, error) { - conf := defaultConfig() + conf := reviveConfig.Default() // Since the Go version is dynamic, this value must be neutralized in order to compare with a "zero value" of the configuration structure. zero := &config.ReviveSettings{Go: cfg.Go} @@ -212,15 +212,15 @@ func createConfigMap(cfg *config.ReviveSettings) map[string]any { const severity = "severity" rawRoot := map[string]any{ - "confidence": cfg.Confidence, - severity: cfg.Severity, - "errorCode": cfg.ErrorCode, - "warningCode": cfg.WarningCode, - "enableAllRules": cfg.EnableAllRules, - "enableDefaultRules": cfg.EnableDefaultRules, + "confidence": cfg.Confidence, + severity: cfg.Severity, + "error-code": cfg.ErrorCode, + "warning-code": cfg.WarningCode, + "enable-all-rules": cfg.EnableAllRules, + "enable-default-rules": cfg.EnableDefaultRules, // Should be managed with `linters.exclusions.generated`. - "ignoreGeneratedHeader": false, + "ignore-generated-header": false, } rawDirectives := map[string]map[string]any{} @@ -273,175 +273,14 @@ func safeTomlSlice(r []any) []any { return typed } -// This element is not exported by revive, so we need copy the code. -// Extracted from https://github.com/mgechev/revive/blob/v1.15.0/config/config.go#L16 -var defaultRules = []lint.Rule{ - &rule.VarDeclarationsRule{}, - &rule.PackageCommentsRule{}, - &rule.DotImportsRule{}, - &rule.BlankImportsRule{}, - &rule.ExportedRule{}, - &rule.VarNamingRule{}, - &rule.IndentErrorFlowRule{}, - &rule.RangeRule{}, - &rule.ErrorfRule{}, - &rule.ErrorNamingRule{}, - &rule.ErrorStringsRule{}, - &rule.ReceiverNamingRule{}, - &rule.IncrementDecrementRule{}, - &rule.ErrorReturnRule{}, - &rule.UnexportedReturnRule{}, - &rule.TimeNamingRule{}, - &rule.ContextKeysType{}, - &rule.ContextAsArgumentRule{}, - &rule.EmptyBlockRule{}, - &rule.SuperfluousElseRule{}, - &rule.UnusedParamRule{}, - &rule.UnreachableCodeRule{}, - &rule.RedefinesBuiltinIDRule{}, -} - -var allRules = append([]lint.Rule{ - &rule.AddConstantRule{}, - &rule.ArgumentsLimitRule{}, - &rule.AtomicRule{}, - &rule.BannedCharsRule{}, - &rule.BareReturnRule{}, - &rule.BoolLiteralRule{}, - &rule.CallToGCRule{}, - &rule.CognitiveComplexityRule{}, - &rule.CommentsDensityRule{}, - &rule.CommentSpacingsRule{}, - &rule.ConfusingNamingRule{}, - &rule.ConfusingResultsRule{}, - &rule.ConstantLogicalExprRule{}, - &rule.CyclomaticRule{}, - &rule.DataRaceRule{}, - &rule.DeepExitRule{}, - &rule.DeferRule{}, - &rule.DuplicatedImportsRule{}, - &rule.EarlyReturnRule{}, - &rule.EmptyLinesRule{}, - &rule.EnforceMapStyleRule{}, - &rule.EnforceRepeatedArgTypeStyleRule{}, - &rule.EnforceSliceStyleRule{}, - &rule.EnforceSwitchStyleRule{}, - &rule.EpochNamingRule{}, - &rule.FileHeaderRule{}, - &rule.FileLengthLimitRule{}, - &rule.FilenameFormatRule{}, - &rule.FlagParamRule{}, - &rule.ForbiddenCallInWgGoRule{}, - &rule.FunctionLength{}, - &rule.FunctionResultsLimitRule{}, - &rule.GetReturnRule{}, - &rule.IdenticalBranchesRule{}, - &rule.IdenticalIfElseIfBranchesRule{}, - &rule.IdenticalIfElseIfConditionsRule{}, - &rule.IdenticalSwitchBranchesRule{}, - &rule.IdenticalSwitchConditionsRule{}, - &rule.IfReturnRule{}, - &rule.ImportAliasNamingRule{}, - &rule.ImportsBlocklistRule{}, - &rule.ImportShadowingRule{}, - &rule.InefficientMapLookupRule{}, - &rule.LineLengthLimitRule{}, - &rule.MaxControlNestingRule{}, - &rule.MaxPublicStructsRule{}, - &rule.ModifiesParamRule{}, - &rule.ModifiesValRecRule{}, - &rule.NestedStructs{}, - &rule.OptimizeOperandsOrderRule{}, - &rule.PackageDirectoryMismatchRule{}, - &rule.PackageNamingRule{}, - &rule.RangeValAddress{}, - &rule.RangeValInClosureRule{}, - &rule.RedundantBuildTagRule{}, - &rule.RedundantImportAlias{}, - &rule.RedundantTestMainExitRule{}, - &rule.StringFormatRule{}, - &rule.StringOfIntRule{}, - &rule.StructTagRule{}, - &rule.TimeDateRule{}, - &rule.TimeEqualRule{}, - &rule.UncheckedTypeAssertionRule{}, - &rule.UnconditionalRecursionRule{}, - &rule.UnexportedNamingRule{}, - &rule.UnhandledErrorRule{}, - &rule.UnnecessaryFormatRule{}, - &rule.UnnecessaryIfRule{}, - &rule.UnnecessaryStmtRule{}, - &rule.UnsecureURLSchemeRule{}, - &rule.UnusedReceiverRule{}, - &rule.UseAnyRule{}, - &rule.UseErrorsNewRule{}, - &rule.UseFmtPrintRule{}, - &rule.UselessBreak{}, - &rule.UselessFallthroughRule{}, - &rule.UseSlicesSort{}, - &rule.UseWaitGroupGoRule{}, - &rule.WaitGroupByValueRule{}, -}, defaultRules...) - -const defaultConfidence = 0.8 - -// This element is not exported by revive, so we need copy the code. -// Extracted from https://github.com/mgechev/revive/blob/v1.13.0/config/config.go#L209 func normalizeConfig(cfg *lint.Config) { // NOTE(ldez): this custom section for golangci-lint should be kept. // --- - cfg.Confidence = cmp.Or(cfg.Confidence, defaultConfidence) + cfg.Confidence = cmp.Or(cfg.Confidence, reviveConfig.DefaultConfidence) cfg.Severity = cmp.Or(cfg.Severity, lint.SeverityWarning) // --- - if len(cfg.Rules) == 0 { - cfg.Rules = map[string]lint.RuleConfig{} - } - - addRules := func(config *lint.Config, rules []lint.Rule) { - for _, r := range rules { - ruleName := r.Name() - if _, ok := config.Rules[ruleName]; !ok { - config.Rules[ruleName] = lint.RuleConfig{} - } - } - } - - if cfg.EnableAllRules { - addRules(cfg, allRules) - } else if cfg.EnableDefaultRules { - addRules(cfg, defaultRules) - } - - severity := cfg.Severity - if severity != "" { - for k, v := range cfg.Rules { - if v.Severity == "" { - v.Severity = severity - } - cfg.Rules[k] = v - } - for k, v := range cfg.Directives { - if v.Severity == "" { - v.Severity = severity - } - cfg.Directives[k] = v - } - } -} - -// This element is not exported by revive, so we need copy the code. -// Extracted from https://github.com/mgechev/revive/blob/v1.13.0/config/config.go#L280 -func defaultConfig() *lint.Config { - defaultConfig := lint.Config{ - Confidence: defaultConfidence, - Severity: lint.SeverityWarning, - Rules: map[string]lint.RuleConfig{}, - } - for _, r := range defaultRules { - defaultConfig.Rules[r.Name()] = lint.RuleConfig{} - } - return &defaultConfig + reviveConfig.Normalize(cfg) } func displayRules(conf *lint.Config) { @@ -449,14 +288,9 @@ func displayRules(conf *lint.Config) { return } - var enabledRules []string - for k, r := range conf.Rules { - if !r.Disabled { - enabledRules = append(enabledRules, k) - } - } - - slices.Sort(enabledRules) + allRules := reviveConfig.AllRules() + defaultRules := reviveConfig.DefaultRules() + enabledRules := extractRulesName(reviveConfig.EnabledRules(conf)) debugf("All available rules (%d): %s.", len(allRules), strings.Join(extractRulesName(allRules), ", ")) debugf("Default rules (%d): %s.", len(defaultRules), strings.Join(extractRulesName(defaultRules), ", ")) @@ -476,15 +310,3 @@ func extractRulesName(rules []lint.Rule) []string { return names } - -// Extracted from https://github.com/mgechev/revive/blob/v1.13.0/formatter/severity.go -// Modified to use pointers (related to hugeParam rule). -func severity(cfg *lint.Config, failure *lint.Failure) lint.Severity { - if cfg, ok := cfg.Rules[failure.RuleName]; ok && cfg.Severity == lint.SeverityError { - return lint.SeverityError - } - if cfg, ok := cfg.Directives[failure.RuleName]; ok && cfg.Severity == lint.SeverityError { - return lint.SeverityError - } - return lint.SeverityWarning -} diff --git a/vendor/github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb/builder_linter.go b/vendor/github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb/builder_linter.go index fb70920a..f6cff093 100644 --- a/vendor/github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb/builder_linter.go +++ b/vendor/github.com/golangci/golangci-lint/v2/pkg/lint/lintersdb/builder_linter.go @@ -608,7 +608,7 @@ func (LinterBuilder) Build(cfg *config.Config) ([]*linter.Config, error) { WithSince("v1.37.0"). ConsiderSlow(). WithAutoFix(). - WithURL("https://github.com/mgechev/revive"), + WithURL("https://github.com/revive-lint/revive"), linter.NewConfig(rowserrcheck.New(&cfg.Linters.Settings.RowsErrCheck)). WithSince("v1.23.0"). diff --git a/vendor/github.com/ldez/gomoddirectives/.golangci.yml b/vendor/github.com/ldez/gomoddirectives/.golangci.yml index 90c529bf..665743ce 100644 --- a/vendor/github.com/ldez/gomoddirectives/.golangci.yml +++ b/vendor/github.com/ldez/gomoddirectives/.golangci.yml @@ -6,7 +6,9 @@ formatters: - gofumpt settings: gofumpt: - extra-rules: true + extra: + group-params: true + clothe-returns: true linters: default: all @@ -17,6 +19,7 @@ linters: - err113 - exhaustive - exhaustruct + - exhaustruct_v5 - lll - mnd - nlreturn diff --git a/vendor/github.com/ldez/gomoddirectives/gomoddirectives.go b/vendor/github.com/ldez/gomoddirectives/gomoddirectives.go index 32c7b8d9..d2eddb66 100644 --- a/vendor/github.com/ldez/gomoddirectives/gomoddirectives.go +++ b/vendor/github.com/ldez/gomoddirectives/gomoddirectives.go @@ -5,6 +5,7 @@ import ( "context" "fmt" "go/token" + "path" "regexp" "slices" "strings" @@ -16,18 +17,20 @@ import ( ) const ( - reasonExclude = "exclude directive is not allowed" - reasonGoDebug = "godebug directive is not allowed" - reasonGoVersion = "go directive (%s) doesn't match the pattern '%s'" - reasonIgnore = "ignore directive is not allowed" - reasonReplace = "replacement are not allowed" - reasonReplaceDuplicate = "multiple replacement of the same module" - reasonReplaceIdentical = "the original module and the replacement are identical" - reasonReplaceLocal = "local replacement are not allowed" - reasonRetract = "a comment is mandatory to explain why the version has been retracted" - reasonTool = "tool directive is not allowed" - reasonToolchain = "toolchain directive is not allowed" - reasonToolchainPattern = "toolchain directive (%s) doesn't match the pattern '%s'" + reasonExclude = "exclude directive is not allowed" + reasonGoDebug = "godebug directive is not allowed" + reasonGoVersion = "go directive (%s) doesn't match the pattern '%s'" + reasonIgnore = "ignore directive is not allowed" + reasonIgnoredByDefaultHiddenDirs = "files/directories starting with '.' and '_' are ignored by default" + reasonIgnoredByDefaultDir = "directories named '%s' are ignored by default" + reasonReplace = "replacement are not allowed" + reasonReplaceDuplicate = "multiple replacement of the same module" + reasonReplaceIdentical = "the original module and the replacement are identical" + reasonReplaceLocal = "local replacement are not allowed" + reasonRetract = "a comment is mandatory to explain why the version has been retracted" + reasonTool = "tool directive is not allowed" + reasonToolchain = "toolchain directive is not allowed" + reasonToolchainPattern = "toolchain directive (%s) doesn't match the pattern '%s'" ) // Result the analysis result. @@ -198,11 +201,27 @@ func checkExcludeDirectives(file *modfile.File, opts Options) []Result { } func checkIgnoreDirectives(file *modfile.File, opts Options) []Result { - if !opts.IgnoreForbidden { - return nil + var results []Result + + for _, value := range file.Ignore { + for pathElement := range strings.SplitSeq(path.Clean(value.Path), "/") { + if pathElement == "." { + continue + } + + switch { + case pathElement == "vendor" || pathElement == "testdata": + results = append(results, NewResult(file, value.Syntax, fmt.Sprintf(reasonIgnoredByDefaultDir, pathElement))) + + case strings.HasPrefix(pathElement, ".") || strings.HasPrefix(pathElement, "_"): + results = append(results, NewResult(file, value.Syntax, reasonIgnoredByDefaultHiddenDirs)) + } + } } - var results []Result + if !opts.IgnoreForbidden { + return results + } for _, exclude := range file.Ignore { results = append(results, NewResult(file, exclude.Syntax, reasonIgnore)) diff --git a/vendor/github.com/ldez/gomoddirectives/readme.md b/vendor/github.com/ldez/gomoddirectives/readme.md index ea37304c..21a52d3c 100644 --- a/vendor/github.com/ldez/gomoddirectives/readme.md +++ b/vendor/github.com/ldez/gomoddirectives/readme.md @@ -3,7 +3,6 @@ A linter that handle directives into `go.mod`. [![Sponsor](https://img.shields.io/badge/Sponsor%20me-%E2%9D%A4%EF%B8%8F-pink)](https://github.com/sponsors/ldez) -[![Build Status](https://github.com/ldez/gomoddirectives/workflows/Main/badge.svg?branch=master)](https://github.com/ldez/gomoddirectives/actions) ## Usage @@ -161,7 +160,7 @@ exclude ( ) ``` -### [`ignore`](TODO) directives +### [`ignore`](https://go.dev/ref/mod#go-mod-file-ignore) directives - Ban all `ignore` directives. diff --git a/vendor/github.com/ldez/tagliatelle/.golangci.yml b/vendor/github.com/ldez/tagliatelle/.golangci.yml index 371822b5..1cebe761 100644 --- a/vendor/github.com/ldez/tagliatelle/.golangci.yml +++ b/vendor/github.com/ldez/tagliatelle/.golangci.yml @@ -6,7 +6,9 @@ formatters: - gofumpt settings: gofumpt: - extra-rules: true + extra: + group-params: true + clothe-returns: true linters: default: all @@ -17,9 +19,11 @@ linters: - errchkjson - exhaustive - exhaustruct + - exhaustruct_v5 - forcetypeassert - lll - mnd + - gomodguard - nilnil - nlreturn - nonamedreturns @@ -32,6 +36,7 @@ linters: - varnamelen - wrapcheck - wsl # Deprecated + - gomodguard # Deprecated settings: depguard: @@ -48,6 +53,7 @@ linters: goconst: min-len: 5 min-occurrences: 3 + ignore-tests: true gocritic: disabled-checks: - sloppyReassign @@ -77,6 +83,10 @@ linters: warn-unused: true presets: - comments + rules: + - path: cmd/tagliatelle/tagliatelle.go + linters: + - goconst issues: max-issues-per-linter: 0 diff --git a/vendor/github.com/ldez/tagliatelle/tagliatelle.go b/vendor/github.com/ldez/tagliatelle/tagliatelle.go index ccd1b63e..b6a71308 100644 --- a/vendor/github.com/ldez/tagliatelle/tagliatelle.go +++ b/vendor/github.com/ldez/tagliatelle/tagliatelle.go @@ -68,7 +68,7 @@ func New(config Config) *analysis.Analyzer { func run(pass *analysis.Pass, config Config) (any, error) { isp, ok := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) if !ok { - return nil, errors.New("missing inspect analyser") + return nil, errors.New("missing inspect analyzer") } nodeFilter := []ast.Node{ @@ -159,6 +159,13 @@ func report(pass *analysis.Pass, config Base, key, convName, fieldName string, n return } + // TODO(ldez): need to be rethink. + // For now, tagliatelle should try to remain neutral in terms of format. + if key == "json" && slices.Contains(flags, "embed") { + // skip for inline children (no name to lint) + return + } + // TODO(ldez): need to be rethink. // This is an exception because of a bug. // https://github.com/ldez/tagliatelle/issues/8 @@ -266,17 +273,13 @@ func createRadixTree(config Config, modPath string) *iradix.Tree[Base] { c.Rules = maps.Clone(config.Rules) // Overrides the rule from the base. - for k, v := range override.Rules { - c.Rules[k] = v - } + maps.Copy(c.Rules, override.Rules) // Copy the extended rules from the base. c.ExtendedRules = maps.Clone(config.ExtendedRules) // Overrides the extended rule from the base. - for k, v := range override.ExtendedRules { - c.ExtendedRules[k] = v - } + maps.Copy(c.ExtendedRules, override.ExtendedRules) key := path.Join(modPath, override.Package) if filepath.Base(modPath) == override.Package { diff --git a/vendor/github.com/mgechev/revive/config/config.go b/vendor/github.com/mgechev/revive/config/config.go index d01f409c..79e7e48e 100644 --- a/vendor/github.com/mgechev/revive/config/config.go +++ b/vendor/github.com/mgechev/revive/config/config.go @@ -5,10 +5,14 @@ import ( "errors" "fmt" "os" + "reflect" + "slices" + "strings" "github.com/BurntSushi/toml" "github.com/mgechev/revive/formatter" + internalconfig "github.com/mgechev/revive/internal/config" "github.com/mgechev/revive/lint" "github.com/mgechev/revive/rule" ) @@ -118,9 +122,43 @@ var allRules = append([]lint.Rule{ &rule.UnnecessaryIfRule{}, &rule.EpochNamingRule{}, &rule.UseSlicesSort{}, + &rule.UseSlicesConcatRule{}, &rule.PackageNamingRule{}, + &rule.MultilineIfInitRule{}, + &rule.MarshalReceiverRule{}, }, defaultRules...) +// AllRules returns a copy of the list of all rules registered in revive. +func AllRules() []lint.Rule { + return slices.Clone(allRules) +} + +// DefaultRules returns a copy of the list of rules that are enabled by default. +func DefaultRules() []lint.Rule { + return slices.Clone(defaultRules) +} + +// EnabledRules returns the rules that are enabled in the given configuration. +func EnabledRules(config *lint.Config) []lint.Rule { + if config == nil { + return nil + } + rulesByName := make(map[string]lint.Rule, len(allRules)) + for _, r := range allRules { + rulesByName[r.Name()] = r + } + var rules []lint.Rule + for name, c := range config.Rules { + if c.Disabled { + continue + } + if r, ok := rulesByName[actualRuleName(name)]; ok { + rules = append(rules, r) + } + } + return rules +} + // allFormatters is a list of all available formatters to output the linting results. // Keep the list sorted and in sync with available formatters in README.md. var allFormatters = []lint.Formatter{ @@ -190,10 +228,31 @@ func actualRuleName(name string) string { } func parseConfig(data []byte, config *lint.Config) error { - err := toml.Unmarshal(data, config) + // Decode the top-level keys as primitives first so each option can be matched to its config field + // regardless of the spelling used in the file (camelCase, kebab-case or lowercase). + primitives := map[string]toml.Primitive{} + md, err := toml.Decode(string(data), &primitives) if err != nil { return fmt.Errorf("cannot parse the config file: %w", err) } + + fields := configFieldsByNormalizedName(config) + seen := make(map[string]string, len(primitives)) + for key, primitive := range primitives { + normalized := internalconfig.NormalizeOption(key) + field, ok := fields[normalized] + if !ok { + continue // ignore unknown options, as toml.Unmarshal does + } + if other, dup := seen[normalized]; dup { + return fmt.Errorf("cannot parse the config file: options %q and %q refer to the same option", other, key) + } + seen[normalized] = key + if err := md.PrimitiveDecode(primitive, field.Addr().Interface()); err != nil { + return fmt.Errorf("cannot parse the config file: %w", err) + } + } + for k, r := range config.Rules { err := r.Initialize() if err != nil { @@ -205,14 +264,33 @@ func parseConfig(data []byte, config *lint.Config) error { return nil } +// configFieldsByNormalizedName maps the normalized name of each config option to the corresponding struct field, +// so an option can be looked up regardless of the casing or hyphenation used in the config file. +func configFieldsByNormalizedName(config *lint.Config) map[string]reflect.Value { + v := reflect.ValueOf(config).Elem() + t := v.Type() + fields := make(map[string]reflect.Value, t.NumField()) + for i := range t.NumField() { + tag := t.Field(i).Tag.Get("toml") + if tag == "" { + continue + } + name, _, _ := strings.Cut(tag, ",") + fields[internalconfig.NormalizeOption(name)] = v.Field(i) + } + return fields +} + func validateConfig(config *lint.Config) error { if config.EnableAllRules && config.EnableDefaultRules { - return errors.New("config options enableAllRules and enableDefaultRules cannot be combined") + return errors.New("config options enable-all-rules and enable-default-rules cannot be combined") } return nil } -func normalizeConfig(config *lint.Config) { +// Normalize fills in default rule entries (according to the EnableAllRules / EnableDefaultRules options) +// and propagates the configured severity to rules and directives that don't define their own. +func Normalize(config *lint.Config) { if len(config.Rules) == 0 { config.Rules = map[string]lint.RuleConfig{} } @@ -249,14 +327,15 @@ func normalizeConfig(config *lint.Config) { } } -const defaultConfidence = 0.8 +// DefaultConfidence is the default confidence level for revive's linter. +const DefaultConfidence = 0.8 // GetConfig yields the configuration. func GetConfig(configPath string) (*lint.Config, error) { config := &lint.Config{} switch { case configPath != "": - config.Confidence = defaultConfidence + config.Confidence = DefaultConfidence data, err := os.ReadFile(configPath) //nolint:gosec // ignore G304: potential file inclusion via variable if err != nil { return nil, errors.New("cannot read the config file") @@ -267,14 +346,14 @@ func GetConfig(configPath string) (*lint.Config, error) { } default: // no configuration provided - config = defaultConfig() + config = Default() } if err := validateConfig(config); err != nil { return nil, err } - normalizeConfig(config) + Normalize(config) return config, nil } @@ -291,9 +370,10 @@ func GetFormatter(formatterName string) (lint.Formatter, error) { return f, nil } -func defaultConfig() *lint.Config { +// Default returns the default linter configuration, used when no configuration is provided. +func Default() *lint.Config { defaultConfig := lint.Config{ - Confidence: defaultConfidence, + Confidence: DefaultConfidence, Severity: lint.SeverityWarning, Rules: map[string]lint.RuleConfig{}, } diff --git a/vendor/github.com/mgechev/revive/formatter/checkstyle.go b/vendor/github.com/mgechev/revive/formatter/checkstyle.go index 1df1f557..331b047c 100644 --- a/vendor/github.com/mgechev/revive/formatter/checkstyle.go +++ b/vendor/github.com/mgechev/revive/formatter/checkstyle.go @@ -32,15 +32,12 @@ type issue struct { func (*Checkstyle) Format(failures <-chan lint.Failure, config lint.Config) (string, error) { issues := map[string][]issue{} for failure := range failures { - buf := new(bytes.Buffer) - xml.Escape(buf, []byte(failure.Failure)) - what := buf.String() iss := issue{ Line: failure.Position.Start.Line, Col: failure.Position.Start.Column, - What: what, + What: failure.Failure, Confidence: failure.Confidence, - Severity: severity(config, failure), + Severity: failure.SeverityFor(&config), RuleName: failure.RuleName, } fn := failure.Filename() @@ -50,7 +47,7 @@ func (*Checkstyle) Format(failures <-chan lint.Failure, config lint.Config) (str issues[fn] = append(issues[fn], iss) } - t, err := plain.New("revive").Parse(checkstyleTemplate) + t, err := plain.New("revive").Funcs(plain.FuncMap{"escape": xmlEscape}).Parse(checkstyleTemplate) if err != nil { return "", err } @@ -65,12 +62,22 @@ func (*Checkstyle) Format(failures <-chan lint.Failure, config lint.Config) (str return buf.String(), nil } +// xmlEscape escapes s so that it can be safely interpolated +// into the XML attributes of the checkstyle template. +// It is registered as the "escape" function of the template. +func xmlEscape(s string) string { + buf := new(bytes.Buffer) + xml.Escape(buf, []byte(s)) + return buf.String() +} + const checkstyleTemplate = ` {{- range $k, $v := . }} - + {{- range $i, $issue := $v }} - + {{- end }} {{- end }} diff --git a/vendor/github.com/mgechev/revive/formatter/friendly.go b/vendor/github.com/mgechev/revive/formatter/friendly.go index cb1afcb3..c170e1dc 100644 --- a/vendor/github.com/mgechev/revive/formatter/friendly.go +++ b/vendor/github.com/mgechev/revive/formatter/friendly.go @@ -35,7 +35,7 @@ func (f *Friendly) Format(failures <-chan lint.Failure, config lint.Config) (str warningEmoji := color.YellowString("⚠") errorEmoji := color.RedString("✘") for failure := range failures { - sev := severity(config, failure) + sev := failure.SeverityFor(&config) firstCol := warningEmoji if sev == lint.SeverityError { firstCol = errorEmoji diff --git a/vendor/github.com/mgechev/revive/formatter/json.go b/vendor/github.com/mgechev/revive/formatter/json.go index 46a61980..c3feea61 100644 --- a/vendor/github.com/mgechev/revive/formatter/json.go +++ b/vendor/github.com/mgechev/revive/formatter/json.go @@ -29,7 +29,7 @@ func (*JSON) Format(failures <-chan lint.Failure, config lint.Config) (string, e var slice []jsonObject for failure := range failures { obj := jsonObject{} - obj.Severity = severity(config, failure) + obj.Severity = failure.SeverityFor(&config) obj.Failure = failure slice = append(slice, obj) } diff --git a/vendor/github.com/mgechev/revive/formatter/ndjson.go b/vendor/github.com/mgechev/revive/formatter/ndjson.go index f80b5bcb..8ca41654 100644 --- a/vendor/github.com/mgechev/revive/formatter/ndjson.go +++ b/vendor/github.com/mgechev/revive/formatter/ndjson.go @@ -24,7 +24,7 @@ func (*NDJSON) Format(failures <-chan lint.Failure, config lint.Config) (string, enc := json.NewEncoder(&buf) for failure := range failures { obj := jsonObject{} - obj.Severity = severity(config, failure) + obj.Severity = failure.SeverityFor(&config) obj.Failure = failure err := enc.Encode(obj) if err != nil { diff --git a/vendor/github.com/mgechev/revive/formatter/severity.go b/vendor/github.com/mgechev/revive/formatter/severity.go deleted file mode 100644 index a43bf319..00000000 --- a/vendor/github.com/mgechev/revive/formatter/severity.go +++ /dev/null @@ -1,13 +0,0 @@ -package formatter - -import "github.com/mgechev/revive/lint" - -func severity(config lint.Config, failure lint.Failure) lint.Severity { - if config, ok := config.Rules[failure.RuleName]; ok && config.Severity == lint.SeverityError { - return lint.SeverityError - } - if config, ok := config.Directives[failure.RuleName]; ok && config.Severity == lint.SeverityError { - return lint.SeverityError - } - return lint.SeverityWarning -} diff --git a/vendor/github.com/mgechev/revive/formatter/stylish.go b/vendor/github.com/mgechev/revive/formatter/stylish.go index 100a7927..54ad9802 100644 --- a/vendor/github.com/mgechev/revive/formatter/stylish.go +++ b/vendor/github.com/mgechev/revive/formatter/stylish.go @@ -42,7 +42,7 @@ func (*Stylish) Format(failures <-chan lint.Failure, config lint.Config) (string for f := range failures { total++ - currentType := severity(config, f) + currentType := f.SeverityFor(&config) if currentType == lint.SeverityError { totalErrors++ } diff --git a/vendor/github.com/mgechev/revive/internal/astutils/ast_utils.go b/vendor/github.com/mgechev/revive/internal/astutils/ast_utils.go index b0fbc5a0..5dc5d24b 100644 --- a/vendor/github.com/mgechev/revive/internal/astutils/ast_utils.go +++ b/vendor/github.com/mgechev/revive/internal/astutils/ast_utils.go @@ -9,6 +9,7 @@ import ( "go/ast" "go/printer" "go/token" + "go/types" "regexp" "slices" ) @@ -123,6 +124,22 @@ func IsPkgDotName(expr ast.Expr, pkg, name string) bool { return ok && IsIdent(sel.X, pkg) && IsIdent(sel.Sel, name) } +// IsPointerToPkgDotType returns true if typ is a pointer to the named type pkgPath.typeName. +func IsPointerToPkgDotType(typ types.Type, pkgPath, typeName string) bool { + ptrType, ok := typ.(*types.Pointer) + if !ok { + return false + } + + namedType, ok := ptrType.Elem().(*types.Named) + if !ok { + return false + } + + obj := namedType.Obj() + return obj != nil && obj.Pkg() != nil && obj.Pkg().Path() == pkgPath && obj.Name() == typeName +} + // PickNodes yields a list of nodes by picking them from a sub-ast with root node n. // Nodes are selected by applying the selector function. func PickNodes(n ast.Node, selector func(n ast.Node) bool) []ast.Node { diff --git a/vendor/github.com/mgechev/revive/internal/astutils/exit_funcs.go b/vendor/github.com/mgechev/revive/internal/astutils/exit_funcs.go new file mode 100644 index 00000000..1a20be83 --- /dev/null +++ b/vendor/github.com/mgechev/revive/internal/astutils/exit_funcs.go @@ -0,0 +1,46 @@ +package astutils + +import "go/ast" + +// exitFuncChecker is a function type that checks whether a function call is an exit function. +type exitFuncChecker func(args []ast.Expr) bool + +var alwaysTrue exitFuncChecker = func([]ast.Expr) bool { return true } + +// exitFunctions is a map of std packages and functions that are considered as exit functions. +var exitFunctions = map[string]map[string]exitFuncChecker{ + "os": {"Exit": alwaysTrue}, + "syscall": {"Exit": alwaysTrue}, + "log": { + "Fatal": alwaysTrue, + "Fatalf": alwaysTrue, + "Fatalln": alwaysTrue, + "Panic": alwaysTrue, + "Panicf": alwaysTrue, + "Panicln": alwaysTrue, + }, + "flag": { + "Parse": func([]ast.Expr) bool { return true }, + "NewFlagSet": func(args []ast.Expr) bool { + if len(args) != 2 { + return false + } + return IsPkgDotName(args[1], "flag", "ExitOnError") + }, + }, +} + +// IsCallToExitFunction checks if the function call is a call to an exit function. +func IsCallToExitFunction(pkgName, functionName string, callArgs []ast.Expr) bool { + m, ok := exitFunctions[pkgName] + if !ok { + return false + } + + check, ok := m[functionName] + if !ok { + return false + } + + return check(callArgs) +} diff --git a/vendor/github.com/mgechev/revive/internal/config/config.go b/vendor/github.com/mgechev/revive/internal/config/config.go new file mode 100644 index 00000000..07e504ad --- /dev/null +++ b/vendor/github.com/mgechev/revive/internal/config/config.go @@ -0,0 +1,12 @@ +// Package config provides helpers for handling revive configuration and rule option names. +package config + +import "strings" + +// NormalizeOption returns an option name lowercased and without hyphens, so that the camelCase, kebab-case, +// and lowercase spellings of an option all map to the same value. +// +// Example: NormalizeOption("allowTypesBefore"), NormalizeOption("allow-types-before") -> "allowtypesbefore". +func NormalizeOption(name string) string { + return strings.ToLower(strings.ReplaceAll(name, "-", "")) +} diff --git a/vendor/github.com/mgechev/revive/internal/ifelse/rule.go b/vendor/github.com/mgechev/revive/internal/ifelse/rule.go index 34748766..40d32130 100644 --- a/vendor/github.com/mgechev/revive/internal/ifelse/rule.go +++ b/vendor/github.com/mgechev/revive/internal/ifelse/rule.go @@ -129,6 +129,7 @@ func (v *visitor) checkRule(ifStmt *ast.IfStmt, chain Chain) { msg += " (move short variable declaration to its own line if necessary)" } v.failures = append(v.failures, lint.Failure{ + Category: lint.FailureCategoryStyle, Confidence: 1, Node: v.target.node(ifStmt), Failure: msg, diff --git a/vendor/github.com/mgechev/revive/internal/rule/case.go b/vendor/github.com/mgechev/revive/internal/rule/case.go new file mode 100644 index 00000000..feb6263b --- /dev/null +++ b/vendor/github.com/mgechev/revive/internal/rule/case.go @@ -0,0 +1,84 @@ +package rule + +import "strings" + +// IsUpperCaseConst checks if a string is in constant name format like `SOME_CONST`, `SOME_CONST_2`, +// `X123_3`, `_SOME_PRIVATE_CONST`. +// See #851, #865. +func IsUpperCaseConst(s string) bool { + if s == "" { + return false + } + r := []rune(s) + c := r[0] + if len(r) == 1 { + return isUpper(c) + } + if c != '_' && !isUpper(c) { // Must start with an uppercase letter or underscore + return false + } + for i, c := range r { + switch { + case isUpperOrDigit(c): + continue + case c == '_': + // Underscore must be followed by at least one uppercase letter or digit + if i+1 >= len(s) || !isUpperOrDigit(r[i+1]) { + return false + } + + default: + return false + } + } + return true +} + +// HasUpperCaseLetter checks if a string contains at least one upper case letter. +func HasUpperCaseLetter(s string) bool { + for _, r := range s { + if isUpper(r) { + return true + } + } + return false +} + +// IsUpperUnderscore detects variable that are made from upper case letters, underscore, or digits. +// +// Short variable names are considered OK. +func IsUpperUnderscore(s string) bool { + if !strings.Contains(s, "_") { + return false + } + if len(s) <= 5 { + // avoid false positives + return false + } + for _, r := range s { + if r == '_' || isUpperOrDigit(r) { + continue + } + return false + } + return true +} + +// isUpperOrDigit checks if a rune is an uppercase letter or digit. +func isUpperOrDigit(r rune) bool { + return isUpper(r) || isDigit(r) +} + +// isDigit checks if rune is a simple digit. +// +// We don't use [unicode.IsDigit] as it returns true for a large variety of digits that are not 0-9. +func isDigit(r rune) bool { + return r >= '0' && r <= '9' +} + +// isUpper checks if rune is ASCII upper case letter +// +// We restrict to A-Z because [unicode.IsUpper] returns true for a large variety of letters. +func isUpper(r rune) bool { + return r >= 'A' && r <= 'Z' +} diff --git a/vendor/github.com/mgechev/revive/lint/config.go b/vendor/github.com/mgechev/revive/lint/config.go index 533ce054..bf3d348a 100644 --- a/vendor/github.com/mgechev/revive/lint/config.go +++ b/vendor/github.com/mgechev/revive/lint/config.go @@ -56,17 +56,17 @@ type DirectivesConfig = map[string]DirectiveConfig // Config defines the config of the linter. type Config struct { - IgnoreGeneratedHeader bool `toml:"ignoreGeneratedHeader"` + IgnoreGeneratedHeader bool `toml:"ignore-generated-header"` Confidence float64 `toml:"confidence"` Severity Severity `toml:"severity"` - EnableAllRules bool `toml:"enableAllRules"` - EnableDefaultRules bool `toml:"enableDefaultRules"` + EnableAllRules bool `toml:"enable-all-rules"` + EnableDefaultRules bool `toml:"enable-default-rules"` Rules RulesConfig `toml:"rule"` - ErrorCode int `toml:"errorCode"` - WarningCode int `toml:"warningCode"` + ErrorCode int `toml:"error-code"` + WarningCode int `toml:"warning-code"` Directives DirectivesConfig `toml:"directive"` Exclude []string `toml:"exclude"` // If set, overrides the go language version specified in go.mod of // packages being linted, and assumes this specific language version. - GoVersion *goversion.Version `toml:"goVersion"` + GoVersion *goversion.Version `toml:"go-version"` } diff --git a/vendor/github.com/mgechev/revive/lint/failure.go b/vendor/github.com/mgechev/revive/lint/failure.go index 01ed0911..7a0d0726 100644 --- a/vendor/github.com/mgechev/revive/lint/failure.go +++ b/vendor/github.com/mgechev/revive/lint/failure.go @@ -98,6 +98,21 @@ func (f *Failure) IsInternal() bool { return f.Category == failureCategoryInternal } +// SeverityFor returns the effective severity of the failure under the given configuration. +// A failure is an error if its rule or directive is configured with [SeverityError]; otherwise it is a warning. +func (f *Failure) SeverityFor(config *Config) Severity { + if config == nil { + return SeverityWarning + } + if c, ok := config.Rules[f.RuleName]; ok && c.Severity == SeverityError { + return SeverityError + } + if c, ok := config.Directives[f.RuleName]; ok && c.Severity == SeverityError { + return SeverityError + } + return SeverityWarning +} + // NewInternalFailure yields an internal failure with the given message as failure message. func NewInternalFailure(message string) Failure { return Failure{ diff --git a/vendor/github.com/mgechev/revive/lint/file.go b/vendor/github.com/mgechev/revive/lint/file.go index 15b7aa85..0e0680a2 100644 --- a/vendor/github.com/mgechev/revive/lint/file.go +++ b/vendor/github.com/mgechev/revive/lint/file.go @@ -2,12 +2,12 @@ package lint import ( "bytes" - "errors" "go/ast" "go/parser" "go/printer" "go/token" "go/types" + "log/slog" "math" "regexp" "strings" @@ -19,6 +19,7 @@ type File struct { Pkg *Package content []byte AST *ast.File + logger *slog.Logger } // IsTest returns if the file contains tests. @@ -57,6 +58,7 @@ func NewFile(name string, content []byte, pkg *Package) (*File, error) { content: content, Pkg: pkg, AST: f, + logger: slog.New(slog.DiscardHandler), }, nil } @@ -112,21 +114,33 @@ func (f *File) isMain() bool { return f.AST.Name.Name == "main" } -const directiveSpecifyDisableReason = "specify-disable-reason" +const ( + directiveSpecifyDisableReason = "specify-disable-reason" + directiveSpecifyDisableRule = "specify-disable-rule" +) func (f *File) lint(rules []Rule, config Config, failures chan Failure) error { rulesConfig := config.Rules _, mustSpecifyDisableReason := config.Directives[directiveSpecifyDisableReason] - disabledIntervals := f.disabledIntervals(rules, mustSpecifyDisableReason, failures) + _, mustSpecifyDisableRules := config.Directives[directiveSpecifyDisableRule] + disabledIntervals := f.disabledIntervals(rules, mustSpecifyDisableReason, mustSpecifyDisableRules, failures) for _, currentRule := range rules { ruleConfig := rulesConfig[currentRule.Name()] if ruleConfig.MustExclude(f.Name) { continue } currentFailures := currentRule.Apply(f, ruleConfig.Arguments) - for idx, failure := range currentFailures { + filtered := currentFailures[:0] + for _, failure := range currentFailures { + // Log and skip internal failures: they signal a rule could not run on this file, + // but other rules can still produce useful reports. if failure.IsInternal() { - return errors.New(failure.Failure) + f.logger.Warn("rule skipped due to internal failure", + "rule", currentRule.Name(), + "file", f.Name, + "failure", failure.Failure, + ) + continue } if failure.RuleName == "" { @@ -135,9 +149,9 @@ func (f *File) lint(rules []Rule, config Config, failures chan Failure) error { if failure.Node != nil { failure.Position = ToFailurePosition(failure.Node.Pos(), failure.Node.End(), f) } - currentFailures[idx] = failure + filtered = append(filtered, failure) } - currentFailures = f.filterFailures(currentFailures, disabledIntervals) + currentFailures = f.filterFailures(filtered, disabledIntervals) for _, failure := range currentFailures { if failure.Confidence >= config.Confidence { failures <- failure @@ -163,7 +177,7 @@ const ( var directiveRegexp = regexp.MustCompile(`^//[\s]*revive:(enable|disable)(?:-(line|next-line))?(?::([^\s]+))?[\s]*(?: (.+))?$`) -func (f *File) disabledIntervals(rules []Rule, mustSpecifyDisableReason bool, failures chan Failure) disabledIntervalsMap { +func (f *File) disabledIntervals(rules []Rule, mustSpecifyDisableReason, mustSpecifyDisableRules bool, failures chan Failure) disabledIntervalsMap { enabledDisabledRulesMap := map[string][]enableDisableConfig{} getEnabledDisabledIntervals := func() disabledIntervalsMap { @@ -195,32 +209,36 @@ func (f *File) disabledIntervals(rules []Rule, mustSpecifyDisableReason bool, fa return result } - handleConfig := func(isEnabled bool, line int, name string) { + // handleConfig records a state change for the rule and reports whether it changed anything. + // A directive that repeats the current state (e.g. a second disable) is a no-op. + handleConfig := func(isEnabled bool, line int, name string) bool { existing, ok := enabledDisabledRulesMap[name] if !ok { existing = []enableDisableConfig{} enabledDisabledRulesMap[name] = existing } - if (len(existing) > 1 && existing[len(existing)-1].enabled == isEnabled) || - (len(existing) == 0 && isEnabled) { - return + currentlyEnabled := len(existing) == 0 || existing[len(existing)-1].enabled + if currentlyEnabled == isEnabled { + return false } - existing = append(existing, enableDisableConfig{ + enabledDisabledRulesMap[name] = append(existing, enableDisableConfig{ enabled: isEnabled, position: line, }) - enabledDisabledRulesMap[name] = existing + return true } handleRules := func(modifier string, isEnabled bool, line int, ruleNames []string) { for _, name := range ruleNames { switch modifier { case "line": - handleConfig(isEnabled, line, name) - handleConfig(!isEnabled, line, name) + if handleConfig(isEnabled, line, name) { + handleConfig(!isEnabled, line, name) + } case "next-line": - handleConfig(isEnabled, line+1, name) - handleConfig(!isEnabled, line+1, name) + if handleConfig(isEnabled, line+1, name) { + handleConfig(!isEnabled, line+1, name) + } default: handleConfig(isEnabled, line, name) } @@ -246,6 +264,7 @@ func (f *File) disabledIntervals(rules []Rule, mustSpecifyDisableReason bool, fa mustCheckDisablingReason := mustSpecifyDisableReason && match[directivePos] == "disable" if mustCheckDisablingReason && strings.Trim(match[reasonPos], " ") == "" { failures <- Failure{ + Category: FailureCategoryComments, Confidence: 1, RuleName: directiveSpecifyDisableReason, Failure: "reason of lint disabling not found", @@ -255,6 +274,19 @@ func (f *File) disabledIntervals(rules []Rule, mustSpecifyDisableReason bool, fa continue // skip this linter disabling directive } + mustCheckDisablingRules := mustSpecifyDisableRules && match[directivePos] == "disable" + if mustCheckDisablingRules && len(ruleNames) == 0 { + failures <- Failure{ + Category: FailureCategoryComments, + Confidence: 1, + RuleName: directiveSpecifyDisableRule, + Failure: "rule name for lint disabling not found", + Position: ToFailurePosition(c.Pos(), c.End(), f), + Node: c, + } + continue // skip this linter disabling directive + } + // TODO: optimize if len(ruleNames) == 0 { for _, rule := range rules { diff --git a/vendor/github.com/mgechev/revive/lint/linter.go b/vendor/github.com/mgechev/revive/lint/linter.go index 46ae3f9c..e7bd87c4 100644 --- a/vendor/github.com/mgechev/revive/lint/linter.go +++ b/vendor/github.com/mgechev/revive/lint/linter.go @@ -5,6 +5,7 @@ import ( "bytes" "fmt" "go/token" + "log/slog" "os" "path/filepath" "regexp" @@ -23,6 +24,7 @@ type ReadFile func(path string) (result []byte, err error) type Linter struct { reader ReadFile fileReadTokens chan struct{} + logger *slog.Logger } // New creates a new Linter. @@ -34,6 +36,14 @@ func New(reader ReadFile, maxOpenFiles int) Linter { return Linter{ reader: reader, fileReadTokens: fileReadTokens, + logger: slog.New(slog.DiscardHandler), + } +} + +// SetLogger sets the logger for the linter if the provided logger is not nil. +func (l *Linter) SetLogger(logger *slog.Logger) { + if logger != nil { + l.logger = logger } } @@ -146,6 +156,7 @@ func (l *Linter) lintPackage(filenames []string, gover *goversion.Version, ruleS addInvalidFileFailure(filename, err.Error(), failures) continue } + file.logger = l.logger pkg.files[filename] = file } diff --git a/vendor/github.com/mgechev/revive/lint/package.go b/vendor/github.com/mgechev/revive/lint/package.go index eaaf6413..9ddefa20 100644 --- a/vendor/github.com/mgechev/revive/lint/package.go +++ b/vendor/github.com/mgechev/revive/lint/package.go @@ -34,8 +34,12 @@ var ( trueValue = 1 falseValue = 2 + // Go111 is a constant representing the Go version 1.11. + Go111 = goversion.Must(goversion.NewVersion("1.11")) // Go115 is a constant representing the Go version 1.15. Go115 = goversion.Must(goversion.NewVersion("1.15")) + // Go118 is a constant representing the Go version 1.18. + Go118 = goversion.Must(goversion.NewVersion("1.18")) // Go121 is a constant representing the Go version 1.21. Go121 = goversion.Must(goversion.NewVersion("1.21")) // Go122 is a constant representing the Go version 1.22. @@ -44,6 +48,8 @@ var ( Go124 = goversion.Must(goversion.NewVersion("1.24")) // Go125 is a constant representing the Go version 1.25. Go125 = goversion.Must(goversion.NewVersion("1.25")) + // Go126 is a constant representing the Go version 1.26. + Go126 = goversion.Must(goversion.NewVersion("1.26")) ) // Files return package's files. @@ -223,6 +229,14 @@ func (p *Package) IsAtLeastGoVersion(v *goversion.Version) bool { return p.goVersion.GreaterThanOrEqual(v) } +// GoVersion returns the Go version for this package. +func (p *Package) GoVersion() *goversion.Version { + p.mu.RLock() + defer p.mu.RUnlock() + + return p.goVersion +} + func getSortableMethodFlagForFunction(fn *ast.FuncDecl) sortableMethodsFlags { switch { case astutils.FuncSignatureIs(fn, "Len", []string{}, []string{"int"}): diff --git a/vendor/github.com/mgechev/revive/rule/add_constant.go b/vendor/github.com/mgechev/revive/rule/add_constant.go index d0770a10..e00ca9f8 100644 --- a/vendor/github.com/mgechev/revive/rule/add_constant.go +++ b/vendor/github.com/mgechev/revive/rule/add_constant.go @@ -166,6 +166,10 @@ func (w *lintAddConstantRule) checkStrLit(n *ast.BasicLit) { mustCheck := count > ignoreMarker if mustCheck { w.strLits[n.Value] = count + 1 + val, _ := strconv.Unquote(n.Value) + if val == "" { + return + } if w.strLits[n.Value] > w.strLitLimit { w.onFailure(lint.Failure{ Confidence: 1, @@ -196,6 +200,8 @@ func (w *lintAddConstantRule) isStructTag(n *ast.BasicLit) bool { return ok } +var _ lint.ConfigurableRule = (*AddConstantRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/argument_limit.go b/vendor/github.com/mgechev/revive/rule/argument_limit.go index 7fd6a382..f2b55282 100644 --- a/vendor/github.com/mgechev/revive/rule/argument_limit.go +++ b/vendor/github.com/mgechev/revive/rule/argument_limit.go @@ -15,6 +15,8 @@ type ArgumentsLimitRule struct { const defaultArgumentsLimit = 8 +var _ lint.ConfigurableRule = (*ArgumentsLimitRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. @@ -55,6 +57,7 @@ func (r *ArgumentsLimitRule) Apply(file *lint.File, _ lint.Arguments) []lint.Fai Confidence: 1, Failure: fmt.Sprintf("maximum number of arguments per function exceeded; max %d but got %d", r.max, numParams), Node: funcDecl.Type, + Category: lint.FailureCategoryMaintenance, }) } diff --git a/vendor/github.com/mgechev/revive/rule/atomic.go b/vendor/github.com/mgechev/revive/rule/atomic.go index 83a7daea..d2ce2a09 100644 --- a/vendor/github.com/mgechev/revive/rule/atomic.go +++ b/vendor/github.com/mgechev/revive/rule/atomic.go @@ -84,6 +84,7 @@ func (w atomic) Visit(node ast.Node) ast.Visitor { if broken { w.onFailure(lint.Failure{ + Category: lint.FailureCategoryLogic, Confidence: 1, Failure: "direct assignment to atomic value", Node: n, diff --git a/vendor/github.com/mgechev/revive/rule/banned_characters.go b/vendor/github.com/mgechev/revive/rule/banned_characters.go index b113c8db..5ebe7360 100644 --- a/vendor/github.com/mgechev/revive/rule/banned_characters.go +++ b/vendor/github.com/mgechev/revive/rule/banned_characters.go @@ -15,6 +15,8 @@ type BannedCharsRule struct { const bannedCharsRuleName = "banned-characters" +var _ lint.ConfigurableRule = (*BannedCharsRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. @@ -80,6 +82,7 @@ func (w lintBannedCharsRule) Visit(node ast.Node) ast.Visitor { ok := strings.Contains(n.Name, c) if ok { w.onFailure(lint.Failure{ + Category: lint.FailureCategoryContent, Confidence: 1, Failure: fmt.Sprintf("banned character found: %s", c), RuleName: bannedCharsRuleName, diff --git a/vendor/github.com/mgechev/revive/rule/bare_return.go b/vendor/github.com/mgechev/revive/rule/bare_return.go index f2c90740..75bd6c04 100644 --- a/vendor/github.com/mgechev/revive/rule/bare_return.go +++ b/vendor/github.com/mgechev/revive/rule/bare_return.go @@ -75,6 +75,7 @@ func (w bareReturnFinder) Visit(node ast.Node) ast.Visitor { } w.onFailure(lint.Failure{ + Category: lint.FailureCategoryStyle, Confidence: 1, Node: rs, Failure: "avoid using bare returns, please add return expressions", diff --git a/vendor/github.com/mgechev/revive/rule/cognitive_complexity.go b/vendor/github.com/mgechev/revive/rule/cognitive_complexity.go index d9937713..8702dbfd 100644 --- a/vendor/github.com/mgechev/revive/rule/cognitive_complexity.go +++ b/vendor/github.com/mgechev/revive/rule/cognitive_complexity.go @@ -17,6 +17,8 @@ type CognitiveComplexityRule struct { const defaultMaxCognitiveComplexity = 7 +var _ lint.ConfigurableRule = (*CognitiveComplexityRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/comment_spacings.go b/vendor/github.com/mgechev/revive/rule/comment_spacings.go index d28bce04..7dd6d13d 100644 --- a/vendor/github.com/mgechev/revive/rule/comment_spacings.go +++ b/vendor/github.com/mgechev/revive/rule/comment_spacings.go @@ -7,17 +7,24 @@ import ( "github.com/mgechev/revive/lint" ) +// defaultAllowList is a set of comment prefixes that are allowed to not have a space after the comment delimiter. +var defaultAllowList = []string{ + "//#nosec", +} + // CommentSpacingsRule checks whether there is a space between -// the comment symbol // and the start of the comment text. +// the comment symbol `//` and the start of the comment text. type CommentSpacingsRule struct { allowList []string } +var _ lint.ConfigurableRule = (*CommentSpacingsRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. func (r *CommentSpacingsRule) Configure(arguments lint.Arguments) error { - r.allowList = []string{} + r.allowList = defaultAllowList for _, arg := range arguments { allow, ok := arg.(string) // Alt. non panicking version if !ok { diff --git a/vendor/github.com/mgechev/revive/rule/comments_density.go b/vendor/github.com/mgechev/revive/rule/comments_density.go index e83c20ad..80e1f140 100644 --- a/vendor/github.com/mgechev/revive/rule/comments_density.go +++ b/vendor/github.com/mgechev/revive/rule/comments_density.go @@ -15,6 +15,8 @@ type CommentsDensityRule struct { const defaultMinimumCommentsPercentage = 0 +var _ lint.ConfigurableRule = (*CommentsDensityRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. @@ -41,6 +43,7 @@ func (r *CommentsDensityRule) Apply(file *lint.File, _ lint.Arguments) []lint.Fa if density < float32(r.minimumCommentsDensity) { return []lint.Failure{ { + Category: lint.FailureCategoryMaintenance, Node: file.AST, Confidence: 1, Failure: fmt.Sprintf("the file has a comment density of %2.f%% (%d comment lines for %d code lines) but expected a minimum of %d%%", diff --git a/vendor/github.com/mgechev/revive/rule/context_as_argument.go b/vendor/github.com/mgechev/revive/rule/context_as_argument.go index 588bbabf..6c4b8d19 100644 --- a/vendor/github.com/mgechev/revive/rule/context_as_argument.go +++ b/vendor/github.com/mgechev/revive/rule/context_as_argument.go @@ -55,6 +55,8 @@ func (*ContextAsArgumentRule) Name() string { return "context-as-argument" } +var _ lint.ConfigurableRule = (*ContextAsArgumentRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/cyclomatic.go b/vendor/github.com/mgechev/revive/rule/cyclomatic.go index 6025b65e..7b4fda45 100644 --- a/vendor/github.com/mgechev/revive/rule/cyclomatic.go +++ b/vendor/github.com/mgechev/revive/rule/cyclomatic.go @@ -17,6 +17,8 @@ type CyclomaticRule struct { const defaultMaxCyclomaticComplexity = 10 +var _ lint.ConfigurableRule = (*CyclomaticRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/deep_exit.go b/vendor/github.com/mgechev/revive/rule/deep_exit.go index c1042a6a..eef61a2f 100644 --- a/vendor/github.com/mgechev/revive/rule/deep_exit.go +++ b/vendor/github.com/mgechev/revive/rule/deep_exit.go @@ -65,11 +65,14 @@ func (w *lintDeepExit) Visit(node ast.Node) ast.Visitor { pkg := id.Name fn := fc.Sel.Name - if isCallToExitFunction(pkg, fn, ce.Args) { + if astutils.IsCallToExitFunction(pkg, fn, ce.Args) { msg := fmt.Sprintf("calls to %s.%s only in main() or init() functions", pkg, fn) - if pkg == "flag" && fn == "NewFlagSet" && - len(ce.Args) == 2 && astutils.IsPkgDotName(ce.Args[1], "flag", "ExitOnError") { + switch { + case pkg == "flag" && fn == "Parse": + msg += "; move the call or refactor to use flag.NewFlagSet with flag.ContinueOnError" + case pkg == "flag" && fn == "NewFlagSet" && + len(ce.Args) == 2 && astutils.IsPkgDotName(ce.Args[1], "flag", "ExitOnError"): msg = "calls to flag.NewFlagSet with flag.ExitOnError only in main() or init() functions" } w.onFailure(lint.Failure{ diff --git a/vendor/github.com/mgechev/revive/rule/defer.go b/vendor/github.com/mgechev/revive/rule/defer.go index a8533684..83eaed62 100644 --- a/vendor/github.com/mgechev/revive/rule/defer.go +++ b/vendor/github.com/mgechev/revive/rule/defer.go @@ -5,16 +5,17 @@ import ( "go/ast" "github.com/mgechev/revive/internal/astutils" + "github.com/mgechev/revive/internal/config" "github.com/mgechev/revive/lint" ) var ( - deferOptionLoop = normalizeRuleOption("loop") - deferOptionCallChain = normalizeRuleOption("callChain") - deferOptionMethodCall = normalizeRuleOption("methodCall") - deferOptionReturn = normalizeRuleOption("return") - deferOptionRecover = normalizeRuleOption("recover") - deferOptionImmediateRecover = normalizeRuleOption("immediateRecover") + deferOptionLoop = config.NormalizeOption("loop") + deferOptionCallChain = config.NormalizeOption("callChain") + deferOptionMethodCall = config.NormalizeOption("methodCall") + deferOptionReturn = config.NormalizeOption("return") + deferOptionRecover = config.NormalizeOption("recover") + deferOptionImmediateRecover = config.NormalizeOption("immediateRecover") ) // DeferRule lints gotchas in defer statements. @@ -22,6 +23,8 @@ type DeferRule struct { allow map[string]bool } +var _ lint.ConfigurableRule = (*DeferRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. @@ -77,7 +80,7 @@ func (*DeferRule) allowFromArgs(args lint.Arguments) (map[string]bool, error) { if !ok { return nil, fmt.Errorf("invalid argument '%v' for 'defer' rule. Expecting string, got %T", subcase, subcase) } - allow[normalizeRuleOption(sc)] = true + allow[config.NormalizeOption(sc)] = true } return allow, nil diff --git a/vendor/github.com/mgechev/revive/rule/dot_imports.go b/vendor/github.com/mgechev/revive/rule/dot_imports.go index 5252e716..1b2d1925 100644 --- a/vendor/github.com/mgechev/revive/rule/dot_imports.go +++ b/vendor/github.com/mgechev/revive/rule/dot_imports.go @@ -37,6 +37,8 @@ func (*DotImportsRule) Name() string { return "dot-imports" } +var _ lint.ConfigurableRule = (*DotImportsRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/empty_block.go b/vendor/github.com/mgechev/revive/rule/empty_block.go index 210692c9..64b616d2 100644 --- a/vendor/github.com/mgechev/revive/rule/empty_block.go +++ b/vendor/github.com/mgechev/revive/rule/empty_block.go @@ -52,6 +52,13 @@ func (w lintEmptyBlock) Visit(node ast.Node) ast.Visitor { } case *ast.RangeStmt: if len(n.Body.List) == 0 { + if n.Key == nil && n.Value == nil { + // Conservatively skip bare for-range loops; this pattern is commonly + // used for channel draining and we avoid false positives. + w.ignore[n.Body] = true + return w + } + w.onFailure(lint.Failure{ Confidence: 0.9, Node: n, diff --git a/vendor/github.com/mgechev/revive/rule/enforce_map_style.go b/vendor/github.com/mgechev/revive/rule/enforce_map_style.go index 3292db0b..b8d6977f 100644 --- a/vendor/github.com/mgechev/revive/rule/enforce_map_style.go +++ b/vendor/github.com/mgechev/revive/rule/enforce_map_style.go @@ -42,6 +42,8 @@ type EnforceMapStyleRule struct { enforceMapStyle enforceMapStyleType } +var _ lint.ConfigurableRule = (*EnforceMapStyleRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/enforce_repeated_arg_type_style.go b/vendor/github.com/mgechev/revive/rule/enforce_repeated_arg_type_style.go index 9def128a..88bcc044 100644 --- a/vendor/github.com/mgechev/revive/rule/enforce_repeated_arg_type_style.go +++ b/vendor/github.com/mgechev/revive/rule/enforce_repeated_arg_type_style.go @@ -45,6 +45,8 @@ type EnforceRepeatedArgTypeStyleRule struct { funcRetValStyle enforceRepeatedArgTypeStyleType } +var _ lint.ConfigurableRule = (*EnforceRepeatedArgTypeStyleRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/enforce_slice_style.go b/vendor/github.com/mgechev/revive/rule/enforce_slice_style.go index 9bc26a6a..e3395593 100644 --- a/vendor/github.com/mgechev/revive/rule/enforce_slice_style.go +++ b/vendor/github.com/mgechev/revive/rule/enforce_slice_style.go @@ -46,6 +46,8 @@ type EnforceSliceStyleRule struct { enforceSliceStyle enforceSliceStyleType } +var _ lint.ConfigurableRule = (*EnforceSliceStyleRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. @@ -77,8 +79,20 @@ func (r *EnforceSliceStyleRule) Apply(file *lint.File, _ lint.Arguments) []lint. var failures []lint.Failure + var stack []ast.Node astFile := file.AST ast.Inspect(astFile, func(n ast.Node) bool { + if n == nil { + stack = stack[:len(stack)-1] + return true + } + + var parent ast.Node + if len(stack) > 0 { + parent = stack[len(stack)-1] + } + stack = append(stack, n) + switch v := n.(type) { case *ast.CompositeLit: switch r.enforceSliceStyle { @@ -99,7 +113,7 @@ func (r *EnforceSliceStyleRule) Apply(file *lint.File, _ lint.Arguments) []lint. var failureMessage string if r.enforceSliceStyle == enforceSliceStyleTypeNil { - failureMessage = "use nil slice declaration (e.g. var args []type) instead of []type{}" + failureMessage = nilSliceFailureMessage(parent, "[]type{}") } else { failureMessage = "use make([]type) instead of []type{} (or declare nil slice)" } @@ -158,7 +172,7 @@ func (r *EnforceSliceStyleRule) Apply(file *lint.File, _ lint.Arguments) []lint. var failureMessage string if r.enforceSliceStyle == enforceSliceStyleTypeNil { - failureMessage = "use nil slice declaration (e.g. var args []type) instead of make([]type, 0)" + failureMessage = nilSliceFailureMessage(parent, "make([]type, 0)") } else { failureMessage = "use []type{} instead of make([]type, 0) (or declare nil slice)" } @@ -180,6 +194,13 @@ func (*EnforceSliceStyleRule) Name() string { return "enforce-slice-style" } +func nilSliceFailureMessage(parent ast.Node, instead string) string { + if _, ok := parent.(*ast.ValueSpec); ok { + return "use nil slice declaration (e.g. var args []type) instead of " + instead + } + return "use nil slice (e.g. []type(nil)) instead of " + instead +} + func (r *EnforceSliceStyleRule) isSliceType(v ast.Expr) bool { switch t := v.(type) { case *ast.ArrayType: diff --git a/vendor/github.com/mgechev/revive/rule/enforce_switch_style.go b/vendor/github.com/mgechev/revive/rule/enforce_switch_style.go index 5f2e3122..f8ccc163 100644 --- a/vendor/github.com/mgechev/revive/rule/enforce_switch_style.go +++ b/vendor/github.com/mgechev/revive/rule/enforce_switch_style.go @@ -14,6 +14,8 @@ type EnforceSwitchStyleRule struct { allowDefaultNotLast bool // allow default, if present, not being the last case } +var _ lint.ConfigurableRule = (*EnforceSwitchStyleRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/error_strings.go b/vendor/github.com/mgechev/revive/rule/error_strings.go index 53a585bf..e806e9e5 100644 --- a/vendor/github.com/mgechev/revive/rule/error_strings.go +++ b/vendor/github.com/mgechev/revive/rule/error_strings.go @@ -17,6 +17,8 @@ type ErrorStringsRule struct { errorFunctions map[string]map[string]struct{} } +var _ lint.ConfigurableRule = (*ErrorStringsRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/exported.go b/vendor/github.com/mgechev/revive/rule/exported.go index 9d8ace8e..5cd14f50 100644 --- a/vendor/github.com/mgechev/revive/rule/exported.go +++ b/vendor/github.com/mgechev/revive/rule/exported.go @@ -69,6 +69,8 @@ type ExportedRule struct { disabledChecks disabledChecks } +var _ lint.ConfigurableRule = (*ExportedRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configure makes the rule implement the [lint.ConfigurableRule] interface. @@ -370,7 +372,7 @@ func (gds exportedGoDocStatus) confidence() float64 { } func (gds exportedGoDocStatus) correctionHint(firstCommentLine string) string { - firstWord := strings.Split(firstCommentLine, " ")[0] + firstWord, _, _ := strings.Cut(firstCommentLine, " ") switch gds { case exportedGoDocStatusCaseMismatch: return ` by using its correct casing, not "` + firstWord + ` ..."` diff --git a/vendor/github.com/mgechev/revive/rule/file_header.go b/vendor/github.com/mgechev/revive/rule/file_header.go index a6538b51..16dc9cb8 100644 --- a/vendor/github.com/mgechev/revive/rule/file_header.go +++ b/vendor/github.com/mgechev/revive/rule/file_header.go @@ -18,6 +18,8 @@ var ( singleRegexp = regexp.MustCompile("^//") ) +var _ lint.ConfigurableRule = (*FileHeaderRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. @@ -42,6 +44,7 @@ func (r *FileHeaderRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure failure := []lint.Failure{ { + Category: lint.FailureCategoryComments, Node: file.AST, Confidence: 1, Failure: "the file doesn't have an appropriate header", diff --git a/vendor/github.com/mgechev/revive/rule/file_length_limit.go b/vendor/github.com/mgechev/revive/rule/file_length_limit.go index c24db435..ebea4f1a 100644 --- a/vendor/github.com/mgechev/revive/rule/file_length_limit.go +++ b/vendor/github.com/mgechev/revive/rule/file_length_limit.go @@ -70,6 +70,8 @@ func (r *FileLengthLimitRule) Apply(file *lint.File, _ lint.Arguments) []lint.Fa } } +var _ lint.ConfigurableRule = (*FileLengthLimitRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/filename_format.go b/vendor/github.com/mgechev/revive/rule/filename_format.go index 960ebb0c..6bca5889 100644 --- a/vendor/github.com/mgechev/revive/rule/filename_format.go +++ b/vendor/github.com/mgechev/revive/rule/filename_format.go @@ -24,6 +24,7 @@ func (r *FilenameFormatRule) Apply(file *lint.File, _ lint.Arguments) []lint.Fai failureMsg := fmt.Sprintf("Filename %s is not of the format %s.%s", filename, r.format.String(), r.getMsgForNonASCIIChars(filename)) return []lint.Failure{{ + Category: lint.FailureCategoryNaming, Confidence: 1, Failure: failureMsg, RuleName: r.Name(), @@ -51,6 +52,8 @@ func (*FilenameFormatRule) Name() string { var defaultFormat = regexp.MustCompile(`^[_A-Za-z0-9][_A-Za-z0-9-]*\.go$`) +var _ lint.ConfigurableRule = (*FilenameFormatRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/function_length.go b/vendor/github.com/mgechev/revive/rule/function_length.go index 53cb6827..cc669c55 100644 --- a/vendor/github.com/mgechev/revive/rule/function_length.go +++ b/vendor/github.com/mgechev/revive/rule/function_length.go @@ -14,6 +14,8 @@ type FunctionLength struct { maxLines int } +var _ lint.ConfigurableRule = (*FunctionLength)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. @@ -46,6 +48,7 @@ func (r *FunctionLength) Apply(file *lint.File, _ lint.Arguments) []lint.Failure stmtCount := r.countStmts(body.List) if stmtCount > r.maxStmt { failures = append(failures, lint.Failure{ + Category: lint.FailureCategoryMaintenance, Confidence: 1, Failure: fmt.Sprintf("maximum number of statements per function exceeded; max %d but got %d", r.maxStmt, stmtCount), Node: funcDecl, @@ -57,6 +60,7 @@ func (r *FunctionLength) Apply(file *lint.File, _ lint.Arguments) []lint.Failure lineCount := r.countLines(body, file) if lineCount > r.maxLines { failures = append(failures, lint.Failure{ + Category: lint.FailureCategoryMaintenance, Confidence: 1, Failure: fmt.Sprintf("maximum number of lines per function exceeded; max %d but got %d", r.maxLines, lineCount), Node: funcDecl, diff --git a/vendor/github.com/mgechev/revive/rule/function_result_limit.go b/vendor/github.com/mgechev/revive/rule/function_result_limit.go index b5508f36..e3dec91a 100644 --- a/vendor/github.com/mgechev/revive/rule/function_result_limit.go +++ b/vendor/github.com/mgechev/revive/rule/function_result_limit.go @@ -33,6 +33,7 @@ func (r *FunctionResultsLimitRule) Apply(file *lint.File, _ lint.Arguments) []li } failures = append(failures, lint.Failure{ + Category: lint.FailureCategoryMaintenance, Confidence: 1, Failure: fmt.Sprintf("maximum number of return results per function exceeded; max %d but got %d", r.max, num), Node: funcDecl.Type, @@ -49,6 +50,8 @@ func (*FunctionResultsLimitRule) Name() string { const defaultResultsLimit = 3 +var _ lint.ConfigurableRule = (*FunctionResultsLimitRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/identical_switch_branches.go b/vendor/github.com/mgechev/revive/rule/identical_switch_branches.go index fc1d620b..5375cbd2 100644 --- a/vendor/github.com/mgechev/revive/rule/identical_switch_branches.go +++ b/vendor/github.com/mgechev/revive/rule/identical_switch_branches.go @@ -10,10 +10,43 @@ import ( ) // IdenticalSwitchBranchesRule warns on identical switch branches. -type IdenticalSwitchBranchesRule struct{} +type IdenticalSwitchBranchesRule struct { + allowIdenticalDefault bool // allow the default clause to be identical to a case clause +} + +var _ lint.ConfigurableRule = (*IdenticalSwitchBranchesRule)(nil) + +// Configure validates the rule configuration, and configures the rule accordingly. +// +// Configuration implements the [lint.ConfigurableRule] interface. +func (r *IdenticalSwitchBranchesRule) Configure(arguments lint.Arguments) error { + if len(arguments) < 1 { + return nil // use defaults + } + + argKV, ok := arguments[0].(map[string]any) + if !ok { + return fmt.Errorf("invalid argument to the %s rule. Expecting a k,v map, got %T", r.Name(), arguments[0]) + } + + for k, v := range argKV { + switch { + case isRuleOption(k, "allowIdenticalDefault"): + allow, ok := v.(bool) + if !ok { + return fmt.Errorf("invalid configuration value for %q in %s rule; need bool but got %T", k, r.Name(), v) + } + r.allowIdenticalDefault = allow + default: + return fmt.Errorf(`invalid argument %q for rule %s; expected "allow-identical-default"`, k, r.Name()) + } + } + + return nil +} // Apply applies the rule to given file. -func (*IdenticalSwitchBranchesRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure { +func (r *IdenticalSwitchBranchesRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure { var failures []lint.Failure onFailure := func(failure lint.Failure) { @@ -24,7 +57,11 @@ func (*IdenticalSwitchBranchesRule) Apply(file *lint.File, _ lint.Arguments) []l return file.ToPosition(s.Pos()).Line } - w := &lintIdenticalSwitchBranches{getStmtLine: getStmtLine, onFailure: onFailure} + w := &lintIdenticalSwitchBranches{ + getStmtLine: getStmtLine, + onFailure: onFailure, + allowIdenticalDefault: r.allowIdenticalDefault, + } for _, decl := range file.AST.Decls { fn, ok := decl.(*ast.FuncDecl) if !ok || fn.Body == nil { @@ -43,8 +80,9 @@ func (*IdenticalSwitchBranchesRule) Name() string { } type lintIdenticalSwitchBranches struct { - getStmtLine func(ast.Stmt) int - onFailure func(lint.Failure) + getStmtLine func(ast.Stmt) int + onFailure func(lint.Failure) + allowIdenticalDefault bool } func (w *lintIdenticalSwitchBranches) Visit(node ast.Node) ast.Visitor { @@ -66,12 +104,24 @@ func (w *lintIdenticalSwitchBranches) Visit(node ast.Node) ast.Visitor { return ok && ft.Tok == token.FALLTHROUGH } + // A case clause with no expression list is the default clause. + isDefault := func(cc *ast.CaseClause) bool { return cc.List == nil } + hashes := map[string]int{} // map hash(branch code) -> branch line for _, cc := range switchStmt.Body.List { caseClause := cc.(*ast.CaseClause) if doesFallthrough(caseClause.Body) { continue // skip fallthrough branches } + + if w.allowIdenticalDefault && isDefault(caseClause) { + // Spelling out a fallback that repeats a listed case is a documented choice: it says + // which values are explicitly handled and that anything else lands on the same code. + // Walk into it so nested switches are still analyzed, but neither report it nor record + // its hash, so a later clause cannot be reported against it either. + ast.Walk(w, &ast.BlockStmt{List: caseClause.Body}) + continue + } branch := &ast.BlockStmt{ List: caseClause.Body, } diff --git a/vendor/github.com/mgechev/revive/rule/if_return.go b/vendor/github.com/mgechev/revive/rule/if_return.go index 15c7ca18..a7e497f0 100644 --- a/vendor/github.com/mgechev/revive/rule/if_return.go +++ b/vendor/github.com/mgechev/revive/rule/if_return.go @@ -85,6 +85,7 @@ func (w *lintElseError) Visit(node ast.Node) ast.Visitor { } w.onFailure(lint.Failure{ + Category: lint.FailureCategoryStyle, Confidence: .9, Node: v.List[i], Failure: "redundant if ...; err != nil check, just return error instead.", diff --git a/vendor/github.com/mgechev/revive/rule/import_alias_naming.go b/vendor/github.com/mgechev/revive/rule/import_alias_naming.go index a46c331e..9f50fd2a 100644 --- a/vendor/github.com/mgechev/revive/rule/import_alias_naming.go +++ b/vendor/github.com/mgechev/revive/rule/import_alias_naming.go @@ -18,6 +18,8 @@ const defaultImportAliasNamingAllowRule = "^[a-z][a-z0-9]{0,}$" //nolint:gocritic // regexpSimplify: backward compatibility var defaultImportAliasNamingAllowRegexp = regexp.MustCompile(defaultImportAliasNamingAllowRule) +var _ lint.ConfigurableRule = (*ImportAliasNamingRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/imports_blocklist.go b/vendor/github.com/mgechev/revive/rule/imports_blocklist.go index 8d3b0869..9238570f 100644 --- a/vendor/github.com/mgechev/revive/rule/imports_blocklist.go +++ b/vendor/github.com/mgechev/revive/rule/imports_blocklist.go @@ -14,6 +14,8 @@ type ImportsBlocklistRule struct { var replaceImportRegexp = regexp.MustCompile(`/?\*\*/?`) +var _ lint.ConfigurableRule = (*ImportsBlocklistRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/line_length_limit.go b/vendor/github.com/mgechev/revive/rule/line_length_limit.go index f2c9a146..a5ca6ba9 100644 --- a/vendor/github.com/mgechev/revive/rule/line_length_limit.go +++ b/vendor/github.com/mgechev/revive/rule/line_length_limit.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "go/token" + "regexp" "strings" "unicode/utf8" @@ -14,36 +15,105 @@ import ( // LineLengthLimitRule lints the number of characters in a line. type LineLengthLimitRule struct { - max int + max int + excludes []*regexp.Regexp } const defaultLineLengthLimit = 80 +var _ lint.ConfigurableRule = (*LineLengthLimitRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. func (r *LineLengthLimitRule) Configure(arguments lint.Arguments) error { + r.max = defaultLineLengthLimit + r.excludes = nil if len(arguments) < 1 { - r.max = defaultLineLengthLimit return nil } - maxLength, ok := arguments[0].(int64) // Alt. non panicking version - if !ok || maxLength < 0 { + switch arg := arguments[0].(type) { + case int64: + // backward compatibility: if the first argument is an integer, it is treated as the maximum line length. + return r.setMax(arg) + case map[string]any: + return r.configureFromMap(arg) + default: + return fmt.Errorf(`invalid argument to the "line-length-limit" rule: expecting an integer or an options map, got %T`, arguments[0]) + } +} + +func (r *LineLengthLimitRule) setMax(value int64) error { + if value < 0 { return errors.New(`invalid value passed as argument number to the "line-length-limit" rule`) } - r.max = int(maxLength) + r.max = int(value) + return nil +} + +func (r *LineLengthLimitRule) configureFromMap(options map[string]any) error { + for k, v := range options { + switch { + case isRuleOption(k, "max"): + maxLength, ok := v.(int64) + if !ok { + return fmt.Errorf(`invalid value for the "max" option of the "line-length-limit" rule: expecting an integer, got %T`, v) + } + + if err := r.setMax(maxLength); err != nil { + return err + } + case isRuleOption(k, "excludes"): + excludes, err := parseLineLengthExcludes(v) + if err != nil { + return err + } + + r.excludes = excludes + } + } + return nil } +func parseLineLengthExcludes(value any) ([]*regexp.Regexp, error) { + list, ok := value.([]any) + if !ok { + return nil, fmt.Errorf(`invalid value for the "excludes" option of the "line-length-limit" rule: expecting a slice of strings, got %T`, value) + } + + excludes := make([]*regexp.Regexp, 0, len(list)) + for _, v := range list { + pattern, ok := v.(string) + if !ok { + return nil, fmt.Errorf(`invalid value in the "excludes" option of the "line-length-limit" rule: expecting a string, got %T`, v) + } + + if pattern == "" { + return nil, errors.New(`invalid value in the "excludes" option of the "line-length-limit" rule: regular expression must not be empty`) + } + + exp, err := regexp.Compile(pattern) + if err != nil { + return nil, fmt.Errorf(`invalid value in the "excludes" option of the "line-length-limit" rule: regexp %q does not compile: %w`, pattern, err) + } + + excludes = append(excludes, exp) + } + + return excludes, nil +} + // Apply applies the rule to given file. func (r *LineLengthLimitRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure { var failures []lint.Failure checker := lintLineLengthNum{ - max: r.max, - file: file, + max: r.max, + excludes: r.excludes, + file: file, onFailure: func(failure lint.Failure) { failures = append(failures, failure) }, @@ -61,6 +131,7 @@ func (*LineLengthLimitRule) Name() string { type lintLineLengthNum struct { max int + excludes []*regexp.Regexp file *lint.File onFailure func(lint.Failure) } @@ -72,6 +143,11 @@ func (r lintLineLengthNum) check() { s := bufio.NewScanner(f) for s.Scan() { t := s.Text() + if r.isExcluded(t) { + l++ + continue + } + t = strings.ReplaceAll(t, "\t", spaces) c := utf8.RuneCountInString(t) if c > r.max { @@ -97,3 +173,14 @@ func (r lintLineLengthNum) check() { l++ } } + +// isExcluded reports whether the raw line matches any of the configured exclude patterns. +func (r lintLineLengthNum) isExcluded(line string) bool { + for _, exclude := range r.excludes { + if exclude.MatchString(line) { + return true + } + } + + return false +} diff --git a/vendor/github.com/mgechev/revive/rule/marshal_receiver.go b/vendor/github.com/mgechev/revive/rule/marshal_receiver.go new file mode 100644 index 00000000..ea3978f2 --- /dev/null +++ b/vendor/github.com/mgechev/revive/rule/marshal_receiver.go @@ -0,0 +1,76 @@ +package rule + +import ( + "go/ast" + + "github.com/mgechev/revive/internal/typeparams" + "github.com/mgechev/revive/lint" +) + +// MarshalReceiverRule lints marshal/unmarshal methods with incorrect receiver types. +type MarshalReceiverRule struct{} + +// Name returns the rule name. +func (*MarshalReceiverRule) Name() string { + return "marshal-receiver" +} + +// Apply applies the rule to given file. +func (*MarshalReceiverRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure { + var failures []lint.Failure + + for _, decl := range file.AST.Decls { + fn, ok := decl.(*ast.FuncDecl) + if !ok || fn.Recv == nil || len(fn.Recv.List) == 0 { + continue + } + + name := fn.Name.Name + qualifiedName := typeparams.ReceiverType(fn) + "." + name + isMarshal := isMarshalMethod(name) + isUnmarshal := !isMarshal && isUnmarshalMethod(name) + if !isMarshal && !isUnmarshal { + continue + } + + recv := fn.Recv.List[0] + _, isPtr := recv.Type.(*ast.StarExpr) + + var msg string + switch { + case isMarshal && isPtr: + msg = " method should use a value receiver, not a pointer receiver" + case isUnmarshal && !isPtr: + msg = " method should use a pointer receiver, not a value receiver" + default: + continue // nothing to say about the method declaration + } + + failures = append(failures, lint.Failure{ + Node: decl, + Confidence: 1, + Category: lint.FailureCategoryBadPractice, + Failure: qualifiedName + msg, + }) + } + + return failures +} + +func isMarshalMethod(name string) bool { + switch name { + case "MarshalJSON", "MarshalText", "MarshalYAML": + return true + default: + return false + } +} + +func isUnmarshalMethod(name string) bool { + switch name { + case "UnmarshalJSON", "UnmarshalText", "UnmarshalYAML": + return true + default: + return false + } +} diff --git a/vendor/github.com/mgechev/revive/rule/max_control_nesting.go b/vendor/github.com/mgechev/revive/rule/max_control_nesting.go index b1ac459d..e165ba3b 100644 --- a/vendor/github.com/mgechev/revive/rule/max_control_nesting.go +++ b/vendor/github.com/mgechev/revive/rule/max_control_nesting.go @@ -103,6 +103,8 @@ func (w *lintMaxControlNesting) walkControlledBlock(b ast.Node) { w.nestingLevelAcc = oldNestingLevel } +var _ lint.ConfigurableRule = (*MaxControlNestingRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/max_public_structs.go b/vendor/github.com/mgechev/revive/rule/max_public_structs.go index 07027722..f9dd2362 100644 --- a/vendor/github.com/mgechev/revive/rule/max_public_structs.go +++ b/vendor/github.com/mgechev/revive/rule/max_public_structs.go @@ -16,6 +16,8 @@ type MaxPublicStructsRule struct { const defaultMaxPublicStructs = 5 +var _ lint.ConfigurableRule = (*MaxPublicStructsRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/modifies_value_receiver.go b/vendor/github.com/mgechev/revive/rule/modifies_value_receiver.go index d8daace0..6b59759b 100644 --- a/vendor/github.com/mgechev/revive/rule/modifies_value_receiver.go +++ b/vendor/github.com/mgechev/revive/rule/modifies_value_receiver.go @@ -42,6 +42,7 @@ func (r *ModifiesValRecRule) Apply(file *lint.File, _ lint.Arguments) []lint.Fai for _, assignment := range assignmentsToReceiver { failures = append(failures, lint.Failure{ + Category: lint.FailureCategoryLogic, Node: assignment, Confidence: 1, Failure: "suspicious assignment to a by-value method receiver", diff --git a/vendor/github.com/mgechev/revive/rule/multiline_if_init.go b/vendor/github.com/mgechev/revive/rule/multiline_if_init.go new file mode 100644 index 00000000..f57c8962 --- /dev/null +++ b/vendor/github.com/mgechev/revive/rule/multiline_if_init.go @@ -0,0 +1,59 @@ +package rule + +import ( + "go/ast" + + "github.com/mgechev/revive/lint" +) + +// MultilineIfInitRule flags if statements whose init clause spans multiple lines. +// A multi-line init defeats the purpose of the if-init idiom, which exists for tight one-liners. +// When it wraps, the reader has to visually parse a struct literal or call chain to +// find where the init ends and the condition begins. +type MultilineIfInitRule struct{} + +// Apply applies the rule to given file. +func (*MultilineIfInitRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure { + var failures []lint.Failure + + onFailure := func(failure lint.Failure) { + failures = append(failures, failure) + } + + ast.Walk(lintMultilineIfInit{ + file: file, + onFailure: onFailure, + }, file.AST) + return failures +} + +// Name returns the rule name. +func (*MultilineIfInitRule) Name() string { + return "multiline-if-init" +} + +type lintMultilineIfInit struct { + file *lint.File + onFailure func(lint.Failure) +} + +func (w lintMultilineIfInit) Visit(n ast.Node) ast.Visitor { + ifStmt, ok := n.(*ast.IfStmt) + if !ok || ifStmt.Init == nil { + return w + } + + initStart := w.file.ToPosition(ifStmt.Init.Pos()) + initEnd := w.file.ToPosition(ifStmt.Init.End()) + + if initEnd.Line-initStart.Line > 0 { + w.onFailure(lint.Failure{ + Confidence: 1, + Node: ifStmt, + Category: lint.FailureCategoryStyle, + Failure: "if-init statement should not span multiple lines", + }) + } + + return w +} diff --git a/vendor/github.com/mgechev/revive/rule/package_comments.go b/vendor/github.com/mgechev/revive/rule/package_comments.go index 74af6267..6849d04d 100644 --- a/vendor/github.com/mgechev/revive/rule/package_comments.go +++ b/vendor/github.com/mgechev/revive/rule/package_comments.go @@ -118,16 +118,16 @@ func (l *lintPackageComments) Visit(_ ast.Node) ast.Visitor { lastCG = cg } if lastCG != nil && strings.HasPrefix(lastCG.Text(), prefix) { - endPos := l.file.ToPosition(lastCG.End()) + endLine := commentGroupEndLine(l.file, lastCG) pkgPos := l.file.ToPosition(l.fileAst.Package) - if endPos.Line+1 < pkgPos.Line { + if endLine+1 < pkgPos.Line { // There isn't a great place to anchor this error; // the start of the blank lines between the doc and the package statement // is at least pointing at the location of the problem. pos := token.Position{ - Filename: endPos.Filename, + Filename: pkgPos.Filename, // Offset not set; it is non-trivial, and doesn't appear to be needed. - Line: endPos.Line + 1, + Line: endLine + 1, Column: 1, } l.onFailure(lint.Failure{ @@ -163,6 +163,16 @@ func (l *lintPackageComments) Visit(_ ast.Node) ast.Visitor { return nil } +// commentGroupEndLine returns the line of the last character of the given comment group. +// +// It does not rely on [ast.CommentGroup.End] because that position is derived from the +// comment text, from which the scanner strips carriage returns. On CRLF sources End() +// therefore points before the actual end of a block comment (see https://go.dev/issue/41197). +func commentGroupEndLine(file *lint.File, cg *ast.CommentGroup) int { + lastComment := cg.List[len(cg.List)-1] + return file.ToPosition(lastComment.Slash).Line + strings.Count(lastComment.Text, "\n") +} + func isEmptyDoc(commentGroup *ast.CommentGroup) bool { return commentGroup == nil || commentGroup.Text() == "" } diff --git a/vendor/github.com/mgechev/revive/rule/package_directory_mismatch.go b/vendor/github.com/mgechev/revive/rule/package_directory_mismatch.go index ea8df9d1..f1663cb0 100644 --- a/vendor/github.com/mgechev/revive/rule/package_directory_mismatch.go +++ b/vendor/github.com/mgechev/revive/rule/package_directory_mismatch.go @@ -17,6 +17,8 @@ type PackageDirectoryMismatchRule struct { const defaultIgnoredDirs = "testdata" +var _ lint.ConfigurableRule = (*PackageDirectoryMismatchRule)(nil) + // Configure the rule to exclude certain directories. func (r *PackageDirectoryMismatchRule) Configure(arguments lint.Arguments) error { if len(arguments) < 1 { diff --git a/vendor/github.com/mgechev/revive/rule/package_naming.go b/vendor/github.com/mgechev/revive/rule/package_naming.go index 642b16a1..a7c8289b 100644 --- a/vendor/github.com/mgechev/revive/rule/package_naming.go +++ b/vendor/github.com/mgechev/revive/rule/package_naming.go @@ -10,6 +10,7 @@ import ( gopackages "golang.org/x/tools/go/packages" + "github.com/mgechev/revive/internal/rule" "github.com/mgechev/revive/internal/syncset" "github.com/mgechev/revive/lint" ) @@ -100,6 +101,8 @@ type PackageNamingRule struct { alreadyCheckedNames *syncset.Set } +var _ lint.ConfigurableRule = (*PackageNamingRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. @@ -251,7 +254,7 @@ func (r *PackageNamingRule) Apply(file *lint.File, _ lint.Arguments) []lint.Fail onFailure(r.pkgNameFailure(node, "don't use package name %q that contains an underscore", pkgName)) return failures } - if hasUpperCaseLetter(pkgNameWithoutTestSuffix) { + if rule.HasUpperCaseLetter(pkgNameWithoutTestSuffix) { onFailure(r.pkgNameFailure(node, "don't use package name %q that contains MixedCaps", pkgName)) return failures } diff --git a/vendor/github.com/mgechev/revive/rule/range.go b/vendor/github.com/mgechev/revive/rule/range.go index 2772f11b..c2ea2582 100644 --- a/vendor/github.com/mgechev/revive/rule/range.go +++ b/vendor/github.com/mgechev/revive/rule/range.go @@ -53,6 +53,7 @@ func (w *lintRanges) Visit(node ast.Node) ast.Visitor { newRS.Value = nil w.onFailure(lint.Failure{ + Category: lint.FailureCategoryStyle, Failure: fmt.Sprintf("should omit 2nd value from range; this loop is equivalent to `for %s %s range ...`", w.file.Render(rs.Key), rs.Tok), Confidence: 1, Node: rs.Value, diff --git a/vendor/github.com/mgechev/revive/rule/range_val_address.go b/vendor/github.com/mgechev/revive/rule/range_val_address.go index 6622cd5a..2c7efd81 100644 --- a/vendor/github.com/mgechev/revive/rule/range_val_address.go +++ b/vendor/github.com/mgechev/revive/rule/range_val_address.go @@ -159,6 +159,7 @@ func (bw rangeBodyVisitor) isAccessingRangeValueAddress(exp ast.Expr) bool { func (bw rangeBodyVisitor) newFailure(node ast.Node) lint.Failure { return lint.Failure{ + Category: lint.FailureCategoryLogic, Node: node, Confidence: 1, Failure: fmt.Sprintf("suspicious assignment of '%s'. range-loop variables always have the same address", bw.valueID.Name), diff --git a/vendor/github.com/mgechev/revive/rule/range_val_in_closure.go b/vendor/github.com/mgechev/revive/rule/range_val_in_closure.go index a99376fb..ba3f67c7 100644 --- a/vendor/github.com/mgechev/revive/rule/range_val_in_closure.go +++ b/vendor/github.com/mgechev/revive/rule/range_val_in_closure.go @@ -112,6 +112,7 @@ func (w rangeValInClosure) Visit(node ast.Node) ast.Visitor { for _, v := range vars { if v.Obj == id.Obj { w.onFailure(lint.Failure{ + Category: lint.FailureCategoryLogic, Confidence: 1, Failure: fmt.Sprintf("loop variable %v captured by func literal", id.Name), Node: n, diff --git a/vendor/github.com/mgechev/revive/rule/receiver_naming.go b/vendor/github.com/mgechev/revive/rule/receiver_naming.go index e2737ed8..8b3b3316 100644 --- a/vendor/github.com/mgechev/revive/rule/receiver_naming.go +++ b/vendor/github.com/mgechev/revive/rule/receiver_naming.go @@ -14,6 +14,9 @@ type ReceiverNamingRule struct { } const defaultReceiverNameMaxLength = -1 // thus will not check + +var _ lint.ConfigurableRule = (*ReceiverNamingRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/redefines_builtin_id.go b/vendor/github.com/mgechev/revive/rule/redefines_builtin_id.go index 52c679f1..f786c122 100644 --- a/vendor/github.com/mgechev/revive/rule/redefines_builtin_id.go +++ b/vendor/github.com/mgechev/revive/rule/redefines_builtin_id.go @@ -43,6 +43,7 @@ var builtFunctionsAfterGo121 = map[string]bool{ var builtInTypes = map[string]bool{ "bool": true, "byte": true, + "comparable": true, "complex128": true, "complex64": true, "error": true, diff --git a/vendor/github.com/mgechev/revive/rule/redundant_build_tag.go b/vendor/github.com/mgechev/revive/rule/redundant_build_tag.go index d195ce6e..9163c575 100644 --- a/vendor/github.com/mgechev/revive/rule/redundant_build_tag.go +++ b/vendor/github.com/mgechev/revive/rule/redundant_build_tag.go @@ -1,6 +1,8 @@ package rule import ( + "fmt" + "go/version" "strings" "github.com/mgechev/revive/lint" @@ -9,24 +11,44 @@ import ( // RedundantBuildTagRule lints the presence of redundant build tags. type RedundantBuildTagRule struct{} -// Apply triggers if an old build tag `// +build` is found after a new one `//go:build`. -// `//go:build` comments are automatically added by gofmt when Go 1.17+ is used. +// Apply triggers on two kinds of redundant build tags: +// - an old `// +build` tag found after a new `//go:build` tag, since `//go:build` +// comments are automatically added by gofmt when Go 1.17+ is used; +// - a `//go:build go1.X` version constraint that is already guaranteed by the +// go version in go.mod (Go 1.21+, where the go directive is a hard requirement). +// // See https://pkg.go.dev/cmd/go#hdr-Build_constraints func (*RedundantBuildTagRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure { for _, group := range file.AST.Comments { hasGoBuild := false for _, comment := range group.List { - if strings.HasPrefix(comment.Text, "//go:build ") { + if ver, ok := strings.CutPrefix(comment.Text, "//go:build "); ok { hasGoBuild = true + + // goVersion is the module's language version, e.g. "go1.21". + goVersion := version.Lang("go" + file.Pkg.GoVersion().String()) + // Starting with Go 1.21 the go version in go.mod is a hard requirement, + // so a `//go:build go1.X` constraint it already satisfies is redundant. + // Skip this check for Go 1.20 and earlier. + if file.Pkg.IsAtLeastGoVersion(lint.Go121) && version.IsValid(ver) && version.Compare(goVersion, ver) >= 0 { + return []lint.Failure{{ + Category: lint.FailureCategoryStyle, + Confidence: 1, + Node: comment, + Failure: fmt.Sprintf("The build tag %q is redundant for Go %s and can be removed", comment.Text, strings.TrimPrefix(goVersion, "go")), + }} + } + continue } - if hasGoBuild && strings.HasPrefix(comment.Text, "// +build ") { + const oldGoBuildPrefix = "// +build" + if hasGoBuild && strings.HasPrefix(comment.Text, oldGoBuildPrefix) { return []lint.Failure{{ Category: lint.FailureCategoryStyle, Confidence: 1, Node: comment, - Failure: `The build tag "// +build" is redundant since Go 1.17 and can be removed`, + Failure: fmt.Sprintf("The build tag %q is redundant since Go 1.17 and can be removed", oldGoBuildPrefix), }} } } diff --git a/vendor/github.com/mgechev/revive/rule/redundant_test_main_exit.go b/vendor/github.com/mgechev/revive/rule/redundant_test_main_exit.go index 04e643e5..c41a4d0c 100644 --- a/vendor/github.com/mgechev/revive/rule/redundant_test_main_exit.go +++ b/vendor/github.com/mgechev/revive/rule/redundant_test_main_exit.go @@ -3,7 +3,9 @@ package rule import ( "fmt" "go/ast" + "go/token" + "github.com/mgechev/revive/internal/astutils" "github.com/mgechev/revive/lint" ) @@ -19,12 +21,25 @@ func (*RedundantTestMainExitRule) Apply(file *lint.File, _ lint.Arguments) []lin return failures } - onFailure := func(failure lint.Failure) { - failures = append(failures, failure) + for _, decl := range file.AST.Decls { + fd, ok := decl.(*ast.FuncDecl) + if !ok || fd.Recv != nil || fd.Body == nil || !astutils.FuncSignatureIs(fd, "TestMain", []string{"*testing.M"}, nil) || len(fd.Type.Params.List[0].Names) != 1 { + continue + } + + w := &lintRedundantTestMainExit{ + mName: fd.Type.Params.List[0].Names[0].Name, + writes: map[string]int{}, + runResults: map[string]token.Pos{}, + onFailure: func(failure lint.Failure) { + failures = append(failures, failure) + }, + } + ast.Inspect(fd.Body, w.countWrites) + w.collectRunResults(fd.Body) + ast.Inspect(fd.Body, w.checkExitCalls) } - w := &lintRedundantTestMainExit{onFailure: onFailure} - ast.Walk(w, file.AST) return failures } @@ -34,51 +49,136 @@ func (*RedundantTestMainExitRule) Name() string { } type lintRedundantTestMainExit struct { - onFailure func(lint.Failure) + mName string // name of the *testing.M parameter + writes map[string]int // number of writes to each variable + runResults map[string]token.Pos // end of the unconditional statement assigning the result of m.Run to each variable + onFailure func(lint.Failure) } -func (w *lintRedundantTestMainExit) Visit(node ast.Node) ast.Visitor { - if fd, ok := node.(*ast.FuncDecl); ok { - if fd.Name.Name != "TestMain" { - return nil // skip analysis for other functions than TestMain +// countWrites counts every write to a variable: only a variable written exactly once, from m.Run, holds its result. +func (w *lintRedundantTestMainExit) countWrites(node ast.Node) bool { + switch n := node.(type) { + case *ast.AssignStmt: + for _, lhs := range n.Lhs { + w.countWrite(lhs) + } + case *ast.ValueSpec: + if len(n.Values) == 0 { + return true // declaration without a value is not a write } + for _, name := range n.Names { + w.countWrite(name) + } + case *ast.IncDecStmt: + w.countWrite(n.X) + case *ast.UnaryExpr: + if n.Op == token.AND { + w.countWrite(n.X) + } + case *ast.RangeStmt: + w.countWrite(n.Key) + w.countWrite(n.Value) + } - return w + return true +} + +func (w *lintRedundantTestMainExit) countWrite(target ast.Expr) { + id, ok := ast.Unparen(target).(*ast.Ident) + if !ok || id.Name == "_" { + return } - se, ok := node.(*ast.ExprStmt) - if !ok { - return w + w.writes[id.Name]++ +} + +// collectRunResults records variables assigned from m.Run by a top-level statement of the TestMain body, +// i.e. one that is guaranteed to execute before any statement that follows it. +func (w *lintRedundantTestMainExit) collectRunResults(body *ast.BlockStmt) { + for _, stmt := range body.List { + var name *ast.Ident + var value ast.Expr + switch s := stmt.(type) { + case *ast.AssignStmt: + if len(s.Lhs) != 1 || len(s.Rhs) != 1 || (s.Tok != token.ASSIGN && s.Tok != token.DEFINE) { + continue + } + name, _ = ast.Unparen(s.Lhs[0]).(*ast.Ident) + value = s.Rhs[0] + case *ast.DeclStmt: + gd, ok := s.Decl.(*ast.GenDecl) + if !ok || len(gd.Specs) != 1 { + continue + } + vs, ok := gd.Specs[0].(*ast.ValueSpec) + if !ok || len(vs.Names) != 1 || len(vs.Values) != 1 { + continue + } + name = vs.Names[0] + value = vs.Values[0] + default: + continue + } + + if name != nil && w.isRunCall(value) { + w.runResults[name.Name] = stmt.End() + } } - ce, ok := se.X.(*ast.CallExpr) +} + +// checkExitCalls reports [os.Exit] and [syscall.Exit] calls whose argument is the result of m.Run. +func (w *lintRedundantTestMainExit) checkExitCalls(node ast.Node) bool { + ce, ok := node.(*ast.CallExpr) if !ok { - return w + return true } - fc, ok := ce.Fun.(*ast.SelectorExpr) - if !ok { - return w + var pkg string + switch { + case astutils.IsPkgDotName(ce.Fun, "os", "Exit"): + pkg = "os" + case astutils.IsPkgDotName(ce.Fun, "syscall", "Exit"): + pkg = "syscall" + default: + return true } - id, ok := fc.X.(*ast.Ident) + + if len(ce.Args) != 1 || !w.isRunResult(ce.Args[0]) { + return true + } + + w.onFailure(lint.Failure{ + Confidence: 1, + Node: ce, + Category: lint.FailureCategoryStyle, + Failure: fmt.Sprintf("redundant call to %s.Exit in TestMain function, the test runner will handle it automatically as of Go 1.15", pkg), + }) + + return true +} + +// isRunResult returns true if expr is a call to m.Run or a variable whose only write, before expr, is the result of m.Run. +func (w *lintRedundantTestMainExit) isRunResult(expr ast.Expr) bool { + expr = ast.Unparen(expr) + id, ok := expr.(*ast.Ident) if !ok { - return w + return w.isRunCall(expr) } - pkg := id.Name - // skip flag calls because they are commonly used in TestMain - if pkg == "flag" { - return w + assignedAt, ok := w.runResults[id.Name] + return ok && w.writes[id.Name] == 1 && assignedAt < expr.Pos() +} + +func (w *lintRedundantTestMainExit) isRunCall(expr ast.Expr) bool { + ce, ok := ast.Unparen(expr).(*ast.CallExpr) + if !ok { + return false } - fn := fc.Sel.Name - if isCallToExitFunction(pkg, fn, ce.Args) { - w.onFailure(lint.Failure{ - Confidence: 1, - Node: ce, - Category: lint.FailureCategoryStyle, - Failure: fmt.Sprintf("redundant call to %s.%s in TestMain function, the test runner will handle it automatically as of Go 1.15", pkg, fn), - }) + se, ok := ce.Fun.(*ast.SelectorExpr) + if !ok || se.Sel.Name != "Run" { + return false } - return w + return astutils.IsIdent(ast.Unparen(se.X), w.mName) } diff --git a/vendor/github.com/mgechev/revive/rule/string_format.go b/vendor/github.com/mgechev/revive/rule/string_format.go index 0cf05e37..92ade87c 100644 --- a/vendor/github.com/mgechev/revive/rule/string_format.go +++ b/vendor/github.com/mgechev/revive/rule/string_format.go @@ -42,6 +42,8 @@ func (*StringFormatRule) Name() string { return "string-format" } +var _ lint.ConfigurableRule = (*StringFormatRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. @@ -304,6 +306,7 @@ func (r *stringFormatSubrule) generateFailure(node ast.Node) { } r.onFailure(lint.Failure{ + Category: lint.FailureCategoryContent, Confidence: 1, Failure: failure, Node: node, diff --git a/vendor/github.com/mgechev/revive/rule/string_of_int.go b/vendor/github.com/mgechev/revive/rule/string_of_int.go index 839d0dfd..658af996 100644 --- a/vendor/github.com/mgechev/revive/rule/string_of_int.go +++ b/vendor/github.com/mgechev/revive/rule/string_of_int.go @@ -52,6 +52,7 @@ func (w *lintStringInt) Visit(node ast.Node) ast.Visitor { } w.onFailure(lint.Failure{ + Category: lint.FailureCategoryLogic, Confidence: 1, Node: ce, Failure: "dubious conversion of an integer into a string, use strconv.Itoa", diff --git a/vendor/github.com/mgechev/revive/rule/struct_tag.go b/vendor/github.com/mgechev/revive/rule/struct_tag.go index c245f51f..b208e6a1 100644 --- a/vendor/github.com/mgechev/revive/rule/struct_tag.go +++ b/vendor/github.com/mgechev/revive/rule/struct_tag.go @@ -97,6 +97,8 @@ func (checkCtx *checkContext) addCommonOption(opt string) { checkCtx.commonOptions[opt] = true } +var _ lint.ConfigurableRule = (*StructTagRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. @@ -569,7 +571,7 @@ func checkProtobufOptions(checkCtx *checkContext, options []string) (message str seenOptions := map[string]bool{} hasName := false for _, opt := range options { - opt := strings.Split(opt, "=")[0] + opt, _, _ := strings.Cut(opt, "=") if number, err := strconv.Atoi(opt); err == nil { _, alreadySeen := checkCtx.usedTagNbr[number] @@ -796,6 +798,7 @@ func (w lintStructTagRule) addFailureWithTagKey(n ast.Node, msg, tagKey string) func (w lintStructTagRule) addFailuref(n ast.Node, msg string, args ...any) { w.onFailure(lint.Failure{ + Category: lint.FailureCategoryBadPractice, Node: n, Failure: fmt.Sprintf(msg, args...), Confidence: 1, diff --git a/vendor/github.com/mgechev/revive/rule/unchecked_type_assertion.go b/vendor/github.com/mgechev/revive/rule/unchecked_type_assertion.go index 51b3f271..3a5e4ced 100644 --- a/vendor/github.com/mgechev/revive/rule/unchecked_type_assertion.go +++ b/vendor/github.com/mgechev/revive/rule/unchecked_type_assertion.go @@ -19,6 +19,8 @@ type UncheckedTypeAssertionRule struct { acceptIgnoredAssertionResult bool } +var _ lint.ConfigurableRule = (*UncheckedTypeAssertionRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/unconditional_recursion.go b/vendor/github.com/mgechev/revive/rule/unconditional_recursion.go index 738a9e71..64e348b7 100644 --- a/vendor/github.com/mgechev/revive/rule/unconditional_recursion.go +++ b/vendor/github.com/mgechev/revive/rule/unconditional_recursion.go @@ -193,7 +193,7 @@ func (*lintUnconditionalRecursionRule) hasControlExit(node ast.Node) bool { functionName := se.Sel.Name pkgName := id.Name - return isCallToExitFunction(pkgName, functionName, n.Args) + return astutils.IsCallToExitFunction(pkgName, functionName, n.Args) } return false diff --git a/vendor/github.com/mgechev/revive/rule/unexported_return.go b/vendor/github.com/mgechev/revive/rule/unexported_return.go index dc567eee..f57d81e2 100644 --- a/vendor/github.com/mgechev/revive/rule/unexported_return.go +++ b/vendor/github.com/mgechev/revive/rule/unexported_return.go @@ -80,27 +80,9 @@ func (*UnexportedReturnRule) Name() string { func exportedType(typ types.Type) bool { switch t := typ.(type) { case *types.Alias: - obj := t.Obj() - switch { - // Builtin types have no package. - case obj.Pkg() == nil: - case obj.Exported(): - default: - _, ok := t.Underlying().(*types.Interface) - return ok - } - return true + return exportedTypeName(t.Obj()) case *types.Named: - obj := t.Obj() - switch { - // Builtin types have no package. - case obj.Pkg() == nil: - case obj.Exported(): - default: - _, ok := t.Underlying().(*types.Interface) - return ok - } - return true + return exportedTypeName(t.Obj()) case *types.Map: return exportedType(t.Key()) && exportedType(t.Elem()) case interface { @@ -108,6 +90,11 @@ func exportedType(typ types.Type) bool { }: // array, slice, pointer, chan return exportedType(t.Elem()) } - // Be conservative about other types, such as struct, interface, etc. + // Be conservative about other unnamed types, such as struct, interface, etc. return true } + +func exportedTypeName(obj *types.TypeName) bool { + // Builtin types have no package. + return obj.Pkg() == nil || obj.Exported() +} diff --git a/vendor/github.com/mgechev/revive/rule/unhandled_error.go b/vendor/github.com/mgechev/revive/rule/unhandled_error.go index 9dd8e7f2..9460d95a 100644 --- a/vendor/github.com/mgechev/revive/rule/unhandled_error.go +++ b/vendor/github.com/mgechev/revive/rule/unhandled_error.go @@ -17,6 +17,8 @@ type UnhandledErrorRule struct { ignoreList []*regexp.Regexp } +var _ lint.ConfigurableRule = (*UnhandledErrorRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. @@ -112,6 +114,10 @@ func (w *lintUnhandledErrors) addFailure(n *ast.CallExpr) { return } + if w.isSafeFprintfToBuffer(n) { + return + } + w.onFailure(lint.Failure{ Category: lint.FailureCategoryBadPractice, Confidence: 1, @@ -173,3 +179,21 @@ func (w *lintUnhandledErrors) getFunc(call *ast.CallExpr) (*types.Func, bool) { return fn, true } + +func (w *lintUnhandledErrors) isSafeFprintfToBuffer(call *ast.CallExpr) bool { + if len(call.Args) == 0 { + return false + } + + fn, ok := w.getFunc(call) + if !ok || fn.FullName() != "fmt.Fprintf" { + return false + } + + argType := w.pkg.TypeOf(call.Args[0]) + if argType == nil { + return false + } + + return astutils.IsPointerToPkgDotType(argType, "bytes", "Buffer") || astutils.IsPointerToPkgDotType(argType, "strings", "Builder") +} diff --git a/vendor/github.com/mgechev/revive/rule/unsecure_url_scheme.go b/vendor/github.com/mgechev/revive/rule/unsecure_url_scheme.go index 1aa095b4..8cce1573 100644 --- a/vendor/github.com/mgechev/revive/rule/unsecure_url_scheme.go +++ b/vendor/github.com/mgechev/revive/rule/unsecure_url_scheme.go @@ -82,6 +82,7 @@ func (w lintUnsecureURLSchemeRule) Visit(node ast.Node) ast.Visitor { } w.onFailure(lint.Failure{ + Category: lint.FailureCategoryBadPractice, Confidence: 1, Failure: fmt.Sprintf("prefer secure protocol %s over %s in %s", scheme+"s", scheme, n.Value), Node: n, diff --git a/vendor/github.com/mgechev/revive/rule/unused_param.go b/vendor/github.com/mgechev/revive/rule/unused_param.go index cd1ab66f..4eed37c4 100644 --- a/vendor/github.com/mgechev/revive/rule/unused_param.go +++ b/vendor/github.com/mgechev/revive/rule/unused_param.go @@ -18,6 +18,8 @@ type UnusedParamRule struct { failureMsg string } +var _ lint.ConfigurableRule = (*UnusedParamRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/unused_receiver.go b/vendor/github.com/mgechev/revive/rule/unused_receiver.go index 64118d02..645a3316 100644 --- a/vendor/github.com/mgechev/revive/rule/unused_receiver.go +++ b/vendor/github.com/mgechev/revive/rule/unused_receiver.go @@ -16,6 +16,8 @@ type UnusedReceiverRule struct { failureMsg string } +var _ lint.ConfigurableRule = (*UnusedReceiverRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. diff --git a/vendor/github.com/mgechev/revive/rule/use_any.go b/vendor/github.com/mgechev/revive/rule/use_any.go index 0ebb4d62..a8857901 100644 --- a/vendor/github.com/mgechev/revive/rule/use_any.go +++ b/vendor/github.com/mgechev/revive/rule/use_any.go @@ -11,6 +11,10 @@ type UseAnyRule struct{} // Apply applies the rule to given file. func (*UseAnyRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure { + if !file.Pkg.IsAtLeastGoVersion(lint.Go118) { + return nil // nothing to do, the alias any was added in version 1.18 + } + var failures []lint.Failure walker := lintUseAny{ diff --git a/vendor/github.com/mgechev/revive/rule/use_errors_new.go b/vendor/github.com/mgechev/revive/rule/use_errors_new.go index 5473bc7e..97ff1419 100644 --- a/vendor/github.com/mgechev/revive/rule/use_errors_new.go +++ b/vendor/github.com/mgechev/revive/rule/use_errors_new.go @@ -12,6 +12,11 @@ type UseErrorsNewRule struct{} // Apply applies the rule to given file. func (*UseErrorsNewRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure { + if file.Pkg.IsAtLeastGoVersion(lint.Go126) { + // For unformatted strings in Go 1.26, fmt.Errorf matches the behavior of errors.New, so we can skip the analysis. + return nil + } + var failures []lint.Failure walker := lintFmtErrorf{ diff --git a/vendor/github.com/mgechev/revive/rule/use_fmt_print.go b/vendor/github.com/mgechev/revive/rule/use_fmt_print.go index 3da85ff7..dd36adc2 100644 --- a/vendor/github.com/mgechev/revive/rule/use_fmt_print.go +++ b/vendor/github.com/mgechev/revive/rule/use_fmt_print.go @@ -47,7 +47,7 @@ func (w lintUseFmtPrint) Visit(node ast.Node) ast.Visitor { return w // nothing to do, the node is not a call } - id, ok := (ce.Fun).(*ast.Ident) + id, ok := ce.Fun.(*ast.Ident) if !ok { return nil } diff --git a/vendor/github.com/mgechev/revive/rule/use_slices_concat.go b/vendor/github.com/mgechev/revive/rule/use_slices_concat.go new file mode 100644 index 00000000..8650632b --- /dev/null +++ b/vendor/github.com/mgechev/revive/rule/use_slices_concat.go @@ -0,0 +1,231 @@ +package rule + +import ( + "go/ast" + "go/token" + + "github.com/mgechev/revive/internal/astutils" + "github.com/mgechev/revive/lint" +) + +// UseSlicesConcatRule spots appends to an empty slice that can be replaced by a call to [slices.Concat]. +type UseSlicesConcatRule struct{} + +// Apply applies the rule to given file. +func (*UseSlicesConcatRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure { + if !file.Pkg.IsAtLeastGoVersion(lint.Go122) { + return nil + } + + var failures []lint.Failure + + walker := lintUseSlicesConcat{ + onFailure: func(failure lint.Failure) { + failures = append(failures, failure) + }, + } + + ast.Walk(walker, file.AST) + + return failures +} + +// Name returns the rule name. +func (*UseSlicesConcatRule) Name() string { + return "use-slices-concat" +} + +type lintUseSlicesConcat struct { + onFailure func(lint.Failure) +} + +func (w lintUseSlicesConcat) Visit(n ast.Node) ast.Visitor { + switch n := n.(type) { + case *ast.BlockStmt: + w.checkConsecutiveAppends(n.List) + case *ast.CaseClause: + w.checkConsecutiveAppends(n.Body) + case *ast.CommClause: + w.checkConsecutiveAppends(n.Body) + case *ast.CallExpr: + appended := appendedSlices(n) + if len(appended) > 1 && allSideEffectFree(appended[1:]) { + w.addFailure(n, "replace nested appends by a call to slices.Concat") + // only walk the appended slices, to not report the nested appends again + for _, slice := range appended { + ast.Walk(w, slice) + } + + return nil + } + } + + return w +} + +// checkConsecutiveAppends spots the +// +// s := append([]T{}, s1...) +// s = append(s, s2...) +// +// idiom that can be replaced by a call to [slices.Concat]. +func (w lintUseSlicesConcat) checkConsecutiveAppends(stmts []ast.Stmt) { + for i := 0; i+1 < len(stmts); i++ { + name, ok := appendToEmptySliceTarget(stmts[i]) + if !ok { + continue + } + + if appendsToTarget(stmts[i+1], name) { + w.addFailure(stmts[i], "replace consecutive appends by a call to slices.Concat") + } + } +} + +func (w lintUseSlicesConcat) addFailure(node ast.Node, msg string) { + w.onFailure(lint.Failure{ + Category: lint.FailureCategoryMaintenance, + Node: node, + Confidence: 0.8, + Failure: msg, + }) +} + +// appendToEmptySliceTarget returns the name of the variable defined by a +// s := append([]T{}, s1...) statement, if the statement is of that form. +func appendToEmptySliceTarget(stmt ast.Stmt) (name string, ok bool) { + assign, ok := stmt.(*ast.AssignStmt) + if !ok || assign.Tok != token.DEFINE || len(assign.Lhs) != 1 || len(assign.Rhs) != 1 { + return "", false + } + + target, ok := assign.Lhs[0].(*ast.Ident) + if !ok || target.Name == "_" { + return "", false + } + + // more than one nested append is already reported as nested appends + if len(appendedSlices(assign.Rhs[0])) != 1 { + return "", false + } + + return target.Name, true +} + +// appendsToTarget returns true if the statement is of the form target = append(target, s...), false otherwise. +func appendsToTarget(stmt ast.Stmt, target string) bool { + assign, ok := stmt.(*ast.AssignStmt) + if !ok || assign.Tok != token.ASSIGN || len(assign.Lhs) != 1 || len(assign.Rhs) != 1 { + return false + } + + if !astutils.IsIdent(assign.Lhs[0], target) { + return false + } + + call, ok := assign.Rhs[0].(*ast.CallExpr) + if !ok || !isVariadicAppend(call) || !astutils.IsIdent(call.Args[0], target) { + return false + } + + // target = append(target, f(target)...) can not be replaced by a call to slices.Concat + // because the target is not defined yet in the replacement + return !usesIdent(call.Args[1], target) && isSideEffectFree(call.Args[1]) +} + +// allSideEffectFree returns true if none of the given expressions can have side effects, false otherwise. +func allSideEffectFree(exprs []ast.Expr) bool { + for _, expr := range exprs { + if !isSideEffectFree(expr) { + return false + } + } + + return true +} + +// isSideEffectFree returns true if evaluating the given expression can not modify the program state, false otherwise. +// Appends are merged into a single call to [slices.Concat] that copies the slices only once all of them are evaluated, +// thus an appended slice that can mutate the previously appended ones must not be reported. +func isSideEffectFree(expr ast.Expr) bool { + switch expr := expr.(type) { + case *ast.Ident, *ast.BasicLit: + return true + case *ast.ParenExpr: + return isSideEffectFree(expr.X) + case *ast.StarExpr: + return isSideEffectFree(expr.X) + case *ast.SelectorExpr: + return isSideEffectFree(expr.X) + case *ast.IndexExpr: + return isSideEffectFree(expr.X) && isSideEffectFree(expr.Index) + case *ast.SliceExpr: + return isSideEffectFree(expr.X) && + (expr.Low == nil || isSideEffectFree(expr.Low)) && + (expr.High == nil || isSideEffectFree(expr.High)) && + (expr.Max == nil || isSideEffectFree(expr.Max)) + case *ast.CallExpr: + // only a conversion to a slice type, e.g. []byte("a string"), is not a call to a function + _, isSliceConversion := expr.Fun.(*ast.ArrayType) + + return isSliceConversion && len(expr.Args) == 1 && isSideEffectFree(expr.Args[0]) + default: + return false + } +} + +// usesIdent returns true if the identifier name occurs in the given expression, false otherwise. +func usesIdent(expr ast.Expr, name string) bool { + idents := astutils.PickNodes(expr, func(n ast.Node) bool { + ident, ok := n.(*ast.Ident) + + return ok && ident.Name == name + }) + + return len(idents) > 0 +} + +// appendedSlices returns the slices spread by nested calls to append into an empty slice literal, +// e.g. it returns [s1, s2] for append(append([]T{}, s1...), s2...). +// It returns nil if the expression is not of that form. +func appendedSlices(expr ast.Expr) []ast.Expr { + call, ok := expr.(*ast.CallExpr) + if !ok || !isVariadicAppend(call) { + return nil + } + + if isEmptySliceLiteral(call.Args[0]) { + return []ast.Expr{call.Args[1]} + } + + nested := appendedSlices(call.Args[0]) + if nested == nil { + return nil + } + + return append(nested, call.Args[1]) +} + +// isVariadicAppend returns true if the call is of the form append(s1, s2...), false otherwise. +// Appends of a string literal to a byte slice, e.g. append(b, "str"...), are excluded because [slices.Concat] +// does not accept a string. Strings given by a variable or by a call are not excluded: telling them from a +// slice requires type information. +func isVariadicAppend(call *ast.CallExpr) bool { + if !astutils.IsIdent(call.Fun, "append") || !call.Ellipsis.IsValid() || len(call.Args) != 2 { + return false + } + + return !astutils.IsStringLiteral(call.Args[1]) +} + +// isEmptySliceLiteral returns true if the expression is an empty slice literal, e.g. []T{}, false otherwise. +func isEmptySliceLiteral(expr ast.Expr) bool { + lit, ok := expr.(*ast.CompositeLit) + if !ok || len(lit.Elts) != 0 { + return false + } + + sliceType, ok := lit.Type.(*ast.ArrayType) + + return ok && sliceType.Len == nil +} diff --git a/vendor/github.com/mgechev/revive/rule/use_waitgroup_go.go b/vendor/github.com/mgechev/revive/rule/use_waitgroup_go.go index 6f04fd65..47afc538 100644 --- a/vendor/github.com/mgechev/revive/rule/use_waitgroup_go.go +++ b/vendor/github.com/mgechev/revive/rule/use_waitgroup_go.go @@ -98,15 +98,9 @@ func (w *lintUseWaitGroupGo) analyzeBlock(b *ast.BlockStmt) { // we will iterate from the (i+1)-th statement up to the last statement of block.List for i++; i < len(stmts); i++ { stmt := stmts[i] - // looking for a go statement - goStmt, ok := stmt.(*ast.GoStmt) - if !ok { - continue // not a go statement - } - - // here we found a the go statement - // now let's check is the go statement is applied to a function literal that contains a wg.Done - if !w.hasCallToWgDone(goStmt) { + // looking for a go statement (directly or inside a for/range loop) + goStmt := w.findGoStmtWithWgDone(stmt) + if goStmt == nil { continue } @@ -122,6 +116,38 @@ func (w *lintUseWaitGroupGo) analyzeBlock(b *ast.BlockStmt) { } } +// findGoStmtWithWgDone returns the first go statement with wg.Done found in stmt, +// searching directly and one level deep inside for/range loop bodies. +// Returns nil if no such go statement is found. +func (w *lintUseWaitGroupGo) findGoStmtWithWgDone(stmt ast.Stmt) *ast.GoStmt { + switch s := stmt.(type) { + case *ast.GoStmt: + if w.hasCallToWgDone(s) { + return s + } + case *ast.ForStmt: + return w.seekGoStmtWithWgDoneInBlock(s.Body) + case *ast.RangeStmt: + return w.seekGoStmtWithWgDoneInBlock(s.Body) + } + return nil +} + +// seekGoStmtWithWgDoneInBlock returns the first go statement with wg.Done +// found as a direct child of block, or nil if none is found. +func (w *lintUseWaitGroupGo) seekGoStmtWithWgDoneInBlock(block *ast.BlockStmt) *ast.GoStmt { + if block == nil { + return nil + } + for _, s := range block.List { + goStmt, ok := s.(*ast.GoStmt) + if ok && w.hasCallToWgDone(goStmt) { + return goStmt + } + } + return nil +} + // hasCallToWgDone returns true if the given go statement // calls to a function literal containing a call to wg.Done, false otherwise. func (*lintUseWaitGroupGo) hasCallToWgDone(goStmt *ast.GoStmt) bool { diff --git a/vendor/github.com/mgechev/revive/rule/useless_break.go b/vendor/github.com/mgechev/revive/rule/useless_break.go index b99cc81e..a4f4a09b 100644 --- a/vendor/github.com/mgechev/revive/rule/useless_break.go +++ b/vendor/github.com/mgechev/revive/rule/useless_break.go @@ -73,6 +73,7 @@ func (w *lintUselessBreak) inspectCaseStatement(body []ast.Stmt) { } w.onFailure(lint.Failure{ + Category: lint.FailureCategoryStyle, Confidence: 1, Node: s, Failure: msg, diff --git a/vendor/github.com/mgechev/revive/rule/utils.go b/vendor/github.com/mgechev/revive/rule/utils.go index 8d653227..f90b1c5c 100644 --- a/vendor/github.com/mgechev/revive/rule/utils.go +++ b/vendor/github.com/mgechev/revive/rule/utils.go @@ -1,43 +1,14 @@ package rule import ( - "go/ast" "go/token" "regexp" "strings" - "github.com/mgechev/revive/internal/astutils" + "github.com/mgechev/revive/internal/config" "github.com/mgechev/revive/lint" ) -// exitFuncChecker is a function type that checks whether a function call is an exit function. -type exitFuncChecker func(args []ast.Expr) bool - -var alwaysTrue exitFuncChecker = func([]ast.Expr) bool { return true } - -// exitFunctions is a map of std packages and functions that are considered as exit functions. -var exitFunctions = map[string]map[string]exitFuncChecker{ - "os": {"Exit": alwaysTrue}, - "syscall": {"Exit": alwaysTrue}, - "log": { - "Fatal": alwaysTrue, - "Fatalf": alwaysTrue, - "Fatalln": alwaysTrue, - "Panic": alwaysTrue, - "Panicf": alwaysTrue, - "Panicln": alwaysTrue, - }, - "flag": { - "Parse": func([]ast.Expr) bool { return true }, - "NewFlagSet": func(args []ast.Expr) bool { - if len(args) != 2 { - return false - } - return astutils.IsPkgDotName(args[1], "flag", "ExitOnError") - }, - }, -} - func srcLine(src []byte, p token.Position) string { // Run to end of line in both directions if not at line start/end. lo, hi := p.Offset, p.Offset+1 @@ -52,14 +23,7 @@ func srcLine(src []byte, p token.Position) string { // isRuleOption returns true if arg and name are the same after normalization. func isRuleOption(arg, name string) bool { - return normalizeRuleOption(arg) == normalizeRuleOption(name) -} - -// normalizeRuleOption returns an option name from the argument. It is lowercased and without hyphens. -// -// Example: normalizeRuleOption("allowTypesBefore"), normalizeRuleOption("allow-types-before") -> "allowtypesbefore". -func normalizeRuleOption(arg string) string { - return strings.ToLower(strings.ReplaceAll(arg, "-", "")) + return config.NormalizeOption(arg) == config.NormalizeOption(name) } var normalizePathReplacer = strings.NewReplacer("-", "", "_", "", ".", "") @@ -92,21 +56,6 @@ func isDirectiveComment(line string) bool { return directiveCommentRE.MatchString(line) } -// isCallToExitFunction checks if the function call is a call to an exit function. -func isCallToExitFunction(pkgName, functionName string, callArgs []ast.Expr) bool { - m, ok := exitFunctions[pkgName] - if !ok { - return false - } - - check, ok := m[functionName] - if !ok { - return false - } - - return check(callArgs) -} - // newInternalFailureError returns a slice of Failure with a single internal failure in it. func newInternalFailureError(e error) []lint.Failure { return []lint.Failure{lint.NewInternalFailure(e.Error())} diff --git a/vendor/github.com/mgechev/revive/rule/var_naming.go b/vendor/github.com/mgechev/revive/rule/var_naming.go index 1c0b949f..93053973 100644 --- a/vendor/github.com/mgechev/revive/rule/var_naming.go +++ b/vendor/github.com/mgechev/revive/rule/var_naming.go @@ -26,6 +26,8 @@ type VarNamingRule struct { skipInitialismNameChecks bool // if true - disable enforcing capitals for common initialisms } +var _ lint.ConfigurableRule = (*VarNamingRule)(nil) + // Configure validates the rule configuration, and configures the rule accordingly. // // Configuration implements the [lint.ConfigurableRule] interface. @@ -148,12 +150,12 @@ func (w *lintNames) check(id *ast.Ident, thing string) { // #851 upperCaseConst support // if it's const - if thing == token.CONST.String() && w.upperCaseConst && isUpperCaseConst(id.Name) { + if thing == token.CONST.String() && w.upperCaseConst && rule.IsUpperCaseConst(id.Name) { return } // Handle two common styles from other languages that don't belong in Go. - if isUpperUnderscore(id.Name) { + if rule.IsUpperUnderscore(id.Name) { w.onFailure(lint.Failure{ Failure: "don't use ALL_CAPS in Go names; use CamelCase", Confidence: 0.8, @@ -267,87 +269,6 @@ func (w *lintNames) Visit(n ast.Node) ast.Visitor { return w } -// isUpperCaseConst checks if a string is in constant name format like `SOME_CONST`, `SOME_CONST_2`, -// `X123_3`, `_SOME_PRIVATE_CONST`. -// See #851, #865. -func isUpperCaseConst(s string) bool { - if s == "" { - return false - } - r := []rune(s) - c := r[0] - if len(r) == 1 { - return isUpper(c) - } - if c != '_' && !isUpper(c) { // Must start with an uppercase letter or underscore - return false - } - for i, c := range r { - switch { - case isUpperOrDigit(c): - continue - case c == '_': - // Underscore must be followed by at least one uppercase letter or digit - if i+1 >= len(s) || !isUpperOrDigit(r[i+1]) { - return false - } - - default: - return false - } - } - return true -} - -// hasUpperCaseLetter checks if a string contains at least one upper case letter. -func hasUpperCaseLetter(s string) bool { - for _, r := range s { - if isUpper(r) { - return true - } - } - return false -} - -// isUpperOrDigit checks if a rune is an uppercase letter or digit. -func isUpperOrDigit(r rune) bool { - return isUpper(r) || isDigit(r) -} - -// isDigit checks if rune is a simple digit. -// -// We don't use [unicode.IsDigit] as it returns true for a large variety of digits that are not 0-9. -func isDigit(r rune) bool { - return r >= '0' && r <= '9' -} - -// isUpper checks if rune is ASCII upper case letter -// -// We restrict to A-Z because [unicode.IsUpper] returns true for a large variety of letters. -func isUpper(r rune) bool { - return r >= 'A' && r <= 'Z' -} - -// isUpperUnderscore detects variable that are made from upper case letters, underscore, or digits. -// -// Short variable names are considered OK. -func isUpperUnderscore(s string) bool { - if !strings.Contains(s, "_") { - return false - } - if len(s) <= 5 { - // avoid false positives - return false - } - for _, r := range s { - if r == '_' || isUpperOrDigit(r) { - continue - } - return false - } - return true -} - func getList(arg any, argName string) ([]string, error) { args, ok := arg.([]any) if !ok { diff --git a/vendor/github.com/mgechev/revive/rule/waitgroup_by_value.go b/vendor/github.com/mgechev/revive/rule/waitgroup_by_value.go index 45eeb9b3..a9fc0bb0 100644 --- a/vendor/github.com/mgechev/revive/rule/waitgroup_by_value.go +++ b/vendor/github.com/mgechev/revive/rule/waitgroup_by_value.go @@ -46,6 +46,7 @@ func (w lintWaitGroupByValueRule) Visit(node ast.Node) ast.Visitor { } w.onFailure(lint.Failure{ + Category: lint.FailureCategoryLogic, Confidence: 1, Node: field, Failure: "sync.WaitGroup passed by value, the function will get a copy of the original one", diff --git a/vendor/github.com/nishanths/exhaustive/Makefile b/vendor/github.com/nishanths/exhaustive/Makefile index 868f7fce..2e4d94d8 100644 --- a/vendor/github.com/nishanths/exhaustive/Makefile +++ b/vendor/github.com/nishanths/exhaustive/Makefile @@ -24,7 +24,6 @@ cover: .PHONY: install-vet install-vet: - go install github.com/nishanths/exhaustive/cmd/exhaustive@latest go install github.com/gordonklaus/ineffassign@latest go install github.com/kisielk/errcheck@latest go install honnef.co/go/tools/cmd/staticcheck@latest @@ -32,7 +31,6 @@ install-vet: .PHONY: vet vet: go vet ./... - exhaustive ./... ineffassign ./... errcheck ./... staticcheck -checks="inherit,-S1034" ./... diff --git a/vendor/github.com/nishanths/exhaustive/README.md b/vendor/github.com/nishanths/exhaustive/README.md index dbb41ab9..19ef6bfc 100644 --- a/vendor/github.com/nishanths/exhaustive/README.md +++ b/vendor/github.com/nishanths/exhaustive/README.md @@ -38,7 +38,7 @@ possible to integrate `exhaustive` with your own analysis driver program. Given an enum: -``` +```go package token // import "example.org/token" type Token int @@ -54,7 +54,7 @@ const ( and code that switches on the enum: -``` +```go package calc import "example.org/token" @@ -78,7 +78,7 @@ calc.go:6:2: missing cases in switch of type token.Token: token.Multiply, token. Specify flag `-check=switch,map` to additionally check exhaustiveness of keys in map literals. For example: -``` +```go var m = map[token.Token]rune{ token.Add: '+', token.Subtract: '-', diff --git a/vendor/github.com/nishanths/exhaustive/comment.go b/vendor/github.com/nishanths/exhaustive/comment.go index 123e0181..e3347d92 100644 --- a/vendor/github.com/nishanths/exhaustive/comment.go +++ b/vendor/github.com/nishanths/exhaustive/comment.go @@ -1,27 +1,77 @@ package exhaustive import ( + "fmt" "go/ast" "go/token" "strings" ) const ( - ignoreComment = "//exhaustive:ignore" - enforceComment = "//exhaustive:enforce" - ignoreDefaultCaseRequiredComment = "//exhaustive:ignore-default-case-required" - enforceDefaultCaseRequiredComment = "//exhaustive:enforce-default-case-required" + exhaustiveComment = "//exhaustive:" + ignoreComment = "ignore" + enforceComment = "enforce" + ignoreDefaultCaseRequiredComment = "ignore-default-case-required" + enforceDefaultCaseRequiredComment = "enforce-default-case-required" ) -func hasCommentPrefix(comments []*ast.CommentGroup, comment string) bool { - for _, c := range comments { - for _, cc := range c.List { - if strings.HasPrefix(cc.Text, comment) { - return true +type directive int64 + +const ( + ignoreDirective = 1 << iota + enforceDirective + ignoreDefaultCaseRequiredDirective + enforceDefaultCaseRequiredDirective +) + +type directiveSet int64 + +func parseDirectives(commentGroups []*ast.CommentGroup) (directiveSet, error) { + var out directiveSet + for _, commentGroup := range commentGroups { + if commentGroup == nil { + continue + } + for _, comment := range commentGroup.List { + commentLine := comment.Text + if !strings.HasPrefix(commentLine, exhaustiveComment) { + continue + } + directive := commentLine[len(exhaustiveComment):] + if whiteSpaceIndex := strings.IndexAny(directive, " \t"); whiteSpaceIndex != -1 { + directive = directive[:whiteSpaceIndex] + } + switch directive { + case ignoreComment: + out |= ignoreDirective + case enforceComment: + out |= enforceDirective + case ignoreDefaultCaseRequiredComment: + out |= ignoreDefaultCaseRequiredDirective + case enforceDefaultCaseRequiredComment: + out |= enforceDefaultCaseRequiredDirective + default: + return out, fmt.Errorf("invalid directive %q", directive) } } } - return false + return out, out.validate() +} + +func (d directiveSet) has(directive directive) bool { + return int64(d)&int64(directive) != 0 +} + +func (d directiveSet) validate() error { + enforceConflict := ignoreDirective | enforceDirective + if d&(directiveSet(enforceConflict)) == directiveSet(enforceConflict) { + return fmt.Errorf("conflicting directives %q and %q", ignoreComment, enforceComment) + } + defaultCaseRequiredConflict := ignoreDefaultCaseRequiredDirective | enforceDefaultCaseRequiredDirective + if d&(directiveSet(defaultCaseRequiredConflict)) == directiveSet(defaultCaseRequiredConflict) { + return fmt.Errorf("conflicting directives %q and %q", ignoreDefaultCaseRequiredComment, enforceDefaultCaseRequiredComment) + } + return nil } func fileCommentMap(fset *token.FileSet, file *ast.File) ast.CommentMap { diff --git a/vendor/github.com/nishanths/exhaustive/common.go b/vendor/github.com/nishanths/exhaustive/common.go index f22b0e14..bf30ff7e 100644 --- a/vendor/github.com/nishanths/exhaustive/common.go +++ b/vendor/github.com/nishanths/exhaustive/common.go @@ -73,6 +73,9 @@ func fromTypeParam(pass *analysis.Pass, tp *types.TypeParam, typeparam bool) (re func fromType(pass *analysis.Pass, t types.Type, typeparam bool) (result []enumTypeAndMembers, ok bool) { switch t := t.(type) { + case *types.Alias: + return fromType(pass, types.Unalias(t), typeparam) + case *types.Named: return fromNamed(pass, t, typeparam) @@ -223,7 +226,7 @@ func exprConstVal(e ast.Expr, info *types.Info) (constantValue, bool) { } } -// stripTypeConversions removing type conversions from the experession. +// stripTypeConversions removing type conversions from the expression. func stripTypeConversions(e ast.Expr, info *types.Info) ast.Expr { c, ok := e.(*ast.CallExpr) if !ok { diff --git a/vendor/github.com/nishanths/exhaustive/enum.go b/vendor/github.com/nishanths/exhaustive/enum.go index cabf1d88..1960eddb 100644 --- a/vendor/github.com/nishanths/exhaustive/enum.go +++ b/vendor/github.com/nishanths/exhaustive/enum.go @@ -7,6 +7,7 @@ import ( "go/types" "strings" + "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/ast/inspector" ) @@ -63,16 +64,33 @@ func (em *enumMembers) factString() string { return buf.String() } -func findEnums(pkgScopeOnly bool, pkg *types.Package, inspect *inspector.Inspector, info *types.Info) map[enumType]enumMembers { +func findEnums(pass *analysis.Pass, pkgScopeOnly bool, pkg *types.Package, inspect *inspector.Inspector, info *types.Info) map[enumType]enumMembers { result := make(map[enumType]enumMembers) + ignoredTypes := findIgnoredTypes(pass, inspect, info) + inspect.Preorder([]ast.Node{&ast.GenDecl{}}, func(n ast.Node) { gen := n.(*ast.GenDecl) if gen.Tok != token.CONST { return } + + if hasIgnoreDecl(pass, gen.Doc) { + return + } + for _, s := range gen.Specs { - for _, name := range s.(*ast.ValueSpec).Names { + s := s.(*ast.ValueSpec) + if hasIgnoreDecl(pass, s.Doc) { + continue + } + + for _, name := range s.Names { + + if _, ignored := ignoredTypes[info.Defs[name].Type()]; ignored { + continue + } + enumTyp, memberName, val, ok := possibleEnumMember(name, info) if !ok { continue @@ -126,7 +144,7 @@ func possibleEnumMember(constName *ast.Ident, info *types.Info) (et enumType, na return enumType{}, "", "", false } - named := obj.Type().(*types.Named) // guaranteed by validNamedBasic + named := types.Unalias(obj.Type()).(*types.Named) // guaranteed by validNamedBasic tn := named.Obj() // By definition, enum type's scope and enum member's scope must be the @@ -140,6 +158,32 @@ func possibleEnumMember(constName *ast.Ident, info *types.Info) (et enumType, na return enumType{tn}, obj.Name(), determineConstVal(constName, info), true } +func findIgnoredTypes(pass *analysis.Pass, inspect *inspector.Inspector, info *types.Info) map[types.Type]struct{} { + ignoredTypes := map[types.Type]struct{}{} + + inspect.Preorder([]ast.Node{&ast.GenDecl{}}, func(n ast.Node) { + gen := n.(*ast.GenDecl) + if gen.Tok != token.TYPE { + return + } + + doIgnoreDecl := hasIgnoreDecl(pass, gen.Doc) + + for _, s := range gen.Specs { + t := s.(*ast.TypeSpec) + + doIgnoreSpec := doIgnoreDecl || hasIgnoreDecl(pass, t.Doc) + if !doIgnoreSpec { + continue + } + + ignoredTypes[info.Defs[t.Name].Type()] = struct{}{} + } + }) + + return ignoredTypes +} + func determineConstVal(name *ast.Ident, info *types.Info) constantValue { c := info.ObjectOf(name).(*types.Const) return constantValue(c.Val().ExactString()) @@ -157,14 +201,24 @@ func validBasic(basic *types.Basic) bool { return false } +func hasIgnoreDecl(pass *analysis.Pass, doc *ast.CommentGroup) bool { + dirs, err := parseDirectives([]*ast.CommentGroup{doc}) + if err != nil { + pass.Report(makeInvalidDirectiveDiagnostic(doc, err)) + return false + } + return dirs.has(ignoreDirective) +} + // validNamedBasic returns whether the type t is a named type whose underlying // type is a valid basic type to form an enum. A type that passes this check // meets the definition of an enum type. // // The following is guaranteed: // -// validNamedBasic(t) == true => t.(*types.Named) +// validNamedBasic(t) == true => types.Unalias(t).(*types.Named) func validNamedBasic(t types.Type) bool { + t = types.Unalias(t) named, ok := t.(*types.Named) if !ok { return false diff --git a/vendor/github.com/nishanths/exhaustive/exhaustive.go b/vendor/github.com/nishanths/exhaustive/exhaustive.go index 013ac47b..470b56d3 100644 --- a/vendor/github.com/nishanths/exhaustive/exhaustive.go +++ b/vendor/github.com/nishanths/exhaustive/exhaustive.go @@ -108,7 +108,7 @@ var Analyzer = &analysis.Analyzer{ func run(pass *analysis.Pass) (interface{}, error) { inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) - for typ, members := range findEnums(fPackageScopeOnly, pass.Pkg, inspect, pass.TypesInfo) { + for typ, members := range findEnums(pass, fPackageScopeOnly, pass.Pkg, inspect, pass.TypesInfo) { exportFact(pass, typ, members) } diff --git a/vendor/github.com/nishanths/exhaustive/map.go b/vendor/github.com/nishanths/exhaustive/map.go index 23b4bef1..4243f322 100644 --- a/vendor/github.com/nishanths/exhaustive/map.go +++ b/vendor/github.com/nishanths/exhaustive/map.go @@ -34,16 +34,18 @@ func mapChecker(pass *analysis.Pass, cfg mapConfig, generated boolCache, comment lit := n.(*ast.CompositeLit) - mapType, ok := pass.TypesInfo.Types[lit.Type].Type.(*types.Map) - if !ok { - namedType, ok2 := pass.TypesInfo.Types[lit.Type].Type.(*types.Named) - if !ok2 { - return true, resultNotMapLiteral - } - mapType, ok = namedType.Underlying().(*types.Map) + var mapType *types.Map + switch tt := types.Unalias(pass.TypesInfo.Types[lit.Type].Type).(type) { + case *types.Map: + mapType = tt + case *types.Named: + var ok bool + mapType, ok = tt.Underlying().(*types.Map) if !ok { return true, resultNotMapLiteral } + default: + return true, resultNotMapLiteral } if len(lit.Elts) == 0 { @@ -77,13 +79,18 @@ func mapChecker(pass *analysis.Pass, cfg mapConfig, generated boolCache, comment } } - if !cfg.explicit && hasCommentPrefix(relatedComments, ignoreComment) { + directives, err := parseDirectives(relatedComments) + if err != nil { + pass.Report(makeInvalidDirectiveDiagnostic(lit, err)) + } + + if !cfg.explicit && directives.has(ignoreDirective) { // Skip checking of this map literal due to ignore // comment. Still return true because there may be nested // map literals that are not to be ignored. return true, resultIgnoreComment } - if cfg.explicit && !hasCommentPrefix(relatedComments, enforceComment) { + if cfg.explicit && !directives.has(enforceDirective) { return true, resultNoEnforceComment } diff --git a/vendor/github.com/nishanths/exhaustive/switch.go b/vendor/github.com/nishanths/exhaustive/switch.go index d235fbec..702dd138 100644 --- a/vendor/github.com/nishanths/exhaustive/switch.go +++ b/vendor/github.com/nishanths/exhaustive/switch.go @@ -5,7 +5,6 @@ import ( "go/ast" "go/types" "regexp" - "strings" "golang.org/x/tools/go/analysis" ) @@ -60,41 +59,6 @@ type switchConfig struct { ignoreType *regexp.Regexp // can be nil } -// There are few possibilities, and often none, so we use a possibly-nil slice -func userDirectives(comments []*ast.CommentGroup) []string { - var directives []string - for _, c := range comments { - for _, cc := range c.List { - // The order matters here: we always want to check the longest first. - for _, d := range []string{ - enforceDefaultCaseRequiredComment, - ignoreDefaultCaseRequiredComment, - enforceComment, - ignoreComment, - } { - if strings.HasPrefix(cc.Text, d) { - directives = append(directives, d) - // The break here is important: once we associate a comment - // with a particular (longest-possible) directive, we don't want - // to map to another! - break - } - } - } - } - return directives -} - -// Can be replaced with slices.Contains with go1.21 -func directivesIncludes(directives []string, d string) bool { - for _, ud := range directives { - if ud == d { - return true - } - } - return false -} - // switchChecker returns a node visitor that checks exhaustiveness of // enum switch statements for the supplied pass, and reports // diagnostics. The node visitor expects only *ast.SwitchStmt nodes. @@ -118,30 +82,34 @@ func switchChecker(pass *analysis.Pass, cfg switchConfig, generated boolCache, c sw := n.(*ast.SwitchStmt) switchComments := comments.get(pass.Fset, file)[sw] - uDirectives := userDirectives(switchComments) - if !cfg.explicit && directivesIncludes(uDirectives, ignoreComment) { + uDirectives, err := parseDirectives(switchComments) + if err != nil { + pass.Report(makeInvalidDirectiveDiagnostic(sw, err)) + } + + if !cfg.explicit && uDirectives.has(ignoreDirective) { // Skip checking of this switch statement due to ignore // comment. Still return true because there may be nested // switch statements that are not to be ignored. return true, resultIgnoreComment } - if cfg.explicit && !directivesIncludes(uDirectives, enforceComment) { + if cfg.explicit && !uDirectives.has(enforceDirective) { // Skip checking of this switch statement due to missing // enforce comment. return true, resultNoEnforceComment } requireDefaultCase := cfg.defaultCaseRequired - if directivesIncludes(uDirectives, ignoreDefaultCaseRequiredComment) { + if uDirectives.has(ignoreDefaultCaseRequiredDirective) { requireDefaultCase = false } - if directivesIncludes(uDirectives, enforceDefaultCaseRequiredComment) { + if uDirectives.has(enforceDefaultCaseRequiredDirective) { // We have "if" instead of "else if" here in case of conflicting ignore/enforce directives. // In that case, because this is second, we will default to enforcing. requireDefaultCase = true } if sw.Tag == nil { - return true, resultNoSwitchTag // never possible for valid Go program? + return true, resultNoSwitchTag } t := pass.TypesInfo.Types[sw.Tag] @@ -169,6 +137,7 @@ func switchChecker(pass *analysis.Pass, cfg switchConfig, generated boolCache, c // to have a default case. We check this first to avoid // early-outs pass.Report(makeMissingDefaultDiagnostic(sw, dedupEnumTypes(toEnumTypes(es)))) + return true, resultMissingDefaultCase } if len(checkl.remaining()) == 0 { @@ -234,3 +203,14 @@ func makeMissingDefaultDiagnostic(sw *ast.SwitchStmt, enumTypes []enumType) anal ), } } + +func makeInvalidDirectiveDiagnostic(node ast.Node, err error) analysis.Diagnostic { + return analysis.Diagnostic{ + Pos: node.Pos(), + End: node.End(), + Message: fmt.Sprintf( + "failed to parse directives: %s", + err, + ), + } +} diff --git a/vendor/github.com/securego/gosec/v2/action.yml b/vendor/github.com/securego/gosec/v2/action.yml index 62848c71..ed365102 100644 --- a/vendor/github.com/securego/gosec/v2/action.yml +++ b/vendor/github.com/securego/gosec/v2/action.yml @@ -10,7 +10,7 @@ inputs: runs: using: "docker" - image: "docker://ghcr.io/securego/gosec@sha256:d0859f242774504d57b17442b2dc77d4ffd2f4d30fbdf92c7eb612b2a394f477" # 2.27.1 + image: "docker://ghcr.io/securego/gosec@sha256:4342ad119a7c69f3f4e4ce78d81ba183dc774a70a7a4c6eeb15fe9e511f214f0" # 2.28.0 args: - ${{ inputs.args }} diff --git a/vendor/github.com/securego/gosec/v2/analyzers/pathtraversal.go b/vendor/github.com/securego/gosec/v2/analyzers/pathtraversal.go index ba9b72e8..1077b423 100644 --- a/vendor/github.com/securego/gosec/v2/analyzers/pathtraversal.go +++ b/vendor/github.com/securego/gosec/v2/analyzers/pathtraversal.go @@ -66,22 +66,25 @@ func PathTraversal() taint.Config { {Package: "net/http", Method: "ServeFileFS", CheckArgs: []int{3}}, }, Sanitizers: []taint.Sanitizer{ - // filepath.Clean normalizes and removes traversal components - {Package: "path/filepath", Method: "Clean"}, - // filepath.Abs calls Clean internally (per Go docs) - {Package: "path/filepath", Method: "Abs"}, // filepath.Base extracts just the filename, removing directory traversal {Package: "path/filepath", Method: "Base"}, // filepath.Rel computes a relative path safely {Package: "path/filepath", Method: "Rel"}, - // url.PathEscape escapes path components - {Package: "net/url", Method: "PathEscape"}, - // path.Base and path.Clean provide identical traversal-stripping - // semantics as their filepath counterparts (the only difference is - // separator handling, which is irrelevant for security). + // path.Base provides identical traversal-stripping semantics as its + // filepath counterpart (the only difference is separator handling, + // which is irrelevant for security). {Package: "path", Method: "Base"}, - {Package: "path", Method: "Clean"}, + + // NOTE: Clean/filepath.Clean, filepath.Abs and url.PathEscape are + // deliberately NOT sanitizers. Clean only lexically normalizes a + // path: it evaluates ".." elements instead of rejecting them, so + // Clean("/prefix/../../etc/passwd") yields "/etc/passwd" — the + // traversal succeeds. filepath.Abs calls Clean internally and + // inherits the same behavior, and url.PathUnescape reverses + // url.PathEscape, restoring any ".." that was escaped. Confining a + // path to a directory requires os.Root or an explicit prefix check, + // not Clean. See https://github.com/securego/gosec/issues/1721. // Integer conversions eliminate path traversal vectors entirely — // the result can never contain "/" or ".." characters. diff --git a/vendor/github.com/securego/gosec/v2/analyzers/util.go b/vendor/github.com/securego/gosec/v2/analyzers/util.go index 3d346465..93e48dc1 100644 --- a/vendor/github.com/securego/gosec/v2/analyzers/util.go +++ b/vendor/github.com/securego/gosec/v2/analyzers/util.go @@ -223,11 +223,11 @@ func newIssue(analyzerID string, desc string, fileSet *token.FileSet, func issueCodeSnippet(fileSet *token.FileSet, pos token.Pos) string { file := fileSet.File(pos) - start := (int64)(file.Line(pos)) + start := int64(file.Line(pos)) if start-issue.SnippetOffset > 0 { start = start - issue.SnippetOffset } - end := (int64)(file.Line(pos)) + end := int64(file.Line(pos)) end = end + issue.SnippetOffset var code string diff --git a/vendor/github.com/securego/gosec/v2/config.go b/vendor/github.com/securego/gosec/v2/config.go index 954daaba..743822b2 100644 --- a/vendor/github.com/securego/gosec/v2/config.go +++ b/vendor/github.com/securego/gosec/v2/config.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "io" + "strings" ) const ( @@ -45,8 +46,10 @@ const ( ) // NoSecTag returns the tag used to disable gosec for a line of code. +// A single leading '#' is tolerated, so that both "dontanalyze" and +// "#dontanalyze" produce the same "#dontanalyze" tag. func NoSecTag(tag string) string { - return fmt.Sprintf("%s%s", "#", tag) + return fmt.Sprintf("%s%s", "#", strings.TrimPrefix(tag, "#")) } // Config is used to provide configuration and customization to each of the rules. diff --git a/vendor/github.com/securego/gosec/v2/issue/issue.go b/vendor/github.com/securego/gosec/v2/issue/issue.go index f2cc986d..74d00fb3 100644 --- a/vendor/github.com/securego/gosec/v2/issue/issue.go +++ b/vendor/github.com/securego/gosec/v2/issue/issue.go @@ -209,7 +209,7 @@ func CodeSnippet(file *os.File, start int64, end int64) (string, error) { } func codeSnippetStartLine(node ast.Node, fobj *token.File) int64 { - s := (int64)(fobj.Line(node.Pos())) + s := int64(fobj.Line(node.Pos())) if s-SnippetOffset > 0 { return s - SnippetOffset } @@ -217,7 +217,7 @@ func codeSnippetStartLine(node ast.Node, fobj *token.File) int64 { } func codeSnippetEndLine(node ast.Node, fobj *token.File) int64 { - e := (int64)(fobj.Line(node.End())) + e := int64(fobj.Line(node.End())) return e + SnippetOffset } diff --git a/vendor/github.com/securego/gosec/v2/resolve.go b/vendor/github.com/securego/gosec/v2/resolve.go index 18f9ad9c..72b995f4 100644 --- a/vendor/github.com/securego/gosec/v2/resolve.go +++ b/vendor/github.com/securego/gosec/v2/resolve.go @@ -14,7 +14,11 @@ package gosec -import "go/ast" +import ( + "go/ast" + "go/token" + "go/types" +) func resolveIdent(n *ast.Ident, c *Context) bool { if n.Obj == nil || n.Obj.Kind != ast.Var { @@ -66,11 +70,154 @@ func resolveBinExpr(n *ast.BinaryExpr, c *Context) bool { return (TryResolve(n.X, c) && TryResolve(n.Y, c)) } -func resolveCallExpr(_ *ast.CallExpr, _ *Context) bool { +func resolveCallExpr(node *ast.CallExpr, c *Context) bool { + // A strings.Builder / bytes.Buffer .String() call resolves to a constant when + // every value written to the receiver is itself a constant. This keeps rules + // such as G202 consistent with their lenient handling of constant string + // concatenation (e.g. building a value with +=) and avoids false positives + // when a builder is used purely to assemble a constant string. + if obj, ok := builderStringReceiver(node, c); ok { + return builderWritesAreConst(obj, node, c) + } // TODO(tkelsey): next step, full function resolution return false } +// builderStringReceiver returns the receiver's object when node is a call to +// String() on a strings.Builder or bytes.Buffer value. +func builderStringReceiver(node *ast.CallExpr, c *Context) (types.Object, bool) { + sel, ok := node.Fun.(*ast.SelectorExpr) + if !ok || sel.Sel.Name != "String" || len(node.Args) != 0 { + return nil, false + } + ident, ok := sel.X.(*ast.Ident) + if !ok || !isStringBuilderType(c.Info.TypeOf(ident)) { + return nil, false + } + obj := c.Info.ObjectOf(ident) + if obj == nil { + return nil, false + } + // Only reason about local builders; a package-level one may be written to + // in files we do not inspect here. + if c.Pkg != nil && obj.Parent() == c.Pkg.Scope() { + return nil, false + } + return obj, true +} + +// isStringBuilderType reports whether t is strings.Builder or bytes.Buffer +// (or a pointer to either). +func isStringBuilderType(t types.Type) bool { + if ptr, ok := t.(*types.Pointer); ok { + t = ptr.Elem() + } + named, ok := t.(*types.Named) + if !ok { + return false + } + obj := named.Obj() + if obj == nil || obj.Pkg() == nil { + return false + } + switch obj.Pkg().Path() + "." + obj.Name() { + case "strings.Builder", "bytes.Buffer": + return true + } + return false +} + +// builderWritesAreConst reports whether every value written to the builder +// referenced by obj is a constant. It is conservative: any usage of the builder +// that cannot be reasoned about (e.g. its address escaping to a function) makes +// it return false. +func builderWritesAreConst(obj types.Object, strCall *ast.CallExpr, c *Context) bool { + file := ContainingFile(strCall, c) + if file == nil { + return false + } + + allRefs := map[*ast.Ident]bool{} + accounted := map[*ast.Ident]bool{} + safe := true + + ast.Inspect(file, func(n ast.Node) bool { + switch node := n.(type) { + case *ast.Ident: + if c.Info.ObjectOf(node) == obj { + allRefs[node] = true + } + case *ast.ValueSpec: // var b strings.Builder + for _, name := range node.Names { + if c.Info.ObjectOf(name) == obj { + accounted[name] = true + } + } + case *ast.AssignStmt: + if node.Tok != token.DEFINE { + return true + } + for i, lhs := range node.Lhs { + id, ok := lhs.(*ast.Ident) + if !ok || c.Info.ObjectOf(id) != obj { + continue + } + accounted[id] = true + // Only an empty composite literal (strings.Builder{}) is a + // known-empty starting point; anything else is opaque. + if len(node.Rhs) != len(node.Lhs) || !isEmptyCompositeLit(node.Rhs[i]) { + safe = false + } + } + case *ast.CallExpr: // b.WriteString(...), b.String(), ... + sel, ok := node.Fun.(*ast.SelectorExpr) + if !ok { + return true + } + recv, ok := sel.X.(*ast.Ident) + if !ok || c.Info.ObjectOf(recv) != obj { + return true + } + accounted[recv] = true + switch sel.Sel.Name { + case "WriteString", "WriteByte", "WriteRune", "Write": + for _, arg := range node.Args { + if !TryResolve(arg, c) { + safe = false + } + } + case "String", "Len", "Cap", "Reset", "Grow": + // read-only or adds no content + default: + safe = false + } + } + return true + }) + + if !safe { + return false + } + // Any reference we could not account for (e.g. &b passed to a function) + // means the builder's contents are unknown. + for id := range allRefs { + if !accounted[id] { + return false + } + } + return true +} + +// isEmptyCompositeLit reports whether e is an empty composite literal, optionally +// address-taken (e.g. strings.Builder{} or &strings.Builder{}). +func isEmptyCompositeLit(e ast.Expr) bool { + if u, ok := e.(*ast.UnaryExpr); ok && u.Op == token.AND { + e = u.X + } + cl, ok := e.(*ast.CompositeLit) + return ok && len(cl.Elts) == 0 +} + // TryResolve will attempt, given a subtree starting at some AST node, to resolve // all values contained within to a known constant. It is used to check for any // unknown values in compound expressions. diff --git a/vendor/github.com/securego/gosec/v2/rules/rsa.go b/vendor/github.com/securego/gosec/v2/rules/rsa.go index ca4f138f..50bd336b 100644 --- a/vendor/github.com/securego/gosec/v2/rules/rsa.go +++ b/vendor/github.com/securego/gosec/v2/rules/rsa.go @@ -30,7 +30,7 @@ type weakKeyStrength struct { // Match overrides the base to check the bits argument of rsa.GenerateKey func (w *weakKeyStrength) Match(n ast.Node, c *gosec.Context) (*issue.Issue, error) { if callExpr := w.calls.ContainsPkgCallExpr(n, c, false); callExpr != nil { - if bits, err := gosec.GetInt(callExpr.Args[1]); err == nil && bits < (int64)(w.bits) { + if bits, err := gosec.GetInt(callExpr.Args[1]); err == nil && bits < int64(w.bits) { return c.NewIssue(n, w.ID(), w.What, w.Severity, w.Confidence), nil } } diff --git a/vendor/github.com/securego/gosec/v2/taint/analyzer.go b/vendor/github.com/securego/gosec/v2/taint/analyzer.go index 63640177..50d65875 100644 --- a/vendor/github.com/securego/gosec/v2/taint/analyzer.go +++ b/vendor/github.com/securego/gosec/v2/taint/analyzer.go @@ -128,11 +128,11 @@ func newIssue(analyzerID string, desc string, fileSet *token.FileSet, func issueCodeSnippet(fileSet *token.FileSet, pos token.Pos) string { file := fileSet.File(pos) - start := (int64)(file.Line(pos)) + start := int64(file.Line(pos)) if start-issue.SnippetOffset > 0 { start = start - issue.SnippetOffset } - end := (int64)(file.Line(pos)) + end := int64(file.Line(pos)) end = end + issue.SnippetOffset var code string diff --git a/vendor/github.com/shirou/gopsutil/v4/cpu/cpu_windows.go b/vendor/github.com/shirou/gopsutil/v4/cpu/cpu_windows.go index 5a8a344a..ee96405c 100644 --- a/vendor/github.com/shirou/gopsutil/v4/cpu/cpu_windows.go +++ b/vendor/github.com/shirou/gopsutil/v4/cpu/cpu_windows.go @@ -524,18 +524,23 @@ func getSMBIOSProcessorInfo() (family uint8, processorId string, err error) { func getSystemLogicalProcessorInformationEx(relationship relationship) ([]systemLogicalProcessorInformationEx, error) { var length uint32 - // First call to determine the required buffer size - _, _, err := procGetLogicalProcessorInformationEx.Call(uintptr(relationship), 0, uintptr(unsafe.Pointer(&length))) - if err != nil && !errors.Is(err, windows.ERROR_INSUFFICIENT_BUFFER) { + // First call to determine the required buffer size. It is expected to + // fail with ERROR_INSUFFICIENT_BUFFER; the error returned by Call is + // only meaningful once the BOOL return value says the call failed. + ret, _, err := procGetLogicalProcessorInformationEx.Call(uintptr(relationship), 0, uintptr(unsafe.Pointer(&length))) + if ret == 0 && !errors.Is(err, windows.ERROR_INSUFFICIENT_BUFFER) { return nil, fmt.Errorf("failed to get buffer size: %w", err) } + if length == 0 { + return nil, errors.New("failed to get buffer size: reported size is zero") + } // Allocate the buffer buffer := make([]byte, length) // Second call to retrieve the processor information - _, _, err = procGetLogicalProcessorInformationEx.Call(uintptr(relationship), uintptr(unsafe.Pointer(&buffer[0])), uintptr(unsafe.Pointer(&length))) - if err != nil && !errors.Is(err, windows.NTE_OP_OK) { + ret, _, err = procGetLogicalProcessorInformationEx.Call(uintptr(relationship), uintptr(unsafe.Pointer(&buffer[0])), uintptr(unsafe.Pointer(&length))) + if ret == 0 { return nil, fmt.Errorf("failed to get logical processor information: %w", err) } diff --git a/vendor/github.com/shirou/gopsutil/v4/internal/common/common_windows.go b/vendor/github.com/shirou/gopsutil/v4/internal/common/common_windows.go index 3778e4d9..e9175c2e 100644 --- a/vendor/github.com/shirou/gopsutil/v4/internal/common/common_windows.go +++ b/vendor/github.com/shirou/gopsutil/v4/internal/common/common_windows.go @@ -184,7 +184,7 @@ func NewWin32PerformanceCounter(postName, counterName string) (*Win32Performance func (w *Win32PerformanceCounter) GetValue() (float64, error) { r, _, err := PdhCollectQueryData.Call(uintptr(w.Query)) - if r != 0 && err != nil { + if r != 0 { if r == PDH_NO_DATA { return 0.0, fmt.Errorf("%w: this counter has not data", err) } diff --git a/vendor/github.com/shirou/gopsutil/v4/net/net_darwin.go b/vendor/github.com/shirou/gopsutil/v4/net/net_darwin.go index 9531ad5b..f440266e 100644 --- a/vendor/github.com/shirou/gopsutil/v4/net/net_darwin.go +++ b/vendor/github.com/shirou/gopsutil/v4/net/net_darwin.go @@ -24,14 +24,25 @@ const endOfLine = "\n" func parseNetstatLine(line string) (stat *IOCountersStat, linkID *uint, err error) { var ( - numericValue uint64 - columns = strings.Fields(line) + numericValue uint64 + columns = strings.Fields(line) + numberColumns = len(columns) ) - if columns[0] == "Name" { + if numberColumns > 0 && columns[0] == "Name" { return nil, nil, errNetstatHeader } + if numberColumns < 11 || numberColumns > 13 { + return nil, nil, fmt.Errorf("line %q has an invalid number of columns: %d", line, numberColumns) + } + + base := 1 + // sometimes Address is omitted + if numberColumns < 12 { + base = 0 + } + // try to extract the numeric value from if subMatch := netstatLinkRegexp.FindStringSubmatch(columns[2]); len(subMatch) == 2 { numericValue, err = strconv.ParseUint(subMatch[1], 10, 64) @@ -42,16 +53,6 @@ func parseNetstatLine(line string) (stat *IOCountersStat, linkID *uint, err erro linkID = &linkIDUint } - base := 1 - numberColumns := len(columns) - // sometimes Address is omitted - if numberColumns < 12 { - base = 0 - } - if numberColumns < 11 || numberColumns > 13 { - return nil, nil, fmt.Errorf("line %q do have an invalid number of columns %d", line, numberColumns) - } - parsed := make([]uint64, 0, 7) vv := []string{ columns[base+3], // Ipkts == PacketsRecv @@ -93,29 +94,20 @@ type netstatInterface struct { stat *IOCountersStat } -func parseNetstatOutput(output string) ([]netstatInterface, error) { - var ( - err error - lines = strings.Split(strings.Trim(output, endOfLine), endOfLine) - ) - - // number of interfaces is number of lines less one for the header - numberInterfaces := len(lines) - 1 - - interfaces := make([]netstatInterface, numberInterfaces) - // no output beside header - if numberInterfaces == 0 { - return interfaces, nil - } +func parseNetstatOutput(output string) []netstatInterface { + lines := strings.Split(strings.Trim(output, endOfLine), endOfLine) - for index := 0; index < numberInterfaces; index++ { - nsIface := netstatInterface{} - if nsIface.stat, nsIface.linkID, err = parseNetstatLine(lines[index+1]); err != nil { - return nil, err + interfaces := make([]netstatInterface, 0, len(lines)) + for _, line := range lines { + stat, linkID, err := parseNetstatLine(line) + if err != nil { + // Invoke combines stdout and stderr, so diagnostics can appear + // anywhere in the output. They are not netstat interface rows. + continue } - interfaces[index] = nsIface + interfaces = append(interfaces, netstatInterface{stat: stat, linkID: linkID}) } - return interfaces, nil + return interfaces } // map that hold the name of a network interface and the number of usage @@ -183,10 +175,7 @@ func IOCountersWithContext(ctx context.Context, pernic bool) ([]IOCountersStat, return nil, err } - nsInterfaces, err := parseNetstatOutput(string(out)) - if err != nil { - return nil, err - } + nsInterfaces := parseNetstatOutput(string(out)) ifaceUsage := newMapInterfaceNameUsage(nsInterfaces) notTruncated := ifaceUsage.notTruncated() @@ -224,10 +213,7 @@ func IOCountersWithContext(ctx context.Context, pernic bool) ([]IOCountersStat, if out, err = invoke.CommandWithContext(ctx, netstat, "-ibdnWI"+interfaceName); err != nil { return nil, err } - parsedIfaces, err := parseNetstatOutput(string(out)) - if err != nil { - return nil, err - } + parsedIfaces := parseNetstatOutput(string(out)) if len(parsedIfaces) == 0 { // interface had been removed since `ifconfig -l` had been executed continue diff --git a/vendor/github.com/shirou/gopsutil/v4/process/process.go b/vendor/github.com/shirou/gopsutil/v4/process/process.go index 63b07e51..7fd0020c 100644 --- a/vendor/github.com/shirou/gopsutil/v4/process/process.go +++ b/vendor/github.com/shirou/gopsutil/v4/process/process.go @@ -281,7 +281,7 @@ func (p *Process) PercentWithContext(ctx context.Context, interval time.Duration } numcpu := runtime.NumCPU() - delta := (now.Sub(p.lastCPUTime).Seconds()) * float64(numcpu) + delta := now.Sub(p.lastCPUTime).Seconds() * float64(numcpu) ret := calculatePercent(p.lastCPUTimes, cpuTimes, delta, numcpu) p.lastCPUTimes = cpuTimes p.lastCPUTime = now diff --git a/vendor/github.com/shirou/gopsutil/v4/process/process_windows.go b/vendor/github.com/shirou/gopsutil/v4/process/process_windows.go index 19020e1f..0bd7f55a 100644 --- a/vendor/github.com/shirou/gopsutil/v4/process/process_windows.go +++ b/vendor/github.com/shirou/gopsutil/v4/process/process_windows.go @@ -6,6 +6,7 @@ package process import ( "bufio" "context" + "encoding/binary" "errors" "fmt" "io" @@ -1204,14 +1205,82 @@ func (p *processReader) Read(buf []byte) (int, error) { func getProcessCommandLine(pid int32) (string, error) { h, err := windows.OpenProcess(processQueryInformation|windows.PROCESS_VM_READ, false, uint32(pid)) - if errors.Is(err, windows.ERROR_ACCESS_DENIED) || errors.Is(err, windows.ERROR_INVALID_PARAMETER) { + if err == nil { + defer syscall.CloseHandle(syscall.Handle(h)) + + cmdLine, pebErr := getProcessCommandLinePEB(h) + if pebErr == nil { + return cmdLine, nil + } + + // PEB read failed even though the handle opened. VM_READ may + // have been granted but ineffective against this process's + // protection driver. Fall back to the native query on the same handle. + if cmdLine, err := getProcessCommandLineNative(h, pid); err == nil { + return cmdLine, nil + } + return "", pebErr + } + + if errors.Is(err, windows.ERROR_INVALID_PARAMETER) { return "", nil } - if err != nil { + if !errors.Is(err, windows.ERROR_ACCESS_DENIED) { return "", err } - defer syscall.CloseHandle(syscall.Handle(h)) + // fallback in case it's a genuine PPL process, where + // PROCESS_VM_READ itself is denied at OpenProcess time. Retry with + // just PROCESS_QUERY_LIMITED_INFORMATION, which PPL still grants. + lh, lerr := windows.OpenProcess(processQueryInformation, false, uint32(pid)) + if lerr != nil { + return "", nil + } + defer syscall.CloseHandle(syscall.Handle(lh)) + cmdLine, _ := getProcessCommandLineNative(lh, pid) + return cmdLine, nil +} + +func getProcessCommandLineNative(handle windows.Handle, pid int32) (string, error) { + var returnLength uint32 + // first call is to get the actual returnLength + err := windows.NtQueryInformationProcess( + handle, + windows.ProcessCommandLineInformation, + nil, + 0, + &returnLength, + ) + if err != nil && + !errors.Is(err, windows.STATUS_INFO_LENGTH_MISMATCH) && + !errors.Is(err, windows.STATUS_BUFFER_OVERFLOW) && + !errors.Is(err, windows.STATUS_BUFFER_TOO_SMALL) { + return "", fmt.Errorf("querying command line size for pid %d: %w", pid, err) + } + if returnLength == 0 { + return "", fmt.Errorf("process %d returned zero-length command line info", pid) + } + + // second call: actually fetch it into a correctly-sized buffer + buf := make([]byte, returnLength) + err = windows.NtQueryInformationProcess( + handle, + windows.ProcessCommandLineInformation, + unsafe.Pointer(&buf[0]), + returnLength, + &returnLength, + ) + if err != nil { + return "", fmt.Errorf("reading command line for pid %d: %w", pid, err) + } + cmdLine, err := parseCommandLineInformation(buf) + if err != nil { + return "", fmt.Errorf("parsing command line for pid %d: %w", pid, err) + } + return cmdLine, nil +} + +func getProcessCommandLinePEB(h windows.Handle) (string, error) { procIs32Bits := is32BitProcess(h) if procIs32Bits { @@ -1258,3 +1327,19 @@ func convertUTF16ToString(src []byte) string { } return syscall.UTF16ToString(codePoints) } + +func parseCommandLineInformation(buf []byte) (string, error) { + if len(buf) < 2 { + return "", errors.New("command line buffer too small to read length") + } + length := binary.LittleEndian.Uint16(buf[0:2]) + if length == 0 { + return "", nil + } + strOffset := int(unsafe.Sizeof(windows.NTUnicodeString{})) + strEnd := strOffset + int(length) + if strEnd > len(buf) { + return "", errors.New("command line length exceeds buffer size") + } + return convertUTF16ToString(buf[strOffset:strEnd]), nil +} diff --git a/vendor/github.com/sourcegraph/go-diff/diff/git_extended_headers.go b/vendor/github.com/sourcegraph/go-diff/diff/git_extended_headers.go new file mode 100644 index 00000000..ace3b7b3 --- /dev/null +++ b/vendor/github.com/sourcegraph/go-diff/diff/git_extended_headers.go @@ -0,0 +1,94 @@ +package diff + +import "strings" + +const ( + gitExtendedHeaderDiff = "diff --git " + gitExtendedHeaderOldMode = "old mode " + gitExtendedHeaderNewMode = "new mode " + gitExtendedHeaderNewFileMode = "new file mode " + gitExtendedHeaderDeletedFileMode = "deleted file mode " + gitExtendedHeaderRenameFrom = "rename from " + gitExtendedHeaderRenameTo = "rename to " + gitExtendedHeaderCopyFrom = "copy from " + gitExtendedHeaderCopyTo = "copy to " + gitExtendedHeaderIndex = "index " + gitExtendedHeaderBinaryFiles = "Binary files " + gitExtendedHeaderBinaryPatch = "GIT binary patch" +) + +var knownGitExtendedHeaderKinds = [...]string{ + gitExtendedHeaderDiff, + gitExtendedHeaderOldMode, + gitExtendedHeaderNewMode, + gitExtendedHeaderNewFileMode, + gitExtendedHeaderDeletedFileMode, + gitExtendedHeaderRenameFrom, + gitExtendedHeaderRenameTo, + gitExtendedHeaderCopyFrom, + gitExtendedHeaderCopyTo, + gitExtendedHeaderIndex, + gitExtendedHeaderBinaryFiles, + gitExtendedHeaderBinaryPatch, +} + +type gitExtendedHeader struct { + raw string + kind string +} + +func (h gitExtendedHeader) value() string { + return h.raw[len(h.kind):] +} + +type gitExtendedHeaders []gitExtendedHeader + +func parseGitExtendedHeaders(raw []string) (gitExtendedHeaders, bool) { + if len(raw) == 0 || !strings.HasPrefix(raw[0], gitExtendedHeaderDiff) { + return nil, false + } + + headers := make(gitExtendedHeaders, len(raw)) + for i, line := range raw { + headers[i].raw = line + for _, kind := range knownGitExtendedHeaderKinds { + if strings.HasPrefix(line, kind) { + headers[i].kind = kind + break + } + } + } + return headers, true +} + +type gitExtendedHeaderPair struct { + from string + to string +} + +var ( + gitModeHeaderPair = gitExtendedHeaderPair{gitExtendedHeaderOldMode, gitExtendedHeaderNewMode} + gitRenameHeaderPair = gitExtendedHeaderPair{gitExtendedHeaderRenameFrom, gitExtendedHeaderRenameTo} + gitCopyHeaderPair = gitExtendedHeaderPair{gitExtendedHeaderCopyFrom, gitExtendedHeaderCopyTo} +) + +func (h gitExtendedHeaders) hasKind(index int, kind string) bool { + return index >= 0 && index < len(h) && h[index].kind == kind +} + +func (h gitExtendedHeaders) hasPairAt(index int, pair gitExtendedHeaderPair) bool { + return h.hasKind(index, pair.from) && h.hasKind(index+1, pair.to) +} + +func (h gitExtendedHeaders) pairIndices(pair gitExtendedHeaderPair) (from, to int, ok bool) { + from, to = -1, -1 + for i, header := range h { + if from < 0 && header.kind == pair.from { + from = i + } + if to < 0 && header.kind == pair.to { + to = i + } + } + return from, to, from >= 0 && to >= 0 +} diff --git a/vendor/github.com/sourcegraph/go-diff/diff/parse.go b/vendor/github.com/sourcegraph/go-diff/diff/parse.go index b73e2301..9bbaccb1 100644 --- a/vendor/github.com/sourcegraph/go-diff/diff/parse.go +++ b/vendor/github.com/sourcegraph/go-diff/diff/parse.go @@ -373,7 +373,7 @@ func (r *FileDiffReader) ReadExtendedHeaders() ([]string, error) { r.fileHeaderLine = nil } - if bytes.HasPrefix(line, []byte("diff --git ")) { + if bytes.HasPrefix(line, []byte(gitExtendedHeaderDiff)) { if firstLine { firstLine = false } else { @@ -466,7 +466,7 @@ func parseDiffGitArgs(diffArgs string) (string, string, bool) { return first, second, true } // If the names don't have the a/ and b/ prefixes and they're equal, proceed. - if !(first[:2] == "a/" && second[:2] == "b/") && first == second { + if !(strings.HasPrefix(first, "a/") && strings.HasPrefix(second, "b/")) && first == second { return first, second, true } } @@ -508,43 +508,36 @@ func parseDiffGitArgs(diffArgs string) (string, string, bool) { // that follow. It updates fd fields from the parsed extended headers. func handleEmpty(fd *FileDiff) (wasEmpty bool) { lineCount := len(fd.Extended) - if lineCount > 0 && !strings.HasPrefix(fd.Extended[0], "diff --git ") { + headers, ok := parseGitExtendedHeaders(fd.Extended) + if !ok { return false } - lineHasPrefix := func(idx int, prefix string) bool { - return strings.HasPrefix(fd.Extended[idx], prefix) - } - - linesHavePrefixes := func(idx1 int, prefix1 string, idx2 int, prefix2 string) bool { - return lineHasPrefix(idx1, prefix1) && lineHasPrefix(idx2, prefix2) - } - - isCopy := (lineCount == 4 && linesHavePrefixes(2, "copy from ", 3, "copy to ")) || - (lineCount == 6 && linesHavePrefixes(2, "copy from ", 3, "copy to ") && lineHasPrefix(5, "Binary files ")) || - (lineCount == 6 && linesHavePrefixes(1, "old mode ", 2, "new mode ") && linesHavePrefixes(4, "copy from ", 5, "copy to ")) + isCopy := (lineCount == 4 && headers.hasPairAt(2, gitCopyHeaderPair)) || + (lineCount == 6 && headers.hasPairAt(2, gitCopyHeaderPair) && headers.hasKind(5, gitExtendedHeaderBinaryFiles)) || + (lineCount == 6 && headers.hasPairAt(1, gitModeHeaderPair) && headers.hasPairAt(4, gitCopyHeaderPair)) - isRename := (lineCount == 4 && linesHavePrefixes(2, "rename from ", 3, "rename to ")) || - (lineCount == 5 && linesHavePrefixes(2, "rename from ", 3, "rename to ") && lineHasPrefix(4, "Binary files ")) || - (lineCount == 6 && linesHavePrefixes(2, "rename from ", 3, "rename to ") && lineHasPrefix(5, "Binary files ")) || - (lineCount == 6 && linesHavePrefixes(1, "old mode ", 2, "new mode ") && linesHavePrefixes(4, "rename from ", 5, "rename to ")) + isRename := (lineCount == 4 && headers.hasPairAt(2, gitRenameHeaderPair)) || + (lineCount == 5 && headers.hasPairAt(2, gitRenameHeaderPair) && headers.hasKind(4, gitExtendedHeaderBinaryFiles)) || + (lineCount == 6 && headers.hasPairAt(2, gitRenameHeaderPair) && headers.hasKind(5, gitExtendedHeaderBinaryFiles)) || + (lineCount == 6 && headers.hasPairAt(1, gitModeHeaderPair) && headers.hasPairAt(4, gitRenameHeaderPair)) - isDeletedFile := (lineCount == 3 || lineCount == 4 && lineHasPrefix(3, "Binary files ") || lineCount > 4 && lineHasPrefix(3, "GIT binary patch")) && - lineHasPrefix(1, "deleted file mode ") + isDeletedFile := (lineCount == 3 || lineCount == 4 && headers.hasKind(3, gitExtendedHeaderBinaryFiles) || lineCount > 4 && headers.hasKind(3, gitExtendedHeaderBinaryPatch)) && + headers.hasKind(1, gitExtendedHeaderDeletedFileMode) - isNewFile := (lineCount == 3 || lineCount == 4 && lineHasPrefix(3, "Binary files ") || lineCount > 4 && lineHasPrefix(3, "GIT binary patch")) && - lineHasPrefix(1, "new file mode ") + isNewFile := (lineCount == 3 || lineCount == 4 && headers.hasKind(3, gitExtendedHeaderBinaryFiles) || lineCount > 4 && headers.hasKind(3, gitExtendedHeaderBinaryPatch)) && + headers.hasKind(1, gitExtendedHeaderNewFileMode) - isModeChange := lineCount == 3 && linesHavePrefixes(1, "old mode ", 2, "new mode ") + isModeChange := lineCount == 3 && headers.hasPairAt(1, gitModeHeaderPair) - isBinaryPatch := lineCount == 3 && lineHasPrefix(2, "Binary files ") || lineCount > 3 && lineHasPrefix(2, "GIT binary patch") + isBinaryPatch := lineCount == 3 && headers.hasKind(2, gitExtendedHeaderBinaryFiles) || lineCount > 3 && headers.hasKind(2, gitExtendedHeaderBinaryPatch) if !isModeChange && !isCopy && !isRename && !isBinaryPatch && !isNewFile && !isDeletedFile { return false } var success bool - fd.OrigName, fd.NewName, success = parseDiffGitArgs(fd.Extended[0][len("diff --git "):]) + fd.OrigName, fd.NewName, success = parseDiffGitArgs(headers[0].value()) if isNewFile { fd.OrigName = "/dev/null" } @@ -555,13 +548,10 @@ func handleEmpty(fd *FileDiff) (wasEmpty bool) { // For ambiguous 'diff --git' lines, try to reconstruct filenames using extended headers. if success && (isCopy || isRename) && fd.OrigName == "" && fd.NewName == "" { - diffArgs := fd.Extended[0][len("diff --git "):] + diffArgs := headers[0].value() - tryReconstruct := func(header string, prefix string, whichFile int, result *string) { - if !strings.HasPrefix(header, prefix) { - return - } - rawFilename := header[len(prefix):] + tryReconstruct := func(header gitExtendedHeader, whichFile int, result *string) { + rawFilename := header.value() rawFilename = strings.TrimSuffix(rawFilename, "\r") // extract the filename prefix (e.g. "a/") from the 'diff --git' line. @@ -578,11 +568,13 @@ func handleEmpty(fd *FileDiff) (wasEmpty bool) { *result = diffArgs[prefixLetterIndex:prefixLetterIndex+2] + rawFilename } - for _, header := range fd.Extended { - tryReconstruct(header, "copy from ", 1, &fd.OrigName) - tryReconstruct(header, "copy to ", 2, &fd.NewName) - tryReconstruct(header, "rename from ", 1, &fd.OrigName) - tryReconstruct(header, "rename to ", 2, &fd.NewName) + for _, header := range headers { + switch header.kind { + case gitExtendedHeaderCopyFrom, gitExtendedHeaderRenameFrom: + tryReconstruct(header, 1, &fd.OrigName) + case gitExtendedHeaderCopyTo, gitExtendedHeaderRenameTo: + tryReconstruct(header, 2, &fd.NewName) + } } } return success diff --git a/vendor/github.com/sourcegraph/go-diff/diff/reverse.go b/vendor/github.com/sourcegraph/go-diff/diff/reverse.go index 87715efb..0c4d1b63 100644 --- a/vendor/github.com/sourcegraph/go-diff/diff/reverse.go +++ b/vendor/github.com/sourcegraph/go-diff/diff/reverse.go @@ -4,17 +4,27 @@ import ( "bytes" "errors" "fmt" + "strings" ) -// ReverseFileDiff takes a diff.FileDiff, and returns the reverse operation. -// This is a FileDiff that undoes the edit of the original. +// ErrCannotReverseCopy is returned when a Git copy diff cannot be reversed. +var ErrCannotReverseCopy = errors.New("cannot reverse a git copy diff") + +// ReverseFileDiff takes a diff.FileDiff and returns the reverse operation. +// This is a FileDiff that undoes the edit of the original. Git copy diffs +// cannot be reversed because they do not contain enough information to delete +// the copied file. func ReverseFileDiff(fd *FileDiff) (*FileDiff, error) { + extended, err := reverseExtendedHeaders(fd.Extended, fd.OrigName, fd.NewName) + if err != nil { + return nil, err + } reverse := FileDiff{ OrigName: fd.NewName, OrigTime: fd.NewTime, NewName: fd.OrigName, NewTime: fd.OrigTime, - Extended: fd.Extended, + Extended: extended, } for _, hunk := range fd.Hunks { invHunk, err := reverseHunk(hunk) @@ -26,6 +36,115 @@ func ReverseFileDiff(fd *FileDiff) (*FileDiff, error) { return &reverse, nil } +// reverseExtendedHeaders reverses the direction encoded in git's extended headers. +func reverseExtendedHeaders(headers []string, origName, newName string) ([]string, error) { + parsed, ok := parseGitExtendedHeaders(headers) + if !ok { + return headers, nil + } + reversed := make([]string, len(headers)) + copy(reversed, headers) + reversed[0] = reverseDiffGitHeader(reversed[0], origName, newName) + for i, header := range parsed { + switch header.kind { + case gitExtendedHeaderNewFileMode: + reversed[i] = gitExtendedHeaderDeletedFileMode + header.value() + case gitExtendedHeaderDeletedFileMode: + reversed[i] = gitExtendedHeaderNewFileMode + header.value() + case gitExtendedHeaderIndex: + reversed[i] = reverseIndexHeader(header) + case gitExtendedHeaderCopyFrom, gitExtendedHeaderCopyTo: + return nil, ErrCannotReverseCopy + } + } + swapHeaderValues(reversed, parsed, gitModeHeaderPair) + swapHeaderValues(reversed, parsed, gitRenameHeaderPair) + return reversed, nil +} + +// reverseDiffGitHeader swaps the two path arguments while preserving their +// original quoting. The parsed filenames are used only to reject malformed or +// ambiguous input; names recovered from other headers can disambiguate Git's +// unquoted paths containing spaces. +func reverseDiffGitHeader(header, origName, newName string) string { + const prefix = gitExtendedHeaderDiff + args := header[len(prefix):] + lineEnding := "" + if strings.HasSuffix(args, "\r") { + args = strings.TrimSuffix(args, "\r") + lineEnding = "\r" + } + + first, second, valid := parseDiffGitArgs(args) + if !valid { + return header + } + + var rawFirst, rawSecond string + switch { + case first != "" && second != "": + var ok bool + rawFirst, rawSecond, ok = splitDiffGitArgs(args, first, second) + if !ok { + return header + } + case origName != "" && newName != "" && args == origName+" "+newName: + rawFirst, rawSecond = origName, newName + default: + return header + } + + return prefix + rawSecond + " " + rawFirst + lineEnding +} + +// splitDiffGitArgs locates the raw argument boundary after parseDiffGitArgs has +// validated and decoded both paths. +func splitDiffGitArgs(args, first, second string) (string, string, bool) { + if args[0] == '"' { + _, remainder, err := readQuotedFilename(args) + if err != nil || len(remainder) < 2 || remainder[0] != ' ' { + return "", "", false + } + return args[:len(args)-len(remainder)], remainder[1:], true + } + if args[len(args)-1] == '"' { + i := strings.IndexByte(args, '"') + if i < 2 || args[i-1] != ' ' { + return "", "", false + } + return args[:i-1], args[i:], true + } + if args != first+" "+second { + return "", "", false + } + return first, second, true +} + +// swapHeaderValues exchanges the values of the first "from" header and the +// first "to" header, leaving both prefixes where they are. +func swapHeaderValues(headers []string, parsed gitExtendedHeaders, pair gitExtendedHeaderPair) { + from, to, ok := parsed.pairIndices(pair) + if !ok { + return + } + headers[from] = pair.from + parsed[to].value() + headers[to] = pair.to + parsed[from].value() +} + +// reverseIndexHeader swaps the two blob hashes in an "index ..[ ]" +// header, leaving the trailing mode (if any) alone. +func reverseIndexHeader(header gitExtendedHeader) string { + oldHash, newHash, ok := strings.Cut(header.value(), "..") + if !ok || strings.ContainsAny(oldHash, " \r") { + return header.raw + } + prefix := gitExtendedHeaderIndex + if i := strings.IndexAny(newHash, " \r"); i >= 0 { + return prefix + newHash[:i] + ".." + oldHash + newHash[i:] + } + return prefix + newHash + ".." + oldHash +} + // ReverseMultiFileDiff reverses a series of FileDiffs. func ReverseMultiFileDiff(fds []*FileDiff) ([]*FileDiff, error) { var reverse []*FileDiff diff --git a/vendor/github.com/timakin/bodyclose/passes/bodyclose/bodyclose.go b/vendor/github.com/timakin/bodyclose/passes/bodyclose/bodyclose.go index 4a862521..022a1335 100644 --- a/vendor/github.com/timakin/bodyclose/passes/bodyclose/bodyclose.go +++ b/vendor/github.com/timakin/bodyclose/passes/bodyclose/bodyclose.go @@ -3,6 +3,8 @@ package bodyclose import ( "fmt" "go/ast" + "go/parser" + "go/token" "go/types" "strconv" "strings" @@ -31,27 +33,30 @@ var checkConsumptionFlag bool const ( Doc = "checks whether HTTP response body is closed successfully" - nethttpPath = "net/http" - closeMethod = "Close" + nethttpPath = "net/http" + closeMethod = "Close" + responseHandledDirective = "bodyclose:handled" ) type runner struct { - pass *analysis.Pass - resObj types.Object - resTyp *types.Pointer - bodyObj types.Object - closeMthd *types.Func - skipFile map[*ast.File]bool - checkConsumption bool + pass *analysis.Pass + resObj types.Object + resTyp *types.Pointer + bodyObj types.Object + closeMthd *types.Func + skipFile map[*ast.File]bool + responseHandledDirectives map[string]map[int]struct{} + checkConsumption bool } // run executes an analysis for the pass func run(pass *analysis.Pass) (interface{}, error) { r := runner{ - pass: pass, - checkConsumption: checkConsumptionFlag, + pass: pass, + skipFile: make(map[*ast.File]bool), + responseHandledDirectives: make(map[string]map[int]struct{}), + checkConsumption: checkConsumptionFlag, } - funcs := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs r.resObj = analysisutil.LookupFromImports(pass.Pkg.Imports(), nethttpPath, "Response") if r.resObj == nil { @@ -91,7 +96,7 @@ func run(pass *analysis.Pass) (interface{}, error) { } } - r.skipFile = map[*ast.File]bool{} + funcs := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs FuncLoop: for _, f := range funcs { // skip if the function is just referenced @@ -118,12 +123,64 @@ FuncLoop: return nil, nil } +func (r *runner) responseHandledByDirective(call *ssa.Call) bool { + callee := call.Call.StaticCallee() + if callee == nil { + return false + } + fn, ok := callee.Object().(*types.Func) + if !ok { + return false + } + + pos := r.pass.Fset.PositionFor(fn.Pos(), false) + if !pos.IsValid() || pos.Filename == "" { + return false + } + + lines, ok := r.responseHandledDirectives[pos.Filename] + if !ok { + lines = responseHandledDirectiveLines(pos.Filename) + r.responseHandledDirectives[pos.Filename] = lines + } + _, ok = lines[pos.Line] + return ok +} + +func responseHandledDirectiveLines(filename string) map[int]struct{} { + fset := token.NewFileSet() + file, err := parser.ParseFile(fset, filename, nil, parser.ParseComments) + if err != nil { + return nil + } + + lines := make(map[int]struct{}) + for _, decl := range file.Decls { + fn, ok := decl.(*ast.FuncDecl) + if !ok || fn.Doc == nil { + continue + } + for _, comment := range fn.Doc.List { + text := strings.TrimSpace(strings.TrimPrefix(comment.Text, "//")) + if text == responseHandledDirective { + lines[fset.Position(fn.Name.Pos()).Line] = struct{}{} + break + } + } + } + return lines +} + func (r *runner) isopen(b *ssa.BasicBlock, i int) bool { call, ok := r.getReqCall(b.Instrs[i]) if !ok { return false } + if r.responseHandledByDirective(call) { + return false + } + if len(*call.Referrers()) == 0 { return true } diff --git a/vendor/github.com/timonwong/loggercheck/.golangci.yml b/vendor/github.com/timonwong/loggercheck/.golangci.yml index 7c82dc77..b33b6da1 100644 --- a/vendor/github.com/timonwong/loggercheck/.golangci.yml +++ b/vendor/github.com/timonwong/loggercheck/.golangci.yml @@ -100,3 +100,6 @@ linters: - linters: - gocritic path: internal/checkers/printf/printf.go + - linters: + - goconst + path: ^(loggercheck_test\.go|internal/sets/string_test\.go)$ diff --git a/vendor/github.com/timonwong/loggercheck/AGENTS.md b/vendor/github.com/timonwong/loggercheck/AGENTS.md new file mode 100644 index 00000000..d777b9d7 --- /dev/null +++ b/vendor/github.com/timonwong/loggercheck/AGENTS.md @@ -0,0 +1,13 @@ +## Agent skills + +### Issue tracker + +Issues and specs live in GitHub Issues, operated with the `gh` CLI. See `docs/agents/issue-tracker.md`. + +### Triage labels + +Use the default five canonical triage labels: `needs-triage`, `needs-info`, `ready-for-agent`, `ready-for-human`, and `wontfix`. See `docs/agents/triage-labels.md`. + +### Domain docs + +This is a single-context repo using root `CONTEXT.md` and `docs/adr/`. See `docs/agents/domain.md`. diff --git a/vendor/github.com/timonwong/loggercheck/internal/checkers/checker.go b/vendor/github.com/timonwong/loggercheck/internal/checkers/checker.go index 5fa1cfb2..58c6ba0d 100644 --- a/vendor/github.com/timonwong/loggercheck/internal/checkers/checker.go +++ b/vendor/github.com/timonwong/loggercheck/internal/checkers/checker.go @@ -2,6 +2,7 @@ package checkers import ( "go/ast" + "go/token" "go/types" "golang.org/x/tools/go/analysis" @@ -24,11 +25,55 @@ type Checker interface { CheckPrintfLikeSpecifier(pass *analysis.Pass, args []ast.Expr) } +var stringerType = func() *types.Interface { + stringMethod := types.NewFunc(token.NoPos, nil, "String", types.NewSignatureType( + nil, + nil, + nil, + types.NewTuple(), + types.NewTuple(types.NewVar(token.NoPos, nil, "", types.Typ[types.String])), + false, + )) + iface := types.NewInterfaceType([]*types.Func{stringMethod}, nil) + iface.Complete() + return iface +}() + +func checkStringerValues(pass *analysis.Pass, keyAndValues []ast.Expr) { + for i := 1; i < len(keyAndValues); i += 2 { + arg := keyAndValues[i] + typ := types.Unalias(pass.TypesInfo.TypeOf(arg)) + ptr, ok := typ.(*types.Pointer) + if !ok { + continue + } + + elem := types.Unalias(ptr.Elem()) + if !types.Implements(elem, stringerType) || !types.Implements(ptr, stringerType) { + continue + } + + pass.Report(analysis.Diagnostic{ + Pos: arg.Pos(), + End: arg.End(), + Category: DiagnosticCategory, + Message: "logging value may panic when nil because its element type implements fmt.Stringer", + }) + } +} + func ExecuteChecker(c Checker, pass *analysis.Pass, call CallContext, cfg Config) { params := call.Signature.Params() nparams := params.Len() // variadic => nonzero startIndex := nparams - 1 + if len(call.Expr.Args) < startIndex { + // A multi-valued expression may expand to multiple arguments, but its + // individual values cannot be represented by separate AST expressions. + // Skip calls whose syntactic arguments cannot cover the fixed params. + return + } + iface, ok := types.Unalias(params.At(startIndex).Type().(*types.Slice).Elem()).(*types.Interface) if !ok || !iface.Empty() { return // final (args) param is not ...interface{} @@ -51,6 +96,8 @@ func ExecuteChecker(c Checker, pass *analysis.Pass, call CallContext, cfg Config c.CheckLoggingKey(pass, keyValuesArgs) } + checkStringerValues(pass, keyValuesArgs) + if cfg.NoPrintfLike { // Check all args c.CheckPrintfLikeSpecifier(pass, call.Expr.Args) diff --git a/vendor/github.com/xo/terminfo/dec.go b/vendor/github.com/xo/terminfo/dec.go index dacc88e3..f650c2dd 100644 --- a/vendor/github.com/xo/terminfo/dec.go +++ b/vendor/github.com/xo/terminfo/dec.go @@ -6,7 +6,7 @@ import ( const ( // maxFileLength is the max file length. - maxFileLength = 4096 + maxFileLength = 32768 // magic is the file magic for terminfo files. magic = 0o432 // magicExtended is the file magic for terminfo files with the extended diff --git a/vendor/go.augendre.info/fatcontext/pkg/analyzer/analyzer.go b/vendor/go.augendre.info/fatcontext/pkg/analyzer/analyzer.go index 82972e42..0604c59f 100644 --- a/vendor/go.augendre.info/fatcontext/pkg/analyzer/analyzer.go +++ b/vendor/go.augendre.info/fatcontext/pkg/analyzer/analyzer.go @@ -9,6 +9,7 @@ import ( "go/ast" "go/printer" "go/token" + "go/types" "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/analysis/passes/inspect" @@ -75,37 +76,123 @@ func (r *runner) run(pass *analysis.Pass) (any, error) { (*ast.FuncDecl)(nil), } - inspctr.Preorder(nodeFilter, func(node ast.Node) { - body, err := getBody(node) - if err != nil { - return + inspctr.WithStack(nodeFilter, func(node ast.Node, push bool, stack []ast.Node) bool { + if push { + r.check(pass, node, stack) } - if body == nil { - return - } + return true + }) + + return nil, nil //nolint:nilnil // we have no result to send to other analyzers +} + +func (r *runner) check(pass *analysis.Pass, node ast.Node, stack []ast.Node) { + if funcLit, typeValid := node.(*ast.FuncLit); typeValid && isRunOnce(pass, funcLit, stack) { + return + } + + body, err := getBody(node) + if err != nil { + return + } + + if body == nil { + return + } + + assignStmt := findNestedContext(pass, node, body.List) + if assignStmt == nil { + return + } + + category := getCategory(pass, node, assignStmt) + + if r.shouldIgnoreReport(category) { + return + } + + fixes := r.getSuggestedFixes(pass, assignStmt, category) + + pass.Report(analysis.Diagnostic{ + Pos: assignStmt.Pos(), + Message: category, + SuggestedFixes: fixes, + }) +} + +// isRunOnce reports whether the function literal is guaranteed to run at most +// once per execution of the statement registering it, in which case it cannot +// grow the context it captures. Two shapes are recognized: `defer func() {}()` +// and `t.Cleanup(func() {})`. +func isRunOnce(pass *analysis.Pass, funcLit *ast.FuncLit, stack []ast.Node) bool { + // stack[len(stack)-1] is funcLit itself, its parent is the call wrapping it. + if len(stack) < 2 { //nolint:mnd // funcLit plus its parent. + return false + } - assignStmt := findNestedContext(pass, node, body.List) - if assignStmt == nil { - return + call, typeValid := stack[len(stack)-2].(*ast.CallExpr) + if !typeValid { + return false + } + + var runOnce bool + + if call.Fun == ast.Expr(funcLit) { + // Immediately invoked: only safe when the invocation is deferred. + if len(stack) < 3 { //nolint:mnd // funcLit, its call and the defer statement. + return false } - category := getCategory(pass, node, assignStmt) + _, runOnce = stack[len(stack)-3].(*ast.DeferStmt) + } else { + runOnce = isCleanupCall(pass, call) + } - if r.shouldIgnoreReport(category) { - return + if !runOnce { + return false + } + + // Registering a run-once function literal from within a loop runs it once + // per iteration, which does grow the captured context. + for _, ancestor := range stack { + switch ancestor.(type) { + case *ast.ForStmt, *ast.RangeStmt: + return false } + } - fixes := r.getSuggestedFixes(pass, assignStmt, category) + return true +} - pass.Report(analysis.Diagnostic{ - Pos: assignStmt.Pos(), - Message: category, - SuggestedFixes: fixes, - }) - }) +// isCleanupCall reports whether the call is to testing.{T,B,TB}.Cleanup. +func isCleanupCall(pass *analysis.Pass, call *ast.CallExpr) bool { + selector, typeValid := call.Fun.(*ast.SelectorExpr) + if !typeValid || selector.Sel.Name != "Cleanup" { + return false + } - return nil, nil //nolint:nilnil // we have no result to send to other analyzers + typ := pass.TypesInfo.TypeOf(selector.X) + if ptr, isPtr := typ.(*types.Pointer); isPtr { + typ = ptr.Elem() + } + + named, typeValid := typ.(*types.Named) + if !typeValid { + return false + } + + obj := named.Obj() + if obj == nil || obj.Pkg() == nil || obj.Pkg().Path() != "testing" { + return false + } + + switch obj.Name() { + case "T", "B", "TB": + return true + } + + return false } func (r *runner) shouldIgnoreReport(category string) bool { diff --git a/vendor/modules.txt b/vendor/modules.txt index 40c3816e..5eccc731 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -17,8 +17,8 @@ code.cloudfoundry.org/credhub-cli/credhub/credentials/generate code.cloudfoundry.org/credhub-cli/credhub/credentials/values code.cloudfoundry.org/credhub-cli/credhub/permissions code.cloudfoundry.org/credhub-cli/credhub/server -# codeberg.org/chavacava/garif v0.2.0 -## explicit; go 1.23 +# codeberg.org/chavacava/garif v0.2.1 +## explicit; go 1.25 codeberg.org/chavacava/garif # codeberg.org/polyfloyd/go-errorlint v1.9.0 ## explicit; go 1.24.0 @@ -32,8 +32,8 @@ dev.gaijin.team/go/exhaustruct/v4/analyzer dev.gaijin.team/go/exhaustruct/v4/internal/comment dev.gaijin.team/go/exhaustruct/v4/internal/pattern dev.gaijin.team/go/exhaustruct/v4/internal/structure -# dev.gaijin.team/go/exhaustruct/v5 v5.0.3 -## explicit; go 1.24.0 +# dev.gaijin.team/go/exhaustruct/v5 v5.2.0 +## explicit; go 1.26.0 dev.gaijin.team/go/exhaustruct/v5/analyzer dev.gaijin.team/go/exhaustruct/v5/internal/astutil dev.gaijin.team/go/exhaustruct/v5/internal/cache @@ -44,7 +44,7 @@ dev.gaijin.team/go/exhaustruct/v5/internal/structure ## explicit; go 1.24 dev.gaijin.team/go/golib/e dev.gaijin.team/go/golib/fields -# github.com/4meepo/tagalign v1.4.3 +# github.com/4meepo/tagalign v1.4.4 ## explicit; go 1.22.0 github.com/4meepo/tagalign # github.com/Abirdcfly/dupword v0.1.8 @@ -148,8 +148,8 @@ github.com/alecthomas/chroma/v2/formatters/svg github.com/alecthomas/chroma/v2/lexers github.com/alecthomas/chroma/v2/quick github.com/alecthomas/chroma/v2/styles -# github.com/alecthomas/go-check-sumtype v0.3.1 -## explicit; go 1.22.0 +# github.com/alecthomas/go-check-sumtype v0.5.1-0.20260828200218-ae6904d28606 +## explicit; go 1.26.0 github.com/alecthomas/go-check-sumtype # github.com/alexkohler/nakedret/v2 v2.0.6 ## explicit; go 1.23.0 @@ -551,11 +551,11 @@ github.com/fsnotify/fsnotify/internal # github.com/fzipp/gocyclo v0.6.0 ## explicit; go 1.18 github.com/fzipp/gocyclo -# github.com/ghostiam/protogetter v0.3.21 -## explicit; go 1.25.0 +# github.com/ghostiam/protogetter v1.0.1 +## explicit; go 1.26.0 github.com/ghostiam/protogetter -# github.com/go-critic/go-critic v0.14.4 -## explicit; go 1.24.0 +# github.com/go-critic/go-critic v0.15.0 +## explicit; go 1.25.0 github.com/go-critic/go-critic/checkers github.com/go-critic/go-critic/checkers/internal/astwalk github.com/go-critic/go-critic/checkers/internal/lintutil @@ -613,8 +613,8 @@ github.com/gobwas/glob/syntax/ast github.com/gobwas/glob/syntax/lexer github.com/gobwas/glob/util/runes github.com/gobwas/glob/util/strings -# github.com/godoc-lint/godoc-lint v0.11.2 -## explicit; go 1.24.0 +# github.com/godoc-lint/godoc-lint v0.11.4 +## explicit; go 1.26.0 github.com/godoc-lint/godoc-lint/pkg/analysis github.com/godoc-lint/godoc-lint/pkg/check github.com/godoc-lint/godoc-lint/pkg/check/deprecated @@ -631,8 +631,8 @@ github.com/godoc-lint/godoc-lint/pkg/config github.com/godoc-lint/godoc-lint/pkg/inspect github.com/godoc-lint/godoc-lint/pkg/model github.com/godoc-lint/godoc-lint/pkg/util -# github.com/gofrs/flock v0.13.0 -## explicit; go 1.24.0 +# github.com/gofrs/flock v0.13.1 +## explicit; go 1.25.0 github.com/gofrs/flock # github.com/golang-jwt/jwt/v4 v4.5.2 ## explicit; go 1.16 @@ -658,7 +658,7 @@ github.com/golangci/go-printf-func-name/pkg/analyzer ## explicit; go 1.26.0 github.com/golangci/gofmt github.com/golangci/gofmt/internal -# github.com/golangci/golangci-lint/v2 v2.13.2 +# github.com/golangci/golangci-lint/v2 v2.14.0 ## explicit; go 1.26.0 github.com/golangci/golangci-lint/v2/cmd/golangci-lint github.com/golangci/golangci-lint/v2/internal/cache @@ -988,7 +988,7 @@ github.com/kunwardeep/paralleltest/pkg/paralleltest # github.com/ldez/exptostd v0.4.5 ## explicit; go 1.24.0 github.com/ldez/exptostd -# github.com/ldez/gomoddirectives v0.9.0 +# github.com/ldez/gomoddirectives v0.10.0 ## explicit; go 1.25.0 github.com/ldez/gomoddirectives # github.com/ldez/grignotin v0.10.1 @@ -998,8 +998,8 @@ github.com/ldez/grignotin/gomod # github.com/ldez/structtags v0.6.1 ## explicit; go 1.24.0 github.com/ldez/structtags/parser -# github.com/ldez/tagliatelle v0.7.2 -## explicit; go 1.23.0 +# github.com/ldez/tagliatelle v0.8.0 +## explicit; go 1.25.0 github.com/ldez/tagliatelle # github.com/ldez/usetesting v0.5.0 ## explicit; go 1.23.0 @@ -1050,11 +1050,12 @@ github.com/mattn/go-isatty # github.com/mattn/go-runewidth v0.0.24 ## explicit; go 1.20 github.com/mattn/go-runewidth -# github.com/mgechev/revive v1.15.0 -## explicit; go 1.25.0 +# github.com/mgechev/revive v1.17.0 +## explicit; go 1.26.0 github.com/mgechev/revive/config github.com/mgechev/revive/formatter github.com/mgechev/revive/internal/astutils +github.com/mgechev/revive/internal/config github.com/mgechev/revive/internal/ifelse github.com/mgechev/revive/internal/rule github.com/mgechev/revive/internal/syncset @@ -1149,8 +1150,8 @@ github.com/munnerz/goautoneg # github.com/nakabonne/nestif v0.3.1 ## explicit; go 1.15 github.com/nakabonne/nestif -# github.com/nishanths/exhaustive v0.12.0 -## explicit; go 1.18 +# github.com/nishanths/exhaustive v0.13.0 +## explicit; go 1.24.0 github.com/nishanths/exhaustive # github.com/nishanths/predeclared v0.2.2 ## explicit; go 1.14 @@ -1285,7 +1286,7 @@ github.com/quasilyte/regex/syntax # github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 ## explicit; go 1.17 github.com/quasilyte/stdinfo -# github.com/raeperd/recvcheck v0.3.0 +# github.com/raeperd/recvcheck v0.3.1 ## explicit; go 1.25.0 github.com/raeperd/recvcheck # github.com/rivo/uniseg v0.4.7 @@ -1328,8 +1329,8 @@ github.com/sashamelentyev/interfacebloat/pkg/analyzer ## explicit; go 1.23.0 github.com/sashamelentyev/usestdlibvars/pkg/analyzer github.com/sashamelentyev/usestdlibvars/pkg/analyzer/internal/mapping -# github.com/securego/gosec/v2 v2.28.0 -## explicit; go 1.25.8 +# github.com/securego/gosec/v2 v2.29.0 +## explicit; go 1.25.0 github.com/securego/gosec/v2 github.com/securego/gosec/v2/analyzers github.com/securego/gosec/v2/cwe @@ -1337,7 +1338,7 @@ github.com/securego/gosec/v2/internal/ssautil github.com/securego/gosec/v2/issue github.com/securego/gosec/v2/rules github.com/securego/gosec/v2/taint -# github.com/shirou/gopsutil/v4 v4.26.7 +# github.com/shirou/gopsutil/v4 v4.26.8 ## explicit; go 1.24.0 github.com/shirou/gopsutil/v4/common github.com/shirou/gopsutil/v4/cpu @@ -1360,7 +1361,7 @@ github.com/sourcegraph/conc github.com/sourcegraph/conc/internal/multierror github.com/sourcegraph/conc/iter github.com/sourcegraph/conc/panics -# github.com/sourcegraph/go-diff v0.8.0 +# github.com/sourcegraph/go-diff v0.9.0 ## explicit; go 1.20 github.com/sourcegraph/go-diff/diff # github.com/spf13/afero v1.15.0 @@ -1423,11 +1424,11 @@ github.com/testcontainers/testcontainers-go/wait # github.com/tetafro/godot v1.5.6 ## explicit; go 1.22 github.com/tetafro/godot -# github.com/timakin/bodyclose v0.0.0-20260129054331-73d1f95b84b4 +# github.com/timakin/bodyclose v0.0.0-20260723120731-857993a2939c ## explicit; go 1.22 github.com/timakin/bodyclose/passes/bodyclose -# github.com/timonwong/loggercheck v0.11.0 -## explicit; go 1.22.0 +# github.com/timonwong/loggercheck v0.12.0 +## explicit; go 1.25.0 github.com/timonwong/loggercheck github.com/timonwong/loggercheck/internal/checkers github.com/timonwong/loggercheck/internal/checkers/printf @@ -1471,7 +1472,7 @@ github.com/uudashr/iface/unusedmethod # github.com/xen0n/gosmopolitan v1.3.0 ## explicit; go 1.23.0 github.com/xen0n/gosmopolitan -# github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e +# github.com/xo/terminfo v1.0.0 ## explicit; go 1.19 github.com/xo/terminfo # github.com/yagipy/maintidx v1.0.0 @@ -1500,7 +1501,7 @@ go-simpler.org/sloglint # go.augendre.info/arangolint v0.4.0 ## explicit; go 1.24.0 go.augendre.info/arangolint/pkg/analyzer -# go.augendre.info/fatcontext v0.10.0 +# go.augendre.info/fatcontext v0.10.1 ## explicit; go 1.25.0 go.augendre.info/fatcontext/pkg/analyzer # go.opentelemetry.io/auto/sdk v1.2.1 @@ -1979,8 +1980,8 @@ honnef.co/go/tools/stylecheck/st1021 honnef.co/go/tools/stylecheck/st1022 honnef.co/go/tools/stylecheck/st1023 honnef.co/go/tools/unused -# mvdan.cc/gofumpt v0.11.0 -## explicit; go 1.25.0 +# mvdan.cc/gofumpt v0.12.0 +## explicit; go 1.26.0 mvdan.cc/gofumpt/format mvdan.cc/gofumpt/internal/govendor/go/doc/comment mvdan.cc/gofumpt/internal/govendor/go/format diff --git a/vendor/mvdan.cc/gofumpt/format/format.go b/vendor/mvdan.cc/gofumpt/format/format.go index 438a73b5..bc404347 100644 --- a/vendor/mvdan.cc/gofumpt/format/format.go +++ b/vendor/mvdan.cc/gofumpt/format/format.go @@ -566,7 +566,10 @@ func (f *fumpter) applyPre(c *astutil.Cursor) { // Do this after the joining of lone declarations above, // as joining single-line declarations makes then multi-line. var lastMulti bool - var lastEnd token.Pos + // Anchor the first iteration at the package clause, so that the + // comments before it, such as a copyright header or package doc, + // are not mistaken for the first declaration's own comments. + lastEnd := node.Name.End() for _, decl := range node.Decls { pos := decl.Pos() // Trailing inline comments on lastEnd's line belong to the @@ -883,7 +886,9 @@ func (f *fumpter) applyPre(c *astutil.Cursor) { // for simple single-value assignments. Skip multi-value assignments and // binary expressions like long string concatenations, where a line break // after the assignment token can improve readability. - if len(node.Rhs) == 1 { + // Skip comments in between as well, as joining their lines leaves the + // right-hand side at an indentation that gofmt would not produce. + if len(node.Rhs) == 1 && len(f.commentsBetween(node.TokPos, node.Rhs[0].Pos())) == 0 { if _, ok := node.Rhs[0].(*ast.BinaryExpr); !ok { f.removeLines(f.Line(node.TokPos), f.Line(node.Rhs[0].Pos())) } @@ -1222,7 +1227,8 @@ func (f *fumpter) joinStdImports(d *ast.GenDecl) { var std, other []ast.Spec firstGroup := true lastEnd := d.Pos() - needsSort := false + // The original positions of the std imports which we move up. + var movedFrom []token.Pos // If ModulePath is "foo/bar", we assume "foo/..." is not part of std. // Users shouldn't declare modules that may collide with std this way, @@ -1272,9 +1278,13 @@ func (f *fumpter) joinStdImports(d *ast.GenDecl) { // so that the prefix "foo" for "foo/..." does not match "foobar". path == modulePrefix || strings.HasPrefix(path, modulePrefix+"/"), - // To be conservative, if an import has a name or an inline - // comment, and isn't part of the top group, treat it as non-std. - !firstGroup && (spec.Name != nil || spec.Comment != nil): + // To be conservative, if an import has a name + // and isn't part of the top group, treat it as non-std. + !firstGroup && spec.Name != nil, + + // Moving an import leaves its comments behind, as go/printer + // places them by position, so never move a commented import. + (!firstGroup || len(other) > 0) && (spec.Doc != nil || spec.Comment != nil): other = append(other, spec) continue } @@ -1282,11 +1292,19 @@ func (f *fumpter) joinStdImports(d *ast.GenDecl) { // If we're moving this std import further up, reset its // position, to avoid breaking comments. if !firstGroup || len(other) > 0 { + movedFrom = append(movedFrom, spec.Pos()) setPos(reflect.ValueOf(spec), d.Pos()) - needsSort = true } std = append(std, spec) } + // Moving a std import up leaves its line behind with nothing on it, + // which go/printer would then print as an empty line, + // so drop those lines from the file's line table. + for _, pos := range movedFrom { + if line := f.Line(pos); line < f.file.LineCount() { + f.file.MergeLine(line) + } + } // Ensure there is an empty line between std imports and other imports. if len(std) > 0 && len(other) > 0 && f.Line(std[len(std)-1].End())+1 >= f.Line(other[0].Pos()) { // We add two newlines, as that's necessary in some edge cases. @@ -1301,7 +1319,7 @@ func (f *fumpter) joinStdImports(d *ast.GenDecl) { // If we moved any std imports to the first group, we need to sort them // again. - if needsSort { + if len(movedFrom) > 0 { ast.SortImports(f.fset, f.astFile) } } diff --git a/vendor/mvdan.cc/gofumpt/internal/govendor/go/doc/comment/std.go b/vendor/mvdan.cc/gofumpt/internal/govendor/go/doc/comment/std.go index f73690a7..af3884dd 100644 --- a/vendor/mvdan.cc/gofumpt/internal/govendor/go/doc/comment/std.go +++ b/vendor/mvdan.cc/gofumpt/internal/govendor/go/doc/comment/std.go @@ -47,5 +47,6 @@ var stdPkgs = []string{ "unicode", "unique", "unsafe", + "uuid", "weak", } diff --git a/vendor/mvdan.cc/gofumpt/internal/govendor/go/printer/math.go b/vendor/mvdan.cc/gofumpt/internal/govendor/go/printer/math.go new file mode 100644 index 00000000..543a9e99 --- /dev/null +++ b/vendor/mvdan.cc/gofumpt/internal/govendor/go/printer/math.go @@ -0,0 +1,28 @@ +// Copyright 2026 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package printer + +import "math" + +// log2ish returns a crude approximation to log₂(x). +// The result is only used for heuristic alignment decisions and should +// not be used where precision matters. +// The approximation is guaranteed to produce identical results +// across all architectures. +func log2ish(x float64) float64 { + f, e := math.Frexp(x) + return float64(e) + 2*(f-1) +} + +// exp2ish returns a crude approximation to 2**x. +// The result is only used for heuristic alignment decisions and should +// not be used where precision matters. +// The approximation is guaranteed to produce identical results +// across all architectures. +func exp2ish(x float64) float64 { + n := math.Floor(x) + f := x - n + return math.Ldexp(1+f, int(n)) +} diff --git a/vendor/mvdan.cc/gofumpt/internal/govendor/go/printer/nodes.go b/vendor/mvdan.cc/gofumpt/internal/govendor/go/printer/nodes.go index c7d2b0f1..a8bd179d 100644 --- a/vendor/mvdan.cc/gofumpt/internal/govendor/go/printer/nodes.go +++ b/vendor/mvdan.cc/gofumpt/internal/govendor/go/printer/nodes.go @@ -11,7 +11,6 @@ package printer import ( "go/ast" "go/token" - "math" "strconv" "strings" "unicode" @@ -183,9 +182,9 @@ func (p *printer) exprList(prev0 token.Pos, list []ast.Expr, depth int, mode exp // We use the ratio between the geometric mean of the previous key sizes and // the current size to determine if there should be a break in the alignment. - // To compute the geometric mean we accumulate the ln(size) values (lnsum) + // To compute the geometric mean we accumulate the log₂(size) values (log2sum) // and the number of sizes included (count). - lnsum := 0.0 + log2sum := 0.0 count := 0 // print all list elements @@ -228,8 +227,8 @@ func (p *printer) exprList(prev0 token.Pos, list []ast.Expr, depth int, mode exp if count == 0 || prevSize <= smallSize && size <= smallSize { useFF = false } else { - const r = 2.5 // threshold - geomean := math.Exp(lnsum / float64(count)) // count > 0 + const r = 2.5 // threshold + geomean := exp2ish(log2sum / float64(count)) // count > 0 ratio := float64(size) / geomean useFF = r*ratio <= 1 || r <= ratio } @@ -260,7 +259,7 @@ func (p *printer) exprList(prev0 token.Pos, list []ast.Expr, depth int, mode exp // the section), reset the geomean variables since we are // starting a new group of elements with the next element. if nbreaks > 1 { - lnsum = 0 + log2sum = 0 count = 0 } } @@ -284,7 +283,7 @@ func (p *printer) exprList(prev0 token.Pos, list []ast.Expr, depth int, mode exp } if size > 0 { - lnsum += math.Log(float64(size)) + log2sum += log2ish(float64(size)) count++ } @@ -1310,13 +1309,29 @@ func (p *printer) controlClause(isForStmt bool, init ast.Stmt, expr ast.Expr, po } } +// isCompositeLitLike reports whether x is a composite literal or an expression +// whose core is a composite literal (e.g. &T{...}), ignoring parentheses. +func isCompositeLitLike(x ast.Expr) bool { + switch x := stripParensAlways(x).(type) { + case *ast.CompositeLit: + return true + case *ast.UnaryExpr: + _, ok := stripParensAlways(x.X).(*ast.CompositeLit) + return x.Op == token.AND && ok + } + return false +} + // indentList reports whether an expression list would look better if it // were indented wholesale (starting with the very first element, rather // than starting at the first line break). +// Currently this function is only used to improve formatting of return +// statements. func (p *printer) indentList(list []ast.Expr) bool { // Heuristic: indentList reports whether there are more than one multi- - // line element in the list, or if there is any element that is not - // starting on the same line as the previous one ends. + // line element (such as a complex expression, but excluding composite + // literals) in the list, or if there is any element that is not starting + // on the same line as the previous one ends. if len(list) >= 2 { b := p.lineFor(list[0].Pos()) e := p.lineFor(list[len(list)-1].End()) @@ -1332,8 +1347,10 @@ func (p *printer) indentList(list []ast.Expr) bool { // line as the previous one ended return true } - if xb < xe { - // x is a multi-line element + if xb < xe && !isCompositeLitLike(x) { + // x is a multi-line element but not a composite literal + // (composite literals have their own field indentation + // already, see go.dev/issue/7195) n++ } line = xe diff --git a/vendor/mvdan.cc/gofumpt/internal/govendor/go/printer/printer.go b/vendor/mvdan.cc/gofumpt/internal/govendor/go/printer/printer.go index a6c74c72..50bbf6b5 100644 --- a/vendor/mvdan.cc/gofumpt/internal/govendor/go/printer/printer.go +++ b/vendor/mvdan.cc/gofumpt/internal/govendor/go/printer/printer.go @@ -738,7 +738,9 @@ func (p *printer) intersperseComments(next token.Position, tok token.Token) (wro for p.commentBefore(next) { list := p.comment.List changed := false - if p.lastTok != token.IMPORT && // do not rewrite cgo's import "C" comments + + if tok != token.IDENT && + p.lastTok != token.IMPORT && // do not rewrite cgo's import "C" comments p.posFor(p.comment.Pos()).Column == 1 && p.posFor(p.comment.End()+1) == next { // Unindented comment abutting next token position: