From 9df197046c9275ff716964560953f41935187a5f Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Thu, 1 Jun 2023 17:42:34 +0200 Subject: [PATCH] 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 --- bake/bake.go | 11 +- bake/bake_test.go | 44 ++++-- build/build.go | 4 +- commands/bake.go | 42 ++--- commands/build.go | 14 +- controller/build/build.go | 71 ++++++--- controller/pb/controller.pb.go | 271 +++++++++++++++++---------------- controller/pb/controller.proto | 9 +- 8 files changed, 264 insertions(+), 202 deletions(-) diff --git a/bake/bake.go b/bake/bake.go index 22d31f96..82eaf68e 100644 --- a/bake/bake.go +++ b/bake/bake.go @@ -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 } diff --git a/bake/bake_test.go b/bake/bake_test.go index f3341c06..f3874240 100644 --- a/bake/bake_test.go +++ b/bake/bake_test.go @@ -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) } diff --git a/build/build.go b/build/build.go index 3b855ef1..3bee2b11 100644 --- a/build/build.go +++ b/build/build.go @@ -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) } diff --git a/commands/bake.go b/commands/bake.go index 8edd45e6..553fb09b 100644 --- a/commands/bake.go +++ b/commands/bake.go @@ -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")`) diff --git a/commands/build.go b/commands/build.go index 0a19b1c8..227ab18a 100644 --- a/commands/build.go +++ b/commands/build.go @@ -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 diff --git a/controller/build/build.go b/controller/build/build.go index c262f455..3b32eda7 100644 --- a/controller/build/build.go +++ b/controller/build/build.go @@ -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 { diff --git a/controller/pb/controller.pb.go b/controller/pb/controller.pb.go index b679db32..65d48ef7 100644 --- a/controller/pb/controller.pb.go +++ b/controller/pb/controller.pb.go @@ -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. diff --git a/controller/pb/controller.proto b/controller/pb/controller.proto index 6156e4dd..f25ef748 100644 --- a/controller/pb/controller.proto +++ b/controller/pb/controller.proto @@ -49,10 +49,11 @@ message BuildRequest { message Inputs { string ContextPath = 1; - string DockerfileName = 2; - string DockerfileInline = 3; - pb.Definition ContextDefinition = 4; - map NamedContexts = 5; + string ContextPathHash = 2; + string DockerfileName = 3; + string DockerfileInline = 4; + pb.Definition ContextDefinition = 5; + map NamedContexts = 6; // io.Reader InStream = ???; }