mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 18:13:42 +08:00 
			
		
		
		
	Merge pull request #389 from tonistiigi/buildkit-update-20200913
vendor: update buildkit with typed errors support
This commit is contained in:
		@@ -10,7 +10,7 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ParseSecretSpecs(sl []string) (session.Attachable, error) {
 | 
					func ParseSecretSpecs(sl []string) (session.Attachable, error) {
 | 
				
			||||||
	fs := make([]secretsprovider.FileSource, 0, len(sl))
 | 
						fs := make([]secretsprovider.Source, 0, len(sl))
 | 
				
			||||||
	for _, v := range sl {
 | 
						for _, v := range sl {
 | 
				
			||||||
		s, err := parseSecret(v)
 | 
							s, err := parseSecret(v)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
@@ -18,21 +18,21 @@ func ParseSecretSpecs(sl []string) (session.Attachable, error) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		fs = append(fs, *s)
 | 
							fs = append(fs, *s)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	store, err := secretsprovider.NewFileStore(fs)
 | 
						store, err := secretsprovider.NewStore(fs)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return secretsprovider.NewSecretProvider(store), nil
 | 
						return secretsprovider.NewSecretProvider(store), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func parseSecret(value string) (*secretsprovider.FileSource, error) {
 | 
					func parseSecret(value string) (*secretsprovider.Source, error) {
 | 
				
			||||||
	csvReader := csv.NewReader(strings.NewReader(value))
 | 
						csvReader := csv.NewReader(strings.NewReader(value))
 | 
				
			||||||
	fields, err := csvReader.Read()
 | 
						fields, err := csvReader.Read()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errors.Wrap(err, "failed to parse csv secret")
 | 
							return nil, errors.Wrap(err, "failed to parse csv secret")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fs := secretsprovider.FileSource{}
 | 
						fs := secretsprovider.Source{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, field := range fields {
 | 
						for _, field := range fields {
 | 
				
			||||||
		parts := strings.SplitN(field, "=", 2)
 | 
							parts := strings.SplitN(field, "=", 2)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,11 +7,14 @@ import (
 | 
				
			|||||||
	"github.com/containerd/containerd/pkg/seed"
 | 
						"github.com/containerd/containerd/pkg/seed"
 | 
				
			||||||
	"github.com/docker/buildx/commands"
 | 
						"github.com/docker/buildx/commands"
 | 
				
			||||||
	"github.com/docker/buildx/version"
 | 
						"github.com/docker/buildx/version"
 | 
				
			||||||
 | 
						"github.com/docker/cli/cli"
 | 
				
			||||||
	"github.com/docker/cli/cli-plugins/manager"
 | 
						"github.com/docker/cli/cli-plugins/manager"
 | 
				
			||||||
	"github.com/docker/cli/cli-plugins/plugin"
 | 
						"github.com/docker/cli/cli-plugins/plugin"
 | 
				
			||||||
	"github.com/docker/cli/cli/command"
 | 
						"github.com/docker/cli/cli/command"
 | 
				
			||||||
 | 
						"github.com/docker/cli/cli/debug"
 | 
				
			||||||
	cliflags "github.com/docker/cli/cli/flags"
 | 
						cliflags "github.com/docker/cli/cli/flags"
 | 
				
			||||||
	"github.com/spf13/cobra"
 | 
						"github.com/moby/buildkit/solver/errdefs"
 | 
				
			||||||
 | 
						"github.com/moby/buildkit/util/stack"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// FIXME: "k8s.io/client-go/plugin/pkg/client/auth/azure" is excluded because of compilation error
 | 
						// FIXME: "k8s.io/client-go/plugin/pkg/client/auth/azure" is excluded because of compilation error
 | 
				
			||||||
	_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
 | 
						_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
 | 
				
			||||||
@@ -27,6 +30,7 @@ var experimental string
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
	seed.WithTimeAndRand()
 | 
						seed.WithTimeAndRand()
 | 
				
			||||||
 | 
						stack.SetVersionInfo(version.Version, version.Revision)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main() {
 | 
					func main() {
 | 
				
			||||||
@@ -47,13 +51,42 @@ func main() {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	plugin.Run(func(dockerCli command.Cli) *cobra.Command {
 | 
						dockerCli, err := command.NewDockerCli()
 | 
				
			||||||
		return commands.NewRootCmd("buildx", true, dockerCli)
 | 
						if err != nil {
 | 
				
			||||||
	},
 | 
							fmt.Fprintln(os.Stderr, err)
 | 
				
			||||||
		manager.Metadata{
 | 
							os.Exit(1)
 | 
				
			||||||
			SchemaVersion: "0.1.0",
 | 
						}
 | 
				
			||||||
			Vendor:        "Docker Inc.",
 | 
					
 | 
				
			||||||
			Version:       version.Version,
 | 
						p := commands.NewRootCmd("buildx", true, dockerCli)
 | 
				
			||||||
			Experimental:  experimental != "",
 | 
						meta := manager.Metadata{
 | 
				
			||||||
		})
 | 
							SchemaVersion: "0.1.0",
 | 
				
			||||||
 | 
							Vendor:        "Docker Inc.",
 | 
				
			||||||
 | 
							Version:       version.Version,
 | 
				
			||||||
 | 
							Experimental:  experimental != "",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := plugin.RunPlugin(dockerCli, p, meta); err != nil {
 | 
				
			||||||
 | 
							if sterr, ok := err.(cli.StatusError); ok {
 | 
				
			||||||
 | 
								if sterr.Status != "" {
 | 
				
			||||||
 | 
									fmt.Fprintln(dockerCli.Err(), sterr.Status)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								// StatusError should only be used for errors, and all errors should
 | 
				
			||||||
 | 
								// have a non-zero exit status, so never exit with 0
 | 
				
			||||||
 | 
								if sterr.StatusCode == 0 {
 | 
				
			||||||
 | 
									os.Exit(1)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								os.Exit(sterr.StatusCode)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							for _, s := range errdefs.Sources(err) {
 | 
				
			||||||
 | 
								s.Print(dockerCli.Err())
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if debug.IsEnabled() {
 | 
				
			||||||
 | 
								fmt.Fprintf(dockerCli.Err(), "error: %+v", stack.Formatter(err))
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								fmt.Fprintf(dockerCli.Err(), "error: %v\n", err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							os.Exit(1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -263,7 +263,7 @@ func (d *Driver) Client(ctx context.Context) (*client.Client, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	conn = demuxConn(conn)
 | 
						conn = demuxConn(conn)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return client.New(ctx, "", client.WithDialer(func(string, time.Duration) (net.Conn, error) {
 | 
						return client.New(ctx, "", client.WithContextDialer(func(context.Context, string) (net.Conn, error) {
 | 
				
			||||||
		return conn, nil
 | 
							return conn, nil
 | 
				
			||||||
	}))
 | 
						}))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,6 @@ package docker
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"time"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/docker/buildx/driver"
 | 
						"github.com/docker/buildx/driver"
 | 
				
			||||||
	"github.com/docker/buildx/util/progress"
 | 
						"github.com/docker/buildx/util/progress"
 | 
				
			||||||
@@ -39,7 +38,7 @@ func (d *Driver) Rm(ctx context.Context, force bool) error {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (d *Driver) Client(ctx context.Context) (*client.Client, error) {
 | 
					func (d *Driver) Client(ctx context.Context) (*client.Client, error) {
 | 
				
			||||||
	return client.New(ctx, "", client.WithDialer(func(string, time.Duration) (net.Conn, error) {
 | 
						return client.New(ctx, "", client.WithContextDialer(func(context.Context, string) (net.Conn, error) {
 | 
				
			||||||
		return d.DockerAPI.DialHijack(ctx, "/grpc", "h2c", nil)
 | 
							return d.DockerAPI.DialHijack(ctx, "/grpc", "h2c", nil)
 | 
				
			||||||
	}))
 | 
						}))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -162,7 +162,7 @@ func (d *Driver) Client(ctx context.Context) (*client.Client, error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return client.New(ctx, "", client.WithDialer(func(string, time.Duration) (net.Conn, error) {
 | 
						return client.New(ctx, "", client.WithContextDialer(func(context.Context, string) (net.Conn, error) {
 | 
				
			||||||
		return conn, nil
 | 
							return conn, nil
 | 
				
			||||||
	}))
 | 
						}))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										38
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								go.mod
									
									
									
									
									
								
							@@ -1,29 +1,30 @@
 | 
				
			|||||||
module github.com/docker/buildx
 | 
					module github.com/docker/buildx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect
 | 
					 | 
				
			||||||
	github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 // indirect
 | 
						github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 // indirect
 | 
				
			||||||
	github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 // indirect
 | 
						github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 // indirect
 | 
				
			||||||
	github.com/bugsnag/bugsnag-go v1.4.1 // indirect
 | 
						github.com/bugsnag/bugsnag-go v1.4.1 // indirect
 | 
				
			||||||
	github.com/bugsnag/panicwrap v1.2.0 // indirect
 | 
						github.com/bugsnag/panicwrap v1.2.0 // indirect
 | 
				
			||||||
	github.com/cenkalti/backoff v2.1.1+incompatible // indirect
 | 
						github.com/cenkalti/backoff v2.1.1+incompatible // indirect
 | 
				
			||||||
	github.com/cloudflare/cfssl v0.0.0-20181213083726-b94e044bb51e // indirect
 | 
						github.com/cloudflare/cfssl v0.0.0-20181213083726-b94e044bb51e // indirect
 | 
				
			||||||
	github.com/containerd/console v0.0.0-20191219165238-8375c3424e4d
 | 
						github.com/containerd/console v1.0.0
 | 
				
			||||||
	github.com/containerd/containerd v1.4.0-0
 | 
						github.com/containerd/containerd v1.4.1-0.20200903181227-d4e78200d6da
 | 
				
			||||||
	github.com/denisenkom/go-mssqldb v0.0.0-20190315220205-a8ed825ac853 // indirect
 | 
						github.com/denisenkom/go-mssqldb v0.0.0-20190315220205-a8ed825ac853 // indirect
 | 
				
			||||||
	github.com/docker/cli v0.0.0-20200227165822-2298e6a3fe24
 | 
						github.com/docker/cli v0.0.0-20200911150641-2955ece02443
 | 
				
			||||||
	github.com/docker/compose-on-kubernetes v0.4.19-0.20190128150448-356b2919c496 // indirect
 | 
						github.com/docker/compose-on-kubernetes v0.4.19-0.20190128150448-356b2919c496 // indirect
 | 
				
			||||||
	github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible
 | 
						github.com/docker/distribution v2.7.1+incompatible
 | 
				
			||||||
	github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c
 | 
						github.com/docker/docker v0.0.0
 | 
				
			||||||
	github.com/docker/docker-credential-helpers v0.6.1 // indirect
 | 
						github.com/docker/docker-credential-helpers v0.6.1 // indirect
 | 
				
			||||||
	github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect
 | 
						github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect
 | 
				
			||||||
	github.com/docker/go-connections v0.4.0 // indirect
 | 
						github.com/docker/go-connections v0.4.0 // indirect
 | 
				
			||||||
 | 
						github.com/docker/go-metrics v0.0.1 // indirect
 | 
				
			||||||
	github.com/docker/libtrust v0.0.0-20150526203908-9cbd2a1374f4 // indirect
 | 
						github.com/docker/libtrust v0.0.0-20150526203908-9cbd2a1374f4 // indirect
 | 
				
			||||||
	github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c // indirect
 | 
						github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c // indirect
 | 
				
			||||||
	github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 // indirect
 | 
						github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 // indirect
 | 
				
			||||||
	github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 // indirect
 | 
						github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 // indirect
 | 
				
			||||||
 | 
						github.com/fvbommel/sortorder v1.0.1 // indirect
 | 
				
			||||||
	github.com/go-sql-driver/mysql v1.4.1 // indirect
 | 
						github.com/go-sql-driver/mysql v1.4.1 // indirect
 | 
				
			||||||
	github.com/gofrs/flock v0.7.2
 | 
						github.com/gofrs/flock v0.7.3
 | 
				
			||||||
	github.com/gofrs/uuid v3.2.0+incompatible // indirect
 | 
						github.com/gofrs/uuid v3.2.0+incompatible // indirect
 | 
				
			||||||
	github.com/google/certificate-transparency-go v1.0.21 // indirect
 | 
						github.com/google/certificate-transparency-go v1.0.21 // indirect
 | 
				
			||||||
	github.com/google/shlex v0.0.0-20150127133951-6f45313302b9
 | 
						github.com/google/shlex v0.0.0-20150127133951-6f45313302b9
 | 
				
			||||||
@@ -36,22 +37,22 @@ require (
 | 
				
			|||||||
	github.com/jinzhu/now v1.0.0 // indirect
 | 
						github.com/jinzhu/now v1.0.0 // indirect
 | 
				
			||||||
	github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
 | 
						github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
 | 
				
			||||||
	github.com/lib/pq v1.0.0 // indirect
 | 
						github.com/lib/pq v1.0.0 // indirect
 | 
				
			||||||
	github.com/mattn/go-shellwords v1.0.5 // indirect
 | 
					 | 
				
			||||||
	github.com/mattn/go-sqlite3 v1.10.0 // indirect
 | 
						github.com/mattn/go-sqlite3 v1.10.0 // indirect
 | 
				
			||||||
	github.com/miekg/pkcs11 v0.0.0-20190322140431-074fd7a1ed19 // indirect
 | 
						github.com/miekg/pkcs11 v0.0.0-20190322140431-074fd7a1ed19 // indirect
 | 
				
			||||||
	github.com/moby/buildkit v0.7.2
 | 
						github.com/moby/buildkit v0.7.1-0.20200914033518-a2563079f719
 | 
				
			||||||
	github.com/opencontainers/go-digest v1.0.0-rc1
 | 
						github.com/moby/term v0.0.0-20200911173544-4fc2018d01d9 // indirect
 | 
				
			||||||
 | 
						github.com/opencontainers/go-digest v1.0.0
 | 
				
			||||||
	github.com/opencontainers/image-spec v1.0.1
 | 
						github.com/opencontainers/image-spec v1.0.1
 | 
				
			||||||
	github.com/opencontainers/selinux v1.3.3 // indirect
 | 
					 | 
				
			||||||
	github.com/pkg/errors v0.9.1
 | 
						github.com/pkg/errors v0.9.1
 | 
				
			||||||
 | 
						github.com/prometheus/client_golang v1.7.1 // indirect
 | 
				
			||||||
	github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002
 | 
						github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002
 | 
				
			||||||
	github.com/sirupsen/logrus v1.6.0
 | 
						github.com/sirupsen/logrus v1.6.0
 | 
				
			||||||
	github.com/spf13/cobra v1.0.0
 | 
						github.com/spf13/cobra v1.0.0
 | 
				
			||||||
	github.com/spf13/pflag v1.0.5
 | 
						github.com/spf13/pflag v1.0.5
 | 
				
			||||||
	github.com/stretchr/testify v1.4.0
 | 
						github.com/stretchr/testify v1.5.1
 | 
				
			||||||
	github.com/theupdateframework/notary v0.6.1 // indirect
 | 
						github.com/theupdateframework/notary v0.6.1 // indirect
 | 
				
			||||||
	github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea
 | 
						github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea
 | 
				
			||||||
	github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1 // indirect
 | 
						github.com/xeipuuv/gojsonschema v1.2.0 // indirect
 | 
				
			||||||
	github.com/zclconf/go-cty v1.4.0
 | 
						github.com/zclconf/go-cty v1.4.0
 | 
				
			||||||
	golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e
 | 
						golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e
 | 
				
			||||||
	gopkg.in/dancannon/gorethink.v3 v3.0.5 // indirect
 | 
						gopkg.in/dancannon/gorethink.v3 v3.0.5 // indirect
 | 
				
			||||||
@@ -60,13 +61,16 @@ require (
 | 
				
			|||||||
	k8s.io/api v0.16.7
 | 
						k8s.io/api v0.16.7
 | 
				
			||||||
	k8s.io/apimachinery v0.16.7
 | 
						k8s.io/apimachinery v0.16.7
 | 
				
			||||||
	k8s.io/client-go v0.16.7
 | 
						k8s.io/client-go v0.16.7
 | 
				
			||||||
	vbom.ml/util v0.0.0-20180919145318-efcd4e0f9787 // indirect
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
replace github.com/containerd/containerd => github.com/containerd/containerd v1.3.1-0.20200227195959-4d242818bf55
 | 
					replace github.com/docker/docker => github.com/docker/docker v17.12.0-ce-rc1.0.20200310163718-4634ce647cf2+incompatible
 | 
				
			||||||
 | 
					 | 
				
			||||||
replace github.com/docker/docker => github.com/docker/docker v1.4.2-0.20200227233006-38f52c9fec82
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
replace github.com/jaguilar/vt100 => github.com/tonistiigi/vt100 v0.0.0-20190402012908-ad4c4a574305
 | 
					replace github.com/jaguilar/vt100 => github.com/tonistiigi/vt100 v0.0.0-20190402012908-ad4c4a574305
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// protobuf: corresponds to containerd
 | 
				
			||||||
 | 
					replace github.com/golang/protobuf => github.com/golang/protobuf v1.3.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// latest x/sys fails to build containerd/console
 | 
				
			||||||
 | 
					replace golang.org/x/sys => golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go 1.13
 | 
					go 1.13
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										298
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										298
									
								
								go.sum
									
									
									
									
									
								
							@@ -1,10 +1,9 @@
 | 
				
			|||||||
bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
 | 
					bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
 | 
				
			||||||
cloud.google.com/go v0.26.0 h1:e0WKqKTd5BnrG8aKH3J3h+QvEIQtSUcf2n5UZ5ZgLtQ=
 | 
					 | 
				
			||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
					cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
				
			||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
					cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
				
			||||||
cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo=
 | 
					cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo=
 | 
				
			||||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
 | 
					cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
 | 
				
			||||||
github.com/AkihiroSuda/containerd-fuse-overlayfs v0.0.0-20200220082720-bb896865146c/go.mod h1:K4kx7xAA5JimeQCnN+dbeLlfaBxzZLaLiDD8lusFI8w=
 | 
					github.com/AkihiroSuda/containerd-fuse-overlayfs v0.10.0/go.mod h1:0mMDvQFeLbbn1Wy8P2j3hwFhqBq+FKn8OZPno8WLmp8=
 | 
				
			||||||
github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
 | 
					github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
 | 
				
			||||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=
 | 
					github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=
 | 
				
			||||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
 | 
					github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
 | 
				
			||||||
@@ -18,14 +17,13 @@ github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6L
 | 
				
			|||||||
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
 | 
					github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
 | 
				
			||||||
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 | 
					github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 | 
				
			||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
					github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
				
			||||||
github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
 | 
					 | 
				
			||||||
github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU=
 | 
					 | 
				
			||||||
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
 | 
					 | 
				
			||||||
github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA=
 | 
					github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA=
 | 
				
			||||||
github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
 | 
					github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
 | 
				
			||||||
github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
 | 
					 | 
				
			||||||
github.com/Microsoft/hcsshim v0.8.7 h1:ptnOoufxGSzauVTsdE+wMYnCWA301PdoN4xg5oRdZpg=
 | 
					 | 
				
			||||||
github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ=
 | 
					github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ=
 | 
				
			||||||
 | 
					github.com/Microsoft/hcsshim v0.8.9 h1:VrfodqvztU8YSOvygU+DN1BGaSGxmrNfqOv5oOuX2Bk=
 | 
				
			||||||
 | 
					github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8=
 | 
				
			||||||
 | 
					github.com/Microsoft/hcsshim/test v0.0.0-20200815005529-6735787a4e85 h1:eZbRggdK/z6AA84NSYUnePpCLJ4nHB/dllWNDfJhLRY=
 | 
				
			||||||
 | 
					github.com/Microsoft/hcsshim/test v0.0.0-20200815005529-6735787a4e85/go.mod h1:30A5igQ91GEmhYJF8TaRP79pMBOYynRsyOByfVV0dU4=
 | 
				
			||||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 | 
					github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 | 
				
			||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 | 
					github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 | 
				
			||||||
github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
					github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
				
			||||||
@@ -37,7 +35,9 @@ github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki
 | 
				
			|||||||
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 h1:w1UutsfOrms1J05zt7ISrnJIXKzwaspym5BTKGx93EI=
 | 
					github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 h1:w1UutsfOrms1J05zt7ISrnJIXKzwaspym5BTKGx93EI=
 | 
				
			||||||
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0=
 | 
					github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0=
 | 
				
			||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 | 
					github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 | 
				
			||||||
 | 
					github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 | 
				
			||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 | 
					github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 | 
				
			||||||
 | 
					github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 | 
				
			||||||
github.com/apache/thrift v0.0.0-20161221203622-b2a4d4ae21c7/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
 | 
					github.com/apache/thrift v0.0.0-20161221203622-b2a4d4ae21c7/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
 | 
				
			||||||
github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
 | 
					github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
 | 
				
			||||||
github.com/apparentlymart/go-textseg v1.0.0 h1:rRmlIsPEEhUTIKQb7T++Nz/A5Q6C9IuX2wFoYVvnCs0=
 | 
					github.com/apparentlymart/go-textseg v1.0.0 h1:rRmlIsPEEhUTIKQb7T++Nz/A5Q6C9IuX2wFoYVvnCs0=
 | 
				
			||||||
@@ -47,10 +47,10 @@ github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJE
 | 
				
			|||||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 | 
					github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 | 
				
			||||||
github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
 | 
					github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
 | 
				
			||||||
github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 | 
					github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 | 
				
			||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
 | 
					 | 
				
			||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 | 
					github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 | 
				
			||||||
github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0=
 | 
					 | 
				
			||||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 | 
					github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 | 
				
			||||||
 | 
					github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 | 
				
			||||||
 | 
					github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 | 
				
			||||||
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY=
 | 
					github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY=
 | 
				
			||||||
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
 | 
					github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
 | 
				
			||||||
github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y=
 | 
					github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y=
 | 
				
			||||||
@@ -69,52 +69,61 @@ github.com/bugsnag/panicwrap v1.2.0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywR
 | 
				
			|||||||
github.com/cenkalti/backoff v2.1.1+incompatible h1:tKJnvO2kl0zmb/jA5UKAt4VoEVw1qxKWjE/Bpp46npY=
 | 
					github.com/cenkalti/backoff v2.1.1+incompatible h1:tKJnvO2kl0zmb/jA5UKAt4VoEVw1qxKWjE/Bpp46npY=
 | 
				
			||||||
github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
 | 
					github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
 | 
				
			||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
					github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
				
			||||||
 | 
					github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
 | 
				
			||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
					github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
				
			||||||
github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg=
 | 
					github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
 | 
				
			||||||
 | 
					github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
				
			||||||
 | 
					github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw=
 | 
				
			||||||
 | 
					github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775 h1:cHzBGGVew0ezFsq2grfy2RsB8hO/eNyBgOLHBCqfR1U=
 | 
				
			||||||
 | 
					github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc=
 | 
				
			||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
					github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
				
			||||||
github.com/cloudflare/cfssl v0.0.0-20181213083726-b94e044bb51e h1:Qux+lbuMaRzkQyTdzgtz8MgzPtzmaPQy6DXmxpdxT3U=
 | 
					github.com/cloudflare/cfssl v0.0.0-20181213083726-b94e044bb51e h1:Qux+lbuMaRzkQyTdzgtz8MgzPtzmaPQy6DXmxpdxT3U=
 | 
				
			||||||
github.com/cloudflare/cfssl v0.0.0-20181213083726-b94e044bb51e/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA=
 | 
					github.com/cloudflare/cfssl v0.0.0-20181213083726-b94e044bb51e/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA=
 | 
				
			||||||
github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
 | 
					github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
 | 
				
			||||||
github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f h1:tSNMc+rJDfmYntojat8lljbt1mgKNpTxUZJsSzJ9Y1s=
 | 
					 | 
				
			||||||
github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko=
 | 
					github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko=
 | 
				
			||||||
github.com/containerd/cgroups v0.0.0-20200217135630-d732e370d46d h1:UKAt78F1OvM4ceTn1VvXuYuatXohsFU1eSI2IBtTw9g=
 | 
					github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340 h1:9atoWyI9RtXFwf7UDbme/6M8Ud0rFrx+Q3ZWgSnsxtw=
 | 
				
			||||||
github.com/containerd/cgroups v0.0.0-20200217135630-d732e370d46d/go.mod h1:CStdkl05lBnJej94BPFoJ7vB8cELKXwViS+dgfW0/M8=
 | 
					github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo=
 | 
				
			||||||
github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
 | 
					github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
 | 
				
			||||||
github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e h1:GdiIYd8ZDOrT++e1NjhSD4rGt9zaJukHm4rt5F4mRQc=
 | 
					 | 
				
			||||||
github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE=
 | 
					github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE=
 | 
				
			||||||
github.com/containerd/console v0.0.0-20191219165238-8375c3424e4d h1:VuiIRfgJ2M3vYEU0F6E5lg3+V0l9YpbGQr3jpZor5fo=
 | 
					github.com/containerd/console v1.0.0 h1:fU3UuQapBs+zLJu82NhR11Rif1ny2zfMMAyPJzSN5tQ=
 | 
				
			||||||
github.com/containerd/console v0.0.0-20191219165238-8375c3424e4d/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE=
 | 
					github.com/containerd/console v1.0.0/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE=
 | 
				
			||||||
github.com/containerd/containerd v1.3.1-0.20200227195959-4d242818bf55 h1:FGO0nwSBESgoGCakj+w3OQXyrMLsz2omdo9b2UfG/BQ=
 | 
					github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
 | 
				
			||||||
github.com/containerd/containerd v1.3.1-0.20200227195959-4d242818bf55/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
 | 
					github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
 | 
				
			||||||
github.com/containerd/continuity v0.0.0-20181001140422-bd77b46c8352/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
 | 
					github.com/containerd/containerd v1.4.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
 | 
				
			||||||
 | 
					github.com/containerd/containerd v1.4.1-0.20200903181227-d4e78200d6da h1:HB+j4bGFoFYkoQIdFPadQiuYWEa5TOGXYghdgSw4VHM=
 | 
				
			||||||
 | 
					github.com/containerd/containerd v1.4.1-0.20200903181227-d4e78200d6da/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
 | 
				
			||||||
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
 | 
					github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
 | 
				
			||||||
github.com/containerd/continuity v0.0.0-20200107194136-26c1120b8d41 h1:kIFnQBO7rQ0XkMe6xEwbybYHBEaWmh/f++laI6Emt7M=
 | 
					github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe h1:PEmIrUvwG9Yyv+0WKZqjXfSFDeZjs/q15g0m08BYS9k=
 | 
				
			||||||
github.com/containerd/continuity v0.0.0-20200107194136-26c1120b8d41/go.mod h1:Dq467ZllaHgAtVp4p1xUQWBrFXR9s/wyoTpG8zOJGkY=
 | 
					github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo=
 | 
				
			||||||
github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
 | 
					github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
 | 
				
			||||||
github.com/containerd/fifo v0.0.0-20191213151349-ff969a566b00 h1:lsjC5ENBl+Zgf38+B0ymougXFp0BaubeIVETltYZTQw=
 | 
					github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b h1:qUtCegLdOUVfVJOw+KDg6eJyE1TGvLlkGEd1091kSSQ=
 | 
				
			||||||
github.com/containerd/fifo v0.0.0-20191213151349-ff969a566b00/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0=
 | 
					github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0=
 | 
				
			||||||
github.com/containerd/go-cni v0.0.0-20200107172653-c154a49e2c75/go.mod h1:0mg8r6FCdbxvLDqCXwAx2rO+KA37QICjKL8+wHOG5OE=
 | 
					github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU=
 | 
				
			||||||
github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
 | 
					github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
 | 
				
			||||||
 | 
					github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328 h1:PRTagVMbJcCezLcHXe8UJvR1oBzp2lG3CEumeFOLOds=
 | 
				
			||||||
github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g=
 | 
					github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g=
 | 
				
			||||||
github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
 | 
					github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
 | 
				
			||||||
github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8=
 | 
					github.com/containerd/ttrpc v1.0.1 h1:IfVOxKbjyBn9maoye2JN95pgGYOmPkQVqxtOu7rtNIc=
 | 
				
			||||||
github.com/containerd/ttrpc v0.0.0-20200121165050-0be804eadb15 h1:+jgiLE5QylzgADj0Yldb4id1NQNRrDOROj7KDvY9PEc=
 | 
					github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
 | 
				
			||||||
github.com/containerd/ttrpc v0.0.0-20200121165050-0be804eadb15/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
 | 
					 | 
				
			||||||
github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
 | 
					github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
 | 
				
			||||||
github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk=
 | 
					github.com/containerd/typeurl v1.0.1 h1:PvuK4E3D5S5q6IqsPDCy928FhP0LUIGcmZ/Yhgp5Djw=
 | 
				
			||||||
github.com/containerd/typeurl v0.0.0-20200205145503-b45ef1f1f737 h1:HovfQDS/K3Mr7eyS0QJLxE1CbVUhjZCl6g3OhFJgP1o=
 | 
					github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg=
 | 
				
			||||||
github.com/containerd/typeurl v0.0.0-20200205145503-b45ef1f1f737/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg=
 | 
					github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
 | 
				
			||||||
github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
 | 
					 | 
				
			||||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
 | 
					github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
 | 
				
			||||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 | 
					github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 | 
				
			||||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 | 
					github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 | 
				
			||||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8=
 | 
					github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8=
 | 
				
			||||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 | 
					github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 | 
				
			||||||
github.com/coreos/go-systemd/v22 v22.0.0 h1:XJIw/+VlJ+87J+doOxznsAWIdmWuViOVhkQamW5YV28=
 | 
					 | 
				
			||||||
github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
 | 
					github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
 | 
				
			||||||
 | 
					github.com/coreos/go-systemd/v22 v22.1.0 h1:kq/SbG2BCKLkDKkjQf5OWwKWUKj1lgs3lFI4PxnR5lg=
 | 
				
			||||||
 | 
					github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
 | 
				
			||||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 | 
					github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 | 
				
			||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 | 
					github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 | 
				
			||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 | 
					github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 | 
				
			||||||
 | 
					github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w=
 | 
				
			||||||
 | 
					github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 | 
				
			||||||
 | 
					github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg=
 | 
				
			||||||
 | 
					github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=
 | 
				
			||||||
github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
					github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
				
			||||||
@@ -126,15 +135,16 @@ github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11
 | 
				
			|||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 | 
					github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 | 
				
			||||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 | 
					github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 | 
				
			||||||
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
 | 
					github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
 | 
				
			||||||
github.com/docker/cli v0.0.0-20200227165822-2298e6a3fe24 h1:bjsfAvm8BVtvQFxV7TYznmKa35J8+fmgrRJWvcS3yJo=
 | 
					 | 
				
			||||||
github.com/docker/cli v0.0.0-20200227165822-2298e6a3fe24/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
 | 
					github.com/docker/cli v0.0.0-20200227165822-2298e6a3fe24/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
 | 
				
			||||||
 | 
					github.com/docker/cli v0.0.0-20200911150641-2955ece02443 h1:Iv8Gysb90iDQlQvf48tucDgT3IJmiHmVyASvGgjLfxY=
 | 
				
			||||||
 | 
					github.com/docker/cli v0.0.0-20200911150641-2955ece02443/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
 | 
				
			||||||
github.com/docker/compose-on-kubernetes v0.4.19-0.20190128150448-356b2919c496 h1:90ytrX1dbzL7Uf/hHiuWwvywC+gikHv4hkAy4CwRTbs=
 | 
					github.com/docker/compose-on-kubernetes v0.4.19-0.20190128150448-356b2919c496 h1:90ytrX1dbzL7Uf/hHiuWwvywC+gikHv4hkAy4CwRTbs=
 | 
				
			||||||
github.com/docker/compose-on-kubernetes v0.4.19-0.20190128150448-356b2919c496/go.mod h1:iT2pYfi580XlpaV4KmK0T6+4/9+XoKmk/fhoDod1emE=
 | 
					github.com/docker/compose-on-kubernetes v0.4.19-0.20190128150448-356b2919c496/go.mod h1:iT2pYfi580XlpaV4KmK0T6+4/9+XoKmk/fhoDod1emE=
 | 
				
			||||||
github.com/docker/distribution v0.0.0-20200223014041-6b972e50feee/go.mod h1:xgJxuOjyp98AvnpRTR1+lGOqQ493ylRnRPmewD5GWtc=
 | 
					github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY=
 | 
				
			||||||
github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible h1:dvc1KSkIYTVjZgHf/CTC2diTYC8PzhaA5sFISRfNVrE=
 | 
					github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
 | 
				
			||||||
github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
 | 
					github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
 | 
				
			||||||
github.com/docker/docker v1.4.2-0.20200227233006-38f52c9fec82 h1:kZwwJwYnVWtU/byBNjD9rEGWVMvwnfiKu9lFJXjrk04=
 | 
					github.com/docker/docker v17.12.0-ce-rc1.0.20200310163718-4634ce647cf2+incompatible h1:ax4NateCD5bjRTqLvQBlFrSUPOoZRgEXWpJ6Bmu6OO0=
 | 
				
			||||||
github.com/docker/docker v1.4.2-0.20200227233006-38f52c9fec82/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 | 
					github.com/docker/docker v17.12.0-ce-rc1.0.20200310163718-4634ce647cf2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 | 
				
			||||||
github.com/docker/docker-credential-helpers v0.6.0/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
 | 
					github.com/docker/docker-credential-helpers v0.6.0/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
 | 
				
			||||||
github.com/docker/docker-credential-helpers v0.6.1 h1:Dq4iIfcM7cNtddhLVWe9h4QDjsi4OER3Z8voPu/I52g=
 | 
					github.com/docker/docker-credential-helpers v0.6.1 h1:Dq4iIfcM7cNtddhLVWe9h4QDjsi4OER3Z8voPu/I52g=
 | 
				
			||||||
github.com/docker/docker-credential-helpers v0.6.1/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
 | 
					github.com/docker/docker-credential-helpers v0.6.1/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
 | 
				
			||||||
@@ -145,12 +155,12 @@ github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKoh
 | 
				
			|||||||
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
 | 
					github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
 | 
				
			||||||
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8=
 | 
					github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8=
 | 
				
			||||||
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
 | 
					github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
 | 
				
			||||||
github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916 h1:yWHOI+vFjEsAakUTSrtqc/SAHrhSkmn48pqjidZX3QA=
 | 
					 | 
				
			||||||
github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI=
 | 
					github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI=
 | 
				
			||||||
github.com/docker/go-units v0.3.1 h1:QAFdsA6jLCnglbqE6mUsHuPcJlntY94DkxHf4deHKIU=
 | 
					github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8=
 | 
				
			||||||
github.com/docker/go-units v0.3.1/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 | 
					github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
 | 
				
			||||||
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
 | 
					github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
 | 
				
			||||||
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 | 
					github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 | 
				
			||||||
 | 
					github.com/docker/libnetwork v0.8.0-dev.2.0.20200226230617-d8334ccdb9be h1:GJzljYRqZapOwyfeRyExF2/5qfv8f1feNDMiz0hmRPY=
 | 
				
			||||||
github.com/docker/libnetwork v0.8.0-dev.2.0.20200226230617-d8334ccdb9be/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8=
 | 
					github.com/docker/libnetwork v0.8.0-dev.2.0.20200226230617-d8334ccdb9be/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8=
 | 
				
			||||||
github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
 | 
					github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
 | 
				
			||||||
github.com/docker/libtrust v0.0.0-20150526203908-9cbd2a1374f4 h1:k8TfKGeAcDQFFQOGCQMRN04N4a9YrPlRMMKnzAuvM9Q=
 | 
					github.com/docker/libtrust v0.0.0-20150526203908-9cbd2a1374f4 h1:k8TfKGeAcDQFFQOGCQMRN04N4a9YrPlRMMKnzAuvM9Q=
 | 
				
			||||||
@@ -173,11 +183,14 @@ github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a
 | 
				
			|||||||
github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 | 
					github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 | 
				
			||||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 | 
					github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 | 
				
			||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
					github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
				
			||||||
 | 
					github.com/fvbommel/sortorder v1.0.1 h1:dSnXLt4mJYH25uDDGa3biZNQsozaUWDSWeKJ0qqFfzE=
 | 
				
			||||||
 | 
					github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
 | 
				
			||||||
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
 | 
					github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
 | 
				
			||||||
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 | 
					github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 | 
				
			||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 | 
					github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 | 
				
			||||||
github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
 | 
					github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
 | 
				
			||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 | 
					github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 | 
				
			||||||
 | 
					github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 | 
				
			||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 | 
					github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 | 
				
			||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 | 
					github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 | 
				
			||||||
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
 | 
					github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
 | 
				
			||||||
@@ -194,19 +207,16 @@ github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68Fp
 | 
				
			|||||||
github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
 | 
					github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
 | 
				
			||||||
github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME=
 | 
					github.com/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME=
 | 
				
			||||||
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 | 
					github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 | 
				
			||||||
github.com/gofrs/flock v0.7.0 h1:pGFUjl501gafK9HBt1VGL1KCOd/YhIooID+xgyJCf3g=
 | 
					github.com/gofrs/flock v0.7.3 h1:I0EKY9l8HZCXTMYC4F80vwT6KNypV9uYKP3Alm/hjmQ=
 | 
				
			||||||
github.com/gofrs/flock v0.7.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
 | 
					github.com/gofrs/flock v0.7.3/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
 | 
				
			||||||
github.com/gofrs/flock v0.7.2 h1:JkFf/PGP1ZOSzUHY03OQp06aeiIim523smfhMdFvP+o=
 | 
					 | 
				
			||||||
github.com/gofrs/flock v0.7.2/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
 | 
					 | 
				
			||||||
github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE=
 | 
					github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE=
 | 
				
			||||||
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 | 
					github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 | 
				
			||||||
 | 
					github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU=
 | 
				
			||||||
github.com/gogo/googleapis v1.3.2 h1:kX1es4djPJrsDhY7aZKJy7aZasdcB5oSOEphMjSB53c=
 | 
					github.com/gogo/googleapis v1.3.2 h1:kX1es4djPJrsDhY7aZKJy7aZasdcB5oSOEphMjSB53c=
 | 
				
			||||||
github.com/gogo/googleapis v1.3.2/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c=
 | 
					github.com/gogo/googleapis v1.3.2/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c=
 | 
				
			||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 | 
					github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 | 
				
			||||||
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
 | 
					 | 
				
			||||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 | 
					github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 | 
				
			||||||
github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 | 
					github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 | 
				
			||||||
github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 | 
					 | 
				
			||||||
github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
 | 
					github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
 | 
				
			||||||
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 | 
					github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 | 
				
			||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 | 
					github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 | 
				
			||||||
@@ -215,25 +225,17 @@ github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4er
 | 
				
			|||||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
					github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
				
			||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
					github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
				
			||||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
					github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
				
			||||||
github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
					github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls=
 | 
				
			||||||
github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
					github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
 | 
				
			||||||
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
 | 
					 | 
				
			||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
					github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
				
			||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
					github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
				
			||||||
github.com/google/certificate-transparency-go v1.0.21 h1:Yf1aXowfZ2nuboBsg7iYGLmwsOARdV86pfH3g95wXmE=
 | 
					github.com/google/certificate-transparency-go v1.0.21 h1:Yf1aXowfZ2nuboBsg7iYGLmwsOARdV86pfH3g95wXmE=
 | 
				
			||||||
github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg=
 | 
					github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg=
 | 
				
			||||||
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
 | 
					 | 
				
			||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 | 
					github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 | 
				
			||||||
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
 | 
					 | 
				
			||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
					github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
				
			||||||
github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
 | 
					 | 
				
			||||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
					github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
				
			||||||
 | 
					github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
 | 
				
			||||||
 | 
					github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
				
			||||||
github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
 | 
					github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
 | 
				
			||||||
github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=
 | 
					github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=
 | 
				
			||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
					github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
				
			||||||
@@ -252,12 +254,14 @@ github.com/gophercloud/gophercloud v0.6.0 h1:Xb2lcqZtml1XjgYZxbeayEemq7ASbeTp09m
 | 
				
			|||||||
github.com/gophercloud/gophercloud v0.6.0/go.mod h1:GICNByuaEBibcjmjvI7QvYJSZEbGkcYwAR7EZK2WMqM=
 | 
					github.com/gophercloud/gophercloud v0.6.0/go.mod h1:GICNByuaEBibcjmjvI7QvYJSZEbGkcYwAR7EZK2WMqM=
 | 
				
			||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 | 
					github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 | 
				
			||||||
github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
 | 
					github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
 | 
				
			||||||
github.com/gorilla/mux v1.7.2 h1:zoNxOV7WjqXptQOVngLmcSQgXmgk4NMz1HibBchjl/I=
 | 
					 | 
				
			||||||
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
 | 
					github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
 | 
				
			||||||
 | 
					github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc=
 | 
				
			||||||
 | 
					github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
 | 
				
			||||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 | 
					github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 | 
				
			||||||
github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY=
 | 
					 | 
				
			||||||
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
 | 
					github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
 | 
				
			||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 | 
					github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 | 
				
			||||||
 | 
					github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 h1:0IKlLyQ3Hs9nDaiK5cSHAGmcQEIC8l2Ts1u6x5Dfrqg=
 | 
				
			||||||
 | 
					github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s=
 | 
				
			||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
 | 
					github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
 | 
				
			||||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 | 
					github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 | 
				
			||||||
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU=
 | 
					github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU=
 | 
				
			||||||
@@ -278,8 +282,9 @@ github.com/hashicorp/hcl/v2 v2.6.0/go.mod h1:bQTN5mpo+jewjJgh8jr0JUguIi7qPHUF6yI
 | 
				
			|||||||
github.com/hashicorp/uuid v0.0.0-20160311170451-ebb0a03e909c/go.mod h1:fHzc09UnyJyqyW+bFuq864eh+wC7dj65aXmXLRe5to0=
 | 
					github.com/hashicorp/uuid v0.0.0-20160311170451-ebb0a03e909c/go.mod h1:fHzc09UnyJyqyW+bFuq864eh+wC7dj65aXmXLRe5to0=
 | 
				
			||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 | 
					github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 | 
				
			||||||
github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 | 
					github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 | 
				
			||||||
github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI=
 | 
					github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 | 
				
			||||||
github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 | 
					github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg=
 | 
				
			||||||
 | 
					github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 | 
				
			||||||
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 | 
					github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 | 
				
			||||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 | 
					github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 | 
				
			||||||
github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg=
 | 
					github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg=
 | 
				
			||||||
@@ -293,8 +298,10 @@ github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht
 | 
				
			|||||||
github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
 | 
					github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
 | 
				
			||||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 | 
					github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 | 
				
			||||||
github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 | 
					github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 | 
				
			||||||
github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo=
 | 
					github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 | 
				
			||||||
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 | 
					github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 | 
				
			||||||
 | 
					github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
 | 
				
			||||||
 | 
					github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 | 
				
			||||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 | 
					github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 | 
				
			||||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 | 
					github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 | 
				
			||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 | 
					github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 | 
				
			||||||
@@ -303,9 +310,7 @@ github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALr
 | 
				
			|||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 | 
					github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 | 
				
			||||||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 | 
					github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 | 
				
			||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
					github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
				
			||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
 | 
					 | 
				
			||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
 | 
					 | 
				
			||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
 | 
				
			||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
@@ -323,8 +328,6 @@ github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDe
 | 
				
			|||||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 | 
					github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
 | 
					github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
 | 
				
			||||||
github.com/mattn/go-shellwords v1.0.5 h1:JhhFTIOslh5ZsPrpa3Wdg8bF0WI3b44EMblmU9wIsXc=
 | 
					 | 
				
			||||||
github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
 | 
					 | 
				
			||||||
github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o=
 | 
					github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o=
 | 
				
			||||||
github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 | 
					github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 | 
				
			||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 | 
					github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 | 
				
			||||||
@@ -334,12 +337,17 @@ github.com/miekg/pkcs11 v0.0.0-20190322140431-074fd7a1ed19/go.mod h1:WCBAbTOdfhH
 | 
				
			|||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 | 
					github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 | 
				
			||||||
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM=
 | 
					github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM=
 | 
				
			||||||
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
 | 
					github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
 | 
				
			||||||
github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ=
 | 
					github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ=
 | 
				
			||||||
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 | 
					github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 | 
				
			||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
					github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
				
			||||||
github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A=
 | 
					github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A=
 | 
				
			||||||
github.com/moby/buildkit v0.7.2 h1:wp4R0QMXSqwjTJKhhWlJNOCSQ/OVPnsCf3N8rs09+vQ=
 | 
					github.com/moby/buildkit v0.7.1-0.20200914033518-a2563079f719 h1:lQaV/Pxe3LdJ5+6NnSJQzXrU3VgBpEG1e0j2hoQruy0=
 | 
				
			||||||
github.com/moby/buildkit v0.7.2/go.mod h1:D3DN/Nl4DyMH1LkwpRUJuoghqdigdXd1A6HXt5aZS40=
 | 
					github.com/moby/buildkit v0.7.1-0.20200914033518-a2563079f719/go.mod h1:lZTeYRoRGC226OJc2At9lYBgyMiCn1VV4OmIIwo1euU=
 | 
				
			||||||
 | 
					github.com/moby/sys/mount v0.1.0/go.mod h1:FVQFLDRWwyBjDTBNQXDlWnSFREqOo3OKX9aqhmeoo74=
 | 
				
			||||||
 | 
					github.com/moby/sys/mountinfo v0.1.0/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o=
 | 
				
			||||||
 | 
					github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o=
 | 
				
			||||||
 | 
					github.com/moby/term v0.0.0-20200911173544-4fc2018d01d9 h1:zZkMlNMZzXZox6Pt84eHK4Lzv5kEHdCgyDaUx9cJRWc=
 | 
				
			||||||
 | 
					github.com/moby/term v0.0.0-20200911173544-4fc2018d01d9/go.mod h1:TjQg8pa4iejrUrjiz0MCtMV38jdMNW4doKSiBrEvCQQ=
 | 
				
			||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
					github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
				
			||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 | 
					github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 | 
				
			||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
					github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
				
			||||||
@@ -349,6 +357,7 @@ github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9
 | 
				
			|||||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 | 
					github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 | 
				
			||||||
github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c h1:nXxl5PrvVm2L/wCy8dQu6DMTwH4oIuGN8GJDAlqDdVE=
 | 
					github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c h1:nXxl5PrvVm2L/wCy8dQu6DMTwH4oIuGN8GJDAlqDdVE=
 | 
				
			||||||
github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
 | 
					github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
 | 
				
			||||||
 | 
					github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0=
 | 
				
			||||||
github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
 | 
					github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
 | 
				
			||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 | 
					github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 | 
				
			||||||
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
 | 
					github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
 | 
				
			||||||
@@ -356,87 +365,92 @@ github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/
 | 
				
			|||||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 | 
					github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 | 
				
			||||||
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
					github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
				
			||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
					github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
				
			||||||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
					 | 
				
			||||||
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
					github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
				
			||||||
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
					github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
				
			||||||
github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
					github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
				
			||||||
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 | 
					github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 | 
				
			||||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 | 
					 | 
				
			||||||
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 | 
					github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 | 
				
			||||||
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 | 
					github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 | 
				
			||||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 | 
					github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 | 
				
			||||||
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 | 
					github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 | 
				
			||||||
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 | 
					github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 | 
				
			||||||
github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ=
 | 
					 | 
				
			||||||
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 | 
					github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 | 
				
			||||||
 | 
					github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
 | 
				
			||||||
 | 
					github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
 | 
				
			||||||
github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
 | 
					github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
 | 
				
			||||||
github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI=
 | 
					github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI=
 | 
				
			||||||
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
 | 
					github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
 | 
				
			||||||
github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 | 
					github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 | 
				
			||||||
github.com/opencontainers/runc v1.0.0-rc6/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 | 
					github.com/opencontainers/runc v1.0.0-rc10/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 | 
				
			||||||
github.com/opencontainers/runc v1.0.0-rc9.0.20200102164712-2b52db75279c/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 | 
					github.com/opencontainers/runc v1.0.0-rc92 h1:+IczUKCRzDzFDnw99O/PAqrcBBCoRp9xN3cB1SYSNS4=
 | 
				
			||||||
github.com/opencontainers/runc v1.0.0-rc9.0.20200221051241-688cf6d43cc4 h1:JhRvjyrjq24YPSDS0MQo9KJHQh95naK5fYl9IT+dzPM=
 | 
					github.com/opencontainers/runc v1.0.0-rc92/go.mod h1:X1zlU4p7wOlX4+WRCz+hvlRv8phdL7UqbYD+vQwNMmE=
 | 
				
			||||||
github.com/opencontainers/runc v1.0.0-rc9.0.20200221051241-688cf6d43cc4/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 | 
					 | 
				
			||||||
github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 | 
					github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 | 
				
			||||||
github.com/opencontainers/runtime-spec v1.0.1 h1:wY4pOY8fBdSIvs9+IDHC55thBuEulhzfSgKeC1yFvzQ=
 | 
					 | 
				
			||||||
github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 | 
					github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 | 
				
			||||||
 | 
					github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 | 
				
			||||||
 | 
					github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6 h1:NhsM2gc769rVWDqJvapK37r+7+CBXI8xHhnfnt8uQsg=
 | 
				
			||||||
 | 
					github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 | 
				
			||||||
github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
 | 
					github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
 | 
				
			||||||
github.com/opencontainers/selinux v1.3.2/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g=
 | 
					github.com/opencontainers/selinux v1.6.0 h1:+bIAS/Za3q5FTwWym4fTB0vObnfCf3G/NC7K6Jx62mY=
 | 
				
			||||||
github.com/opencontainers/selinux v1.3.3 h1:RX0wAeqtvVSYQcr017X3pFXPkLEtB6V4NjRD7gVQgg4=
 | 
					github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE=
 | 
				
			||||||
github.com/opencontainers/selinux v1.3.3/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g=
 | 
					github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU=
 | 
				
			||||||
github.com/opentracing-contrib/go-stdlib v0.0.0-20171029140428-b1a47cfbdd75/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w=
 | 
					github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
 | 
				
			||||||
github.com/opentracing/opentracing-go v0.0.0-20171003133519-1361b9cd60be h1:vn0ruyYif1hUWDS2aEUdh6JGUfgK8gOOLpz/iTjb6pQ=
 | 
					github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
 | 
				
			||||||
github.com/opentracing/opentracing-go v0.0.0-20171003133519-1361b9cd60be/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
 | 
					github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
 | 
				
			||||||
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
 | 
					github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
 | 
				
			||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 | 
					github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 | 
				
			||||||
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
 | 
					 | 
				
			||||||
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
 | 
					github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
 | 
				
			||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
					github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
				
			||||||
github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
					github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
				
			||||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
 | 
					 | 
				
			||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
					github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
				
			||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
					github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
				
			||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
					github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
				
			||||||
github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
 | 
					github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18=
 | 
				
			||||||
github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
					github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
				
			||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
					github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
				
			||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
					github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
				
			||||||
github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06 h1:BqJUZe1wY8984P2XGsGIGieuao8wucwOwaTS10L9Lj8=
 | 
					 | 
				
			||||||
github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 | 
					github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 | 
				
			||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 | 
					github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 | 
				
			||||||
github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8=
 | 
					 | 
				
			||||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
 | 
					github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
 | 
				
			||||||
 | 
					github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
 | 
				
			||||||
 | 
					github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
 | 
				
			||||||
 | 
					github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA=
 | 
				
			||||||
 | 
					github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
 | 
				
			||||||
github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 | 
					github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 | 
				
			||||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 | 
					github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 | 
				
			||||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
					github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
				
			||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM=
 | 
					 | 
				
			||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
					github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
				
			||||||
 | 
					github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
 | 
				
			||||||
 | 
					github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
				
			||||||
github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 | 
					github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 | 
				
			||||||
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 | 
					github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 | 
				
			||||||
github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM=
 | 
					 | 
				
			||||||
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 | 
					github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 | 
				
			||||||
 | 
					github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 | 
				
			||||||
 | 
					github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
 | 
				
			||||||
 | 
					github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc=
 | 
				
			||||||
 | 
					github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
 | 
				
			||||||
github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 | 
					github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 | 
				
			||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 | 
					github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 | 
				
			||||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 | 
					github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 | 
				
			||||||
github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 | 
					github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 | 
				
			||||||
github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8=
 | 
					github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 | 
				
			||||||
 | 
					github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
 | 
				
			||||||
github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
 | 
					github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
 | 
				
			||||||
 | 
					github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
 | 
				
			||||||
 | 
					github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 | 
				
			||||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 | 
					github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 | 
				
			||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 | 
					github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 | 
				
			||||||
github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc=
 | 
					github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc=
 | 
				
			||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
					github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
				
			||||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
 | 
					github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
 | 
				
			||||||
 | 
					github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
 | 
				
			||||||
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
 | 
					github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
 | 
				
			||||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
 | 
					github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
 | 
				
			||||||
github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002 h1:ka9QPuQg2u4LGipiZGsgkg3rJCo4iIUCy75FddM0GRQ=
 | 
					github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002 h1:ka9QPuQg2u4LGipiZGsgkg3rJCo4iIUCy75FddM0GRQ=
 | 
				
			||||||
github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc=
 | 
					github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc=
 | 
				
			||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 | 
					github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 | 
				
			||||||
github.com/sirupsen/logrus v1.0.3/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
 | 
					 | 
				
			||||||
github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
 | 
					github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
 | 
				
			||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
					github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
				
			||||||
github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
 | 
					 | 
				
			||||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 | 
					github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 | 
				
			||||||
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
 | 
					 | 
				
			||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
					github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
				
			||||||
github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
 | 
					github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
 | 
				
			||||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 | 
					github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 | 
				
			||||||
@@ -444,7 +458,6 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1
 | 
				
			|||||||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 | 
					github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 | 
				
			||||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
 | 
					github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
 | 
				
			||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 | 
					github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 | 
				
			||||||
github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
 | 
					 | 
				
			||||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 | 
					github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 | 
				
			||||||
github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc=
 | 
					github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc=
 | 
				
			||||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
 | 
					github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
 | 
				
			||||||
@@ -460,7 +473,6 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6
 | 
				
			|||||||
github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
					github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
				
			||||||
github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
					github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
				
			||||||
github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
					github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
				
			||||||
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
 | 
					 | 
				
			||||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
					github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
				
			||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 | 
					github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 | 
				
			||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 | 
					github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 | 
				
			||||||
@@ -472,50 +484,54 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
 | 
				
			|||||||
github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
					github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
				
			||||||
github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
					github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
				
			||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
					github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
				
			||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 | 
					 | 
				
			||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
					github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
				
			||||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
 | 
					 | 
				
			||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
					github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
				
			||||||
 | 
					github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
 | 
				
			||||||
 | 
					github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 | 
				
			||||||
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
 | 
					github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
 | 
				
			||||||
github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 h1:b6uOv7YOFK0TYG7HtkIgExQo+2RdLuwRft63jn2HWj8=
 | 
					github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 h1:b6uOv7YOFK0TYG7HtkIgExQo+2RdLuwRft63jn2HWj8=
 | 
				
			||||||
github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
 | 
					github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
 | 
				
			||||||
github.com/theupdateframework/notary v0.6.1 h1:7wshjstgS9x9F5LuB1L5mBI2xNMObWqjz+cjWoom6l0=
 | 
					github.com/theupdateframework/notary v0.6.1 h1:7wshjstgS9x9F5LuB1L5mBI2xNMObWqjz+cjWoom6l0=
 | 
				
			||||||
github.com/theupdateframework/notary v0.6.1/go.mod h1:MOfgIfmox8s7/7fduvB2xyPPMJCrjRLRizA8OFwpnKY=
 | 
					github.com/theupdateframework/notary v0.6.1/go.mod h1:MOfgIfmox8s7/7fduvB2xyPPMJCrjRLRizA8OFwpnKY=
 | 
				
			||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
					github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
				
			||||||
github.com/tonistiigi/fsutil v0.0.0-20200326231323-c2c7d7b0e144 h1:6RY1EKxCnPQShPM46xFDHta2JSOd+YKCgHyyBHtKuo8=
 | 
					github.com/tonistiigi/fsutil v0.0.0-20200724193237-c3ed55f3b481 h1:D4cbMpyxP3RhRI+s5RBK7x73nT9cmWFcP6esk951JNw=
 | 
				
			||||||
github.com/tonistiigi/fsutil v0.0.0-20200326231323-c2c7d7b0e144/go.mod h1:0G1sLZ/0ttFf09xvh7GR4AEECnjifHRNJN/sYbLianU=
 | 
					github.com/tonistiigi/fsutil v0.0.0-20200724193237-c3ed55f3b481/go.mod h1:PlsE3+FgE0r5iesnFMYbo1w7A90DGWwKB9h/BUDaKuM=
 | 
				
			||||||
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0=
 | 
					github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0=
 | 
				
			||||||
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk=
 | 
					github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk=
 | 
				
			||||||
github.com/tonistiigi/vt100 v0.0.0-20190402012908-ad4c4a574305 h1:y/1cL5AL2oRcfzz8CAHHhR6kDDfIOT0WEyH5k40sccM=
 | 
					github.com/tonistiigi/vt100 v0.0.0-20190402012908-ad4c4a574305 h1:y/1cL5AL2oRcfzz8CAHHhR6kDDfIOT0WEyH5k40sccM=
 | 
				
			||||||
github.com/tonistiigi/vt100 v0.0.0-20190402012908-ad4c4a574305/go.mod h1:gXOLibKqQTRAVuVZ9gX7G9Ykky8ll8yb4slxsEMoY0c=
 | 
					github.com/tonistiigi/vt100 v0.0.0-20190402012908-ad4c4a574305/go.mod h1:gXOLibKqQTRAVuVZ9gX7G9Ykky8ll8yb4slxsEMoY0c=
 | 
				
			||||||
github.com/uber/jaeger-client-go v0.0.0-20180103221425-e02c85f9069e/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
 | 
					github.com/uber/jaeger-client-go v2.11.2+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
 | 
				
			||||||
github.com/uber/jaeger-lib v1.2.1/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
 | 
					github.com/uber/jaeger-lib v1.2.1/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
 | 
				
			||||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
 | 
					github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
 | 
				
			||||||
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
 | 
					github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
 | 
				
			||||||
 | 
					github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 | 
				
			||||||
github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 | 
					github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 | 
				
			||||||
github.com/vishvananda/netlink v1.0.0/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
 | 
					github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0=
 | 
				
			||||||
github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI=
 | 
					github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
 | 
				
			||||||
 | 
					github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df h1:OviZH7qLw/7ZovXvuNyL3XQl8UFofeikI1NW1Gypu7k=
 | 
				
			||||||
 | 
					github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
 | 
				
			||||||
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
 | 
					github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
 | 
				
			||||||
 | 
					github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243 h1:R43TdZy32XXSXjJn7M/HhALJ9imq6ztLnChfYJpVDnM=
 | 
				
			||||||
 | 
					github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
 | 
				
			||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
 | 
					github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
 | 
				
			||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
 | 
					github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
 | 
				
			||||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
 | 
					github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
 | 
				
			||||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
 | 
					github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
 | 
				
			||||||
github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f h1:mvXjJIHRZyhNuGassLTcXTwjiWq7NmjdavZsUnmFybQ=
 | 
					 | 
				
			||||||
github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
 | 
					github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
 | 
				
			||||||
 | 
					github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
 | 
				
			||||||
 | 
					github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
 | 
				
			||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 | 
					github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 | 
				
			||||||
github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1 h1:j2hhcujLRHAg872RWAV5yaUrEjHEObwDv3aImCaNLek=
 | 
					 | 
				
			||||||
github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8=
 | 
					 | 
				
			||||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
 | 
					github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
 | 
				
			||||||
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
 | 
					github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
 | 
				
			||||||
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
 | 
					github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
 | 
				
			||||||
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
 | 
					github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
 | 
				
			||||||
github.com/zclconf/go-cty v1.2.0 h1:sPHsy7ADcIZQP3vILvTjrh74ZA175TFP5vqiNK1UmlI=
 | 
					 | 
				
			||||||
github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8=
 | 
					github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8=
 | 
				
			||||||
github.com/zclconf/go-cty v1.4.0 h1:+q+tmgyUB94HIdH/uVTIi/+kt3pt4sHwEZAcTyLoGsQ=
 | 
					github.com/zclconf/go-cty v1.4.0 h1:+q+tmgyUB94HIdH/uVTIi/+kt3pt4sHwEZAcTyLoGsQ=
 | 
				
			||||||
github.com/zclconf/go-cty v1.4.0/go.mod h1:nHzOclRkoj++EU9ZjSrZvRG0BXIWt8c7loYc0qXAFGQ=
 | 
					github.com/zclconf/go-cty v1.4.0/go.mod h1:nHzOclRkoj++EU9ZjSrZvRG0BXIWt8c7loYc0qXAFGQ=
 | 
				
			||||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 | 
					go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 | 
				
			||||||
go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk=
 | 
					 | 
				
			||||||
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 | 
					go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 | 
				
			||||||
 | 
					go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0=
 | 
				
			||||||
 | 
					go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
 | 
				
			||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 | 
					go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 | 
				
			||||||
go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4=
 | 
					go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4=
 | 
				
			||||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 | 
					go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 | 
				
			||||||
@@ -525,12 +541,9 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 | 
				
			|||||||
golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
					golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
					golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
					golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
 | 
					 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
					golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734 h1:p/H982KKEjUnLJkM3tt/LemDnOc1GiZL5FCVlORJ5zo=
 | 
					 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
					 | 
				
			||||||
golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d h1:1ZiEyfaQIg3Qh0EoqpwAakHVhecoE5wlSg5GjnafJGw=
 | 
					golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d h1:1ZiEyfaQIg3Qh0EoqpwAakHVhecoE5wlSg5GjnafJGw=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
					golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
				
			||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
					golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
				
			||||||
@@ -538,7 +551,6 @@ golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTk
 | 
				
			|||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 | 
					golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 | 
				
			||||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 | 
					golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 | 
				
			||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
					golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
				
			||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
@@ -548,65 +560,34 @@ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73r
 | 
				
			|||||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
					golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
					golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
					golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 | 
					golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
 | 
					golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
 | 
				
			||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
 | 
					 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
					golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
					golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
 | 
					golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
					golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
 | 
					 | 
				
			||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
 | 
					 | 
				
			||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
 | 
					golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 h1:sIky/MyNRSHTrdxfsiUSS4WIAMvInbeXljJz+jDjeYE=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82 h1:vsphBvatvfbhlb4PO1BYSr9dzugGxJ/SQHoNufZJq1w=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e h1:N7DeIrjYszNmSW409R3frPPwglRwMkXSBzwVbkOjLLA=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
					golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
 | 
					 | 
				
			||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
					golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
					golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 | 
					golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 | 
				
			||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
					golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
				
			||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
					golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
				
			||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=
 | 
					 | 
				
			||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
					golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
				
			||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
 | 
					golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
 | 
				
			||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
					golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
				
			||||||
@@ -621,22 +602,20 @@ golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3
 | 
				
			|||||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
					golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
					golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
 | 
					golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
 | 
				
			||||||
 | 
					golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
				
			||||||
google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
 | 
					google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
 | 
				
			||||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 | 
					google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 | 
				
			||||||
google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs=
 | 
					 | 
				
			||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
					google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
				
			||||||
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
 | 
					 | 
				
			||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
					google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
				
			||||||
google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c=
 | 
					google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c=
 | 
				
			||||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
					google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
				
			||||||
google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk=
 | 
					google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
 | 
					 | 
				
			||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
					google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
					google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
					google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb h1:i1Ppqkc3WQXikh8bXiwHqAN5Rv3/qDCcRk0/Otx73BY=
 | 
					 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
					google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
 | 
					google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 | 
					google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
 | 
					google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20200227132054-3f1135a288c9 h1:Koy0f8zyrEVfIHetH7wjP5mQLUXiqDpubSg8V1fAxqc=
 | 
					google.golang.org/genproto v0.0.0-20200227132054-3f1135a288c9 h1:Koy0f8zyrEVfIHetH7wjP5mQLUXiqDpubSg8V1fAxqc=
 | 
				
			||||||
@@ -645,9 +624,8 @@ google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDg
 | 
				
			|||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
					google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
				
			||||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 | 
					google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 | 
				
			||||||
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 | 
					google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 | 
				
			||||||
google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A=
 | 
					 | 
				
			||||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 | 
					google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 | 
				
			||||||
google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
 | 
					google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 | 
				
			||||||
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 | 
					google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 | 
				
			||||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 | 
					google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 | 
				
			||||||
google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk=
 | 
					google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk=
 | 
				
			||||||
@@ -656,8 +634,9 @@ gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4
 | 
				
			|||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 | 
					gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 | 
				
			||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
					 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
 | 
					gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
 | 
				
			||||||
 | 
					gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
gopkg.in/dancannon/gorethink.v3 v3.0.5 h1:/g7PWP7zUS6vSNmHSDbjCHQh1Rqn8Jy6zSMQxAsBSMQ=
 | 
					gopkg.in/dancannon/gorethink.v3 v3.0.5 h1:/g7PWP7zUS6vSNmHSDbjCHQh1Rqn8Jy6zSMQxAsBSMQ=
 | 
				
			||||||
gopkg.in/dancannon/gorethink.v3 v3.0.5/go.mod h1:GXsi1e3N2OcKhcP6nsYABTiUejbWMFO4GY5a4pEaeEc=
 | 
					gopkg.in/dancannon/gorethink.v3 v3.0.5/go.mod h1:GXsi1e3N2OcKhcP6nsYABTiUejbWMFO4GY5a4pEaeEc=
 | 
				
			||||||
gopkg.in/fatih/pool.v2 v2.0.0 h1:xIFeWtxifuQJGk/IEPKsTduEKcKvPmhoiVDGpC40nKg=
 | 
					gopkg.in/fatih/pool.v2 v2.0.0 h1:xIFeWtxifuQJGk/IEPKsTduEKcKvPmhoiVDGpC40nKg=
 | 
				
			||||||
@@ -672,13 +651,11 @@ gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 | 
				
			|||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 | 
					gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
 | 
					gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
 | 
					gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
 | 
					 | 
				
			||||||
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
 | 
					gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
 | 
				
			||||||
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
 | 
					gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
 | 
				
			||||||
gotest.tools/v3 v3.0.2 h1:kG1BFyqVHuQoVQiR1bWGnfz/fmHvvuiSPIV7rvl360E=
 | 
					gotest.tools/v3 v3.0.2 h1:kG1BFyqVHuQoVQiR1bWGnfz/fmHvvuiSPIV7rvl360E=
 | 
				
			||||||
@@ -692,6 +669,7 @@ k8s.io/apimachinery v0.16.7 h1:MWxTXXh1ianCotNCj4ehx8eu0UyvtJl4cvn6riSJymQ=
 | 
				
			|||||||
k8s.io/apimachinery v0.16.7/go.mod h1:Xk2vD2TRRpuWYLQNM6lT9R7DSFZUYG03SarNkbGrnKE=
 | 
					k8s.io/apimachinery v0.16.7/go.mod h1:Xk2vD2TRRpuWYLQNM6lT9R7DSFZUYG03SarNkbGrnKE=
 | 
				
			||||||
k8s.io/client-go v0.16.7 h1:nipZSn8iGEsAhpVEx88EfOiSgKu5qPAPX1GMoRnRTB8=
 | 
					k8s.io/client-go v0.16.7 h1:nipZSn8iGEsAhpVEx88EfOiSgKu5qPAPX1GMoRnRTB8=
 | 
				
			||||||
k8s.io/client-go v0.16.7/go.mod h1:9kEMEeuy2LdsHHXoU2Skqh+SDso+Yhkxd/0tltvswDE=
 | 
					k8s.io/client-go v0.16.7/go.mod h1:9kEMEeuy2LdsHHXoU2Skqh+SDso+Yhkxd/0tltvswDE=
 | 
				
			||||||
 | 
					k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM=
 | 
				
			||||||
k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 | 
					k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 | 
				
			||||||
k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 | 
					k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 | 
				
			||||||
k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 | 
					k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 | 
				
			||||||
@@ -704,5 +682,3 @@ k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl
 | 
				
			|||||||
sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
 | 
					sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
 | 
				
			||||||
sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=
 | 
					sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=
 | 
				
			||||||
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
 | 
					sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
 | 
				
			||||||
vbom.ml/util v0.0.0-20180919145318-efcd4e0f9787 h1:O69FD9pJA4WUZlEwYatBEEkRWKQ5cKodWpdKTrCS/iQ=
 | 
					 | 
				
			||||||
vbom.ml/util v0.0.0-20180919145318-efcd4e0f9787/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI=
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										151
									
								
								vendor/github.com/Microsoft/go-winio/vhd/vhd.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								vendor/github.com/Microsoft/go-winio/vhd/vhd.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,151 @@
 | 
				
			|||||||
 | 
					// +build windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package vhd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "syscall"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:generate go run mksyscall_windows.go -output zvhd.go vhd.go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys createVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, flags uint32, providerSpecificFlags uint32, parameters *createVirtualDiskParameters, o *syscall.Overlapped, handle *syscall.Handle) (err error) [failretval != 0] = VirtDisk.CreateVirtualDisk
 | 
				
			||||||
 | 
					//sys openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) [failretval != 0] = VirtDisk.OpenVirtualDisk
 | 
				
			||||||
 | 
					//sys detachVirtualDisk(handle syscall.Handle, flags uint32, providerSpecificFlags uint32) (err error) [failretval != 0] = VirtDisk.DetachVirtualDisk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type virtualStorageType struct {
 | 
				
			||||||
 | 
						DeviceID uint32
 | 
				
			||||||
 | 
						VendorID [16]byte
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type (
 | 
				
			||||||
 | 
						createVirtualDiskFlag uint32
 | 
				
			||||||
 | 
						VirtualDiskAccessMask uint32
 | 
				
			||||||
 | 
						VirtualDiskFlag       uint32
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						// Flags for creating a VHD (not exported)
 | 
				
			||||||
 | 
						createVirtualDiskFlagNone                        createVirtualDiskFlag = 0
 | 
				
			||||||
 | 
						createVirtualDiskFlagFullPhysicalAllocation      createVirtualDiskFlag = 1
 | 
				
			||||||
 | 
						createVirtualDiskFlagPreventWritesToSourceDisk   createVirtualDiskFlag = 2
 | 
				
			||||||
 | 
						createVirtualDiskFlagDoNotCopyMetadataFromParent createVirtualDiskFlag = 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Access Mask for opening a VHD
 | 
				
			||||||
 | 
						VirtualDiskAccessNone     VirtualDiskAccessMask = 0
 | 
				
			||||||
 | 
						VirtualDiskAccessAttachRO VirtualDiskAccessMask = 65536
 | 
				
			||||||
 | 
						VirtualDiskAccessAttachRW VirtualDiskAccessMask = 131072
 | 
				
			||||||
 | 
						VirtualDiskAccessDetach   VirtualDiskAccessMask = 262144
 | 
				
			||||||
 | 
						VirtualDiskAccessGetInfo  VirtualDiskAccessMask = 524288
 | 
				
			||||||
 | 
						VirtualDiskAccessCreate   VirtualDiskAccessMask = 1048576
 | 
				
			||||||
 | 
						VirtualDiskAccessMetaOps  VirtualDiskAccessMask = 2097152
 | 
				
			||||||
 | 
						VirtualDiskAccessRead     VirtualDiskAccessMask = 851968
 | 
				
			||||||
 | 
						VirtualDiskAccessAll      VirtualDiskAccessMask = 4128768
 | 
				
			||||||
 | 
						VirtualDiskAccessWritable VirtualDiskAccessMask = 3276800
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Flags for opening a VHD
 | 
				
			||||||
 | 
						OpenVirtualDiskFlagNone                        VirtualDiskFlag = 0
 | 
				
			||||||
 | 
						OpenVirtualDiskFlagNoParents                   VirtualDiskFlag = 0x1
 | 
				
			||||||
 | 
						OpenVirtualDiskFlagBlankFile                   VirtualDiskFlag = 0x2
 | 
				
			||||||
 | 
						OpenVirtualDiskFlagBootDrive                   VirtualDiskFlag = 0x4
 | 
				
			||||||
 | 
						OpenVirtualDiskFlagCachedIO                    VirtualDiskFlag = 0x8
 | 
				
			||||||
 | 
						OpenVirtualDiskFlagCustomDiffChain             VirtualDiskFlag = 0x10
 | 
				
			||||||
 | 
						OpenVirtualDiskFlagParentCachedIO              VirtualDiskFlag = 0x20
 | 
				
			||||||
 | 
						OpenVirtualDiskFlagVhdSetFileOnly              VirtualDiskFlag = 0x40
 | 
				
			||||||
 | 
						OpenVirtualDiskFlagIgnoreRelativeParentLocator VirtualDiskFlag = 0x80
 | 
				
			||||||
 | 
						OpenVirtualDiskFlagNoWriteHardening            VirtualDiskFlag = 0x100
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type createVersion2 struct {
 | 
				
			||||||
 | 
						UniqueID                 [16]byte // GUID
 | 
				
			||||||
 | 
						MaximumSize              uint64
 | 
				
			||||||
 | 
						BlockSizeInBytes         uint32
 | 
				
			||||||
 | 
						SectorSizeInBytes        uint32
 | 
				
			||||||
 | 
						ParentPath               *uint16 // string
 | 
				
			||||||
 | 
						SourcePath               *uint16 // string
 | 
				
			||||||
 | 
						OpenFlags                uint32
 | 
				
			||||||
 | 
						ParentVirtualStorageType virtualStorageType
 | 
				
			||||||
 | 
						SourceVirtualStorageType virtualStorageType
 | 
				
			||||||
 | 
						ResiliencyGUID           [16]byte // GUID
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type createVirtualDiskParameters struct {
 | 
				
			||||||
 | 
						Version  uint32 // Must always be set to 2
 | 
				
			||||||
 | 
						Version2 createVersion2
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type openVersion2 struct {
 | 
				
			||||||
 | 
						GetInfoOnly    int32    // bool but 4-byte aligned
 | 
				
			||||||
 | 
						ReadOnly       int32    // bool but 4-byte aligned
 | 
				
			||||||
 | 
						ResiliencyGUID [16]byte // GUID
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type openVirtualDiskParameters struct {
 | 
				
			||||||
 | 
						Version  uint32 // Must always be set to 2
 | 
				
			||||||
 | 
						Version2 openVersion2
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CreateVhdx will create a simple vhdx file at the given path using default values.
 | 
				
			||||||
 | 
					func CreateVhdx(path string, maxSizeInGb, blockSizeInMb uint32) error {
 | 
				
			||||||
 | 
						var (
 | 
				
			||||||
 | 
							defaultType virtualStorageType
 | 
				
			||||||
 | 
							handle      syscall.Handle
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						parameters := createVirtualDiskParameters{
 | 
				
			||||||
 | 
							Version: 2,
 | 
				
			||||||
 | 
							Version2: createVersion2{
 | 
				
			||||||
 | 
								MaximumSize:      uint64(maxSizeInGb) * 1024 * 1024 * 1024,
 | 
				
			||||||
 | 
								BlockSizeInBytes: blockSizeInMb * 1024 * 1024,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := createVirtualDisk(
 | 
				
			||||||
 | 
							&defaultType,
 | 
				
			||||||
 | 
							path,
 | 
				
			||||||
 | 
							uint32(VirtualDiskAccessNone),
 | 
				
			||||||
 | 
							nil,
 | 
				
			||||||
 | 
							uint32(createVirtualDiskFlagNone),
 | 
				
			||||||
 | 
							0,
 | 
				
			||||||
 | 
							¶meters,
 | 
				
			||||||
 | 
							nil,
 | 
				
			||||||
 | 
							&handle); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := syscall.CloseHandle(handle); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DetachVhd detaches a mounted container layer vhd found at `path`.
 | 
				
			||||||
 | 
					func DetachVhd(path string) error {
 | 
				
			||||||
 | 
						handle, err := OpenVirtualDisk(
 | 
				
			||||||
 | 
							path,
 | 
				
			||||||
 | 
							VirtualDiskAccessNone,
 | 
				
			||||||
 | 
							OpenVirtualDiskFlagCachedIO|OpenVirtualDiskFlagIgnoreRelativeParentLocator)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer syscall.CloseHandle(handle)
 | 
				
			||||||
 | 
						return detachVirtualDisk(handle, 0, 0)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// OpenVirtualDisk obtains a handle to a VHD opened with supplied access mask and flags.
 | 
				
			||||||
 | 
					func OpenVirtualDisk(path string, accessMask VirtualDiskAccessMask, flag VirtualDiskFlag) (syscall.Handle, error) {
 | 
				
			||||||
 | 
						var (
 | 
				
			||||||
 | 
							defaultType virtualStorageType
 | 
				
			||||||
 | 
							handle      syscall.Handle
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						parameters := openVirtualDiskParameters{Version: 2}
 | 
				
			||||||
 | 
						if err := openVirtualDisk(
 | 
				
			||||||
 | 
							&defaultType,
 | 
				
			||||||
 | 
							path,
 | 
				
			||||||
 | 
							uint32(accessMask),
 | 
				
			||||||
 | 
							uint32(flag),
 | 
				
			||||||
 | 
							¶meters,
 | 
				
			||||||
 | 
							&handle); err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return handle, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										99
									
								
								vendor/github.com/Microsoft/go-winio/vhd/zvhd.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								vendor/github.com/Microsoft/go-winio/vhd/zvhd.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,99 @@
 | 
				
			|||||||
 | 
					// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package vhd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"golang.org/x/sys/windows"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ unsafe.Pointer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Do the interface allocations only once for common
 | 
				
			||||||
 | 
					// Errno values.
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						errnoERROR_IO_PENDING = 997
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// errnoErr returns common boxed Errno values, to prevent
 | 
				
			||||||
 | 
					// allocations at runtime.
 | 
				
			||||||
 | 
					func errnoErr(e syscall.Errno) error {
 | 
				
			||||||
 | 
						switch e {
 | 
				
			||||||
 | 
						case 0:
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						case errnoERROR_IO_PENDING:
 | 
				
			||||||
 | 
							return errERROR_IO_PENDING
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// TODO: add more here, after collecting data on the common
 | 
				
			||||||
 | 
						// error values see on Windows. (perhaps when running
 | 
				
			||||||
 | 
						// all.bat?)
 | 
				
			||||||
 | 
						return e
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						modVirtDisk = windows.NewLazySystemDLL("VirtDisk.dll")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						procCreateVirtualDisk = modVirtDisk.NewProc("CreateVirtualDisk")
 | 
				
			||||||
 | 
						procOpenVirtualDisk   = modVirtDisk.NewProc("OpenVirtualDisk")
 | 
				
			||||||
 | 
						procDetachVirtualDisk = modVirtDisk.NewProc("DetachVirtualDisk")
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func createVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, flags uint32, providerSpecificFlags uint32, parameters *createVirtualDiskParameters, o *syscall.Overlapped, handle *syscall.Handle) (err error) {
 | 
				
			||||||
 | 
						var _p0 *uint16
 | 
				
			||||||
 | 
						_p0, err = syscall.UTF16PtrFromString(path)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return _createVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, securityDescriptor, flags, providerSpecificFlags, parameters, o, handle)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _createVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, virtualDiskAccessMask uint32, securityDescriptor *uintptr, flags uint32, providerSpecificFlags uint32, parameters *createVirtualDiskParameters, o *syscall.Overlapped, handle *syscall.Handle) (err error) {
 | 
				
			||||||
 | 
						r1, _, e1 := syscall.Syscall9(procCreateVirtualDisk.Addr(), 9, uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(unsafe.Pointer(securityDescriptor)), uintptr(flags), uintptr(providerSpecificFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(o)), uintptr(unsafe.Pointer(handle)))
 | 
				
			||||||
 | 
						if r1 != 0 {
 | 
				
			||||||
 | 
							if e1 != 0 {
 | 
				
			||||||
 | 
								err = errnoErr(e1)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								err = syscall.EINVAL
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func openVirtualDisk(virtualStorageType *virtualStorageType, path string, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) {
 | 
				
			||||||
 | 
						var _p0 *uint16
 | 
				
			||||||
 | 
						_p0, err = syscall.UTF16PtrFromString(path)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return _openVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, flags, parameters, handle)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _openVirtualDisk(virtualStorageType *virtualStorageType, path *uint16, virtualDiskAccessMask uint32, flags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (err error) {
 | 
				
			||||||
 | 
						r1, _, e1 := syscall.Syscall6(procOpenVirtualDisk.Addr(), 6, uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(flags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(handle)))
 | 
				
			||||||
 | 
						if r1 != 0 {
 | 
				
			||||||
 | 
							if e1 != 0 {
 | 
				
			||||||
 | 
								err = errnoErr(e1)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								err = syscall.EINVAL
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func detachVirtualDisk(handle syscall.Handle, flags uint32, providerSpecificFlags uint32) (err error) {
 | 
				
			||||||
 | 
						r1, _, e1 := syscall.Syscall(procDetachVirtualDisk.Addr(), 3, uintptr(handle), uintptr(flags), uintptr(providerSpecificFlags))
 | 
				
			||||||
 | 
						if r1 != 0 {
 | 
				
			||||||
 | 
							if e1 != 0 {
 | 
				
			||||||
 | 
								err = errnoErr(e1)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								err = syscall.EINVAL
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										3
									
								
								vendor/github.com/Microsoft/hcsshim/CODEOWNERS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/Microsoft/hcsshim/CODEOWNERS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					* @microsoft/containerplat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/hcn/* @nagiesek
 | 
				
			||||||
							
								
								
									
										7
									
								
								vendor/github.com/Microsoft/hcsshim/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/Microsoft/hcsshim/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,7 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[](https://ci.appveyor.com/project/WindowsVirtualization/hcsshim/branch/master)
 | 
					[](https://ci.appveyor.com/project/WindowsVirtualization/hcsshim/branch/master)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This package contains the Golang interface for using the Windows [Host Compute Service](https://blogs.technet.microsoft.com/virtualization/2017/01/27/introducing-the-host-compute-service-hcs/) (HCS) to launch and manage [Windows Containers](https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/). It also contains other helpers and functions for managing Windows Containers such as the Golang interface for the Host Network Service (HNS).
 | 
					This package contains the Golang interface for using the Windows [Host Compute Service](https://techcommunity.microsoft.com/t5/containers/introducing-the-host-compute-service-hcs/ba-p/382332) (HCS) to launch and manage [Windows Containers](https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/). It also contains other helpers and functions for managing Windows Containers such as the Golang interface for the Host Network Service (HNS).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
It is primarily used in the [Moby Project](https://github.com/moby/moby), but it can be freely used by other projects as well.
 | 
					It is primarily used in the [Moby Project](https://github.com/moby/moby), but it can be freely used by other projects as well.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -16,6 +16,11 @@ When you submit a pull request, a CLA-bot will automatically determine whether y
 | 
				
			|||||||
a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions
 | 
					a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions
 | 
				
			||||||
provided by the bot. You will only need to do this once across all repos using our CLA.
 | 
					provided by the bot. You will only need to do this once across all repos using our CLA.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We also ask that contributors [sign their commits](https://git-scm.com/docs/git-commit) using `git commit -s` or `git commit --signoff` to certify they either authored the work themselves or otherwise have permission to use it in this project. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Code of Conduct
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
 | 
					This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
 | 
				
			||||||
For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or
 | 
					For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or
 | 
				
			||||||
contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
 | 
					contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										20
									
								
								vendor/github.com/Microsoft/hcsshim/appveyor.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/Microsoft/hcsshim/appveyor.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -6,7 +6,7 @@ clone_folder: c:\gopath\src\github.com\Microsoft\hcsshim
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
environment:
 | 
					environment:
 | 
				
			||||||
  GOPATH: c:\gopath
 | 
					  GOPATH: c:\gopath
 | 
				
			||||||
  PATH: C:\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev1\mingw64\bin;%GOPATH%\bin;C:\gometalinter-2.0.12-windows-amd64;%PATH%
 | 
					  PATH: "%GOPATH%\\bin;C:\\gometalinter-2.0.12-windows-amd64;%PATH%"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
stack: go 1.13.4
 | 
					stack: go 1.13.4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -22,10 +22,12 @@ build_script:
 | 
				
			|||||||
  - go build ./internal/tools/uvmboot
 | 
					  - go build ./internal/tools/uvmboot
 | 
				
			||||||
  - go build ./internal/tools/zapdir
 | 
					  - go build ./internal/tools/zapdir
 | 
				
			||||||
  - go test -v ./... -tags admin
 | 
					  - go test -v ./... -tags admin
 | 
				
			||||||
  - go test -c ./test/containerd-shim-runhcs-v1/ -tags functional
 | 
					  - cd test
 | 
				
			||||||
  - go test -c ./test/cri-containerd/ -tags functional
 | 
					  - go test -v ./internal -tags admin
 | 
				
			||||||
  - go test -c ./test/functional/ -tags functional
 | 
					  - go test -c ./containerd-shim-runhcs-v1/ -tags functional
 | 
				
			||||||
  - go test -c ./test/runhcs/ -tags functional
 | 
					  - go test -c ./cri-containerd/ -tags functional
 | 
				
			||||||
 | 
					  - go test -c ./functional/ -tags functional
 | 
				
			||||||
 | 
					  - go test -c ./runhcs/ -tags functional
 | 
				
			||||||
 | 
					
 | 
				
			||||||
artifacts:
 | 
					artifacts:
 | 
				
			||||||
  - path: 'containerd-shim-runhcs-v1.exe'
 | 
					  - path: 'containerd-shim-runhcs-v1.exe'
 | 
				
			||||||
@@ -35,7 +37,7 @@ artifacts:
 | 
				
			|||||||
  - path: 'grantvmgroupaccess.exe'  
 | 
					  - path: 'grantvmgroupaccess.exe'  
 | 
				
			||||||
  - path: 'uvmboot.exe'
 | 
					  - path: 'uvmboot.exe'
 | 
				
			||||||
  - path: 'zapdir.exe'
 | 
					  - path: 'zapdir.exe'
 | 
				
			||||||
  - path: 'containerd-shim-runhcs-v1.test.exe'
 | 
					  - path: './test/containerd-shim-runhcs-v1.test.exe'
 | 
				
			||||||
  - path: 'cri-containerd.test.exe'
 | 
					  - path: './test/cri-containerd.test.exe'
 | 
				
			||||||
  - path: 'functional.test.exe'
 | 
					  - path: './test/functional.test.exe'
 | 
				
			||||||
  - path: 'runhcs.test.exe'
 | 
					  - path: './test/runhcs.test.exe'
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										28
									
								
								vendor/github.com/Microsoft/hcsshim/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/Microsoft/hcsshim/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -4,34 +4,32 @@ go 1.13
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5
 | 
						github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5
 | 
				
			||||||
	github.com/blang/semver v3.1.0+incompatible // indirect
 | 
					 | 
				
			||||||
	github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f
 | 
						github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f
 | 
				
			||||||
	github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1
 | 
						github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1
 | 
				
			||||||
	github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69
 | 
						github.com/containerd/containerd v1.3.2
 | 
				
			||||||
	github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc // indirect
 | 
						github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc // indirect
 | 
				
			||||||
	github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448 // indirect
 | 
						github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448 // indirect
 | 
				
			||||||
	github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3
 | 
						github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3
 | 
				
			||||||
	github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de
 | 
						github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de
 | 
				
			||||||
	github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd
 | 
						github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd
 | 
				
			||||||
	github.com/gogo/protobuf v1.2.1
 | 
						github.com/gogo/protobuf v1.3.1
 | 
				
			||||||
	github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce // indirect
 | 
						github.com/golang/protobuf v1.3.2 // indirect
 | 
				
			||||||
	github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874 // indirect
 | 
						github.com/kr/pretty v0.1.0 // indirect
 | 
				
			||||||
	github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2 // indirect
 | 
						github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2 // indirect
 | 
				
			||||||
	github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f // indirect
 | 
						github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f // indirect
 | 
				
			||||||
	github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700
 | 
						github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700
 | 
				
			||||||
	github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39
 | 
					 | 
				
			||||||
	github.com/pkg/errors v0.8.1
 | 
						github.com/pkg/errors v0.8.1
 | 
				
			||||||
	github.com/prometheus/procfs v0.0.5 // indirect
 | 
						github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7 // indirect
 | 
				
			||||||
	github.com/sirupsen/logrus v1.4.1
 | 
						github.com/sirupsen/logrus v1.4.2
 | 
				
			||||||
	github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8 // indirect
 | 
						github.com/stretchr/testify v1.4.0 // indirect
 | 
				
			||||||
	github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5
 | 
						github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5
 | 
				
			||||||
	github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
 | 
					 | 
				
			||||||
	github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
 | 
					 | 
				
			||||||
	github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f // indirect
 | 
					 | 
				
			||||||
	go.opencensus.io v0.22.0
 | 
						go.opencensus.io v0.22.0
 | 
				
			||||||
	golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6
 | 
						golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 // indirect
 | 
				
			||||||
 | 
						golang.org/x/sync v0.0.0-20190423024810-112230192c58
 | 
				
			||||||
	golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3
 | 
						golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3
 | 
				
			||||||
	google.golang.org/grpc v1.20.1
 | 
						google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 // indirect
 | 
				
			||||||
 | 
						google.golang.org/grpc v1.23.1
 | 
				
			||||||
 | 
						gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
 | 
				
			||||||
 | 
						gopkg.in/yaml.v2 v2.2.8 // indirect
 | 
				
			||||||
	gotest.tools v2.2.0+incompatible // indirect
 | 
						gotest.tools v2.2.0+incompatible // indirect
 | 
				
			||||||
	k8s.io/kubernetes v1.13.0
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										64
									
								
								vendor/github.com/Microsoft/hcsshim/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										64
									
								
								vendor/github.com/Microsoft/hcsshim/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,16 +1,15 @@
 | 
				
			|||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
					cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
				
			||||||
 | 
					github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 | 
				
			||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
					github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
				
			||||||
github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA=
 | 
					github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA=
 | 
				
			||||||
github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
 | 
					github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
 | 
				
			||||||
github.com/blang/semver v3.1.0+incompatible h1:7hqmJYuaEK3qwVjWubYiht3j93YI0WQBuysxHIfUriU=
 | 
					 | 
				
			||||||
github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
 | 
					 | 
				
			||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
					github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
				
			||||||
github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f h1:tSNMc+rJDfmYntojat8lljbt1mgKNpTxUZJsSzJ9Y1s=
 | 
					github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f h1:tSNMc+rJDfmYntojat8lljbt1mgKNpTxUZJsSzJ9Y1s=
 | 
				
			||||||
github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko=
 | 
					github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko=
 | 
				
			||||||
github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1 h1:uict5mhHFTzKLUCufdSLym7z/J0CbBJT59lYbP9wtbg=
 | 
					github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1 h1:uict5mhHFTzKLUCufdSLym7z/J0CbBJT59lYbP9wtbg=
 | 
				
			||||||
github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
 | 
					github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
 | 
				
			||||||
github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69 h1:rG1clvJbgsUcmb50J82YUJhUMopWNtZvyMZjb+4fqGw=
 | 
					github.com/containerd/containerd v1.3.2 h1:ForxmXkA6tPIvffbrDAcPUIB32QgXkt2XFj+F0UxetA=
 | 
				
			||||||
github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
 | 
					github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
 | 
				
			||||||
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc h1:TP+534wVlf61smEIq1nwLLAjQVEK2EADoW3CX9AuT+8=
 | 
					github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc h1:TP+534wVlf61smEIq1nwLLAjQVEK2EADoW3CX9AuT+8=
 | 
				
			||||||
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
 | 
					github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
 | 
				
			||||||
github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448 h1:PUD50EuOMkXVcpBIA/R95d56duJR9VxhwncsFbNnxW4=
 | 
					github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448 h1:PUD50EuOMkXVcpBIA/R95d56duJR9VxhwncsFbNnxW4=
 | 
				
			||||||
@@ -23,6 +22,7 @@ github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd h1:JNn81o/xG+8N
 | 
				
			|||||||
github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
 | 
					github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
 | 
				
			||||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8=
 | 
					github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8=
 | 
				
			||||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 | 
					github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 | 
				
			||||||
 | 
					github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
					github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
 | 
					github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
 | 
				
			||||||
@@ -31,6 +31,8 @@ github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68Fp
 | 
				
			|||||||
github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
 | 
					github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
 | 
				
			||||||
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
 | 
					github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
 | 
				
			||||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 | 
					github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 | 
				
			||||||
 | 
					github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
 | 
				
			||||||
 | 
					github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 | 
				
			||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 | 
					github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 | 
				
			||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 | 
					github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 | 
				
			||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
					github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
				
			||||||
@@ -38,47 +40,47 @@ github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM
 | 
				
			|||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
					github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
				
			||||||
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
 | 
					github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
 | 
				
			||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
					github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
				
			||||||
 | 
					github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
 | 
				
			||||||
 | 
					github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
				
			||||||
 | 
					github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 | 
				
			||||||
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
 | 
					github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
 | 
				
			||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
					github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
				
			||||||
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce h1:prjrVgOk2Yg6w+PflHoszQNLTUh4kaByUcEWM/9uin4=
 | 
					 | 
				
			||||||
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
 | 
					 | 
				
			||||||
github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874 h1:cAv7ZbSmyb1wjn6T4TIiyFCkpcfgpbcNNC3bM2srLaI=
 | 
					 | 
				
			||||||
github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
 | 
					 | 
				
			||||||
github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
 | 
					github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
 | 
				
			||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
					github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
				
			||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 | 
					github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 | 
				
			||||||
 | 
					github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 | 
				
			||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
					github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
				
			||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
 | 
				
			||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
 | 
					github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 | 
				
			||||||
 | 
					github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
				
			||||||
 | 
					github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
				
			||||||
 | 
					github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 | 
				
			||||||
 | 
					github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 | 
				
			||||||
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2 h1:QhPf3A2AZW3tTGvHPg0TA+CR3oHbVLlXUhlghqISp1I=
 | 
					github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2 h1:QhPf3A2AZW3tTGvHPg0TA+CR3oHbVLlXUhlghqISp1I=
 | 
				
			||||||
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 | 
					github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 | 
				
			||||||
github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f h1:a969LJ4IQFwRHYqonHtUDMSh9i54WcKggeEkQ3fZMl4=
 | 
					github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f h1:a969LJ4IQFwRHYqonHtUDMSh9i54WcKggeEkQ3fZMl4=
 | 
				
			||||||
github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 | 
					github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 | 
				
			||||||
github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700 h1:eNUVfm/RFLIi1G7flU5/ZRTHvd4kcVuzfRnL6OFlzCI=
 | 
					github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700 h1:eNUVfm/RFLIi1G7flU5/ZRTHvd4kcVuzfRnL6OFlzCI=
 | 
				
			||||||
github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 | 
					github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 | 
				
			||||||
github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39 h1:H7DMc6FAjgwZZi8BRqjrAAHWoqEr5e5L6pS4V0ezet4=
 | 
					 | 
				
			||||||
github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
 | 
					 | 
				
			||||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
 | 
					github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
 | 
				
			||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
					github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
				
			||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
					github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
				
			||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
					github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
				
			||||||
github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8=
 | 
					github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7 h1:hhvfGDVThBnd4kYisSFmYuHYeUhglxcwag7FhVPH9zM=
 | 
				
			||||||
github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
 | 
					github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 | 
				
			||||||
github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
 | 
					github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
 | 
				
			||||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 | 
					github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 | 
				
			||||||
 | 
					github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
 | 
				
			||||||
 | 
					github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
				
			||||||
 | 
					github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
 | 
					github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
 | 
				
			||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
					github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
				
			||||||
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8 h1:zLV6q4e8Jv9EHjNg/iHfzwDkCve6Ua5jCygptrtXHvI=
 | 
					github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
 | 
				
			||||||
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
 | 
					github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
				
			||||||
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5 h1:MCfT24H3f//U5+UCrZp1/riVO3B50BovxtDiNn0XKkk=
 | 
					github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5 h1:MCfT24H3f//U5+UCrZp1/riVO3B50BovxtDiNn0XKkk=
 | 
				
			||||||
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
 | 
					github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
 | 
				
			||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
 | 
					 | 
				
			||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
 | 
					 | 
				
			||||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
 | 
					 | 
				
			||||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
 | 
					 | 
				
			||||||
github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f h1:mvXjJIHRZyhNuGassLTcXTwjiWq7NmjdavZsUnmFybQ=
 | 
					 | 
				
			||||||
github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
 | 
					 | 
				
			||||||
go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4=
 | 
					go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4=
 | 
				
			||||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 | 
					go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
					golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
@@ -93,15 +95,19 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJV
 | 
				
			|||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
					golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09 h1:KaQtG+aDELoNmXYas3TVkGNYRuq8JQ1aa7LJt8EXVyo=
 | 
					golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09 h1:KaQtG+aDELoNmXYas3TVkGNYRuq8JQ1aa7LJt8EXVyo=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
					golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
					golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					 | 
				
			||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI=
 | 
					golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3 h1:7TYNF4UdlohbFwpNH04CoPMp1cHUZgO1Ebq5r2hIjfo=
 | 
					golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3 h1:7TYNF4UdlohbFwpNH04CoPMp1cHUZgO1Ebq5r2hIjfo=
 | 
				
			||||||
@@ -112,20 +118,32 @@ golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 | 
				
			|||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
					golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 | 
					golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
				
			||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
					google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
				
			||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
					google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
 | 
					google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
					google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb h1:i1Ppqkc3WQXikh8bXiwHqAN5Rv3/qDCcRk0/Otx73BY=
 | 
					google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb h1:i1Ppqkc3WQXikh8bXiwHqAN5Rv3/qDCcRk0/Otx73BY=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
					google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
				
			||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
					google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
				
			||||||
google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU=
 | 
					google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU=
 | 
				
			||||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 | 
					google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 | 
				
			||||||
 | 
					google.golang.org/grpc v1.23.1 h1:q4XQuHFC6I28BKZpo6IYyb3mNO+l7lSOxRuYTCiDfXk=
 | 
				
			||||||
 | 
					google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 | 
				
			||||||
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
				
			||||||
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
 | 
					gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
 | 
				
			||||||
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
 | 
					gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
 | 
				
			||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
					honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
				
			||||||
k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8=
 | 
					honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
				
			||||||
k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								vendor/github.com/Microsoft/hcsshim/hnspolicy.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/Microsoft/hcsshim/hnspolicy.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -21,8 +21,11 @@ const (
 | 
				
			|||||||
	OutboundNat          = hns.OutboundNat
 | 
						OutboundNat          = hns.OutboundNat
 | 
				
			||||||
	ExternalLoadBalancer = hns.ExternalLoadBalancer
 | 
						ExternalLoadBalancer = hns.ExternalLoadBalancer
 | 
				
			||||||
	Route                = hns.Route
 | 
						Route                = hns.Route
 | 
				
			||||||
 | 
						Proxy                = hns.Proxy
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ProxyPolicy = hns.ProxyPolicy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type NatPolicy = hns.NatPolicy
 | 
					type NatPolicy = hns.NatPolicy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type QosPolicy = hns.QosPolicy
 | 
					type QosPolicy = hns.QosPolicy
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										7
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/cgo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/cgo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,7 +0,0 @@
 | 
				
			|||||||
package hcs
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "C"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// This import is needed to make the library compile as CGO because HCSSHIM
 | 
					 | 
				
			||||||
// only works with CGO due to callbacks from HCS comming back from a C thread
 | 
					 | 
				
			||||||
// which is not supported without CGO. See https://github.com/golang/go/issues/10973
 | 
					 | 
				
			||||||
							
								
								
									
										5
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					package hcs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:generate go run ../../mksyscall_windows.go -output zsyscall_windows.go syscall.go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys hcsFormatWritableLayerVhd(handle uintptr) (hr error) = computestorage.HcsFormatWritableLayerVhd
 | 
				
			||||||
							
								
								
									
										50
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										50
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -4,12 +4,9 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"strconv"
 | 
					 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"syscall"
 | 
						"syscall"
 | 
				
			||||||
	"time"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/cow"
 | 
						"github.com/Microsoft/hcsshim/internal/cow"
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/log"
 | 
						"github.com/Microsoft/hcsshim/internal/log"
 | 
				
			||||||
@@ -21,27 +18,6 @@ import (
 | 
				
			|||||||
	"go.opencensus.io/trace"
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// currentContainerStarts is used to limit the number of concurrent container
 | 
					 | 
				
			||||||
// starts.
 | 
					 | 
				
			||||||
var currentContainerStarts containerStarts
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type containerStarts struct {
 | 
					 | 
				
			||||||
	maxParallel int
 | 
					 | 
				
			||||||
	inProgress  int
 | 
					 | 
				
			||||||
	sync.Mutex
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func init() {
 | 
					 | 
				
			||||||
	mpsS := os.Getenv("HCSSHIM_MAX_PARALLEL_START")
 | 
					 | 
				
			||||||
	if len(mpsS) > 0 {
 | 
					 | 
				
			||||||
		mpsI, err := strconv.Atoi(mpsS)
 | 
					 | 
				
			||||||
		if err != nil || mpsI < 0 {
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		currentContainerStarts.maxParallel = mpsI
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type System struct {
 | 
					type System struct {
 | 
				
			||||||
	handleLock     sync.RWMutex
 | 
						handleLock     sync.RWMutex
 | 
				
			||||||
	handle         vmcompute.HcsSystem
 | 
						handle         vmcompute.HcsSystem
 | 
				
			||||||
@@ -215,32 +191,6 @@ func (computeSystem *System) Start(ctx context.Context) (err error) {
 | 
				
			|||||||
		return makeSystemError(computeSystem, operation, "", ErrAlreadyClosed, nil)
 | 
							return makeSystemError(computeSystem, operation, "", ErrAlreadyClosed, nil)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// This is a very simple backoff-retry loop to limit the number
 | 
					 | 
				
			||||||
	// of parallel container starts if environment variable
 | 
					 | 
				
			||||||
	// HCSSHIM_MAX_PARALLEL_START is set to a positive integer.
 | 
					 | 
				
			||||||
	// It should generally only be used as a workaround to various
 | 
					 | 
				
			||||||
	// platform issues that exist between RS1 and RS4 as of Aug 2018
 | 
					 | 
				
			||||||
	if currentContainerStarts.maxParallel > 0 {
 | 
					 | 
				
			||||||
		for {
 | 
					 | 
				
			||||||
			currentContainerStarts.Lock()
 | 
					 | 
				
			||||||
			if currentContainerStarts.inProgress < currentContainerStarts.maxParallel {
 | 
					 | 
				
			||||||
				currentContainerStarts.inProgress++
 | 
					 | 
				
			||||||
				currentContainerStarts.Unlock()
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if currentContainerStarts.inProgress == currentContainerStarts.maxParallel {
 | 
					 | 
				
			||||||
				currentContainerStarts.Unlock()
 | 
					 | 
				
			||||||
				time.Sleep(100 * time.Millisecond)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		// Make sure we decrement the count when we are done.
 | 
					 | 
				
			||||||
		defer func() {
 | 
					 | 
				
			||||||
			currentContainerStarts.Lock()
 | 
					 | 
				
			||||||
			currentContainerStarts.inProgress--
 | 
					 | 
				
			||||||
			currentContainerStarts.Unlock()
 | 
					 | 
				
			||||||
		}()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	resultJSON, err := vmcompute.HcsStartComputeSystem(ctx, computeSystem.handle, "")
 | 
						resultJSON, err := vmcompute.HcsStartComputeSystem(ctx, computeSystem.handle, "")
 | 
				
			||||||
	events, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemStartCompleted, &timeout.SystemStart)
 | 
						events, err := processAsyncHcsResult(ctx, err, resultJSON, computeSystem.callbackNumber, hcsNotificationSystemStartCompleted, &timeout.SystemStart)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										28
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/utils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,10 +1,14 @@
 | 
				
			|||||||
package hcs
 | 
					package hcs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"syscall"
 | 
						"syscall"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/go-winio"
 | 
						"github.com/Microsoft/go-winio"
 | 
				
			||||||
 | 
						diskutil "github.com/Microsoft/go-winio/vhd"
 | 
				
			||||||
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						"golang.org/x/sys/windows"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// makeOpenFiles calls winio.MakeOpenFile for each handle in a slice but closes all the handles
 | 
					// makeOpenFiles calls winio.MakeOpenFile for each handle in a slice but closes all the handles
 | 
				
			||||||
@@ -31,3 +35,27 @@ func makeOpenFiles(hs []syscall.Handle) (_ []io.ReadWriteCloser, err error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return fs, nil
 | 
						return fs, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// creates a VHD formatted with NTFS of size `sizeGB` at the given `vhdPath`.
 | 
				
			||||||
 | 
					func CreateNTFSVHD(ctx context.Context, vhdPath string, sizeGB uint32) (err error) {
 | 
				
			||||||
 | 
						if err := diskutil.CreateVhdx(vhdPath, sizeGB, 1); err != nil {
 | 
				
			||||||
 | 
							return errors.Wrap(err, "failed to create VHD")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						vhd, err := diskutil.OpenVirtualDisk(vhdPath, diskutil.VirtualDiskAccessNone, diskutil.OpenVirtualDiskFlagNone)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return errors.Wrap(err, "failed to open VHD")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer func() {
 | 
				
			||||||
 | 
							err2 := windows.CloseHandle(windows.Handle(vhd))
 | 
				
			||||||
 | 
							if err == nil {
 | 
				
			||||||
 | 
								err = errors.Wrap(err2, "failed to close VHD")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := hcsFormatWritableLayerVhd(uintptr(vhd)); err != nil {
 | 
				
			||||||
 | 
							return errors.Wrap(err, "failed to format VHD")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										54
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hcs/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					// Code generated mksyscall_windows.exe DO NOT EDIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package hcs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"golang.org/x/sys/windows"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ unsafe.Pointer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Do the interface allocations only once for common
 | 
				
			||||||
 | 
					// Errno values.
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						errnoERROR_IO_PENDING = 997
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// errnoErr returns common boxed Errno values, to prevent
 | 
				
			||||||
 | 
					// allocations at runtime.
 | 
				
			||||||
 | 
					func errnoErr(e syscall.Errno) error {
 | 
				
			||||||
 | 
						switch e {
 | 
				
			||||||
 | 
						case 0:
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						case errnoERROR_IO_PENDING:
 | 
				
			||||||
 | 
							return errERROR_IO_PENDING
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// TODO: add more here, after collecting data on the common
 | 
				
			||||||
 | 
						// error values see on Windows. (perhaps when running
 | 
				
			||||||
 | 
						// all.bat?)
 | 
				
			||||||
 | 
						return e
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						modcomputestorage = windows.NewLazySystemDLL("computestorage.dll")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						procHcsFormatWritableLayerVhd = modcomputestorage.NewProc("HcsFormatWritableLayerVhd")
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func hcsFormatWritableLayerVhd(handle uintptr) (hr error) {
 | 
				
			||||||
 | 
						r0, _, _ := syscall.Syscall(procHcsFormatWritableLayerVhd.Addr(), 1, uintptr(handle), 0, 0)
 | 
				
			||||||
 | 
						if int32(r0) < 0 {
 | 
				
			||||||
 | 
							if r0&0x1fff0000 == 0x00070000 {
 | 
				
			||||||
 | 
								r0 &= 0xffff
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							hr = syscall.Errno(r0)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										21
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hns/hnsendpoint.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hns/hnsendpoint.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -173,6 +173,27 @@ func (endpoint *HNSEndpoint) ApplyACLPolicy(policies ...*ACLPolicy) error {
 | 
				
			|||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ApplyProxyPolicy applies a set of Proxy Policies on the Endpoint
 | 
				
			||||||
 | 
					func (endpoint *HNSEndpoint) ApplyProxyPolicy(policies ...*ProxyPolicy) error {
 | 
				
			||||||
 | 
						operation := "ApplyProxyPolicy"
 | 
				
			||||||
 | 
						title := "hcsshim::HNSEndpoint::" + operation
 | 
				
			||||||
 | 
						logrus.Debugf(title+" id=%s", endpoint.Id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, policy := range policies {
 | 
				
			||||||
 | 
							if policy == nil {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							jsonString, err := json.Marshal(policy)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							endpoint.Policies = append(endpoint.Policies, jsonString)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, err := endpoint.Update()
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ContainerAttach attaches an endpoint to container
 | 
					// ContainerAttach attaches an endpoint to container
 | 
				
			||||||
func (endpoint *HNSEndpoint) ContainerAttach(containerID string, compartmentID uint16) error {
 | 
					func (endpoint *HNSEndpoint) ContainerAttach(containerID string, compartmentID uint16) error {
 | 
				
			||||||
	operation := "ContainerAttach"
 | 
						operation := "ContainerAttach"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -17,6 +17,7 @@ const (
 | 
				
			|||||||
	OutboundNat          PolicyType = "OutBoundNAT"
 | 
						OutboundNat          PolicyType = "OutBoundNAT"
 | 
				
			||||||
	ExternalLoadBalancer PolicyType = "ELB"
 | 
						ExternalLoadBalancer PolicyType = "ELB"
 | 
				
			||||||
	Route                PolicyType = "ROUTE"
 | 
						Route                PolicyType = "ROUTE"
 | 
				
			||||||
 | 
						Proxy                PolicyType = "PROXY"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type NatPolicy struct {
 | 
					type NatPolicy struct {
 | 
				
			||||||
@@ -60,6 +61,15 @@ type OutboundNatPolicy struct {
 | 
				
			|||||||
	Destinations []string `json:",omitempty"`
 | 
						Destinations []string `json:",omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ProxyPolicy struct {
 | 
				
			||||||
 | 
						Type          PolicyType `json:"Type"`
 | 
				
			||||||
 | 
						IP            string     `json:",omitempty"`
 | 
				
			||||||
 | 
						Port          string     `json:",omitempty"`
 | 
				
			||||||
 | 
						ExceptionList []string   `json:",omitempty"`
 | 
				
			||||||
 | 
						Destination   string     `json:",omitempty"`
 | 
				
			||||||
 | 
						OutboundNat   bool       `json:",omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ActionType string
 | 
					type ActionType string
 | 
				
			||||||
type DirectionType string
 | 
					type DirectionType string
 | 
				
			||||||
type RuleType string
 | 
					type RuleType string
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										7
									
								
								vendor/github.com/Microsoft/hcsshim/internal/schema1/schema1.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/Microsoft/hcsshim/internal/schema1/schema1.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -214,9 +214,10 @@ type MappedVirtualDiskController struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// GuestDefinedCapabilities is part of the GuestConnectionInfo returned by a GuestConnection call on a utility VM
 | 
					// GuestDefinedCapabilities is part of the GuestConnectionInfo returned by a GuestConnection call on a utility VM
 | 
				
			||||||
type GuestDefinedCapabilities struct {
 | 
					type GuestDefinedCapabilities struct {
 | 
				
			||||||
	NamespaceAddRequestSupported bool `json:",omitempty"`
 | 
						NamespaceAddRequestSupported  bool `json:",omitempty"`
 | 
				
			||||||
	SignalProcessSupported       bool `json:",omitempty"`
 | 
						SignalProcessSupported        bool `json:",omitempty"`
 | 
				
			||||||
	DumpStacksSupported          bool `json:",omitempty"`
 | 
						DumpStacksSupported           bool `json:",omitempty"`
 | 
				
			||||||
 | 
						DeleteContainerStateSupported bool `json:",omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GuestConnectionInfo is the structure of an iterm return by a GuestConnection call on a utility VM
 | 
					// GuestConnectionInfo is the structure of an iterm return by a GuestConnection call on a utility VM
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/Microsoft/hcsshim/internal/schema2/devices.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/Microsoft/hcsshim/internal/schema2/devices.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -39,4 +39,8 @@ type Devices struct {
 | 
				
			|||||||
	FlexibleIov map[string]FlexibleIoDevice `json:"FlexibleIov,omitempty"`
 | 
						FlexibleIov map[string]FlexibleIoDevice `json:"FlexibleIov,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SharedMemory *SharedMemoryConfiguration `json:"SharedMemory,omitempty"`
 | 
						SharedMemory *SharedMemoryConfiguration `json:"SharedMemory,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TODO: This is pre-release support in schema 2.3. Need to add build number
 | 
				
			||||||
 | 
						// docs when a public build with this is out.
 | 
				
			||||||
 | 
						VirtualPci map[string]VirtualPciDevice `json:",omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										19
									
								
								vendor/github.com/Microsoft/hcsshim/internal/schema2/memory_2.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/Microsoft/hcsshim/internal/schema2/memory_2.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -27,4 +27,23 @@ type Memory2 struct {
 | 
				
			|||||||
	// to the VM, allowing it to trim non-zeroed pages from the working set (if supported by
 | 
						// to the VM, allowing it to trim non-zeroed pages from the working set (if supported by
 | 
				
			||||||
	// the guest operating system).
 | 
						// the guest operating system).
 | 
				
			||||||
	EnableColdDiscardHint bool `json:"EnableColdDiscardHint,omitempty"`
 | 
						EnableColdDiscardHint bool `json:"EnableColdDiscardHint,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// LowMmioGapInMB is the low MMIO region allocated below 4GB.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// TODO: This is pre-release support in schema 2.3. Need to add build number
 | 
				
			||||||
 | 
						// docs when a public build with this is out.
 | 
				
			||||||
 | 
						LowMMIOGapInMB uint64 `json:"LowMmioGapInMB,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// HighMmioBaseInMB is the high MMIO region allocated above 4GB (base and
 | 
				
			||||||
 | 
						// size).
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// TODO: This is pre-release support in schema 2.3. Need to add build number
 | 
				
			||||||
 | 
						// docs when a public build with this is out.
 | 
				
			||||||
 | 
						HighMMIOBaseInMB uint64 `json:"HighMmioBaseInMB,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// HighMmioGapInMB is the high MMIO region.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// TODO: This is pre-release support in schema 2.3. Need to add build number
 | 
				
			||||||
 | 
						// docs when a public build with this is out.
 | 
				
			||||||
 | 
						HighMMIOGapInMB uint64 `json:"HighMmioGapInMB,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/Microsoft/hcsshim/internal/schema2/virtual_pci_device.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/Microsoft/hcsshim/internal/schema2/virtual_pci_device.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * HCS API
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * API version: 2.3
 | 
				
			||||||
 | 
					 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package hcsschema
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: This is pre-release support in schema 2.3. Need to add build number
 | 
				
			||||||
 | 
					// docs when a public build with this is out.
 | 
				
			||||||
 | 
					type VirtualPciDevice struct {
 | 
				
			||||||
 | 
						Functions []VirtualPciFunction `json:",omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										18
									
								
								vendor/github.com/Microsoft/hcsshim/internal/schema2/virtual_pci_function.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/Microsoft/hcsshim/internal/schema2/virtual_pci_function.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * HCS API
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * API version: 2.3
 | 
				
			||||||
 | 
					 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package hcsschema
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: This is pre-release support in schema 2.3. Need to add build number
 | 
				
			||||||
 | 
					// docs when a public build with this is out.
 | 
				
			||||||
 | 
					type VirtualPciFunction struct {
 | 
				
			||||||
 | 
						DeviceInstancePath string `json:",omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						VirtualFunction uint16 `json:",omitempty"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										23
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/activatelayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/activatelayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,28 +1,23 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
						"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ActivateLayer will find the layer with the given id and mount it's filesystem.
 | 
					// ActivateLayer will find the layer with the given id and mount it's filesystem.
 | 
				
			||||||
// For a read/write layer, the mounted filesystem will appear as a volume on the
 | 
					// For a read/write layer, the mounted filesystem will appear as a volume on the
 | 
				
			||||||
// host, while a read-only layer is generally expected to be a no-op.
 | 
					// host, while a read-only layer is generally expected to be a no-op.
 | 
				
			||||||
// An activated layer must later be deactivated via DeactivateLayer.
 | 
					// An activated layer must later be deactivated via DeactivateLayer.
 | 
				
			||||||
func ActivateLayer(path string) (err error) {
 | 
					func ActivateLayer(ctx context.Context, path string) (err error) {
 | 
				
			||||||
	title := "hcsshim::ActivateLayer"
 | 
						title := "hcsshim::ActivateLayer"
 | 
				
			||||||
	fields := logrus.Fields{
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
		"path": path,
 | 
						defer span.End()
 | 
				
			||||||
	}
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
	logrus.WithFields(fields).Debug(title)
 | 
						span.AddAttributes(trace.StringAttribute("path", path))
 | 
				
			||||||
	defer func() {
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			fields[logrus.ErrorKey] = err
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Error(err)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Debug(title + " - succeeded")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = activateLayer(&stdDriverInfo, path)
 | 
						err = activateLayer(&stdDriverInfo, path)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/baselayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,6 +1,7 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
@@ -8,10 +9,15 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/go-winio"
 | 
						"github.com/Microsoft/go-winio"
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
						"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
				
			||||||
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/safefile"
 | 
						"github.com/Microsoft/hcsshim/internal/safefile"
 | 
				
			||||||
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type baseLayerWriter struct {
 | 
					type baseLayerWriter struct {
 | 
				
			||||||
 | 
						ctx context.Context
 | 
				
			||||||
 | 
						s   *trace.Span
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	root         *os.File
 | 
						root         *os.File
 | 
				
			||||||
	f            *os.File
 | 
						f            *os.File
 | 
				
			||||||
	bw           *winio.BackupFileWriter
 | 
						bw           *winio.BackupFileWriter
 | 
				
			||||||
@@ -136,12 +142,15 @@ func (w *baseLayerWriter) Write(b []byte) (int, error) {
 | 
				
			|||||||
	return n, err
 | 
						return n, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (w *baseLayerWriter) Close() error {
 | 
					func (w *baseLayerWriter) Close() (err error) {
 | 
				
			||||||
 | 
						defer w.s.End()
 | 
				
			||||||
 | 
						defer func() { oc.SetSpanStatus(w.s, err) }()
 | 
				
			||||||
	defer func() {
 | 
						defer func() {
 | 
				
			||||||
		w.root.Close()
 | 
							w.root.Close()
 | 
				
			||||||
		w.root = nil
 | 
							w.root = nil
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
	err := w.closeCurrentFile()
 | 
					
 | 
				
			||||||
 | 
						err = w.closeCurrentFile()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -153,7 +162,7 @@ func (w *baseLayerWriter) Close() error {
 | 
				
			|||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		err = ProcessBaseLayer(w.root.Name())
 | 
							err = ProcessBaseLayer(w.ctx, w.root.Name())
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -163,7 +172,7 @@ func (w *baseLayerWriter) Close() error {
 | 
				
			|||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			err = ProcessUtilityVMImage(filepath.Join(w.root.Name(), "UtilityVM"))
 | 
								err = ProcessUtilityVMImage(w.ctx, filepath.Join(w.root.Name(), "UtilityVM"))
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										26
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/createlayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,27 +1,23 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
						"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CreateLayer creates a new, empty, read-only layer on the filesystem based on
 | 
					// CreateLayer creates a new, empty, read-only layer on the filesystem based on
 | 
				
			||||||
// the parent layer provided.
 | 
					// the parent layer provided.
 | 
				
			||||||
func CreateLayer(path, parent string) (err error) {
 | 
					func CreateLayer(ctx context.Context, path, parent string) (err error) {
 | 
				
			||||||
	title := "hcsshim::CreateLayer"
 | 
						title := "hcsshim::CreateLayer"
 | 
				
			||||||
	fields := logrus.Fields{
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
		"parent": parent,
 | 
						defer span.End()
 | 
				
			||||||
		"path":   path,
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
	}
 | 
						span.AddAttributes(
 | 
				
			||||||
	logrus.WithFields(fields).Debug(title)
 | 
							trace.StringAttribute("path", path),
 | 
				
			||||||
	defer func() {
 | 
							trace.StringAttribute("parent", parent))
 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			fields[logrus.ErrorKey] = err
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Error(err)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Debug(title + " - succeeded")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = createLayer(&stdDriverInfo, path, parent)
 | 
						err = createLayer(&stdDriverInfo, path, parent)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										28
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/createscratchlayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,31 +1,29 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
						"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CreateScratchLayer creates and populates new read-write layer for use by a container.
 | 
					// CreateScratchLayer creates and populates new read-write layer for use by a container.
 | 
				
			||||||
// This requires both the id of the direct parent layer, as well as the full list
 | 
					// This requires both the id of the direct parent layer, as well as the full list
 | 
				
			||||||
// of paths to all parent layers up to the base (and including the direct parent
 | 
					// of paths to all parent layers up to the base (and including the direct parent
 | 
				
			||||||
// whose id was provided).
 | 
					// whose id was provided).
 | 
				
			||||||
func CreateScratchLayer(path string, parentLayerPaths []string) (err error) {
 | 
					func CreateScratchLayer(ctx context.Context, path string, parentLayerPaths []string) (err error) {
 | 
				
			||||||
	title := "hcsshim::CreateScratchLayer"
 | 
						title := "hcsshim::CreateScratchLayer"
 | 
				
			||||||
	fields := logrus.Fields{
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
		"path": path,
 | 
						defer span.End()
 | 
				
			||||||
	}
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
	logrus.WithFields(fields).Debug(title)
 | 
						span.AddAttributes(
 | 
				
			||||||
	defer func() {
 | 
							trace.StringAttribute("path", path),
 | 
				
			||||||
		if err != nil {
 | 
							trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", ")))
 | 
				
			||||||
			fields[logrus.ErrorKey] = err
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Error(err)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Debug(title + " - succeeded")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Generate layer descriptors
 | 
						// Generate layer descriptors
 | 
				
			||||||
	layers, err := layerPathsToDescriptors(parentLayerPaths)
 | 
						layers, err := layerPathsToDescriptors(ctx, parentLayerPaths)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/deactivatelayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/deactivatelayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,25 +1,20 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
						"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DeactivateLayer will dismount a layer that was mounted via ActivateLayer.
 | 
					// DeactivateLayer will dismount a layer that was mounted via ActivateLayer.
 | 
				
			||||||
func DeactivateLayer(path string) (err error) {
 | 
					func DeactivateLayer(ctx context.Context, path string) (err error) {
 | 
				
			||||||
	title := "hcsshim::DeactivateLayer"
 | 
						title := "hcsshim::DeactivateLayer"
 | 
				
			||||||
	fields := logrus.Fields{
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
		"path": path,
 | 
						defer span.End()
 | 
				
			||||||
	}
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
	logrus.WithFields(fields).Debug(title)
 | 
						span.AddAttributes(trace.StringAttribute("path", path))
 | 
				
			||||||
	defer func() {
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			fields[logrus.ErrorKey] = err
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Error(err)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Debug(title + " - succeeded")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = deactivateLayer(&stdDriverInfo, path)
 | 
						err = deactivateLayer(&stdDriverInfo, path)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/destroylayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/destroylayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,26 +1,21 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
						"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DestroyLayer will remove the on-disk files representing the layer with the given
 | 
					// DestroyLayer will remove the on-disk files representing the layer with the given
 | 
				
			||||||
// path, including that layer's containing folder, if any.
 | 
					// path, including that layer's containing folder, if any.
 | 
				
			||||||
func DestroyLayer(path string) (err error) {
 | 
					func DestroyLayer(ctx context.Context, path string) (err error) {
 | 
				
			||||||
	title := "hcsshim::DestroyLayer"
 | 
						title := "hcsshim::DestroyLayer"
 | 
				
			||||||
	fields := logrus.Fields{
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
		"path": path,
 | 
						defer span.End()
 | 
				
			||||||
	}
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
	logrus.WithFields(fields).Debug(title)
 | 
						span.AddAttributes(trace.StringAttribute("path", path))
 | 
				
			||||||
	defer func() {
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			fields[logrus.ErrorKey] = err
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Error(err)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Debug(title + " - succeeded")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = destroyLayer(&stdDriverInfo, path)
 | 
						err = destroyLayer(&stdDriverInfo, path)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										31
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/expandscratchsize.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,32 +1,27 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
	"syscall"
 | 
						"syscall"
 | 
				
			||||||
	"unsafe"
 | 
						"unsafe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
						"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
				
			||||||
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/osversion"
 | 
						"github.com/Microsoft/hcsshim/osversion"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ExpandScratchSize expands the size of a layer to at least size bytes.
 | 
					// ExpandScratchSize expands the size of a layer to at least size bytes.
 | 
				
			||||||
func ExpandScratchSize(path string, size uint64) (err error) {
 | 
					func ExpandScratchSize(ctx context.Context, path string, size uint64) (err error) {
 | 
				
			||||||
	title := "hcsshim::ExpandScratchSize"
 | 
						title := "hcsshim::ExpandScratchSize"
 | 
				
			||||||
	fields := logrus.Fields{
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
		"path": path,
 | 
						defer span.End()
 | 
				
			||||||
		"size": size,
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
	}
 | 
						span.AddAttributes(
 | 
				
			||||||
	logrus.WithFields(fields).Debug(title)
 | 
							trace.StringAttribute("path", path),
 | 
				
			||||||
	defer func() {
 | 
							trace.Int64Attribute("size", int64(size)))
 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			fields[logrus.ErrorKey] = err
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Error(err)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Debug(title + " - succeeded")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = expandSandboxSize(&stdDriverInfo, path, size)
 | 
						err = expandSandboxSize(&stdDriverInfo, path, size)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -36,7 +31,7 @@ func ExpandScratchSize(path string, size uint64) (err error) {
 | 
				
			|||||||
	// Manually expand the volume now in order to work around bugs in 19H1 and
 | 
						// Manually expand the volume now in order to work around bugs in 19H1 and
 | 
				
			||||||
	// prerelease versions of Vb. Remove once this is fixed in Windows.
 | 
						// prerelease versions of Vb. Remove once this is fixed in Windows.
 | 
				
			||||||
	if build := osversion.Get().Build; build >= osversion.V19H1 && build < 19020 {
 | 
						if build := osversion.Get().Build; build >= osversion.V19H1 && build < 19020 {
 | 
				
			||||||
		err = expandSandboxVolume(path)
 | 
							err = expandSandboxVolume(ctx, path)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -84,7 +79,7 @@ func attachVhd(path string) (syscall.Handle, error) {
 | 
				
			|||||||
	return handle, nil
 | 
						return handle, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func expandSandboxVolume(path string) error {
 | 
					func expandSandboxVolume(ctx context.Context, path string) error {
 | 
				
			||||||
	// Mount the sandbox VHD temporarily.
 | 
						// Mount the sandbox VHD temporarily.
 | 
				
			||||||
	vhdPath := filepath.Join(path, "sandbox.vhdx")
 | 
						vhdPath := filepath.Join(path, "sandbox.vhdx")
 | 
				
			||||||
	vhd, err := attachVhd(vhdPath)
 | 
						vhd, err := attachVhd(vhdPath)
 | 
				
			||||||
@@ -94,7 +89,7 @@ func expandSandboxVolume(path string) error {
 | 
				
			|||||||
	defer syscall.Close(vhd)
 | 
						defer syscall.Close(vhd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Open the volume.
 | 
						// Open the volume.
 | 
				
			||||||
	volumePath, err := GetLayerMountPath(path)
 | 
						volumePath, err := GetLayerMountPath(ctx, path)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										60
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/exportlayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										60
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/exportlayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,12 +1,15 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
	"io/ioutil"
 | 
						"io/ioutil"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/go-winio"
 | 
						"github.com/Microsoft/go-winio"
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
						"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ExportLayer will create a folder at exportFolderPath and fill that folder with
 | 
					// ExportLayer will create a folder at exportFolderPath and fill that folder with
 | 
				
			||||||
@@ -14,24 +17,18 @@ import (
 | 
				
			|||||||
// format includes any metadata required for later importing the layer (using
 | 
					// format includes any metadata required for later importing the layer (using
 | 
				
			||||||
// ImportLayer), and requires the full list of parent layer paths in order to
 | 
					// ImportLayer), and requires the full list of parent layer paths in order to
 | 
				
			||||||
// perform the export.
 | 
					// perform the export.
 | 
				
			||||||
func ExportLayer(path string, exportFolderPath string, parentLayerPaths []string) (err error) {
 | 
					func ExportLayer(ctx context.Context, path string, exportFolderPath string, parentLayerPaths []string) (err error) {
 | 
				
			||||||
	title := "hcsshim::ExportLayer"
 | 
						title := "hcsshim::ExportLayer"
 | 
				
			||||||
	fields := logrus.Fields{
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
		"path":             path,
 | 
						defer span.End()
 | 
				
			||||||
		"exportFolderPath": exportFolderPath,
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
	}
 | 
						span.AddAttributes(
 | 
				
			||||||
	logrus.WithFields(fields).Debug(title)
 | 
							trace.StringAttribute("path", path),
 | 
				
			||||||
	defer func() {
 | 
							trace.StringAttribute("exportFolderPath", exportFolderPath),
 | 
				
			||||||
		if err != nil {
 | 
							trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", ")))
 | 
				
			||||||
			fields[logrus.ErrorKey] = err
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Error(err)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Debug(title + " - succeeded")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Generate layer descriptors
 | 
						// Generate layer descriptors
 | 
				
			||||||
	layers, err := layerPathsToDescriptors(parentLayerPaths)
 | 
						layers, err := layerPathsToDescriptors(ctx, parentLayerPaths)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -52,25 +49,46 @@ type LayerReader interface {
 | 
				
			|||||||
// NewLayerReader returns a new layer reader for reading the contents of an on-disk layer.
 | 
					// NewLayerReader returns a new layer reader for reading the contents of an on-disk layer.
 | 
				
			||||||
// The caller must have taken the SeBackupPrivilege privilege
 | 
					// The caller must have taken the SeBackupPrivilege privilege
 | 
				
			||||||
// to call this and any methods on the resulting LayerReader.
 | 
					// to call this and any methods on the resulting LayerReader.
 | 
				
			||||||
func NewLayerReader(path string, parentLayerPaths []string) (LayerReader, error) {
 | 
					func NewLayerReader(ctx context.Context, path string, parentLayerPaths []string) (_ LayerReader, err error) {
 | 
				
			||||||
 | 
						ctx, span := trace.StartSpan(ctx, "hcsshim::NewLayerReader")
 | 
				
			||||||
 | 
						defer func() {
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								oc.SetSpanStatus(span, err)
 | 
				
			||||||
 | 
								span.End()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
						span.AddAttributes(
 | 
				
			||||||
 | 
							trace.StringAttribute("path", path),
 | 
				
			||||||
 | 
							trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", ")))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	exportPath, err := ioutil.TempDir("", "hcs")
 | 
						exportPath, err := ioutil.TempDir("", "hcs")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	err = ExportLayer(path, exportPath, parentLayerPaths)
 | 
						err = ExportLayer(ctx, path, exportPath, parentLayerPaths)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		os.RemoveAll(exportPath)
 | 
							os.RemoveAll(exportPath)
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return &legacyLayerReaderWrapper{newLegacyLayerReader(exportPath)}, nil
 | 
						return &legacyLayerReaderWrapper{
 | 
				
			||||||
 | 
							ctx:               ctx,
 | 
				
			||||||
 | 
							s:                 span,
 | 
				
			||||||
 | 
							legacyLayerReader: newLegacyLayerReader(exportPath),
 | 
				
			||||||
 | 
						}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type legacyLayerReaderWrapper struct {
 | 
					type legacyLayerReaderWrapper struct {
 | 
				
			||||||
 | 
						ctx context.Context
 | 
				
			||||||
 | 
						s   *trace.Span
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	*legacyLayerReader
 | 
						*legacyLayerReader
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (r *legacyLayerReaderWrapper) Close() error {
 | 
					func (r *legacyLayerReaderWrapper) Close() (err error) {
 | 
				
			||||||
	err := r.legacyLayerReader.Close()
 | 
						defer r.s.End()
 | 
				
			||||||
 | 
						defer func() { oc.SetSpanStatus(r.s, err) }()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = r.legacyLayerReader.Close()
 | 
				
			||||||
	os.RemoveAll(r.root)
 | 
						os.RemoveAll(r.root)
 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										29
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/getlayermountpath.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/getlayermountpath.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,36 +1,31 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
	"syscall"
 | 
						"syscall"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
						"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/Microsoft/hcsshim/internal/log"
 | 
				
			||||||
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetLayerMountPath will look for a mounted layer with the given path and return
 | 
					// GetLayerMountPath will look for a mounted layer with the given path and return
 | 
				
			||||||
// the path at which that layer can be accessed.  This path may be a volume path
 | 
					// the path at which that layer can be accessed.  This path may be a volume path
 | 
				
			||||||
// if the layer is a mounted read-write layer, otherwise it is expected to be the
 | 
					// if the layer is a mounted read-write layer, otherwise it is expected to be the
 | 
				
			||||||
// folder path at which the layer is stored.
 | 
					// folder path at which the layer is stored.
 | 
				
			||||||
func GetLayerMountPath(path string) (_ string, err error) {
 | 
					func GetLayerMountPath(ctx context.Context, path string) (_ string, err error) {
 | 
				
			||||||
	title := "hcsshim::GetLayerMountPath"
 | 
						title := "hcsshim::GetLayerMountPath"
 | 
				
			||||||
	fields := logrus.Fields{
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
		"path": path,
 | 
						defer span.End()
 | 
				
			||||||
	}
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
	logrus.WithFields(fields).Debug(title)
 | 
						span.AddAttributes(trace.StringAttribute("path", path))
 | 
				
			||||||
	defer func() {
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			fields[logrus.ErrorKey] = err
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Error(err)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Debug(title + " - succeeded")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var mountPathLength uintptr
 | 
						var mountPathLength uintptr
 | 
				
			||||||
	mountPathLength = 0
 | 
						mountPathLength = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Call the procedure itself.
 | 
						// Call the procedure itself.
 | 
				
			||||||
	logrus.WithFields(fields).Debug("Calling proc (1)")
 | 
						log.G(ctx).Debug("Calling proc (1)")
 | 
				
			||||||
	err = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, nil)
 | 
						err = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, nil)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", hcserror.New(err, title+" - failed", "(first call)")
 | 
							return "", hcserror.New(err, title+" - failed", "(first call)")
 | 
				
			||||||
@@ -44,13 +39,13 @@ func GetLayerMountPath(path string) (_ string, err error) {
 | 
				
			|||||||
	mountPathp[0] = 0
 | 
						mountPathp[0] = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Call the procedure again
 | 
						// Call the procedure again
 | 
				
			||||||
	logrus.WithFields(fields).Debug("Calling proc (2)")
 | 
						log.G(ctx).Debug("Calling proc (2)")
 | 
				
			||||||
	err = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, &mountPathp[0])
 | 
						err = getLayerMountPath(&stdDriverInfo, path, &mountPathLength, &mountPathp[0])
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", hcserror.New(err, title+" - failed", "(second call)")
 | 
							return "", hcserror.New(err, title+" - failed", "(second call)")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mountPath := syscall.UTF16ToString(mountPathp[0:])
 | 
						mountPath := syscall.UTF16ToString(mountPathp[0:])
 | 
				
			||||||
	fields["mountPath"] = mountPath
 | 
						span.AddAttributes(trace.StringAttribute("mountPath", mountPath))
 | 
				
			||||||
	return mountPath, nil
 | 
						return mountPath, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										22
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/getsharedbaseimages.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/getsharedbaseimages.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,29 +1,29 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
						"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/interop"
 | 
						"github.com/Microsoft/hcsshim/internal/interop"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetSharedBaseImages will enumerate the images stored in the common central
 | 
					// GetSharedBaseImages will enumerate the images stored in the common central
 | 
				
			||||||
// image store and return descriptive info about those images for the purpose
 | 
					// image store and return descriptive info about those images for the purpose
 | 
				
			||||||
// of registering them with the graphdriver, graph, and tagstore.
 | 
					// of registering them with the graphdriver, graph, and tagstore.
 | 
				
			||||||
func GetSharedBaseImages() (imageData string, err error) {
 | 
					func GetSharedBaseImages(ctx context.Context) (_ string, err error) {
 | 
				
			||||||
	title := "hcsshim::GetSharedBaseImages"
 | 
						title := "hcsshim::GetSharedBaseImages"
 | 
				
			||||||
	logrus.Debug(title)
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
	defer func() {
 | 
						defer span.End()
 | 
				
			||||||
		if err != nil {
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
			logrus.WithError(err).Error(err)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			logrus.WithField("imageData", imageData).Debug(title + " - succeeded")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var buffer *uint16
 | 
						var buffer *uint16
 | 
				
			||||||
	err = getBaseImages(&buffer)
 | 
						err = getBaseImages(&buffer)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", hcserror.New(err, title+" - failed", "")
 | 
							return "", hcserror.New(err, title+" - failed", "")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return interop.ConvertAndFreeCoTaskMemString(buffer), nil
 | 
						imageData := interop.ConvertAndFreeCoTaskMemString(buffer)
 | 
				
			||||||
 | 
						span.AddAttributes(trace.StringAttribute("imageData", imageData))
 | 
				
			||||||
 | 
						return imageData, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										26
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/grantvmaccess.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/grantvmaccess.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,26 +1,22 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
						"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GrantVmAccess adds access to a file for a given VM
 | 
					// GrantVmAccess adds access to a file for a given VM
 | 
				
			||||||
func GrantVmAccess(vmid string, filepath string) (err error) {
 | 
					func GrantVmAccess(ctx context.Context, vmid string, filepath string) (err error) {
 | 
				
			||||||
	title := "hcsshim::GrantVmAccess"
 | 
						title := "hcsshim::GrantVmAccess"
 | 
				
			||||||
	fields := logrus.Fields{
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
		"vm-id": vmid,
 | 
						defer span.End()
 | 
				
			||||||
		"path":  filepath,
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
	}
 | 
						span.AddAttributes(
 | 
				
			||||||
	logrus.WithFields(fields).Debug(title)
 | 
							trace.StringAttribute("vm-id", vmid),
 | 
				
			||||||
	defer func() {
 | 
							trace.StringAttribute("path", filepath))
 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			fields[logrus.ErrorKey] = err
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Error(err)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Debug(title + " - succeeded")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = grantVmAccess(vmid, filepath)
 | 
						err = grantVmAccess(vmid, filepath)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										60
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/importlayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										60
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/importlayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,38 +1,35 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
	"io/ioutil"
 | 
						"io/ioutil"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/go-winio"
 | 
						"github.com/Microsoft/go-winio"
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
						"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
				
			||||||
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/safefile"
 | 
						"github.com/Microsoft/hcsshim/internal/safefile"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ImportLayer will take the contents of the folder at importFolderPath and import
 | 
					// ImportLayer will take the contents of the folder at importFolderPath and import
 | 
				
			||||||
// that into a layer with the id layerId.  Note that in order to correctly populate
 | 
					// that into a layer with the id layerId.  Note that in order to correctly populate
 | 
				
			||||||
// the layer and interperet the transport format, all parent layers must already
 | 
					// the layer and interperet the transport format, all parent layers must already
 | 
				
			||||||
// be present on the system at the paths provided in parentLayerPaths.
 | 
					// be present on the system at the paths provided in parentLayerPaths.
 | 
				
			||||||
func ImportLayer(path string, importFolderPath string, parentLayerPaths []string) (err error) {
 | 
					func ImportLayer(ctx context.Context, path string, importFolderPath string, parentLayerPaths []string) (err error) {
 | 
				
			||||||
	title := "hcsshim::ImportLayer"
 | 
						title := "hcsshim::ImportLayer"
 | 
				
			||||||
	fields := logrus.Fields{
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
		"path":             path,
 | 
						defer span.End()
 | 
				
			||||||
		"importFolderPath": importFolderPath,
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
	}
 | 
						span.AddAttributes(
 | 
				
			||||||
	logrus.WithFields(fields).Debug(title)
 | 
							trace.StringAttribute("path", path),
 | 
				
			||||||
	defer func() {
 | 
							trace.StringAttribute("importFolderPath", importFolderPath),
 | 
				
			||||||
		if err != nil {
 | 
							trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", ")))
 | 
				
			||||||
			fields[logrus.ErrorKey] = err
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Error(err)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Debug(title + " - succeeded")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Generate layer descriptors
 | 
						// Generate layer descriptors
 | 
				
			||||||
	layers, err := layerPathsToDescriptors(parentLayerPaths)
 | 
						layers, err := layerPathsToDescriptors(ctx, parentLayerPaths)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -60,20 +57,26 @@ type LayerWriter interface {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type legacyLayerWriterWrapper struct {
 | 
					type legacyLayerWriterWrapper struct {
 | 
				
			||||||
 | 
						ctx context.Context
 | 
				
			||||||
 | 
						s   *trace.Span
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	*legacyLayerWriter
 | 
						*legacyLayerWriter
 | 
				
			||||||
	path             string
 | 
						path             string
 | 
				
			||||||
	parentLayerPaths []string
 | 
						parentLayerPaths []string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (r *legacyLayerWriterWrapper) Close() error {
 | 
					func (r *legacyLayerWriterWrapper) Close() (err error) {
 | 
				
			||||||
 | 
						defer r.s.End()
 | 
				
			||||||
 | 
						defer func() { oc.SetSpanStatus(r.s, err) }()
 | 
				
			||||||
	defer os.RemoveAll(r.root.Name())
 | 
						defer os.RemoveAll(r.root.Name())
 | 
				
			||||||
	defer r.legacyLayerWriter.CloseRoots()
 | 
						defer r.legacyLayerWriter.CloseRoots()
 | 
				
			||||||
	err := r.legacyLayerWriter.Close()
 | 
					
 | 
				
			||||||
 | 
						err = r.legacyLayerWriter.Close()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err = ImportLayer(r.destRoot.Name(), r.path, r.parentLayerPaths); err != nil {
 | 
						if err = ImportLayer(r.ctx, r.destRoot.Name(), r.path, r.parentLayerPaths); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, name := range r.Tombstones {
 | 
						for _, name := range r.Tombstones {
 | 
				
			||||||
@@ -96,7 +99,7 @@ func (r *legacyLayerWriterWrapper) Close() error {
 | 
				
			|||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		err = ProcessUtilityVMImage(filepath.Join(r.destRoot.Name(), "UtilityVM"))
 | 
							err = ProcessUtilityVMImage(r.ctx, filepath.Join(r.destRoot.Name(), "UtilityVM"))
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -107,7 +110,18 @@ func (r *legacyLayerWriterWrapper) Close() error {
 | 
				
			|||||||
// NewLayerWriter returns a new layer writer for creating a layer on disk.
 | 
					// NewLayerWriter returns a new layer writer for creating a layer on disk.
 | 
				
			||||||
// The caller must have taken the SeBackupPrivilege and SeRestorePrivilege privileges
 | 
					// The caller must have taken the SeBackupPrivilege and SeRestorePrivilege privileges
 | 
				
			||||||
// to call this and any methods on the resulting LayerWriter.
 | 
					// to call this and any methods on the resulting LayerWriter.
 | 
				
			||||||
func NewLayerWriter(path string, parentLayerPaths []string) (LayerWriter, error) {
 | 
					func NewLayerWriter(ctx context.Context, path string, parentLayerPaths []string) (_ LayerWriter, err error) {
 | 
				
			||||||
 | 
						ctx, span := trace.StartSpan(ctx, "hcsshim::NewLayerWriter")
 | 
				
			||||||
 | 
						defer func() {
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								oc.SetSpanStatus(span, err)
 | 
				
			||||||
 | 
								span.End()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
						span.AddAttributes(
 | 
				
			||||||
 | 
							trace.StringAttribute("path", path),
 | 
				
			||||||
 | 
							trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", ")))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(parentLayerPaths) == 0 {
 | 
						if len(parentLayerPaths) == 0 {
 | 
				
			||||||
		// This is a base layer. It gets imported differently.
 | 
							// This is a base layer. It gets imported differently.
 | 
				
			||||||
		f, err := safefile.OpenRoot(path)
 | 
							f, err := safefile.OpenRoot(path)
 | 
				
			||||||
@@ -115,6 +129,8 @@ func NewLayerWriter(path string, parentLayerPaths []string) (LayerWriter, error)
 | 
				
			|||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return &baseLayerWriter{
 | 
							return &baseLayerWriter{
 | 
				
			||||||
 | 
								ctx:  ctx,
 | 
				
			||||||
 | 
								s:    span,
 | 
				
			||||||
			root: f,
 | 
								root: f,
 | 
				
			||||||
		}, nil
 | 
							}, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -128,6 +144,8 @@ func NewLayerWriter(path string, parentLayerPaths []string) (LayerWriter, error)
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return &legacyLayerWriterWrapper{
 | 
						return &legacyLayerWriterWrapper{
 | 
				
			||||||
 | 
							ctx:               ctx,
 | 
				
			||||||
 | 
							s:                 span,
 | 
				
			||||||
		legacyLayerWriter: w,
 | 
							legacyLayerWriter: w,
 | 
				
			||||||
		path:              importPath,
 | 
							path:              importPath,
 | 
				
			||||||
		parentLayerPaths:  parentLayerPaths,
 | 
							parentLayerPaths:  parentLayerPaths,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										25
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerexists.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerexists.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,26 +1,21 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
						"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// LayerExists will return true if a layer with the given id exists and is known
 | 
					// LayerExists will return true if a layer with the given id exists and is known
 | 
				
			||||||
// to the system.
 | 
					// to the system.
 | 
				
			||||||
func LayerExists(path string) (_ bool, err error) {
 | 
					func LayerExists(ctx context.Context, path string) (_ bool, err error) {
 | 
				
			||||||
	title := "hcsshim::LayerExists"
 | 
						title := "hcsshim::LayerExists"
 | 
				
			||||||
	fields := logrus.Fields{
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
		"path": path,
 | 
						defer span.End()
 | 
				
			||||||
	}
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
	logrus.WithFields(fields).Debug(title)
 | 
						span.AddAttributes(trace.StringAttribute("path", path))
 | 
				
			||||||
	defer func() {
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			fields[logrus.ErrorKey] = err
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Error(err)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Debug(title + " - succeeded")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Call the procedure itself.
 | 
						// Call the procedure itself.
 | 
				
			||||||
	var exists uint32
 | 
						var exists uint32
 | 
				
			||||||
@@ -28,6 +23,6 @@ func LayerExists(path string) (_ bool, err error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return false, hcserror.New(err, title+" - failed", "")
 | 
							return false, hcserror.New(err, title+" - failed", "")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	fields["layer-exists"] = exists != 0
 | 
						span.AddAttributes(trace.BoolAttribute("layer-exists", exists != 0))
 | 
				
			||||||
	return exists != 0, nil
 | 
						return exists != 0, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerid.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerid.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,13 +1,22 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/go-winio/pkg/guid"
 | 
						"github.com/Microsoft/go-winio/pkg/guid"
 | 
				
			||||||
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// LayerID returns the layer ID of a layer on disk.
 | 
					// LayerID returns the layer ID of a layer on disk.
 | 
				
			||||||
func LayerID(path string) (guid.GUID, error) {
 | 
					func LayerID(ctx context.Context, path string) (_ guid.GUID, err error) {
 | 
				
			||||||
 | 
						title := "hcsshim::LayerID"
 | 
				
			||||||
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
 | 
						defer span.End()
 | 
				
			||||||
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
 | 
						span.AddAttributes(trace.StringAttribute("path", path))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_, file := filepath.Split(path)
 | 
						_, file := filepath.Split(path)
 | 
				
			||||||
	return NameToGuid(file)
 | 
						return NameToGuid(ctx, file)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerutils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/layerutils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -4,6 +4,7 @@ package wclayer
 | 
				
			|||||||
// functionality.
 | 
					// functionality.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
	"syscall"
 | 
						"syscall"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/go-winio/pkg/guid"
 | 
						"github.com/Microsoft/go-winio/pkg/guid"
 | 
				
			||||||
@@ -68,12 +69,12 @@ type WC_LAYER_DESCRIPTOR struct {
 | 
				
			|||||||
	Pathp   *uint16
 | 
						Pathp   *uint16
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func layerPathsToDescriptors(parentLayerPaths []string) ([]WC_LAYER_DESCRIPTOR, error) {
 | 
					func layerPathsToDescriptors(ctx context.Context, parentLayerPaths []string) ([]WC_LAYER_DESCRIPTOR, error) {
 | 
				
			||||||
	// Array of descriptors that gets constructed.
 | 
						// Array of descriptors that gets constructed.
 | 
				
			||||||
	var layers []WC_LAYER_DESCRIPTOR
 | 
						var layers []WC_LAYER_DESCRIPTOR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for i := 0; i < len(parentLayerPaths); i++ {
 | 
						for i := 0; i < len(parentLayerPaths); i++ {
 | 
				
			||||||
		g, err := LayerID(parentLayerPaths[i])
 | 
							g, err := LayerID(ctx, parentLayerPaths[i])
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			logrus.WithError(err).Debug("Failed to convert name to guid")
 | 
								logrus.WithError(err).Debug("Failed to convert name to guid")
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										31
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/nametoguid.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/nametoguid.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,34 +1,29 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/go-winio/pkg/guid"
 | 
						"github.com/Microsoft/go-winio/pkg/guid"
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
						"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NameToGuid converts the given string into a GUID using the algorithm in the
 | 
					// NameToGuid converts the given string into a GUID using the algorithm in the
 | 
				
			||||||
// Host Compute Service, ensuring GUIDs generated with the same string are common
 | 
					// Host Compute Service, ensuring GUIDs generated with the same string are common
 | 
				
			||||||
// across all clients.
 | 
					// across all clients.
 | 
				
			||||||
func NameToGuid(name string) (id guid.GUID, err error) {
 | 
					func NameToGuid(ctx context.Context, name string) (_ guid.GUID, err error) {
 | 
				
			||||||
	title := "hcsshim::NameToGuid"
 | 
						title := "hcsshim::NameToGuid"
 | 
				
			||||||
	fields := logrus.Fields{
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
		"name": name,
 | 
						defer span.End()
 | 
				
			||||||
	}
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
	logrus.WithFields(fields).Debug(title)
 | 
						span.AddAttributes(trace.StringAttribute("name", name))
 | 
				
			||||||
	defer func() {
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			fields[logrus.ErrorKey] = err
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Error(err)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Debug(title + " - succeeded")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var id guid.GUID
 | 
				
			||||||
	err = nameToGuid(name, &id)
 | 
						err = nameToGuid(name, &id)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		err = hcserror.New(err, title+" - failed", "")
 | 
							return guid.GUID{}, hcserror.New(err, title+" - failed", "")
 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	fields["guid"] = id.String()
 | 
						span.AddAttributes(trace.StringAttribute("guid", id.String()))
 | 
				
			||||||
	return
 | 
						return id, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										27
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/preparelayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/preparelayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,10 +1,13 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
						"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var prepareLayerLock sync.Mutex
 | 
					var prepareLayerLock sync.Mutex
 | 
				
			||||||
@@ -14,23 +17,17 @@ var prepareLayerLock sync.Mutex
 | 
				
			|||||||
// parent layers, and is necessary in order to view or interact with the layer
 | 
					// parent layers, and is necessary in order to view or interact with the layer
 | 
				
			||||||
// as an actual filesystem (reading and writing files, creating directories, etc).
 | 
					// as an actual filesystem (reading and writing files, creating directories, etc).
 | 
				
			||||||
// Disabling the filter must be done via UnprepareLayer.
 | 
					// Disabling the filter must be done via UnprepareLayer.
 | 
				
			||||||
func PrepareLayer(path string, parentLayerPaths []string) (err error) {
 | 
					func PrepareLayer(ctx context.Context, path string, parentLayerPaths []string) (err error) {
 | 
				
			||||||
	title := "hcsshim::PrepareLayer"
 | 
						title := "hcsshim::PrepareLayer"
 | 
				
			||||||
	fields := logrus.Fields{
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
		"path": path,
 | 
						defer span.End()
 | 
				
			||||||
	}
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
	logrus.WithFields(fields).Debug(title)
 | 
						span.AddAttributes(
 | 
				
			||||||
	defer func() {
 | 
							trace.StringAttribute("path", path),
 | 
				
			||||||
		if err != nil {
 | 
							trace.StringAttribute("parentLayerPaths", strings.Join(parentLayerPaths, ", ")))
 | 
				
			||||||
			fields[logrus.ErrorKey] = err
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Error(err)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Debug(title + " - succeeded")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Generate layer descriptors
 | 
						// Generate layer descriptors
 | 
				
			||||||
	layers, err := layerPathsToDescriptors(parentLayerPaths)
 | 
						layers, err := layerPathsToDescriptors(ctx, parentLayerPaths)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										32
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/processimage.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/processimage.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,23 +1,41 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "os"
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ProcessBaseLayer post-processes a base layer that has had its files extracted.
 | 
					// ProcessBaseLayer post-processes a base layer that has had its files extracted.
 | 
				
			||||||
// The files should have been extracted to <path>\Files.
 | 
					// The files should have been extracted to <path>\Files.
 | 
				
			||||||
func ProcessBaseLayer(path string) error {
 | 
					func ProcessBaseLayer(ctx context.Context, path string) (err error) {
 | 
				
			||||||
	err := processBaseImage(path)
 | 
						title := "hcsshim::ProcessBaseLayer"
 | 
				
			||||||
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
 | 
						defer span.End()
 | 
				
			||||||
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
 | 
						span.AddAttributes(trace.StringAttribute("path", path))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = processBaseImage(path)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return &os.PathError{Op: "ProcessBaseLayer", Path: path, Err: err}
 | 
							return &os.PathError{Op: title, Path: path, Err: err}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ProcessUtilityVMImage post-processes a utility VM image that has had its files extracted.
 | 
					// ProcessUtilityVMImage post-processes a utility VM image that has had its files extracted.
 | 
				
			||||||
// The files should have been extracted to <path>\Files.
 | 
					// The files should have been extracted to <path>\Files.
 | 
				
			||||||
func ProcessUtilityVMImage(path string) error {
 | 
					func ProcessUtilityVMImage(ctx context.Context, path string) (err error) {
 | 
				
			||||||
	err := processUtilityImage(path)
 | 
						title := "hcsshim::ProcessUtilityVMImage"
 | 
				
			||||||
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
 | 
						defer span.End()
 | 
				
			||||||
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
 | 
						span.AddAttributes(trace.StringAttribute("path", path))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = processUtilityImage(path)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return &os.PathError{Op: "ProcessUtilityVMImage", Path: path, Err: err}
 | 
							return &os.PathError{Op: title, Path: path, Err: err}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/unpreparelayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/Microsoft/hcsshim/internal/wclayer/unpreparelayer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,26 +1,21 @@
 | 
				
			|||||||
package wclayer
 | 
					package wclayer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
						"github.com/Microsoft/hcsshim/internal/hcserror"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/Microsoft/hcsshim/internal/oc"
 | 
				
			||||||
 | 
						"go.opencensus.io/trace"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UnprepareLayer disables the filesystem filter for the read-write layer with
 | 
					// UnprepareLayer disables the filesystem filter for the read-write layer with
 | 
				
			||||||
// the given id.
 | 
					// the given id.
 | 
				
			||||||
func UnprepareLayer(path string) (err error) {
 | 
					func UnprepareLayer(ctx context.Context, path string) (err error) {
 | 
				
			||||||
	title := "hcsshim::UnprepareLayer"
 | 
						title := "hcsshim::UnprepareLayer"
 | 
				
			||||||
	fields := logrus.Fields{
 | 
						ctx, span := trace.StartSpan(ctx, title)
 | 
				
			||||||
		"path": path,
 | 
						defer span.End()
 | 
				
			||||||
	}
 | 
						defer func() { oc.SetSpanStatus(span, err) }()
 | 
				
			||||||
	logrus.WithFields(fields).Debug(title)
 | 
						span.AddAttributes(trace.StringAttribute("path", path))
 | 
				
			||||||
	defer func() {
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			fields[logrus.ErrorKey] = err
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Error(err)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			logrus.WithFields(fields).Debug(title + " - succeeded")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = unprepareLayer(&stdDriverInfo, path)
 | 
						err = unprepareLayer(&stdDriverInfo, path)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										41
									
								
								vendor/github.com/Microsoft/hcsshim/layer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								vendor/github.com/Microsoft/hcsshim/layer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,6 +1,7 @@
 | 
				
			|||||||
package hcsshim
 | 
					package hcsshim
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
	"crypto/sha1"
 | 
						"crypto/sha1"
 | 
				
			||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -13,59 +14,59 @@ func layerPath(info *DriverInfo, id string) string {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ActivateLayer(info DriverInfo, id string) error {
 | 
					func ActivateLayer(info DriverInfo, id string) error {
 | 
				
			||||||
	return wclayer.ActivateLayer(layerPath(&info, id))
 | 
						return wclayer.ActivateLayer(context.Background(), layerPath(&info, id))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func CreateLayer(info DriverInfo, id, parent string) error {
 | 
					func CreateLayer(info DriverInfo, id, parent string) error {
 | 
				
			||||||
	return wclayer.CreateLayer(layerPath(&info, id), parent)
 | 
						return wclayer.CreateLayer(context.Background(), layerPath(&info, id), parent)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// New clients should use CreateScratchLayer instead. Kept in to preserve API compatibility.
 | 
					// New clients should use CreateScratchLayer instead. Kept in to preserve API compatibility.
 | 
				
			||||||
func CreateSandboxLayer(info DriverInfo, layerId, parentId string, parentLayerPaths []string) error {
 | 
					func CreateSandboxLayer(info DriverInfo, layerId, parentId string, parentLayerPaths []string) error {
 | 
				
			||||||
	return wclayer.CreateScratchLayer(layerPath(&info, layerId), parentLayerPaths)
 | 
						return wclayer.CreateScratchLayer(context.Background(), layerPath(&info, layerId), parentLayerPaths)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func CreateScratchLayer(info DriverInfo, layerId, parentId string, parentLayerPaths []string) error {
 | 
					func CreateScratchLayer(info DriverInfo, layerId, parentId string, parentLayerPaths []string) error {
 | 
				
			||||||
	return wclayer.CreateScratchLayer(layerPath(&info, layerId), parentLayerPaths)
 | 
						return wclayer.CreateScratchLayer(context.Background(), layerPath(&info, layerId), parentLayerPaths)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func DeactivateLayer(info DriverInfo, id string) error {
 | 
					func DeactivateLayer(info DriverInfo, id string) error {
 | 
				
			||||||
	return wclayer.DeactivateLayer(layerPath(&info, id))
 | 
						return wclayer.DeactivateLayer(context.Background(), layerPath(&info, id))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func DestroyLayer(info DriverInfo, id string) error {
 | 
					func DestroyLayer(info DriverInfo, id string) error {
 | 
				
			||||||
	return wclayer.DestroyLayer(layerPath(&info, id))
 | 
						return wclayer.DestroyLayer(context.Background(), layerPath(&info, id))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// New clients should use ExpandScratchSize instead. Kept in to preserve API compatibility.
 | 
					// New clients should use ExpandScratchSize instead. Kept in to preserve API compatibility.
 | 
				
			||||||
func ExpandSandboxSize(info DriverInfo, layerId string, size uint64) error {
 | 
					func ExpandSandboxSize(info DriverInfo, layerId string, size uint64) error {
 | 
				
			||||||
	return wclayer.ExpandScratchSize(layerPath(&info, layerId), size)
 | 
						return wclayer.ExpandScratchSize(context.Background(), layerPath(&info, layerId), size)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func ExpandScratchSize(info DriverInfo, layerId string, size uint64) error {
 | 
					func ExpandScratchSize(info DriverInfo, layerId string, size uint64) error {
 | 
				
			||||||
	return wclayer.ExpandScratchSize(layerPath(&info, layerId), size)
 | 
						return wclayer.ExpandScratchSize(context.Background(), layerPath(&info, layerId), size)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func ExportLayer(info DriverInfo, layerId string, exportFolderPath string, parentLayerPaths []string) error {
 | 
					func ExportLayer(info DriverInfo, layerId string, exportFolderPath string, parentLayerPaths []string) error {
 | 
				
			||||||
	return wclayer.ExportLayer(layerPath(&info, layerId), exportFolderPath, parentLayerPaths)
 | 
						return wclayer.ExportLayer(context.Background(), layerPath(&info, layerId), exportFolderPath, parentLayerPaths)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func GetLayerMountPath(info DriverInfo, id string) (string, error) {
 | 
					func GetLayerMountPath(info DriverInfo, id string) (string, error) {
 | 
				
			||||||
	return wclayer.GetLayerMountPath(layerPath(&info, id))
 | 
						return wclayer.GetLayerMountPath(context.Background(), layerPath(&info, id))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func GetSharedBaseImages() (imageData string, err error) {
 | 
					func GetSharedBaseImages() (imageData string, err error) {
 | 
				
			||||||
	return wclayer.GetSharedBaseImages()
 | 
						return wclayer.GetSharedBaseImages(context.Background())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func ImportLayer(info DriverInfo, layerID string, importFolderPath string, parentLayerPaths []string) error {
 | 
					func ImportLayer(info DriverInfo, layerID string, importFolderPath string, parentLayerPaths []string) error {
 | 
				
			||||||
	return wclayer.ImportLayer(layerPath(&info, layerID), importFolderPath, parentLayerPaths)
 | 
						return wclayer.ImportLayer(context.Background(), layerPath(&info, layerID), importFolderPath, parentLayerPaths)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func LayerExists(info DriverInfo, id string) (bool, error) {
 | 
					func LayerExists(info DriverInfo, id string) (bool, error) {
 | 
				
			||||||
	return wclayer.LayerExists(layerPath(&info, id))
 | 
						return wclayer.LayerExists(context.Background(), layerPath(&info, id))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func PrepareLayer(info DriverInfo, layerId string, parentLayerPaths []string) error {
 | 
					func PrepareLayer(info DriverInfo, layerId string, parentLayerPaths []string) error {
 | 
				
			||||||
	return wclayer.PrepareLayer(layerPath(&info, layerId), parentLayerPaths)
 | 
						return wclayer.PrepareLayer(context.Background(), layerPath(&info, layerId), parentLayerPaths)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func ProcessBaseLayer(path string) error {
 | 
					func ProcessBaseLayer(path string) error {
 | 
				
			||||||
	return wclayer.ProcessBaseLayer(path)
 | 
						return wclayer.ProcessBaseLayer(context.Background(), path)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func ProcessUtilityVMImage(path string) error {
 | 
					func ProcessUtilityVMImage(path string) error {
 | 
				
			||||||
	return wclayer.ProcessUtilityVMImage(path)
 | 
						return wclayer.ProcessUtilityVMImage(context.Background(), path)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func UnprepareLayer(info DriverInfo, layerId string) error {
 | 
					func UnprepareLayer(info DriverInfo, layerId string) error {
 | 
				
			||||||
	return wclayer.UnprepareLayer(layerPath(&info, layerId))
 | 
						return wclayer.UnprepareLayer(context.Background(), layerPath(&info, layerId))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type DriverInfo struct {
 | 
					type DriverInfo struct {
 | 
				
			||||||
@@ -76,7 +77,7 @@ type DriverInfo struct {
 | 
				
			|||||||
type GUID [16]byte
 | 
					type GUID [16]byte
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NameToGuid(name string) (id GUID, err error) {
 | 
					func NameToGuid(name string) (id GUID, err error) {
 | 
				
			||||||
	g, err := wclayer.NameToGuid(name)
 | 
						g, err := wclayer.NameToGuid(context.Background(), name)
 | 
				
			||||||
	return g.ToWindowsArray(), err
 | 
						return g.ToWindowsArray(), err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -94,13 +95,13 @@ func (g *GUID) ToString() string {
 | 
				
			|||||||
type LayerReader = wclayer.LayerReader
 | 
					type LayerReader = wclayer.LayerReader
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewLayerReader(info DriverInfo, layerID string, parentLayerPaths []string) (LayerReader, error) {
 | 
					func NewLayerReader(info DriverInfo, layerID string, parentLayerPaths []string) (LayerReader, error) {
 | 
				
			||||||
	return wclayer.NewLayerReader(layerPath(&info, layerID), parentLayerPaths)
 | 
						return wclayer.NewLayerReader(context.Background(), layerPath(&info, layerID), parentLayerPaths)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type LayerWriter = wclayer.LayerWriter
 | 
					type LayerWriter = wclayer.LayerWriter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewLayerWriter(info DriverInfo, layerID string, parentLayerPaths []string) (LayerWriter, error) {
 | 
					func NewLayerWriter(info DriverInfo, layerID string, parentLayerPaths []string) (LayerWriter, error) {
 | 
				
			||||||
	return wclayer.NewLayerWriter(layerPath(&info, layerID), parentLayerPaths)
 | 
						return wclayer.NewLayerWriter(context.Background(), layerPath(&info, layerID), parentLayerPaths)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type WC_LAYER_DESCRIPTOR = wclayer.WC_LAYER_DESCRIPTOR
 | 
					type WC_LAYER_DESCRIPTOR = wclayer.WC_LAYER_DESCRIPTOR
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										8
									
								
								vendor/github.com/cespare/xxhash/v2/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/cespare/xxhash/v2/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					language: go
 | 
				
			||||||
 | 
					go:
 | 
				
			||||||
 | 
					  - "1.x"
 | 
				
			||||||
 | 
					  - master
 | 
				
			||||||
 | 
					env:
 | 
				
			||||||
 | 
					  - TAGS=""
 | 
				
			||||||
 | 
					  - TAGS="-tags purego"
 | 
				
			||||||
 | 
					script: go test $TAGS -v ./...
 | 
				
			||||||
							
								
								
									
										22
									
								
								vendor/github.com/cespare/xxhash/v2/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/cespare/xxhash/v2/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					Copyright (c) 2016 Caleb Spare
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MIT License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Permission is hereby granted, free of charge, to any person obtaining
 | 
				
			||||||
 | 
					a copy of this software and associated documentation files (the
 | 
				
			||||||
 | 
					"Software"), to deal in the Software without restriction, including
 | 
				
			||||||
 | 
					without limitation the rights to use, copy, modify, merge, publish,
 | 
				
			||||||
 | 
					distribute, sublicense, and/or sell copies of the Software, and to
 | 
				
			||||||
 | 
					permit persons to whom the Software is furnished to do so, subject to
 | 
				
			||||||
 | 
					the following conditions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The above copyright notice and this permission notice shall be
 | 
				
			||||||
 | 
					included in all copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | 
				
			||||||
 | 
					EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | 
				
			||||||
 | 
					MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 | 
				
			||||||
 | 
					NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 | 
				
			||||||
 | 
					LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 | 
				
			||||||
 | 
					OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 | 
				
			||||||
 | 
					WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
				
			||||||
							
								
								
									
										67
									
								
								vendor/github.com/cespare/xxhash/v2/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								vendor/github.com/cespare/xxhash/v2/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
				
			|||||||
 | 
					# xxhash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[](https://godoc.org/github.com/cespare/xxhash)
 | 
				
			||||||
 | 
					[](https://travis-ci.org/cespare/xxhash)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					xxhash is a Go implementation of the 64-bit
 | 
				
			||||||
 | 
					[xxHash](http://cyan4973.github.io/xxHash/) algorithm, XXH64. This is a
 | 
				
			||||||
 | 
					high-quality hashing algorithm that is much faster than anything in the Go
 | 
				
			||||||
 | 
					standard library.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This package provides a straightforward API:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					func Sum64(b []byte) uint64
 | 
				
			||||||
 | 
					func Sum64String(s string) uint64
 | 
				
			||||||
 | 
					type Digest struct{ ... }
 | 
				
			||||||
 | 
					    func New() *Digest
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The `Digest` type implements hash.Hash64. Its key methods are:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					func (*Digest) Write([]byte) (int, error)
 | 
				
			||||||
 | 
					func (*Digest) WriteString(string) (int, error)
 | 
				
			||||||
 | 
					func (*Digest) Sum64() uint64
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This implementation provides a fast pure-Go implementation and an even faster
 | 
				
			||||||
 | 
					assembly implementation for amd64.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Compatibility
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This package is in a module and the latest code is in version 2 of the module.
 | 
				
			||||||
 | 
					You need a version of Go with at least "minimal module compatibility" to use
 | 
				
			||||||
 | 
					github.com/cespare/xxhash/v2:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* 1.9.7+ for Go 1.9
 | 
				
			||||||
 | 
					* 1.10.3+ for Go 1.10
 | 
				
			||||||
 | 
					* Go 1.11 or later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I recommend using the latest release of Go.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Benchmarks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Here are some quick benchmarks comparing the pure-Go and assembly
 | 
				
			||||||
 | 
					implementations of Sum64.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					| input size | purego | asm |
 | 
				
			||||||
 | 
					| --- | --- | --- |
 | 
				
			||||||
 | 
					| 5 B   |  979.66 MB/s |  1291.17 MB/s  |
 | 
				
			||||||
 | 
					| 100 B | 7475.26 MB/s | 7973.40 MB/s  |
 | 
				
			||||||
 | 
					| 4 KB  | 17573.46 MB/s | 17602.65 MB/s |
 | 
				
			||||||
 | 
					| 10 MB | 17131.46 MB/s | 17142.16 MB/s |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These numbers were generated on Ubuntu 18.04 with an Intel i7-8700K CPU using
 | 
				
			||||||
 | 
					the following commands under Go 1.11.2:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					$ go test -tags purego -benchtime 10s -bench '/xxhash,direct,bytes'
 | 
				
			||||||
 | 
					$ go test -benchtime 10s -bench '/xxhash,direct,bytes'
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Projects using this package
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- [InfluxDB](https://github.com/influxdata/influxdb)
 | 
				
			||||||
 | 
					- [Prometheus](https://github.com/prometheus/prometheus)
 | 
				
			||||||
 | 
					- [FreeCache](https://github.com/coocood/freecache)
 | 
				
			||||||
							
								
								
									
										3
									
								
								vendor/github.com/cespare/xxhash/v2/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/cespare/xxhash/v2/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					module github.com/cespare/xxhash/v2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go 1.11
 | 
				
			||||||
							
								
								
									
										0
									
								
								vendor/github.com/cespare/xxhash/v2/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								vendor/github.com/cespare/xxhash/v2/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
									
										236
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										236
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,236 @@
 | 
				
			|||||||
 | 
					// Package xxhash implements the 64-bit variant of xxHash (XXH64) as described
 | 
				
			||||||
 | 
					// at http://cyan4973.github.io/xxHash/.
 | 
				
			||||||
 | 
					package xxhash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/binary"
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
 | 
						"math/bits"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						prime1 uint64 = 11400714785074694791
 | 
				
			||||||
 | 
						prime2 uint64 = 14029467366897019727
 | 
				
			||||||
 | 
						prime3 uint64 = 1609587929392839161
 | 
				
			||||||
 | 
						prime4 uint64 = 9650029242287828579
 | 
				
			||||||
 | 
						prime5 uint64 = 2870177450012600261
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NOTE(caleb): I'm using both consts and vars of the primes. Using consts where
 | 
				
			||||||
 | 
					// possible in the Go code is worth a small (but measurable) performance boost
 | 
				
			||||||
 | 
					// by avoiding some MOVQs. Vars are needed for the asm and also are useful for
 | 
				
			||||||
 | 
					// convenience in the Go code in a few places where we need to intentionally
 | 
				
			||||||
 | 
					// avoid constant arithmetic (e.g., v1 := prime1 + prime2 fails because the
 | 
				
			||||||
 | 
					// result overflows a uint64).
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						prime1v = prime1
 | 
				
			||||||
 | 
						prime2v = prime2
 | 
				
			||||||
 | 
						prime3v = prime3
 | 
				
			||||||
 | 
						prime4v = prime4
 | 
				
			||||||
 | 
						prime5v = prime5
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Digest implements hash.Hash64.
 | 
				
			||||||
 | 
					type Digest struct {
 | 
				
			||||||
 | 
						v1    uint64
 | 
				
			||||||
 | 
						v2    uint64
 | 
				
			||||||
 | 
						v3    uint64
 | 
				
			||||||
 | 
						v4    uint64
 | 
				
			||||||
 | 
						total uint64
 | 
				
			||||||
 | 
						mem   [32]byte
 | 
				
			||||||
 | 
						n     int // how much of mem is used
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// New creates a new Digest that computes the 64-bit xxHash algorithm.
 | 
				
			||||||
 | 
					func New() *Digest {
 | 
				
			||||||
 | 
						var d Digest
 | 
				
			||||||
 | 
						d.Reset()
 | 
				
			||||||
 | 
						return &d
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Reset clears the Digest's state so that it can be reused.
 | 
				
			||||||
 | 
					func (d *Digest) Reset() {
 | 
				
			||||||
 | 
						d.v1 = prime1v + prime2
 | 
				
			||||||
 | 
						d.v2 = prime2
 | 
				
			||||||
 | 
						d.v3 = 0
 | 
				
			||||||
 | 
						d.v4 = -prime1v
 | 
				
			||||||
 | 
						d.total = 0
 | 
				
			||||||
 | 
						d.n = 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Size always returns 8 bytes.
 | 
				
			||||||
 | 
					func (d *Digest) Size() int { return 8 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// BlockSize always returns 32 bytes.
 | 
				
			||||||
 | 
					func (d *Digest) BlockSize() int { return 32 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Write adds more data to d. It always returns len(b), nil.
 | 
				
			||||||
 | 
					func (d *Digest) Write(b []byte) (n int, err error) {
 | 
				
			||||||
 | 
						n = len(b)
 | 
				
			||||||
 | 
						d.total += uint64(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if d.n+n < 32 {
 | 
				
			||||||
 | 
							// This new data doesn't even fill the current block.
 | 
				
			||||||
 | 
							copy(d.mem[d.n:], b)
 | 
				
			||||||
 | 
							d.n += n
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if d.n > 0 {
 | 
				
			||||||
 | 
							// Finish off the partial block.
 | 
				
			||||||
 | 
							copy(d.mem[d.n:], b)
 | 
				
			||||||
 | 
							d.v1 = round(d.v1, u64(d.mem[0:8]))
 | 
				
			||||||
 | 
							d.v2 = round(d.v2, u64(d.mem[8:16]))
 | 
				
			||||||
 | 
							d.v3 = round(d.v3, u64(d.mem[16:24]))
 | 
				
			||||||
 | 
							d.v4 = round(d.v4, u64(d.mem[24:32]))
 | 
				
			||||||
 | 
							b = b[32-d.n:]
 | 
				
			||||||
 | 
							d.n = 0
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(b) >= 32 {
 | 
				
			||||||
 | 
							// One or more full blocks left.
 | 
				
			||||||
 | 
							nw := writeBlocks(d, b)
 | 
				
			||||||
 | 
							b = b[nw:]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Store any remaining partial block.
 | 
				
			||||||
 | 
						copy(d.mem[:], b)
 | 
				
			||||||
 | 
						d.n = len(b)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Sum appends the current hash to b and returns the resulting slice.
 | 
				
			||||||
 | 
					func (d *Digest) Sum(b []byte) []byte {
 | 
				
			||||||
 | 
						s := d.Sum64()
 | 
				
			||||||
 | 
						return append(
 | 
				
			||||||
 | 
							b,
 | 
				
			||||||
 | 
							byte(s>>56),
 | 
				
			||||||
 | 
							byte(s>>48),
 | 
				
			||||||
 | 
							byte(s>>40),
 | 
				
			||||||
 | 
							byte(s>>32),
 | 
				
			||||||
 | 
							byte(s>>24),
 | 
				
			||||||
 | 
							byte(s>>16),
 | 
				
			||||||
 | 
							byte(s>>8),
 | 
				
			||||||
 | 
							byte(s),
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Sum64 returns the current hash.
 | 
				
			||||||
 | 
					func (d *Digest) Sum64() uint64 {
 | 
				
			||||||
 | 
						var h uint64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if d.total >= 32 {
 | 
				
			||||||
 | 
							v1, v2, v3, v4 := d.v1, d.v2, d.v3, d.v4
 | 
				
			||||||
 | 
							h = rol1(v1) + rol7(v2) + rol12(v3) + rol18(v4)
 | 
				
			||||||
 | 
							h = mergeRound(h, v1)
 | 
				
			||||||
 | 
							h = mergeRound(h, v2)
 | 
				
			||||||
 | 
							h = mergeRound(h, v3)
 | 
				
			||||||
 | 
							h = mergeRound(h, v4)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							h = d.v3 + prime5
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						h += d.total
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						i, end := 0, d.n
 | 
				
			||||||
 | 
						for ; i+8 <= end; i += 8 {
 | 
				
			||||||
 | 
							k1 := round(0, u64(d.mem[i:i+8]))
 | 
				
			||||||
 | 
							h ^= k1
 | 
				
			||||||
 | 
							h = rol27(h)*prime1 + prime4
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if i+4 <= end {
 | 
				
			||||||
 | 
							h ^= uint64(u32(d.mem[i:i+4])) * prime1
 | 
				
			||||||
 | 
							h = rol23(h)*prime2 + prime3
 | 
				
			||||||
 | 
							i += 4
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for i < end {
 | 
				
			||||||
 | 
							h ^= uint64(d.mem[i]) * prime5
 | 
				
			||||||
 | 
							h = rol11(h) * prime1
 | 
				
			||||||
 | 
							i++
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						h ^= h >> 33
 | 
				
			||||||
 | 
						h *= prime2
 | 
				
			||||||
 | 
						h ^= h >> 29
 | 
				
			||||||
 | 
						h *= prime3
 | 
				
			||||||
 | 
						h ^= h >> 32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return h
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						magic         = "xxh\x06"
 | 
				
			||||||
 | 
						marshaledSize = len(magic) + 8*5 + 32
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MarshalBinary implements the encoding.BinaryMarshaler interface.
 | 
				
			||||||
 | 
					func (d *Digest) MarshalBinary() ([]byte, error) {
 | 
				
			||||||
 | 
						b := make([]byte, 0, marshaledSize)
 | 
				
			||||||
 | 
						b = append(b, magic...)
 | 
				
			||||||
 | 
						b = appendUint64(b, d.v1)
 | 
				
			||||||
 | 
						b = appendUint64(b, d.v2)
 | 
				
			||||||
 | 
						b = appendUint64(b, d.v3)
 | 
				
			||||||
 | 
						b = appendUint64(b, d.v4)
 | 
				
			||||||
 | 
						b = appendUint64(b, d.total)
 | 
				
			||||||
 | 
						b = append(b, d.mem[:d.n]...)
 | 
				
			||||||
 | 
						b = b[:len(b)+len(d.mem)-d.n]
 | 
				
			||||||
 | 
						return b, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface.
 | 
				
			||||||
 | 
					func (d *Digest) UnmarshalBinary(b []byte) error {
 | 
				
			||||||
 | 
						if len(b) < len(magic) || string(b[:len(magic)]) != magic {
 | 
				
			||||||
 | 
							return errors.New("xxhash: invalid hash state identifier")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(b) != marshaledSize {
 | 
				
			||||||
 | 
							return errors.New("xxhash: invalid hash state size")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						b = b[len(magic):]
 | 
				
			||||||
 | 
						b, d.v1 = consumeUint64(b)
 | 
				
			||||||
 | 
						b, d.v2 = consumeUint64(b)
 | 
				
			||||||
 | 
						b, d.v3 = consumeUint64(b)
 | 
				
			||||||
 | 
						b, d.v4 = consumeUint64(b)
 | 
				
			||||||
 | 
						b, d.total = consumeUint64(b)
 | 
				
			||||||
 | 
						copy(d.mem[:], b)
 | 
				
			||||||
 | 
						b = b[len(d.mem):]
 | 
				
			||||||
 | 
						d.n = int(d.total % uint64(len(d.mem)))
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func appendUint64(b []byte, x uint64) []byte {
 | 
				
			||||||
 | 
						var a [8]byte
 | 
				
			||||||
 | 
						binary.LittleEndian.PutUint64(a[:], x)
 | 
				
			||||||
 | 
						return append(b, a[:]...)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func consumeUint64(b []byte) ([]byte, uint64) {
 | 
				
			||||||
 | 
						x := u64(b)
 | 
				
			||||||
 | 
						return b[8:], x
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func u64(b []byte) uint64 { return binary.LittleEndian.Uint64(b) }
 | 
				
			||||||
 | 
					func u32(b []byte) uint32 { return binary.LittleEndian.Uint32(b) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func round(acc, input uint64) uint64 {
 | 
				
			||||||
 | 
						acc += input * prime2
 | 
				
			||||||
 | 
						acc = rol31(acc)
 | 
				
			||||||
 | 
						acc *= prime1
 | 
				
			||||||
 | 
						return acc
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func mergeRound(acc, val uint64) uint64 {
 | 
				
			||||||
 | 
						val = round(0, val)
 | 
				
			||||||
 | 
						acc ^= val
 | 
				
			||||||
 | 
						acc = acc*prime1 + prime4
 | 
				
			||||||
 | 
						return acc
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func rol1(x uint64) uint64  { return bits.RotateLeft64(x, 1) }
 | 
				
			||||||
 | 
					func rol7(x uint64) uint64  { return bits.RotateLeft64(x, 7) }
 | 
				
			||||||
 | 
					func rol11(x uint64) uint64 { return bits.RotateLeft64(x, 11) }
 | 
				
			||||||
 | 
					func rol12(x uint64) uint64 { return bits.RotateLeft64(x, 12) }
 | 
				
			||||||
 | 
					func rol18(x uint64) uint64 { return bits.RotateLeft64(x, 18) }
 | 
				
			||||||
 | 
					func rol23(x uint64) uint64 { return bits.RotateLeft64(x, 23) }
 | 
				
			||||||
 | 
					func rol27(x uint64) uint64 { return bits.RotateLeft64(x, 27) }
 | 
				
			||||||
 | 
					func rol31(x uint64) uint64 { return bits.RotateLeft64(x, 31) }
 | 
				
			||||||
							
								
								
									
										13
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					// +build !appengine
 | 
				
			||||||
 | 
					// +build gc
 | 
				
			||||||
 | 
					// +build !purego
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package xxhash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Sum64 computes the 64-bit xxHash digest of b.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//go:noescape
 | 
				
			||||||
 | 
					func Sum64(b []byte) uint64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:noescape
 | 
				
			||||||
 | 
					func writeBlocks(d *Digest, b []byte) int
 | 
				
			||||||
							
								
								
									
										215
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										215
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,215 @@
 | 
				
			|||||||
 | 
					// +build !appengine
 | 
				
			||||||
 | 
					// +build gc
 | 
				
			||||||
 | 
					// +build !purego
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Register allocation:
 | 
				
			||||||
 | 
					// AX	h
 | 
				
			||||||
 | 
					// CX	pointer to advance through b
 | 
				
			||||||
 | 
					// DX	n
 | 
				
			||||||
 | 
					// BX	loop end
 | 
				
			||||||
 | 
					// R8	v1, k1
 | 
				
			||||||
 | 
					// R9	v2
 | 
				
			||||||
 | 
					// R10	v3
 | 
				
			||||||
 | 
					// R11	v4
 | 
				
			||||||
 | 
					// R12	tmp
 | 
				
			||||||
 | 
					// R13	prime1v
 | 
				
			||||||
 | 
					// R14	prime2v
 | 
				
			||||||
 | 
					// R15	prime4v
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// round reads from and advances the buffer pointer in CX.
 | 
				
			||||||
 | 
					// It assumes that R13 has prime1v and R14 has prime2v.
 | 
				
			||||||
 | 
					#define round(r) \
 | 
				
			||||||
 | 
						MOVQ  (CX), R12 \
 | 
				
			||||||
 | 
						ADDQ  $8, CX    \
 | 
				
			||||||
 | 
						IMULQ R14, R12  \
 | 
				
			||||||
 | 
						ADDQ  R12, r    \
 | 
				
			||||||
 | 
						ROLQ  $31, r    \
 | 
				
			||||||
 | 
						IMULQ R13, r
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// mergeRound applies a merge round on the two registers acc and val.
 | 
				
			||||||
 | 
					// It assumes that R13 has prime1v, R14 has prime2v, and R15 has prime4v.
 | 
				
			||||||
 | 
					#define mergeRound(acc, val) \
 | 
				
			||||||
 | 
						IMULQ R14, val \
 | 
				
			||||||
 | 
						ROLQ  $31, val \
 | 
				
			||||||
 | 
						IMULQ R13, val \
 | 
				
			||||||
 | 
						XORQ  val, acc \
 | 
				
			||||||
 | 
						IMULQ R13, acc \
 | 
				
			||||||
 | 
						ADDQ  R15, acc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// func Sum64(b []byte) uint64
 | 
				
			||||||
 | 
					TEXT ·Sum64(SB), NOSPLIT, $0-32
 | 
				
			||||||
 | 
						// Load fixed primes.
 | 
				
			||||||
 | 
						MOVQ ·prime1v(SB), R13
 | 
				
			||||||
 | 
						MOVQ ·prime2v(SB), R14
 | 
				
			||||||
 | 
						MOVQ ·prime4v(SB), R15
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Load slice.
 | 
				
			||||||
 | 
						MOVQ b_base+0(FP), CX
 | 
				
			||||||
 | 
						MOVQ b_len+8(FP), DX
 | 
				
			||||||
 | 
						LEAQ (CX)(DX*1), BX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// The first loop limit will be len(b)-32.
 | 
				
			||||||
 | 
						SUBQ $32, BX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Check whether we have at least one block.
 | 
				
			||||||
 | 
						CMPQ DX, $32
 | 
				
			||||||
 | 
						JLT  noBlocks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Set up initial state (v1, v2, v3, v4).
 | 
				
			||||||
 | 
						MOVQ R13, R8
 | 
				
			||||||
 | 
						ADDQ R14, R8
 | 
				
			||||||
 | 
						MOVQ R14, R9
 | 
				
			||||||
 | 
						XORQ R10, R10
 | 
				
			||||||
 | 
						XORQ R11, R11
 | 
				
			||||||
 | 
						SUBQ R13, R11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Loop until CX > BX.
 | 
				
			||||||
 | 
					blockLoop:
 | 
				
			||||||
 | 
						round(R8)
 | 
				
			||||||
 | 
						round(R9)
 | 
				
			||||||
 | 
						round(R10)
 | 
				
			||||||
 | 
						round(R11)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CMPQ CX, BX
 | 
				
			||||||
 | 
						JLE  blockLoop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MOVQ R8, AX
 | 
				
			||||||
 | 
						ROLQ $1, AX
 | 
				
			||||||
 | 
						MOVQ R9, R12
 | 
				
			||||||
 | 
						ROLQ $7, R12
 | 
				
			||||||
 | 
						ADDQ R12, AX
 | 
				
			||||||
 | 
						MOVQ R10, R12
 | 
				
			||||||
 | 
						ROLQ $12, R12
 | 
				
			||||||
 | 
						ADDQ R12, AX
 | 
				
			||||||
 | 
						MOVQ R11, R12
 | 
				
			||||||
 | 
						ROLQ $18, R12
 | 
				
			||||||
 | 
						ADDQ R12, AX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mergeRound(AX, R8)
 | 
				
			||||||
 | 
						mergeRound(AX, R9)
 | 
				
			||||||
 | 
						mergeRound(AX, R10)
 | 
				
			||||||
 | 
						mergeRound(AX, R11)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						JMP afterBlocks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					noBlocks:
 | 
				
			||||||
 | 
						MOVQ ·prime5v(SB), AX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					afterBlocks:
 | 
				
			||||||
 | 
						ADDQ DX, AX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Right now BX has len(b)-32, and we want to loop until CX > len(b)-8.
 | 
				
			||||||
 | 
						ADDQ $24, BX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CMPQ CX, BX
 | 
				
			||||||
 | 
						JG   fourByte
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					wordLoop:
 | 
				
			||||||
 | 
						// Calculate k1.
 | 
				
			||||||
 | 
						MOVQ  (CX), R8
 | 
				
			||||||
 | 
						ADDQ  $8, CX
 | 
				
			||||||
 | 
						IMULQ R14, R8
 | 
				
			||||||
 | 
						ROLQ  $31, R8
 | 
				
			||||||
 | 
						IMULQ R13, R8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						XORQ  R8, AX
 | 
				
			||||||
 | 
						ROLQ  $27, AX
 | 
				
			||||||
 | 
						IMULQ R13, AX
 | 
				
			||||||
 | 
						ADDQ  R15, AX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CMPQ CX, BX
 | 
				
			||||||
 | 
						JLE  wordLoop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fourByte:
 | 
				
			||||||
 | 
						ADDQ $4, BX
 | 
				
			||||||
 | 
						CMPQ CX, BX
 | 
				
			||||||
 | 
						JG   singles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MOVL  (CX), R8
 | 
				
			||||||
 | 
						ADDQ  $4, CX
 | 
				
			||||||
 | 
						IMULQ R13, R8
 | 
				
			||||||
 | 
						XORQ  R8, AX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ROLQ  $23, AX
 | 
				
			||||||
 | 
						IMULQ R14, AX
 | 
				
			||||||
 | 
						ADDQ  ·prime3v(SB), AX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					singles:
 | 
				
			||||||
 | 
						ADDQ $4, BX
 | 
				
			||||||
 | 
						CMPQ CX, BX
 | 
				
			||||||
 | 
						JGE  finalize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					singlesLoop:
 | 
				
			||||||
 | 
						MOVBQZX (CX), R12
 | 
				
			||||||
 | 
						ADDQ    $1, CX
 | 
				
			||||||
 | 
						IMULQ   ·prime5v(SB), R12
 | 
				
			||||||
 | 
						XORQ    R12, AX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ROLQ  $11, AX
 | 
				
			||||||
 | 
						IMULQ R13, AX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CMPQ CX, BX
 | 
				
			||||||
 | 
						JL   singlesLoop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					finalize:
 | 
				
			||||||
 | 
						MOVQ  AX, R12
 | 
				
			||||||
 | 
						SHRQ  $33, R12
 | 
				
			||||||
 | 
						XORQ  R12, AX
 | 
				
			||||||
 | 
						IMULQ R14, AX
 | 
				
			||||||
 | 
						MOVQ  AX, R12
 | 
				
			||||||
 | 
						SHRQ  $29, R12
 | 
				
			||||||
 | 
						XORQ  R12, AX
 | 
				
			||||||
 | 
						IMULQ ·prime3v(SB), AX
 | 
				
			||||||
 | 
						MOVQ  AX, R12
 | 
				
			||||||
 | 
						SHRQ  $32, R12
 | 
				
			||||||
 | 
						XORQ  R12, AX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MOVQ AX, ret+24(FP)
 | 
				
			||||||
 | 
						RET
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// writeBlocks uses the same registers as above except that it uses AX to store
 | 
				
			||||||
 | 
					// the d pointer.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// func writeBlocks(d *Digest, b []byte) int
 | 
				
			||||||
 | 
					TEXT ·writeBlocks(SB), NOSPLIT, $0-40
 | 
				
			||||||
 | 
						// Load fixed primes needed for round.
 | 
				
			||||||
 | 
						MOVQ ·prime1v(SB), R13
 | 
				
			||||||
 | 
						MOVQ ·prime2v(SB), R14
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Load slice.
 | 
				
			||||||
 | 
						MOVQ b_base+8(FP), CX
 | 
				
			||||||
 | 
						MOVQ b_len+16(FP), DX
 | 
				
			||||||
 | 
						LEAQ (CX)(DX*1), BX
 | 
				
			||||||
 | 
						SUBQ $32, BX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Load vN from d.
 | 
				
			||||||
 | 
						MOVQ d+0(FP), AX
 | 
				
			||||||
 | 
						MOVQ 0(AX), R8   // v1
 | 
				
			||||||
 | 
						MOVQ 8(AX), R9   // v2
 | 
				
			||||||
 | 
						MOVQ 16(AX), R10 // v3
 | 
				
			||||||
 | 
						MOVQ 24(AX), R11 // v4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// We don't need to check the loop condition here; this function is
 | 
				
			||||||
 | 
						// always called with at least one block of data to process.
 | 
				
			||||||
 | 
					blockLoop:
 | 
				
			||||||
 | 
						round(R8)
 | 
				
			||||||
 | 
						round(R9)
 | 
				
			||||||
 | 
						round(R10)
 | 
				
			||||||
 | 
						round(R11)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CMPQ CX, BX
 | 
				
			||||||
 | 
						JLE  blockLoop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Copy vN back to d.
 | 
				
			||||||
 | 
						MOVQ R8, 0(AX)
 | 
				
			||||||
 | 
						MOVQ R9, 8(AX)
 | 
				
			||||||
 | 
						MOVQ R10, 16(AX)
 | 
				
			||||||
 | 
						MOVQ R11, 24(AX)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// The number of bytes written is CX minus the old base pointer.
 | 
				
			||||||
 | 
						SUBQ b_base+8(FP), CX
 | 
				
			||||||
 | 
						MOVQ CX, ret+32(FP)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						RET
 | 
				
			||||||
							
								
								
									
										76
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_other.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_other.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,76 @@
 | 
				
			|||||||
 | 
					// +build !amd64 appengine !gc purego
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package xxhash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Sum64 computes the 64-bit xxHash digest of b.
 | 
				
			||||||
 | 
					func Sum64(b []byte) uint64 {
 | 
				
			||||||
 | 
						// A simpler version would be
 | 
				
			||||||
 | 
						//   d := New()
 | 
				
			||||||
 | 
						//   d.Write(b)
 | 
				
			||||||
 | 
						//   return d.Sum64()
 | 
				
			||||||
 | 
						// but this is faster, particularly for small inputs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						n := len(b)
 | 
				
			||||||
 | 
						var h uint64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if n >= 32 {
 | 
				
			||||||
 | 
							v1 := prime1v + prime2
 | 
				
			||||||
 | 
							v2 := prime2
 | 
				
			||||||
 | 
							v3 := uint64(0)
 | 
				
			||||||
 | 
							v4 := -prime1v
 | 
				
			||||||
 | 
							for len(b) >= 32 {
 | 
				
			||||||
 | 
								v1 = round(v1, u64(b[0:8:len(b)]))
 | 
				
			||||||
 | 
								v2 = round(v2, u64(b[8:16:len(b)]))
 | 
				
			||||||
 | 
								v3 = round(v3, u64(b[16:24:len(b)]))
 | 
				
			||||||
 | 
								v4 = round(v4, u64(b[24:32:len(b)]))
 | 
				
			||||||
 | 
								b = b[32:len(b):len(b)]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							h = rol1(v1) + rol7(v2) + rol12(v3) + rol18(v4)
 | 
				
			||||||
 | 
							h = mergeRound(h, v1)
 | 
				
			||||||
 | 
							h = mergeRound(h, v2)
 | 
				
			||||||
 | 
							h = mergeRound(h, v3)
 | 
				
			||||||
 | 
							h = mergeRound(h, v4)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							h = prime5
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						h += uint64(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						i, end := 0, len(b)
 | 
				
			||||||
 | 
						for ; i+8 <= end; i += 8 {
 | 
				
			||||||
 | 
							k1 := round(0, u64(b[i:i+8:len(b)]))
 | 
				
			||||||
 | 
							h ^= k1
 | 
				
			||||||
 | 
							h = rol27(h)*prime1 + prime4
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if i+4 <= end {
 | 
				
			||||||
 | 
							h ^= uint64(u32(b[i:i+4:len(b)])) * prime1
 | 
				
			||||||
 | 
							h = rol23(h)*prime2 + prime3
 | 
				
			||||||
 | 
							i += 4
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for ; i < end; i++ {
 | 
				
			||||||
 | 
							h ^= uint64(b[i]) * prime5
 | 
				
			||||||
 | 
							h = rol11(h) * prime1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						h ^= h >> 33
 | 
				
			||||||
 | 
						h *= prime2
 | 
				
			||||||
 | 
						h ^= h >> 29
 | 
				
			||||||
 | 
						h *= prime3
 | 
				
			||||||
 | 
						h ^= h >> 32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return h
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func writeBlocks(d *Digest, b []byte) int {
 | 
				
			||||||
 | 
						v1, v2, v3, v4 := d.v1, d.v2, d.v3, d.v4
 | 
				
			||||||
 | 
						n := len(b)
 | 
				
			||||||
 | 
						for len(b) >= 32 {
 | 
				
			||||||
 | 
							v1 = round(v1, u64(b[0:8:len(b)]))
 | 
				
			||||||
 | 
							v2 = round(v2, u64(b[8:16:len(b)]))
 | 
				
			||||||
 | 
							v3 = round(v3, u64(b[16:24:len(b)]))
 | 
				
			||||||
 | 
							v4 = round(v4, u64(b[24:32:len(b)]))
 | 
				
			||||||
 | 
							b = b[32:len(b):len(b)]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						d.v1, d.v2, d.v3, d.v4 = v1, v2, v3, v4
 | 
				
			||||||
 | 
						return n - len(b)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										15
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_safe.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_safe.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					// +build appengine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This file contains the safe implementations of otherwise unsafe-using code.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package xxhash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Sum64String computes the 64-bit xxHash digest of s.
 | 
				
			||||||
 | 
					func Sum64String(s string) uint64 {
 | 
				
			||||||
 | 
						return Sum64([]byte(s))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WriteString adds more data to d. It always returns len(s), nil.
 | 
				
			||||||
 | 
					func (d *Digest) WriteString(s string) (n int, err error) {
 | 
				
			||||||
 | 
						return d.Write([]byte(s))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										46
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
				
			|||||||
 | 
					// +build !appengine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This file encapsulates usage of unsafe.
 | 
				
			||||||
 | 
					// xxhash_safe.go contains the safe implementations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package xxhash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"reflect"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Notes:
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// See https://groups.google.com/d/msg/golang-nuts/dcjzJy-bSpw/tcZYBzQqAQAJ
 | 
				
			||||||
 | 
					// for some discussion about these unsafe conversions.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// In the future it's possible that compiler optimizations will make these
 | 
				
			||||||
 | 
					// unsafe operations unnecessary: https://golang.org/issue/2205.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Both of these wrapper functions still incur function call overhead since they
 | 
				
			||||||
 | 
					// will not be inlined. We could write Go/asm copies of Sum64 and Digest.Write
 | 
				
			||||||
 | 
					// for strings to squeeze out a bit more speed. Mid-stack inlining should
 | 
				
			||||||
 | 
					// eventually fix this.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Sum64String computes the 64-bit xxHash digest of s.
 | 
				
			||||||
 | 
					// It may be faster than Sum64([]byte(s)) by avoiding a copy.
 | 
				
			||||||
 | 
					func Sum64String(s string) uint64 {
 | 
				
			||||||
 | 
						var b []byte
 | 
				
			||||||
 | 
						bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
 | 
				
			||||||
 | 
						bh.Data = (*reflect.StringHeader)(unsafe.Pointer(&s)).Data
 | 
				
			||||||
 | 
						bh.Len = len(s)
 | 
				
			||||||
 | 
						bh.Cap = len(s)
 | 
				
			||||||
 | 
						return Sum64(b)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WriteString adds more data to d. It always returns len(s), nil.
 | 
				
			||||||
 | 
					// It may be faster than Write([]byte(s)) by avoiding a copy.
 | 
				
			||||||
 | 
					func (d *Digest) WriteString(s string) (n int, err error) {
 | 
				
			||||||
 | 
						var b []byte
 | 
				
			||||||
 | 
						bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
 | 
				
			||||||
 | 
						bh.Data = (*reflect.StringHeader)(unsafe.Pointer(&s)).Data
 | 
				
			||||||
 | 
						bh.Len = len(s)
 | 
				
			||||||
 | 
						bh.Cap = len(s)
 | 
				
			||||||
 | 
						return d.Write(b)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										39
									
								
								vendor/github.com/containerd/containerd/content/local/store.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								vendor/github.com/containerd/containerd/content/local/store.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -92,7 +92,11 @@ func NewLabeledStore(root string, ls LabelStore) (content.Store, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *store) Info(ctx context.Context, dgst digest.Digest) (content.Info, error) {
 | 
					func (s *store) Info(ctx context.Context, dgst digest.Digest) (content.Info, error) {
 | 
				
			||||||
	p := s.blobPath(dgst)
 | 
						p, err := s.blobPath(dgst)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return content.Info{}, errors.Wrapf(err, "calculating blob info path")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fi, err := os.Stat(p)
 | 
						fi, err := os.Stat(p)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if os.IsNotExist(err) {
 | 
							if os.IsNotExist(err) {
 | 
				
			||||||
@@ -123,7 +127,10 @@ func (s *store) info(dgst digest.Digest, fi os.FileInfo, labels map[string]strin
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// ReaderAt returns an io.ReaderAt for the blob.
 | 
					// ReaderAt returns an io.ReaderAt for the blob.
 | 
				
			||||||
func (s *store) ReaderAt(ctx context.Context, desc ocispec.Descriptor) (content.ReaderAt, error) {
 | 
					func (s *store) ReaderAt(ctx context.Context, desc ocispec.Descriptor) (content.ReaderAt, error) {
 | 
				
			||||||
	p := s.blobPath(desc.Digest)
 | 
						p, err := s.blobPath(desc.Digest)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, errors.Wrapf(err, "calculating blob path for ReaderAt")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	fi, err := os.Stat(p)
 | 
						fi, err := os.Stat(p)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if !os.IsNotExist(err) {
 | 
							if !os.IsNotExist(err) {
 | 
				
			||||||
@@ -150,7 +157,12 @@ func (s *store) ReaderAt(ctx context.Context, desc ocispec.Descriptor) (content.
 | 
				
			|||||||
// While this is safe to do concurrently, safe exist-removal logic must hold
 | 
					// While this is safe to do concurrently, safe exist-removal logic must hold
 | 
				
			||||||
// some global lock on the store.
 | 
					// some global lock on the store.
 | 
				
			||||||
func (s *store) Delete(ctx context.Context, dgst digest.Digest) error {
 | 
					func (s *store) Delete(ctx context.Context, dgst digest.Digest) error {
 | 
				
			||||||
	if err := os.RemoveAll(s.blobPath(dgst)); err != nil {
 | 
						bp, err := s.blobPath(dgst)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return errors.Wrapf(err, "calculating blob path for delete")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := os.RemoveAll(bp); err != nil {
 | 
				
			||||||
		if !os.IsNotExist(err) {
 | 
							if !os.IsNotExist(err) {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -166,7 +178,11 @@ func (s *store) Update(ctx context.Context, info content.Info, fieldpaths ...str
 | 
				
			|||||||
		return content.Info{}, errors.Wrapf(errdefs.ErrFailedPrecondition, "update not supported on immutable content store")
 | 
							return content.Info{}, errors.Wrapf(errdefs.ErrFailedPrecondition, "update not supported on immutable content store")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p := s.blobPath(info.Digest)
 | 
						p, err := s.blobPath(info.Digest)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return content.Info{}, errors.Wrapf(err, "calculating blob path for update")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fi, err := os.Stat(p)
 | 
						fi, err := os.Stat(p)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if os.IsNotExist(err) {
 | 
							if os.IsNotExist(err) {
 | 
				
			||||||
@@ -512,7 +528,10 @@ func (s *store) writer(ctx context.Context, ref string, total int64, expected di
 | 
				
			|||||||
	// TODO(stevvooe): Need to actually store expected here. We have
 | 
						// TODO(stevvooe): Need to actually store expected here. We have
 | 
				
			||||||
	// code in the service that shouldn't be dealing with this.
 | 
						// code in the service that shouldn't be dealing with this.
 | 
				
			||||||
	if expected != "" {
 | 
						if expected != "" {
 | 
				
			||||||
		p := s.blobPath(expected)
 | 
							p, err := s.blobPath(expected)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, errors.Wrap(err, "calculating expected blob path for writer")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if _, err := os.Stat(p); err == nil {
 | 
							if _, err := os.Stat(p); err == nil {
 | 
				
			||||||
			return nil, errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", expected)
 | 
								return nil, errors.Wrapf(errdefs.ErrAlreadyExists, "content %v", expected)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -607,11 +626,17 @@ func (s *store) Abort(ctx context.Context, ref string) error {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *store) blobPath(dgst digest.Digest) string {
 | 
					func (s *store) blobPath(dgst digest.Digest) (string, error) {
 | 
				
			||||||
	return filepath.Join(s.root, "blobs", dgst.Algorithm().String(), dgst.Hex())
 | 
						if err := dgst.Validate(); err != nil {
 | 
				
			||||||
 | 
							return "", errors.Wrapf(errdefs.ErrInvalidArgument, "cannot calculate blob path from invalid digest: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return filepath.Join(s.root, "blobs", dgst.Algorithm().String(), dgst.Hex()), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *store) ingestRoot(ref string) string {
 | 
					func (s *store) ingestRoot(ref string) string {
 | 
				
			||||||
 | 
						// we take a digest of the ref to keep the ingest paths constant length.
 | 
				
			||||||
 | 
						// Note that this is not the current or potential digest of incoming content.
 | 
				
			||||||
	dgst := digest.FromString(ref)
 | 
						dgst := digest.FromString(ref)
 | 
				
			||||||
	return filepath.Join(s.root, "ingest", dgst.Hex())
 | 
						return filepath.Join(s.root, "ingest", dgst.Hex())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/containerd/containerd/content/local/writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/containerd/containerd/content/local/writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -115,8 +115,8 @@ func (w *writer) Commit(ctx context.Context, size int64, expected digest.Digest,
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		ingest = filepath.Join(w.path, "data")
 | 
							ingest    = filepath.Join(w.path, "data")
 | 
				
			||||||
		target = w.s.blobPath(dgst)
 | 
							target, _ = w.s.blobPath(dgst) // ignore error because we calculated this dgst
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// make sure parent directories of blob exist
 | 
						// make sure parent directories of blob exist
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								vendor/github.com/containerd/containerd/errdefs/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containerd/containerd/errdefs/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -51,43 +51,43 @@ var (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// IsInvalidArgument returns true if the error is due to an invalid argument
 | 
					// IsInvalidArgument returns true if the error is due to an invalid argument
 | 
				
			||||||
func IsInvalidArgument(err error) bool {
 | 
					func IsInvalidArgument(err error) bool {
 | 
				
			||||||
	return errors.Cause(err) == ErrInvalidArgument
 | 
						return errors.Is(err, ErrInvalidArgument)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsNotFound returns true if the error is due to a missing object
 | 
					// IsNotFound returns true if the error is due to a missing object
 | 
				
			||||||
func IsNotFound(err error) bool {
 | 
					func IsNotFound(err error) bool {
 | 
				
			||||||
	return errors.Cause(err) == ErrNotFound
 | 
						return errors.Is(err, ErrNotFound)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsAlreadyExists returns true if the error is due to an already existing
 | 
					// IsAlreadyExists returns true if the error is due to an already existing
 | 
				
			||||||
// metadata item
 | 
					// metadata item
 | 
				
			||||||
func IsAlreadyExists(err error) bool {
 | 
					func IsAlreadyExists(err error) bool {
 | 
				
			||||||
	return errors.Cause(err) == ErrAlreadyExists
 | 
						return errors.Is(err, ErrAlreadyExists)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsFailedPrecondition returns true if an operation could not proceed to the
 | 
					// IsFailedPrecondition returns true if an operation could not proceed to the
 | 
				
			||||||
// lack of a particular condition
 | 
					// lack of a particular condition
 | 
				
			||||||
func IsFailedPrecondition(err error) bool {
 | 
					func IsFailedPrecondition(err error) bool {
 | 
				
			||||||
	return errors.Cause(err) == ErrFailedPrecondition
 | 
						return errors.Is(err, ErrFailedPrecondition)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsUnavailable returns true if the error is due to a resource being unavailable
 | 
					// IsUnavailable returns true if the error is due to a resource being unavailable
 | 
				
			||||||
func IsUnavailable(err error) bool {
 | 
					func IsUnavailable(err error) bool {
 | 
				
			||||||
	return errors.Cause(err) == ErrUnavailable
 | 
						return errors.Is(err, ErrUnavailable)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsNotImplemented returns true if the error is due to not being implemented
 | 
					// IsNotImplemented returns true if the error is due to not being implemented
 | 
				
			||||||
func IsNotImplemented(err error) bool {
 | 
					func IsNotImplemented(err error) bool {
 | 
				
			||||||
	return errors.Cause(err) == ErrNotImplemented
 | 
						return errors.Is(err, ErrNotImplemented)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsCanceled returns true if the error is due to `context.Canceled`.
 | 
					// IsCanceled returns true if the error is due to `context.Canceled`.
 | 
				
			||||||
func IsCanceled(err error) bool {
 | 
					func IsCanceled(err error) bool {
 | 
				
			||||||
	return errors.Cause(err) == context.Canceled
 | 
						return errors.Is(err, context.Canceled)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsDeadlineExceeded returns true if the error is due to
 | 
					// IsDeadlineExceeded returns true if the error is due to
 | 
				
			||||||
// `context.DeadlineExceeded`.
 | 
					// `context.DeadlineExceeded`.
 | 
				
			||||||
func IsDeadlineExceeded(err error) bool {
 | 
					func IsDeadlineExceeded(err error) bool {
 | 
				
			||||||
	return errors.Cause(err) == context.DeadlineExceeded
 | 
						return errors.Is(err, context.DeadlineExceeded)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										47
									
								
								vendor/github.com/containerd/containerd/images/handlers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										47
									
								
								vendor/github.com/containerd/containerd/images/handlers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -64,7 +64,7 @@ func Handlers(handlers ...Handler) HandlerFunc {
 | 
				
			|||||||
		for _, handler := range handlers {
 | 
							for _, handler := range handlers {
 | 
				
			||||||
			ch, err := handler.Handle(ctx, desc)
 | 
								ch, err := handler.Handle(ctx, desc)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				if errors.Cause(err) == ErrStopHandler {
 | 
									if errors.Is(err, ErrStopHandler) {
 | 
				
			||||||
					break
 | 
										break
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				return nil, err
 | 
									return nil, err
 | 
				
			||||||
@@ -87,7 +87,7 @@ func Walk(ctx context.Context, handler Handler, descs ...ocispec.Descriptor) err
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		children, err := handler.Handle(ctx, desc)
 | 
							children, err := handler.Handle(ctx, desc)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			if errors.Cause(err) == ErrSkipDesc {
 | 
								if errors.Is(err, ErrSkipDesc) {
 | 
				
			||||||
				continue // don't traverse the children.
 | 
									continue // don't traverse the children.
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
@@ -136,7 +136,7 @@ func Dispatch(ctx context.Context, handler Handler, limiter *semaphore.Weighted,
 | 
				
			|||||||
				limiter.Release(1)
 | 
									limiter.Release(1)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				if errors.Cause(err) == ErrSkipDesc {
 | 
									if errors.Is(err, ErrSkipDesc) {
 | 
				
			||||||
					return nil // don't traverse the children.
 | 
										return nil // don't traverse the children.
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
@@ -170,6 +170,19 @@ func ChildrenHandler(provider content.Provider) HandlerFunc {
 | 
				
			|||||||
// the children returned by the handler and passes through the children.
 | 
					// the children returned by the handler and passes through the children.
 | 
				
			||||||
// Must follow a handler that returns the children to be labeled.
 | 
					// Must follow a handler that returns the children to be labeled.
 | 
				
			||||||
func SetChildrenLabels(manager content.Manager, f HandlerFunc) HandlerFunc {
 | 
					func SetChildrenLabels(manager content.Manager, f HandlerFunc) HandlerFunc {
 | 
				
			||||||
 | 
						return SetChildrenMappedLabels(manager, f, nil)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SetChildrenMappedLabels is a handler wrapper which sets labels for the content on
 | 
				
			||||||
 | 
					// the children returned by the handler and passes through the children.
 | 
				
			||||||
 | 
					// Must follow a handler that returns the children to be labeled.
 | 
				
			||||||
 | 
					// The label map allows the caller to control the labels per child descriptor.
 | 
				
			||||||
 | 
					// For returned labels, the index of the child will be appended to the end
 | 
				
			||||||
 | 
					// except for the first index when the returned label does not end with '.'.
 | 
				
			||||||
 | 
					func SetChildrenMappedLabels(manager content.Manager, f HandlerFunc, labelMap func(ocispec.Descriptor) []string) HandlerFunc {
 | 
				
			||||||
 | 
						if labelMap == nil {
 | 
				
			||||||
 | 
							labelMap = ChildGCLabels
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
 | 
						return func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
 | 
				
			||||||
		children, err := f(ctx, desc)
 | 
							children, err := f(ctx, desc)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
@@ -177,14 +190,26 @@ func SetChildrenLabels(manager content.Manager, f HandlerFunc) HandlerFunc {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(children) > 0 {
 | 
							if len(children) > 0 {
 | 
				
			||||||
			info := content.Info{
 | 
								var (
 | 
				
			||||||
				Digest: desc.Digest,
 | 
									info = content.Info{
 | 
				
			||||||
				Labels: map[string]string{},
 | 
										Digest: desc.Digest,
 | 
				
			||||||
			}
 | 
										Labels: map[string]string{},
 | 
				
			||||||
			fields := []string{}
 | 
									}
 | 
				
			||||||
			for i, ch := range children {
 | 
									fields = []string{}
 | 
				
			||||||
				info.Labels[fmt.Sprintf("containerd.io/gc.ref.content.%d", i)] = ch.Digest.String()
 | 
									keys   = map[string]uint{}
 | 
				
			||||||
				fields = append(fields, fmt.Sprintf("labels.containerd.io/gc.ref.content.%d", i))
 | 
								)
 | 
				
			||||||
 | 
								for _, ch := range children {
 | 
				
			||||||
 | 
									labelKeys := labelMap(ch)
 | 
				
			||||||
 | 
									for _, key := range labelKeys {
 | 
				
			||||||
 | 
										idx := keys[key]
 | 
				
			||||||
 | 
										keys[key] = idx + 1
 | 
				
			||||||
 | 
										if idx > 0 || key[len(key)-1] == '.' {
 | 
				
			||||||
 | 
											key = fmt.Sprintf("%s%d", key, idx)
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										info.Labels[key] = ch.Digest.String()
 | 
				
			||||||
 | 
										fields = append(fields, "labels."+key)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			_, err := manager.Update(ctx, info, fields...)
 | 
								_, err := manager.Update(ctx, info, fields...)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/images/image.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/images/image.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -362,7 +362,7 @@ func Children(ctx context.Context, provider content.Provider, desc ocispec.Descr
 | 
				
			|||||||
			// childless data types.
 | 
								// childless data types.
 | 
				
			||||||
			return nil, nil
 | 
								return nil, nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		log.G(ctx).Warnf("encountered unknown type %v; children may not be fetched", desc.MediaType)
 | 
							log.G(ctx).Debugf("encountered unknown type %v; children may not be fetched", desc.MediaType)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return descs, nil
 | 
						return descs, nil
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										31
									
								
								vendor/github.com/containerd/containerd/images/mediatypes.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								vendor/github.com/containerd/containerd/images/mediatypes.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,6 +23,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/containerd/containerd/errdefs"
 | 
						"github.com/containerd/containerd/errdefs"
 | 
				
			||||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
						ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
				
			||||||
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// mediatype definitions for image components handled in containerd.
 | 
					// mediatype definitions for image components handled in containerd.
 | 
				
			||||||
@@ -81,7 +82,7 @@ func DiffCompression(ctx context.Context, mediaType string) (string, error) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		return "", nil
 | 
							return "", nil
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return "", errdefs.ErrNotImplemented
 | 
							return "", errors.Wrapf(errdefs.ErrNotImplemented, "unrecognised mediatype %s", mediaType)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -124,3 +125,31 @@ func IsKnownConfig(mt string) bool {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return false
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ChildGCLabels returns the label for a given descriptor to reference it
 | 
				
			||||||
 | 
					func ChildGCLabels(desc ocispec.Descriptor) []string {
 | 
				
			||||||
 | 
						mt := desc.MediaType
 | 
				
			||||||
 | 
						if IsKnownConfig(mt) {
 | 
				
			||||||
 | 
							return []string{"containerd.io/gc.ref.content.config"}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch mt {
 | 
				
			||||||
 | 
						case MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
 | 
				
			||||||
 | 
							return []string{"containerd.io/gc.ref.content.m."}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if IsLayerType(mt) {
 | 
				
			||||||
 | 
							return []string{"containerd.io/gc.ref.content.l."}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return []string{"containerd.io/gc.ref.content."}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ChildGCLabelsFilterLayers returns the labels for a given descriptor to
 | 
				
			||||||
 | 
					// reference it, skipping layer media types
 | 
				
			||||||
 | 
					func ChildGCLabelsFilterLayers(desc ocispec.Descriptor) []string {
 | 
				
			||||||
 | 
						if IsLayerType(desc.MediaType) {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ChildGCLabels(desc)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/containerd/containerd/platforms/cpuinfo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/containerd/containerd/platforms/cpuinfo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -74,8 +74,8 @@ func getCPUInfo(pattern string) (info string, err error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getCPUVariant() string {
 | 
					func getCPUVariant() string {
 | 
				
			||||||
	if runtime.GOOS == "windows" {
 | 
						if runtime.GOOS == "windows" || runtime.GOOS == "darwin" {
 | 
				
			||||||
		// Windows only supports v7 for ARM32 and v8 for ARM64 and so we can use
 | 
							// Windows/Darwin only supports v7 for ARM32 and v8 for ARM64 and so we can use
 | 
				
			||||||
		// runtime.GOARCH to determine the variants
 | 
							// runtime.GOARCH to determine the variants
 | 
				
			||||||
		var variant string
 | 
							var variant string
 | 
				
			||||||
		switch runtime.GOARCH {
 | 
							switch runtime.GOARCH {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										206
									
								
								vendor/github.com/containerd/containerd/remotes/docker/auth/fetch.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								vendor/github.com/containerd/containerd/remotes/docker/auth/fetch.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,206 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package auth
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"net/url"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/containerd/containerd/log"
 | 
				
			||||||
 | 
						remoteserrors "github.com/containerd/containerd/remotes/errors"
 | 
				
			||||||
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
						"golang.org/x/net/context/ctxhttp"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						// ErrNoToken is returned if a request is successful but the body does not
 | 
				
			||||||
 | 
						// contain an authorization token.
 | 
				
			||||||
 | 
						ErrNoToken = errors.New("authorization server did not include a token in the response")
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GenerateTokenOptions generates options for fetching a token based on a challenge
 | 
				
			||||||
 | 
					func GenerateTokenOptions(ctx context.Context, host, username, secret string, c Challenge) (TokenOptions, error) {
 | 
				
			||||||
 | 
						realm, ok := c.Parameters["realm"]
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							return TokenOptions{}, errors.New("no realm specified for token auth challenge")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						realmURL, err := url.Parse(realm)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return TokenOptions{}, errors.Wrap(err, "invalid token auth challenge realm")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						to := TokenOptions{
 | 
				
			||||||
 | 
							Realm:    realmURL.String(),
 | 
				
			||||||
 | 
							Service:  c.Parameters["service"],
 | 
				
			||||||
 | 
							Username: username,
 | 
				
			||||||
 | 
							Secret:   secret,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						scope, ok := c.Parameters["scope"]
 | 
				
			||||||
 | 
						if ok {
 | 
				
			||||||
 | 
							to.Scopes = append(to.Scopes, scope)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							log.G(ctx).WithField("host", host).Debug("no scope specified for token auth challenge")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return to, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TokenOptions are optios for requesting a token
 | 
				
			||||||
 | 
					type TokenOptions struct {
 | 
				
			||||||
 | 
						Realm    string
 | 
				
			||||||
 | 
						Service  string
 | 
				
			||||||
 | 
						Scopes   []string
 | 
				
			||||||
 | 
						Username string
 | 
				
			||||||
 | 
						Secret   string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// OAuthTokenResponse is response from fetching token with a OAuth POST request
 | 
				
			||||||
 | 
					type OAuthTokenResponse struct {
 | 
				
			||||||
 | 
						AccessToken  string    `json:"access_token"`
 | 
				
			||||||
 | 
						RefreshToken string    `json:"refresh_token"`
 | 
				
			||||||
 | 
						ExpiresIn    int       `json:"expires_in"`
 | 
				
			||||||
 | 
						IssuedAt     time.Time `json:"issued_at"`
 | 
				
			||||||
 | 
						Scope        string    `json:"scope"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// FetchTokenWithOAuth fetches a token using a POST request
 | 
				
			||||||
 | 
					func FetchTokenWithOAuth(ctx context.Context, client *http.Client, headers http.Header, clientID string, to TokenOptions) (*OAuthTokenResponse, error) {
 | 
				
			||||||
 | 
						form := url.Values{}
 | 
				
			||||||
 | 
						if len(to.Scopes) > 0 {
 | 
				
			||||||
 | 
							form.Set("scope", strings.Join(to.Scopes, " "))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						form.Set("service", to.Service)
 | 
				
			||||||
 | 
						form.Set("client_id", clientID)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if to.Username == "" {
 | 
				
			||||||
 | 
							form.Set("grant_type", "refresh_token")
 | 
				
			||||||
 | 
							form.Set("refresh_token", to.Secret)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							form.Set("grant_type", "password")
 | 
				
			||||||
 | 
							form.Set("username", to.Username)
 | 
				
			||||||
 | 
							form.Set("password", to.Secret)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req, err := http.NewRequest("POST", to.Realm, strings.NewReader(form.Encode()))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=utf-8")
 | 
				
			||||||
 | 
						if headers != nil {
 | 
				
			||||||
 | 
							for k, v := range headers {
 | 
				
			||||||
 | 
								req.Header[k] = append(req.Header[k], v...)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resp, err := ctxhttp.Do(ctx, client, req)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer resp.Body.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if resp.StatusCode < 200 || resp.StatusCode >= 400 {
 | 
				
			||||||
 | 
							return nil, errors.WithStack(remoteserrors.NewUnexpectedStatusErr(resp))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						decoder := json.NewDecoder(resp.Body)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var tr OAuthTokenResponse
 | 
				
			||||||
 | 
						if err = decoder.Decode(&tr); err != nil {
 | 
				
			||||||
 | 
							return nil, errors.Wrap(err, "unable to decode token response")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if tr.AccessToken == "" {
 | 
				
			||||||
 | 
							return nil, errors.WithStack(ErrNoToken)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &tr, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// FetchTokenResponse is response from fetching token with GET request
 | 
				
			||||||
 | 
					type FetchTokenResponse struct {
 | 
				
			||||||
 | 
						Token        string    `json:"token"`
 | 
				
			||||||
 | 
						AccessToken  string    `json:"access_token"`
 | 
				
			||||||
 | 
						ExpiresIn    int       `json:"expires_in"`
 | 
				
			||||||
 | 
						IssuedAt     time.Time `json:"issued_at"`
 | 
				
			||||||
 | 
						RefreshToken string    `json:"refresh_token"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// FetchToken fetches a token using a GET request
 | 
				
			||||||
 | 
					func FetchToken(ctx context.Context, client *http.Client, headers http.Header, to TokenOptions) (*FetchTokenResponse, error) {
 | 
				
			||||||
 | 
						req, err := http.NewRequest("GET", to.Realm, nil)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if headers != nil {
 | 
				
			||||||
 | 
							for k, v := range headers {
 | 
				
			||||||
 | 
								req.Header[k] = append(req.Header[k], v...)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						reqParams := req.URL.Query()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if to.Service != "" {
 | 
				
			||||||
 | 
							reqParams.Add("service", to.Service)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, scope := range to.Scopes {
 | 
				
			||||||
 | 
							reqParams.Add("scope", scope)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if to.Secret != "" {
 | 
				
			||||||
 | 
							req.SetBasicAuth(to.Username, to.Secret)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req.URL.RawQuery = reqParams.Encode()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resp, err := ctxhttp.Do(ctx, client, req)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer resp.Body.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if resp.StatusCode < 200 || resp.StatusCode >= 400 {
 | 
				
			||||||
 | 
							return nil, errors.WithStack(remoteserrors.NewUnexpectedStatusErr(resp))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						decoder := json.NewDecoder(resp.Body)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var tr FetchTokenResponse
 | 
				
			||||||
 | 
						if err = decoder.Decode(&tr); err != nil {
 | 
				
			||||||
 | 
							return nil, errors.Wrap(err, "unable to decode token response")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// `access_token` is equivalent to `token` and if both are specified
 | 
				
			||||||
 | 
						// the choice is undefined.  Canonicalize `access_token` by sticking
 | 
				
			||||||
 | 
						// things in `token`.
 | 
				
			||||||
 | 
						if tr.AccessToken != "" {
 | 
				
			||||||
 | 
							tr.Token = tr.AccessToken
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if tr.Token == "" {
 | 
				
			||||||
 | 
							return nil, errors.WithStack(ErrNoToken)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &tr, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
   limitations under the License.
 | 
					   limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package docker
 | 
					package auth
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
@@ -22,31 +22,35 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type authenticationScheme byte
 | 
					// AuthenticationScheme defines scheme of the authentication method
 | 
				
			||||||
 | 
					type AuthenticationScheme byte
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	basicAuth  authenticationScheme = 1 << iota // Defined in RFC 7617
 | 
						// BasicAuth is scheme for Basic HTTP Authentication RFC 7617
 | 
				
			||||||
	digestAuth                                  // Defined in RFC 7616
 | 
						BasicAuth AuthenticationScheme = 1 << iota
 | 
				
			||||||
	bearerAuth                                  // Defined in RFC 6750
 | 
						// DigestAuth is scheme for HTTP Digest Access Authentication RFC 7616
 | 
				
			||||||
 | 
						DigestAuth
 | 
				
			||||||
 | 
						// BearerAuth is scheme for OAuth 2.0 Bearer Tokens RFC 6750
 | 
				
			||||||
 | 
						BearerAuth
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// challenge carries information from a WWW-Authenticate response header.
 | 
					// Challenge carries information from a WWW-Authenticate response header.
 | 
				
			||||||
// See RFC 2617.
 | 
					// See RFC 2617.
 | 
				
			||||||
type challenge struct {
 | 
					type Challenge struct {
 | 
				
			||||||
	// scheme is the auth-scheme according to RFC 2617
 | 
						// scheme is the auth-scheme according to RFC 2617
 | 
				
			||||||
	scheme authenticationScheme
 | 
						Scheme AuthenticationScheme
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// parameters are the auth-params according to RFC 2617
 | 
						// parameters are the auth-params according to RFC 2617
 | 
				
			||||||
	parameters map[string]string
 | 
						Parameters map[string]string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type byScheme []challenge
 | 
					type byScheme []Challenge
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (bs byScheme) Len() int      { return len(bs) }
 | 
					func (bs byScheme) Len() int      { return len(bs) }
 | 
				
			||||||
func (bs byScheme) Swap(i, j int) { bs[i], bs[j] = bs[j], bs[i] }
 | 
					func (bs byScheme) Swap(i, j int) { bs[i], bs[j] = bs[j], bs[i] }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Sort in priority order: token > digest > basic
 | 
					// Sort in priority order: token > digest > basic
 | 
				
			||||||
func (bs byScheme) Less(i, j int) bool { return bs[i].scheme > bs[j].scheme }
 | 
					func (bs byScheme) Less(i, j int) bool { return bs[i].Scheme > bs[j].Scheme }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Octet types from RFC 2616.
 | 
					// Octet types from RFC 2616.
 | 
				
			||||||
type octetType byte
 | 
					type octetType byte
 | 
				
			||||||
@@ -90,22 +94,23 @@ func init() {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func parseAuthHeader(header http.Header) []challenge {
 | 
					// ParseAuthHeader parses challenges from WWW-Authenticate header
 | 
				
			||||||
	challenges := []challenge{}
 | 
					func ParseAuthHeader(header http.Header) []Challenge {
 | 
				
			||||||
 | 
						challenges := []Challenge{}
 | 
				
			||||||
	for _, h := range header[http.CanonicalHeaderKey("WWW-Authenticate")] {
 | 
						for _, h := range header[http.CanonicalHeaderKey("WWW-Authenticate")] {
 | 
				
			||||||
		v, p := parseValueAndParams(h)
 | 
							v, p := parseValueAndParams(h)
 | 
				
			||||||
		var s authenticationScheme
 | 
							var s AuthenticationScheme
 | 
				
			||||||
		switch v {
 | 
							switch v {
 | 
				
			||||||
		case "basic":
 | 
							case "basic":
 | 
				
			||||||
			s = basicAuth
 | 
								s = BasicAuth
 | 
				
			||||||
		case "digest":
 | 
							case "digest":
 | 
				
			||||||
			s = digestAuth
 | 
								s = DigestAuth
 | 
				
			||||||
		case "bearer":
 | 
							case "bearer":
 | 
				
			||||||
			s = bearerAuth
 | 
								s = BearerAuth
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		challenges = append(challenges, challenge{scheme: s, parameters: p})
 | 
							challenges = append(challenges, Challenge{Scheme: s, Parameters: p})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	sort.Stable(byScheme(challenges))
 | 
						sort.Stable(byScheme(challenges))
 | 
				
			||||||
	return challenges
 | 
						return challenges
 | 
				
			||||||
							
								
								
									
										285
									
								
								vendor/github.com/containerd/containerd/remotes/docker/authorizer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										285
									
								
								vendor/github.com/containerd/containerd/remotes/docker/authorizer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -19,21 +19,17 @@ package docker
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"encoding/base64"
 | 
						"encoding/base64"
 | 
				
			||||||
	"encoding/json"
 | 
					 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io"
 | 
					 | 
				
			||||||
	"io/ioutil"
 | 
					 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
	"net/url"
 | 
					 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/containerd/containerd/errdefs"
 | 
						"github.com/containerd/containerd/errdefs"
 | 
				
			||||||
	"github.com/containerd/containerd/log"
 | 
						"github.com/containerd/containerd/log"
 | 
				
			||||||
 | 
						"github.com/containerd/containerd/remotes/docker/auth"
 | 
				
			||||||
 | 
						remoteerrors "github.com/containerd/containerd/remotes/errors"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"golang.org/x/net/context/ctxhttp"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type dockerAuthorizer struct {
 | 
					type dockerAuthorizer struct {
 | 
				
			||||||
@@ -135,8 +131,8 @@ func (a *dockerAuthorizer) AddResponses(ctx context.Context, responses []*http.R
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	a.mu.Lock()
 | 
						a.mu.Lock()
 | 
				
			||||||
	defer a.mu.Unlock()
 | 
						defer a.mu.Unlock()
 | 
				
			||||||
	for _, c := range parseAuthHeader(last.Header) {
 | 
						for _, c := range auth.ParseAuthHeader(last.Header) {
 | 
				
			||||||
		if c.scheme == bearerAuth {
 | 
							if c.Scheme == auth.BearerAuth {
 | 
				
			||||||
			if err := invalidAuthorization(c, responses); err != nil {
 | 
								if err := invalidAuthorization(c, responses); err != nil {
 | 
				
			||||||
				delete(a.handlers, host)
 | 
									delete(a.handlers, host)
 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
@@ -152,26 +148,35 @@ func (a *dockerAuthorizer) AddResponses(ctx context.Context, responses []*http.R
 | 
				
			|||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			common, err := a.generateTokenOptions(ctx, host, c)
 | 
								var username, secret string
 | 
				
			||||||
 | 
								if a.credentials != nil {
 | 
				
			||||||
 | 
									var err error
 | 
				
			||||||
 | 
									username, secret, err = a.credentials(host)
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										return err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								common, err := auth.GenerateTokenOptions(ctx, host, username, secret, c)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			a.handlers[host] = newAuthHandler(a.client, a.header, c.scheme, common)
 | 
								a.handlers[host] = newAuthHandler(a.client, a.header, c.Scheme, common)
 | 
				
			||||||
			return nil
 | 
								return nil
 | 
				
			||||||
		} else if c.scheme == basicAuth && a.credentials != nil {
 | 
							} else if c.Scheme == auth.BasicAuth && a.credentials != nil {
 | 
				
			||||||
			username, secret, err := a.credentials(host)
 | 
								username, secret, err := a.credentials(host)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if username != "" && secret != "" {
 | 
								if username != "" && secret != "" {
 | 
				
			||||||
				common := tokenOptions{
 | 
									common := auth.TokenOptions{
 | 
				
			||||||
					username: username,
 | 
										Username: username,
 | 
				
			||||||
					secret:   secret,
 | 
										Secret:   secret,
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				a.handlers[host] = newAuthHandler(a.client, a.header, c.scheme, common)
 | 
									a.handlers[host] = newAuthHandler(a.client, a.header, c.Scheme, common)
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -179,38 +184,6 @@ func (a *dockerAuthorizer) AddResponses(ctx context.Context, responses []*http.R
 | 
				
			|||||||
	return errors.Wrap(errdefs.ErrNotImplemented, "failed to find supported auth scheme")
 | 
						return errors.Wrap(errdefs.ErrNotImplemented, "failed to find supported auth scheme")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (a *dockerAuthorizer) generateTokenOptions(ctx context.Context, host string, c challenge) (tokenOptions, error) {
 | 
					 | 
				
			||||||
	realm, ok := c.parameters["realm"]
 | 
					 | 
				
			||||||
	if !ok {
 | 
					 | 
				
			||||||
		return tokenOptions{}, errors.New("no realm specified for token auth challenge")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	realmURL, err := url.Parse(realm)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return tokenOptions{}, errors.Wrap(err, "invalid token auth challenge realm")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	to := tokenOptions{
 | 
					 | 
				
			||||||
		realm:   realmURL.String(),
 | 
					 | 
				
			||||||
		service: c.parameters["service"],
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	scope, ok := c.parameters["scope"]
 | 
					 | 
				
			||||||
	if ok {
 | 
					 | 
				
			||||||
		to.scopes = append(to.scopes, scope)
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		log.G(ctx).WithField("host", host).Debug("no scope specified for token auth challenge")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if a.credentials != nil {
 | 
					 | 
				
			||||||
		to.username, to.secret, err = a.credentials(host)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return tokenOptions{}, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return to, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// authResult is used to control limit rate.
 | 
					// authResult is used to control limit rate.
 | 
				
			||||||
type authResult struct {
 | 
					type authResult struct {
 | 
				
			||||||
	sync.WaitGroup
 | 
						sync.WaitGroup
 | 
				
			||||||
@@ -227,17 +200,17 @@ type authHandler struct {
 | 
				
			|||||||
	client *http.Client
 | 
						client *http.Client
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// only support basic and bearer schemes
 | 
						// only support basic and bearer schemes
 | 
				
			||||||
	scheme authenticationScheme
 | 
						scheme auth.AuthenticationScheme
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// common contains common challenge answer
 | 
						// common contains common challenge answer
 | 
				
			||||||
	common tokenOptions
 | 
						common auth.TokenOptions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// scopedTokens caches token indexed by scopes, which used in
 | 
						// scopedTokens caches token indexed by scopes, which used in
 | 
				
			||||||
	// bearer auth case
 | 
						// bearer auth case
 | 
				
			||||||
	scopedTokens map[string]*authResult
 | 
						scopedTokens map[string]*authResult
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newAuthHandler(client *http.Client, hdr http.Header, scheme authenticationScheme, opts tokenOptions) *authHandler {
 | 
					func newAuthHandler(client *http.Client, hdr http.Header, scheme auth.AuthenticationScheme, opts auth.TokenOptions) *authHandler {
 | 
				
			||||||
	return &authHandler{
 | 
						return &authHandler{
 | 
				
			||||||
		header:       hdr,
 | 
							header:       hdr,
 | 
				
			||||||
		client:       client,
 | 
							client:       client,
 | 
				
			||||||
@@ -249,17 +222,17 @@ func newAuthHandler(client *http.Client, hdr http.Header, scheme authenticationS
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (ah *authHandler) authorize(ctx context.Context) (string, error) {
 | 
					func (ah *authHandler) authorize(ctx context.Context) (string, error) {
 | 
				
			||||||
	switch ah.scheme {
 | 
						switch ah.scheme {
 | 
				
			||||||
	case basicAuth:
 | 
						case auth.BasicAuth:
 | 
				
			||||||
		return ah.doBasicAuth(ctx)
 | 
							return ah.doBasicAuth(ctx)
 | 
				
			||||||
	case bearerAuth:
 | 
						case auth.BearerAuth:
 | 
				
			||||||
		return ah.doBearerAuth(ctx)
 | 
							return ah.doBearerAuth(ctx)
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return "", errors.Wrap(errdefs.ErrNotImplemented, "failed to find supported auth scheme")
 | 
							return "", errors.Wrapf(errdefs.ErrNotImplemented, "failed to find supported auth scheme: %s", string(ah.scheme))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ah *authHandler) doBasicAuth(ctx context.Context) (string, error) {
 | 
					func (ah *authHandler) doBasicAuth(ctx context.Context) (string, error) {
 | 
				
			||||||
	username, secret := ah.common.username, ah.common.secret
 | 
						username, secret := ah.common.Username, ah.common.Secret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if username == "" || secret == "" {
 | 
						if username == "" || secret == "" {
 | 
				
			||||||
		return "", fmt.Errorf("failed to handle basic auth because missing username or secret")
 | 
							return "", fmt.Errorf("failed to handle basic auth because missing username or secret")
 | 
				
			||||||
@@ -269,14 +242,14 @@ func (ah *authHandler) doBasicAuth(ctx context.Context) (string, error) {
 | 
				
			|||||||
	return fmt.Sprintf("Basic %s", auth), nil
 | 
						return fmt.Sprintf("Basic %s", auth), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ah *authHandler) doBearerAuth(ctx context.Context) (string, error) {
 | 
					func (ah *authHandler) doBearerAuth(ctx context.Context) (token string, err error) {
 | 
				
			||||||
	// copy common tokenOptions
 | 
						// copy common tokenOptions
 | 
				
			||||||
	to := ah.common
 | 
						to := ah.common
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	to.scopes = getTokenScopes(ctx, to.scopes)
 | 
						to.Scopes = GetTokenScopes(ctx, to.Scopes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Docs: https://docs.docker.com/registry/spec/auth/scope
 | 
						// Docs: https://docs.docker.com/registry/spec/auth/scope
 | 
				
			||||||
	scoped := strings.Join(to.scopes, " ")
 | 
						scoped := strings.Join(to.Scopes, " ")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ah.Lock()
 | 
						ah.Lock()
 | 
				
			||||||
	if r, exist := ah.scopedTokens[scoped]; exist {
 | 
						if r, exist := ah.scopedTokens[scoped]; exist {
 | 
				
			||||||
@@ -291,174 +264,52 @@ func (ah *authHandler) doBearerAuth(ctx context.Context) (string, error) {
 | 
				
			|||||||
	ah.scopedTokens[scoped] = r
 | 
						ah.scopedTokens[scoped] = r
 | 
				
			||||||
	ah.Unlock()
 | 
						ah.Unlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						defer func() {
 | 
				
			||||||
 | 
							token = fmt.Sprintf("Bearer %s", token)
 | 
				
			||||||
 | 
							r.token, r.err = token, err
 | 
				
			||||||
 | 
							r.Done()
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// fetch token for the resource scope
 | 
						// fetch token for the resource scope
 | 
				
			||||||
	var (
 | 
						if to.Secret != "" {
 | 
				
			||||||
		token string
 | 
							defer func() {
 | 
				
			||||||
		err   error
 | 
								err = errors.Wrap(err, "failed to fetch oauth token")
 | 
				
			||||||
	)
 | 
							}()
 | 
				
			||||||
	if to.secret != "" {
 | 
					 | 
				
			||||||
		// credential information is provided, use oauth POST endpoint
 | 
							// credential information is provided, use oauth POST endpoint
 | 
				
			||||||
		token, err = ah.fetchTokenWithOAuth(ctx, to)
 | 
							// TODO: Allow setting client_id
 | 
				
			||||||
		err = errors.Wrap(err, "failed to fetch oauth token")
 | 
							resp, err := auth.FetchTokenWithOAuth(ctx, ah.client, ah.header, "containerd-client", to)
 | 
				
			||||||
	} else {
 | 
							if err != nil {
 | 
				
			||||||
		// do request anonymously
 | 
								var errStatus remoteerrors.ErrUnexpectedStatus
 | 
				
			||||||
		token, err = ah.fetchToken(ctx, to)
 | 
								if errors.As(err, &errStatus) {
 | 
				
			||||||
		err = errors.Wrap(err, "failed to fetch anonymous token")
 | 
									// Registries without support for POST may return 404 for POST /v2/token.
 | 
				
			||||||
	}
 | 
									// As of September 2017, GCR is known to return 404.
 | 
				
			||||||
	token = fmt.Sprintf("Bearer %s", token)
 | 
									// As of February 2018, JFrog Artifactory is known to return 401.
 | 
				
			||||||
 | 
									if (errStatus.StatusCode == 405 && to.Username != "") || errStatus.StatusCode == 404 || errStatus.StatusCode == 401 {
 | 
				
			||||||
	r.token, r.err = token, err
 | 
										resp, err := auth.FetchToken(ctx, ah.client, ah.header, to)
 | 
				
			||||||
	r.Done()
 | 
										if err != nil {
 | 
				
			||||||
	return r.token, r.err
 | 
											return "", err
 | 
				
			||||||
}
 | 
										}
 | 
				
			||||||
 | 
										return resp.Token, nil
 | 
				
			||||||
type tokenOptions struct {
 | 
									}
 | 
				
			||||||
	realm    string
 | 
									log.G(ctx).WithFields(logrus.Fields{
 | 
				
			||||||
	service  string
 | 
										"status": errStatus.Status,
 | 
				
			||||||
	scopes   []string
 | 
										"body":   string(errStatus.Body),
 | 
				
			||||||
	username string
 | 
									}).Debugf("token request failed")
 | 
				
			||||||
	secret   string
 | 
								}
 | 
				
			||||||
}
 | 
								return "", err
 | 
				
			||||||
 | 
					 | 
				
			||||||
type postTokenResponse struct {
 | 
					 | 
				
			||||||
	AccessToken  string    `json:"access_token"`
 | 
					 | 
				
			||||||
	RefreshToken string    `json:"refresh_token"`
 | 
					 | 
				
			||||||
	ExpiresIn    int       `json:"expires_in"`
 | 
					 | 
				
			||||||
	IssuedAt     time.Time `json:"issued_at"`
 | 
					 | 
				
			||||||
	Scope        string    `json:"scope"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (ah *authHandler) fetchTokenWithOAuth(ctx context.Context, to tokenOptions) (string, error) {
 | 
					 | 
				
			||||||
	form := url.Values{}
 | 
					 | 
				
			||||||
	if len(to.scopes) > 0 {
 | 
					 | 
				
			||||||
		form.Set("scope", strings.Join(to.scopes, " "))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	form.Set("service", to.service)
 | 
					 | 
				
			||||||
	// TODO: Allow setting client_id
 | 
					 | 
				
			||||||
	form.Set("client_id", "containerd-client")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if to.username == "" {
 | 
					 | 
				
			||||||
		form.Set("grant_type", "refresh_token")
 | 
					 | 
				
			||||||
		form.Set("refresh_token", to.secret)
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		form.Set("grant_type", "password")
 | 
					 | 
				
			||||||
		form.Set("username", to.username)
 | 
					 | 
				
			||||||
		form.Set("password", to.secret)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	req, err := http.NewRequest("POST", to.realm, strings.NewReader(form.Encode()))
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return "", err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=utf-8")
 | 
					 | 
				
			||||||
	if ah.header != nil {
 | 
					 | 
				
			||||||
		for k, v := range ah.header {
 | 
					 | 
				
			||||||
			req.Header[k] = append(req.Header[k], v...)
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							return resp.AccessToken, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						// do request anonymously
 | 
				
			||||||
	resp, err := ctxhttp.Do(ctx, ah.client, req)
 | 
						resp, err := auth.FetchToken(ctx, ah.client, ah.header, to)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", err
 | 
							return "", errors.Wrap(err, "failed to fetch anonymous token")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	defer resp.Body.Close()
 | 
						return resp.Token, nil
 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Registries without support for POST may return 404 for POST /v2/token.
 | 
					 | 
				
			||||||
	// As of September 2017, GCR is known to return 404.
 | 
					 | 
				
			||||||
	// As of February 2018, JFrog Artifactory is known to return 401.
 | 
					 | 
				
			||||||
	if (resp.StatusCode == 405 && to.username != "") || resp.StatusCode == 404 || resp.StatusCode == 401 {
 | 
					 | 
				
			||||||
		return ah.fetchToken(ctx, to)
 | 
					 | 
				
			||||||
	} else if resp.StatusCode < 200 || resp.StatusCode >= 400 {
 | 
					 | 
				
			||||||
		b, _ := ioutil.ReadAll(io.LimitReader(resp.Body, 64000)) // 64KB
 | 
					 | 
				
			||||||
		log.G(ctx).WithFields(logrus.Fields{
 | 
					 | 
				
			||||||
			"status": resp.Status,
 | 
					 | 
				
			||||||
			"body":   string(b),
 | 
					 | 
				
			||||||
		}).Debugf("token request failed")
 | 
					 | 
				
			||||||
		// TODO: handle error body and write debug output
 | 
					 | 
				
			||||||
		return "", errors.Errorf("unexpected status: %s", resp.Status)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	decoder := json.NewDecoder(resp.Body)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var tr postTokenResponse
 | 
					 | 
				
			||||||
	if err = decoder.Decode(&tr); err != nil {
 | 
					 | 
				
			||||||
		return "", fmt.Errorf("unable to decode token response: %s", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return tr.AccessToken, nil
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type getTokenResponse struct {
 | 
					func invalidAuthorization(c auth.Challenge, responses []*http.Response) error {
 | 
				
			||||||
	Token        string    `json:"token"`
 | 
						errStr := c.Parameters["error"]
 | 
				
			||||||
	AccessToken  string    `json:"access_token"`
 | 
					 | 
				
			||||||
	ExpiresIn    int       `json:"expires_in"`
 | 
					 | 
				
			||||||
	IssuedAt     time.Time `json:"issued_at"`
 | 
					 | 
				
			||||||
	RefreshToken string    `json:"refresh_token"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// fetchToken fetches a token using a GET request
 | 
					 | 
				
			||||||
func (ah *authHandler) fetchToken(ctx context.Context, to tokenOptions) (string, error) {
 | 
					 | 
				
			||||||
	req, err := http.NewRequest("GET", to.realm, nil)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return "", err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if ah.header != nil {
 | 
					 | 
				
			||||||
		for k, v := range ah.header {
 | 
					 | 
				
			||||||
			req.Header[k] = append(req.Header[k], v...)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	reqParams := req.URL.Query()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if to.service != "" {
 | 
					 | 
				
			||||||
		reqParams.Add("service", to.service)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for _, scope := range to.scopes {
 | 
					 | 
				
			||||||
		reqParams.Add("scope", scope)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if to.secret != "" {
 | 
					 | 
				
			||||||
		req.SetBasicAuth(to.username, to.secret)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	req.URL.RawQuery = reqParams.Encode()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	resp, err := ctxhttp.Do(ctx, ah.client, req)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return "", err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	defer resp.Body.Close()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if resp.StatusCode < 200 || resp.StatusCode >= 400 {
 | 
					 | 
				
			||||||
		// TODO: handle error body and write debug output
 | 
					 | 
				
			||||||
		return "", errors.Errorf("unexpected status: %s", resp.Status)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	decoder := json.NewDecoder(resp.Body)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var tr getTokenResponse
 | 
					 | 
				
			||||||
	if err = decoder.Decode(&tr); err != nil {
 | 
					 | 
				
			||||||
		return "", fmt.Errorf("unable to decode token response: %s", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// `access_token` is equivalent to `token` and if both are specified
 | 
					 | 
				
			||||||
	// the choice is undefined.  Canonicalize `access_token` by sticking
 | 
					 | 
				
			||||||
	// things in `token`.
 | 
					 | 
				
			||||||
	if tr.AccessToken != "" {
 | 
					 | 
				
			||||||
		tr.Token = tr.AccessToken
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if tr.Token == "" {
 | 
					 | 
				
			||||||
		return "", ErrNoToken
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return tr.Token, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func invalidAuthorization(c challenge, responses []*http.Response) error {
 | 
					 | 
				
			||||||
	errStr := c.parameters["error"]
 | 
					 | 
				
			||||||
	if errStr == "" {
 | 
						if errStr == "" {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/containerd/containerd/remotes/docker/fetcher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/containerd/containerd/remotes/docker/fetcher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -98,6 +98,9 @@ func (r dockerFetcher) Fetch(ctx context.Context, desc ocispec.Descriptor) (io.R
 | 
				
			|||||||
			var firstErr error
 | 
								var firstErr error
 | 
				
			||||||
			for _, host := range r.hosts {
 | 
								for _, host := range r.hosts {
 | 
				
			||||||
				req := r.request(host, http.MethodGet, "manifests", desc.Digest.String())
 | 
									req := r.request(host, http.MethodGet, "manifests", desc.Digest.String())
 | 
				
			||||||
 | 
									if err := req.addNamespace(r.refspec.Hostname()); err != nil {
 | 
				
			||||||
 | 
										return nil, err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				rc, err := r.open(ctx, req, desc.MediaType, offset)
 | 
									rc, err := r.open(ctx, req, desc.MediaType, offset)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
@@ -118,6 +121,9 @@ func (r dockerFetcher) Fetch(ctx context.Context, desc ocispec.Descriptor) (io.R
 | 
				
			|||||||
		var firstErr error
 | 
							var firstErr error
 | 
				
			||||||
		for _, host := range r.hosts {
 | 
							for _, host := range r.hosts {
 | 
				
			||||||
			req := r.request(host, http.MethodGet, "blobs", desc.Digest.String())
 | 
								req := r.request(host, http.MethodGet, "blobs", desc.Digest.String())
 | 
				
			||||||
 | 
								if err := req.addNamespace(r.refspec.Hostname()); err != nil {
 | 
				
			||||||
 | 
									return nil, err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			rc, err := r.open(ctx, req, desc.MediaType, offset)
 | 
								rc, err := r.open(ctx, req, desc.MediaType, offset)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										20
									
								
								vendor/github.com/containerd/containerd/remotes/docker/pusher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/containerd/containerd/remotes/docker/pusher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -30,6 +30,7 @@ import (
 | 
				
			|||||||
	"github.com/containerd/containerd/images"
 | 
						"github.com/containerd/containerd/images"
 | 
				
			||||||
	"github.com/containerd/containerd/log"
 | 
						"github.com/containerd/containerd/log"
 | 
				
			||||||
	"github.com/containerd/containerd/remotes"
 | 
						"github.com/containerd/containerd/remotes"
 | 
				
			||||||
 | 
						remoteserrors "github.com/containerd/containerd/remotes/errors"
 | 
				
			||||||
	digest "github.com/opencontainers/go-digest"
 | 
						digest "github.com/opencontainers/go-digest"
 | 
				
			||||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
						ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
@@ -86,7 +87,7 @@ func (p dockerPusher) Push(ctx context.Context, desc ocispec.Descriptor) (conten
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	resp, err := req.doWithRetries(ctx, nil)
 | 
						resp, err := req.doWithRetries(ctx, nil)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if errors.Cause(err) != ErrInvalidAuthorization {
 | 
							if !errors.Is(err, ErrInvalidAuthorization) {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		log.G(ctx).WithError(err).Debugf("Unable to check existence, continuing with push")
 | 
							log.G(ctx).WithError(err).Debugf("Unable to check existence, continuing with push")
 | 
				
			||||||
@@ -112,8 +113,9 @@ func (p dockerPusher) Push(ctx context.Context, desc ocispec.Descriptor) (conten
 | 
				
			|||||||
				return nil, errors.Wrapf(errdefs.ErrAlreadyExists, "content %v on remote", desc.Digest)
 | 
									return nil, errors.Wrapf(errdefs.ErrAlreadyExists, "content %v on remote", desc.Digest)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else if resp.StatusCode != http.StatusNotFound {
 | 
							} else if resp.StatusCode != http.StatusNotFound {
 | 
				
			||||||
			// TODO: log error
 | 
								err := remoteserrors.NewUnexpectedStatusErr(resp)
 | 
				
			||||||
			return nil, errors.Errorf("unexpected response: %s", resp.Status)
 | 
								log.G(ctx).WithField("resp", resp).WithField("body", string(err.(remoteserrors.ErrUnexpectedStatus).Body)).Debug("unexpected response")
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -166,8 +168,9 @@ func (p dockerPusher) Push(ctx context.Context, desc ocispec.Descriptor) (conten
 | 
				
			|||||||
			})
 | 
								})
 | 
				
			||||||
			return nil, errors.Wrapf(errdefs.ErrAlreadyExists, "content %v on remote", desc.Digest)
 | 
								return nil, errors.Wrapf(errdefs.ErrAlreadyExists, "content %v on remote", desc.Digest)
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			// TODO: log error
 | 
								err := remoteserrors.NewUnexpectedStatusErr(resp)
 | 
				
			||||||
			return nil, errors.Errorf("unexpected response: %s", resp.Status)
 | 
								log.G(ctx).WithField("resp", resp).WithField("body", string(err.(remoteserrors.ErrUnexpectedStatus).Body)).Debug("unexpected response")
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		var (
 | 
							var (
 | 
				
			||||||
@@ -235,7 +238,7 @@ func (p dockerPusher) Push(ctx context.Context, desc ocispec.Descriptor) (conten
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	go func() {
 | 
						go func() {
 | 
				
			||||||
		defer close(respC)
 | 
							defer close(respC)
 | 
				
			||||||
		resp, err = req.do(ctx)
 | 
							resp, err := req.do(ctx)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			pr.CloseWithError(err)
 | 
								pr.CloseWithError(err)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
@@ -244,8 +247,9 @@ func (p dockerPusher) Push(ctx context.Context, desc ocispec.Descriptor) (conten
 | 
				
			|||||||
		switch resp.StatusCode {
 | 
							switch resp.StatusCode {
 | 
				
			||||||
		case http.StatusOK, http.StatusCreated, http.StatusNoContent:
 | 
							case http.StatusOK, http.StatusCreated, http.StatusNoContent:
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			// TODO: log error
 | 
								err := remoteserrors.NewUnexpectedStatusErr(resp)
 | 
				
			||||||
			pr.CloseWithError(errors.Errorf("unexpected response: %s", resp.Status))
 | 
								log.G(ctx).WithField("resp", resp).WithField("body", string(err.(remoteserrors.ErrUnexpectedStatus).Body)).Debug("unexpected response")
 | 
				
			||||||
 | 
								pr.CloseWithError(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		respC <- resp
 | 
							respC <- resp
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								vendor/github.com/containerd/containerd/remotes/docker/registry.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/containerd/containerd/remotes/docker/registry.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -70,6 +70,16 @@ type RegistryHost struct {
 | 
				
			|||||||
	Scheme       string
 | 
						Scheme       string
 | 
				
			||||||
	Path         string
 | 
						Path         string
 | 
				
			||||||
	Capabilities HostCapabilities
 | 
						Capabilities HostCapabilities
 | 
				
			||||||
 | 
						Header       http.Header
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (h RegistryHost) isProxy(refhost string) bool {
 | 
				
			||||||
 | 
						if refhost != h.Host {
 | 
				
			||||||
 | 
							if refhost != "docker.io" || h.Host != "registry-1.docker.io" {
 | 
				
			||||||
 | 
								return true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// RegistryHosts fetches the registry hosts for a given namespace,
 | 
					// RegistryHosts fetches the registry hosts for a given namespace,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										59
									
								
								vendor/github.com/containerd/containerd/remotes/docker/resolver.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										59
									
								
								vendor/github.com/containerd/containerd/remotes/docker/resolver.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -22,6 +22,7 @@ import (
 | 
				
			|||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"io/ioutil"
 | 
						"io/ioutil"
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
 | 
						"net/url"
 | 
				
			||||||
	"path"
 | 
						"path"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -40,10 +41,6 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	// ErrNoToken is returned if a request is successful but the body does not
 | 
					 | 
				
			||||||
	// contain an authorization token.
 | 
					 | 
				
			||||||
	ErrNoToken = errors.New("authorization server did not include a token in the response")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// ErrInvalidAuthorization is used when credentials are passed to a server but
 | 
						// ErrInvalidAuthorization is used when credentials are passed to a server but
 | 
				
			||||||
	// those credentials are rejected.
 | 
						// those credentials are rejected.
 | 
				
			||||||
	ErrInvalidAuthorization = errors.New("authorization failed")
 | 
						ErrInvalidAuthorization = errors.New("authorization failed")
 | 
				
			||||||
@@ -276,6 +273,10 @@ func (r *dockerResolver) Resolve(ctx context.Context, ref string) (string, ocisp
 | 
				
			|||||||
			ctx := log.WithLogger(ctx, log.G(ctx).WithField("host", host.Host))
 | 
								ctx := log.WithLogger(ctx, log.G(ctx).WithField("host", host.Host))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			req := base.request(host, http.MethodHead, u...)
 | 
								req := base.request(host, http.MethodHead, u...)
 | 
				
			||||||
 | 
								if err := req.addNamespace(base.refspec.Hostname()); err != nil {
 | 
				
			||||||
 | 
									return "", ocispec.Descriptor{}, err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			for key, value := range r.resolveHeader {
 | 
								for key, value := range r.resolveHeader {
 | 
				
			||||||
				req.header[key] = append(req.header[key], value...)
 | 
									req.header[key] = append(req.header[key], value...)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -283,7 +284,7 @@ func (r *dockerResolver) Resolve(ctx context.Context, ref string) (string, ocisp
 | 
				
			|||||||
			log.G(ctx).Debug("resolving")
 | 
								log.G(ctx).Debug("resolving")
 | 
				
			||||||
			resp, err := req.doWithRetries(ctx, nil)
 | 
								resp, err := req.doWithRetries(ctx, nil)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				if errors.Cause(err) == ErrInvalidAuthorization {
 | 
									if errors.Is(err, ErrInvalidAuthorization) {
 | 
				
			||||||
					err = errors.Wrapf(err, "pull access denied, repository does not exist or may require authorization")
 | 
										err = errors.Wrapf(err, "pull access denied, repository does not exist or may require authorization")
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				// Store the error for referencing later
 | 
									// Store the error for referencing later
 | 
				
			||||||
@@ -323,6 +324,10 @@ func (r *dockerResolver) Resolve(ctx context.Context, ref string) (string, ocisp
 | 
				
			|||||||
				log.G(ctx).Debug("no Docker-Content-Digest header, fetching manifest instead")
 | 
									log.G(ctx).Debug("no Docker-Content-Digest header, fetching manifest instead")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				req = base.request(host, http.MethodGet, u...)
 | 
									req = base.request(host, http.MethodGet, u...)
 | 
				
			||||||
 | 
									if err := req.addNamespace(base.refspec.Hostname()); err != nil {
 | 
				
			||||||
 | 
										return "", ocispec.Descriptor{}, err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				for key, value := range r.resolveHeader {
 | 
									for key, value := range r.resolveHeader {
 | 
				
			||||||
					req.header[key] = append(req.header[key], value...)
 | 
										req.header[key] = append(req.header[key], value...)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@@ -416,10 +421,10 @@ func (r *dockerResolver) Pusher(ctx context.Context, ref string) (remotes.Pusher
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type dockerBase struct {
 | 
					type dockerBase struct {
 | 
				
			||||||
	refspec   reference.Spec
 | 
						refspec    reference.Spec
 | 
				
			||||||
	namespace string
 | 
						repository string
 | 
				
			||||||
	hosts     []RegistryHost
 | 
						hosts      []RegistryHost
 | 
				
			||||||
	header    http.Header
 | 
						header     http.Header
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (r *dockerResolver) base(refspec reference.Spec) (*dockerBase, error) {
 | 
					func (r *dockerResolver) base(refspec reference.Spec) (*dockerBase, error) {
 | 
				
			||||||
@@ -429,10 +434,10 @@ func (r *dockerResolver) base(refspec reference.Spec) (*dockerBase, error) {
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return &dockerBase{
 | 
						return &dockerBase{
 | 
				
			||||||
		refspec:   refspec,
 | 
							refspec:    refspec,
 | 
				
			||||||
		namespace: strings.TrimPrefix(refspec.Locator, host+"/"),
 | 
							repository: strings.TrimPrefix(refspec.Locator, host+"/"),
 | 
				
			||||||
		hosts:     hosts,
 | 
							hosts:      hosts,
 | 
				
			||||||
		header:    r.header,
 | 
							header:     r.header,
 | 
				
			||||||
	}, nil
 | 
						}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -450,7 +455,10 @@ func (r *dockerBase) request(host RegistryHost, method string, ps ...string) *re
 | 
				
			|||||||
	for key, value := range r.header {
 | 
						for key, value := range r.header {
 | 
				
			||||||
		header[key] = append(header[key], value...)
 | 
							header[key] = append(header[key], value...)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	parts := append([]string{"/", host.Path, r.namespace}, ps...)
 | 
						for key, value := range host.Header {
 | 
				
			||||||
 | 
							header[key] = append(header[key], value...)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						parts := append([]string{"/", host.Path, r.repository}, ps...)
 | 
				
			||||||
	p := path.Join(parts...)
 | 
						p := path.Join(parts...)
 | 
				
			||||||
	// Join strips trailing slash, re-add ending "/" if included
 | 
						// Join strips trailing slash, re-add ending "/" if included
 | 
				
			||||||
	if len(parts) > 0 && strings.HasSuffix(parts[len(parts)-1], "/") {
 | 
						if len(parts) > 0 && strings.HasSuffix(parts[len(parts)-1], "/") {
 | 
				
			||||||
@@ -475,6 +483,29 @@ func (r *request) authorize(ctx context.Context, req *http.Request) error {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *request) addNamespace(ns string) (err error) {
 | 
				
			||||||
 | 
						if !r.host.isProxy(ns) {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var q url.Values
 | 
				
			||||||
 | 
						// Parse query
 | 
				
			||||||
 | 
						if i := strings.IndexByte(r.path, '?'); i > 0 {
 | 
				
			||||||
 | 
							r.path = r.path[:i+1]
 | 
				
			||||||
 | 
							q, err = url.ParseQuery(r.path[i+1:])
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							r.path = r.path + "?"
 | 
				
			||||||
 | 
							q = url.Values{}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						q.Add("ns", ns)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						r.path = r.path + q.Encode()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type request struct {
 | 
					type request struct {
 | 
				
			||||||
	method string
 | 
						method string
 | 
				
			||||||
	path   string
 | 
						path   string
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/containerd/containerd/remotes/docker/scope.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/containerd/containerd/remotes/docker/scope.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -72,8 +72,8 @@ func contextWithAppendPullRepositoryScope(ctx context.Context, repo string) cont
 | 
				
			|||||||
	return WithScope(ctx, fmt.Sprintf("repository:%s:pull", repo))
 | 
						return WithScope(ctx, fmt.Sprintf("repository:%s:pull", repo))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// getTokenScopes returns deduplicated and sorted scopes from ctx.Value(tokenScopesKey{}) and common scopes.
 | 
					// GetTokenScopes returns deduplicated and sorted scopes from ctx.Value(tokenScopesKey{}) and common scopes.
 | 
				
			||||||
func getTokenScopes(ctx context.Context, common []string) []string {
 | 
					func GetTokenScopes(ctx context.Context, common []string) []string {
 | 
				
			||||||
	var scopes []string
 | 
						var scopes []string
 | 
				
			||||||
	if x := ctx.Value(tokenScopesKey{}); x != nil {
 | 
						if x := ctx.Value(tokenScopesKey{}); x != nil {
 | 
				
			||||||
		scopes = append(scopes, x.([]string)...)
 | 
							scopes = append(scopes, x.([]string)...)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										46
									
								
								vendor/github.com/containerd/containerd/remotes/errors/errors.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/containerd/containerd/remotes/errors/errors.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ error = ErrUnexpectedStatus{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ErrUnexpectedStatus is returned if a registry API request returned with unexpected HTTP status
 | 
				
			||||||
 | 
					type ErrUnexpectedStatus struct {
 | 
				
			||||||
 | 
						Status     string
 | 
				
			||||||
 | 
						StatusCode int
 | 
				
			||||||
 | 
						Body       []byte
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e ErrUnexpectedStatus) Error() string {
 | 
				
			||||||
 | 
						return fmt.Sprintf("unexpected status: %s", e.Status)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewUnexpectedStatusErr creates an ErrUnexpectedStatus from HTTP response
 | 
				
			||||||
 | 
					func NewUnexpectedStatusErr(resp *http.Response) error {
 | 
				
			||||||
 | 
						var b []byte
 | 
				
			||||||
 | 
						if resp.Body != nil {
 | 
				
			||||||
 | 
							b, _ = ioutil.ReadAll(io.LimitReader(resp.Body, 64000)) // 64KB
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ErrUnexpectedStatus{Status: resp.Status, StatusCode: resp.StatusCode, Body: b}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										21
									
								
								vendor/github.com/containerd/containerd/sys/epoll.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								vendor/github.com/containerd/containerd/sys/epoll.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -20,17 +20,14 @@ package sys
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import "golang.org/x/sys/unix"
 | 
					import "golang.org/x/sys/unix"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// EpollCreate1 directly calls unix.EpollCreate1
 | 
					// EpollCreate1 is an alias for unix.EpollCreate1
 | 
				
			||||||
func EpollCreate1(flag int) (int, error) {
 | 
					// Deprecated: use golang.org/x/sys/unix.EpollCreate1
 | 
				
			||||||
	return unix.EpollCreate1(flag)
 | 
					var EpollCreate1 = unix.EpollCreate1
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// EpollCtl directly calls unix.EpollCtl
 | 
					// EpollCtl is an alias for unix.EpollCtl
 | 
				
			||||||
func EpollCtl(epfd int, op int, fd int, event *unix.EpollEvent) error {
 | 
					// Deprecated: use golang.org/x/sys/unix.EpollCtl
 | 
				
			||||||
	return unix.EpollCtl(epfd, op, fd, event)
 | 
					var EpollCtl = unix.EpollCtl
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// EpollWait directly calls unix.EpollWait
 | 
					// EpollWait is an alias for unix.EpollWait
 | 
				
			||||||
func EpollWait(epfd int, events []unix.EpollEvent, msec int) (int, error) {
 | 
					// Deprecated: use golang.org/x/sys/unix.EpollWait
 | 
				
			||||||
	return unix.EpollWait(epfd, events, msec)
 | 
					var EpollWait = unix.EpollWait
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										35
									
								
								vendor/github.com/containerd/containerd/sys/filesys.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								vendor/github.com/containerd/containerd/sys/filesys.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsFifo checks if a file is a (named pipe) fifo
 | 
				
			||||||
 | 
					// if the file does not exist then it returns false
 | 
				
			||||||
 | 
					func IsFifo(path string) (bool, error) {
 | 
				
			||||||
 | 
						stat, err := os.Stat(path)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							if os.IsNotExist(err) {
 | 
				
			||||||
 | 
								return false, nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if stat.Mode()&os.ModeNamedPipe == os.ModeNamedPipe {
 | 
				
			||||||
 | 
							return true, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										89
									
								
								vendor/github.com/containerd/containerd/sys/filesys_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										89
									
								
								vendor/github.com/containerd/containerd/sys/filesys_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -26,8 +26,8 @@ import (
 | 
				
			|||||||
	"syscall"
 | 
						"syscall"
 | 
				
			||||||
	"unsafe"
 | 
						"unsafe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	winio "github.com/Microsoft/go-winio"
 | 
					 | 
				
			||||||
	"github.com/Microsoft/hcsshim"
 | 
						"github.com/Microsoft/hcsshim"
 | 
				
			||||||
 | 
						"golang.org/x/sys/windows"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -41,7 +41,8 @@ func MkdirAllWithACL(path string, perm os.FileMode) error {
 | 
				
			|||||||
	return mkdirall(path, true)
 | 
						return mkdirall(path, true)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// MkdirAll implementation that is volume path aware for Windows.
 | 
					// MkdirAll implementation that is volume path aware for Windows. It can be used
 | 
				
			||||||
 | 
					// as a drop-in replacement for os.MkdirAll()
 | 
				
			||||||
func MkdirAll(path string, _ os.FileMode) error {
 | 
					func MkdirAll(path string, _ os.FileMode) error {
 | 
				
			||||||
	return mkdirall(path, false)
 | 
						return mkdirall(path, false)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -111,26 +112,26 @@ func mkdirall(path string, adminAndLocalSystem bool) error {
 | 
				
			|||||||
// mkdirWithACL creates a new directory. If there is an error, it will be of
 | 
					// mkdirWithACL creates a new directory. If there is an error, it will be of
 | 
				
			||||||
// type *PathError. .
 | 
					// type *PathError. .
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This is a modified and combined version of os.Mkdir and syscall.Mkdir
 | 
					// This is a modified and combined version of os.Mkdir and windows.Mkdir
 | 
				
			||||||
// in golang to cater for creating a directory am ACL permitting full
 | 
					// in golang to cater for creating a directory am ACL permitting full
 | 
				
			||||||
// access, with inheritance, to any subfolder/file for Built-in Administrators
 | 
					// access, with inheritance, to any subfolder/file for Built-in Administrators
 | 
				
			||||||
// and Local System.
 | 
					// and Local System.
 | 
				
			||||||
func mkdirWithACL(name string) error {
 | 
					func mkdirWithACL(name string) error {
 | 
				
			||||||
	sa := syscall.SecurityAttributes{Length: 0}
 | 
						sa := windows.SecurityAttributes{Length: 0}
 | 
				
			||||||
	sd, err := winio.SddlToSecurityDescriptor(SddlAdministratorsLocalSystem)
 | 
						sd, err := windows.SecurityDescriptorFromString(SddlAdministratorsLocalSystem)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return &os.PathError{Op: "mkdir", Path: name, Err: err}
 | 
							return &os.PathError{Op: "mkdir", Path: name, Err: err}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	sa.Length = uint32(unsafe.Sizeof(sa))
 | 
						sa.Length = uint32(unsafe.Sizeof(sa))
 | 
				
			||||||
	sa.InheritHandle = 1
 | 
						sa.InheritHandle = 1
 | 
				
			||||||
	sa.SecurityDescriptor = uintptr(unsafe.Pointer(&sd[0]))
 | 
						sa.SecurityDescriptor = sd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	namep, err := syscall.UTF16PtrFromString(name)
 | 
						namep, err := windows.UTF16PtrFromString(name)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return &os.PathError{Op: "mkdir", Path: name, Err: err}
 | 
							return &os.PathError{Op: "mkdir", Path: name, Err: err}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	e := syscall.CreateDirectory(namep, &sa)
 | 
						e := windows.CreateDirectory(namep, &sa)
 | 
				
			||||||
	if e != nil {
 | 
						if e != nil {
 | 
				
			||||||
		return &os.PathError{Op: "mkdir", Path: name, Err: e}
 | 
							return &os.PathError{Op: "mkdir", Path: name, Err: e}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -153,7 +154,7 @@ func IsAbs(path string) bool {
 | 
				
			|||||||
	return true
 | 
						return true
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The origin of the functions below here are the golang OS and syscall packages,
 | 
					// The origin of the functions below here are the golang OS and windows packages,
 | 
				
			||||||
// slightly modified to only cope with files, not directories due to the
 | 
					// slightly modified to only cope with files, not directories due to the
 | 
				
			||||||
// specific use case.
 | 
					// specific use case.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
@@ -185,74 +186,74 @@ func OpenFileSequential(name string, flag int, _ os.FileMode) (*os.File, error)
 | 
				
			|||||||
	if name == "" {
 | 
						if name == "" {
 | 
				
			||||||
		return nil, &os.PathError{Op: "open", Path: name, Err: syscall.ENOENT}
 | 
							return nil, &os.PathError{Op: "open", Path: name, Err: syscall.ENOENT}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	r, errf := syscallOpenFileSequential(name, flag, 0)
 | 
						r, errf := windowsOpenFileSequential(name, flag, 0)
 | 
				
			||||||
	if errf == nil {
 | 
						if errf == nil {
 | 
				
			||||||
		return r, nil
 | 
							return r, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil, &os.PathError{Op: "open", Path: name, Err: errf}
 | 
						return nil, &os.PathError{Op: "open", Path: name, Err: errf}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func syscallOpenFileSequential(name string, flag int, _ os.FileMode) (file *os.File, err error) {
 | 
					func windowsOpenFileSequential(name string, flag int, _ os.FileMode) (file *os.File, err error) {
 | 
				
			||||||
	r, e := syscallOpenSequential(name, flag|syscall.O_CLOEXEC, 0)
 | 
						r, e := windowsOpenSequential(name, flag|windows.O_CLOEXEC, 0)
 | 
				
			||||||
	if e != nil {
 | 
						if e != nil {
 | 
				
			||||||
		return nil, e
 | 
							return nil, e
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return os.NewFile(uintptr(r), name), nil
 | 
						return os.NewFile(uintptr(r), name), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func makeInheritSa() *syscall.SecurityAttributes {
 | 
					func makeInheritSa() *windows.SecurityAttributes {
 | 
				
			||||||
	var sa syscall.SecurityAttributes
 | 
						var sa windows.SecurityAttributes
 | 
				
			||||||
	sa.Length = uint32(unsafe.Sizeof(sa))
 | 
						sa.Length = uint32(unsafe.Sizeof(sa))
 | 
				
			||||||
	sa.InheritHandle = 1
 | 
						sa.InheritHandle = 1
 | 
				
			||||||
	return &sa
 | 
						return &sa
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func syscallOpenSequential(path string, mode int, _ uint32) (fd syscall.Handle, err error) {
 | 
					func windowsOpenSequential(path string, mode int, _ uint32) (fd windows.Handle, err error) {
 | 
				
			||||||
	if len(path) == 0 {
 | 
						if len(path) == 0 {
 | 
				
			||||||
		return syscall.InvalidHandle, syscall.ERROR_FILE_NOT_FOUND
 | 
							return windows.InvalidHandle, windows.ERROR_FILE_NOT_FOUND
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	pathp, err := syscall.UTF16PtrFromString(path)
 | 
						pathp, err := windows.UTF16PtrFromString(path)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return syscall.InvalidHandle, err
 | 
							return windows.InvalidHandle, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var access uint32
 | 
						var access uint32
 | 
				
			||||||
	switch mode & (syscall.O_RDONLY | syscall.O_WRONLY | syscall.O_RDWR) {
 | 
						switch mode & (windows.O_RDONLY | windows.O_WRONLY | windows.O_RDWR) {
 | 
				
			||||||
	case syscall.O_RDONLY:
 | 
						case windows.O_RDONLY:
 | 
				
			||||||
		access = syscall.GENERIC_READ
 | 
							access = windows.GENERIC_READ
 | 
				
			||||||
	case syscall.O_WRONLY:
 | 
						case windows.O_WRONLY:
 | 
				
			||||||
		access = syscall.GENERIC_WRITE
 | 
							access = windows.GENERIC_WRITE
 | 
				
			||||||
	case syscall.O_RDWR:
 | 
						case windows.O_RDWR:
 | 
				
			||||||
		access = syscall.GENERIC_READ | syscall.GENERIC_WRITE
 | 
							access = windows.GENERIC_READ | windows.GENERIC_WRITE
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if mode&syscall.O_CREAT != 0 {
 | 
						if mode&windows.O_CREAT != 0 {
 | 
				
			||||||
		access |= syscall.GENERIC_WRITE
 | 
							access |= windows.GENERIC_WRITE
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if mode&syscall.O_APPEND != 0 {
 | 
						if mode&windows.O_APPEND != 0 {
 | 
				
			||||||
		access &^= syscall.GENERIC_WRITE
 | 
							access &^= windows.GENERIC_WRITE
 | 
				
			||||||
		access |= syscall.FILE_APPEND_DATA
 | 
							access |= windows.FILE_APPEND_DATA
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	sharemode := uint32(syscall.FILE_SHARE_READ | syscall.FILE_SHARE_WRITE)
 | 
						sharemode := uint32(windows.FILE_SHARE_READ | windows.FILE_SHARE_WRITE)
 | 
				
			||||||
	var sa *syscall.SecurityAttributes
 | 
						var sa *windows.SecurityAttributes
 | 
				
			||||||
	if mode&syscall.O_CLOEXEC == 0 {
 | 
						if mode&windows.O_CLOEXEC == 0 {
 | 
				
			||||||
		sa = makeInheritSa()
 | 
							sa = makeInheritSa()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var createmode uint32
 | 
						var createmode uint32
 | 
				
			||||||
	switch {
 | 
						switch {
 | 
				
			||||||
	case mode&(syscall.O_CREAT|syscall.O_EXCL) == (syscall.O_CREAT | syscall.O_EXCL):
 | 
						case mode&(windows.O_CREAT|windows.O_EXCL) == (windows.O_CREAT | windows.O_EXCL):
 | 
				
			||||||
		createmode = syscall.CREATE_NEW
 | 
							createmode = windows.CREATE_NEW
 | 
				
			||||||
	case mode&(syscall.O_CREAT|syscall.O_TRUNC) == (syscall.O_CREAT | syscall.O_TRUNC):
 | 
						case mode&(windows.O_CREAT|windows.O_TRUNC) == (windows.O_CREAT | windows.O_TRUNC):
 | 
				
			||||||
		createmode = syscall.CREATE_ALWAYS
 | 
							createmode = windows.CREATE_ALWAYS
 | 
				
			||||||
	case mode&syscall.O_CREAT == syscall.O_CREAT:
 | 
						case mode&windows.O_CREAT == windows.O_CREAT:
 | 
				
			||||||
		createmode = syscall.OPEN_ALWAYS
 | 
							createmode = windows.OPEN_ALWAYS
 | 
				
			||||||
	case mode&syscall.O_TRUNC == syscall.O_TRUNC:
 | 
						case mode&windows.O_TRUNC == windows.O_TRUNC:
 | 
				
			||||||
		createmode = syscall.TRUNCATE_EXISTING
 | 
							createmode = windows.TRUNCATE_EXISTING
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		createmode = syscall.OPEN_EXISTING
 | 
							createmode = windows.OPEN_EXISTING
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Use FILE_FLAG_SEQUENTIAL_SCAN rather than FILE_ATTRIBUTE_NORMAL as implemented in golang.
 | 
						// Use FILE_FLAG_SEQUENTIAL_SCAN rather than FILE_ATTRIBUTE_NORMAL as implemented in golang.
 | 
				
			||||||
	//https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx
 | 
						// https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx
 | 
				
			||||||
	const fileFlagSequentialScan = 0x08000000 // FILE_FLAG_SEQUENTIAL_SCAN
 | 
						const fileFlagSequentialScan = 0x08000000 // FILE_FLAG_SEQUENTIAL_SCAN
 | 
				
			||||||
	h, e := syscall.CreateFile(pathp, access, sharemode, sa, createmode, fileFlagSequentialScan, 0)
 | 
						h, e := windows.CreateFile(pathp, access, sharemode, sa, createmode, fileFlagSequentialScan, 0)
 | 
				
			||||||
	return h, e
 | 
						return h, e
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										52
									
								
								vendor/github.com/containerd/containerd/sys/mount_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								vendor/github.com/containerd/containerd/sys/mount_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -21,6 +21,7 @@ import (
 | 
				
			|||||||
	"syscall"
 | 
						"syscall"
 | 
				
			||||||
	"unsafe"
 | 
						"unsafe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/containerd/containerd/log"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
	"golang.org/x/sys/unix"
 | 
						"golang.org/x/sys/unix"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -30,9 +31,8 @@ func FMountat(dirfd uintptr, source, target, fstype string, flags uintptr, data
 | 
				
			|||||||
	var (
 | 
						var (
 | 
				
			||||||
		sourceP, targetP, fstypeP, dataP *byte
 | 
							sourceP, targetP, fstypeP, dataP *byte
 | 
				
			||||||
		pid                              uintptr
 | 
							pid                              uintptr
 | 
				
			||||||
		ws                               unix.WaitStatus
 | 
					 | 
				
			||||||
		err                              error
 | 
							err                              error
 | 
				
			||||||
		errno                            syscall.Errno
 | 
							errno, status                    syscall.Errno
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sourceP, err = syscall.BytePtrFromString(source)
 | 
						sourceP, err = syscall.BytePtrFromString(source)
 | 
				
			||||||
@@ -60,37 +60,62 @@ func FMountat(dirfd uintptr, source, target, fstype string, flags uintptr, data
 | 
				
			|||||||
	runtime.LockOSThread()
 | 
						runtime.LockOSThread()
 | 
				
			||||||
	defer runtime.UnlockOSThread()
 | 
						defer runtime.UnlockOSThread()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var pipefds [2]int
 | 
				
			||||||
 | 
						if err := syscall.Pipe2(pipefds[:], syscall.O_CLOEXEC); err != nil {
 | 
				
			||||||
 | 
							return errors.Wrap(err, "failed to open pipe")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						defer func() {
 | 
				
			||||||
 | 
							// close both ends of the pipe in a deferred function, since open file
 | 
				
			||||||
 | 
							// descriptor table is shared with child
 | 
				
			||||||
 | 
							syscall.Close(pipefds[0])
 | 
				
			||||||
 | 
							syscall.Close(pipefds[1])
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pid, errno = forkAndMountat(dirfd,
 | 
						pid, errno = forkAndMountat(dirfd,
 | 
				
			||||||
		uintptr(unsafe.Pointer(sourceP)),
 | 
							uintptr(unsafe.Pointer(sourceP)),
 | 
				
			||||||
		uintptr(unsafe.Pointer(targetP)),
 | 
							uintptr(unsafe.Pointer(targetP)),
 | 
				
			||||||
		uintptr(unsafe.Pointer(fstypeP)),
 | 
							uintptr(unsafe.Pointer(fstypeP)),
 | 
				
			||||||
		flags,
 | 
							flags,
 | 
				
			||||||
		uintptr(unsafe.Pointer(dataP)))
 | 
							uintptr(unsafe.Pointer(dataP)),
 | 
				
			||||||
 | 
							pipefds[1],
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if errno != 0 {
 | 
						if errno != 0 {
 | 
				
			||||||
		return errors.Wrap(errno, "failed to fork thread")
 | 
							return errors.Wrap(errno, "failed to fork thread")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_, err = unix.Wait4(int(pid), &ws, 0, nil)
 | 
						defer func() {
 | 
				
			||||||
	for err == syscall.EINTR {
 | 
							_, err := unix.Wait4(int(pid), nil, 0, nil)
 | 
				
			||||||
		_, err = unix.Wait4(int(pid), &ws, 0, nil)
 | 
							for err == syscall.EINTR {
 | 
				
			||||||
	}
 | 
								_, err = unix.Wait4(int(pid), nil, 0, nil)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
		return errors.Wrapf(err, "failed to find pid=%d process", pid)
 | 
								log.L.WithError(err).Debugf("failed to find pid=%d process", pid)
 | 
				
			||||||
	}
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	errno = syscall.Errno(ws.ExitStatus())
 | 
						_, _, errno = syscall.RawSyscall(syscall.SYS_READ,
 | 
				
			||||||
 | 
							uintptr(pipefds[0]),
 | 
				
			||||||
 | 
							uintptr(unsafe.Pointer(&status)),
 | 
				
			||||||
 | 
							unsafe.Sizeof(status))
 | 
				
			||||||
	if errno != 0 {
 | 
						if errno != 0 {
 | 
				
			||||||
		return errors.Wrap(errno, "failed to mount")
 | 
							return errors.Wrap(errno, "failed to read pipe")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if status != 0 {
 | 
				
			||||||
 | 
							return errors.Wrap(status, "failed to mount")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// forkAndMountat will fork thread, change working dir and mount.
 | 
					// forkAndMountat will fork thread, change working dir and mount.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// precondition: the runtime OS thread must be locked.
 | 
					// precondition: the runtime OS thread must be locked.
 | 
				
			||||||
func forkAndMountat(dirfd uintptr, source, target, fstype, flags, data uintptr) (pid uintptr, errno syscall.Errno) {
 | 
					func forkAndMountat(dirfd uintptr, source, target, fstype, flags, data uintptr, pipefd int) (pid uintptr, errno syscall.Errno) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// block signal during clone
 | 
						// block signal during clone
 | 
				
			||||||
	beforeFork()
 | 
						beforeFork()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -114,6 +139,7 @@ func forkAndMountat(dirfd uintptr, source, target, fstype, flags, data uintptr)
 | 
				
			|||||||
	_, _, errno = syscall.RawSyscall6(syscall.SYS_MOUNT, source, target, fstype, flags, data, 0)
 | 
						_, _, errno = syscall.RawSyscall6(syscall.SYS_MOUNT, source, target, fstype, flags, data, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
childerr:
 | 
					childerr:
 | 
				
			||||||
 | 
						_, _, errno = syscall.RawSyscall(syscall.SYS_WRITE, uintptr(pipefd), uintptr(unsafe.Pointer(&errno)), unsafe.Sizeof(errno))
 | 
				
			||||||
	syscall.RawSyscall(syscall.SYS_EXIT, uintptr(errno), 0, 0)
 | 
						syscall.RawSyscall(syscall.SYS_EXIT, uintptr(errno), 0, 0)
 | 
				
			||||||
	panic("unreachable")
 | 
						panic("unreachable")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/containerd/containerd/sys/oom_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/containerd/containerd/sys/oom_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -24,8 +24,6 @@ import (
 | 
				
			|||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/opencontainers/runc/libcontainer/system"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// OOMScoreMaxKillable is the maximum score keeping the process killable by the oom killer
 | 
					// OOMScoreMaxKillable is the maximum score keeping the process killable by the oom killer
 | 
				
			||||||
@@ -40,7 +38,7 @@ func SetOOMScore(pid, score int) error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	defer f.Close()
 | 
						defer f.Close()
 | 
				
			||||||
	if _, err = f.WriteString(strconv.Itoa(score)); err != nil {
 | 
						if _, err = f.WriteString(strconv.Itoa(score)); err != nil {
 | 
				
			||||||
		if os.IsPermission(err) && (system.RunningInUserNS() || RunningUnprivileged()) {
 | 
							if os.IsPermission(err) && (RunningInUserNS() || RunningUnprivileged()) {
 | 
				
			||||||
			return nil
 | 
								return nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										80
									
								
								vendor/github.com/containerd/containerd/sys/proc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										80
									
								
								vendor/github.com/containerd/containerd/sys/proc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,80 +0,0 @@
 | 
				
			|||||||
// +build linux
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
   Copyright The containerd Authors.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
   you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
   You may obtain a copy of the License at
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   Unless required by applicable law or agreed to in writing, software
 | 
					 | 
				
			||||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
					 | 
				
			||||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					 | 
				
			||||||
   See the License for the specific language governing permissions and
 | 
					 | 
				
			||||||
   limitations under the License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package sys
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"bufio"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"strconv"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/opencontainers/runc/libcontainer/system"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const nanoSecondsPerSecond = 1e9
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var clockTicksPerSecond = uint64(system.GetClockTicks())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GetSystemCPUUsage returns the host system's cpu usage in
 | 
					 | 
				
			||||||
// nanoseconds. An error is returned if the format of the underlying
 | 
					 | 
				
			||||||
// file does not match.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Uses /proc/stat defined by POSIX. Looks for the cpu
 | 
					 | 
				
			||||||
// statistics line and then sums up the first seven fields
 | 
					 | 
				
			||||||
// provided. See `man 5 proc` for details on specific field
 | 
					 | 
				
			||||||
// information.
 | 
					 | 
				
			||||||
func GetSystemCPUUsage() (uint64, error) {
 | 
					 | 
				
			||||||
	var line string
 | 
					 | 
				
			||||||
	f, err := os.Open("/proc/stat")
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return 0, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	bufReader := bufio.NewReaderSize(nil, 128)
 | 
					 | 
				
			||||||
	defer func() {
 | 
					 | 
				
			||||||
		bufReader.Reset(nil)
 | 
					 | 
				
			||||||
		f.Close()
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
	bufReader.Reset(f)
 | 
					 | 
				
			||||||
	err = nil
 | 
					 | 
				
			||||||
	for err == nil {
 | 
					 | 
				
			||||||
		line, err = bufReader.ReadString('\n')
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		parts := strings.Fields(line)
 | 
					 | 
				
			||||||
		switch parts[0] {
 | 
					 | 
				
			||||||
		case "cpu":
 | 
					 | 
				
			||||||
			if len(parts) < 8 {
 | 
					 | 
				
			||||||
				return 0, fmt.Errorf("bad format of cpu stats")
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			var totalClockTicks uint64
 | 
					 | 
				
			||||||
			for _, i := range parts[1:8] {
 | 
					 | 
				
			||||||
				v, err := strconv.ParseUint(i, 10, 64)
 | 
					 | 
				
			||||||
				if err != nil {
 | 
					 | 
				
			||||||
					return 0, fmt.Errorf("error parsing cpu stats")
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				totalClockTicks += v
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return (totalClockTicks * nanoSecondsPerSecond) /
 | 
					 | 
				
			||||||
				clockTicksPerSecond, nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return 0, fmt.Errorf("bad stats format")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										69
									
								
								vendor/github.com/containerd/containerd/sys/reaper.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										69
									
								
								vendor/github.com/containerd/containerd/sys/reaper.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,69 +0,0 @@
 | 
				
			|||||||
// +build !windows
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
   Copyright The containerd Authors.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
   you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
   You may obtain a copy of the License at
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   Unless required by applicable law or agreed to in writing, software
 | 
					 | 
				
			||||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
					 | 
				
			||||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					 | 
				
			||||||
   See the License for the specific language governing permissions and
 | 
					 | 
				
			||||||
   limitations under the License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package sys
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"golang.org/x/sys/unix"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Exit is the wait4 information from an exited process
 | 
					 | 
				
			||||||
type Exit struct {
 | 
					 | 
				
			||||||
	Pid    int
 | 
					 | 
				
			||||||
	Status int
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Reap reaps all child processes for the calling process and returns their
 | 
					 | 
				
			||||||
// exit information
 | 
					 | 
				
			||||||
func Reap(wait bool) (exits []Exit, err error) {
 | 
					 | 
				
			||||||
	var (
 | 
					 | 
				
			||||||
		ws  unix.WaitStatus
 | 
					 | 
				
			||||||
		rus unix.Rusage
 | 
					 | 
				
			||||||
	)
 | 
					 | 
				
			||||||
	flag := unix.WNOHANG
 | 
					 | 
				
			||||||
	if wait {
 | 
					 | 
				
			||||||
		flag = 0
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for {
 | 
					 | 
				
			||||||
		pid, err := unix.Wait4(-1, &ws, flag, &rus)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			if err == unix.ECHILD {
 | 
					 | 
				
			||||||
				return exits, nil
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return exits, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if pid <= 0 {
 | 
					 | 
				
			||||||
			return exits, nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		exits = append(exits, Exit{
 | 
					 | 
				
			||||||
			Pid:    pid,
 | 
					 | 
				
			||||||
			Status: exitStatus(ws),
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const exitSignalOffset = 128
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// exitStatus returns the correct exit status for a process based on if it
 | 
					 | 
				
			||||||
// was signaled or exited cleanly
 | 
					 | 
				
			||||||
func exitStatus(status unix.WaitStatus) int {
 | 
					 | 
				
			||||||
	if status.Signaled() {
 | 
					 | 
				
			||||||
		return exitSignalOffset + int(status.Signal())
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return status.ExitStatus()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										52
									
								
								vendor/github.com/containerd/containerd/sys/reaper_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								vendor/github.com/containerd/containerd/sys/reaper_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,52 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
   Copyright The containerd Authors.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
   you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
   You may obtain a copy of the License at
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   Unless required by applicable law or agreed to in writing, software
 | 
					 | 
				
			||||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
					 | 
				
			||||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					 | 
				
			||||||
   See the License for the specific language governing permissions and
 | 
					 | 
				
			||||||
   limitations under the License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package sys
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"unsafe"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"golang.org/x/sys/unix"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// If arg2 is nonzero, set the "child subreaper" attribute of the
 | 
					 | 
				
			||||||
// calling process; if arg2 is zero, unset the attribute.  When a
 | 
					 | 
				
			||||||
// process is marked as a child subreaper, all of the children
 | 
					 | 
				
			||||||
// that it creates, and their descendants, will be marked as
 | 
					 | 
				
			||||||
// having a subreaper.  In effect, a subreaper fulfills the role
 | 
					 | 
				
			||||||
// of init(1) for its descendant processes.  Upon termination of
 | 
					 | 
				
			||||||
// a process that is orphaned (i.e., its immediate parent has
 | 
					 | 
				
			||||||
// already terminated) and marked as having a subreaper, the
 | 
					 | 
				
			||||||
// nearest still living ancestor subreaper will receive a SIGCHLD
 | 
					 | 
				
			||||||
// signal and be able to wait(2) on the process to discover its
 | 
					 | 
				
			||||||
// termination status.
 | 
					 | 
				
			||||||
const setChildSubreaper = 36
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// SetSubreaper sets the value i as the subreaper setting for the calling process
 | 
					 | 
				
			||||||
func SetSubreaper(i int) error {
 | 
					 | 
				
			||||||
	return unix.Prctl(setChildSubreaper, uintptr(i), 0, 0, 0)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GetSubreaper returns the subreaper setting for the calling process
 | 
					 | 
				
			||||||
func GetSubreaper() (int, error) {
 | 
					 | 
				
			||||||
	var i uintptr
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if err := unix.Prctl(unix.PR_GET_CHILD_SUBREAPER, uintptr(unsafe.Pointer(&i)), 0, 0, 0); err != nil {
 | 
					 | 
				
			||||||
		return -1, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return int(i), nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										62
									
								
								vendor/github.com/containerd/containerd/sys/userns_linux.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								vendor/github.com/containerd/containerd/sys/userns_linux.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bufio"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"sync"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						inUserNS bool
 | 
				
			||||||
 | 
						nsOnce   sync.Once
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RunningInUserNS detects whether we are currently running in a user namespace.
 | 
				
			||||||
 | 
					// Originally copied from github.com/lxc/lxd/shared/util.go
 | 
				
			||||||
 | 
					func RunningInUserNS() bool {
 | 
				
			||||||
 | 
						nsOnce.Do(func() {
 | 
				
			||||||
 | 
							file, err := os.Open("/proc/self/uid_map")
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								// This kernel-provided file only exists if user namespaces are supported
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							defer file.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							buf := bufio.NewReader(file)
 | 
				
			||||||
 | 
							l, _, err := buf.ReadLine()
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							line := string(l)
 | 
				
			||||||
 | 
							var a, b, c int64
 | 
				
			||||||
 | 
							fmt.Sscanf(line, "%d %d %d", &a, &b, &c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							 * We assume we are in the initial user namespace if we have a full
 | 
				
			||||||
 | 
							 * range - 4294967295 uids starting at uid 0.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							if a == 0 && b == 0 && c == 4294967295 {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							inUserNS = true
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						return inUserNS
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
// +build !windows
 | 
					// +build !linux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
   Copyright The containerd Authors.
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
@@ -16,11 +16,10 @@
 | 
				
			|||||||
   limitations under the License.
 | 
					   limitations under the License.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package syscallx
 | 
					package sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "syscall"
 | 
					// RunningInUserNS is a stub for non-Linux systems
 | 
				
			||||||
 | 
					// Always returns false
 | 
				
			||||||
// Readlink returns the destination of the named symbolic link.
 | 
					func RunningInUserNS() bool {
 | 
				
			||||||
func Readlink(path string, buf []byte) (n int, err error) {
 | 
						return false
 | 
				
			||||||
	return syscall.Readlink(path, buf)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/containerd/version/version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/containerd/version/version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,7 +23,7 @@ var (
 | 
				
			|||||||
	Package = "github.com/containerd/containerd"
 | 
						Package = "github.com/containerd/containerd"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Version holds the complete version number. Filled in at linking time.
 | 
						// Version holds the complete version number. Filled in at linking time.
 | 
				
			||||||
	Version = "1.3.0+unknown"
 | 
						Version = "1.4.0+unknown"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Revision is filled with the VCS (e.g. git) revision being used to build
 | 
						// Revision is filled with the VCS (e.g. git) revision being used to build
 | 
				
			||||||
	// the program at linking time.
 | 
						// the program at linking time.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										20
									
								
								vendor/github.com/containerd/continuity/AUTHORS
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/containerd/continuity/AUTHORS
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,16 +1,36 @@
 | 
				
			|||||||
Aaron Lehmann <aaron.lehmann@docker.com>
 | 
					Aaron Lehmann <aaron.lehmann@docker.com>
 | 
				
			||||||
Akash Gupta <akagup@microsoft.com>
 | 
					Akash Gupta <akagup@microsoft.com>
 | 
				
			||||||
 | 
					Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
 | 
				
			||||||
Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
 | 
					Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
 | 
				
			||||||
 | 
					Akihiro Suda <suda.kyoto@gmail.com>
 | 
				
			||||||
Andrew Pennebaker <apennebaker@datapipe.com>
 | 
					Andrew Pennebaker <apennebaker@datapipe.com>
 | 
				
			||||||
Brandon Philips <brandon.philips@coreos.com>
 | 
					Brandon Philips <brandon.philips@coreos.com>
 | 
				
			||||||
 | 
					Brian Goff <cpuguy83@gmail.com>
 | 
				
			||||||
Christopher Jones <tophj@linux.vnet.ibm.com>
 | 
					Christopher Jones <tophj@linux.vnet.ibm.com>
 | 
				
			||||||
Daniel, Dao Quang Minh <dqminh89@gmail.com>
 | 
					Daniel, Dao Quang Minh <dqminh89@gmail.com>
 | 
				
			||||||
 | 
					Darren Stahl <darst@microsoft.com>
 | 
				
			||||||
 | 
					Derek McGowan <derek@mcg.dev>
 | 
				
			||||||
Derek McGowan <derek@mcgstyle.net>
 | 
					Derek McGowan <derek@mcgstyle.net>
 | 
				
			||||||
Edward Pilatowicz <edward.pilatowicz@oracle.com>
 | 
					Edward Pilatowicz <edward.pilatowicz@oracle.com>
 | 
				
			||||||
Ian Campbell <ijc@docker.com>
 | 
					Ian Campbell <ijc@docker.com>
 | 
				
			||||||
 | 
					Ivan Markin <sw@nogoegst.net>
 | 
				
			||||||
Justin Cormack <justin.cormack@docker.com>
 | 
					Justin Cormack <justin.cormack@docker.com>
 | 
				
			||||||
Justin Cummins <sul3n3t@gmail.com>
 | 
					Justin Cummins <sul3n3t@gmail.com>
 | 
				
			||||||
 | 
					Kasper Fabæch Brandt <poizan@poizan.dk>
 | 
				
			||||||
 | 
					Kir Kolyshkin <kolyshkin@gmail.com>
 | 
				
			||||||
 | 
					Michael Crosby <crosbymichael@gmail.com>
 | 
				
			||||||
 | 
					Michael Wan <zirenwan@gmail.com>
 | 
				
			||||||
 | 
					Niels de Vos <ndevos@redhat.com>
 | 
				
			||||||
Phil Estes <estesp@gmail.com>
 | 
					Phil Estes <estesp@gmail.com>
 | 
				
			||||||
 | 
					Phil Estes <estesp@linux.vnet.ibm.com>
 | 
				
			||||||
 | 
					Sam Whited <sam@samwhited.com>
 | 
				
			||||||
 | 
					Shengjing Zhu <zhsj@debian.org>
 | 
				
			||||||
Stephen J Day <stephen.day@docker.com>
 | 
					Stephen J Day <stephen.day@docker.com>
 | 
				
			||||||
 | 
					Tibor Vass <tibor@docker.com>
 | 
				
			||||||
Tobias Klauser <tklauser@distanz.ch>
 | 
					Tobias Klauser <tklauser@distanz.ch>
 | 
				
			||||||
 | 
					Tom Faulhaber <tffaulha@amazon.com>
 | 
				
			||||||
Tonis Tiigi <tonistiigi@gmail.com>
 | 
					Tonis Tiigi <tonistiigi@gmail.com>
 | 
				
			||||||
 | 
					Trevor Porter <trkporter@ucdavis.edu>
 | 
				
			||||||
 | 
					Wei Fu <fuweid89@gmail.com>
 | 
				
			||||||
 | 
					Wilbert van de Ridder <wilbert.ridder@gmail.com>
 | 
				
			||||||
 | 
					Xiaodong Ye <xiaodongy@vmware.com>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										112
									
								
								vendor/github.com/containerd/continuity/syscallx/syscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										112
									
								
								vendor/github.com/containerd/continuity/syscallx/syscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,112 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
   Copyright The containerd Authors.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
   you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
   You may obtain a copy of the License at
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   Unless required by applicable law or agreed to in writing, software
 | 
					 | 
				
			||||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
					 | 
				
			||||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					 | 
				
			||||||
   See the License for the specific language governing permissions and
 | 
					 | 
				
			||||||
   limitations under the License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package syscallx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"syscall"
 | 
					 | 
				
			||||||
	"unsafe"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type reparseDataBuffer struct {
 | 
					 | 
				
			||||||
	ReparseTag        uint32
 | 
					 | 
				
			||||||
	ReparseDataLength uint16
 | 
					 | 
				
			||||||
	Reserved          uint16
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// GenericReparseBuffer
 | 
					 | 
				
			||||||
	reparseBuffer byte
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type mountPointReparseBuffer struct {
 | 
					 | 
				
			||||||
	SubstituteNameOffset uint16
 | 
					 | 
				
			||||||
	SubstituteNameLength uint16
 | 
					 | 
				
			||||||
	PrintNameOffset      uint16
 | 
					 | 
				
			||||||
	PrintNameLength      uint16
 | 
					 | 
				
			||||||
	PathBuffer           [1]uint16
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type symbolicLinkReparseBuffer struct {
 | 
					 | 
				
			||||||
	SubstituteNameOffset uint16
 | 
					 | 
				
			||||||
	SubstituteNameLength uint16
 | 
					 | 
				
			||||||
	PrintNameOffset      uint16
 | 
					 | 
				
			||||||
	PrintNameLength      uint16
 | 
					 | 
				
			||||||
	Flags                uint32
 | 
					 | 
				
			||||||
	PathBuffer           [1]uint16
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	_IO_REPARSE_TAG_MOUNT_POINT = 0xA0000003
 | 
					 | 
				
			||||||
	_SYMLINK_FLAG_RELATIVE      = 1
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Readlink returns the destination of the named symbolic link.
 | 
					 | 
				
			||||||
func Readlink(path string, buf []byte) (n int, err error) {
 | 
					 | 
				
			||||||
	fd, err := syscall.CreateFile(syscall.StringToUTF16Ptr(path), syscall.GENERIC_READ, 0, nil, syscall.OPEN_EXISTING,
 | 
					 | 
				
			||||||
		syscall.FILE_FLAG_OPEN_REPARSE_POINT|syscall.FILE_FLAG_BACKUP_SEMANTICS, 0)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return -1, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	defer syscall.CloseHandle(fd)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	rdbbuf := make([]byte, syscall.MAXIMUM_REPARSE_DATA_BUFFER_SIZE)
 | 
					 | 
				
			||||||
	var bytesReturned uint32
 | 
					 | 
				
			||||||
	err = syscall.DeviceIoControl(fd, syscall.FSCTL_GET_REPARSE_POINT, nil, 0, &rdbbuf[0], uint32(len(rdbbuf)), &bytesReturned, nil)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return -1, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	rdb := (*reparseDataBuffer)(unsafe.Pointer(&rdbbuf[0]))
 | 
					 | 
				
			||||||
	var s string
 | 
					 | 
				
			||||||
	switch rdb.ReparseTag {
 | 
					 | 
				
			||||||
	case syscall.IO_REPARSE_TAG_SYMLINK:
 | 
					 | 
				
			||||||
		data := (*symbolicLinkReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer))
 | 
					 | 
				
			||||||
		p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0]))
 | 
					 | 
				
			||||||
		s = syscall.UTF16ToString(p[data.SubstituteNameOffset/2 : (data.SubstituteNameOffset+data.SubstituteNameLength)/2])
 | 
					 | 
				
			||||||
		if data.Flags&_SYMLINK_FLAG_RELATIVE == 0 {
 | 
					 | 
				
			||||||
			if len(s) >= 4 && s[:4] == `\??\` {
 | 
					 | 
				
			||||||
				s = s[4:]
 | 
					 | 
				
			||||||
				switch {
 | 
					 | 
				
			||||||
				case len(s) >= 2 && s[1] == ':': // \??\C:\foo\bar
 | 
					 | 
				
			||||||
					// do nothing
 | 
					 | 
				
			||||||
				case len(s) >= 4 && s[:4] == `UNC\`: // \??\UNC\foo\bar
 | 
					 | 
				
			||||||
					s = `\\` + s[4:]
 | 
					 | 
				
			||||||
				default:
 | 
					 | 
				
			||||||
					// unexpected; do nothing
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				// unexpected; do nothing
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	case _IO_REPARSE_TAG_MOUNT_POINT:
 | 
					 | 
				
			||||||
		data := (*mountPointReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer))
 | 
					 | 
				
			||||||
		p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0]))
 | 
					 | 
				
			||||||
		s = syscall.UTF16ToString(p[data.SubstituteNameOffset/2 : (data.SubstituteNameOffset+data.SubstituteNameLength)/2])
 | 
					 | 
				
			||||||
		if len(s) >= 4 && s[:4] == `\??\` { // \??\C:\foo\bar
 | 
					 | 
				
			||||||
			if len(s) < 48 || s[:11] != `\??\Volume{` {
 | 
					 | 
				
			||||||
				s = s[4:]
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			// unexpected; do nothing
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		// the path is not a symlink or junction but another type of reparse
 | 
					 | 
				
			||||||
		// point
 | 
					 | 
				
			||||||
		return -1, syscall.ENOENT
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	n = copy(buf, []byte(s))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return n, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										128
									
								
								vendor/github.com/containerd/continuity/sysx/file_posix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										128
									
								
								vendor/github.com/containerd/continuity/sysx/file_posix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,128 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
   Copyright The containerd Authors.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
   you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
   You may obtain a copy of the License at
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   Unless required by applicable law or agreed to in writing, software
 | 
					 | 
				
			||||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
					 | 
				
			||||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					 | 
				
			||||||
   See the License for the specific language governing permissions and
 | 
					 | 
				
			||||||
   limitations under the License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package sysx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"path/filepath"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/containerd/continuity/syscallx"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Readlink returns the destination of the named symbolic link.
 | 
					 | 
				
			||||||
// If there is an error, it will be of type *PathError.
 | 
					 | 
				
			||||||
func Readlink(name string) (string, error) {
 | 
					 | 
				
			||||||
	for len := 128; ; len *= 2 {
 | 
					 | 
				
			||||||
		b := make([]byte, len)
 | 
					 | 
				
			||||||
		n, e := fixCount(syscallx.Readlink(fixLongPath(name), b))
 | 
					 | 
				
			||||||
		if e != nil {
 | 
					 | 
				
			||||||
			return "", &os.PathError{Op: "readlink", Path: name, Err: e}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if n < len {
 | 
					 | 
				
			||||||
			return string(b[0:n]), nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Many functions in package syscall return a count of -1 instead of 0.
 | 
					 | 
				
			||||||
// Using fixCount(call()) instead of call() corrects the count.
 | 
					 | 
				
			||||||
func fixCount(n int, err error) (int, error) {
 | 
					 | 
				
			||||||
	if n < 0 {
 | 
					 | 
				
			||||||
		n = 0
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return n, err
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// fixLongPath returns the extended-length (\\?\-prefixed) form of
 | 
					 | 
				
			||||||
// path when needed, in order to avoid the default 260 character file
 | 
					 | 
				
			||||||
// path limit imposed by Windows. If path is not easily converted to
 | 
					 | 
				
			||||||
// the extended-length form (for example, if path is a relative path
 | 
					 | 
				
			||||||
// or contains .. elements), or is short enough, fixLongPath returns
 | 
					 | 
				
			||||||
// path unmodified.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// See https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath
 | 
					 | 
				
			||||||
func fixLongPath(path string) string {
 | 
					 | 
				
			||||||
	// Do nothing (and don't allocate) if the path is "short".
 | 
					 | 
				
			||||||
	// Empirically (at least on the Windows Server 2013 builder),
 | 
					 | 
				
			||||||
	// the kernel is arbitrarily okay with < 248 bytes. That
 | 
					 | 
				
			||||||
	// matches what the docs above say:
 | 
					 | 
				
			||||||
	// "When using an API to create a directory, the specified
 | 
					 | 
				
			||||||
	// path cannot be so long that you cannot append an 8.3 file
 | 
					 | 
				
			||||||
	// name (that is, the directory name cannot exceed MAX_PATH
 | 
					 | 
				
			||||||
	// minus 12)." Since MAX_PATH is 260, 260 - 12 = 248.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// The MSDN docs appear to say that a normal path that is 248 bytes long
 | 
					 | 
				
			||||||
	// will work; empirically the path must be less then 248 bytes long.
 | 
					 | 
				
			||||||
	if len(path) < 248 {
 | 
					 | 
				
			||||||
		// Don't fix. (This is how Go 1.7 and earlier worked,
 | 
					 | 
				
			||||||
		// not automatically generating the \\?\ form)
 | 
					 | 
				
			||||||
		return path
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// The extended form begins with \\?\, as in
 | 
					 | 
				
			||||||
	// \\?\c:\windows\foo.txt or \\?\UNC\server\share\foo.txt.
 | 
					 | 
				
			||||||
	// The extended form disables evaluation of . and .. path
 | 
					 | 
				
			||||||
	// elements and disables the interpretation of / as equivalent
 | 
					 | 
				
			||||||
	// to \. The conversion here rewrites / to \ and elides
 | 
					 | 
				
			||||||
	// . elements as well as trailing or duplicate separators. For
 | 
					 | 
				
			||||||
	// simplicity it avoids the conversion entirely for relative
 | 
					 | 
				
			||||||
	// paths or paths containing .. elements. For now,
 | 
					 | 
				
			||||||
	// \\server\share paths are not converted to
 | 
					 | 
				
			||||||
	// \\?\UNC\server\share paths because the rules for doing so
 | 
					 | 
				
			||||||
	// are less well-specified.
 | 
					 | 
				
			||||||
	if len(path) >= 2 && path[:2] == `\\` {
 | 
					 | 
				
			||||||
		// Don't canonicalize UNC paths.
 | 
					 | 
				
			||||||
		return path
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if !filepath.IsAbs(path) {
 | 
					 | 
				
			||||||
		// Relative path
 | 
					 | 
				
			||||||
		return path
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	const prefix = `\\?`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pathbuf := make([]byte, len(prefix)+len(path)+len(`\`))
 | 
					 | 
				
			||||||
	copy(pathbuf, prefix)
 | 
					 | 
				
			||||||
	n := len(path)
 | 
					 | 
				
			||||||
	r, w := 0, len(prefix)
 | 
					 | 
				
			||||||
	for r < n {
 | 
					 | 
				
			||||||
		switch {
 | 
					 | 
				
			||||||
		case os.IsPathSeparator(path[r]):
 | 
					 | 
				
			||||||
			// empty block
 | 
					 | 
				
			||||||
			r++
 | 
					 | 
				
			||||||
		case path[r] == '.' && (r+1 == n || os.IsPathSeparator(path[r+1])):
 | 
					 | 
				
			||||||
			// /./
 | 
					 | 
				
			||||||
			r++
 | 
					 | 
				
			||||||
		case r+1 < n && path[r] == '.' && path[r+1] == '.' && (r+2 == n || os.IsPathSeparator(path[r+2])):
 | 
					 | 
				
			||||||
			// /../ is currently unhandled
 | 
					 | 
				
			||||||
			return path
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			pathbuf[w] = '\\'
 | 
					 | 
				
			||||||
			w++
 | 
					 | 
				
			||||||
			for ; r < n && !os.IsPathSeparator(path[r]); r++ {
 | 
					 | 
				
			||||||
				pathbuf[w] = path[r]
 | 
					 | 
				
			||||||
				w++
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// A drive's root directory needs a trailing \
 | 
					 | 
				
			||||||
	if w == len(`\\?\c:`) {
 | 
					 | 
				
			||||||
		pathbuf[w] = '\\'
 | 
					 | 
				
			||||||
		w++
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return string(pathbuf[:w])
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										72
									
								
								vendor/github.com/containerd/continuity/sysx/xattr.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										72
									
								
								vendor/github.com/containerd/continuity/sysx/xattr.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -20,7 +20,6 @@ package sysx
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"bytes"
 | 
						"bytes"
 | 
				
			||||||
	"syscall"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"golang.org/x/sys/unix"
 | 
						"golang.org/x/sys/unix"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -66,60 +65,53 @@ func LGetxattr(path, attr string) ([]byte, error) {
 | 
				
			|||||||
	return getxattrAll(path, attr, unix.Lgetxattr)
 | 
						return getxattrAll(path, attr, unix.Lgetxattr)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultXattrBufferSize = 5
 | 
					const defaultXattrBufferSize = 128
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type listxattrFunc func(path string, dest []byte) (int, error)
 | 
					type listxattrFunc func(path string, dest []byte) (int, error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func listxattrAll(path string, listFunc listxattrFunc) ([]string, error) {
 | 
					func listxattrAll(path string, listFunc listxattrFunc) ([]string, error) {
 | 
				
			||||||
	var p []byte // nil on first execution
 | 
						buf := make([]byte, defaultXattrBufferSize)
 | 
				
			||||||
 | 
						n, err := listFunc(path, buf)
 | 
				
			||||||
	for {
 | 
						for err == unix.ERANGE {
 | 
				
			||||||
		n, err := listFunc(path, p) // first call gets buffer size.
 | 
							// Buffer too small, use zero-sized buffer to get the actual size
 | 
				
			||||||
 | 
							n, err = listFunc(path, []byte{})
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							buf = make([]byte, n)
 | 
				
			||||||
		if n > len(p) {
 | 
							n, err = listFunc(path, buf)
 | 
				
			||||||
			p = make([]byte, n)
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		p = p[:n]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		ps := bytes.Split(bytes.TrimSuffix(p, []byte{0}), []byte{0})
 | 
					 | 
				
			||||||
		var entries []string
 | 
					 | 
				
			||||||
		for _, p := range ps {
 | 
					 | 
				
			||||||
			s := string(p)
 | 
					 | 
				
			||||||
			if s != "" {
 | 
					 | 
				
			||||||
				entries = append(entries, s)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return entries, nil
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ps := bytes.Split(bytes.TrimSuffix(buf[:n], []byte{0}), []byte{0})
 | 
				
			||||||
 | 
						var entries []string
 | 
				
			||||||
 | 
						for _, p := range ps {
 | 
				
			||||||
 | 
							if len(p) > 0 {
 | 
				
			||||||
 | 
								entries = append(entries, string(p))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return entries, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type getxattrFunc func(string, string, []byte) (int, error)
 | 
					type getxattrFunc func(string, string, []byte) (int, error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getxattrAll(path, attr string, getFunc getxattrFunc) ([]byte, error) {
 | 
					func getxattrAll(path, attr string, getFunc getxattrFunc) ([]byte, error) {
 | 
				
			||||||
	p := make([]byte, defaultXattrBufferSize)
 | 
						buf := make([]byte, defaultXattrBufferSize)
 | 
				
			||||||
	for {
 | 
						n, err := getFunc(path, attr, buf)
 | 
				
			||||||
		n, err := getFunc(path, attr, p)
 | 
						for err == unix.ERANGE {
 | 
				
			||||||
 | 
							// Buffer too small, use zero-sized buffer to get the actual size
 | 
				
			||||||
 | 
							n, err = getFunc(path, attr, []byte{})
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			if errno, ok := err.(syscall.Errno); ok && errno == syscall.ERANGE {
 | 
					 | 
				
			||||||
				p = make([]byte, len(p)*2) // this can't be ideal.
 | 
					 | 
				
			||||||
				continue                   // try again!
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							buf = make([]byte, n)
 | 
				
			||||||
		// realloc to correct size and repeat
 | 
							n, err = getFunc(path, attr, buf)
 | 
				
			||||||
		if n > len(p) {
 | 
					 | 
				
			||||||
			p = make([]byte, n)
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return p[:n], nil
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return buf[:n], nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								vendor/github.com/containerd/continuity/sysx/xattr_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/containerd/continuity/sysx/xattr_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,7 +23,7 @@ import (
 | 
				
			|||||||
	"runtime"
 | 
						"runtime"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var unsupported = errors.New("extended attributes unsupported on " + runtime.GOOS)
 | 
					var errUnsupported = errors.New("extended attributes unsupported on " + runtime.GOOS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Listxattr calls syscall listxattr and reads all content
 | 
					// Listxattr calls syscall listxattr and reads all content
 | 
				
			||||||
// and returns a string array
 | 
					// and returns a string array
 | 
				
			||||||
@@ -33,17 +33,17 @@ func Listxattr(path string) ([]string, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Removexattr calls syscall removexattr
 | 
					// Removexattr calls syscall removexattr
 | 
				
			||||||
func Removexattr(path string, attr string) (err error) {
 | 
					func Removexattr(path string, attr string) (err error) {
 | 
				
			||||||
	return unsupported
 | 
						return errUnsupported
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Setxattr calls syscall setxattr
 | 
					// Setxattr calls syscall setxattr
 | 
				
			||||||
func Setxattr(path string, attr string, data []byte, flags int) (err error) {
 | 
					func Setxattr(path string, attr string, data []byte, flags int) (err error) {
 | 
				
			||||||
	return unsupported
 | 
						return errUnsupported
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Getxattr calls syscall getxattr
 | 
					// Getxattr calls syscall getxattr
 | 
				
			||||||
func Getxattr(path, attr string) ([]byte, error) {
 | 
					func Getxattr(path, attr string) ([]byte, error) {
 | 
				
			||||||
	return []byte{}, unsupported
 | 
						return []byte{}, errUnsupported
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// LListxattr lists xattrs, not following symlinks
 | 
					// LListxattr lists xattrs, not following symlinks
 | 
				
			||||||
@@ -53,12 +53,12 @@ func LListxattr(path string) ([]string, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// LRemovexattr removes an xattr, not following symlinks
 | 
					// LRemovexattr removes an xattr, not following symlinks
 | 
				
			||||||
func LRemovexattr(path string, attr string) (err error) {
 | 
					func LRemovexattr(path string, attr string) (err error) {
 | 
				
			||||||
	return unsupported
 | 
						return errUnsupported
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// LSetxattr sets an xattr, not following symlinks
 | 
					// LSetxattr sets an xattr, not following symlinks
 | 
				
			||||||
func LSetxattr(path string, attr string, data []byte, flags int) (err error) {
 | 
					func LSetxattr(path string, attr string, data []byte, flags int) (err error) {
 | 
				
			||||||
	return unsupported
 | 
						return errUnsupported
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// LGetxattr gets an xattr, not following symlinks
 | 
					// LGetxattr gets an xattr, not following symlinks
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/typeurl/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/typeurl/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					*.test
 | 
				
			||||||
 | 
					coverage.txt
 | 
				
			||||||
@@ -176,7 +176,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   END OF TERMS AND CONDITIONS
 | 
					   END OF TERMS AND CONDITIONS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   Copyright 2016 Docker, Inc.
 | 
					   Copyright The containerd Authors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
   you may not use this file except in compliance with the License.
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
							
								
								
									
										19
									
								
								vendor/github.com/containerd/typeurl/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/containerd/typeurl/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					# typeurl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[](https://travis-ci.org/containerd/typeurl)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[](https://codecov.io/gh/containerd/typeurl)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A Go package for managing the registration, marshaling, and unmarshaling of encoded types.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This package helps when types are sent over a GRPC API and marshaled as a [protobuf.Any](https://github.com/gogo/protobuf/blob/master/protobuf/google/protobuf/any.proto).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Project details
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**typeurl** is a containerd sub-project, licensed under the [Apache 2.0 license](./LICENSE).
 | 
				
			||||||
 | 
					As a containerd sub-project, you will find the:
 | 
				
			||||||
 | 
					 * [Project governance](https://github.com/containerd/project/blob/master/GOVERNANCE.md),
 | 
				
			||||||
 | 
					 * [Maintainers](https://github.com/containerd/project/blob/master/MAINTAINERS),
 | 
				
			||||||
 | 
					 * and [Contributing guidelines](https://github.com/containerd/project/blob/master/CONTRIBUTING.md)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					information in our [`containerd/project`](https://github.com/containerd/project) repository.
 | 
				
			||||||
							
								
								
									
										83
									
								
								vendor/github.com/containerd/typeurl/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								vendor/github.com/containerd/typeurl/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,83 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package typeurl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Package typeurl assists with managing the registration, marshaling, and
 | 
				
			||||||
 | 
					// unmarshaling of types encoded as protobuf.Any.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// A protobuf.Any is a proto message that can contain any arbitrary data. It
 | 
				
			||||||
 | 
					// consists of two components, a TypeUrl and a Value, and its proto definition
 | 
				
			||||||
 | 
					// looks like this:
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//   message Any {
 | 
				
			||||||
 | 
					//     string type_url = 1;
 | 
				
			||||||
 | 
					//     bytes value = 2;
 | 
				
			||||||
 | 
					//   }
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// The TypeUrl is used to distinguish the contents from other proto.Any
 | 
				
			||||||
 | 
					// messages. This typeurl library manages these URLs to enable automagic
 | 
				
			||||||
 | 
					// marshaling and unmarshaling of the contents.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// For example, consider this go struct:
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//   type Foo struct {
 | 
				
			||||||
 | 
					//     Field1 string
 | 
				
			||||||
 | 
					//     Field2 string
 | 
				
			||||||
 | 
					//   }
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// To use typeurl, types must first be registered. This is typically done in
 | 
				
			||||||
 | 
					// the init function
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//   func init() {
 | 
				
			||||||
 | 
					//      typeurl.Register(&Foo{}, "Foo")
 | 
				
			||||||
 | 
					//   }
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// This will register the type Foo with the url path "Foo". The arguments to
 | 
				
			||||||
 | 
					// Register are variadic, and are used to construct a url path. Consider this
 | 
				
			||||||
 | 
					// example, from the github.com/containerd/containerd/client package:
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//   func init() {
 | 
				
			||||||
 | 
					//     const prefix = "types.containerd.io"
 | 
				
			||||||
 | 
					//     // register TypeUrls for commonly marshaled external types
 | 
				
			||||||
 | 
					//     major := strconv.Itoa(specs.VersionMajor)
 | 
				
			||||||
 | 
					//     typeurl.Register(&specs.Spec{}, prefix, "opencontainers/runtime-spec", major, "Spec")
 | 
				
			||||||
 | 
					//     // this function has more Register calls, which are elided.
 | 
				
			||||||
 | 
					//   }
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// This registers several types under a more complex url, which ends up mapping
 | 
				
			||||||
 | 
					// to `types.containerd.io/opencontainers/runtime-spec/1/Spec` (or some other
 | 
				
			||||||
 | 
					// value for major).
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Once a type is registered, it can be marshaled to a proto.Any message simply
 | 
				
			||||||
 | 
					// by calling `MarshalAny`, like this:
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//   foo := &Foo{Field1: "value1", Field2: "value2"}
 | 
				
			||||||
 | 
					//   anyFoo, err := typeurl.MarshalAny(foo)
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// MarshalAny will resolve the correct URL for the type. If the type in
 | 
				
			||||||
 | 
					// question implements the proto.Message interface, then it will be marshaled
 | 
				
			||||||
 | 
					// as a proto message. Otherwise, it will be marshaled as json. This means that
 | 
				
			||||||
 | 
					// typeurl will work on any arbitrary data, whether or not it has a proto
 | 
				
			||||||
 | 
					// definition, as long as it can be serialized to json.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// To unmarshal, the process is simply inverse:
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//   iface, err := typeurl.UnmarshalAny(anyFoo)
 | 
				
			||||||
 | 
					//   foo := iface.(*Foo)
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// The correct type is automatically chosen from the type registry, and the
 | 
				
			||||||
 | 
					// returned interface can be cast straight to that type.
 | 
				
			||||||
							
								
								
									
										8
									
								
								vendor/github.com/containerd/typeurl/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/containerd/typeurl/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					module github.com/containerd/typeurl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go 1.13
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require (
 | 
				
			||||||
 | 
						github.com/gogo/protobuf v1.3.1
 | 
				
			||||||
 | 
						github.com/pkg/errors v0.9.1
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
							
								
								
									
										7
									
								
								vendor/github.com/containerd/typeurl/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/containerd/typeurl/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
 | 
				
			||||||
 | 
					github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 | 
				
			||||||
 | 
					github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 | 
				
			||||||
 | 
					github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
				
			||||||
 | 
					github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
				
			||||||
 | 
					github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
				
			||||||
							
								
								
									
										195
									
								
								vendor/github.com/containerd/typeurl/types.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								vendor/github.com/containerd/typeurl/types.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,195 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Copyright The containerd Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					   you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					   You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					   distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					   See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					   limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package typeurl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"path"
 | 
				
			||||||
 | 
						"reflect"
 | 
				
			||||||
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/gogo/protobuf/proto"
 | 
				
			||||||
 | 
						"github.com/gogo/protobuf/types"
 | 
				
			||||||
 | 
						"github.com/pkg/errors"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						mu       sync.Mutex
 | 
				
			||||||
 | 
						registry = make(map[reflect.Type]string)
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var ErrNotFound = errors.New("not found")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Register a type with a base URL for JSON marshaling. When the MarshalAny and
 | 
				
			||||||
 | 
					// UnmarshalAny functions are called they will treat the Any type value as JSON.
 | 
				
			||||||
 | 
					// To use protocol buffers for handling the Any value the proto.Register
 | 
				
			||||||
 | 
					// function should be used instead of this function.
 | 
				
			||||||
 | 
					func Register(v interface{}, args ...string) {
 | 
				
			||||||
 | 
						var (
 | 
				
			||||||
 | 
							t = tryDereference(v)
 | 
				
			||||||
 | 
							p = path.Join(args...)
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						mu.Lock()
 | 
				
			||||||
 | 
						defer mu.Unlock()
 | 
				
			||||||
 | 
						if et, ok := registry[t]; ok {
 | 
				
			||||||
 | 
							if et != p {
 | 
				
			||||||
 | 
								panic(errors.Errorf("type registered with alternate path %q != %q", et, p))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						registry[t] = p
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TypeURL returns the type url for a registered type.
 | 
				
			||||||
 | 
					func TypeURL(v interface{}) (string, error) {
 | 
				
			||||||
 | 
						mu.Lock()
 | 
				
			||||||
 | 
						u, ok := registry[tryDereference(v)]
 | 
				
			||||||
 | 
						mu.Unlock()
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							// fallback to the proto registry if it is a proto message
 | 
				
			||||||
 | 
							pb, ok := v.(proto.Message)
 | 
				
			||||||
 | 
							if !ok {
 | 
				
			||||||
 | 
								return "", errors.Wrapf(ErrNotFound, "type %s", reflect.TypeOf(v))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return proto.MessageName(pb), nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return u, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Is returns true if the type of the Any is the same as v.
 | 
				
			||||||
 | 
					func Is(any *types.Any, v interface{}) bool {
 | 
				
			||||||
 | 
						// call to check that v is a pointer
 | 
				
			||||||
 | 
						tryDereference(v)
 | 
				
			||||||
 | 
						url, err := TypeURL(v)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return any.TypeUrl == url
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MarshalAny marshals the value v into an any with the correct TypeUrl.
 | 
				
			||||||
 | 
					// If the provided object is already a proto.Any message, then it will be
 | 
				
			||||||
 | 
					// returned verbatim. If it is of type proto.Message, it will be marshaled as a
 | 
				
			||||||
 | 
					// protocol buffer. Otherwise, the object will be marshaled to json.
 | 
				
			||||||
 | 
					func MarshalAny(v interface{}) (*types.Any, error) {
 | 
				
			||||||
 | 
						var marshal func(v interface{}) ([]byte, error)
 | 
				
			||||||
 | 
						switch t := v.(type) {
 | 
				
			||||||
 | 
						case *types.Any:
 | 
				
			||||||
 | 
							// avoid reserializing the type if we have an any.
 | 
				
			||||||
 | 
							return t, nil
 | 
				
			||||||
 | 
						case proto.Message:
 | 
				
			||||||
 | 
							marshal = func(v interface{}) ([]byte, error) {
 | 
				
			||||||
 | 
								return proto.Marshal(t)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							marshal = json.Marshal
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						url, err := TypeURL(v)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						data, err := marshal(v)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &types.Any{
 | 
				
			||||||
 | 
							TypeUrl: url,
 | 
				
			||||||
 | 
							Value:   data,
 | 
				
			||||||
 | 
						}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnmarshalAny unmarshals the any type into a concrete type.
 | 
				
			||||||
 | 
					func UnmarshalAny(any *types.Any) (interface{}, error) {
 | 
				
			||||||
 | 
						return UnmarshalByTypeURL(any.TypeUrl, any.Value)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func UnmarshalByTypeURL(typeURL string, value []byte) (interface{}, error) {
 | 
				
			||||||
 | 
						return unmarshal(typeURL, value, nil)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func UnmarshalTo(any *types.Any, out interface{}) error {
 | 
				
			||||||
 | 
						return UnmarshalToByTypeURL(any.TypeUrl, any.Value, out)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func UnmarshalToByTypeURL(typeURL string, value []byte, out interface{}) error {
 | 
				
			||||||
 | 
						_, err := unmarshal(typeURL, value, out)
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func unmarshal(typeURL string, value []byte, v interface{}) (interface{}, error) {
 | 
				
			||||||
 | 
						t, err := getTypeByUrl(typeURL)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if v == nil {
 | 
				
			||||||
 | 
							v = reflect.New(t.t).Interface()
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							// Validate interface type provided by client
 | 
				
			||||||
 | 
							vURL, err := TypeURL(v)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if typeURL != vURL {
 | 
				
			||||||
 | 
								return nil, errors.Errorf("can't unmarshal type %q to output %q", typeURL, vURL)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if t.isProto {
 | 
				
			||||||
 | 
							err = proto.Unmarshal(value, v.(proto.Message))
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							err = json.Unmarshal(value, v)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return v, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type urlType struct {
 | 
				
			||||||
 | 
						t       reflect.Type
 | 
				
			||||||
 | 
						isProto bool
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getTypeByUrl(url string) (urlType, error) {
 | 
				
			||||||
 | 
						for t, u := range registry {
 | 
				
			||||||
 | 
							if u == url {
 | 
				
			||||||
 | 
								return urlType{
 | 
				
			||||||
 | 
									t: t,
 | 
				
			||||||
 | 
								}, nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// fallback to proto registry
 | 
				
			||||||
 | 
						t := proto.MessageType(url)
 | 
				
			||||||
 | 
						if t != nil {
 | 
				
			||||||
 | 
							return urlType{
 | 
				
			||||||
 | 
								// get the underlying Elem because proto returns a pointer to the type
 | 
				
			||||||
 | 
								t:       t.Elem(),
 | 
				
			||||||
 | 
								isProto: true,
 | 
				
			||||||
 | 
							}, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return urlType{}, errors.Wrapf(ErrNotFound, "type with url %s", url)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func tryDereference(v interface{}) reflect.Type {
 | 
				
			||||||
 | 
						t := reflect.TypeOf(v)
 | 
				
			||||||
 | 
						if t.Kind() == reflect.Ptr {
 | 
				
			||||||
 | 
							// require check of pointer but dereference to register
 | 
				
			||||||
 | 
							return t.Elem()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						panic("v is not a pointer to a type")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										58
									
								
								vendor/github.com/docker/cli/AUTHORS
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										58
									
								
								vendor/github.com/docker/cli/AUTHORS
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -8,6 +8,7 @@ Aaron.L.Xu <likexu@harmonycloud.cn>
 | 
				
			|||||||
Abdur Rehman <abdur_rehman@mentor.com>
 | 
					Abdur Rehman <abdur_rehman@mentor.com>
 | 
				
			||||||
Abhinandan Prativadi <abhi@docker.com>
 | 
					Abhinandan Prativadi <abhi@docker.com>
 | 
				
			||||||
Abin Shahab <ashahab@altiscale.com>
 | 
					Abin Shahab <ashahab@altiscale.com>
 | 
				
			||||||
 | 
					Abreto FU <public@abreto.email>
 | 
				
			||||||
Ace Tang <aceapril@126.com>
 | 
					Ace Tang <aceapril@126.com>
 | 
				
			||||||
Addam Hardy <addam.hardy@gmail.com>
 | 
					Addam Hardy <addam.hardy@gmail.com>
 | 
				
			||||||
Adolfo Ochagavía <aochagavia92@gmail.com>
 | 
					Adolfo Ochagavía <aochagavia92@gmail.com>
 | 
				
			||||||
@@ -17,12 +18,15 @@ Adrien Folie <folie.adrien@gmail.com>
 | 
				
			|||||||
Ahmet Alp Balkan <ahmetb@microsoft.com>
 | 
					Ahmet Alp Balkan <ahmetb@microsoft.com>
 | 
				
			||||||
Aidan Feldman <aidan.feldman@gmail.com>
 | 
					Aidan Feldman <aidan.feldman@gmail.com>
 | 
				
			||||||
Aidan Hobson Sayers <aidanhs@cantab.net>
 | 
					Aidan Hobson Sayers <aidanhs@cantab.net>
 | 
				
			||||||
AJ Bowen <aj@gandi.net>
 | 
					AJ Bowen <aj@soulshake.net>
 | 
				
			||||||
Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
 | 
					Akhil Mohan <akhil.mohan@mayadata.io>
 | 
				
			||||||
 | 
					Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
 | 
				
			||||||
Akim Demaille <akim.demaille@docker.com>
 | 
					Akim Demaille <akim.demaille@docker.com>
 | 
				
			||||||
Alan Thompson <cloojure@gmail.com>
 | 
					Alan Thompson <cloojure@gmail.com>
 | 
				
			||||||
Albert Callarisa <shark234@gmail.com>
 | 
					Albert Callarisa <shark234@gmail.com>
 | 
				
			||||||
 | 
					Albin Kerouanton <albin@akerouanton.name>
 | 
				
			||||||
Aleksa Sarai <asarai@suse.de>
 | 
					Aleksa Sarai <asarai@suse.de>
 | 
				
			||||||
 | 
					Aleksander Piotrowski <apiotrowski312@gmail.com>
 | 
				
			||||||
Alessandro Boch <aboch@tetrationanalytics.com>
 | 
					Alessandro Boch <aboch@tetrationanalytics.com>
 | 
				
			||||||
Alex Mavrogiannis <alex.mavrogiannis@docker.com>
 | 
					Alex Mavrogiannis <alex.mavrogiannis@docker.com>
 | 
				
			||||||
Alex Mayer <amayer5125@gmail.com>
 | 
					Alex Mayer <amayer5125@gmail.com>
 | 
				
			||||||
@@ -40,6 +44,7 @@ Amir Goldstein <amir73il@aquasec.com>
 | 
				
			|||||||
Amit Krishnan <amit.krishnan@oracle.com>
 | 
					Amit Krishnan <amit.krishnan@oracle.com>
 | 
				
			||||||
Amit Shukla <amit.shukla@docker.com>
 | 
					Amit Shukla <amit.shukla@docker.com>
 | 
				
			||||||
Amy Lindburg <amy.lindburg@docker.com>
 | 
					Amy Lindburg <amy.lindburg@docker.com>
 | 
				
			||||||
 | 
					Anca Iordache <anca.iordache@docker.com>
 | 
				
			||||||
Anda Xu <anda.xu@docker.com>
 | 
					Anda Xu <anda.xu@docker.com>
 | 
				
			||||||
Andrea Luzzardi <aluzzardi@gmail.com>
 | 
					Andrea Luzzardi <aluzzardi@gmail.com>
 | 
				
			||||||
Andreas Köhler <andi5.py@gmx.net>
 | 
					Andreas Köhler <andi5.py@gmx.net>
 | 
				
			||||||
@@ -49,6 +54,7 @@ Andrew Macpherson <hopscotch23@gmail.com>
 | 
				
			|||||||
Andrew McDonnell <bugs@andrewmcdonnell.net>
 | 
					Andrew McDonnell <bugs@andrewmcdonnell.net>
 | 
				
			||||||
Andrew Po <absourd.noise@gmail.com>
 | 
					Andrew Po <absourd.noise@gmail.com>
 | 
				
			||||||
Andrey Petrov <andrey.petrov@shazow.net>
 | 
					Andrey Petrov <andrey.petrov@shazow.net>
 | 
				
			||||||
 | 
					Andrii Berehuliak <berkusandrew@gmail.com>
 | 
				
			||||||
André Martins <aanm90@gmail.com>
 | 
					André Martins <aanm90@gmail.com>
 | 
				
			||||||
Andy Goldstein <agoldste@redhat.com>
 | 
					Andy Goldstein <agoldste@redhat.com>
 | 
				
			||||||
Andy Rothfusz <github@developersupport.net>
 | 
					Andy Rothfusz <github@developersupport.net>
 | 
				
			||||||
@@ -61,7 +67,9 @@ Antonis Kalipetis <akalipetis@gmail.com>
 | 
				
			|||||||
Anusha Ragunathan <anusha.ragunathan@docker.com>
 | 
					Anusha Ragunathan <anusha.ragunathan@docker.com>
 | 
				
			||||||
Ao Li <la9249@163.com>
 | 
					Ao Li <la9249@163.com>
 | 
				
			||||||
Arash Deshmeh <adeshmeh@ca.ibm.com>
 | 
					Arash Deshmeh <adeshmeh@ca.ibm.com>
 | 
				
			||||||
 | 
					Arko Dasgupta <arko.dasgupta@docker.com>
 | 
				
			||||||
Arnaud Porterie <arnaud.porterie@docker.com>
 | 
					Arnaud Porterie <arnaud.porterie@docker.com>
 | 
				
			||||||
 | 
					Arthur Peka <arthur.peka@outlook.com>
 | 
				
			||||||
Ashwini Oruganti <ashwini.oruganti@gmail.com>
 | 
					Ashwini Oruganti <ashwini.oruganti@gmail.com>
 | 
				
			||||||
Azat Khuyiyakhmetov <shadow_uz@mail.ru>
 | 
					Azat Khuyiyakhmetov <shadow_uz@mail.ru>
 | 
				
			||||||
Bardia Keyoumarsi <bkeyouma@ucsc.edu>
 | 
					Bardia Keyoumarsi <bkeyouma@ucsc.edu>
 | 
				
			||||||
@@ -87,6 +95,7 @@ Brent Salisbury <brent.salisbury@docker.com>
 | 
				
			|||||||
Bret Fisher <bret@bretfisher.com>
 | 
					Bret Fisher <bret@bretfisher.com>
 | 
				
			||||||
Brian (bex) Exelbierd <bexelbie@redhat.com>
 | 
					Brian (bex) Exelbierd <bexelbie@redhat.com>
 | 
				
			||||||
Brian Goff <cpuguy83@gmail.com>
 | 
					Brian Goff <cpuguy83@gmail.com>
 | 
				
			||||||
 | 
					Brian Wieder <brian@4wieders.com>
 | 
				
			||||||
Bryan Bess <squarejaw@bsbess.com>
 | 
					Bryan Bess <squarejaw@bsbess.com>
 | 
				
			||||||
Bryan Boreham <bjboreham@gmail.com>
 | 
					Bryan Boreham <bjboreham@gmail.com>
 | 
				
			||||||
Bryan Murphy <bmurphy1976@gmail.com>
 | 
					Bryan Murphy <bmurphy1976@gmail.com>
 | 
				
			||||||
@@ -95,6 +104,7 @@ Cameron Spear <cameronspear@gmail.com>
 | 
				
			|||||||
Cao Weiwei <cao.weiwei30@zte.com.cn>
 | 
					Cao Weiwei <cao.weiwei30@zte.com.cn>
 | 
				
			||||||
Carlo Mion <mion00@gmail.com>
 | 
					Carlo Mion <mion00@gmail.com>
 | 
				
			||||||
Carlos Alexandro Becker <caarlos0@gmail.com>
 | 
					Carlos Alexandro Becker <caarlos0@gmail.com>
 | 
				
			||||||
 | 
					Carlos de Paula <me@carlosedp.com>
 | 
				
			||||||
Ce Gao <ce.gao@outlook.com>
 | 
					Ce Gao <ce.gao@outlook.com>
 | 
				
			||||||
Cedric Davies <cedricda@microsoft.com>
 | 
					Cedric Davies <cedricda@microsoft.com>
 | 
				
			||||||
Cezar Sa Espinola <cezarsa@gmail.com>
 | 
					Cezar Sa Espinola <cezarsa@gmail.com>
 | 
				
			||||||
@@ -128,26 +138,31 @@ Coenraad Loubser <coenraad@wish.org.za>
 | 
				
			|||||||
Colin Hebert <hebert.colin@gmail.com>
 | 
					Colin Hebert <hebert.colin@gmail.com>
 | 
				
			||||||
Collin Guarino <collin.guarino@gmail.com>
 | 
					Collin Guarino <collin.guarino@gmail.com>
 | 
				
			||||||
Colm Hally <colmhally@gmail.com>
 | 
					Colm Hally <colmhally@gmail.com>
 | 
				
			||||||
 | 
					Comical Derskeal <27731088+derskeal@users.noreply.github.com>
 | 
				
			||||||
Corey Farrell <git@cfware.com>
 | 
					Corey Farrell <git@cfware.com>
 | 
				
			||||||
Corey Quon <corey.quon@docker.com>
 | 
					Corey Quon <corey.quon@docker.com>
 | 
				
			||||||
Craig Wilhite <crwilhit@microsoft.com>
 | 
					Craig Wilhite <crwilhit@microsoft.com>
 | 
				
			||||||
Cristian Staretu <cristian.staretu@gmail.com>
 | 
					Cristian Staretu <cristian.staretu@gmail.com>
 | 
				
			||||||
Daehyeok Mun <daehyeok@gmail.com>
 | 
					Daehyeok Mun <daehyeok@gmail.com>
 | 
				
			||||||
Dafydd Crosby <dtcrsby@gmail.com>
 | 
					Dafydd Crosby <dtcrsby@gmail.com>
 | 
				
			||||||
 | 
					Daisuke Ito <itodaisuke00@gmail.com>
 | 
				
			||||||
dalanlan <dalanlan925@gmail.com>
 | 
					dalanlan <dalanlan925@gmail.com>
 | 
				
			||||||
Damien Nadé <github@livna.org>
 | 
					Damien Nadé <github@livna.org>
 | 
				
			||||||
Dan Cotora <dan@bluevision.ro>
 | 
					Dan Cotora <dan@bluevision.ro>
 | 
				
			||||||
 | 
					Daniel Artine <daniel.artine@ufrj.br>
 | 
				
			||||||
Daniel Cassidy <mail@danielcassidy.me.uk>
 | 
					Daniel Cassidy <mail@danielcassidy.me.uk>
 | 
				
			||||||
Daniel Dao <dqminh@cloudflare.com>
 | 
					Daniel Dao <dqminh@cloudflare.com>
 | 
				
			||||||
Daniel Farrell <dfarrell@redhat.com>
 | 
					Daniel Farrell <dfarrell@redhat.com>
 | 
				
			||||||
Daniel Gasienica <daniel@gasienica.ch>
 | 
					Daniel Gasienica <daniel@gasienica.ch>
 | 
				
			||||||
Daniel Goosen <daniel.goosen@surveysampling.com>
 | 
					Daniel Goosen <daniel.goosen@surveysampling.com>
 | 
				
			||||||
 | 
					Daniel Helfand <dhelfand@redhat.com>
 | 
				
			||||||
Daniel Hiltgen <daniel.hiltgen@docker.com>
 | 
					Daniel Hiltgen <daniel.hiltgen@docker.com>
 | 
				
			||||||
Daniel J Walsh <dwalsh@redhat.com>
 | 
					Daniel J Walsh <dwalsh@redhat.com>
 | 
				
			||||||
Daniel Nephin <dnephin@docker.com>
 | 
					Daniel Nephin <dnephin@docker.com>
 | 
				
			||||||
Daniel Norberg <dano@spotify.com>
 | 
					Daniel Norberg <dano@spotify.com>
 | 
				
			||||||
Daniel Watkins <daniel@daniel-watkins.co.uk>
 | 
					Daniel Watkins <daniel@daniel-watkins.co.uk>
 | 
				
			||||||
Daniel Zhang <jmzwcn@gmail.com>
 | 
					Daniel Zhang <jmzwcn@gmail.com>
 | 
				
			||||||
 | 
					Daniil Nikolenko <qoo2p5@gmail.com>
 | 
				
			||||||
Danny Berger <dpb587@gmail.com>
 | 
					Danny Berger <dpb587@gmail.com>
 | 
				
			||||||
Darren Shepherd <darren.s.shepherd@gmail.com>
 | 
					Darren Shepherd <darren.s.shepherd@gmail.com>
 | 
				
			||||||
Darren Stahl <darst@microsoft.com>
 | 
					Darren Stahl <darst@microsoft.com>
 | 
				
			||||||
@@ -180,13 +195,15 @@ Dima Stopel <dima@twistlock.com>
 | 
				
			|||||||
Dimitry Andric <d.andric@activevideo.com>
 | 
					Dimitry Andric <d.andric@activevideo.com>
 | 
				
			||||||
Ding Fei <dingfei@stars.org.cn>
 | 
					Ding Fei <dingfei@stars.org.cn>
 | 
				
			||||||
Diogo Monica <diogo@docker.com>
 | 
					Diogo Monica <diogo@docker.com>
 | 
				
			||||||
 | 
					Djordje Lukic <djordje.lukic@docker.com>
 | 
				
			||||||
Dmitry Gusev <dmitry.gusev@gmail.com>
 | 
					Dmitry Gusev <dmitry.gusev@gmail.com>
 | 
				
			||||||
Dmitry Smirnov <onlyjob@member.fsf.org>
 | 
					Dmitry Smirnov <onlyjob@member.fsf.org>
 | 
				
			||||||
Dmitry V. Krivenok <krivenok.dmitry@gmail.com>
 | 
					Dmitry V. Krivenok <krivenok.dmitry@gmail.com>
 | 
				
			||||||
 | 
					Dominik Braun <dominik.braun@nbsp.de>
 | 
				
			||||||
Don Kjer <don.kjer@gmail.com>
 | 
					Don Kjer <don.kjer@gmail.com>
 | 
				
			||||||
Dong Chen <dongluo.chen@docker.com>
 | 
					Dong Chen <dongluo.chen@docker.com>
 | 
				
			||||||
Doug Davis <dug@us.ibm.com>
 | 
					Doug Davis <dug@us.ibm.com>
 | 
				
			||||||
Drew Erny <drew.erny@docker.com>
 | 
					Drew Erny <derny@mirantis.com>
 | 
				
			||||||
Ed Costello <epc@epcostello.com>
 | 
					Ed Costello <epc@epcostello.com>
 | 
				
			||||||
Elango Sivanandam <elango.siva@docker.com>
 | 
					Elango Sivanandam <elango.siva@docker.com>
 | 
				
			||||||
Eli Uriegas <eli.uriegas@docker.com>
 | 
					Eli Uriegas <eli.uriegas@docker.com>
 | 
				
			||||||
@@ -249,6 +266,7 @@ Harald Albers <github@albersweb.de>
 | 
				
			|||||||
Harold Cooper <hrldcpr@gmail.com>
 | 
					Harold Cooper <hrldcpr@gmail.com>
 | 
				
			||||||
Harry Zhang <harryz@hyper.sh>
 | 
					Harry Zhang <harryz@hyper.sh>
 | 
				
			||||||
He Simei <hesimei@zju.edu.cn>
 | 
					He Simei <hesimei@zju.edu.cn>
 | 
				
			||||||
 | 
					Hector S <hfsam88@gmail.com>
 | 
				
			||||||
Helen Xie <chenjg@harmonycloud.cn>
 | 
					Helen Xie <chenjg@harmonycloud.cn>
 | 
				
			||||||
Henning Sprang <henning.sprang@gmail.com>
 | 
					Henning Sprang <henning.sprang@gmail.com>
 | 
				
			||||||
Henry N <henrynmail-github@yahoo.de>
 | 
					Henry N <henrynmail-github@yahoo.de>
 | 
				
			||||||
@@ -256,6 +274,7 @@ Hernan Garcia <hernandanielg@gmail.com>
 | 
				
			|||||||
Hongbin Lu <hongbin034@gmail.com>
 | 
					Hongbin Lu <hongbin034@gmail.com>
 | 
				
			||||||
Hu Keping <hukeping@huawei.com>
 | 
					Hu Keping <hukeping@huawei.com>
 | 
				
			||||||
Huayi Zhang <irachex@gmail.com>
 | 
					Huayi Zhang <irachex@gmail.com>
 | 
				
			||||||
 | 
					Hugo Gabriel Eyherabide <hugogabriel.eyherabide@gmail.com>
 | 
				
			||||||
huqun <huqun@zju.edu.cn>
 | 
					huqun <huqun@zju.edu.cn>
 | 
				
			||||||
Huu Nguyen <huu@prismskylabs.com>
 | 
					Huu Nguyen <huu@prismskylabs.com>
 | 
				
			||||||
Hyzhou Zhy <hyzhou.zhy@alibaba-inc.com>
 | 
					Hyzhou Zhy <hyzhou.zhy@alibaba-inc.com>
 | 
				
			||||||
@@ -297,7 +316,7 @@ Jeremy Unruh <jeremybunruh@gmail.com>
 | 
				
			|||||||
Jeremy Yallop <yallop@docker.com>
 | 
					Jeremy Yallop <yallop@docker.com>
 | 
				
			||||||
Jeroen Franse <jeroenfranse@gmail.com>
 | 
					Jeroen Franse <jeroenfranse@gmail.com>
 | 
				
			||||||
Jesse Adametz <jesseadametz@gmail.com>
 | 
					Jesse Adametz <jesseadametz@gmail.com>
 | 
				
			||||||
Jessica Frazelle <jessfraz@google.com>
 | 
					Jessica Frazelle <jess@oxide.computer>
 | 
				
			||||||
Jezeniel Zapanta <jpzapanta22@gmail.com>
 | 
					Jezeniel Zapanta <jpzapanta22@gmail.com>
 | 
				
			||||||
Jian Zhang <zhangjian.fnst@cn.fujitsu.com>
 | 
					Jian Zhang <zhangjian.fnst@cn.fujitsu.com>
 | 
				
			||||||
Jie Luo <luo612@zju.edu.cn>
 | 
					Jie Luo <luo612@zju.edu.cn>
 | 
				
			||||||
@@ -308,6 +327,7 @@ Jimmy Song <rootsongjc@gmail.com>
 | 
				
			|||||||
jimmyxian <jimmyxian2004@yahoo.com.cn>
 | 
					jimmyxian <jimmyxian2004@yahoo.com.cn>
 | 
				
			||||||
Jintao Zhang <zhangjintao9020@gmail.com>
 | 
					Jintao Zhang <zhangjintao9020@gmail.com>
 | 
				
			||||||
Joao Fernandes <joao.fernandes@docker.com>
 | 
					Joao Fernandes <joao.fernandes@docker.com>
 | 
				
			||||||
 | 
					Joe Abbey <joe.abbey@gmail.com>
 | 
				
			||||||
Joe Doliner <jdoliner@pachyderm.io>
 | 
					Joe Doliner <jdoliner@pachyderm.io>
 | 
				
			||||||
Joe Gordon <joe.gordon0@gmail.com>
 | 
					Joe Gordon <joe.gordon0@gmail.com>
 | 
				
			||||||
Joel Handwell <joelhandwell@gmail.com>
 | 
					Joel Handwell <joelhandwell@gmail.com>
 | 
				
			||||||
@@ -317,7 +337,7 @@ Johan Euphrosine <proppy@google.com>
 | 
				
			|||||||
Johannes 'fish' Ziemke <github@freigeist.org>
 | 
					Johannes 'fish' Ziemke <github@freigeist.org>
 | 
				
			||||||
John Feminella <jxf@jxf.me>
 | 
					John Feminella <jxf@jxf.me>
 | 
				
			||||||
John Harris <john@johnharris.io>
 | 
					John Harris <john@johnharris.io>
 | 
				
			||||||
John Howard (VM) <John.Howard@microsoft.com>
 | 
					John Howard <github@lowenna.com>
 | 
				
			||||||
John Laswell <john.n.laswell@gmail.com>
 | 
					John Laswell <john.n.laswell@gmail.com>
 | 
				
			||||||
John Maguire <jmaguire@duosecurity.com>
 | 
					John Maguire <jmaguire@duosecurity.com>
 | 
				
			||||||
John Mulhausen <john@docker.com>
 | 
					John Mulhausen <john@docker.com>
 | 
				
			||||||
@@ -326,12 +346,15 @@ John Stephens <johnstep@docker.com>
 | 
				
			|||||||
John Tims <john.k.tims@gmail.com>
 | 
					John Tims <john.k.tims@gmail.com>
 | 
				
			||||||
John V. Martinez <jvmatl@gmail.com>
 | 
					John V. Martinez <jvmatl@gmail.com>
 | 
				
			||||||
John Willis <john.willis@docker.com>
 | 
					John Willis <john.willis@docker.com>
 | 
				
			||||||
 | 
					Jon Johnson <jonjohnson@google.com>
 | 
				
			||||||
 | 
					Jonatas Baldin <jonatas.baldin@gmail.com>
 | 
				
			||||||
Jonathan Boulle <jonathanboulle@gmail.com>
 | 
					Jonathan Boulle <jonathanboulle@gmail.com>
 | 
				
			||||||
Jonathan Lee <jonjohn1232009@gmail.com>
 | 
					Jonathan Lee <jonjohn1232009@gmail.com>
 | 
				
			||||||
Jonathan Lomas <jonathan@floatinglomas.ca>
 | 
					Jonathan Lomas <jonathan@floatinglomas.ca>
 | 
				
			||||||
Jonathan McCrohan <jmccrohan@gmail.com>
 | 
					Jonathan McCrohan <jmccrohan@gmail.com>
 | 
				
			||||||
Jonh Wendell <jonh.wendell@redhat.com>
 | 
					Jonh Wendell <jonh.wendell@redhat.com>
 | 
				
			||||||
Jordan Jennings <jjn2009@gmail.com>
 | 
					Jordan Jennings <jjn2009@gmail.com>
 | 
				
			||||||
 | 
					Jose J. Escobar <53836904+jescobar-docker@users.noreply.github.com>
 | 
				
			||||||
Joseph Kern <jkern@semafour.net>
 | 
					Joseph Kern <jkern@semafour.net>
 | 
				
			||||||
Josh Bodah <jb3689@yahoo.com>
 | 
					Josh Bodah <jb3689@yahoo.com>
 | 
				
			||||||
Josh Chorlton <jchorlton@gmail.com>
 | 
					Josh Chorlton <jchorlton@gmail.com>
 | 
				
			||||||
@@ -369,6 +392,7 @@ Kevin Kern <kaiwentan@harmonycloud.cn>
 | 
				
			|||||||
Kevin Kirsche <Kev.Kirsche+GitHub@gmail.com>
 | 
					Kevin Kirsche <Kev.Kirsche+GitHub@gmail.com>
 | 
				
			||||||
Kevin Meredith <kevin.m.meredith@gmail.com>
 | 
					Kevin Meredith <kevin.m.meredith@gmail.com>
 | 
				
			||||||
Kevin Richardson <kevin@kevinrichardson.co>
 | 
					Kevin Richardson <kevin@kevinrichardson.co>
 | 
				
			||||||
 | 
					Kevin Woblick <mail@kovah.de>
 | 
				
			||||||
khaled souf <khaled.souf@gmail.com>
 | 
					khaled souf <khaled.souf@gmail.com>
 | 
				
			||||||
Kim Eik <kim@heldig.org>
 | 
					Kim Eik <kim@heldig.org>
 | 
				
			||||||
Kir Kolyshkin <kolyshkin@gmail.com>
 | 
					Kir Kolyshkin <kolyshkin@gmail.com>
 | 
				
			||||||
@@ -406,13 +430,16 @@ Luca Favatella <luca.favatella@erlang-solutions.com>
 | 
				
			|||||||
Luca Marturana <lucamarturana@gmail.com>
 | 
					Luca Marturana <lucamarturana@gmail.com>
 | 
				
			||||||
Lucas Chan <lucas-github@lucaschan.com>
 | 
					Lucas Chan <lucas-github@lucaschan.com>
 | 
				
			||||||
Luka Hartwig <mail@lukahartwig.de>
 | 
					Luka Hartwig <mail@lukahartwig.de>
 | 
				
			||||||
 | 
					Lukas Heeren <lukas-heeren@hotmail.com>
 | 
				
			||||||
Lukasz Zajaczkowski <Lukasz.Zajaczkowski@ts.fujitsu.com>
 | 
					Lukasz Zajaczkowski <Lukasz.Zajaczkowski@ts.fujitsu.com>
 | 
				
			||||||
Lydell Manganti <LydellManganti@users.noreply.github.com>
 | 
					Lydell Manganti <LydellManganti@users.noreply.github.com>
 | 
				
			||||||
Lénaïc Huard <lhuard@amadeus.com>
 | 
					Lénaïc Huard <lhuard@amadeus.com>
 | 
				
			||||||
Ma Shimiao <mashimiao.fnst@cn.fujitsu.com>
 | 
					Ma Shimiao <mashimiao.fnst@cn.fujitsu.com>
 | 
				
			||||||
Mabin <bin.ma@huawei.com>
 | 
					Mabin <bin.ma@huawei.com>
 | 
				
			||||||
 | 
					Maciej Kalisz <maciej.d.kalisz@gmail.com>
 | 
				
			||||||
Madhav Puri <madhav.puri@gmail.com>
 | 
					Madhav Puri <madhav.puri@gmail.com>
 | 
				
			||||||
Madhu Venugopal <madhu@socketplane.io>
 | 
					Madhu Venugopal <madhu@socketplane.io>
 | 
				
			||||||
 | 
					Madhur Batra <madhurbatra097@gmail.com>
 | 
				
			||||||
Malte Janduda <mail@janduda.net>
 | 
					Malte Janduda <mail@janduda.net>
 | 
				
			||||||
Manjunath A Kumatagi <mkumatag@in.ibm.com>
 | 
					Manjunath A Kumatagi <mkumatag@in.ibm.com>
 | 
				
			||||||
Mansi Nahar <mmn4185@rit.edu>
 | 
					Mansi Nahar <mmn4185@rit.edu>
 | 
				
			||||||
@@ -422,6 +449,7 @@ Marco Mariani <marco.mariani@alterway.fr>
 | 
				
			|||||||
Marco Vedovati <mvedovati@suse.com>
 | 
					Marco Vedovati <mvedovati@suse.com>
 | 
				
			||||||
Marcus Martins <marcus@docker.com>
 | 
					Marcus Martins <marcus@docker.com>
 | 
				
			||||||
Marianna Tessel <mtesselh@gmail.com>
 | 
					Marianna Tessel <mtesselh@gmail.com>
 | 
				
			||||||
 | 
					Marius Ileana <marius.ileana@gmail.com>
 | 
				
			||||||
Marius Sturm <marius@graylog.com>
 | 
					Marius Sturm <marius@graylog.com>
 | 
				
			||||||
Mark Oates <fl0yd@me.com>
 | 
					Mark Oates <fl0yd@me.com>
 | 
				
			||||||
Marsh Macy <marsma@microsoft.com>
 | 
					Marsh Macy <marsma@microsoft.com>
 | 
				
			||||||
@@ -467,12 +495,14 @@ mikelinjie <294893458@qq.com>
 | 
				
			|||||||
Mikhail Vasin <vasin@cloud-tv.ru>
 | 
					Mikhail Vasin <vasin@cloud-tv.ru>
 | 
				
			||||||
Milind Chawre <milindchawre@gmail.com>
 | 
					Milind Chawre <milindchawre@gmail.com>
 | 
				
			||||||
Mindaugas Rukas <momomg@gmail.com>
 | 
					Mindaugas Rukas <momomg@gmail.com>
 | 
				
			||||||
 | 
					Miroslav Gula <miroslav.gula@naytrolabs.com>
 | 
				
			||||||
Misty Stanley-Jones <misty@docker.com>
 | 
					Misty Stanley-Jones <misty@docker.com>
 | 
				
			||||||
Mohammad Banikazemi <mb@us.ibm.com>
 | 
					Mohammad Banikazemi <mb@us.ibm.com>
 | 
				
			||||||
Mohammed Aaqib Ansari <maaquib@gmail.com>
 | 
					Mohammed Aaqib Ansari <maaquib@gmail.com>
 | 
				
			||||||
Mohini Anne Dsouza <mohini3917@gmail.com>
 | 
					Mohini Anne Dsouza <mohini3917@gmail.com>
 | 
				
			||||||
Moorthy RS <rsmoorthy@gmail.com>
 | 
					Moorthy RS <rsmoorthy@gmail.com>
 | 
				
			||||||
Morgan Bauer <mbauer@us.ibm.com>
 | 
					Morgan Bauer <mbauer@us.ibm.com>
 | 
				
			||||||
 | 
					Morten Hekkvang <morten.hekkvang@sbab.se>
 | 
				
			||||||
Moysés Borges <moysesb@gmail.com>
 | 
					Moysés Borges <moysesb@gmail.com>
 | 
				
			||||||
Mrunal Patel <mrunalp@gmail.com>
 | 
					Mrunal Patel <mrunalp@gmail.com>
 | 
				
			||||||
muicoder <muicoder@gmail.com>
 | 
					muicoder <muicoder@gmail.com>
 | 
				
			||||||
@@ -503,9 +533,11 @@ Nishant Totla <nishanttotla@gmail.com>
 | 
				
			|||||||
NIWA Hideyuki <niwa.niwa@nifty.ne.jp>
 | 
					NIWA Hideyuki <niwa.niwa@nifty.ne.jp>
 | 
				
			||||||
Noah Treuhaft <noah.treuhaft@docker.com>
 | 
					Noah Treuhaft <noah.treuhaft@docker.com>
 | 
				
			||||||
O.S. Tezer <ostezer@gmail.com>
 | 
					O.S. Tezer <ostezer@gmail.com>
 | 
				
			||||||
 | 
					Odin Ugedal <odin@ugedal.com>
 | 
				
			||||||
ohmystack <jun.jiang02@ele.me>
 | 
					ohmystack <jun.jiang02@ele.me>
 | 
				
			||||||
Olle Jonsson <olle.jonsson@gmail.com>
 | 
					Olle Jonsson <olle.jonsson@gmail.com>
 | 
				
			||||||
Olli Janatuinen <olli.janatuinen@gmail.com>
 | 
					Olli Janatuinen <olli.janatuinen@gmail.com>
 | 
				
			||||||
 | 
					Oscar Wieman <oscrx@icloud.com>
 | 
				
			||||||
Otto Kekäläinen <otto@seravo.fi>
 | 
					Otto Kekäläinen <otto@seravo.fi>
 | 
				
			||||||
Ovidio Mallo <ovidio.mallo@gmail.com>
 | 
					Ovidio Mallo <ovidio.mallo@gmail.com>
 | 
				
			||||||
Pascal Borreli <pascal@borreli.com>
 | 
					Pascal Borreli <pascal@borreli.com>
 | 
				
			||||||
@@ -515,6 +547,7 @@ Patrick Lang <plang@microsoft.com>
 | 
				
			|||||||
Paul <paul9869@gmail.com>
 | 
					Paul <paul9869@gmail.com>
 | 
				
			||||||
Paul Kehrer <paul.l.kehrer@gmail.com>
 | 
					Paul Kehrer <paul.l.kehrer@gmail.com>
 | 
				
			||||||
Paul Lietar <paul@lietar.net>
 | 
					Paul Lietar <paul@lietar.net>
 | 
				
			||||||
 | 
					Paul Mulders <justinkb@gmail.com>
 | 
				
			||||||
Paul Weaver <pauweave@cisco.com>
 | 
					Paul Weaver <pauweave@cisco.com>
 | 
				
			||||||
Pavel Pospisil <pospispa@gmail.com>
 | 
					Pavel Pospisil <pospispa@gmail.com>
 | 
				
			||||||
Paweł Szczekutowicz <pszczekutowicz@gmail.com>
 | 
					Paweł Szczekutowicz <pszczekutowicz@gmail.com>
 | 
				
			||||||
@@ -541,6 +574,7 @@ Qiang Huang <h.huangqiang@huawei.com>
 | 
				
			|||||||
Qinglan Peng <qinglanpeng@zju.edu.cn>
 | 
					Qinglan Peng <qinglanpeng@zju.edu.cn>
 | 
				
			||||||
qudongfang <qudongfang@gmail.com>
 | 
					qudongfang <qudongfang@gmail.com>
 | 
				
			||||||
Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
 | 
					Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
 | 
				
			||||||
 | 
					Rahul Zoldyck <rahulzoldyck@gmail.com>
 | 
				
			||||||
Ravi Shekhar Jethani <rsjethani@gmail.com>
 | 
					Ravi Shekhar Jethani <rsjethani@gmail.com>
 | 
				
			||||||
Ray Tsang <rayt@google.com>
 | 
					Ray Tsang <rayt@google.com>
 | 
				
			||||||
Reficul <xuzhenglun@gmail.com>
 | 
					Reficul <xuzhenglun@gmail.com>
 | 
				
			||||||
@@ -553,6 +587,7 @@ Richard Scothern <richard.scothern@gmail.com>
 | 
				
			|||||||
Rick Wieman <git@rickw.nl>
 | 
					Rick Wieman <git@rickw.nl>
 | 
				
			||||||
Ritesh H Shukla <sritesh@vmware.com>
 | 
					Ritesh H Shukla <sritesh@vmware.com>
 | 
				
			||||||
Riyaz Faizullabhoy <riyaz.faizullabhoy@docker.com>
 | 
					Riyaz Faizullabhoy <riyaz.faizullabhoy@docker.com>
 | 
				
			||||||
 | 
					Rob Gulewich <rgulewich@netflix.com>
 | 
				
			||||||
Robert Wallis <smilingrob@gmail.com>
 | 
					Robert Wallis <smilingrob@gmail.com>
 | 
				
			||||||
Robin Naundorf <r.naundorf@fh-muenster.de>
 | 
					Robin Naundorf <r.naundorf@fh-muenster.de>
 | 
				
			||||||
Robin Speekenbrink <robin@kingsquare.nl>
 | 
					Robin Speekenbrink <robin@kingsquare.nl>
 | 
				
			||||||
@@ -574,10 +609,14 @@ Sainath Grandhi <sainath.grandhi@intel.com>
 | 
				
			|||||||
Sakeven Jiang <jc5930@sina.cn>
 | 
					Sakeven Jiang <jc5930@sina.cn>
 | 
				
			||||||
Sally O'Malley <somalley@redhat.com>
 | 
					Sally O'Malley <somalley@redhat.com>
 | 
				
			||||||
Sam Neirinck <sam@samneirinck.com>
 | 
					Sam Neirinck <sam@samneirinck.com>
 | 
				
			||||||
 | 
					Samarth Shah <samashah@microsoft.com>
 | 
				
			||||||
Sambuddha Basu <sambuddhabasu1@gmail.com>
 | 
					Sambuddha Basu <sambuddhabasu1@gmail.com>
 | 
				
			||||||
Sami Tabet <salph.tabet@gmail.com>
 | 
					Sami Tabet <salph.tabet@gmail.com>
 | 
				
			||||||
 | 
					Samuel Cochran <sj26@sj26.com>
 | 
				
			||||||
Samuel Karp <skarp@amazon.com>
 | 
					Samuel Karp <skarp@amazon.com>
 | 
				
			||||||
Santhosh Manohar <santhosh@docker.com>
 | 
					Santhosh Manohar <santhosh@docker.com>
 | 
				
			||||||
 | 
					Sargun Dhillon <sargun@netflix.com>
 | 
				
			||||||
 | 
					Saswat Bhattacharya <sas.saswat@gmail.com>
 | 
				
			||||||
Scott Brenner <scott@scottbrenner.me>
 | 
					Scott Brenner <scott@scottbrenner.me>
 | 
				
			||||||
Scott Collier <emailscottcollier@gmail.com>
 | 
					Scott Collier <emailscottcollier@gmail.com>
 | 
				
			||||||
Sean Christopherson <sean.j.christopherson@intel.com>
 | 
					Sean Christopherson <sean.j.christopherson@intel.com>
 | 
				
			||||||
@@ -598,6 +637,7 @@ sidharthamani <sid@rancher.com>
 | 
				
			|||||||
Silvin Lubecki <silvin.lubecki@docker.com>
 | 
					Silvin Lubecki <silvin.lubecki@docker.com>
 | 
				
			||||||
Simei He <hesimei@zju.edu.cn>
 | 
					Simei He <hesimei@zju.edu.cn>
 | 
				
			||||||
Simon Ferquel <simon.ferquel@docker.com>
 | 
					Simon Ferquel <simon.ferquel@docker.com>
 | 
				
			||||||
 | 
					Simon Heimberg <simon.heimberg@heimberg-ea.ch>
 | 
				
			||||||
Sindhu S <sindhus@live.in>
 | 
					Sindhu S <sindhus@live.in>
 | 
				
			||||||
Slava Semushin <semushin@redhat.com>
 | 
					Slava Semushin <semushin@redhat.com>
 | 
				
			||||||
Solomon Hykes <solomon@docker.com>
 | 
					Solomon Hykes <solomon@docker.com>
 | 
				
			||||||
@@ -627,7 +667,10 @@ TAGOMORI Satoshi <tagomoris@gmail.com>
 | 
				
			|||||||
taiji-tech <csuhqg@foxmail.com>
 | 
					taiji-tech <csuhqg@foxmail.com>
 | 
				
			||||||
Taylor Jones <monitorjbl@gmail.com>
 | 
					Taylor Jones <monitorjbl@gmail.com>
 | 
				
			||||||
Tejaswini Duggaraju <naduggar@microsoft.com>
 | 
					Tejaswini Duggaraju <naduggar@microsoft.com>
 | 
				
			||||||
 | 
					Tengfei Wang <tfwang@alauda.io>
 | 
				
			||||||
 | 
					Teppei Fukuda <knqyf263@gmail.com>
 | 
				
			||||||
Thatcher Peskens <thatcher@docker.com>
 | 
					Thatcher Peskens <thatcher@docker.com>
 | 
				
			||||||
 | 
					Thibault Coupin <thibault.coupin@gmail.com>
 | 
				
			||||||
Thomas Gazagnaire <thomas@gazagnaire.org>
 | 
					Thomas Gazagnaire <thomas@gazagnaire.org>
 | 
				
			||||||
Thomas Krzero <thomas.kovatchitch@gmail.com>
 | 
					Thomas Krzero <thomas.kovatchitch@gmail.com>
 | 
				
			||||||
Thomas Leonard <thomas.leonard@docker.com>
 | 
					Thomas Leonard <thomas.leonard@docker.com>
 | 
				
			||||||
@@ -639,6 +682,7 @@ Tianyi Wang <capkurmagati@gmail.com>
 | 
				
			|||||||
Tibor Vass <teabee89@gmail.com>
 | 
					Tibor Vass <teabee89@gmail.com>
 | 
				
			||||||
Tim Dettrick <t.dettrick@uq.edu.au>
 | 
					Tim Dettrick <t.dettrick@uq.edu.au>
 | 
				
			||||||
Tim Hockin <thockin@google.com>
 | 
					Tim Hockin <thockin@google.com>
 | 
				
			||||||
 | 
					Tim Sampson <tim@sampson.fi>
 | 
				
			||||||
Tim Smith <timbot@google.com>
 | 
					Tim Smith <timbot@google.com>
 | 
				
			||||||
Tim Waugh <twaugh@redhat.com>
 | 
					Tim Waugh <twaugh@redhat.com>
 | 
				
			||||||
Tim Wraight <tim.wraight@tangentlabs.co.uk>
 | 
					Tim Wraight <tim.wraight@tangentlabs.co.uk>
 | 
				
			||||||
@@ -663,9 +707,11 @@ Tristan Carel <tristan@cogniteev.com>
 | 
				
			|||||||
Tycho Andersen <tycho@docker.com>
 | 
					Tycho Andersen <tycho@docker.com>
 | 
				
			||||||
Tycho Andersen <tycho@tycho.ws>
 | 
					Tycho Andersen <tycho@tycho.ws>
 | 
				
			||||||
uhayate <uhayate.gong@daocloud.io>
 | 
					uhayate <uhayate.gong@daocloud.io>
 | 
				
			||||||
 | 
					Ulrich Bareth <ulrich.bareth@gmail.com>
 | 
				
			||||||
Ulysses Souza <ulysses.souza@docker.com>
 | 
					Ulysses Souza <ulysses.souza@docker.com>
 | 
				
			||||||
Umesh Yadav <umesh4257@gmail.com>
 | 
					Umesh Yadav <umesh4257@gmail.com>
 | 
				
			||||||
Valentin Lorentz <progval+git@progval.net>
 | 
					Valentin Lorentz <progval+git@progval.net>
 | 
				
			||||||
 | 
					Venkateswara Reddy Bukkasamudram <bukkasamudram@outlook.com>
 | 
				
			||||||
Veres Lajos <vlajos@gmail.com>
 | 
					Veres Lajos <vlajos@gmail.com>
 | 
				
			||||||
Victor Vieux <victor.vieux@docker.com>
 | 
					Victor Vieux <victor.vieux@docker.com>
 | 
				
			||||||
Victoria Bialas <victoria.bialas@docker.com>
 | 
					Victoria Bialas <victoria.bialas@docker.com>
 | 
				
			||||||
@@ -683,6 +729,7 @@ Wang Long <long.wanglong@huawei.com>
 | 
				
			|||||||
Wang Ping <present.wp@icloud.com>
 | 
					Wang Ping <present.wp@icloud.com>
 | 
				
			||||||
Wang Xing <hzwangxing@corp.netease.com>
 | 
					Wang Xing <hzwangxing@corp.netease.com>
 | 
				
			||||||
Wang Yuexiao <wang.yuexiao@zte.com.cn>
 | 
					Wang Yuexiao <wang.yuexiao@zte.com.cn>
 | 
				
			||||||
 | 
					Wang Yumu <37442693@qq.com>
 | 
				
			||||||
Wataru Ishida <ishida.wataru@lab.ntt.co.jp>
 | 
					Wataru Ishida <ishida.wataru@lab.ntt.co.jp>
 | 
				
			||||||
Wayne Song <wsong@docker.com>
 | 
					Wayne Song <wsong@docker.com>
 | 
				
			||||||
Wen Cheng Ma <wenchma@cn.ibm.com>
 | 
					Wen Cheng Ma <wenchma@cn.ibm.com>
 | 
				
			||||||
@@ -691,6 +738,7 @@ Wes Morgan <cap10morgan@gmail.com>
 | 
				
			|||||||
Wewang Xiaorenfine <wang.xiaoren@zte.com.cn>
 | 
					Wewang Xiaorenfine <wang.xiaoren@zte.com.cn>
 | 
				
			||||||
William Henry <whenry@redhat.com>
 | 
					William Henry <whenry@redhat.com>
 | 
				
			||||||
Xianglin Gao <xlgao@zju.edu.cn>
 | 
					Xianglin Gao <xlgao@zju.edu.cn>
 | 
				
			||||||
 | 
					Xiaodong Liu <liuxiaodong@loongson.cn>
 | 
				
			||||||
Xiaodong Zhang <a4012017@sina.com>
 | 
					Xiaodong Zhang <a4012017@sina.com>
 | 
				
			||||||
Xiaoxi He <xxhe@alauda.io>
 | 
					Xiaoxi He <xxhe@alauda.io>
 | 
				
			||||||
Xinbo Weng <xihuanbo_0521@zju.edu.cn>
 | 
					Xinbo Weng <xihuanbo_0521@zju.edu.cn>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								vendor/github.com/docker/cli/cli-plugins/manager/error.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/docker/cli/cli-plugins/manager/error.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -25,6 +25,11 @@ func (e *pluginError) Cause() error {
 | 
				
			|||||||
	return e.cause
 | 
						return e.cause
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Unwrap provides compatibility for Go 1.13 error chains.
 | 
				
			||||||
 | 
					func (e *pluginError) Unwrap() error {
 | 
				
			||||||
 | 
						return e.cause
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// MarshalText marshalls the pluginError into a textual form.
 | 
					// MarshalText marshalls the pluginError into a textual form.
 | 
				
			||||||
func (e *pluginError) MarshalText() (text []byte, err error) {
 | 
					func (e *pluginError) MarshalText() (text []byte, err error) {
 | 
				
			||||||
	return []byte(e.cause.Error()), nil
 | 
						return []byte(e.cause.Error()), nil
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/docker/cli/cli-plugins/manager/manager.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/docker/cli/cli-plugins/manager/manager.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -11,8 +11,8 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/docker/cli/cli/command"
 | 
						"github.com/docker/cli/cli/command"
 | 
				
			||||||
	"github.com/docker/cli/cli/config"
 | 
						"github.com/docker/cli/cli/config"
 | 
				
			||||||
 | 
						"github.com/fvbommel/sortorder"
 | 
				
			||||||
	"github.com/spf13/cobra"
 | 
						"github.com/spf13/cobra"
 | 
				
			||||||
	"vbom.ml/util/sortorder"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ReexecEnvvar is the name of an ennvar which is set to the command
 | 
					// ReexecEnvvar is the name of an ennvar which is set to the command
 | 
				
			||||||
 
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user