From 9b908062703baf13ad7eac2a7237f6c850820983 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 22 Jan 2025 09:58:20 +1000 Subject: [PATCH] cargo.lock file support --- README.md | 1 + dependencies.go | 2 + deplist.go | 13 +- deplist_test.go | 289 +++++++++++++++++++++------------------ internal/scan/rust.go | 34 +++++ test/testRepo/Cargo.lock | 242 ++++++++++++++++++++++++++++++++ 6 files changed, 449 insertions(+), 132 deletions(-) create mode 100644 internal/scan/rust.go create mode 100644 test/testRepo/Cargo.lock diff --git a/README.md b/README.md index b8564dc..82bb8c5 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ Supports: - Python - Ruby - Java + - Rust Dependencies are printed in PackageURL format. diff --git a/dependencies.go b/dependencies.go index 770aca2..94fb994 100644 --- a/dependencies.go +++ b/dependencies.go @@ -39,6 +39,8 @@ func GetLanguageStr(bm Bitmask) string { return "pypi" } else if bm&LangRuby != 0 { return "gem" + } else if bm&LangRust != 0 { + return "cargo" } return "unknown" } diff --git a/deplist.go b/deplist.go index a71fe2d..3b78f17 100644 --- a/deplist.go +++ b/deplist.go @@ -21,6 +21,7 @@ const ( LangNodeJS LangPython LangRuby + LangRust ) func init() { @@ -70,6 +71,7 @@ var defaultIgnore []string = []string{ "scripts", "test", "test_scripts", + "testing", "tests", "vendor", ".git", @@ -166,6 +168,15 @@ func getDeps(fullPath string, ignoreDirs []string) ([]Dependency, Bitmask, error Files: []string{}, }) } + case "Cargo.lock": + pkgs, err := scan.GetCrates(path) + if err != nil { + // ignore error + log.Debugf("failed to scan rust crates: %s", path) + return nil + } + + discovered = addPackagesToDeps(discovered, pkgs, LangRust) default: ext := filepath.Ext(filename) // java @@ -221,7 +232,7 @@ func getDeps(fullPath string, ignoreDirs []string) ([]Dependency, Bitmask, error path = strings.Replace(path, "Gemfile.lock", "Gemfile", 1) // comparisons here are against the full filepath, so will not match if - // these filesames are found in subdirectories, only the top level + // these filenames are found in subdirectories, only the top level switch path { case goPkgPath: pkgs, err := scan.GetGoPkgDeps(path) diff --git a/deplist_test.go b/deplist_test.go index 1d38523..3805e4e 100644 --- a/deplist_test.go +++ b/deplist_test.go @@ -151,126 +151,126 @@ func BuildWant() []Dependency { "d3-interpolate", } - rubySet := []string{ - "concurrent-ruby", - "lru_redux", - "zeitwerk", - "async", - "fluent-plugin-systemd", - "http-parser", - "ltsv", - "public_suffix", - "faraday-multipart", - "fluent-config-regexp-type", - "recursive-open-struct", - "unf_ext", - "aws-eventstream", - "webrick", - "faraday-em_http", - "fluentd", - "yajl-ruby", - "fluent-plugin-elasticsearch", - "faraday-patron", - "mini_mime", - "tzinfo", - "connection_pool", - "fluent-plugin-kubernetes_metadata_filter", - "fluent-plugin-prometheus", - "nio4r", - "oj", - "openid_connect", - "rack", - "sigdump", - "digest-crc", - "ethon", - "multipart-post", - "addressable", - "faraday-net_http_persistent", - "rack-oauth2", - "excon", - "fluent-plugin-label-router", - "bindata", - "fluent-plugin-record-modifier", - "http", - "systemd-journal", - "faraday-retry", - "ruby2_keywords", - "mime-types", - "timers", - "unf", - "fluent-plugin-detect-exceptions", - "jsonpath", - "rake", - "validate_email", - "aws-sdk-cloudwatchlogs", - "jmespath", - "prometheus-client", - "protocol-http1", - "ffi", - "fluent-plugin-grafana-loki", - "bigdecimal", - "protocol-http", - "aws-partitions", - "faraday-httpclient", - "fluent-plugin-multi-format-parser", - "http_parser.rb", - "protocol-http2", - "rest-client", - "activesupport", - "ffi-compiler", - "fluent-plugin-splunk-hec", - "json-jwt", - "msgpack", - "protocol-hpack", - "strptime", - "validate_url", - "faraday", - "async-pool", - "faraday-net_http", - "fluent-plugin-concat", - "fluent-plugin-kafka", - "multi_json", - "net-http-persistent", - "uuidtools", - "activemodel", - "elasticsearch-transport", - "mail", - "ruby-kafka", - "serverengine", - "tzinfo-data", - "webfinger", - "aws-sigv4", - "elasticsearch-api", - "fiber-local", - "fluent-plugin-remote-syslog", - "attr_required", - "http-form_data", - "syslog_protocol", - "faraday-em_synchrony", - "httpclient", - "fluent-mixin-config-placeholders", - "fluent-plugin-cloudwatch-logs", - "i18n", - "async-io", - "elasticsearch", - "http-cookie", - "kubeclient", - "minitest", - "aes_key_wrap", - "mime-types-data", - "netrc", - "console", - "cool.io", - "domain_name", - "async-http", - "http-accept", - "traces", - "typhoeus", - "faraday-rack", - "faraday-excon", - "fluent-plugin-rewrite-tag-filter", - "swd", - "aws-sdk-core", + rubySet := []Dependency{ + {DepType: LangRuby, Path: "concurrent-ruby"}, + {DepType: LangRuby, Path: "lru_redux"}, + {DepType: LangRuby, Path: "zeitwerk"}, + {DepType: LangRuby, Path: "async"}, + {DepType: LangRuby, Path: "fluent-plugin-systemd"}, + {DepType: LangRuby, Path: "http-parser"}, + {DepType: LangRuby, Path: "ltsv"}, + {DepType: LangRuby, Path: "public_suffix"}, + {DepType: LangRuby, Path: "faraday-multipart"}, + {DepType: LangRuby, Path: "fluent-config-regexp-type"}, + {DepType: LangRuby, Path: "recursive-open-struct"}, + {DepType: LangRuby, Path: "unf_ext"}, + {DepType: LangRuby, Path: "aws-eventstream"}, + {DepType: LangRuby, Path: "webrick"}, + {DepType: LangRuby, Path: "faraday-em_http"}, + {DepType: LangRuby, Path: "fluentd"}, + {DepType: LangRuby, Path: "yajl-ruby"}, + {DepType: LangRuby, Path: "fluent-plugin-elasticsearch"}, + {DepType: LangRuby, Path: "faraday-patron"}, + {DepType: LangRuby, Path: "mini_mime"}, + {DepType: LangRuby, Path: "tzinfo"}, + {DepType: LangRuby, Path: "connection_pool"}, + {DepType: LangRuby, Path: "fluent-plugin-kubernetes_metadata_filter"}, + {DepType: LangRuby, Path: "fluent-plugin-prometheus"}, + {DepType: LangRuby, Path: "nio4r"}, + {DepType: LangRuby, Path: "oj"}, + {DepType: LangRuby, Path: "openid_connect"}, + {DepType: LangRuby, Path: "rack"}, + {DepType: LangRuby, Path: "sigdump"}, + {DepType: LangRuby, Path: "digest-crc"}, + {DepType: LangRuby, Path: "ethon"}, + {DepType: LangRuby, Path: "multipart-post"}, + {DepType: LangRuby, Path: "addressable"}, + {DepType: LangRuby, Path: "faraday-net_http_persistent"}, + {DepType: LangRuby, Path: "rack-oauth2"}, + {DepType: LangRuby, Path: "excon"}, + {DepType: LangRuby, Path: "fluent-plugin-label-router"}, + {DepType: LangRuby, Path: "bindata"}, + {DepType: LangRuby, Path: "fluent-plugin-record-modifier"}, + {DepType: LangRuby, Path: "http"}, + {DepType: LangRuby, Path: "systemd-journal"}, + {DepType: LangRuby, Path: "faraday-retry"}, + {DepType: LangRuby, Path: "ruby2_keywords"}, + {DepType: LangRuby, Path: "mime-types"}, + {DepType: LangRuby, Path: "timers"}, + {DepType: LangRuby, Path: "unf"}, + {DepType: LangRuby, Path: "fluent-plugin-detect-exceptions"}, + {DepType: LangRuby, Path: "jsonpath"}, + {DepType: LangRuby, Path: "rake"}, + {DepType: LangRuby, Path: "validate_email"}, + {DepType: LangRuby, Path: "aws-sdk-cloudwatchlogs"}, + {DepType: LangRuby, Path: "jmespath"}, + {DepType: LangRuby, Path: "prometheus-client"}, + {DepType: LangRuby, Path: "protocol-http1"}, + {DepType: LangRuby, Path: "ffi"}, + {DepType: LangRuby, Path: "fluent-plugin-grafana-loki"}, + {DepType: LangRuby, Path: "bigdecimal"}, + {DepType: LangRuby, Path: "protocol-http"}, + {DepType: LangRuby, Path: "aws-partitions"}, + {DepType: LangRuby, Path: "faraday-httpclient"}, + {DepType: LangRuby, Path: "fluent-plugin-multi-format-parser"}, + {DepType: LangRuby, Path: "http_parser.rb"}, + {DepType: LangRuby, Path: "protocol-http2"}, + {DepType: LangRuby, Path: "rest-client"}, + {DepType: LangRuby, Path: "activesupport"}, + {DepType: LangRuby, Path: "ffi-compiler"}, + {DepType: LangRuby, Path: "fluent-plugin-splunk-hec"}, + {DepType: LangRuby, Path: "json-jwt"}, + {DepType: LangRuby, Path: "msgpack"}, + {DepType: LangRuby, Path: "protocol-hpack"}, + {DepType: LangRuby, Path: "strptime"}, + {DepType: LangRuby, Path: "validate_url"}, + {DepType: LangRuby, Path: "faraday"}, + {DepType: LangRuby, Path: "async-pool"}, + {DepType: LangRuby, Path: "faraday-net_http"}, + {DepType: LangRuby, Path: "fluent-plugin-concat"}, + {DepType: LangRuby, Path: "fluent-plugin-kafka"}, + {DepType: LangRuby, Path: "multi_json"}, + {DepType: LangRuby, Path: "net-http-persistent"}, + {DepType: LangRuby, Path: "uuidtools"}, + {DepType: LangRuby, Path: "activemodel"}, + {DepType: LangRuby, Path: "elasticsearch-transport"}, + {DepType: LangRuby, Path: "mail"}, + {DepType: LangRuby, Path: "ruby-kafka"}, + {DepType: LangRuby, Path: "serverengine"}, + {DepType: LangRuby, Path: "tzinfo-data"}, + {DepType: LangRuby, Path: "webfinger"}, + {DepType: LangRuby, Path: "aws-sigv4"}, + {DepType: LangRuby, Path: "elasticsearch-api"}, + {DepType: LangRuby, Path: "fiber-local"}, + {DepType: LangRuby, Path: "fluent-plugin-remote-syslog"}, + {DepType: LangRuby, Path: "attr_required"}, + {DepType: LangRuby, Path: "http-form_data"}, + {DepType: LangRuby, Path: "syslog_protocol"}, + {DepType: LangRuby, Path: "faraday-em_synchrony"}, + {DepType: LangRuby, Path: "httpclient"}, + {DepType: LangRuby, Path: "fluent-mixin-config-placeholders"}, + {DepType: LangRuby, Path: "fluent-plugin-cloudwatch-logs"}, + {DepType: LangRuby, Path: "i18n"}, + {DepType: LangRuby, Path: "async-io"}, + {DepType: LangRuby, Path: "elasticsearch"}, + {DepType: LangRuby, Path: "http-cookie"}, + {DepType: LangRuby, Path: "kubeclient"}, + {DepType: LangRuby, Path: "minitest"}, + {DepType: LangRuby, Path: "aes_key_wrap"}, + {DepType: LangRuby, Path: "mime-types-data"}, + {DepType: LangRuby, Path: "netrc"}, + {DepType: LangRuby, Path: "console"}, + {DepType: LangRuby, Path: "cool.io"}, + {DepType: LangRuby, Path: "domain_name"}, + {DepType: LangRuby, Path: "async-http"}, + {DepType: LangRuby, Path: "http-accept"}, + {DepType: LangRuby, Path: "traces"}, + {DepType: LangRuby, Path: "typhoeus"}, + {DepType: LangRuby, Path: "faraday-rack"}, + {DepType: LangRuby, Path: "faraday-excon"}, + {DepType: LangRuby, Path: "fluent-plugin-rewrite-tag-filter"}, + {DepType: LangRuby, Path: "swd"}, + {DepType: LangRuby, Path: "aws-sdk-core"}, } pythonSet := []Dependency{ @@ -290,6 +290,38 @@ func BuildWant() []Dependency { {DepType: LangPython, Path: "m2crypto"}, } + rustSet := []Dependency{ + {DepType: LangRust, Path: "cc", Version: "1.0.79"}, + {DepType: LangRust, Path: "hermit-abi", Version: "0.3.1"}, + {DepType: LangRust, Path: "num-traits", Version: "0.2.15"}, + {DepType: LangRust, Path: "windows-sys", Version: "0.48.0"}, + {DepType: LangRust, Path: "bitflags", Version: "1.3.2"}, + {DepType: LangRust, Path: "io-uring", Version: "0.6.0"}, + {DepType: LangRust, Path: "memmap2", Version: "0.5.10"}, + {DepType: LangRust, Path: "rustix", Version: "0.37.15"}, + {DepType: LangRust, Path: "autocfg", Version: "1.1.0"}, + {DepType: LangRust, Path: "paste", Version: "1.0.12"}, + {DepType: LangRust, Path: "virtio-bindings", Version: "0.2.0"}, + {DepType: LangRust, Path: "windows_aarch64_gnullvm", Version: "0.48.0"}, + {DepType: LangRust, Path: "libc", Version: "0.2.142"}, + {DepType: LangRust, Path: "lazy_static", Version: "1.4.0"}, + {DepType: LangRust, Path: "virtio-driver", Version: "0.5.0"}, + {DepType: LangRust, Path: "windows-targets", Version: "0.48.0"}, + {DepType: LangRust, Path: "errno", Version: "0.3.1"}, + {DepType: LangRust, Path: "io-lifetimes", Version: "1.0.10"}, + {DepType: LangRust, Path: "windows_aarch64_msvc", Version: "0.48.0"}, + {DepType: LangRust, Path: "windows_i686_msvc", Version: "0.48.0"}, + {DepType: LangRust, Path: "blkio", Version: "0.4.0"}, + {DepType: LangRust, Path: "linux-raw-sys", Version: "0.3.4"}, + {DepType: LangRust, Path: "windows_i686_gnu", Version: "0.48.0"}, + {DepType: LangRust, Path: "errno-dragonfly", Version: "0.1.2"}, + {DepType: LangRust, Path: "windows_x86_64_gnu", Version: "0.48.0"}, + {DepType: LangRust, Path: "libblkio", Version: "1.3.0"}, + {DepType: LangRust, Path: "windows_x86_64_gnullvm", Version: "0.48.0"}, + {DepType: LangRust, Path: "windows_x86_64_msvc", Version: "0.48.0"}, + {DepType: LangRust, Path: "pci-driver", Version: "0.1.3"}, + } + for _, n := range golangPaths { d := Dependency{ DepType: 1, @@ -327,17 +359,11 @@ func BuildWant() []Dependency { } deps = append(deps, d) } - deps = append(deps, Dependency{DepType: 2, Path: "com.amazonaws:aws-lambda-java-core:jar", Version: "1.0.0"}) // java - - for _, n := range rubySet { - d := Dependency{ - DepType: LangRuby, - Path: n, - } - deps = append(deps, d) - } + deps = append(deps, Dependency{DepType: 2, Path: "com.amazonaws:aws-lambda-java-core:jar", Version: "1.0.0"}) // java + deps = append(deps, rubySet...) deps = append(deps, pythonSet...) + deps = append(deps, rustSet...) return deps } @@ -358,8 +384,9 @@ func TestGetDeps(t *testing.T) { return } - if gotBitmask != 31 { - t.Errorf("GotBitmask() != 31; got: %d", gotBitmask) + expectedBitmask := 63 + if gotBitmask != Bitmask(expectedBitmask) { + t.Errorf("GotBitmask() != %d; got: %d", expectedBitmask, gotBitmask) } gotMap := make(map[string]Dependency) diff --git a/internal/scan/rust.go b/internal/scan/rust.go new file mode 100644 index 0000000..58690f9 --- /dev/null +++ b/internal/scan/rust.go @@ -0,0 +1,34 @@ +package scan + +import ( + "github.com/BurntSushi/toml" + log "github.com/sirupsen/logrus" +) + +type cargoLockPackage struct { + Name string `toml:"name"` + Version string `toml:"version"` +} + +type cargoLockFile struct { + Version int `toml:"version"` + Packages []cargoLockPackage `toml:"package"` +} + +func GetCrates(cargoLockPath string) (map[string]string, error) { + log.Debugf("GetCrates %s", cargoLockPath) + gathered := make(map[string]string) + + var cargoLock cargoLockFile + _, err := toml.DecodeFile(cargoLockPath, &cargoLock) + if err != nil { + log.Errorf("Failed to parse %s", cargoLockPath) + return nil, err + } + + for _, lockPackage := range cargoLock.Packages { + gathered[lockPackage.Name] = lockPackage.Version + } + + return gathered, nil +} diff --git a/test/testRepo/Cargo.lock b/test/testRepo/Cargo.lock new file mode 100644 index 0000000..3000431 --- /dev/null +++ b/test/testRepo/Cargo.lock @@ -0,0 +1,242 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "blkio" +version = "0.4.0" +dependencies = [ + "bitflags", + "io-uring", + "lazy_static", + "libc", + "paste", + "pci-driver", + "rustix", + "virtio-driver", +] + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "io-lifetimes" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys", +] + +[[package]] +name = "io-uring" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b7b36074613a723279637061b40db993208908a94f10ccb14436ce735bc0f57" +dependencies = [ + "bitflags", + "libc", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libblkio" +version = "1.3.0" +dependencies = [ + "blkio", + "cc", + "libc", +] + +[[package]] +name = "libc" +version = "0.2.142" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" + +[[package]] +name = "linux-raw-sys" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "paste" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" + +[[package]] +name = "pci-driver" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee69f11b9613f88aaec808f614e0c8d63c9111a2cf3178a3134c5d900531dba2" +dependencies = [ + "libc", + "num-traits", +] + +[[package]] +name = "rustix" +version = "0.37.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0661814f891c57c930a610266415528da53c4933e6dea5fb350cbfe048a9ece" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "virtio-bindings" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9084faf91b9aa9676ae2cac8f1432df2839d9566e6f19f29dbc13a8b831dff" + +[[package]] +name = "virtio-driver" +version = "0.5.0" +dependencies = [ + "bitflags", + "libc", + "memmap2", + "pci-driver", + "rustix", + "virtio-bindings", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"