Merge pull request #1755 from jedevc/move-across-controller-boundary

Move metadata and subrequest output outside of controller
pull/1628/head
Justin Chadwell 2 years ago committed by GitHub
commit 9d5af461b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -8,6 +8,7 @@ import (
"encoding/json"
"fmt"
"io"
"log"
"os"
"path/filepath"
"runtime"
@ -33,10 +34,14 @@ import (
"github.com/docker/cli/cli"
"github.com/docker/cli/cli/command"
dockeropts "github.com/docker/cli/opts"
"github.com/docker/docker/api/types/versions"
"github.com/docker/docker/builder/remotecontext/urlutil"
"github.com/docker/docker/pkg/ioutils"
"github.com/moby/buildkit/client"
"github.com/moby/buildkit/exporter/containerimage/exptypes"
"github.com/moby/buildkit/frontend/subrequests"
"github.com/moby/buildkit/frontend/subrequests/outline"
"github.com/moby/buildkit/frontend/subrequests/targets"
"github.com/moby/buildkit/solver/errdefs"
"github.com/moby/buildkit/util/appcontext"
"github.com/moby/buildkit/util/grpcerrors"
@ -105,13 +110,11 @@ func (o *buildOptions) toControllerOptions() (*controllerapi.BuildOptions, error
NetworkMode: o.networkMode,
NoCacheFilter: o.noCacheFilter,
Platforms: o.platforms,
PrintFunc: o.printFunc,
ShmSize: int64(o.shmSize),
Tags: o.tags,
Target: o.target,
Ulimits: dockerUlimitToControllerUlimit(o.ulimits),
Builder: o.builder,
MetadataFile: o.metadataFile,
NoCache: o.noCache,
Pull: o.pull,
ExportPush: o.exportPush,
@ -170,6 +173,11 @@ func (o *buildOptions) toControllerOptions() (*controllerapi.BuildOptions, error
return nil, err
}
opts.PrintFunc, err = buildflags.ParsePrintFunc(o.printFunc)
if err != nil {
return nil, err
}
return &opts, nil
}
@ -199,6 +207,11 @@ func runBuild(dockerCli command.Cli, options buildOptions) (err error) {
end(err)
}()
opts, err := options.toControllerOptions()
if err != nil {
return err
}
// Avoid leaving a stale file if we eventually fail
if options.imageIDFile != "" {
if err := os.Remove(options.imageIDFile); err != nil && !os.IsNotExist(err) {
@ -241,9 +254,9 @@ func runBuild(dockerCli command.Cli, options buildOptions) (err error) {
var resp *client.SolveResponse
var retErr error
if isExperimental() {
resp, retErr = runControllerBuild(ctx, dockerCli, options, printer)
resp, retErr = runControllerBuild(ctx, dockerCli, opts, options, printer)
} else {
resp, retErr = runBasicBuild(ctx, dockerCli, options, printer)
resp, retErr = runBasicBuild(ctx, dockerCli, opts, options, printer)
}
if err := printer.Wait(); retErr == nil {
@ -263,21 +276,25 @@ func runBuild(dockerCli command.Cli, options buildOptions) (err error) {
}
return os.WriteFile(options.imageIDFile, []byte(dgst), 0644)
}
if options.metadataFile != "" {
if err := writeMetadataFile(options.metadataFile, decodeExporterResponse(resp.ExporterResponse)); err != nil {
return err
}
}
if opts.PrintFunc != nil {
if err := printResult(opts.PrintFunc, resp.ExporterResponse); err != nil {
return err
}
}
return nil
}
func runBasicBuild(ctx context.Context, dockerCli command.Cli, options buildOptions, printer *progress.Printer) (*client.SolveResponse, error) {
opts, err := options.toControllerOptions()
if err != nil {
return nil, err
}
func runBasicBuild(ctx context.Context, dockerCli command.Cli, opts *controllerapi.BuildOptions, options buildOptions, printer *progress.Printer) (*client.SolveResponse, error) {
resp, _, err := cbuild.RunBuild(ctx, dockerCli, *opts, os.Stdin, printer, false)
return resp, err
}
func runControllerBuild(ctx context.Context, dockerCli command.Cli, options buildOptions, printer *progress.Printer) (*client.SolveResponse, error) {
func runControllerBuild(ctx context.Context, dockerCli command.Cli, opts *controllerapi.BuildOptions, options buildOptions, printer *progress.Printer) (*client.SolveResponse, error) {
if options.invoke != nil && (options.dockerfileName == "-" || options.contextPath == "-") {
// stdin must be usable for monitor
return nil, errors.Errorf("Dockerfile or context from stdin is not supported with invoke")
@ -293,12 +310,6 @@ func runControllerBuild(ctx context.Context, dockerCli command.Cli, options buil
}
}()
// Start build
opts, err := options.toControllerOptions()
if err != nil {
return nil, err
}
// NOTE: buildx server has the current working directory different from the client
// so we need to resolve paths to abosolute ones in the client.
opts, err = resolvePaths(opts)
@ -895,13 +906,6 @@ func resolvePaths(options *controllerapi.BuildOptions) (_ *controllerapi.BuildOp
}
options.SSH = ssh
if options.MetadataFile != "" {
options.MetadataFile, err = filepath.Abs(options.MetadataFile)
if err != nil {
return nil, err
}
}
return options, nil
}
@ -944,3 +948,37 @@ func printWarnings(w io.Writer, warnings []client.VertexWarning, mode string) {
}
}
func printResult(f *controllerapi.PrintFunc, res map[string]string) error {
switch f.Name {
case "outline":
return printValue(outline.PrintOutline, outline.SubrequestsOutlineDefinition.Version, f.Format, res)
case "targets":
return printValue(targets.PrintTargets, targets.SubrequestsTargetsDefinition.Version, f.Format, res)
case "subrequests.describe":
return printValue(subrequests.PrintDescribe, subrequests.SubrequestsDescribeDefinition.Version, f.Format, res)
default:
if dt, ok := res["result.txt"]; ok {
fmt.Print(dt)
} else {
log.Printf("%s %+v", f, res)
}
}
return nil
}
type printFunc func([]byte, io.Writer) error
func printValue(printer printFunc, version string, format string, res map[string]string) error {
if format == "json" {
fmt.Fprintln(os.Stdout, res["result.json"])
return nil
}
if res["version"] != "" && versions.LessThan(version, res["version"]) && res["result.txt"] != "" {
// structure is too new and we don't know how to print it
fmt.Fprint(os.Stdout, res["result.txt"])
return nil
}
return printer([]byte(res["result.json"]), os.Stdout)
}

@ -235,15 +235,6 @@ func TestResolvePaths(t *testing.T) {
},
},
},
{
name: "metadatafile",
options: controllerapi.BuildOptions{
MetadataFile: "test1",
},
want: controllerapi.BuildOptions{
MetadataFile: filepath.Join(tmpwd, "test1"),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {

@ -2,9 +2,6 @@ package build
import (
"context"
"encoding/base64"
"encoding/csv"
"encoding/json"
"io"
"os"
"path/filepath"
@ -24,7 +21,6 @@ import (
"github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/config"
dockeropts "github.com/docker/cli/opts"
"github.com/docker/docker/pkg/ioutils"
"github.com/docker/go-units"
"github.com/moby/buildkit/client"
"github.com/moby/buildkit/session/auth/authprovider"
@ -50,11 +46,6 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
contexts[name] = build.NamedContext{Path: path}
}
printFunc, err := parsePrintFunc(in.PrintFunc)
if err != nil {
return nil, nil, err
}
opts := build.Options{
Inputs: build.Inputs{
ContextPath: in.ContextPath,
@ -73,7 +64,6 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
Tags: in.Tags,
Target: in.Target,
Ulimits: controllerUlimitOpt2DockerUlimit(in.Ulimits),
PrintFunc: printFunc,
}
platforms, err := platformutil.Parse(in.Platforms)
@ -152,6 +142,13 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
}
opts.Allow = allow
if in.PrintFunc != nil {
opts.PrintFunc = &build.PrintFunc{
Name: in.PrintFunc.Name,
Format: in.PrintFunc.Format,
}
}
// key string used for kubernetes "sticky" mode
contextPathHash, err := filepath.Abs(in.ContextPath)
if err != nil {
@ -174,7 +171,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
return nil, nil, err
}
resp, res, err := buildTargets(ctx, dockerCli, b.NodeGroup, nodes, map[string]build.Options{defaultTargetName: opts}, progress, in.MetadataFile, generateResult)
resp, res, err := buildTargets(ctx, dockerCli, b.NodeGroup, nodes, map[string]build.Options{defaultTargetName: opts}, progress, generateResult)
err = wrapBuildError(err, false)
if err != nil {
// NOTE: buildTargets can return *build.ResultContext even on error.
@ -188,7 +185,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
// NOTE: When an error happens during the build and this function acquires the debuggable *build.ResultContext,
// this function returns it in addition to the error (i.e. it does "return nil, res, err"). The caller can
// inspect the result and debug the cause of that error.
func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGroup, nodes []builder.Node, opts map[string]build.Options, progress progress.Writer, metadataFile string, generateResult bool) (*client.SolveResponse, *build.ResultContext, error) {
func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGroup, nodes []builder.Node, opts map[string]build.Options, progress progress.Writer, generateResult bool) (*client.SolveResponse, *build.ResultContext, error) {
var res *build.ResultContext
var resp map[string]*client.SolveResponse
var err error
@ -208,78 +205,9 @@ func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGrou
if err != nil {
return nil, res, err
}
if len(metadataFile) > 0 && resp != nil {
if err := writeMetadataFile(metadataFile, decodeExporterResponse(resp[defaultTargetName].ExporterResponse)); err != nil {
return nil, nil, err
}
}
for k := range resp {
if opts[k].PrintFunc != nil {
if err := printResult(opts[k].PrintFunc, resp[k].ExporterResponse); err != nil {
return nil, nil, err
}
}
}
return resp[defaultTargetName], res, err
}
func parsePrintFunc(str string) (*build.PrintFunc, error) {
if str == "" {
return nil, nil
}
csvReader := csv.NewReader(strings.NewReader(str))
fields, err := csvReader.Read()
if err != nil {
return nil, err
}
f := &build.PrintFunc{}
for _, field := range fields {
parts := strings.SplitN(field, "=", 2)
if len(parts) == 2 {
if parts[0] == "format" {
f.Format = parts[1]
} else {
return nil, errors.Errorf("invalid print field: %s", field)
}
} else {
if f.Name != "" {
return nil, errors.Errorf("invalid print value: %s", str)
}
f.Name = field
}
}
return f, nil
}
func writeMetadataFile(filename string, dt interface{}) error {
b, err := json.MarshalIndent(dt, "", " ")
if err != nil {
return err
}
return ioutils.AtomicWriteFile(filename, b, 0644)
}
func decodeExporterResponse(exporterResponse map[string]string) map[string]interface{} {
out := make(map[string]interface{})
for k, v := range exporterResponse {
dt, err := base64.StdEncoding.DecodeString(v)
if err != nil {
out[k] = v
continue
}
var raw map[string]interface{}
if err = json.Unmarshal(dt, &raw); err != nil || len(raw) == 0 {
out[k] = v
continue
}
out[k] = json.RawMessage(dt)
}
return out
}
func wrapBuildError(err error, bake bool) error {
if err == nil {
return nil

@ -1,48 +0,0 @@
package build
import (
"fmt"
"io"
"log"
"os"
"github.com/docker/buildx/build"
"github.com/docker/docker/api/types/versions"
"github.com/moby/buildkit/frontend/subrequests"
"github.com/moby/buildkit/frontend/subrequests/outline"
"github.com/moby/buildkit/frontend/subrequests/targets"
)
func printResult(f *build.PrintFunc, res map[string]string) error {
switch f.Name {
case "outline":
return printValue(outline.PrintOutline, outline.SubrequestsOutlineDefinition.Version, f.Format, res)
case "targets":
return printValue(targets.PrintTargets, targets.SubrequestsTargetsDefinition.Version, f.Format, res)
case "subrequests.describe":
return printValue(subrequests.PrintDescribe, subrequests.SubrequestsDescribeDefinition.Version, f.Format, res)
default:
if dt, ok := res["result.txt"]; ok {
fmt.Print(dt)
} else {
log.Printf("%s %+v", f, res)
}
}
return nil
}
type printFunc func([]byte, io.Writer) error
func printValue(printer printFunc, version string, format string, res map[string]string) error {
if format == "json" {
fmt.Fprintln(os.Stdout, res["result.json"])
return nil
}
if res["version"] != "" && versions.LessThan(version, res["version"]) && res["result.txt"] != "" {
// structure is too new and we don't know how to print it
fmt.Fprint(os.Stdout, res["result.txt"])
return nil
}
return printer([]byte(res["result.json"]), os.Stdout)
}

@ -272,7 +272,7 @@ func (m *BuildRequest) GetOptions() *BuildOptions {
type BuildOptions struct {
ContextPath string `protobuf:"bytes,1,opt,name=ContextPath,proto3" json:"ContextPath,omitempty"`
DockerfileName string `protobuf:"bytes,2,opt,name=DockerfileName,proto3" json:"DockerfileName,omitempty"`
PrintFunc string `protobuf:"bytes,3,opt,name=PrintFunc,proto3" json:"PrintFunc,omitempty"`
PrintFunc *PrintFunc `protobuf:"bytes,3,opt,name=PrintFunc,proto3" json:"PrintFunc,omitempty"`
NamedContexts map[string]string `protobuf:"bytes,4,rep,name=NamedContexts,proto3" json:"NamedContexts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
Allow []string `protobuf:"bytes,5,rep,name=Allow,proto3" json:"Allow,omitempty"`
Attests []*Attest `protobuf:"bytes,6,rep,name=Attests,proto3" json:"Attests,omitempty"`
@ -293,11 +293,10 @@ type BuildOptions struct {
Target string `protobuf:"bytes,21,opt,name=Target,proto3" json:"Target,omitempty"`
Ulimits *UlimitOpt `protobuf:"bytes,22,opt,name=Ulimits,proto3" json:"Ulimits,omitempty"`
Builder string `protobuf:"bytes,23,opt,name=Builder,proto3" json:"Builder,omitempty"`
MetadataFile string `protobuf:"bytes,24,opt,name=MetadataFile,proto3" json:"MetadataFile,omitempty"`
NoCache bool `protobuf:"varint,25,opt,name=NoCache,proto3" json:"NoCache,omitempty"`
Pull bool `protobuf:"varint,26,opt,name=Pull,proto3" json:"Pull,omitempty"`
ExportPush bool `protobuf:"varint,27,opt,name=ExportPush,proto3" json:"ExportPush,omitempty"`
ExportLoad bool `protobuf:"varint,28,opt,name=ExportLoad,proto3" json:"ExportLoad,omitempty"`
NoCache bool `protobuf:"varint,24,opt,name=NoCache,proto3" json:"NoCache,omitempty"`
Pull bool `protobuf:"varint,25,opt,name=Pull,proto3" json:"Pull,omitempty"`
ExportPush bool `protobuf:"varint,26,opt,name=ExportPush,proto3" json:"ExportPush,omitempty"`
ExportLoad bool `protobuf:"varint,27,opt,name=ExportLoad,proto3" json:"ExportLoad,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -341,11 +340,11 @@ func (m *BuildOptions) GetDockerfileName() string {
return ""
}
func (m *BuildOptions) GetPrintFunc() string {
func (m *BuildOptions) GetPrintFunc() *PrintFunc {
if m != nil {
return m.PrintFunc
}
return ""
return nil
}
func (m *BuildOptions) GetNamedContexts() map[string]string {
@ -488,13 +487,6 @@ func (m *BuildOptions) GetBuilder() string {
return ""
}
func (m *BuildOptions) GetMetadataFile() string {
if m != nil {
return m.MetadataFile
}
return ""
}
func (m *BuildOptions) GetNoCache() bool {
if m != nil {
return m.NoCache
@ -777,6 +769,52 @@ func (m *Secret) GetEnv() string {
return ""
}
type PrintFunc struct {
Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"`
Format string `protobuf:"bytes,2,opt,name=Format,proto3" json:"Format,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *PrintFunc) Reset() { *m = PrintFunc{} }
func (m *PrintFunc) String() string { return proto.CompactTextString(m) }
func (*PrintFunc) ProtoMessage() {}
func (*PrintFunc) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{12}
}
func (m *PrintFunc) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PrintFunc.Unmarshal(m, b)
}
func (m *PrintFunc) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_PrintFunc.Marshal(b, m, deterministic)
}
func (m *PrintFunc) XXX_Merge(src proto.Message) {
xxx_messageInfo_PrintFunc.Merge(m, src)
}
func (m *PrintFunc) XXX_Size() int {
return xxx_messageInfo_PrintFunc.Size(m)
}
func (m *PrintFunc) XXX_DiscardUnknown() {
xxx_messageInfo_PrintFunc.DiscardUnknown(m)
}
var xxx_messageInfo_PrintFunc proto.InternalMessageInfo
func (m *PrintFunc) GetName() string {
if m != nil {
return m.Name
}
return ""
}
func (m *PrintFunc) GetFormat() string {
if m != nil {
return m.Format
}
return ""
}
type InspectRequest struct {
Ref string `protobuf:"bytes,1,opt,name=Ref,proto3" json:"Ref,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
@ -788,7 +826,7 @@ func (m *InspectRequest) Reset() { *m = InspectRequest{} }
func (m *InspectRequest) String() string { return proto.CompactTextString(m) }
func (*InspectRequest) ProtoMessage() {}
func (*InspectRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{12}
return fileDescriptor_ed7f10298fa1d90f, []int{13}
}
func (m *InspectRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InspectRequest.Unmarshal(m, b)
@ -826,7 +864,7 @@ func (m *InspectResponse) Reset() { *m = InspectResponse{} }
func (m *InspectResponse) String() string { return proto.CompactTextString(m) }
func (*InspectResponse) ProtoMessage() {}
func (*InspectResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{13}
return fileDescriptor_ed7f10298fa1d90f, []int{14}
}
func (m *InspectResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InspectResponse.Unmarshal(m, b)
@ -864,7 +902,7 @@ func (m *UlimitOpt) Reset() { *m = UlimitOpt{} }
func (m *UlimitOpt) String() string { return proto.CompactTextString(m) }
func (*UlimitOpt) ProtoMessage() {}
func (*UlimitOpt) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{14}
return fileDescriptor_ed7f10298fa1d90f, []int{15}
}
func (m *UlimitOpt) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UlimitOpt.Unmarshal(m, b)
@ -904,7 +942,7 @@ func (m *Ulimit) Reset() { *m = Ulimit{} }
func (m *Ulimit) String() string { return proto.CompactTextString(m) }
func (*Ulimit) ProtoMessage() {}
func (*Ulimit) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{15}
return fileDescriptor_ed7f10298fa1d90f, []int{16}
}
func (m *Ulimit) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Ulimit.Unmarshal(m, b)
@ -956,7 +994,7 @@ func (m *BuildResponse) Reset() { *m = BuildResponse{} }
func (m *BuildResponse) String() string { return proto.CompactTextString(m) }
func (*BuildResponse) ProtoMessage() {}
func (*BuildResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{16}
return fileDescriptor_ed7f10298fa1d90f, []int{17}
}
func (m *BuildResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BuildResponse.Unmarshal(m, b)
@ -994,7 +1032,7 @@ func (m *DisconnectRequest) Reset() { *m = DisconnectRequest{} }
func (m *DisconnectRequest) String() string { return proto.CompactTextString(m) }
func (*DisconnectRequest) ProtoMessage() {}
func (*DisconnectRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{17}
return fileDescriptor_ed7f10298fa1d90f, []int{18}
}
func (m *DisconnectRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DisconnectRequest.Unmarshal(m, b)
@ -1031,7 +1069,7 @@ func (m *DisconnectResponse) Reset() { *m = DisconnectResponse{} }
func (m *DisconnectResponse) String() string { return proto.CompactTextString(m) }
func (*DisconnectResponse) ProtoMessage() {}
func (*DisconnectResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{18}
return fileDescriptor_ed7f10298fa1d90f, []int{19}
}
func (m *DisconnectResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DisconnectResponse.Unmarshal(m, b)
@ -1062,7 +1100,7 @@ func (m *ListRequest) Reset() { *m = ListRequest{} }
func (m *ListRequest) String() string { return proto.CompactTextString(m) }
func (*ListRequest) ProtoMessage() {}
func (*ListRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{19}
return fileDescriptor_ed7f10298fa1d90f, []int{20}
}
func (m *ListRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListRequest.Unmarshal(m, b)
@ -1100,7 +1138,7 @@ func (m *ListResponse) Reset() { *m = ListResponse{} }
func (m *ListResponse) String() string { return proto.CompactTextString(m) }
func (*ListResponse) ProtoMessage() {}
func (*ListResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{20}
return fileDescriptor_ed7f10298fa1d90f, []int{21}
}
func (m *ListResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListResponse.Unmarshal(m, b)
@ -1141,7 +1179,7 @@ func (m *InputMessage) Reset() { *m = InputMessage{} }
func (m *InputMessage) String() string { return proto.CompactTextString(m) }
func (*InputMessage) ProtoMessage() {}
func (*InputMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{21}
return fileDescriptor_ed7f10298fa1d90f, []int{22}
}
func (m *InputMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InputMessage.Unmarshal(m, b)
@ -1215,7 +1253,7 @@ func (m *InputInitMessage) Reset() { *m = InputInitMessage{} }
func (m *InputInitMessage) String() string { return proto.CompactTextString(m) }
func (*InputInitMessage) ProtoMessage() {}
func (*InputInitMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{22}
return fileDescriptor_ed7f10298fa1d90f, []int{23}
}
func (m *InputInitMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InputInitMessage.Unmarshal(m, b)
@ -1254,7 +1292,7 @@ func (m *DataMessage) Reset() { *m = DataMessage{} }
func (m *DataMessage) String() string { return proto.CompactTextString(m) }
func (*DataMessage) ProtoMessage() {}
func (*DataMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{23}
return fileDescriptor_ed7f10298fa1d90f, []int{24}
}
func (m *DataMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DataMessage.Unmarshal(m, b)
@ -1298,7 +1336,7 @@ func (m *InputResponse) Reset() { *m = InputResponse{} }
func (m *InputResponse) String() string { return proto.CompactTextString(m) }
func (*InputResponse) ProtoMessage() {}
func (*InputResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{24}
return fileDescriptor_ed7f10298fa1d90f, []int{25}
}
func (m *InputResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InputResponse.Unmarshal(m, b)
@ -1334,7 +1372,7 @@ func (m *Message) Reset() { *m = Message{} }
func (m *Message) String() string { return proto.CompactTextString(m) }
func (*Message) ProtoMessage() {}
func (*Message) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{25}
return fileDescriptor_ed7f10298fa1d90f, []int{26}
}
func (m *Message) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Message.Unmarshal(m, b)
@ -1436,7 +1474,7 @@ func (m *InitMessage) Reset() { *m = InitMessage{} }
func (m *InitMessage) String() string { return proto.CompactTextString(m) }
func (*InitMessage) ProtoMessage() {}
func (*InitMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{26}
return fileDescriptor_ed7f10298fa1d90f, []int{27}
}
func (m *InitMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InitMessage.Unmarshal(m, b)
@ -1497,7 +1535,7 @@ func (m *InvokeConfig) Reset() { *m = InvokeConfig{} }
func (m *InvokeConfig) String() string { return proto.CompactTextString(m) }
func (*InvokeConfig) ProtoMessage() {}
func (*InvokeConfig) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{27}
return fileDescriptor_ed7f10298fa1d90f, []int{28}
}
func (m *InvokeConfig) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InvokeConfig.Unmarshal(m, b)
@ -1600,7 +1638,7 @@ func (m *FdMessage) Reset() { *m = FdMessage{} }
func (m *FdMessage) String() string { return proto.CompactTextString(m) }
func (*FdMessage) ProtoMessage() {}
func (*FdMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{28}
return fileDescriptor_ed7f10298fa1d90f, []int{29}
}
func (m *FdMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FdMessage.Unmarshal(m, b)
@ -1653,7 +1691,7 @@ func (m *ResizeMessage) Reset() { *m = ResizeMessage{} }
func (m *ResizeMessage) String() string { return proto.CompactTextString(m) }
func (*ResizeMessage) ProtoMessage() {}
func (*ResizeMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{29}
return fileDescriptor_ed7f10298fa1d90f, []int{30}
}
func (m *ResizeMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResizeMessage.Unmarshal(m, b)
@ -1700,7 +1738,7 @@ func (m *SignalMessage) Reset() { *m = SignalMessage{} }
func (m *SignalMessage) String() string { return proto.CompactTextString(m) }
func (*SignalMessage) ProtoMessage() {}
func (*SignalMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{30}
return fileDescriptor_ed7f10298fa1d90f, []int{31}
}
func (m *SignalMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalMessage.Unmarshal(m, b)
@ -1738,7 +1776,7 @@ func (m *StatusRequest) Reset() { *m = StatusRequest{} }
func (m *StatusRequest) String() string { return proto.CompactTextString(m) }
func (*StatusRequest) ProtoMessage() {}
func (*StatusRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{31}
return fileDescriptor_ed7f10298fa1d90f, []int{32}
}
func (m *StatusRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StatusRequest.Unmarshal(m, b)
@ -1779,7 +1817,7 @@ func (m *StatusResponse) Reset() { *m = StatusResponse{} }
func (m *StatusResponse) String() string { return proto.CompactTextString(m) }
func (*StatusResponse) ProtoMessage() {}
func (*StatusResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{32}
return fileDescriptor_ed7f10298fa1d90f, []int{33}
}
func (m *StatusResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StatusResponse.Unmarshal(m, b)
@ -1837,7 +1875,7 @@ func (m *InfoRequest) Reset() { *m = InfoRequest{} }
func (m *InfoRequest) String() string { return proto.CompactTextString(m) }
func (*InfoRequest) ProtoMessage() {}
func (*InfoRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{33}
return fileDescriptor_ed7f10298fa1d90f, []int{34}
}
func (m *InfoRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InfoRequest.Unmarshal(m, b)
@ -1868,7 +1906,7 @@ func (m *InfoResponse) Reset() { *m = InfoResponse{} }
func (m *InfoResponse) String() string { return proto.CompactTextString(m) }
func (*InfoResponse) ProtoMessage() {}
func (*InfoResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{34}
return fileDescriptor_ed7f10298fa1d90f, []int{35}
}
func (m *InfoResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InfoResponse.Unmarshal(m, b)
@ -1908,7 +1946,7 @@ func (m *BuildxVersion) Reset() { *m = BuildxVersion{} }
func (m *BuildxVersion) String() string { return proto.CompactTextString(m) }
func (*BuildxVersion) ProtoMessage() {}
func (*BuildxVersion) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{35}
return fileDescriptor_ed7f10298fa1d90f, []int{36}
}
func (m *BuildxVersion) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BuildxVersion.Unmarshal(m, b)
@ -1967,6 +2005,7 @@ func init() {
proto.RegisterType((*Attest)(nil), "buildx.controller.v1.Attest")
proto.RegisterType((*SSH)(nil), "buildx.controller.v1.SSH")
proto.RegisterType((*Secret)(nil), "buildx.controller.v1.Secret")
proto.RegisterType((*PrintFunc)(nil), "buildx.controller.v1.PrintFunc")
proto.RegisterType((*InspectRequest)(nil), "buildx.controller.v1.InspectRequest")
proto.RegisterType((*InspectResponse)(nil), "buildx.controller.v1.InspectResponse")
proto.RegisterType((*UlimitOpt)(nil), "buildx.controller.v1.UlimitOpt")
@ -1998,122 +2037,122 @@ func init() {
func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) }
var fileDescriptor_ed7f10298fa1d90f = []byte{
// 1832 bytes of a gzipped FileDescriptorProto
// 1838 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0x5f, 0x6f, 0xdb, 0xc8,
0x11, 0x2f, 0x25, 0x59, 0x7f, 0x46, 0x96, 0xe3, 0x6c, 0x9d, 0xeb, 0x86, 0x49, 0x2f, 0x0e, 0x93,
0xbb, 0x0a, 0x4d, 0x21, 0xdf, 0xf9, 0x7a, 0xcd, 0xe5, 0x72, 0x05, 0x6a, 0xcb, 0x16, 0xec, 0x43,
0xfc, 0x07, 0x94, 0x93, 0x43, 0x5b, 0xa0, 0x07, 0x4a, 0x5a, 0xcb, 0x84, 0x28, 0xae, 0xca, 0x5d,
0xd9, 0x56, 0x9f, 0xfa, 0xd2, 0xb7, 0xa2, 0xdf, 0xa3, 0xe8, 0x47, 0xe8, 0x53, 0xbf, 0x50, 0xd1,
0xc7, 0x3e, 0x16, 0x3b, 0xbb, 0xa4, 0x28, 0x4b, 0x94, 0xed, 0xde, 0x93, 0x76, 0x86, 0xbf, 0xdf,
0xec, 0xce, 0x70, 0x76, 0x66, 0x44, 0x58, 0xef, 0xf2, 0x50, 0x46, 0x3c, 0x08, 0x58, 0xd4, 0x18,
0x45, 0x5c, 0x72, 0xb2, 0xd1, 0x19, 0xfb, 0x41, 0xef, 0xba, 0x91, 0x7a, 0x70, 0xf9, 0xb9, 0xfd,
0xb6, 0xef, 0xcb, 0x8b, 0x71, 0xa7, 0xd1, 0xe5, 0xc3, 0xad, 0x21, 0xef, 0x4c, 0xb6, 0x10, 0x35,
0xf0, 0xe5, 0x96, 0x37, 0xf2, 0xb7, 0x04, 0x8b, 0x2e, 0xfd, 0x2e, 0x13, 0x5b, 0x86, 0x14, 0xff,
0x6a, 0x93, 0x4e, 0x1d, 0x36, 0xde, 0xf9, 0x42, 0x9e, 0x46, 0xbc, 0xcb, 0x84, 0x60, 0xc2, 0x65,
0x7f, 0x1c, 0x33, 0x21, 0xc9, 0x3a, 0xe4, 0x5d, 0x76, 0x4e, 0xad, 0x4d, 0xab, 0x5e, 0x71, 0xd5,
0xd2, 0x39, 0x85, 0x47, 0x37, 0x90, 0x62, 0xc4, 0x43, 0xc1, 0xc8, 0x6b, 0x58, 0x39, 0x0c, 0xcf,
0xb9, 0xa0, 0xd6, 0x66, 0xbe, 0x5e, 0xdd, 0x7e, 0xde, 0x58, 0x74, 0xca, 0x86, 0xe1, 0x29, 0xa4,
0xab, 0xf1, 0x8e, 0x80, 0x6a, 0x4a, 0x4b, 0x9e, 0x42, 0x25, 0x16, 0xf7, 0xcc, 0xc6, 0x53, 0x05,
0x69, 0xc1, 0xea, 0x61, 0x78, 0xc9, 0x07, 0xac, 0xc9, 0xc3, 0x73, 0xbf, 0x4f, 0x73, 0x9b, 0x56,
0xbd, 0xba, 0xed, 0x2c, 0xde, 0x2c, 0x8d, 0x74, 0x67, 0x78, 0xce, 0xb7, 0x40, 0xf7, 0x7c, 0xd1,
0xe5, 0x61, 0xc8, 0xba, 0xb1, 0x33, 0x99, 0x4e, 0xcf, 0x9e, 0x29, 0x77, 0xe3, 0x4c, 0xce, 0x13,
0x78, 0xbc, 0xc0, 0x96, 0x0e, 0x8b, 0xf3, 0x07, 0x58, 0xdd, 0x55, 0x67, 0xcb, 0x36, 0xfe, 0x0d,
0x94, 0x4e, 0x46, 0xd2, 0xe7, 0xa1, 0x58, 0xee, 0x0d, 0x9a, 0x31, 0x48, 0x37, 0xa6, 0x38, 0xff,
0x05, 0xb3, 0x81, 0x51, 0x90, 0x4d, 0xa8, 0x36, 0x79, 0x28, 0xd9, 0xb5, 0x3c, 0xf5, 0xe4, 0x85,
0xd9, 0x28, 0xad, 0x22, 0x9f, 0xc2, 0xda, 0x1e, 0xef, 0x0e, 0x58, 0x74, 0xee, 0x07, 0xec, 0xd8,
0x1b, 0x32, 0xe3, 0xd2, 0x0d, 0xad, 0xf6, 0xda, 0x0f, 0x65, 0x6b, 0x1c, 0x76, 0x69, 0x3e, 0xf6,
0xda, 0x28, 0xc8, 0xef, 0xa1, 0xa6, 0x50, 0x3d, 0x63, 0x59, 0xd0, 0x02, 0xbe, 0xf7, 0x2f, 0x6f,
0x3f, 0x7c, 0x63, 0x86, 0xb7, 0x1f, 0xca, 0x68, 0xe2, 0xce, 0xda, 0x22, 0x1b, 0xb0, 0xb2, 0x13,
0x04, 0xfc, 0x8a, 0xae, 0x6c, 0xe6, 0xeb, 0x15, 0x57, 0x0b, 0xe4, 0x57, 0x50, 0xda, 0x91, 0x92,
0x09, 0x29, 0x68, 0x11, 0x37, 0x7b, 0xba, 0x78, 0x33, 0x0d, 0x72, 0x63, 0x30, 0x39, 0x81, 0x0a,
0xee, 0xbf, 0x13, 0xf5, 0x05, 0x2d, 0x21, 0xf3, 0xf3, 0x3b, 0x1c, 0x33, 0xe1, 0xe8, 0x23, 0x4e,
0x6d, 0x90, 0x7d, 0xa8, 0x34, 0xbd, 0xee, 0x05, 0x6b, 0x45, 0x7c, 0x48, 0xcb, 0x68, 0xf0, 0x67,
0x8b, 0x0d, 0x22, 0xcc, 0x18, 0x34, 0x66, 0x12, 0x26, 0xd9, 0x81, 0x12, 0x0a, 0x67, 0x9c, 0x56,
0xee, 0x67, 0x24, 0xe6, 0x11, 0x07, 0x56, 0x9b, 0xfd, 0x88, 0x8f, 0x47, 0xa7, 0x5e, 0xc4, 0x42,
0x49, 0x01, 0x5f, 0xd3, 0x8c, 0x8e, 0xbc, 0x85, 0xd2, 0xfe, 0xf5, 0x88, 0x47, 0x52, 0xd0, 0xea,
0xb2, 0xbb, 0xa9, 0x41, 0x66, 0x03, 0xc3, 0x20, 0x1f, 0x03, 0xec, 0x5f, 0xcb, 0xc8, 0x3b, 0xe0,
0x2a, 0xec, 0xab, 0xf8, 0x3a, 0x52, 0x1a, 0xd2, 0x82, 0xe2, 0x3b, 0xaf, 0xc3, 0x02, 0x41, 0x6b,
0x68, 0xbb, 0x71, 0x87, 0xc0, 0x6a, 0x82, 0xde, 0xc8, 0xb0, 0x55, 0xda, 0x1e, 0x33, 0x79, 0xc5,
0xa3, 0xc1, 0x11, 0xef, 0x31, 0xba, 0xa6, 0xd3, 0x36, 0xa5, 0x22, 0x2f, 0xa1, 0x76, 0xcc, 0x75,
0xf0, 0xfc, 0x40, 0xb2, 0x88, 0x3e, 0xc0, 0xc3, 0xcc, 0x2a, 0x31, 0x69, 0x03, 0x4f, 0x9e, 0xf3,
0x68, 0x28, 0xe8, 0x3a, 0x22, 0xa6, 0x0a, 0x95, 0x41, 0x6d, 0xd6, 0x8d, 0x98, 0x14, 0xf4, 0xe1,
0xb2, 0x0c, 0xd2, 0x20, 0x37, 0x06, 0x13, 0x0a, 0xa5, 0xf6, 0xc5, 0xb0, 0xed, 0xff, 0x89, 0x51,
0xb2, 0x69, 0xd5, 0xf3, 0x6e, 0x2c, 0x92, 0x57, 0x90, 0x6f, 0xb7, 0x0f, 0xe8, 0x8f, 0xd1, 0xda,
0xe3, 0x0c, 0x6b, 0xed, 0x03, 0x57, 0xa1, 0x08, 0x81, 0xc2, 0x99, 0xd7, 0x17, 0x74, 0x03, 0xcf,
0x85, 0x6b, 0xf2, 0x11, 0x14, 0xcf, 0xbc, 0xa8, 0xcf, 0x24, 0x7d, 0x84, 0x3e, 0x1b, 0x89, 0xbc,
0x81, 0xd2, 0xfb, 0xc0, 0x1f, 0xfa, 0x52, 0xd0, 0x8f, 0xb0, 0x2c, 0x3c, 0x5b, 0x6c, 0x5c, 0x83,
0x4e, 0x46, 0xd2, 0x8d, 0xf1, 0xea, 0xb4, 0x18, 0x6f, 0x16, 0xd1, 0x9f, 0xa0, 0xcd, 0x58, 0x54,
0xe9, 0x72, 0xc4, 0xa4, 0xd7, 0xf3, 0xa4, 0xd7, 0xf2, 0x03, 0x46, 0xa9, 0x4e, 0x97, 0xb4, 0x4e,
0xb1, 0x4d, 0x48, 0xe9, 0xe3, 0x4d, 0xab, 0x5e, 0x76, 0x63, 0x51, 0x1d, 0xff, 0x74, 0x1c, 0x04,
0xd4, 0x46, 0x35, 0xae, 0x75, 0x7e, 0xa8, 0x54, 0x39, 0x1d, 0x8b, 0x0b, 0xfa, 0x04, 0x9f, 0xa4,
0x34, 0xd3, 0xe7, 0xef, 0xb8, 0xd7, 0xa3, 0x4f, 0xd3, 0xcf, 0x95, 0xc6, 0xfe, 0x0d, 0x90, 0xf9,
0x72, 0xa0, 0xaa, 0xe4, 0x80, 0x4d, 0xe2, 0x2a, 0x39, 0x60, 0x13, 0x55, 0x11, 0x2e, 0xbd, 0x60,
0x1c, 0xd7, 0x2a, 0x2d, 0x7c, 0x9d, 0xfb, 0xca, 0xb2, 0xbf, 0x81, 0xb5, 0xd9, 0x9b, 0x7a, 0x2f,
0xf6, 0x1b, 0xa8, 0xa6, 0xd2, 0xf1, 0x3e, 0x54, 0xe7, 0x5f, 0x16, 0x54, 0x53, 0x77, 0x06, 0xdf,
0xee, 0x64, 0xc4, 0x0c, 0x19, 0xd7, 0x64, 0x17, 0x56, 0x76, 0xa4, 0x8c, 0x54, 0x69, 0x57, 0x09,
0xf2, 0x8b, 0x5b, 0x6f, 0x5e, 0x03, 0xe1, 0xfa, 0x6e, 0x68, 0xaa, 0xba, 0x1a, 0x7b, 0x4c, 0x48,
0x3f, 0xf4, 0xd4, 0xf5, 0x31, 0x95, 0x38, 0xad, 0xb2, 0xbf, 0x02, 0x98, 0xd2, 0xee, 0xe5, 0xc3,
0x3f, 0x2c, 0x78, 0x38, 0x57, 0x5e, 0x16, 0x7a, 0x72, 0x30, 0xeb, 0xc9, 0xf6, 0x1d, 0x4b, 0xd5,
0xbc, 0x3f, 0x3f, 0xe0, 0xb4, 0xc7, 0x50, 0xd4, 0x35, 0x7d, 0xe1, 0x09, 0x6d, 0x28, 0xef, 0xf9,
0xc2, 0xeb, 0x04, 0xac, 0x87, 0xd4, 0xb2, 0x9b, 0xc8, 0xd8, 0x50, 0xf0, 0xf4, 0x3a, 0x7a, 0x5a,
0x70, 0xf4, 0xe5, 0x25, 0x6b, 0x90, 0x4b, 0x66, 0x8d, 0xdc, 0xe1, 0x9e, 0x02, 0xab, 0x46, 0xa9,
0x5d, 0xad, 0xb8, 0x5a, 0x70, 0x5a, 0x50, 0xd4, 0xe5, 0x60, 0x0e, 0x6f, 0x43, 0x59, 0xdd, 0x1c,
0xec, 0xb7, 0xfa, 0xcc, 0x89, 0xac, 0xdc, 0xdb, 0x0f, 0x2f, 0xcd, 0xb6, 0x6a, 0xe9, 0x38, 0xb0,
0x76, 0x18, 0x8a, 0x11, 0xeb, 0xca, 0xec, 0x29, 0xeb, 0x04, 0x1e, 0x24, 0x18, 0x33, 0x5f, 0xa5,
0xc6, 0x04, 0xeb, 0xfe, 0x63, 0xc2, 0xdf, 0x2d, 0xa8, 0x24, 0x95, 0x82, 0x34, 0xa1, 0x88, 0x41,
0x8d, 0x87, 0xb5, 0x57, 0xb7, 0x94, 0x96, 0xc6, 0x07, 0x44, 0x9b, 0x8a, 0xad, 0xa9, 0xf6, 0x77,
0x50, 0x4d, 0xa9, 0x17, 0xbc, 0xc7, 0xed, 0xf4, 0x7b, 0xcc, 0x2c, 0xb5, 0x7a, 0x93, 0xf4, 0x5b,
0xde, 0x83, 0xa2, 0x56, 0xaa, 0xb7, 0x8c, 0xf3, 0x89, 0x79, 0xcb, 0x38, 0x95, 0x10, 0x28, 0x1c,
0x78, 0x91, 0x7e, 0xc3, 0x79, 0x17, 0xd7, 0x4a, 0xd7, 0xe6, 0xe7, 0x12, 0xa3, 0x9c, 0x77, 0x71,
0xed, 0xfc, 0xd3, 0x82, 0x9a, 0x99, 0xbc, 0x4c, 0x04, 0x19, 0xac, 0xeb, 0x8b, 0xc6, 0xa2, 0x58,
0x67, 0xfc, 0x7f, 0xb3, 0x24, 0x94, 0x31, 0xb4, 0x71, 0x93, 0xab, 0xa3, 0x31, 0x67, 0xd2, 0x6e,
0xc2, 0xa3, 0x85, 0xd0, 0x7b, 0x65, 0xfa, 0x27, 0xf0, 0x70, 0x3a, 0x53, 0x66, 0xe7, 0xc9, 0x06,
0x90, 0x34, 0xcc, 0xcc, 0x9c, 0xcf, 0xa0, 0xaa, 0x66, 0xf4, 0x6c, 0x9a, 0x03, 0xab, 0x1a, 0x60,
0x22, 0x43, 0xa0, 0x30, 0x60, 0x13, 0x9d, 0x0d, 0x15, 0x17, 0xd7, 0xce, 0xdf, 0x2c, 0x35, 0x6a,
0x8f, 0xc6, 0xf2, 0x88, 0x09, 0xe1, 0xf5, 0x55, 0x02, 0x16, 0x0e, 0x43, 0x5f, 0x9a, 0xec, 0xfb,
0x34, 0x6b, 0xe4, 0x1e, 0x8d, 0xa5, 0x82, 0x19, 0xd6, 0xc1, 0x8f, 0x5c, 0x64, 0x91, 0xd7, 0x50,
0xd8, 0xf3, 0xa4, 0x67, 0x72, 0x21, 0x63, 0x02, 0x51, 0x88, 0x14, 0x51, 0x89, 0xbb, 0x25, 0xf5,
0xbf, 0x62, 0x34, 0x96, 0xce, 0x4b, 0x58, 0xbf, 0x69, 0x7d, 0x81, 0x6b, 0x5f, 0x40, 0x35, 0x65,
0x05, 0xaf, 0xdf, 0x49, 0x0b, 0x01, 0x65, 0x57, 0x2d, 0x95, 0xaf, 0xc9, 0x41, 0x56, 0xf5, 0x1e,
0xce, 0x03, 0xa8, 0xa1, 0xe9, 0x24, 0x82, 0x7f, 0xce, 0x41, 0x29, 0x36, 0xf1, 0x7a, 0xc6, 0xef,
0xe7, 0x59, 0x7e, 0xcf, 0xbb, 0xfc, 0x25, 0x14, 0xb0, 0xc9, 0xe6, 0x96, 0xb5, 0xef, 0x56, 0x2f,
0x45, 0xc3, 0xfe, 0xfb, 0x6b, 0x28, 0xba, 0x4c, 0xa8, 0x51, 0x23, 0x8f, 0xc4, 0x17, 0x8b, 0x89,
0x1a, 0x33, 0x25, 0x1b, 0x92, 0xa2, 0xb7, 0xfd, 0x7e, 0xe8, 0x05, 0xb4, 0xb0, 0x8c, 0xae, 0x31,
0x29, 0xba, 0x56, 0x4c, 0xc3, 0xfd, 0x17, 0x0b, 0xaa, 0x4b, 0x43, 0xbd, 0xfc, 0x5f, 0xd1, 0xdc,
0x3f, 0xb5, 0xfc, 0xff, 0xf9, 0x4f, 0xed, 0xdf, 0xd6, 0xac, 0x21, 0x9c, 0x28, 0xd4, 0x7d, 0x1a,
0x71, 0x3f, 0x94, 0x26, 0x65, 0x53, 0x1a, 0x75, 0xd0, 0xe6, 0xb0, 0x67, 0x6a, 0xb7, 0x5a, 0x4e,
0x6b, 0x70, 0xde, 0xd4, 0x60, 0x95, 0x04, 0xef, 0x05, 0x8b, 0x30, 0x44, 0x15, 0x17, 0xd7, 0x6a,
0x10, 0x3b, 0xe6, 0xa8, 0x5d, 0xc1, 0x6c, 0x31, 0x12, 0xda, 0xbb, 0xea, 0xd1, 0xa2, 0x76, 0xbc,
0x79, 0x85, 0xcd, 0xe4, 0x98, 0x2b, 0x5d, 0x09, 0x81, 0x5a, 0x50, 0xb8, 0x33, 0x39, 0xa1, 0x65,
0x9d, 0x6a, 0x67, 0x72, 0xa2, 0xfa, 0x82, 0xcb, 0x83, 0xa0, 0xe3, 0x75, 0x07, 0xb4, 0xa2, 0x1b,
0x52, 0x2c, 0xab, 0x29, 0x4b, 0x45, 0xd7, 0xf7, 0x02, 0x9c, 0xd9, 0xcb, 0x6e, 0x2c, 0x3a, 0x3b,
0x50, 0x49, 0x92, 0x42, 0xb5, 0x9a, 0x56, 0x0f, 0x83, 0x5e, 0x73, 0x73, 0xad, 0x5e, 0x9c, 0xcf,
0xb9, 0xf9, 0x7c, 0xce, 0xa7, 0xf2, 0xf9, 0x35, 0xd4, 0x66, 0xd2, 0x43, 0x81, 0x5c, 0x7e, 0x25,
0x8c, 0x21, 0x5c, 0x2b, 0x5d, 0x93, 0x07, 0xfa, 0x4f, 0x67, 0xcd, 0xc5, 0xb5, 0xf3, 0x02, 0x6a,
0x33, 0x89, 0xb1, 0xa8, 0x02, 0x3b, 0xcf, 0xa1, 0xd6, 0x96, 0x9e, 0x1c, 0x2f, 0xf9, 0x4a, 0xf0,
0x1f, 0x0b, 0xd6, 0x62, 0x8c, 0xa9, 0x31, 0xbf, 0x84, 0xf2, 0x25, 0x8b, 0x24, 0xbb, 0x4e, 0xba,
0x0e, 0x6d, 0x0c, 0x79, 0x67, 0xd2, 0x88, 0xbf, 0x53, 0xa8, 0x3c, 0xf8, 0x80, 0x08, 0x37, 0x41,
0x92, 0xaf, 0xa1, 0x2c, 0xd0, 0x0e, 0x8b, 0x07, 0x8f, 0x8f, 0xb3, 0x58, 0x66, 0xbf, 0x04, 0x4f,
0xb6, 0xa0, 0x10, 0xf0, 0xbe, 0xc0, 0xf7, 0x5e, 0xdd, 0x7e, 0x92, 0xc5, 0x7b, 0xc7, 0xfb, 0x2e,
0x02, 0xc9, 0x5b, 0x28, 0x5f, 0x79, 0x51, 0xe8, 0x87, 0xfd, 0xf8, 0xdf, 0xec, 0xb3, 0x2c, 0xd2,
0x77, 0x1a, 0xe7, 0x26, 0x04, 0xa7, 0xa6, 0xae, 0xcb, 0x39, 0x37, 0x31, 0x71, 0x7e, 0xab, 0xb2,
0x56, 0x89, 0xc6, 0xfd, 0x43, 0xa8, 0xe9, 0xcc, 0xff, 0xc0, 0x22, 0xa1, 0xc6, 0x38, 0x6b, 0xd9,
0xed, 0xdc, 0x4d, 0x43, 0xdd, 0x59, 0xa6, 0xf3, 0xbd, 0x69, 0x6c, 0xb1, 0x42, 0xe5, 0xd2, 0xc8,
0xeb, 0x0e, 0xbc, 0x7e, 0xfc, 0x9e, 0x62, 0x51, 0x3d, 0xb9, 0x34, 0xfb, 0xe9, 0x0b, 0x1a, 0x8b,
0x2a, 0x37, 0x23, 0x76, 0xe9, 0x8b, 0xe9, 0x44, 0x99, 0xc8, 0xdb, 0x7f, 0x2d, 0x01, 0x34, 0x93,
0xf3, 0x90, 0x53, 0x58, 0xc1, 0xfd, 0x88, 0xb3, 0xb4, 0x4d, 0xa2, 0xdf, 0xf6, 0x8b, 0x3b, 0xb4,
0x52, 0xf2, 0x41, 0x25, 0x3f, 0x8e, 0x37, 0xe4, 0x65, 0x56, 0x41, 0x48, 0x4f, 0x48, 0xf6, 0x27,
0xb7, 0xa0, 0x8c, 0xdd, 0xf7, 0x50, 0xd4, 0x59, 0x40, 0xb2, 0xaa, 0x5e, 0x3a, 0x6f, 0xed, 0x97,
0xcb, 0x41, 0xda, 0xe8, 0x67, 0x16, 0x71, 0x4d, 0x4d, 0x24, 0xce, 0x92, 0xa6, 0x67, 0x6e, 0x4c,
0x56, 0x00, 0x66, 0xfa, 0x4b, 0xdd, 0x22, 0xdf, 0x42, 0x51, 0x57, 0x35, 0xf2, 0xd3, 0xc5, 0x84,
0xd8, 0xde, 0xf2, 0xc7, 0x75, 0xeb, 0x33, 0x8b, 0x1c, 0x41, 0x41, 0xb5, 0x73, 0x92, 0xd1, 0x9b,
0x52, 0xb3, 0x80, 0xed, 0x2c, 0x83, 0x98, 0x28, 0x7e, 0x0f, 0x30, 0x1d, 0x2a, 0x48, 0xc6, 0x37,
0x89, 0xb9, 0xe9, 0xc4, 0xae, 0xdf, 0x0e, 0x34, 0x1b, 0x1c, 0xa9, 0x8e, 0x7a, 0xce, 0x49, 0x66,
0x2f, 0x4d, 0xae, 0x91, 0xed, 0x2c, 0x83, 0x18, 0x73, 0x17, 0x50, 0x9b, 0xf9, 0x24, 0x49, 0x7e,
0x9e, 0xed, 0xe4, 0xcd, 0x2f, 0x9c, 0xf6, 0xab, 0x3b, 0x61, 0xcd, 0x4e, 0x32, 0x3d, 0x95, 0x99,
0xc7, 0xa4, 0x71, 0x9b, 0xdf, 0xb3, 0x9f, 0x17, 0xed, 0xad, 0x3b, 0xe3, 0xf5, 0xae, 0xbb, 0x85,
0xdf, 0xe5, 0x46, 0x9d, 0x4e, 0x11, 0xbf, 0xd4, 0x7e, 0xf1, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff,
0xc2, 0xd5, 0x2b, 0x23, 0x10, 0x16, 0x00, 0x00,
0x11, 0x2f, 0x25, 0x59, 0x7f, 0x46, 0x96, 0xe3, 0x6c, 0x9d, 0x74, 0xc3, 0x5c, 0x2f, 0x0e, 0x93,
0xbb, 0x0a, 0x4d, 0x21, 0xdf, 0xf9, 0x7a, 0xf5, 0xe5, 0x72, 0x07, 0xd4, 0x96, 0x2d, 0xd8, 0x87,
0xc4, 0x36, 0x56, 0x4e, 0x0e, 0x6d, 0x81, 0x1e, 0x28, 0x69, 0x2d, 0x13, 0xa2, 0xb8, 0x2a, 0x77,
0x65, 0x5b, 0x7d, 0xea, 0x4b, 0xdf, 0x8a, 0x7e, 0x8f, 0xa2, 0x1f, 0xa1, 0x4f, 0xfd, 0x42, 0x45,
0x5f, 0xfa, 0x5e, 0xec, 0x1f, 0x52, 0xa4, 0x25, 0xd2, 0x76, 0xfb, 0xa4, 0x9d, 0xe1, 0x6f, 0x66,
0x76, 0x86, 0xf3, 0x4f, 0x84, 0xf5, 0x3e, 0x0b, 0x44, 0xc8, 0x7c, 0x9f, 0x86, 0xad, 0x49, 0xc8,
0x04, 0x43, 0x1b, 0xbd, 0xa9, 0xe7, 0x0f, 0xae, 0x5b, 0x89, 0x07, 0x97, 0x9f, 0xdb, 0x6f, 0x86,
0x9e, 0xb8, 0x98, 0xf6, 0x5a, 0x7d, 0x36, 0xde, 0x1a, 0xb3, 0xde, 0x6c, 0x4b, 0xa1, 0x46, 0x9e,
0xd8, 0x72, 0x27, 0xde, 0x16, 0xa7, 0xe1, 0xa5, 0xd7, 0xa7, 0x7c, 0xcb, 0x08, 0x45, 0xbf, 0x5a,
0xa5, 0xd3, 0x84, 0x8d, 0xb7, 0x1e, 0x17, 0xa7, 0x21, 0xeb, 0x53, 0xce, 0x29, 0x27, 0xf4, 0x0f,
0x53, 0xca, 0x05, 0x5a, 0x87, 0x22, 0xa1, 0xe7, 0xd8, 0xda, 0xb4, 0x9a, 0x35, 0x22, 0x8f, 0xce,
0x29, 0x3c, 0xba, 0x81, 0xe4, 0x13, 0x16, 0x70, 0x8a, 0x76, 0x60, 0xe5, 0x28, 0x38, 0x67, 0x1c,
0x5b, 0x9b, 0xc5, 0x66, 0x7d, 0xfb, 0x79, 0x6b, 0xd9, 0x2d, 0x5b, 0x46, 0x4e, 0x22, 0x89, 0xc6,
0x3b, 0x1c, 0xea, 0x09, 0x2e, 0xfa, 0x08, 0x6a, 0x11, 0xb9, 0x6f, 0x0c, 0xcf, 0x19, 0xa8, 0x03,
0xab, 0x47, 0xc1, 0x25, 0x1b, 0xd1, 0x36, 0x0b, 0xce, 0xbd, 0x21, 0x2e, 0x6c, 0x5a, 0xcd, 0xfa,
0xb6, 0xb3, 0xdc, 0x58, 0x12, 0x49, 0x52, 0x72, 0xce, 0x77, 0x80, 0xf7, 0x3d, 0xde, 0x67, 0x41,
0x40, 0xfb, 0x91, 0x33, 0x99, 0x4e, 0xa7, 0xef, 0x54, 0xb8, 0x71, 0x27, 0xe7, 0x29, 0x3c, 0x59,
0xa2, 0x4b, 0x87, 0xc5, 0xf9, 0x3d, 0xac, 0xee, 0xc9, 0xbb, 0x65, 0x2b, 0xff, 0x06, 0x2a, 0x27,
0x13, 0xe1, 0xb1, 0x80, 0xe7, 0x7b, 0xa3, 0xd4, 0x18, 0x24, 0x89, 0x44, 0x9c, 0xff, 0x80, 0x31,
0x60, 0x18, 0x68, 0x13, 0xea, 0x6d, 0x16, 0x08, 0x7a, 0x2d, 0x4e, 0x5d, 0x71, 0x61, 0x0c, 0x25,
0x59, 0xe8, 0x53, 0x58, 0xdb, 0x67, 0xfd, 0x11, 0x0d, 0xcf, 0x3d, 0x9f, 0x1e, 0xbb, 0x63, 0x6a,
0x5c, 0xba, 0xc1, 0x45, 0xdf, 0x4a, 0xaf, 0xbd, 0x40, 0x74, 0xa6, 0x41, 0x1f, 0x17, 0xd5, 0xd5,
0x9e, 0x65, 0xbd, 0x55, 0x03, 0x23, 0x73, 0x09, 0xf4, 0x3b, 0x68, 0x48, 0x35, 0x03, 0x63, 0x9a,
0xe3, 0x92, 0x4a, 0x8c, 0x2f, 0x6f, 0xf7, 0xae, 0x95, 0x92, 0x3b, 0x08, 0x44, 0x38, 0x23, 0x69,
0x5d, 0x68, 0x03, 0x56, 0x76, 0x7d, 0x9f, 0x5d, 0xe1, 0x95, 0xcd, 0x62, 0xb3, 0x46, 0x34, 0x81,
0x7e, 0x05, 0x95, 0x5d, 0x21, 0x28, 0x17, 0x1c, 0x97, 0x95, 0xb1, 0x8f, 0x96, 0x1b, 0xd3, 0x20,
0x12, 0x81, 0xd1, 0x09, 0xd4, 0x94, 0xfd, 0xdd, 0x70, 0xc8, 0x71, 0x45, 0x49, 0x7e, 0x7e, 0x87,
0x6b, 0xc6, 0x32, 0xfa, 0x8a, 0x73, 0x1d, 0xe8, 0x00, 0x6a, 0x6d, 0xb7, 0x7f, 0x41, 0x3b, 0x21,
0x1b, 0xe3, 0xaa, 0x52, 0xf8, 0xb3, 0xe5, 0x0a, 0x15, 0xcc, 0x28, 0x34, 0x6a, 0x62, 0x49, 0xb4,
0x0b, 0x15, 0x45, 0x9c, 0x31, 0x5c, 0xbb, 0x9f, 0x92, 0x48, 0x0e, 0x39, 0xb0, 0xda, 0x1e, 0x86,
0x6c, 0x3a, 0x39, 0x75, 0x43, 0x1a, 0x08, 0x0c, 0xea, 0x55, 0xa7, 0x78, 0xe8, 0x0d, 0x54, 0x0e,
0xae, 0x27, 0x2c, 0x14, 0x1c, 0xd7, 0xf3, 0x8a, 0x57, 0x83, 0x8c, 0x01, 0x23, 0x81, 0x3e, 0x06,
0x38, 0xb8, 0x16, 0xa1, 0x7b, 0xc8, 0x64, 0xd8, 0x57, 0xd5, 0xeb, 0x48, 0x70, 0x50, 0x07, 0xca,
0x6f, 0xdd, 0x1e, 0xf5, 0x39, 0x6e, 0x28, 0xdd, 0xad, 0x3b, 0x04, 0x56, 0x0b, 0x68, 0x43, 0x46,
0x5a, 0xe6, 0xf5, 0x31, 0x15, 0x57, 0x2c, 0x1c, 0xbd, 0x63, 0x03, 0x8a, 0xd7, 0x74, 0x5e, 0x27,
0x58, 0xe8, 0x25, 0x34, 0x8e, 0x99, 0x0e, 0x9e, 0xe7, 0x0b, 0x1a, 0xe2, 0x07, 0xea, 0x32, 0x69,
0xa6, 0xaa, 0x65, 0xdf, 0x15, 0xe7, 0x2c, 0x1c, 0x73, 0xbc, 0xae, 0x10, 0x73, 0x86, 0xcc, 0xa0,
0x2e, 0xed, 0x87, 0x54, 0x70, 0xfc, 0x30, 0x2f, 0x83, 0x34, 0x88, 0x44, 0x60, 0x84, 0xa1, 0xd2,
0xbd, 0x18, 0x77, 0xbd, 0x3f, 0x52, 0x8c, 0x36, 0xad, 0x66, 0x91, 0x44, 0x24, 0x7a, 0x05, 0xc5,
0x6e, 0xf7, 0x10, 0xff, 0x58, 0x69, 0x7b, 0x92, 0xa1, 0xad, 0x7b, 0x48, 0x24, 0x0a, 0x21, 0x28,
0x9d, 0xb9, 0x43, 0x8e, 0x37, 0xd4, 0xbd, 0xd4, 0x19, 0x3d, 0x86, 0xf2, 0x99, 0x1b, 0x0e, 0xa9,
0xc0, 0x8f, 0x94, 0xcf, 0x86, 0x42, 0xaf, 0xa1, 0xf2, 0xde, 0xf7, 0xc6, 0x9e, 0xe0, 0xf8, 0x71,
0x5e, 0x71, 0x6a, 0xd0, 0xc9, 0x44, 0x90, 0x08, 0x2f, 0x6f, 0xab, 0xe2, 0x4d, 0x43, 0xfc, 0x13,
0xa5, 0x33, 0x22, 0xe5, 0x13, 0x13, 0x2e, 0x8c, 0x37, 0xad, 0x66, 0x95, 0x44, 0xa4, 0xbc, 0xda,
0xe9, 0xd4, 0xf7, 0xf1, 0x13, 0xc5, 0x56, 0x67, 0xfd, 0xee, 0x65, 0x1a, 0x9c, 0x4e, 0xf9, 0x05,
0xb6, 0xd5, 0x93, 0x04, 0x67, 0xfe, 0xfc, 0x2d, 0x73, 0x07, 0xf8, 0x69, 0xf2, 0xb9, 0xe4, 0xd8,
0xbf, 0x06, 0xb4, 0x58, 0xea, 0xb2, 0x45, 0x8e, 0xe8, 0x2c, 0x6a, 0x91, 0x23, 0x3a, 0x93, 0xd5,
0x7e, 0xe9, 0xfa, 0xd3, 0xa8, 0x51, 0x69, 0xe2, 0xeb, 0xc2, 0x57, 0x96, 0xfd, 0x0d, 0xac, 0xa5,
0xab, 0xf0, 0x5e, 0xd2, 0xaf, 0xa1, 0x9e, 0x48, 0xb5, 0xfb, 0x88, 0x3a, 0xff, 0xb4, 0xa0, 0x9e,
0xa8, 0x07, 0xf5, 0xe6, 0x66, 0x13, 0x6a, 0x84, 0xd5, 0x19, 0xed, 0xc1, 0xca, 0xae, 0x10, 0xa1,
0xec, 0xeb, 0xf2, 0xe5, 0xff, 0xe2, 0xd6, 0xaa, 0x6a, 0x29, 0xb8, 0xce, 0x7b, 0x2d, 0x2a, 0xd3,
0x7e, 0x9f, 0x72, 0xe1, 0x05, 0xae, 0x2c, 0x0d, 0xd5, 0x86, 0x6b, 0x24, 0xc9, 0xb2, 0xbf, 0x02,
0x98, 0x8b, 0xdd, 0xcb, 0x87, 0xbf, 0x5b, 0xf0, 0x70, 0xa1, 0x75, 0x2c, 0xf5, 0xe4, 0x30, 0xed,
0xc9, 0xf6, 0x1d, 0xdb, 0xd0, 0xa2, 0x3f, 0xff, 0xc7, 0x6d, 0x8f, 0xa1, 0xac, 0xfb, 0xf5, 0xd2,
0x1b, 0xda, 0x50, 0xdd, 0xf7, 0xb8, 0xdb, 0xf3, 0xe9, 0x40, 0x89, 0x56, 0x49, 0x4c, 0xab, 0x61,
0xa1, 0x6e, 0xaf, 0xa3, 0xa7, 0x09, 0x47, 0x17, 0x26, 0x5a, 0x83, 0x42, 0xbc, 0x68, 0x14, 0x8e,
0xf6, 0x25, 0x58, 0x4e, 0x49, 0xed, 0x6a, 0x8d, 0x68, 0xc2, 0xe9, 0x40, 0x59, 0x97, 0xfa, 0x02,
0xde, 0x86, 0x6a, 0xc7, 0xf3, 0xa9, 0x1a, 0xb6, 0xfa, 0xce, 0x31, 0x2d, 0xdd, 0x3b, 0x08, 0x2e,
0x8d, 0x59, 0x79, 0x74, 0x76, 0x12, 0x33, 0x55, 0xfa, 0xa1, 0xc6, 0xaf, 0xf1, 0x43, 0x0d, 0xdd,
0xc7, 0x50, 0xee, 0xb0, 0x70, 0xec, 0x0a, 0xa3, 0xcc, 0x50, 0x8e, 0x03, 0x6b, 0x47, 0x01, 0x9f,
0xd0, 0xbe, 0xc8, 0xde, 0xcd, 0x4e, 0xe0, 0x41, 0x8c, 0x31, 0x5b, 0x59, 0x62, 0xb9, 0xb0, 0xee,
0xbf, 0x5c, 0xfc, 0xcd, 0x82, 0x5a, 0xdc, 0x3e, 0x50, 0x1b, 0xca, 0xea, 0x6d, 0x44, 0x2b, 0xde,
0xab, 0x5b, 0xfa, 0x4d, 0xeb, 0x83, 0x42, 0x9b, 0x36, 0xae, 0x45, 0xed, 0xef, 0xa1, 0x9e, 0x60,
0x2f, 0x49, 0x80, 0xed, 0x64, 0x02, 0x64, 0xf6, 0x5f, 0x6d, 0x24, 0x99, 0x1e, 0xfb, 0x50, 0xd6,
0xcc, 0xa5, 0x61, 0x45, 0x50, 0x3a, 0x74, 0x43, 0x9d, 0x1a, 0x45, 0xa2, 0xce, 0x92, 0xd7, 0x65,
0xe7, 0x42, 0xbd, 0x9e, 0x22, 0x51, 0x67, 0xe7, 0x1f, 0x16, 0x34, 0xcc, 0xbe, 0x66, 0x22, 0x48,
0x61, 0x5d, 0x57, 0x28, 0x0d, 0x23, 0x9e, 0xf1, 0xff, 0x75, 0x4e, 0x28, 0x23, 0x68, 0xeb, 0xa6,
0xac, 0x8e, 0xc6, 0x82, 0x4a, 0xbb, 0x0d, 0x8f, 0x96, 0x42, 0xef, 0x55, 0x22, 0x9f, 0xc0, 0xc3,
0xf9, 0x26, 0x9a, 0x9d, 0x27, 0x1b, 0x80, 0x92, 0x30, 0xb3, 0xa9, 0x3e, 0x83, 0xba, 0xdc, 0xec,
0xb3, 0xc5, 0x1c, 0x58, 0xd5, 0x00, 0x13, 0x19, 0x04, 0xa5, 0x11, 0x9d, 0xe9, 0x6c, 0xa8, 0x11,
0x75, 0x76, 0xfe, 0x6a, 0xc9, 0x05, 0x7d, 0x32, 0x15, 0xef, 0x28, 0xe7, 0xee, 0x50, 0x26, 0x60,
0xe9, 0x28, 0xf0, 0x84, 0xc9, 0xbe, 0x4f, 0xb3, 0x16, 0xf5, 0xc9, 0x54, 0x48, 0x98, 0x91, 0x3a,
0xfc, 0x11, 0x51, 0x52, 0x68, 0x07, 0x4a, 0xfb, 0xae, 0x70, 0x4d, 0x2e, 0x64, 0xac, 0x25, 0x12,
0x91, 0x10, 0x94, 0xe4, 0x5e, 0x45, 0xfe, 0x1b, 0x99, 0x4c, 0x85, 0xf3, 0x12, 0xd6, 0x6f, 0x6a,
0x5f, 0xe2, 0xda, 0x17, 0x50, 0x4f, 0x68, 0x51, 0x75, 0x7b, 0xd2, 0x51, 0x80, 0x2a, 0x91, 0x47,
0xe9, 0x6b, 0x7c, 0x91, 0x55, 0x6d, 0xc3, 0x79, 0x00, 0x0d, 0xa5, 0x3a, 0x8e, 0xe0, 0x9f, 0x0a,
0x50, 0x89, 0x54, 0xec, 0xa4, 0xfc, 0x7e, 0x9e, 0xe5, 0xf7, 0xa2, 0xcb, 0x5f, 0x42, 0x49, 0xf6,
0x0f, 0xe3, 0x72, 0xc6, 0x4c, 0xef, 0x0c, 0x12, 0x62, 0x12, 0x8e, 0xbe, 0x85, 0x32, 0xa1, 0x5c,
0xee, 0x1f, 0x7a, 0x53, 0x7f, 0xb1, 0x5c, 0x50, 0x63, 0xe6, 0xc2, 0x46, 0x48, 0x8a, 0x77, 0xbd,
0x61, 0xe0, 0xfa, 0xb8, 0x94, 0x27, 0xae, 0x31, 0x09, 0x71, 0xcd, 0x98, 0x87, 0xfb, 0xcf, 0x16,
0xd4, 0x73, 0x43, 0x9d, 0xff, 0x5f, 0x6a, 0xe1, 0xff, 0x5d, 0xf1, 0x7f, 0xfc, 0x7f, 0xf7, 0x2f,
0x2b, 0xad, 0x48, 0xad, 0x22, 0xb2, 0x9e, 0x26, 0xcc, 0x0b, 0x84, 0x49, 0xd9, 0x04, 0x47, 0x5e,
0xb4, 0x3d, 0x1e, 0x98, 0xa6, 0x2f, 0x8f, 0xf3, 0xe6, 0x5d, 0x34, 0xcd, 0x5b, 0x26, 0xc1, 0x7b,
0x4e, 0x43, 0x15, 0xa2, 0x1a, 0x51, 0x67, 0xd9, 0xaf, 0x8f, 0x99, 0xe2, 0xae, 0xa8, 0x6c, 0x31,
0x94, 0xd2, 0x77, 0x35, 0xc0, 0x65, 0xed, 0x78, 0xfb, 0x4a, 0x4d, 0xa1, 0x63, 0x26, 0x79, 0x15,
0x05, 0xd4, 0x84, 0xc4, 0x9d, 0x89, 0x19, 0xae, 0xea, 0x54, 0x3b, 0x13, 0x33, 0x39, 0x50, 0x08,
0xf3, 0xfd, 0x9e, 0xdb, 0x1f, 0xe1, 0x9a, 0x9e, 0x64, 0x11, 0x2d, 0xd7, 0x33, 0x19, 0x5d, 0xcf,
0xf5, 0xd5, 0x22, 0x5f, 0x25, 0x11, 0xe9, 0xec, 0x42, 0x2d, 0x4e, 0x0a, 0x39, 0xa3, 0x3a, 0x03,
0x15, 0xf4, 0x06, 0x29, 0x74, 0x06, 0x51, 0x3e, 0x17, 0x16, 0xf3, 0xb9, 0x98, 0xc8, 0xe7, 0x1d,
0x68, 0xa4, 0xd2, 0x43, 0x82, 0x08, 0xbb, 0xe2, 0x46, 0x91, 0x3a, 0x4b, 0x5e, 0x9b, 0xf9, 0xfa,
0xaf, 0x6a, 0x83, 0xa8, 0xb3, 0xf3, 0x02, 0x1a, 0xa9, 0xc4, 0x58, 0xd6, 0x81, 0x9d, 0xe7, 0xd0,
0xe8, 0x0a, 0x57, 0x4c, 0x73, 0xbe, 0x2d, 0xfc, 0xdb, 0x82, 0xb5, 0x08, 0x63, 0x7a, 0xcc, 0x2f,
0xa1, 0x7a, 0x49, 0x43, 0x41, 0xaf, 0xe3, 0xa9, 0x83, 0x5b, 0x63, 0xd6, 0x9b, 0xb5, 0xa2, 0xaf,
0x1b, 0x32, 0x0f, 0x3e, 0x28, 0x04, 0x89, 0x91, 0xe8, 0x6b, 0xa8, 0x72, 0xa5, 0x87, 0x46, 0x1b,
0xcb, 0xc7, 0x59, 0x52, 0xc6, 0x5e, 0x8c, 0x47, 0x5b, 0x50, 0xf2, 0xd9, 0x90, 0xab, 0xf7, 0x5e,
0xdf, 0x7e, 0x9a, 0x25, 0xf7, 0x96, 0x0d, 0x89, 0x02, 0xa2, 0x37, 0x50, 0xbd, 0x72, 0xc3, 0xc0,
0x0b, 0x86, 0xd1, 0x5f, 0xdc, 0x67, 0x59, 0x42, 0xdf, 0x6b, 0x1c, 0x89, 0x05, 0x9c, 0x86, 0x2c,
0x97, 0x73, 0x66, 0x62, 0xe2, 0xfc, 0x46, 0x66, 0xad, 0x24, 0x8d, 0xfb, 0x47, 0xd0, 0xd0, 0x99,
0xff, 0x81, 0x86, 0x5c, 0xee, 0x7f, 0x56, 0x5e, 0x75, 0xee, 0x25, 0xa1, 0x24, 0x2d, 0xe9, 0xfc,
0x60, 0x06, 0x5b, 0xc4, 0x90, 0xb9, 0x34, 0x71, 0xfb, 0x23, 0x77, 0x18, 0xbd, 0xa7, 0x88, 0x94,
0x4f, 0x2e, 0x8d, 0x3d, 0x5d, 0xa0, 0x11, 0x29, 0x73, 0x33, 0xa4, 0x97, 0x1e, 0x9f, 0xaf, 0xa2,
0x31, 0xbd, 0xfd, 0x97, 0x0a, 0x40, 0x3b, 0xbe, 0x0f, 0x3a, 0x85, 0x15, 0x65, 0x0f, 0x39, 0xb9,
0x63, 0x52, 0xf9, 0x6d, 0xbf, 0xb8, 0xc3, 0x28, 0x45, 0x1f, 0x64, 0xf2, 0xab, 0xf5, 0x06, 0xbd,
0xcc, 0x6a, 0x08, 0xc9, 0x0d, 0xc9, 0xfe, 0xe4, 0x16, 0x94, 0xd1, 0xfb, 0x1e, 0xca, 0x3a, 0x0b,
0x50, 0x56, 0xd7, 0x4b, 0xe6, 0xad, 0xfd, 0x32, 0x1f, 0xa4, 0x95, 0x7e, 0x66, 0x21, 0x62, 0x7a,
0x22, 0x72, 0x72, 0x86, 0x9e, 0xa9, 0x98, 0xac, 0x00, 0xa4, 0xe6, 0x4b, 0xd3, 0x42, 0xdf, 0x41,
0x59, 0x77, 0x35, 0xf4, 0xd3, 0xe5, 0x02, 0x91, 0xbe, 0xfc, 0xc7, 0x4d, 0xeb, 0x33, 0x0b, 0xbd,
0x83, 0x92, 0x1c, 0xe7, 0x28, 0x63, 0x36, 0x25, 0x76, 0x01, 0xdb, 0xc9, 0x83, 0x98, 0x28, 0xfe,
0x00, 0x30, 0x5f, 0x2a, 0x50, 0xc6, 0x87, 0x8a, 0x85, 0xed, 0xc4, 0x6e, 0xde, 0x0e, 0x34, 0x06,
0xde, 0xc9, 0x89, 0x7a, 0xce, 0x50, 0xe6, 0x2c, 0x8d, 0xcb, 0xc8, 0x76, 0xf2, 0x20, 0x46, 0xdd,
0x05, 0x34, 0x52, 0x1f, 0x32, 0xd1, 0xcf, 0xb3, 0x9d, 0xbc, 0xf9, 0x5d, 0xd4, 0x7e, 0x75, 0x27,
0xac, 0xb1, 0x24, 0x92, 0x5b, 0x99, 0x79, 0x8c, 0x5a, 0xb7, 0xf9, 0x9d, 0xfe, 0x28, 0x69, 0x6f,
0xdd, 0x19, 0xaf, 0xad, 0xee, 0x95, 0x7e, 0x5b, 0x98, 0xf4, 0x7a, 0x65, 0xf5, 0x7d, 0xf7, 0x8b,
0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0xda, 0xfb, 0x1e, 0x3f, 0x46, 0x16, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.

@ -48,7 +48,7 @@ message BuildRequest {
message BuildOptions {
string ContextPath = 1;
string DockerfileName = 2;
string PrintFunc = 3;
PrintFunc PrintFunc = 3;
map<string, string> NamedContexts = 4;
repeated string Allow = 5;
@ -71,11 +71,10 @@ message BuildOptions {
UlimitOpt Ulimits = 22;
string Builder = 23;
string MetadataFile = 24;
bool NoCache = 25;
bool Pull = 26;
bool ExportPush = 27;
bool ExportLoad = 28;
bool NoCache = 24;
bool Pull = 25;
bool ExportPush = 26;
bool ExportLoad = 27;
}
message ExportEntry {
@ -106,6 +105,11 @@ message Secret {
string Env = 3;
}
message PrintFunc {
string Name = 1;
string Format = 2;
}
message InspectRequest {
string Ref = 1;
}

@ -0,0 +1,37 @@
package buildflags
import (
"encoding/csv"
"strings"
controllerapi "github.com/docker/buildx/controller/pb"
"github.com/pkg/errors"
)
func ParsePrintFunc(str string) (*controllerapi.PrintFunc, error) {
if str == "" {
return nil, nil
}
csvReader := csv.NewReader(strings.NewReader(str))
fields, err := csvReader.Read()
if err != nil {
return nil, err
}
f := &controllerapi.PrintFunc{}
for _, field := range fields {
parts := strings.SplitN(field, "=", 2)
if len(parts) == 2 {
if parts[0] == "format" {
f.Format = parts[1]
} else {
return nil, errors.Errorf("invalid print field: %s", field)
}
} else {
if f.Name != "" {
return nil, errors.Errorf("invalid print value: %s", str)
}
f.Name = field
}
}
return f, nil
}
Loading…
Cancel
Save