bake: use controller to build

With this change we are now passing a list of controller options
to run a build and returns a map of responses and result context
as bake can handle a list of targets.

Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
pull/1861/head
CrazyMax 2 years ago committed by CrazyMax
parent 9387640676
commit 9df197046c
No known key found for this signature in database
GPG Key ID: 3248E46B6BB8C7F7

@ -15,7 +15,6 @@ import (
composecli "github.com/compose-spec/compose-go/cli"
"github.com/docker/buildx/bake/hclparser"
"github.com/docker/buildx/build"
cbuild "github.com/docker/buildx/controller/build"
controllerapi "github.com/docker/buildx/controller/pb"
"github.com/docker/buildx/util/buildflags"
hcl "github.com/hashicorp/hcl/v2"
@ -908,18 +907,14 @@ func (t *Target) GetName(ectx *hcl.EvalContext, block *hcl.Block, loadDeps func(
return value.AsString(), nil
}
func TargetsToBuildOpt(m map[string]*Target, inp *Input) (map[string]build.Options, error) {
m2 := make(map[string]build.Options, len(m))
func TargetsToControllerOptions(m map[string]*Target, inp *Input) (map[string]controllerapi.BuildOptions, error) {
m2 := make(map[string]controllerapi.BuildOptions, len(m))
for k, v := range m {
opts, err := toControllerOpt(v, inp)
if err != nil {
return nil, err
}
bo, err := cbuild.ToBuildOpts(*opts, nil)
if err != nil {
return nil, err
}
m2[k] = *bo
m2[k] = *opts
}
return m2, nil
}

@ -7,6 +7,7 @@ import (
"strings"
"testing"
"github.com/docker/buildx/controller/pb"
"github.com/stretchr/testify/require"
)
@ -390,7 +391,7 @@ func TestHCLCwdPrefix(t *testing.T) {
_, ok := m["app"]
require.True(t, ok)
_, err = TargetsToBuildOpt(m, &Input{})
_, err = TargetsToControllerOptions(m, &Input{})
require.NoError(t, err)
require.Equal(t, "test", *m["app"].Dockerfile)
@ -421,7 +422,7 @@ func TestOverrideMerge(t *testing.T) {
_, ok := m["app"]
require.True(t, ok)
_, err = TargetsToBuildOpt(m, &Input{})
_, err = TargetsToControllerOptions(m, &Input{})
require.NoError(t, err)
require.Equal(t, []string{"linux/arm", "linux/ppc64le"}, m["app"].Platforms)
@ -456,7 +457,7 @@ func TestReadContexts(t *testing.T) {
_, ok := m["app"]
require.True(t, ok)
bo, err := TargetsToBuildOpt(m, &Input{})
bo, err := TargetsToControllerOptions(m, &Input{})
require.NoError(t, err)
ctxs := bo["app"].Inputs.NamedContexts
@ -472,7 +473,7 @@ func TestReadContexts(t *testing.T) {
_, ok = m["app"]
require.True(t, ok)
bo, err = TargetsToBuildOpt(m, &Input{})
bo, err = TargetsToControllerOptions(m, &Input{})
require.NoError(t, err)
ctxs = bo["app"].Inputs.NamedContexts
@ -490,7 +491,7 @@ func TestReadContexts(t *testing.T) {
_, ok = m["app"]
require.True(t, ok)
bo, err = TargetsToBuildOpt(m, &Input{})
bo, err = TargetsToControllerOptions(m, &Input{})
require.NoError(t, err)
ctxs = bo["app"].Inputs.NamedContexts
@ -1325,7 +1326,7 @@ func TestHCLNullVars(t *testing.T) {
_, ok := m["default"]
require.True(t, ok)
_, err = TargetsToBuildOpt(m, &Input{})
_, err = TargetsToControllerOptions(m, &Input{})
require.NoError(t, err)
require.Equal(t, map[string]*string{"bar": ptrstr("baz")}, m["default"].Args)
require.Equal(t, map[string]*string{"com.docker.app.baz": ptrstr("foo")}, m["default"].Labels)
@ -1360,7 +1361,7 @@ func TestJSONNullVars(t *testing.T) {
_, ok := m["default"]
require.True(t, ok)
_, err = TargetsToBuildOpt(m, &Input{})
_, err = TargetsToControllerOptions(m, &Input{})
require.NoError(t, err)
require.Equal(t, map[string]*string{"bar": ptrstr("baz")}, m["default"].Args)
}
@ -1432,21 +1433,34 @@ func TestAttestDuplicates(t *testing.T) {
require.Equal(t, []string{"type=sbom,foo=bar", "type=provenance,mode=max"}, m["default"].Attest)
require.NoError(t, err)
opts, err := TargetsToBuildOpt(m, &Input{})
opts, err := TargetsToControllerOptions(m, &Input{})
require.NoError(t, err)
require.Equal(t, map[string]*string{
"sbom": ptrstr("type=sbom,foo=bar"),
"provenance": ptrstr("type=provenance,mode=max"),
require.Equal(t, []*pb.Attest{
{
Type: "sbom",
Attrs: "type=sbom,foo=bar",
},
{
Type: "provenance",
Attrs: "type=provenance,mode=max",
},
}, opts["default"].Attests)
m, _, err = ReadTargets(ctx, []File{fp}, []string{"default"}, []string{"*.attest=type=sbom,disabled=true"}, nil)
require.Equal(t, []string{"type=sbom,disabled=true", "type=provenance,mode=max"}, m["default"].Attest)
require.NoError(t, err)
opts, err = TargetsToBuildOpt(m, &Input{})
opts, err = TargetsToControllerOptions(m, &Input{})
require.NoError(t, err)
require.Equal(t, map[string]*string{
"sbom": nil,
"provenance": ptrstr("type=provenance,mode=max"),
require.Equal(t, []*pb.Attest{
{
Type: "sbom",
Disabled: true,
Attrs: "type=sbom,disabled=true",
},
{
Type: "provenance",
Attrs: "type=provenance,mode=max",
},
}, opts["default"].Attests)
}

@ -668,7 +668,7 @@ func Build(ctx context.Context, nodes []builder.Node, opt map[string]Options, do
return BuildWithResultHandler(ctx, nodes, opt, docker, configDir, w, nil)
}
func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[string]Options, docker *dockerutil.Client, configDir string, w progress.Writer, resultHandleFunc func(driverIndex int, rCtx *ResultHandle)) (resp map[string]*client.SolveResponse, err error) {
func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[string]Options, docker *dockerutil.Client, configDir string, w progress.Writer, resultHandleFunc func(target string, rCtx *ResultHandle)) (resp map[string]*client.SolveResponse, err error) {
if len(nodes) == 0 {
return nil, errors.Errorf("driver required for build")
}
@ -938,7 +938,7 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s
if resultHandleFunc != nil {
var resultHandle *ResultHandle
resultHandle, rr, err = NewResultHandle(ctx, cc, so, "buildx", buildFunc, ch)
resultHandleFunc(dp.driverIndex, resultHandle)
resultHandleFunc(k, resultHandle)
} else {
rr, err = c.Build(ctx, so, "buildx", buildFunc, ch)
}

@ -11,11 +11,11 @@ import (
"github.com/docker/buildx/bake"
"github.com/docker/buildx/build"
"github.com/docker/buildx/builder"
cbuild "github.com/docker/buildx/controller/build"
controllerapi "github.com/docker/buildx/controller/pb"
"github.com/docker/buildx/util/buildflags"
"github.com/docker/buildx/util/cobrautil/completion"
"github.com/docker/buildx/util/confutil"
"github.com/docker/buildx/util/desktop"
"github.com/docker/buildx/util/dockerutil"
"github.com/docker/buildx/util/progress"
"github.com/docker/buildx/util/tracing"
"github.com/docker/cli/cli/command"
@ -31,10 +31,8 @@ type bakeOptions struct {
sbom string
provenance string
builder string
metadataFile string
exportPush bool
exportLoad bool
controllerapi.CommonOptions
//control.ControlOptions
}
func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags commonFlags) (err error) {
@ -69,12 +67,12 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com
}
overrides := in.overrides
if in.exportPush {
if in.exportLoad {
if in.ExportPush {
if in.ExportLoad {
return errors.Errorf("push and load may not be set together at the moment")
}
overrides = append(overrides, "*.push=true")
} else if in.exportLoad {
} else if in.ExportLoad {
overrides = append(overrides, "*.output=type=docker")
}
if cFlags.noCache != nil {
@ -102,7 +100,7 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com
// instance only needed for reading remote bake files or building
if url != "" || !in.printOnly {
b, err := builder.New(dockerCli,
builder.WithName(in.builder),
builder.WithName(in.Builder),
builder.WithContextPathHash(contextPathHash),
)
if err != nil {
@ -176,11 +174,19 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com
}
// this function can update target context string from the input so call before printOnly check
bo, err := bake.TargetsToBuildOpt(tgts, inp)
opts, err := bake.TargetsToControllerOptions(tgts, inp)
if err != nil {
return err
}
// set builder name and context hash for all targets
updatedOpts := make(map[string]controllerapi.BuildOptions, len(opts))
for i, opt := range opts {
opt.Opts.Builder = in.Builder
opt.Inputs.ContextPathHash = contextPathHash
updatedOpts[i] = opt
}
if in.printOnly {
dt, err := json.MarshalIndent(struct {
Group map[string]*bake.Group `json:"group,omitempty"`
@ -201,17 +207,17 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com
return nil
}
resp, err := build.Build(ctx, nodes, bo, dockerutil.NewClient(dockerCli), confutil.ConfigDir(dockerCli), printer)
resp, _, err := cbuild.RunBuilds(ctx, dockerCli, updatedOpts, os.Stdin, printer, false)
if err != nil {
return wrapBuildError(err, true)
}
if len(in.metadataFile) > 0 {
if len(in.MetadataFile) > 0 {
dt := make(map[string]interface{})
for t, r := range resp {
dt[t] = decodeExporterResponse(r.ExporterResponse)
}
if err := writeMetadataFile(in.metadataFile, dt); err != nil {
if err := writeMetadataFile(in.MetadataFile, dt); err != nil {
return err
}
}
@ -235,8 +241,8 @@ func bakeCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
if !cmd.Flags().Lookup("pull").Changed {
cFlags.pull = nil
}
options.builder = rootOpts.builder
options.metadataFile = cFlags.metadataFile
options.Builder = rootOpts.builder
options.MetadataFile = cFlags.metadataFile
// Other common flags (noCache, pull and progress) are processed in runBake function.
return runBake(dockerCli, args, options, cFlags)
},
@ -246,9 +252,9 @@ func bakeCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
flags := cmd.Flags()
flags.StringArrayVarP(&options.files, "file", "f", []string{}, "Build definition file")
flags.BoolVar(&options.exportLoad, "load", false, `Shorthand for "--set=*.output=type=docker"`)
flags.BoolVar(&options.ExportLoad, "load", false, `Shorthand for "--set=*.output=type=docker"`)
flags.BoolVar(&options.printOnly, "print", false, "Print the options without building")
flags.BoolVar(&options.exportPush, "push", false, `Shorthand for "--set=*.output=type=registry"`)
flags.BoolVar(&options.ExportPush, "push", false, `Shorthand for "--set=*.output=type=registry"`)
flags.StringVar(&options.sbom, "sbom", "", `Shorthand for "--set=*.attest=type=sbom"`)
flags.StringVar(&options.provenance, "provenance", "", `Shorthand for "--set=*.attest=type=provenance"`)
flags.StringArrayVar(&options.overrides, "set", nil, `Override target value (e.g., "targetpattern.key=value")`)

@ -94,8 +94,12 @@ func (o *buildOptions) toControllerOptions() (*controllerapi.BuildOptions, error
var err error
inputs := controllerapi.Inputs{
ContextPath: o.contextPath,
DockerfileName: o.dockerfileName,
ContextPath: o.contextPath,
ContextPathHash: o.contextPath,
DockerfileName: o.dockerfileName,
}
if absContextPath, err := filepath.Abs(inputs.ContextPathHash); err == nil {
inputs.ContextPathHash = absContextPath
}
inputs.NamedContexts, err = buildflags.ParseContextNames(o.contexts)
if err != nil {
@ -218,13 +222,9 @@ func runBuild(dockerCli command.Cli, options buildOptions) (err error) {
}
}
contextPathHash := options.contextPath
if absContextPath, err := filepath.Abs(contextPathHash); err == nil {
contextPathHash = absContextPath
}
b, err := builder.New(dockerCli,
builder.WithName(options.Builder),
builder.WithContextPathHash(contextPathHash),
builder.WithContextPathHash(opts.Inputs.ContextPathHash),
)
if err != nil {
return err

@ -4,7 +4,6 @@ import (
"context"
"io"
"os"
"path/filepath"
"strings"
"sync"
@ -27,6 +26,7 @@ import (
"github.com/moby/buildkit/session/auth/authprovider"
"github.com/moby/buildkit/util/grpcerrors"
"github.com/pkg/errors"
"golang.org/x/sync/errgroup"
"google.golang.org/grpc/codes"
)
@ -38,19 +38,56 @@ const defaultTargetName = "default"
// 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 RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.BuildOptions, inStream io.Reader, progress progress.Writer, generateResult bool) (*client.SolveResponse, *build.ResultHandle, error) {
opts, err := ToBuildOpts(in, inStream)
if err != nil {
return nil, nil, err
cResp, cRes, err := RunBuilds(ctx, dockerCli, map[string]controllerapi.BuildOptions{defaultTargetName: in}, inStream, progress, generateResult)
var resp *client.SolveResponse
if v, ok := cResp[defaultTargetName]; ok {
resp = v
}
var res *build.ResultHandle
if v, ok := cRes[defaultTargetName]; ok {
res = v
}
return resp, res, err
}
// key string used for kubernetes "sticky" mode
contextPathHash, err := filepath.Abs(in.Inputs.ContextPath)
if err != nil {
contextPathHash = in.Inputs.ContextPath
// RunBuilds same as RunBuild but runs multiple builds.
func RunBuilds(ctx context.Context, dockerCli command.Cli, in map[string]controllerapi.BuildOptions, inStream io.Reader, progress progress.Writer, generateResult bool) (map[string]*client.SolveResponse, map[string]*build.ResultHandle, error) {
var err error
var builderName string
var contextPathHash string
opts := make(map[string]build.Options, len(in))
mu := sync.Mutex{}
eg, _ := errgroup.WithContext(ctx)
for t, o := range in {
func(t string, o controllerapi.BuildOptions) {
eg.Go(func() error {
opt, err := ToBuildOpts(o, inStream)
if err != nil {
return err
}
mu.Lock()
opts[t] = *opt
// we assume that all the targets are using the same builder and
// context path hash. This assumption is currently valid but, we
// may need to revisit this in the future.
if builderName == "" {
builderName = o.Opts.Builder
}
if contextPathHash == "" {
contextPathHash = o.Inputs.ContextPathHash
}
mu.Unlock()
return nil
})
}(t, o)
}
if err := eg.Wait(); err != nil {
return nil, nil, err
}
b, err := builder.New(dockerCli,
builder.WithName(in.Opts.Builder),
builder.WithName(builderName),
builder.WithContextPathHash(contextPathHash),
)
if err != nil {
@ -64,7 +101,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, generateResult)
resp, res, err := buildTargets(ctx, dockerCli, b.NodeGroup, nodes, opts, progress, generateResult)
err = wrapBuildError(err, false)
if err != nil {
return nil, nil, err
@ -216,19 +253,19 @@ func ToBuildOpts(in controllerapi.BuildOptions, inStream io.Reader) (*build.Opti
// NOTE: When an error happens during the build and this function acquires the debuggable *build.ResultHandle,
// 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, generateResult bool) (*client.SolveResponse, *build.ResultHandle, error) {
var res *build.ResultHandle
func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGroup, nodes []builder.Node, opts map[string]build.Options, progress progress.Writer, generateResult bool) (map[string]*client.SolveResponse, map[string]*build.ResultHandle, error) {
var res map[string]*build.ResultHandle
var resp map[string]*client.SolveResponse
var err error
if generateResult {
var mu sync.Mutex
var idx int
resp, err = build.BuildWithResultHandler(ctx, nodes, opts, dockerutil.NewClient(dockerCli), confutil.ConfigDir(dockerCli), progress, func(driverIndex int, gotRes *build.ResultHandle) {
resp, err = build.BuildWithResultHandler(ctx, nodes, opts, dockerutil.NewClient(dockerCli), confutil.ConfigDir(dockerCli), progress, func(target string, gotRes *build.ResultHandle) {
mu.Lock()
defer mu.Unlock()
if res == nil || driverIndex < idx {
idx, res = driverIndex, gotRes
if res == nil {
res = make(map[string]*build.ResultHandle)
}
res[target] = gotRes
})
} else {
resp, err = build.Build(ctx, nodes, opts, dockerutil.NewClient(dockerCli), confutil.ConfigDir(dockerCli), progress)
@ -236,7 +273,7 @@ func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGrou
if err != nil {
return nil, res, err
}
return resp[defaultTargetName], res, err
return resp, res, err
}
func wrapBuildError(err error, bake bool) error {

@ -273,10 +273,11 @@ func (m *BuildRequest) GetOptions() *BuildOptions {
type Inputs 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"`
DockerfileInline string `protobuf:"bytes,3,opt,name=DockerfileInline,proto3" json:"DockerfileInline,omitempty"`
ContextDefinition *pb.Definition `protobuf:"bytes,4,opt,name=ContextDefinition,proto3" json:"ContextDefinition,omitempty"`
NamedContexts map[string]*NamedContext `protobuf:"bytes,5,rep,name=NamedContexts,proto3" json:"NamedContexts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
ContextPathHash string `protobuf:"bytes,2,opt,name=ContextPathHash,proto3" json:"ContextPathHash,omitempty"`
DockerfileName string `protobuf:"bytes,3,opt,name=DockerfileName,proto3" json:"DockerfileName,omitempty"`
DockerfileInline string `protobuf:"bytes,4,opt,name=DockerfileInline,proto3" json:"DockerfileInline,omitempty"`
ContextDefinition *pb.Definition `protobuf:"bytes,5,opt,name=ContextDefinition,proto3" json:"ContextDefinition,omitempty"`
NamedContexts map[string]*NamedContext `protobuf:"bytes,6,rep,name=NamedContexts,proto3" json:"NamedContexts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -313,6 +314,13 @@ func (m *Inputs) GetContextPath() string {
return ""
}
func (m *Inputs) GetContextPathHash() string {
if m != nil {
return m.ContextPathHash
}
return ""
}
func (m *Inputs) GetDockerfileName() string {
if m != nil {
return m.DockerfileName
@ -2209,134 +2217,135 @@ func init() {
func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) }
var fileDescriptor_ed7f10298fa1d90f = []byte{
// 2030 bytes of a gzipped FileDescriptorProto
// 2044 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xdd, 0x72, 0xdb, 0xc6,
0x15, 0x2e, 0x48, 0x8a, 0x3f, 0x87, 0xa2, 0x2c, 0x6f, 0x65, 0x0f, 0x82, 0xb8, 0x89, 0x0c, 0xdb,
0xa9, 0x26, 0xce, 0x80, 0x89, 0x92, 0xd4, 0x76, 0xec, 0x5c, 0x48, 0x94, 0x38, 0x52, 0x46, 0x7f,
0xb3, 0x94, 0x9d, 0x69, 0x2f, 0x9a, 0x01, 0xc9, 0x15, 0x85, 0x21, 0x88, 0x45, 0xb1, 0x4b, 0xfd,
0xf4, 0xaa, 0x37, 0xbd, 0xeb, 0xf4, 0x3d, 0x3a, 0x7d, 0x84, 0xce, 0x74, 0xa6, 0xcf, 0xd0, 0xf7,
0xe8, 0xf4, 0xb6, 0x77, 0x9d, 0xfd, 0x01, 0x08, 0x88, 0x04, 0x24, 0xb5, 0x57, 0xdc, 0x3d, 0xf8,
0xbe, 0xb3, 0x7b, 0xce, 0x9e, 0x3d, 0xe7, 0x2c, 0x61, 0x75, 0x40, 0x03, 0x1e, 0x51, 0xdf, 0x27,
0x91, 0x13, 0x46, 0x94, 0x53, 0xb4, 0xd6, 0x9f, 0x7a, 0xfe, 0xf0, 0xca, 0x49, 0x7d, 0xb8, 0xf8,
0xca, 0x7a, 0x3b, 0xf2, 0xf8, 0xf9, 0xb4, 0xef, 0x0c, 0xe8, 0xa4, 0x3d, 0xa1, 0xfd, 0xeb, 0xb6,
0x44, 0x8d, 0x3d, 0xde, 0x76, 0x43, 0xaf, 0xcd, 0x48, 0x74, 0xe1, 0x0d, 0x08, 0x6b, 0x6b, 0x52,
0xfc, 0xab, 0x54, 0x5a, 0xdf, 0xe6, 0x92, 0x19, 0x9d, 0x46, 0x03, 0x12, 0x52, 0xdf, 0x1b, 0x5c,
0xb7, 0xc3, 0x7e, 0x5b, 0x8d, 0x34, 0xed, 0x8b, 0x02, 0x9a, 0x7f, 0x41, 0x22, 0x41, 0xa0, 0x21,
0x53, 0x68, 0x7b, 0x03, 0xd6, 0x0e, 0x3c, 0xc6, 0x4f, 0x22, 0x3a, 0x20, 0x8c, 0x11, 0x86, 0xc9,
0xef, 0xa6, 0x84, 0x71, 0xb4, 0x0a, 0x65, 0x4c, 0xce, 0x4c, 0x63, 0xdd, 0xd8, 0x68, 0x60, 0x31,
0xb4, 0x4f, 0xe0, 0xd1, 0x0d, 0x24, 0x0b, 0x69, 0xc0, 0x08, 0x7a, 0x05, 0x4b, 0xfb, 0xc1, 0x19,
0x65, 0xa6, 0xb1, 0x5e, 0xde, 0x68, 0x6e, 0x3e, 0x75, 0x16, 0xb9, 0xc2, 0xd1, 0x3c, 0x81, 0xc4,
0x0a, 0x6f, 0x33, 0x68, 0xa6, 0xa4, 0xe8, 0x09, 0x34, 0xe2, 0xe9, 0x8e, 0x5e, 0x78, 0x26, 0x40,
0x5d, 0x58, 0xde, 0x0f, 0x2e, 0xe8, 0x98, 0x74, 0x68, 0x70, 0xe6, 0x8d, 0xcc, 0xd2, 0xba, 0xb1,
0xd1, 0xdc, 0xb4, 0x17, 0x2f, 0x96, 0x46, 0xe2, 0x0c, 0xcf, 0xfe, 0x01, 0xcc, 0x1d, 0x8f, 0x0d,
0x68, 0x10, 0x90, 0x41, 0x6c, 0x4c, 0xae, 0xd1, 0xd9, 0x3d, 0x95, 0x6e, 0xec, 0xc9, 0xfe, 0x18,
0x3e, 0x5a, 0xa0, 0x4b, 0xb9, 0xc5, 0xfe, 0x2d, 0x2c, 0x6f, 0x8b, 0xbd, 0xe5, 0x2b, 0x7f, 0x07,
0xb5, 0xe3, 0x90, 0x7b, 0x34, 0x60, 0xc5, 0xd6, 0x48, 0x35, 0x1a, 0x89, 0x63, 0x8a, 0xfd, 0x9f,
0x12, 0x54, 0xf7, 0x83, 0x70, 0xca, 0x19, 0x5a, 0x87, 0x66, 0x87, 0x06, 0x9c, 0x5c, 0xf1, 0x13,
0x97, 0x9f, 0xeb, 0x25, 0xd2, 0x22, 0xf4, 0x19, 0xac, 0xec, 0xd0, 0xc1, 0x98, 0x44, 0x67, 0x9e,
0x4f, 0x8e, 0xdc, 0x09, 0xd1, 0xc6, 0xdc, 0x90, 0xa2, 0xcf, 0x61, 0x75, 0x26, 0xd9, 0x0f, 0x7c,
0x2f, 0x20, 0x66, 0x59, 0x22, 0xe7, 0xe4, 0xe8, 0x1d, 0x3c, 0xd4, 0x4b, 0xec, 0x90, 0x33, 0x2f,
0xf0, 0xc4, 0xb6, 0xcc, 0x8a, 0x34, 0x64, 0xc5, 0x09, 0xfb, 0xce, 0x4c, 0x8a, 0xe7, 0x81, 0xe8,
0x3d, 0xb4, 0xc4, 0x8a, 0x43, 0xfd, 0x85, 0x99, 0x4b, 0x32, 0x7a, 0xda, 0x79, 0x07, 0x2a, 0x0c,
0x75, 0x32, 0x8c, 0xdd, 0x80, 0x47, 0xd7, 0x38, 0xab, 0xc5, 0x1a, 0x02, 0x9a, 0x07, 0x09, 0xdf,
0x8f, 0xc9, 0x75, 0xec, 0xfb, 0x31, 0xb9, 0x46, 0xaf, 0x61, 0xe9, 0xc2, 0xf5, 0xa7, 0xa4, 0xd8,
0xf3, 0x69, 0x55, 0x58, 0x11, 0xbe, 0x2b, 0xbd, 0x36, 0xec, 0xbf, 0x37, 0xf4, 0xe1, 0xea, 0xc3,
0x40, 0xdf, 0xc4, 0x67, 0x21, 0xd7, 0x68, 0x6e, 0x3e, 0x29, 0x32, 0x03, 0xc7, 0xe7, 0xf6, 0xbd,
0x88, 0x2e, 0x2f, 0xe0, 0xdd, 0x69, 0x30, 0xd0, 0x1b, 0xf9, 0x34, 0xef, 0xf6, 0x68, 0x18, 0x9e,
0x31, 0xd0, 0x2b, 0xa8, 0x1c, 0x87, 0x9c, 0xc9, 0x03, 0x6a, 0x6e, 0x3e, 0x5b, 0xcc, 0xec, 0xd0,
0xc9, 0x84, 0x06, 0x71, 0xf4, 0x48, 0x02, 0x5a, 0x83, 0xa5, 0x2d, 0xdf, 0xa7, 0x97, 0x66, 0x65,
0xbd, 0xbc, 0xd1, 0xc0, 0x6a, 0x82, 0x7e, 0x05, 0xb5, 0x2d, 0xce, 0x09, 0x4b, 0xce, 0x22, 0xc7,
0x08, 0x05, 0xc2, 0x31, 0x18, 0x1d, 0x43, 0x43, 0xfa, 0x62, 0x2b, 0x1a, 0x31, 0xb3, 0x2a, 0x99,
0x5f, 0xdd, 0x1e, 0xc8, 0x4e, 0xc2, 0x51, 0xe7, 0x38, 0xd3, 0x81, 0x76, 0xa1, 0xd1, 0x71, 0x07,
0xe7, 0xa4, 0x1b, 0xd1, 0x89, 0x59, 0x93, 0x0a, 0x7f, 0x99, 0x63, 0x9c, 0x80, 0x69, 0x85, 0x5a,
0x4d, 0xc2, 0x44, 0x5b, 0x50, 0x93, 0x93, 0x53, 0x6a, 0xd6, 0xef, 0xa7, 0x24, 0xe6, 0x21, 0x1b,
0x96, 0x3b, 0xa3, 0x88, 0x4e, 0xc3, 0x13, 0x37, 0x22, 0x01, 0x37, 0x1b, 0x32, 0x80, 0x32, 0x32,
0xf4, 0x16, 0x6a, 0xbb, 0x57, 0x21, 0x8d, 0x38, 0x33, 0xa1, 0x28, 0x01, 0x2a, 0x90, 0x5e, 0x40,
0x33, 0xd0, 0x27, 0x00, 0xbb, 0x57, 0x3c, 0x72, 0xf7, 0xa8, 0x70, 0x7b, 0x53, 0x1e, 0x47, 0x4a,
0x82, 0xba, 0x50, 0x3d, 0x70, 0xfb, 0xc4, 0x67, 0xe6, 0xb2, 0xd4, 0xed, 0xdc, 0xc1, 0xb1, 0x8a,
0xa0, 0x16, 0xd2, 0x6c, 0x91, 0x21, 0x8e, 0x08, 0xbf, 0xa4, 0xd1, 0xf8, 0x90, 0x0e, 0x89, 0xd9,
0x52, 0x19, 0x22, 0x25, 0x42, 0xcf, 0xa1, 0x75, 0x44, 0x95, 0xf3, 0x3c, 0x9f, 0x93, 0xc8, 0x5c,
0x91, 0x9b, 0xc9, 0x0a, 0x65, 0x3e, 0xf4, 0x5d, 0x7e, 0x46, 0xa3, 0x09, 0x33, 0x1f, 0x48, 0xc4,
0x4c, 0x20, 0x22, 0xa8, 0x47, 0x06, 0x11, 0xe1, 0xcc, 0x5c, 0x2d, 0x8a, 0x20, 0x05, 0xc2, 0x31,
0x18, 0x99, 0x50, 0xeb, 0x9d, 0x4f, 0x7a, 0xde, 0xef, 0x89, 0xf9, 0x70, 0xdd, 0xd8, 0x28, 0xe3,
0x78, 0x8a, 0x5e, 0x42, 0xb9, 0xd7, 0xdb, 0x33, 0x91, 0xd4, 0xf6, 0x51, 0x8e, 0xb6, 0xde, 0x1e,
0x16, 0x28, 0x84, 0xa0, 0x72, 0xea, 0x8e, 0x98, 0xf9, 0x73, 0xb9, 0x2f, 0x39, 0x46, 0x8f, 0xa1,
0x7a, 0xea, 0x46, 0x23, 0xc2, 0xcd, 0x35, 0x69, 0xb3, 0x9e, 0xa1, 0x37, 0x50, 0x7b, 0xef, 0x7b,
0x13, 0x8f, 0x33, 0xf3, 0x51, 0xd1, 0xc5, 0x53, 0xa0, 0xe3, 0x90, 0xe3, 0x18, 0x8f, 0xf6, 0x61,
0xb9, 0x27, 0x0b, 0xf0, 0x89, 0x2c, 0xbb, 0xe6, 0x63, 0xc9, 0x7f, 0xe1, 0x88, 0x62, 0xeb, 0xc4,
0xc5, 0x56, 0x70, 0xd3, 0x65, 0xda, 0x51, 0x60, 0x9c, 0xa1, 0x5a, 0xef, 0x60, 0x25, 0x7b, 0x0d,
0x16, 0x64, 0xaa, 0xb5, 0x74, 0xa6, 0x6a, 0xa4, 0xb2, 0x90, 0xf5, 0x06, 0x9a, 0xa9, 0xb3, 0xbe,
0x0f, 0xd5, 0xc6, 0xb0, 0x9c, 0xce, 0x6d, 0xc2, 0x75, 0xa9, 0xd2, 0x21, 0xc7, 0xc8, 0x01, 0x48,
0x25, 0xf6, 0xd2, 0xc2, 0xc4, 0x9e, 0x42, 0xd8, 0xff, 0x34, 0xa0, 0x95, 0xc9, 0x36, 0xe2, 0x5c,
0xa5, 0x79, 0x24, 0xd2, 0x8a, 0xe3, 0xa9, 0xb8, 0x58, 0x87, 0x84, 0xbb, 0x43, 0x97, 0xbb, 0x5d,
0xcf, 0x8f, 0x37, 0x98, 0x91, 0x09, 0xb6, 0x0e, 0x3e, 0x99, 0xe1, 0xea, 0x38, 0x9e, 0xca, 0xdd,
0x4e, 0x7d, 0x5f, 0x16, 0x9b, 0x3a, 0x96, 0x63, 0x75, 0x93, 0xc4, 0xa5, 0x3a, 0x99, 0xb2, 0x73,
0x73, 0x49, 0x7e, 0x49, 0x49, 0x66, 0xdf, 0x0f, 0xa8, 0x3b, 0x34, 0xab, 0xe9, 0xef, 0x42, 0x22,
0x02, 0xe5, 0xc0, 0x0b, 0xc6, 0x64, 0x68, 0xd6, 0xe4, 0x37, 0x3d, 0xb3, 0xff, 0x61, 0x40, 0x33,
0x75, 0x75, 0x65, 0x90, 0x5d, 0x87, 0x24, 0xf6, 0x94, 0x18, 0xa3, 0x6d, 0x58, 0xda, 0xe2, 0x3c,
0x12, 0x65, 0x5c, 0xc4, 0xe9, 0x17, 0xb7, 0x26, 0x00, 0x47, 0xc2, 0xd5, 0x15, 0x55, 0x54, 0x71,
0x43, 0x77, 0x08, 0xe3, 0x5e, 0xe0, 0x4a, 0x77, 0xab, 0xa2, 0x9b, 0x16, 0x59, 0xaf, 0x01, 0x66,
0xb4, 0x7b, 0x9d, 0xf6, 0x5f, 0x0d, 0x78, 0x38, 0x97, 0xe5, 0x16, 0x5a, 0xb2, 0x97, 0xb5, 0x64,
0xf3, 0x8e, 0x19, 0x73, 0xde, 0x9e, 0xff, 0x63, 0xb7, 0x47, 0x50, 0x55, 0xa5, 0x65, 0xe1, 0x0e,
0x2d, 0xa8, 0xef, 0x78, 0xcc, 0xed, 0xfb, 0x64, 0x28, 0xa9, 0x75, 0x9c, 0xcc, 0x65, 0x5d, 0x93,
0xbb, 0x57, 0xde, 0x53, 0x13, 0x5b, 0xe5, 0x10, 0xb4, 0x02, 0xa5, 0xa4, 0xaf, 0x2c, 0xed, 0xef,
0x08, 0xb0, 0x08, 0x73, 0x65, 0x6a, 0x03, 0xab, 0x89, 0xdd, 0x85, 0xaa, 0xca, 0x4a, 0x73, 0x78,
0x0b, 0xea, 0x22, 0x2c, 0xe5, 0x35, 0x51, 0x7b, 0x4e, 0xe6, 0xc2, 0xbc, 0xdd, 0xe0, 0x42, 0x2f,
0x2b, 0x86, 0xf6, 0xab, 0x54, 0x69, 0x17, 0x76, 0xc8, 0x9e, 0x4b, 0xdb, 0x21, 0x3b, 0xad, 0xc7,
0x50, 0xed, 0xd2, 0x68, 0xe2, 0x72, 0xad, 0x4c, 0xcf, 0x6c, 0x1b, 0x56, 0xf6, 0x03, 0x16, 0x92,
0x01, 0xcf, 0x6f, 0xc5, 0x8f, 0xe1, 0x41, 0x82, 0xd1, 0x4d, 0x78, 0xaa, 0x97, 0x34, 0xee, 0xdf,
0x4b, 0xfe, 0xc5, 0x80, 0x46, 0x92, 0xe9, 0x50, 0x07, 0xaa, 0xf2, 0x34, 0xe2, 0x8e, 0xfe, 0xe5,
0x2d, 0xa9, 0xd1, 0xf9, 0x20, 0xd1, 0xba, 0xe2, 0x28, 0xaa, 0xf5, 0x23, 0x34, 0x53, 0xe2, 0x05,
0x01, 0xb0, 0x99, 0xed, 0xc0, 0x9e, 0x14, 0x2d, 0x92, 0x0e, 0x8f, 0x1d, 0xa8, 0x2a, 0xe1, 0x42,
0xb7, 0x22, 0xa8, 0xec, 0xb9, 0x91, 0x0a, 0x8d, 0x32, 0x96, 0x63, 0x21, 0xeb, 0xd1, 0x33, 0x2e,
0x8f, 0xa7, 0x8c, 0xe5, 0xd8, 0xfe, 0x9b, 0x01, 0x2d, 0xdd, 0x9e, 0x6b, 0x0f, 0x12, 0x58, 0x55,
0x37, 0x94, 0x44, 0xb1, 0x4c, 0xdb, 0xff, 0xa6, 0xc0, 0x95, 0x31, 0xd4, 0xb9, 0xc9, 0x55, 0xde,
0x98, 0x53, 0x69, 0x75, 0xe0, 0xd1, 0x42, 0xe8, 0xbd, 0xae, 0xc8, 0x0b, 0x78, 0x38, 0x7b, 0x78,
0xe4, 0xc7, 0xc9, 0x1a, 0xa0, 0x34, 0x4c, 0x3f, 0x4c, 0x3e, 0x85, 0xa6, 0x78, 0xc8, 0xe5, 0xd3,
0x6c, 0x58, 0x56, 0x00, 0xed, 0x19, 0x04, 0x95, 0x31, 0xb9, 0x56, 0xd1, 0xd0, 0xc0, 0x72, 0x6c,
0xff, 0xd9, 0x10, 0xef, 0xb1, 0x70, 0xca, 0x0f, 0x09, 0x63, 0xee, 0x48, 0x04, 0x60, 0x65, 0x3f,
0xf0, 0xb8, 0x8e, 0xbe, 0xcf, 0x0a, 0xfa, 0x5f, 0x01, 0xd3, 0xac, 0xbd, 0x9f, 0x61, 0xc9, 0x12,
0xad, 0xec, 0x8e, 0xcb, 0x5d, 0x1d, 0x0b, 0x39, 0x1d, 0x94, 0x40, 0xa4, 0x88, 0x62, 0xba, 0x5d,
0x13, 0x8f, 0xcf, 0x70, 0xca, 0xed, 0xe7, 0xb0, 0x7a, 0x53, 0xfb, 0x02, 0xd3, 0xbe, 0x86, 0x66,
0x4a, 0x8b, 0xbc, 0xb7, 0xc7, 0x5d, 0x09, 0xa8, 0x63, 0x31, 0x14, 0xb6, 0x26, 0x1b, 0x59, 0x56,
0x6b, 0xd8, 0x0f, 0xa0, 0x25, 0x55, 0x27, 0x1e, 0xfc, 0x43, 0x09, 0x6a, 0xb1, 0x8a, 0x57, 0x19,
0xbb, 0x9f, 0xe6, 0xd9, 0x3d, 0x6f, 0xf2, 0xb7, 0x50, 0x49, 0x4a, 0x5f, 0x6e, 0xfb, 0xd1, 0x1d,
0xa6, 0x68, 0xb2, 0x2a, 0x7e, 0x0f, 0x55, 0x4c, 0x98, 0x68, 0x95, 0x0a, 0xdb, 0x7e, 0x85, 0x99,
0x91, 0x35, 0x49, 0xd0, 0x7b, 0xde, 0x28, 0x70, 0x7d, 0xfd, 0x52, 0xcb, 0xa1, 0x2b, 0x4c, 0x8a,
0xae, 0x04, 0x33, 0x77, 0xff, 0xd1, 0x80, 0x66, 0xa1, 0xab, 0x8b, 0x9f, 0xce, 0x73, 0xcf, 0xf9,
0xf2, 0xff, 0xf8, 0x9c, 0xff, 0x97, 0x91, 0x55, 0x24, 0xeb, 0xbc, 0xb8, 0x4f, 0x21, 0xf5, 0x02,
0xae, 0x43, 0x36, 0x25, 0x11, 0x1b, 0xed, 0x4c, 0x86, 0x3a, 0xe9, 0x8b, 0xe1, 0x2c, 0x79, 0x97,
0x75, 0xf2, 0x16, 0x41, 0xf0, 0x9e, 0x91, 0x48, 0xba, 0xa8, 0x81, 0xe5, 0x58, 0xe4, 0xeb, 0x23,
0x2a, 0xa5, 0xaa, 0xb7, 0xd0, 0x33, 0xa9, 0xef, 0x52, 0x35, 0x14, 0x42, 0xdf, 0xa5, 0xac, 0x42,
0x47, 0x54, 0xc8, 0x54, 0x23, 0xa1, 0x26, 0x02, 0x77, 0xca, 0xaf, 0xcd, 0xba, 0x0a, 0xb5, 0x53,
0x7e, 0x2d, 0x0a, 0x0a, 0xa6, 0xbe, 0xdf, 0x77, 0x07, 0x63, 0xf9, 0xb0, 0xa8, 0xe3, 0x64, 0x2e,
0x7a, 0x1f, 0xe1, 0x5d, 0xcf, 0xf5, 0x4d, 0x50, 0xbd, 0x8f, 0x9e, 0xda, 0x5b, 0xd0, 0x48, 0x82,
0x42, 0xd4, 0xa8, 0xee, 0x50, 0x3a, 0xbd, 0x85, 0x4b, 0xdd, 0x61, 0x1c, 0xcf, 0xa5, 0xf9, 0x78,
0x2e, 0xa7, 0xe2, 0xf9, 0x15, 0xb4, 0x32, 0xe1, 0x21, 0x40, 0x98, 0x5e, 0x32, 0xad, 0x48, 0x8e,
0x85, 0xac, 0x43, 0x7d, 0xf5, 0xcf, 0x44, 0x0b, 0xcb, 0xb1, 0xfd, 0x0c, 0x5a, 0x99, 0xc0, 0x58,
0x94, 0x81, 0xed, 0xa7, 0xd0, 0xea, 0x71, 0x97, 0x4f, 0x0b, 0xfe, 0x4a, 0xfa, 0xb7, 0x01, 0x2b,
0x31, 0x46, 0xe7, 0x98, 0x6f, 0xa0, 0x7e, 0x41, 0x22, 0x4e, 0xae, 0x92, 0xaa, 0x63, 0xce, 0x37,
0xd4, 0x1f, 0x24, 0x02, 0x27, 0x48, 0xf4, 0x1d, 0xd4, 0x99, 0xd4, 0x43, 0xe2, 0x8e, 0xe5, 0x93,
0x3c, 0x96, 0x5e, 0x2f, 0xc1, 0xa3, 0x36, 0x54, 0x7c, 0x3a, 0x62, 0xf2, 0xdc, 0x9b, 0x9b, 0x1f,
0xe7, 0xf1, 0x0e, 0xe8, 0x08, 0x4b, 0x20, 0x7a, 0x0b, 0xf5, 0x4b, 0x37, 0x0a, 0xbc, 0x60, 0xc4,
0xe4, 0xc3, 0x59, 0x5c, 0xda, 0x1c, 0xd2, 0x8f, 0x0a, 0x87, 0x13, 0x82, 0xdd, 0x12, 0xd7, 0xe5,
0x8c, 0x6a, 0x9f, 0xd8, 0xbf, 0x16, 0x51, 0x2b, 0xa6, 0xda, 0xfc, 0x7d, 0x68, 0xa9, 0xc8, 0xff,
0x40, 0x22, 0x26, 0xfa, 0x3f, 0xa3, 0xe8, 0x76, 0x6e, 0xa7, 0xa1, 0x38, 0xcb, 0xb4, 0x7f, 0xd2,
0x85, 0x2d, 0x16, 0x88, 0x58, 0x0a, 0xdd, 0xc1, 0xd8, 0x1d, 0xc5, 0xe7, 0x14, 0x4f, 0xc5, 0x97,
0x0b, 0xbd, 0x9e, 0xba, 0xa0, 0xf1, 0x54, 0xc4, 0x66, 0x44, 0x2e, 0x3c, 0x36, 0x6b, 0x45, 0x93,
0xf9, 0xe6, 0x9f, 0x6a, 0x00, 0x9d, 0x64, 0x3f, 0xe8, 0x04, 0x96, 0xe4, 0x7a, 0xc8, 0x2e, 0x2c,
0x93, 0xd2, 0x6e, 0xeb, 0xd9, 0x1d, 0x4a, 0x29, 0xfa, 0x20, 0x82, 0x5f, 0xb6, 0x37, 0xe8, 0x79,
0x5e, 0x42, 0x48, 0x77, 0x48, 0xd6, 0x8b, 0x5b, 0x50, 0x5a, 0xef, 0x7b, 0xa8, 0xaa, 0x28, 0x40,
0x79, 0x59, 0x2f, 0x1d, 0xb7, 0xd6, 0xf3, 0x62, 0x90, 0x52, 0xfa, 0xa5, 0x81, 0xb0, 0xce, 0x89,
0xc8, 0x2e, 0x28, 0x7a, 0xfa, 0xc6, 0xe4, 0x39, 0x20, 0x53, 0x5f, 0x36, 0x0c, 0xf4, 0x03, 0x54,
0x55, 0x56, 0x43, 0xbf, 0x58, 0x4c, 0x88, 0xf5, 0x15, 0x7f, 0xde, 0x30, 0xbe, 0x34, 0xd0, 0x21,
0x54, 0x44, 0x39, 0x47, 0x39, 0xb5, 0x29, 0xd5, 0x0b, 0x58, 0x76, 0x11, 0x44, 0x7b, 0xf1, 0x27,
0x80, 0x59, 0x53, 0x81, 0x72, 0xfe, 0x53, 0x99, 0xeb, 0x4e, 0xac, 0x8d, 0xdb, 0x81, 0x7a, 0x81,
0x43, 0x51, 0x51, 0xcf, 0x28, 0xca, 0xad, 0xa5, 0xc9, 0x35, 0xb2, 0xec, 0x22, 0x88, 0x56, 0x77,
0x0e, 0xad, 0xcc, 0xff, 0xd6, 0xe8, 0xf3, 0x7c, 0x23, 0x6f, 0xfe, 0x0d, 0x6e, 0xbd, 0xbc, 0x13,
0x56, 0xaf, 0xc4, 0xd3, 0x5d, 0x99, 0xfe, 0x8c, 0x9c, 0xdb, 0xec, 0xce, 0xfe, 0x07, 0x6d, 0xb5,
0xef, 0x8c, 0x57, 0xab, 0x6e, 0x57, 0x7e, 0x53, 0x0a, 0xfb, 0xfd, 0xaa, 0xfc, 0x3b, 0xff, 0xeb,
0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x09, 0xb4, 0x4e, 0xa7, 0x9a, 0x18, 0x00, 0x00,
0x15, 0x2e, 0x48, 0x8a, 0x3f, 0x87, 0xa2, 0x2c, 0x6f, 0x65, 0x0f, 0xc2, 0xb8, 0x89, 0x0c, 0xdb,
0x29, 0x27, 0xce, 0x80, 0x89, 0x92, 0xd4, 0x76, 0xec, 0x5c, 0x48, 0x94, 0x38, 0x52, 0x46, 0x7f,
0xb3, 0x94, 0x9d, 0x69, 0x2f, 0x9a, 0x01, 0xc9, 0x15, 0x85, 0x21, 0x88, 0x45, 0xb1, 0x4b, 0x49,
0xec, 0x55, 0x6f, 0x7a, 0xd7, 0xe9, 0x4b, 0xf4, 0xaa, 0xd3, 0x47, 0xe8, 0x4c, 0x67, 0xfa, 0x0c,
0x7d, 0x8f, 0x4e, 0x1f, 0xa1, 0xb3, 0x3f, 0x00, 0x01, 0x91, 0x80, 0xa4, 0xf6, 0x8a, 0xbb, 0x07,
0xdf, 0x77, 0x76, 0xcf, 0xd9, 0xb3, 0xe7, 0x9c, 0x25, 0xac, 0x0f, 0xa8, 0xcf, 0x43, 0xea, 0x79,
0x24, 0xb4, 0x83, 0x90, 0x72, 0x8a, 0x36, 0xfa, 0x53, 0xd7, 0x1b, 0x5e, 0xdb, 0x89, 0x0f, 0x97,
0x5f, 0x35, 0xdf, 0x8e, 0x5c, 0x7e, 0x31, 0xed, 0xdb, 0x03, 0x3a, 0x69, 0x4f, 0x68, 0x7f, 0xd6,
0x96, 0xa8, 0xb1, 0xcb, 0xdb, 0x4e, 0xe0, 0xb6, 0x19, 0x09, 0x2f, 0xdd, 0x01, 0x61, 0x6d, 0x4d,
0x8a, 0x7e, 0x95, 0xca, 0xe6, 0xb7, 0x99, 0x64, 0x46, 0xa7, 0xe1, 0x80, 0x04, 0xd4, 0x73, 0x07,
0xb3, 0x76, 0xd0, 0x6f, 0xab, 0x91, 0xa6, 0x7d, 0x91, 0x43, 0xf3, 0x2e, 0x49, 0x28, 0x08, 0x34,
0x60, 0x0a, 0x6d, 0xb5, 0x60, 0xe3, 0xd0, 0x65, 0xfc, 0x34, 0xa4, 0x03, 0xc2, 0x18, 0x61, 0x98,
0xfc, 0x6e, 0x4a, 0x18, 0x47, 0xeb, 0x50, 0xc4, 0xe4, 0xdc, 0x34, 0x36, 0x8d, 0x56, 0x0d, 0x8b,
0xa1, 0x75, 0x0a, 0x8f, 0x6e, 0x20, 0x59, 0x40, 0x7d, 0x46, 0xd0, 0x2b, 0x58, 0x39, 0xf0, 0xcf,
0x29, 0x33, 0x8d, 0xcd, 0x62, 0xab, 0xbe, 0xf5, 0xd4, 0x5e, 0xe6, 0x0a, 0x5b, 0xf3, 0x04, 0x12,
0x2b, 0xbc, 0xc5, 0xa0, 0x9e, 0x90, 0xa2, 0x27, 0x50, 0x8b, 0xa6, 0xbb, 0x7a, 0xe1, 0xb9, 0x00,
0x75, 0x61, 0xf5, 0xc0, 0xbf, 0xa4, 0x63, 0xd2, 0xa1, 0xfe, 0xb9, 0x3b, 0x32, 0x0b, 0x9b, 0x46,
0xab, 0xbe, 0x65, 0x2d, 0x5f, 0x2c, 0x89, 0xc4, 0x29, 0x9e, 0xf5, 0x03, 0x98, 0xbb, 0x2e, 0x1b,
0x50, 0xdf, 0x27, 0x83, 0xc8, 0x98, 0x4c, 0xa3, 0xd3, 0x7b, 0x2a, 0xdc, 0xd8, 0x93, 0xf5, 0x31,
0x7c, 0xb4, 0x44, 0x97, 0x72, 0x8b, 0xf5, 0x5b, 0x58, 0xdd, 0x11, 0x7b, 0xcb, 0x56, 0xfe, 0x0e,
0x2a, 0x27, 0x01, 0x77, 0xa9, 0xcf, 0xf2, 0xad, 0x91, 0x6a, 0x34, 0x12, 0x47, 0x14, 0xeb, 0x2f,
0x45, 0x28, 0x1f, 0xf8, 0xc1, 0x94, 0x33, 0xb4, 0x09, 0xf5, 0x0e, 0xf5, 0x39, 0xb9, 0xe6, 0xa7,
0x0e, 0xbf, 0xd0, 0x4b, 0x24, 0x45, 0xa8, 0x05, 0x0f, 0x12, 0xd3, 0x7d, 0x87, 0x5d, 0x68, 0x6b,
0x6e, 0x8a, 0xd1, 0x67, 0xb0, 0xb6, 0x4b, 0x07, 0x63, 0x12, 0x9e, 0xbb, 0x1e, 0x39, 0x76, 0x26,
0xc4, 0x2c, 0x4a, 0xe0, 0x0d, 0x29, 0xfa, 0x1c, 0xd6, 0xe7, 0x92, 0x03, 0xdf, 0x73, 0x7d, 0x62,
0x96, 0x24, 0x72, 0x41, 0x8e, 0xde, 0xc1, 0x43, 0xbd, 0xcc, 0x2e, 0x39, 0x77, 0x7d, 0x57, 0x18,
0x60, 0xae, 0x48, 0x93, 0xd7, 0xec, 0xa0, 0x6f, 0xcf, 0xa5, 0x78, 0x11, 0x88, 0xde, 0x43, 0x43,
0xac, 0x38, 0xd4, 0x5f, 0x98, 0x59, 0x96, 0x71, 0xd6, 0xce, 0x3a, 0x7a, 0xe1, 0x12, 0x3b, 0xc5,
0xd8, 0xf3, 0x79, 0x38, 0xc3, 0x69, 0x2d, 0xcd, 0x21, 0xa0, 0x45, 0x90, 0x38, 0xa5, 0x31, 0x99,
0x45, 0xa7, 0x34, 0x26, 0x33, 0xf4, 0x1a, 0x56, 0x2e, 0x1d, 0x6f, 0x4a, 0xf2, 0xcf, 0x28, 0xa9,
0x0a, 0x2b, 0xc2, 0x77, 0x85, 0xd7, 0x86, 0xf5, 0x8f, 0x9a, 0x0e, 0x03, 0x7d, 0x6c, 0xe8, 0x9b,
0xe8, 0xd4, 0xe4, 0x1a, 0xf5, 0xad, 0x27, 0x79, 0x66, 0xe0, 0xe8, 0x84, 0xbf, 0x17, 0x71, 0xe8,
0xfa, 0xbc, 0x3b, 0xf5, 0x07, 0x7a, 0x23, 0x9f, 0x66, 0xdd, 0x33, 0x0d, 0xc3, 0x73, 0x06, 0x7a,
0x05, 0xa5, 0x93, 0x80, 0x33, 0x79, 0x94, 0xf5, 0xad, 0x67, 0xcb, 0x99, 0x1d, 0x3a, 0x99, 0x50,
0x3f, 0x8a, 0x33, 0x49, 0x40, 0x1b, 0xb0, 0xb2, 0xed, 0x79, 0xf4, 0xca, 0x2c, 0x6d, 0x16, 0x5b,
0x35, 0xac, 0x26, 0xe8, 0x57, 0x50, 0xd9, 0xe6, 0x9c, 0x30, 0xce, 0xcc, 0x15, 0x79, 0x16, 0x19,
0x46, 0x28, 0x10, 0x8e, 0xc0, 0xe8, 0x04, 0x6a, 0xd2, 0x17, 0xdb, 0xe1, 0x28, 0x3a, 0xc5, 0xaf,
0x6e, 0x0f, 0x79, 0x3b, 0xe6, 0xa8, 0x73, 0x9c, 0xeb, 0x40, 0x7b, 0x50, 0xeb, 0x38, 0x83, 0x0b,
0xd2, 0x0d, 0xe9, 0xc4, 0xac, 0x48, 0x85, 0xbf, 0xcc, 0x30, 0x4e, 0xc0, 0xb4, 0x42, 0xad, 0x26,
0x66, 0xa2, 0x6d, 0xa8, 0xc8, 0xc9, 0x19, 0x35, 0xab, 0xf7, 0x53, 0x12, 0xf1, 0x90, 0x05, 0xab,
0x9d, 0x51, 0x48, 0xa7, 0xc1, 0xa9, 0x13, 0x12, 0x9f, 0x9b, 0x35, 0x19, 0x40, 0x29, 0x19, 0x7a,
0x0b, 0x95, 0xbd, 0xeb, 0x80, 0x86, 0x9c, 0x99, 0x90, 0x97, 0x2a, 0x15, 0x48, 0x2f, 0xa0, 0x19,
0xe8, 0x13, 0x80, 0xbd, 0x6b, 0x1e, 0x3a, 0xfb, 0x54, 0xb8, 0xbd, 0x2e, 0x8f, 0x23, 0x21, 0x41,
0x5d, 0x28, 0x1f, 0x3a, 0x7d, 0xe2, 0x31, 0x73, 0x55, 0xea, 0xb6, 0xef, 0xe0, 0x58, 0x45, 0x50,
0x0b, 0x69, 0xb6, 0xc8, 0x25, 0xc7, 0x84, 0x5f, 0xd1, 0x70, 0x7c, 0x44, 0x87, 0xc4, 0x6c, 0xa8,
0x5c, 0x92, 0x10, 0xa1, 0xe7, 0xd0, 0x38, 0xa6, 0xca, 0x79, 0xae, 0xc7, 0x49, 0x68, 0xae, 0xc9,
0xcd, 0xa4, 0x85, 0x32, 0x73, 0x7a, 0x0e, 0x3f, 0xa7, 0xe1, 0x84, 0x99, 0x0f, 0x24, 0x62, 0x2e,
0x10, 0x11, 0xd4, 0x23, 0x83, 0x90, 0x70, 0x66, 0xae, 0xe7, 0x45, 0x90, 0x02, 0xe1, 0x08, 0x8c,
0x4c, 0xa8, 0xf4, 0x2e, 0x26, 0x3d, 0xf7, 0xf7, 0xc4, 0x7c, 0xb8, 0x69, 0xb4, 0x8a, 0x38, 0x9a,
0xa2, 0x97, 0x50, 0xec, 0xf5, 0xf6, 0x4d, 0x24, 0xb5, 0x7d, 0x94, 0xa1, 0xad, 0xb7, 0x8f, 0x05,
0x0a, 0x21, 0x28, 0x9d, 0x39, 0x23, 0x66, 0xfe, 0x5c, 0xee, 0x4b, 0x8e, 0xd1, 0x63, 0x28, 0x9f,
0x39, 0xe1, 0x88, 0x70, 0x73, 0x43, 0xda, 0xac, 0x67, 0xe8, 0x0d, 0x54, 0xde, 0x7b, 0xee, 0xc4,
0xe5, 0xcc, 0x7c, 0x94, 0x77, 0xf1, 0x14, 0xe8, 0x24, 0xe0, 0x38, 0xc2, 0xa3, 0x03, 0x58, 0xed,
0xc9, 0x52, 0x7d, 0x2a, 0x0b, 0xb4, 0xf9, 0x58, 0xf2, 0x5f, 0xd8, 0xa2, 0x2c, 0xdb, 0x51, 0x59,
0x16, 0xdc, 0x64, 0x41, 0xb7, 0x15, 0x18, 0xa7, 0xa8, 0xcd, 0x77, 0xb0, 0x96, 0xbe, 0x06, 0x4b,
0x32, 0xd5, 0x46, 0x32, 0x53, 0xd5, 0x12, 0x59, 0xa8, 0xf9, 0x06, 0xea, 0x89, 0xb3, 0xbe, 0x0f,
0xd5, 0xc2, 0xb0, 0x9a, 0xcc, 0x6d, 0xc2, 0x75, 0x89, 0x22, 0x23, 0xc7, 0xc8, 0x06, 0x48, 0x24,
0xf6, 0xc2, 0xd2, 0xc4, 0x9e, 0x40, 0x58, 0xff, 0x32, 0xa0, 0x91, 0xca, 0x36, 0xe2, 0x5c, 0xa5,
0x79, 0x24, 0xd4, 0x8a, 0xa3, 0xa9, 0xb8, 0x58, 0x47, 0x84, 0x3b, 0x43, 0x87, 0x3b, 0x5d, 0xd7,
0x8b, 0x36, 0x98, 0x92, 0x09, 0xb6, 0x0e, 0x3e, 0x99, 0xe1, 0xaa, 0x38, 0x9a, 0xca, 0xdd, 0x4e,
0x3d, 0x4f, 0x56, 0xa6, 0x2a, 0x96, 0x63, 0x75, 0x93, 0xc4, 0xa5, 0x3a, 0x9d, 0xb2, 0x0b, 0x59,
0x86, 0xaa, 0x38, 0x21, 0x99, 0x7f, 0x3f, 0xa4, 0xce, 0xd0, 0x2c, 0x27, 0xbf, 0x0b, 0x89, 0x08,
0x94, 0x43, 0xd7, 0x1f, 0x93, 0xa1, 0x59, 0x91, 0xdf, 0xf4, 0xcc, 0xfa, 0xa7, 0x01, 0xf5, 0xc4,
0xd5, 0x95, 0x41, 0x36, 0x0b, 0x48, 0xe4, 0x29, 0x31, 0x46, 0x3b, 0xb0, 0xb2, 0xcd, 0x79, 0x28,
0x0a, 0xbe, 0x88, 0xd3, 0x2f, 0x6e, 0x4d, 0x00, 0xb6, 0x84, 0xab, 0x2b, 0xaa, 0xa8, 0xe2, 0x86,
0xee, 0x12, 0xc6, 0x5d, 0xdf, 0x91, 0xee, 0x56, 0xe5, 0x39, 0x29, 0x6a, 0xbe, 0x06, 0x98, 0xd3,
0xee, 0x75, 0xda, 0x7f, 0x33, 0xe0, 0xe1, 0x42, 0x96, 0x5b, 0x6a, 0xc9, 0x7e, 0xda, 0x92, 0xad,
0x3b, 0x66, 0xcc, 0x45, 0x7b, 0xfe, 0x8f, 0xdd, 0x1e, 0x43, 0x59, 0x95, 0x96, 0xa5, 0x3b, 0x6c,
0x42, 0x75, 0xd7, 0x65, 0x4e, 0xdf, 0x23, 0x43, 0x49, 0xad, 0xe2, 0x78, 0x2e, 0xeb, 0x9a, 0xdc,
0xbd, 0xf2, 0x9e, 0x9a, 0x58, 0x2a, 0x87, 0xa0, 0x35, 0x28, 0xc4, 0x1d, 0x68, 0xe1, 0x60, 0x57,
0x80, 0x45, 0x98, 0x2b, 0x53, 0x6b, 0x58, 0x4d, 0xac, 0x2e, 0x94, 0x55, 0x56, 0x5a, 0xc0, 0x37,
0xa1, 0x2a, 0xc2, 0x52, 0x5e, 0x13, 0xb5, 0xe7, 0x78, 0x2e, 0xcc, 0xdb, 0xf3, 0x2f, 0xf5, 0xb2,
0x62, 0x68, 0xbd, 0x4a, 0x94, 0x76, 0x61, 0x87, 0xec, 0xb9, 0xb4, 0x1d, 0xb2, 0xd3, 0x7a, 0x0c,
0xe5, 0x2e, 0x0d, 0x27, 0x0e, 0xd7, 0xca, 0xf4, 0xcc, 0xb2, 0x60, 0xed, 0xc0, 0x67, 0x01, 0x19,
0xf0, 0xec, 0xa6, 0xfd, 0x04, 0x1e, 0xc4, 0x18, 0xdd, 0xae, 0x27, 0xba, 0x4e, 0xe3, 0xfe, 0x5d,
0xe7, 0x5f, 0x0d, 0xa8, 0xc5, 0x99, 0x0e, 0x75, 0xa0, 0x2c, 0x4f, 0x23, 0xea, 0xfd, 0x5f, 0xde,
0x92, 0x1a, 0xed, 0x0f, 0x12, 0xad, 0x2b, 0x8e, 0xa2, 0x36, 0x7f, 0x84, 0x7a, 0x42, 0xbc, 0x24,
0x00, 0xb6, 0xd2, 0x1d, 0xd8, 0x93, 0xbc, 0x45, 0x92, 0xe1, 0xb1, 0x0b, 0x65, 0x25, 0x5c, 0xea,
0x56, 0x04, 0xa5, 0x7d, 0x27, 0x54, 0xa1, 0x51, 0xc4, 0x72, 0x2c, 0x64, 0x3d, 0x7a, 0xce, 0xe5,
0xf1, 0x14, 0xb1, 0x1c, 0x5b, 0x7f, 0x37, 0xa0, 0xa1, 0x1b, 0x79, 0xed, 0x41, 0x02, 0xeb, 0xea,
0x86, 0x92, 0x30, 0x92, 0x69, 0xfb, 0xdf, 0xe4, 0xb8, 0x32, 0x82, 0xda, 0x37, 0xb9, 0xca, 0x1b,
0x0b, 0x2a, 0x9b, 0x1d, 0x78, 0xb4, 0x14, 0x7a, 0xaf, 0x2b, 0xf2, 0x02, 0x1e, 0xce, 0x9f, 0x28,
0xd9, 0x71, 0xb2, 0x01, 0x28, 0x09, 0xd3, 0x4f, 0x98, 0x4f, 0xa1, 0x2e, 0x9e, 0x7c, 0xd9, 0x34,
0x0b, 0x56, 0x15, 0x40, 0x7b, 0x06, 0x41, 0x69, 0x4c, 0x66, 0x2a, 0x1a, 0x6a, 0x58, 0x8e, 0xad,
0x3f, 0x1b, 0xe2, 0xe5, 0x16, 0x4c, 0xf9, 0x11, 0x61, 0xcc, 0x19, 0x89, 0x00, 0x2c, 0x1d, 0xf8,
0x2e, 0xd7, 0xd1, 0xf7, 0x59, 0x4e, 0xff, 0x2b, 0x60, 0x9a, 0xb5, 0xff, 0x33, 0x2c, 0x59, 0xa2,
0x95, 0xdd, 0x75, 0xb8, 0xa3, 0x63, 0x21, 0xa3, 0x83, 0x12, 0x88, 0x04, 0x51, 0x4c, 0x77, 0x2a,
0xe2, 0x99, 0x1a, 0x4c, 0xb9, 0xf5, 0x1c, 0xd6, 0x6f, 0x6a, 0x5f, 0x62, 0xda, 0xd7, 0x50, 0x4f,
0x68, 0x91, 0xf7, 0xf6, 0xa4, 0x2b, 0x01, 0x55, 0x2c, 0x86, 0xc2, 0xd6, 0x78, 0x23, 0xab, 0x6a,
0x0d, 0xeb, 0x01, 0x34, 0xa4, 0xea, 0xd8, 0x83, 0x7f, 0x28, 0x40, 0x25, 0x52, 0xf1, 0x2a, 0x65,
0xf7, 0xd3, 0x2c, 0xbb, 0x17, 0x4d, 0xfe, 0x16, 0x4a, 0x71, 0xe9, 0xcb, 0x6c, 0x3f, 0xba, 0xc3,
0x04, 0x4d, 0x56, 0xc5, 0xef, 0xa1, 0x8c, 0x09, 0x13, 0xad, 0x52, 0x6e, 0xdb, 0xaf, 0x30, 0x73,
0xb2, 0x26, 0x09, 0x7a, 0xcf, 0x1d, 0xf9, 0x8e, 0x2a, 0x9e, 0x99, 0x74, 0x85, 0x49, 0xd0, 0x95,
0x60, 0xee, 0xee, 0x3f, 0x1a, 0x50, 0xcf, 0x75, 0x75, 0xfe, 0x23, 0x7b, 0xe1, 0xe1, 0x5f, 0xfc,
0x1f, 0x1f, 0xfe, 0xff, 0x36, 0xd2, 0x8a, 0x64, 0x9d, 0x17, 0xf7, 0x29, 0xa0, 0xae, 0xcf, 0x75,
0xc8, 0x26, 0x24, 0x62, 0xa3, 0x9d, 0xc9, 0x50, 0x27, 0x7d, 0x31, 0x9c, 0x27, 0xef, 0xa2, 0x4e,
0xde, 0x22, 0x08, 0xde, 0x33, 0x12, 0xea, 0x97, 0xaf, 0x1c, 0x8b, 0x7c, 0x7d, 0x4c, 0xa5, 0x54,
0xf5, 0x16, 0x7a, 0x26, 0xf5, 0x5d, 0xa9, 0x86, 0x42, 0xe8, 0xbb, 0x92, 0x55, 0xe8, 0x98, 0x0a,
0x99, 0x6a, 0x24, 0xd4, 0x44, 0xe0, 0xce, 0xf8, 0xcc, 0xac, 0xaa, 0x50, 0x3b, 0xe3, 0x33, 0x51,
0x50, 0x30, 0xf5, 0xbc, 0xbe, 0x33, 0x18, 0xcb, 0x87, 0x45, 0x15, 0xc7, 0x73, 0xd1, 0xfb, 0x08,
0xef, 0xba, 0x8e, 0x67, 0x82, 0xea, 0x7d, 0xf4, 0xd4, 0xda, 0x86, 0x5a, 0x1c, 0x14, 0xa2, 0x46,
0x75, 0x87, 0xd2, 0xe9, 0x0d, 0x5c, 0xe8, 0x0e, 0xa3, 0x78, 0x2e, 0x2c, 0xc6, 0x73, 0x31, 0x11,
0xcf, 0xaf, 0xa0, 0x91, 0x0a, 0x0f, 0x01, 0xc2, 0xf4, 0x8a, 0x69, 0x45, 0x72, 0x2c, 0x64, 0x1d,
0xea, 0xa9, 0xff, 0x30, 0x1a, 0x58, 0x8e, 0xad, 0x67, 0xd0, 0x48, 0x05, 0xc6, 0xb2, 0x0c, 0x6c,
0x3d, 0x85, 0x46, 0x8f, 0x3b, 0x7c, 0x9a, 0xf3, 0xa7, 0xd3, 0x7f, 0x0c, 0x58, 0x8b, 0x30, 0x3a,
0xc7, 0x7c, 0x03, 0xd5, 0x4b, 0x12, 0x72, 0x72, 0x1d, 0x57, 0x1d, 0x73, 0xb1, 0xa1, 0xfe, 0x20,
0x11, 0x38, 0x46, 0xa2, 0xef, 0xa0, 0xca, 0xa4, 0x1e, 0x12, 0x75, 0x2c, 0x9f, 0x64, 0xb1, 0xf4,
0x7a, 0x31, 0x1e, 0xb5, 0xa1, 0xe4, 0xd1, 0x11, 0x93, 0xe7, 0x5e, 0xdf, 0xfa, 0x38, 0x8b, 0x77,
0x48, 0x47, 0x58, 0x02, 0xd1, 0x5b, 0xa8, 0x5e, 0x39, 0xa1, 0xef, 0xfa, 0x23, 0x26, 0x1f, 0xce,
0xe2, 0xd2, 0x66, 0x90, 0x7e, 0x54, 0x38, 0x1c, 0x13, 0xac, 0x86, 0xb8, 0x2e, 0xe7, 0x54, 0xfb,
0xc4, 0xfa, 0xb5, 0x88, 0x5a, 0x31, 0xd5, 0xe6, 0x1f, 0x40, 0x43, 0x45, 0xfe, 0x07, 0x12, 0x32,
0xd1, 0xff, 0x19, 0x79, 0xb7, 0x73, 0x27, 0x09, 0xc5, 0x69, 0xa6, 0xf5, 0x93, 0x2e, 0x6c, 0x91,
0x40, 0xc4, 0x52, 0xe0, 0x0c, 0xc6, 0xce, 0x28, 0x3a, 0xa7, 0x68, 0x2a, 0xbe, 0x5c, 0xea, 0xf5,
0xd4, 0x05, 0x8d, 0xa6, 0x22, 0x36, 0x43, 0x72, 0xe9, 0xb2, 0x79, 0x2b, 0x1a, 0xcf, 0xb7, 0xfe,
0x54, 0x01, 0xe8, 0xc4, 0xfb, 0x41, 0xa7, 0xb0, 0x22, 0xd7, 0x43, 0x56, 0x6e, 0x99, 0x94, 0x76,
0x37, 0x9f, 0xdd, 0xa1, 0x94, 0xa2, 0x0f, 0x22, 0xf8, 0x65, 0x7b, 0x83, 0x9e, 0x67, 0x25, 0x84,
0x64, 0x87, 0xd4, 0x7c, 0x71, 0x0b, 0x4a, 0xeb, 0x7d, 0x0f, 0x65, 0x15, 0x05, 0x28, 0x2b, 0xeb,
0x25, 0xe3, 0xb6, 0xf9, 0x3c, 0x1f, 0xa4, 0x94, 0x7e, 0x69, 0x20, 0xac, 0x73, 0x22, 0xb2, 0x72,
0x8a, 0x9e, 0xbe, 0x31, 0x59, 0x0e, 0x48, 0xd5, 0x97, 0x96, 0x81, 0x7e, 0x80, 0xb2, 0xca, 0x6a,
0xe8, 0x17, 0xcb, 0x09, 0x91, 0xbe, 0xfc, 0xcf, 0x2d, 0xe3, 0x4b, 0x03, 0x1d, 0x41, 0x49, 0x94,
0x73, 0x94, 0x51, 0x9b, 0x12, 0xbd, 0x40, 0xd3, 0xca, 0x83, 0x68, 0x2f, 0xfe, 0x04, 0x30, 0x6f,
0x2a, 0x50, 0xc6, 0x7f, 0x2a, 0x0b, 0xdd, 0x49, 0xb3, 0x75, 0x3b, 0x50, 0x2f, 0x70, 0x24, 0x2a,
0xea, 0x39, 0x45, 0x99, 0xb5, 0x34, 0xbe, 0x46, 0x4d, 0x2b, 0x0f, 0xa2, 0xd5, 0x5d, 0x40, 0x23,
0xf5, 0x0f, 0x37, 0xfa, 0x3c, 0xdb, 0xc8, 0x9b, 0x7f, 0x98, 0x37, 0x5f, 0xde, 0x09, 0xab, 0x57,
0xe2, 0xc9, 0xae, 0x4c, 0x7f, 0x46, 0xf6, 0x6d, 0x76, 0xa7, 0xff, 0xad, 0x6e, 0xb6, 0xef, 0x8c,
0x57, 0xab, 0xee, 0x94, 0x7e, 0x53, 0x08, 0xfa, 0xfd, 0xb2, 0xfc, 0xe3, 0xff, 0xeb, 0xff, 0x06,
0x00, 0x00, 0xff, 0xff, 0x6e, 0xde, 0x0e, 0xdf, 0xc4, 0x18, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.

@ -49,10 +49,11 @@ message BuildRequest {
message Inputs {
string ContextPath = 1;
string DockerfileName = 2;
string DockerfileInline = 3;
pb.Definition ContextDefinition = 4;
map<string, NamedContext> NamedContexts = 5;
string ContextPathHash = 2;
string DockerfileName = 3;
string DockerfileInline = 4;
pb.Definition ContextDefinition = 5;
map<string, NamedContext> NamedContexts = 6;
// io.Reader InStream = ???;
}

Loading…
Cancel
Save