pull/2631/merge
Igor Bazhitov 8 years ago committed by GitHub
commit cc3503679e

@ -50,4 +50,8 @@ message Release {
// Namespace is the kubernetes namespace of the release. // Namespace is the kubernetes namespace of the release.
string namespace = 8; string namespace = 8;
// Annotations is an unstructured key value map stored with a release that
// may be set by external tools to store and retrieve arbitrary metadata.
map<string,string> annotations = 9;
} }

@ -209,6 +209,9 @@ message UpdateReleaseRequest {
bool reuse_values = 10; bool reuse_values = 10;
// Force resource update through delete/recreate if needed. // Force resource update through delete/recreate if needed.
bool force = 11; bool force = 11;
// Annotations is an unstructured key value map stored with a release that
// may be set by external tools to store and retrieve arbitrary metadata.
map<string,string> annotations = 12;
} }
// UpdateReleaseResponse is the response to an update request. // UpdateReleaseResponse is the response to an update request.
@ -271,6 +274,9 @@ message InstallReleaseRequest {
// wait, if true, will wait until all Pods, PVCs, and Services are in a ready state // wait, if true, will wait until all Pods, PVCs, and Services are in a ready state
// before marking the release as successful. It will wait for as long as timeout // before marking the release as successful. It will wait for as long as timeout
bool wait = 9; bool wait = 9;
// Annotations is an unstructured key value map stored with a release that
// may be set by external tools to store and retrieve arbitrary metadata.
map<string,string> annotations = 10;
} }
// InstallReleaseResponse is the response from a release installation. // InstallReleaseResponse is the response from a release installation.

@ -118,6 +118,7 @@ type installCmd struct {
wait bool wait bool
repoURL string repoURL string
devel bool devel bool
annotations []string
certFile string certFile string
keyFile string keyFile string
@ -193,6 +194,7 @@ func newInstallCmd(c helm.Interface, out io.Writer) *cobra.Command {
f.StringVar(&inst.keyFile, "key-file", "", "identify HTTPS client using this SSL key file") f.StringVar(&inst.keyFile, "key-file", "", "identify HTTPS client using this SSL key file")
f.StringVar(&inst.caFile, "ca-file", "", "verify certificates of HTTPS-enabled servers using this CA bundle") f.StringVar(&inst.caFile, "ca-file", "", "verify certificates of HTTPS-enabled servers using this CA bundle")
f.BoolVar(&inst.devel, "devel", false, "use development versions, too. Equivalent to version '>0.0.0-a'. If --version is set, this is ignored.") f.BoolVar(&inst.devel, "devel", false, "use development versions, too. Equivalent to version '>0.0.0-a'. If --version is set, this is ignored.")
f.StringArrayVar(&inst.annotations, "annotations", []string{}, "set release annotations (can specify multiple or separate values with commas: key1=val1,key2=val2)")
return cmd return cmd
} }
@ -209,6 +211,11 @@ func (i *installCmd) run() error {
return err return err
} }
annotations, err := parseAnnotations(i.annotations)
if err != nil {
return err
}
// If template is specified, try to run the template. // If template is specified, try to run the template.
if i.nameTemplate != "" { if i.nameTemplate != "" {
i.name, err = generateName(i.nameTemplate) i.name, err = generateName(i.nameTemplate)
@ -245,7 +252,8 @@ func (i *installCmd) run() error {
helm.InstallReuseName(i.replace), helm.InstallReuseName(i.replace),
helm.InstallDisableHooks(i.disableHooks), helm.InstallDisableHooks(i.disableHooks),
helm.InstallTimeout(i.timeout), helm.InstallTimeout(i.timeout),
helm.InstallWait(i.wait)) helm.InstallWait(i.wait),
helm.InstallAnnotations(annotations))
if err != nil { if err != nil {
return prettyError(err) return prettyError(err)
} }
@ -469,3 +477,17 @@ func checkDependencies(ch *chart.Chart, reqs *chartutil.Requirements) error {
} }
return nil return nil
} }
func parseAnnotations(input []string) (map[string]string, error) {
annotations := map[string]string{}
for _, a := range input {
for _, s := range strings.Split(a, ",") {
v := strings.Split(s, "=")
if len(v) < 2 || len(v[0]) == 0 {
return nil, fmt.Errorf("invalid annotations format: '%s', should be <key>=[value]", s)
}
annotations[v[0]] = v[1]
}
}
return annotations, nil
}

@ -42,6 +42,10 @@ HOOKS:
{{- end }} {{- end }}
MANIFEST: MANIFEST:
{{.Release.Manifest}} {{.Release.Manifest}}
ANNOTATIONS:
{{- range $k, $v := .Release.Annotations }}
{{$k}}={{$v}}
{{- end }}
` `
func printRelease(out io.Writer, rel *release.Release) error { func printRelease(out io.Writer, rel *release.Release) error {

@ -74,6 +74,7 @@ type upgradeCmd struct {
wait bool wait bool
repoURL string repoURL string
devel bool devel bool
annotations []string
certFile string certFile string
keyFile string keyFile string
@ -132,6 +133,7 @@ func newUpgradeCmd(client helm.Interface, out io.Writer) *cobra.Command {
f.StringVar(&upgrade.keyFile, "key-file", "", "identify HTTPS client using this SSL key file") f.StringVar(&upgrade.keyFile, "key-file", "", "identify HTTPS client using this SSL key file")
f.StringVar(&upgrade.caFile, "ca-file", "", "verify certificates of HTTPS-enabled servers using this CA bundle") f.StringVar(&upgrade.caFile, "ca-file", "", "verify certificates of HTTPS-enabled servers using this CA bundle")
f.BoolVar(&upgrade.devel, "devel", false, "use development versions, too. Equivalent to version '>0.0.0-a'. If --version is set, this is ignored.") f.BoolVar(&upgrade.devel, "devel", false, "use development versions, too. Equivalent to version '>0.0.0-a'. If --version is set, this is ignored.")
f.StringArrayVar(&upgrade.annotations, "annotations", []string{}, "set release annotations (can specify multiple or separate values with commas: key1=val1,key2=val2)")
f.MarkDeprecated("disable-hooks", "use --no-hooks instead") f.MarkDeprecated("disable-hooks", "use --no-hooks instead")
@ -168,6 +170,7 @@ func (u *upgradeCmd) run() error {
namespace: u.namespace, namespace: u.namespace,
timeout: u.timeout, timeout: u.timeout,
wait: u.wait, wait: u.wait,
annotations: u.annotations,
} }
return ic.run() return ic.run()
} }
@ -178,6 +181,11 @@ func (u *upgradeCmd) run() error {
return err return err
} }
annotations, err := parseAnnotations(u.annotations)
if err != nil {
return err
}
// Check chart requirements to make sure all dependencies are present in /charts // Check chart requirements to make sure all dependencies are present in /charts
if ch, err := chartutil.Load(chartPath); err == nil { if ch, err := chartutil.Load(chartPath); err == nil {
if req, err := chartutil.LoadRequirements(ch); err == nil { if req, err := chartutil.LoadRequirements(ch); err == nil {
@ -202,7 +210,8 @@ func (u *upgradeCmd) run() error {
helm.UpgradeTimeout(u.timeout), helm.UpgradeTimeout(u.timeout),
helm.ResetValues(u.resetValues), helm.ResetValues(u.resetValues),
helm.ReuseValues(u.reuseValues), helm.ReuseValues(u.reuseValues),
helm.UpgradeWait(u.wait)) helm.UpgradeWait(u.wait),
helm.UpgradeAnnotations(annotations))
if err != nil { if err != nil {
return fmt.Errorf("UPGRADE FAILED: %v", prettyError(err)) return fmt.Errorf("UPGRADE FAILED: %v", prettyError(err))
} }

@ -68,6 +68,7 @@ helm install [CHART]
### Options ### Options
``` ```
--annotations stringArray set release annotations (can specify multiple or separate values with commas: key1=val1,key2=val2)
--ca-file string verify certificates of HTTPS-enabled servers using this CA bundle --ca-file string verify certificates of HTTPS-enabled servers using this CA bundle
--cert-file string identify HTTPS client using this SSL certificate file --cert-file string identify HTTPS client using this SSL certificate file
--devel use development versions, too. Equivalent to version '>0.0.0-a'. If --version is set, this is ignored. --devel use development versions, too. Equivalent to version '>0.0.0-a'. If --version is set, this is ignored.
@ -106,4 +107,4 @@ helm install [CHART]
### SEE ALSO ### SEE ALSO
* [helm](helm.md) - The Helm package manager for Kubernetes. * [helm](helm.md) - The Helm package manager for Kubernetes.
###### Auto generated by spf13/cobra on 23-Jun-2017 ###### Auto generated by spf13/cobra on 12-Jul-2017

@ -36,6 +36,7 @@ helm upgrade [RELEASE] [CHART]
### Options ### Options
``` ```
--annotations stringArray set release annotations (can specify multiple or separate values with commas: key1=val1,key2=val2)
--ca-file string verify certificates of HTTPS-enabled servers using this CA bundle --ca-file string verify certificates of HTTPS-enabled servers using this CA bundle
--cert-file string identify HTTPS client using this SSL certificate file --cert-file string identify HTTPS client using this SSL certificate file
--devel use development versions, too. Equivalent to version '>0.0.0-a'. If --version is set, this is ignored. --devel use development versions, too. Equivalent to version '>0.0.0-a'. If --version is set, this is ignored.
@ -76,4 +77,4 @@ helm upgrade [RELEASE] [CHART]
### SEE ALSO ### SEE ALSO
* [helm](helm.md) - The Helm package manager for Kubernetes. * [helm](helm.md) - The Helm package manager for Kubernetes.
###### Auto generated by spf13/cobra on 23-Jun-2017 ###### Auto generated by spf13/cobra on 12-Jul-2017

@ -393,6 +393,20 @@ func StatusReleaseVersion(version int32) StatusOption {
} }
} }
// InstallAnnotations attaches annotations to the release
func InstallAnnotations(annotations map[string]string) InstallOption {
return func(opts *options) {
opts.instReq.Annotations = annotations
}
}
// UpgradeAnnotations attaches annotations to the release
func UpgradeAnnotations(annotations map[string]string) UpdateOption {
return func(opts *options) {
opts.updateReq.Annotations = annotations
}
}
// DeleteOption allows setting optional attributes when // DeleteOption allows setting optional attributes when
// performing a UninstallRelease tiller rpc. // performing a UninstallRelease tiller rpc.
type DeleteOption func(*options) type DeleteOption func(*options)

@ -34,6 +34,9 @@ type Release struct {
Version int32 `protobuf:"varint,7,opt,name=version" json:"version,omitempty"` Version int32 `protobuf:"varint,7,opt,name=version" json:"version,omitempty"`
// Namespace is the kubernetes namespace of the release. // Namespace is the kubernetes namespace of the release.
Namespace string `protobuf:"bytes,8,opt,name=namespace" json:"namespace,omitempty"` Namespace string `protobuf:"bytes,8,opt,name=namespace" json:"namespace,omitempty"`
// Annotations is an unstructured key value map stored with a release that
// may be set by external tools to store and retrieve arbitrary metadata.
Annotations map[string]string `protobuf:"bytes,9,rep,name=annotations" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
} }
func (m *Release) Reset() { *m = Release{} } func (m *Release) Reset() { *m = Release{} }
@ -97,6 +100,13 @@ func (m *Release) GetNamespace() string {
return "" return ""
} }
func (m *Release) GetAnnotations() map[string]string {
if m != nil {
return m.Annotations
}
return nil
}
func init() { func init() {
proto.RegisterType((*Release)(nil), "hapi.release.Release") proto.RegisterType((*Release)(nil), "hapi.release.Release")
} }
@ -104,21 +114,26 @@ func init() {
func init() { proto.RegisterFile("hapi/release/release.proto", fileDescriptor2) } func init() { proto.RegisterFile("hapi/release/release.proto", fileDescriptor2) }
var fileDescriptor2 = []byte{ var fileDescriptor2 = []byte{
// 256 bytes of a gzipped FileDescriptorProto // 322 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x90, 0xbf, 0x4e, 0xc3, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x91, 0x4f, 0x4f, 0xf2, 0x40,
0x0c, 0xc6, 0x95, 0x36, 0x7f, 0x1a, 0xc3, 0x82, 0x07, 0xb0, 0x22, 0x86, 0x88, 0x01, 0x22, 0x86, 0x10, 0xc6, 0x53, 0x4a, 0x29, 0x1d, 0xde, 0x03, 0xef, 0xc4, 0xe8, 0xa6, 0xf1, 0xd0, 0x78, 0xc0,
0x54, 0x82, 0x37, 0x80, 0x05, 0xd6, 0x1b, 0xd9, 0x8e, 0xe8, 0x42, 0x4e, 0xa5, 0xe7, 0x28, 0x17, 0xc6, 0x43, 0x49, 0xf4, 0x62, 0x3c, 0x98, 0xa8, 0x31, 0xc1, 0xeb, 0x1e, 0xbd, 0xad, 0x64, 0x2b,
0xf1, 0x2c, 0x3c, 0x2e, 0xba, 0x3f, 0x85, 0x94, 0x2e, 0x4e, 0xec, 0xdf, 0xa7, 0xcf, 0xdf, 0x19, 0x0d, 0xb0, 0x43, 0xba, 0x2b, 0x09, 0x5f, 0xc7, 0x4f, 0x6a, 0xf6, 0x0f, 0x52, 0xf0, 0xb2, 0xdd,
0xaa, 0x41, 0x8e, 0x7a, 0x3b, 0xa9, 0x4f, 0x25, 0xad, 0x3a, 0x7c, 0xdb, 0x71, 0xe2, 0x99, 0xf1, 0x99, 0xe7, 0xd7, 0x79, 0xa6, 0x4f, 0x21, 0x5f, 0x88, 0x4d, 0x33, 0x6d, 0xe5, 0x4a, 0x0a, 0x2d,
0xdc, 0xb1, 0x36, 0xce, 0xaa, 0xab, 0x23, 0xe5, 0xc0, 0xbc, 0x0b, 0xb2, 0x7f, 0x40, 0x9b, 0x9e, 0xf7, 0xcf, 0x6a, 0xd3, 0x92, 0x21, 0xfc, 0x67, 0xb5, 0x2a, 0xf4, 0xf2, 0x8b, 0x23, 0x72, 0x41,
0x8f, 0x40, 0x37, 0xc8, 0x69, 0xde, 0x76, 0x6c, 0x7a, 0xfd, 0x11, 0xc1, 0xe5, 0x12, 0xb8, 0x1a, 0xb4, 0xf4, 0xd8, 0x89, 0xd0, 0xa8, 0x9a, 0x8e, 0x84, 0xf9, 0x42, 0xb4, 0x66, 0x3a, 0x27, 0x55,
0xe6, 0x37, 0xdf, 0x2b, 0x28, 0x44, 0xf0, 0x41, 0x84, 0xd4, 0xc8, 0xbd, 0xa2, 0xa4, 0x4e, 0x9a, 0x37, 0x9f, 0x41, 0x38, 0xef, 0x0a, 0xf6, 0xf4, 0xfd, 0xab, 0xef, 0x18, 0x52, 0xee, 0xe7, 0x20,
0x52, 0xf8, 0x7f, 0xbc, 0x85, 0xd4, 0xd9, 0xd3, 0xaa, 0x4e, 0x9a, 0xb3, 0x07, 0x6c, 0x97, 0xf9, 0x42, 0x5f, 0x89, 0xb5, 0x64, 0x51, 0x11, 0x95, 0x19, 0x77, 0x77, 0x9c, 0x40, 0xdf, 0x8e, 0x67,
0xda, 0x57, 0xd3, 0xb3, 0xf0, 0x1c, 0xef, 0x20, 0xf3, 0xb6, 0xb4, 0xf6, 0xc2, 0x8b, 0x20, 0x0c, 0xbd, 0x22, 0x2a, 0x47, 0xb7, 0x58, 0x75, 0xf7, 0xab, 0xde, 0x54, 0x4d, 0xdc, 0xe9, 0x78, 0x0d,
0x9b, 0x9e, 0x5d, 0x15, 0x81, 0xe3, 0x3d, 0xe4, 0x21, 0x18, 0xa5, 0x4b, 0xcb, 0xa8, 0xf4, 0x44, 0x89, 0x1b, 0xcb, 0x62, 0x07, 0xfe, 0xf7, 0xa0, 0x77, 0x7a, 0xb1, 0x27, 0xf7, 0x3a, 0xde, 0xc0,
0x44, 0x05, 0x56, 0xb0, 0xd9, 0x4b, 0xa3, 0x7b, 0x65, 0x67, 0xca, 0x7c, 0xa8, 0xdf, 0x1e, 0x1b, 0xc0, 0x2f, 0xc6, 0xfa, 0xdd, 0x91, 0x81, 0x74, 0x0a, 0x0f, 0x04, 0xe6, 0x30, 0x5c, 0x0b, 0xd5,
0xc8, 0xdc, 0x41, 0x2c, 0xe5, 0xf5, 0xfa, 0x34, 0xd9, 0x0b, 0xf3, 0x4e, 0x04, 0x01, 0x12, 0x14, 0xd4, 0x52, 0x1b, 0x96, 0xb8, 0xa5, 0x7e, 0x6b, 0x2c, 0x21, 0xb1, 0x81, 0x68, 0x36, 0x28, 0xe2,
0x5f, 0x6a, 0xb2, 0x9a, 0x0d, 0x15, 0x75, 0xd2, 0x64, 0xe2, 0xd0, 0xe2, 0x35, 0x94, 0xee, 0x91, 0xbf, 0x9b, 0xcd, 0x88, 0x96, 0xdc, 0x03, 0xc8, 0x20, 0xdd, 0xca, 0x56, 0x37, 0xa4, 0x58, 0x5a,
0x76, 0x94, 0x9d, 0xa2, 0x8d, 0x5f, 0xf0, 0x37, 0x78, 0x2a, 0xdf, 0x8a, 0x68, 0xf7, 0x9e, 0xfb, 0x44, 0x65, 0xc2, 0xf7, 0x25, 0x5e, 0x42, 0x66, 0x3f, 0x52, 0x6f, 0xc4, 0x5c, 0xb2, 0xa1, 0x33,
0x63, 0x3d, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0xc8, 0x8f, 0xec, 0x97, 0xbb, 0x01, 0x00, 0x00, 0x38, 0x34, 0x70, 0x06, 0x23, 0xa1, 0x14, 0x19, 0x61, 0x1a, 0x52, 0x9a, 0x65, 0xce, 0x67, 0x72,
0xec, 0x13, 0xa2, 0xab, 0x9e, 0x0e, 0xe0, 0xab, 0x32, 0xed, 0x8e, 0x77, 0x5f, 0xcd, 0x1f, 0x61,
0x7c, 0x0a, 0xe0, 0x18, 0xe2, 0xa5, 0xdc, 0x85, 0xac, 0xed, 0x15, 0xcf, 0x20, 0xd9, 0x8a, 0xd5,
0x97, 0x74, 0x59, 0x67, 0xdc, 0x17, 0x0f, 0xbd, 0xfb, 0xe8, 0x39, 0x7b, 0x4f, 0x83, 0xe1, 0xc7,
0xc0, 0xfd, 0xb6, 0xbb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5d, 0x29, 0xd2, 0x2f, 0x45, 0x02,
0x00, 0x00,
} }

@ -376,6 +376,9 @@ type UpdateReleaseRequest struct {
ReuseValues bool `protobuf:"varint,10,opt,name=reuse_values,json=reuseValues" json:"reuse_values,omitempty"` ReuseValues bool `protobuf:"varint,10,opt,name=reuse_values,json=reuseValues" json:"reuse_values,omitempty"`
// Force resource update through delete/recreate if needed. // Force resource update through delete/recreate if needed.
Force bool `protobuf:"varint,11,opt,name=force" json:"force,omitempty"` Force bool `protobuf:"varint,11,opt,name=force" json:"force,omitempty"`
// Annotations is an unstructured key value map stored with a release that
// may be set by external tools to store and retrieve arbitrary metadata.
Annotations map[string]string `protobuf:"bytes,12,rep,name=annotations" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
} }
func (m *UpdateReleaseRequest) Reset() { *m = UpdateReleaseRequest{} } func (m *UpdateReleaseRequest) Reset() { *m = UpdateReleaseRequest{} }
@ -460,6 +463,13 @@ func (m *UpdateReleaseRequest) GetForce() bool {
return false return false
} }
func (m *UpdateReleaseRequest) GetAnnotations() map[string]string {
if m != nil {
return m.Annotations
}
return nil
}
// UpdateReleaseResponse is the response to an update request. // UpdateReleaseResponse is the response to an update request.
type UpdateReleaseResponse struct { type UpdateReleaseResponse struct {
Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"`
@ -600,6 +610,9 @@ type InstallReleaseRequest struct {
// wait, if true, will wait until all Pods, PVCs, and Services are in a ready state // wait, if true, will wait until all Pods, PVCs, and Services are in a ready state
// before marking the release as successful. It will wait for as long as timeout // before marking the release as successful. It will wait for as long as timeout
Wait bool `protobuf:"varint,9,opt,name=wait" json:"wait,omitempty"` Wait bool `protobuf:"varint,9,opt,name=wait" json:"wait,omitempty"`
// Annotations is an unstructured key value map stored with a release that
// may be set by external tools to store and retrieve arbitrary metadata.
Annotations map[string]string `protobuf:"bytes,10,rep,name=annotations" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
} }
func (m *InstallReleaseRequest) Reset() { *m = InstallReleaseRequest{} } func (m *InstallReleaseRequest) Reset() { *m = InstallReleaseRequest{} }
@ -670,6 +683,13 @@ func (m *InstallReleaseRequest) GetWait() bool {
return false return false
} }
func (m *InstallReleaseRequest) GetAnnotations() map[string]string {
if m != nil {
return m.Annotations
}
return nil
}
// InstallReleaseResponse is the response from a release installation. // InstallReleaseResponse is the response from a release installation.
type InstallReleaseResponse struct { type InstallReleaseResponse struct {
Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"` Release *hapi_release5.Release `protobuf:"bytes,1,opt,name=release" json:"release,omitempty"`
@ -1368,82 +1388,86 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) } func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{ var fileDescriptor0 = []byte{
// 1217 bytes of a gzipped FileDescriptorProto // 1292 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xdd, 0x6e, 0xe3, 0xc4, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x5b, 0x73, 0xdb, 0x44,
0x17, 0xaf, 0xf3, 0x9d, 0x93, 0x36, 0xff, 0x74, 0x9a, 0xb6, 0xae, 0xff, 0x0b, 0x2a, 0x46, 0xb0, 0x14, 0x8e, 0x2c, 0x5f, 0x8f, 0xd3, 0xe0, 0x6e, 0xdd, 0x44, 0x15, 0x85, 0x09, 0x62, 0xa0, 0x6e,
0xd9, 0x85, 0x4d, 0x21, 0x70, 0x83, 0x84, 0x90, 0xba, 0xdd, 0xa8, 0x2d, 0x94, 0xae, 0xe4, 0x6c, 0x4b, 0x1d, 0x30, 0x3c, 0x70, 0xe9, 0x74, 0x26, 0x4d, 0x3d, 0x49, 0x21, 0xa4, 0x33, 0x72, 0x5b,
0x17, 0x09, 0x01, 0x91, 0x9b, 0x4c, 0x5a, 0xb3, 0x8e, 0x27, 0x78, 0xc6, 0x65, 0x7b, 0xcb, 0x1d, 0x66, 0x18, 0x5a, 0x8f, 0x62, 0xaf, 0x53, 0x51, 0x59, 0x6b, 0xb4, 0xab, 0x50, 0xbf, 0xf2, 0xc6,
0x8f, 0xc2, 0x5b, 0xf0, 0x1e, 0x5c, 0xc2, 0x83, 0x20, 0xcf, 0x87, 0xeb, 0x49, 0xed, 0xd6, 0xf4, 0xbf, 0xe2, 0x95, 0xdf, 0xc0, 0x2b, 0x3f, 0x84, 0xd1, 0x5e, 0x14, 0xad, 0x22, 0xa7, 0x6a, 0x66,
0x26, 0x9e, 0x99, 0xf3, 0xfd, 0x3b, 0x67, 0xce, 0x9c, 0x80, 0x75, 0xe9, 0x2e, 0xbc, 0x3d, 0x8a, 0x78, 0xb1, 0xb4, 0x7b, 0xee, 0xe7, 0x3b, 0xe7, 0xe8, 0x8c, 0xc1, 0x7e, 0xe5, 0x2d, 0xfc, 0x1d,
0xc3, 0x2b, 0x6f, 0x82, 0xe9, 0x1e, 0xf3, 0x7c, 0x1f, 0x87, 0xfd, 0x45, 0x48, 0x18, 0x41, 0xdd, 0x8a, 0xa3, 0x53, 0x7f, 0x82, 0xe9, 0x0e, 0xf3, 0x83, 0x00, 0x47, 0xfd, 0x45, 0x44, 0x18, 0x41,
0x98, 0xd6, 0x57, 0xb4, 0xbe, 0xa0, 0x59, 0x5b, 0x5c, 0x62, 0x72, 0xe9, 0x86, 0x4c, 0xfc, 0x0a, 0xdd, 0x84, 0xd6, 0x57, 0xb4, 0xbe, 0xa0, 0xd9, 0x9b, 0x5c, 0x62, 0xf2, 0xca, 0x8b, 0x98, 0xf8,
0x6e, 0x6b, 0x3b, 0x7d, 0x4e, 0x82, 0x99, 0x77, 0x21, 0x09, 0xc2, 0x44, 0x88, 0x7d, 0xec, 0x52, 0x15, 0xdc, 0xf6, 0x56, 0xf6, 0x9e, 0x84, 0x33, 0xff, 0x44, 0x12, 0x84, 0x89, 0x08, 0x07, 0xd8,
0xac, 0xbe, 0x9a, 0x90, 0xa2, 0x79, 0xc1, 0x8c, 0x48, 0xc2, 0xff, 0x35, 0x02, 0xc3, 0x94, 0x8d, 0xa3, 0x58, 0x3d, 0x35, 0x21, 0x45, 0xf3, 0xc3, 0x19, 0x91, 0x84, 0xf7, 0x35, 0x02, 0xc3, 0x94,
0xc3, 0x28, 0x90, 0xc4, 0x1d, 0x8d, 0x48, 0x99, 0xcb, 0x22, 0xaa, 0x19, 0xbb, 0xc2, 0x21, 0xf5, 0x8d, 0xa3, 0x38, 0x94, 0xc4, 0x1b, 0x1a, 0x91, 0x32, 0x8f, 0xc5, 0x54, 0x33, 0x76, 0x8a, 0x23,
0x48, 0xa0, 0xbe, 0x82, 0x66, 0xff, 0x59, 0x82, 0x8d, 0x13, 0x8f, 0x32, 0x47, 0x08, 0x52, 0x07, 0xea, 0x93, 0x50, 0x3d, 0x05, 0xcd, 0xf9, 0xab, 0x02, 0xd7, 0x0e, 0x7d, 0xca, 0x5c, 0x21, 0x48,
0xff, 0x12, 0x61, 0xca, 0x50, 0x17, 0xaa, 0xbe, 0x37, 0xf7, 0x98, 0x69, 0xec, 0x1a, 0xbd, 0xb2, 0x5d, 0xfc, 0x5b, 0x8c, 0x29, 0x43, 0x5d, 0xa8, 0x05, 0xfe, 0xdc, 0x67, 0x96, 0xb1, 0x6d, 0xf4,
0x23, 0x36, 0x68, 0x0b, 0x6a, 0x64, 0x36, 0xa3, 0x98, 0x99, 0xa5, 0x5d, 0xa3, 0xd7, 0x74, 0xe4, 0x4c, 0x57, 0x1c, 0xd0, 0x26, 0xd4, 0xc9, 0x6c, 0x46, 0x31, 0xb3, 0x2a, 0xdb, 0x46, 0xaf, 0xe5,
0x0e, 0x7d, 0x05, 0x75, 0x4a, 0x42, 0x36, 0x3e, 0xbf, 0x36, 0xcb, 0xbb, 0x46, 0xaf, 0x3d, 0xf8, 0xca, 0x13, 0x7a, 0x00, 0x0d, 0x4a, 0x22, 0x36, 0x3e, 0x5e, 0x5a, 0xe6, 0xb6, 0xd1, 0xdb, 0x18,
0xa0, 0x9f, 0x85, 0x53, 0x3f, 0xb6, 0x34, 0x22, 0x21, 0xeb, 0xc7, 0x3f, 0xcf, 0xaf, 0x9d, 0x1a, 0x7c, 0xd2, 0x2f, 0xca, 0x53, 0x3f, 0xb1, 0x34, 0x22, 0x11, 0xeb, 0x27, 0x3f, 0x0f, 0x97, 0x6e,
0xe5, 0xdf, 0x58, 0xef, 0xcc, 0xf3, 0x19, 0x0e, 0xcd, 0x8a, 0xd0, 0x2b, 0x76, 0xe8, 0x10, 0x80, 0x9d, 0xf2, 0x67, 0xa2, 0x77, 0xe6, 0x07, 0x0c, 0x47, 0x56, 0x55, 0xe8, 0x15, 0x27, 0xb4, 0x0f,
0xeb, 0x25, 0xe1, 0x14, 0x87, 0x66, 0x95, 0xab, 0xee, 0x15, 0x50, 0xfd, 0x32, 0xe6, 0x77, 0x9a, 0xc0, 0xf5, 0x92, 0x68, 0x8a, 0x23, 0xab, 0xc6, 0x55, 0xf7, 0x4a, 0xa8, 0x7e, 0x92, 0xf0, 0xbb,
0x54, 0x2d, 0xd1, 0x97, 0xb0, 0x2a, 0x20, 0x19, 0x4f, 0xc8, 0x14, 0x53, 0xb3, 0xb6, 0x5b, 0xee, 0x2d, 0xaa, 0x5e, 0xd1, 0x7d, 0x58, 0x17, 0x29, 0x19, 0x4f, 0xc8, 0x14, 0x53, 0xab, 0xbe, 0x6d,
0xb5, 0x07, 0x3b, 0x42, 0x95, 0x82, 0x7f, 0x24, 0x40, 0x3b, 0x20, 0x53, 0xec, 0xb4, 0x04, 0x7b, 0xf6, 0x36, 0x06, 0x37, 0x84, 0x2a, 0x95, 0xfe, 0x91, 0x48, 0xda, 0x1e, 0x99, 0x62, 0xb7, 0x2d,
0xbc, 0xa6, 0xe8, 0x11, 0x34, 0x03, 0x77, 0x8e, 0xe9, 0xc2, 0x9d, 0x60, 0xb3, 0xce, 0x3d, 0xbc, 0xd8, 0x93, 0x77, 0x8a, 0x6e, 0x42, 0x2b, 0xf4, 0xe6, 0x98, 0x2e, 0xbc, 0x09, 0xb6, 0x1a, 0xdc,
0x39, 0xb0, 0x7f, 0x82, 0x86, 0x32, 0x6e, 0x0f, 0xa0, 0x26, 0x42, 0x43, 0x2d, 0xa8, 0x9f, 0x9d, 0xc3, 0xb3, 0x0b, 0xe7, 0x25, 0x34, 0x95, 0x71, 0x67, 0x00, 0x75, 0x11, 0x1a, 0x6a, 0x43, 0xe3,
0x7e, 0x73, 0xfa, 0xf2, 0xbb, 0xd3, 0xce, 0x0a, 0x6a, 0x40, 0xe5, 0x74, 0xff, 0xdb, 0x61, 0xc7, 0xd9, 0xd1, 0x0f, 0x47, 0x4f, 0x7e, 0x3a, 0xea, 0xac, 0xa1, 0x26, 0x54, 0x8f, 0x76, 0x7f, 0x1c,
0x40, 0xeb, 0xb0, 0x76, 0xb2, 0x3f, 0x7a, 0x35, 0x76, 0x86, 0x27, 0xc3, 0xfd, 0xd1, 0xf0, 0x45, 0x76, 0x0c, 0x74, 0x15, 0xae, 0x1c, 0xee, 0x8e, 0x9e, 0x8e, 0xdd, 0xe1, 0xe1, 0x70, 0x77, 0x34,
0xa7, 0x64, 0xbf, 0x0b, 0xcd, 0xc4, 0x67, 0x54, 0x87, 0xf2, 0xfe, 0xe8, 0x40, 0x88, 0xbc, 0x18, 0x7c, 0xd4, 0xa9, 0x38, 0x1f, 0x42, 0x2b, 0xf5, 0x19, 0x35, 0xc0, 0xdc, 0x1d, 0xed, 0x09, 0x91,
0x8e, 0x0e, 0x3a, 0x86, 0xfd, 0xbb, 0x01, 0x5d, 0x3d, 0x45, 0x74, 0x41, 0x02, 0x8a, 0xe3, 0x1c, 0x47, 0xc3, 0xd1, 0x5e, 0xc7, 0x70, 0xfe, 0x34, 0xa0, 0xab, 0x43, 0x44, 0x17, 0x24, 0xa4, 0x38,
0x4d, 0x48, 0x14, 0x24, 0x39, 0xe2, 0x1b, 0x84, 0xa0, 0x12, 0xe0, 0xb7, 0x2a, 0x43, 0x7c, 0x1d, 0xc1, 0x68, 0x42, 0xe2, 0x30, 0xc5, 0x88, 0x1f, 0x10, 0x82, 0x6a, 0x88, 0xdf, 0x28, 0x84, 0xf8,
0x73, 0x32, 0xc2, 0x5c, 0x9f, 0x67, 0xa7, 0xec, 0x88, 0x0d, 0xfa, 0x14, 0x1a, 0x32, 0x74, 0x6a, 0x7b, 0xc2, 0xc9, 0x08, 0xf3, 0x02, 0x8e, 0x8e, 0xe9, 0x8a, 0x03, 0xfa, 0x02, 0x9a, 0x32, 0x74,
0x56, 0x76, 0xcb, 0xbd, 0xd6, 0x60, 0x53, 0x07, 0x44, 0x5a, 0x74, 0x12, 0x36, 0xfb, 0x10, 0xb6, 0x6a, 0x55, 0xb7, 0xcd, 0x5e, 0x7b, 0x70, 0x5d, 0x4f, 0x88, 0xb4, 0xe8, 0xa6, 0x6c, 0xce, 0x3e,
0x0f, 0xb1, 0xf2, 0x44, 0xe0, 0xa5, 0x2a, 0x26, 0xb6, 0xeb, 0xce, 0x31, 0x77, 0x26, 0xb6, 0xeb, 0x6c, 0xed, 0x63, 0xe5, 0x89, 0xc8, 0x97, 0xaa, 0x98, 0xc4, 0xae, 0x37, 0xc7, 0xdc, 0x99, 0xc4,
0xce, 0x31, 0x32, 0xa1, 0x2e, 0xcb, 0x8d, 0xbb, 0x53, 0x75, 0xd4, 0xd6, 0x66, 0x60, 0xde, 0x56, 0xae, 0x37, 0xc7, 0xc8, 0x82, 0x86, 0x2c, 0x37, 0xee, 0x4e, 0xcd, 0x55, 0x47, 0x87, 0x81, 0x75,
0x24, 0xe3, 0xca, 0xd2, 0xf4, 0x21, 0x54, 0xe2, 0x9b, 0xc0, 0xd5, 0xb4, 0x06, 0x48, 0xf7, 0xf3, 0x5e, 0x91, 0x8c, 0xab, 0x48, 0xd3, 0xa7, 0x50, 0x4d, 0x3a, 0x81, 0xab, 0x69, 0x0f, 0x90, 0xee,
0x38, 0x98, 0x11, 0x87, 0xd3, 0xf5, 0x54, 0x95, 0x97, 0x53, 0x75, 0x94, 0xb6, 0x7a, 0x40, 0x02, 0xe7, 0xe3, 0x70, 0x46, 0x5c, 0x4e, 0xd7, 0xa1, 0x32, 0xf3, 0x50, 0x1d, 0x64, 0xad, 0xee, 0x91,
0x86, 0x03, 0xf6, 0x30, 0xff, 0x4f, 0x60, 0x27, 0x43, 0x93, 0x0c, 0x60, 0x0f, 0xea, 0xd2, 0x35, 0x90, 0xe1, 0x90, 0x5d, 0xce, 0xff, 0x43, 0xb8, 0x51, 0xa0, 0x49, 0x06, 0xb0, 0x03, 0x0d, 0xe9,
0xae, 0x2d, 0x17, 0x57, 0xc5, 0x65, 0xff, 0x5d, 0x82, 0xee, 0xd9, 0x62, 0xea, 0x32, 0xac, 0x48, 0x1a, 0xd7, 0xb6, 0x32, 0xaf, 0x8a, 0xcb, 0xf9, 0xa3, 0x0a, 0xdd, 0x67, 0x8b, 0xa9, 0xc7, 0xb0,
0x77, 0x38, 0xf5, 0x18, 0xaa, 0xbc, 0xa3, 0x48, 0x2c, 0xd6, 0x85, 0x6e, 0xd1, 0x76, 0x0e, 0xe2, 0x22, 0x5d, 0xe0, 0xd4, 0x2d, 0xa8, 0xf1, 0x89, 0x22, 0x73, 0x71, 0x55, 0xe8, 0x16, 0x63, 0x67,
0x5f, 0x47, 0xd0, 0xd1, 0x53, 0xa8, 0x5d, 0xb9, 0x7e, 0x84, 0x29, 0x07, 0x22, 0x41, 0x4d, 0x72, 0x2f, 0xf9, 0x75, 0x05, 0x1d, 0xdd, 0x81, 0xfa, 0xa9, 0x17, 0xc4, 0x98, 0xf2, 0x44, 0xa4, 0x59,
0xf2, 0x76, 0xe4, 0x48, 0x0e, 0xb4, 0x0d, 0xf5, 0x69, 0x78, 0x1d, 0xf7, 0x13, 0x7e, 0x05, 0x1b, 0x93, 0x9c, 0x7c, 0x1c, 0xb9, 0x92, 0x03, 0x6d, 0x41, 0x63, 0x1a, 0x2d, 0x93, 0x79, 0xc2, 0x5b,
0x4e, 0x6d, 0x1a, 0x5e, 0x3b, 0x51, 0x80, 0xde, 0x87, 0xb5, 0xa9, 0x47, 0xdd, 0x73, 0x1f, 0x8f, 0xb0, 0xe9, 0xd6, 0xa7, 0xd1, 0xd2, 0x8d, 0x43, 0xf4, 0x31, 0x5c, 0x99, 0xfa, 0xd4, 0x3b, 0x0e,
0x2f, 0x09, 0x79, 0x43, 0xf9, 0x2d, 0x6c, 0x38, 0xab, 0xf2, 0xf0, 0x28, 0x3e, 0x43, 0x56, 0x5c, 0xf0, 0xf8, 0x15, 0x21, 0xaf, 0x29, 0xef, 0xc2, 0xa6, 0xbb, 0x2e, 0x2f, 0x0f, 0x92, 0x3b, 0x64,
0x49, 0x93, 0x10, 0xbb, 0x0c, 0x9b, 0x35, 0x4e, 0x4f, 0xf6, 0x31, 0x86, 0xcc, 0x9b, 0x63, 0x12, 0x27, 0x95, 0x34, 0x89, 0xb0, 0xc7, 0xb0, 0x55, 0xe7, 0xf4, 0xf4, 0x9c, 0xe4, 0x90, 0xf9, 0x73,
0x31, 0x7e, 0x75, 0xca, 0x8e, 0xda, 0xa2, 0xf7, 0x60, 0x35, 0xc4, 0x14, 0xb3, 0xb1, 0xf4, 0xb2, 0x4c, 0x62, 0xc6, 0x5b, 0xc7, 0x74, 0xd5, 0x11, 0x7d, 0x04, 0xeb, 0x11, 0xa6, 0x98, 0x8d, 0xa5,
0xc1, 0x25, 0x5b, 0xfc, 0xec, 0xb5, 0x70, 0x0b, 0x41, 0xe5, 0x57, 0xd7, 0x63, 0x66, 0x93, 0x93, 0x97, 0x4d, 0x2e, 0xd9, 0xe6, 0x77, 0xcf, 0x85, 0x5b, 0x08, 0xaa, 0xbf, 0x7b, 0x3e, 0xb3, 0x5a,
0xf8, 0x5a, 0x88, 0x45, 0x14, 0x2b, 0x31, 0x50, 0x62, 0x11, 0xc5, 0x52, 0xac, 0x0b, 0xd5, 0x19, 0x9c, 0xc4, 0xdf, 0x85, 0x58, 0x4c, 0xb1, 0x12, 0x03, 0x25, 0x16, 0x53, 0x2c, 0xc5, 0xba, 0x50,
0x09, 0x27, 0xd8, 0x6c, 0x71, 0x9a, 0xd8, 0xd8, 0x47, 0xb0, 0xb9, 0x04, 0xf2, 0x43, 0xf3, 0xf5, 0x9b, 0x91, 0x68, 0x82, 0xad, 0x36, 0xa7, 0x89, 0x03, 0x7a, 0x01, 0x6d, 0x2f, 0x0c, 0x09, 0xf3,
0x8f, 0x01, 0x5b, 0x0e, 0xf1, 0xfd, 0x73, 0x77, 0xf2, 0xa6, 0x40, 0xc6, 0x52, 0xe0, 0x96, 0xee, 0x98, 0x4f, 0x42, 0x6a, 0xad, 0xf3, 0x92, 0xff, 0xae, 0x78, 0x9c, 0x14, 0xa1, 0xd1, 0xdf, 0x3d,
0x06, 0xb7, 0x9c, 0x01, 0x6e, 0xaa, 0x08, 0x2b, 0x5a, 0x11, 0x6a, 0xb0, 0x57, 0xf3, 0x61, 0xaf, 0x93, 0x1e, 0x86, 0x2c, 0x5a, 0xba, 0x59, 0x7d, 0xf6, 0x03, 0xe8, 0xe4, 0x19, 0x50, 0x07, 0xcc,
0xe9, 0xb0, 0x2b, 0x4c, 0xeb, 0x29, 0x4c, 0x13, 0xc0, 0x1a, 0x69, 0xc0, 0xbe, 0x86, 0xed, 0x5b, 0xd7, 0x78, 0x29, 0xe1, 0x4b, 0x5e, 0x13, 0xd7, 0xb8, 0xdf, 0xb2, 0x3f, 0xc5, 0xe1, 0xdb, 0xca,
0x51, 0x3e, 0x14, 0xb2, 0x3f, 0x4a, 0xb0, 0x79, 0x1c, 0x50, 0xe6, 0xfa, 0xfe, 0x12, 0x62, 0x49, 0xd7, 0x86, 0x73, 0x00, 0xd7, 0x73, 0x56, 0x2f, 0x5b, 0x4e, 0xff, 0x1a, 0xb0, 0xe9, 0x92, 0x20,
0x3d, 0x1b, 0x85, 0xeb, 0xb9, 0xf4, 0x5f, 0xea, 0xb9, 0xac, 0x41, 0xae, 0xf2, 0x53, 0x49, 0xe5, 0x38, 0xf6, 0x26, 0xaf, 0x4b, 0x14, 0x54, 0x06, 0xfb, 0xca, 0xc5, 0xd8, 0x9b, 0x05, 0xd8, 0x67,
0xa7, 0x50, 0x8d, 0x6b, 0x9d, 0xa5, 0xb6, 0xd4, 0x59, 0xd0, 0x3b, 0x00, 0xa2, 0x28, 0xb9, 0x72, 0x7a, 0xa4, 0xaa, 0xf5, 0x88, 0x56, 0x15, 0xb5, 0xd5, 0x55, 0x51, 0xd7, 0xab, 0x42, 0x41, 0xde,
0x01, 0x6d, 0x93, 0x9f, 0x9c, 0xca, 0x46, 0xa2, 0xb2, 0xd1, 0xc8, 0xce, 0x46, 0xaa, 0xc2, 0xed, 0xc8, 0x40, 0x9e, 0xe2, 0xd9, 0xcc, 0xe0, 0xe9, 0x7c, 0x0f, 0x5b, 0xe7, 0xa2, 0xbc, 0x6c, 0xca,
0x63, 0xd8, 0x5a, 0x86, 0xea, 0xa1, 0xb0, 0xff, 0x66, 0xc0, 0xf6, 0x59, 0xe0, 0x65, 0x02, 0x9f, 0xfe, 0x36, 0xe1, 0xfa, 0xe3, 0x90, 0x32, 0x2f, 0x08, 0x72, 0x19, 0x4b, 0xdb, 0xcd, 0x28, 0xdd,
0x55, 0xaa, 0xb7, 0xa0, 0x28, 0x65, 0x40, 0xd1, 0x85, 0xea, 0x22, 0x0a, 0x2f, 0xb0, 0x84, 0x56, 0x6e, 0x95, 0x77, 0x69, 0x37, 0x53, 0x4b, 0xb9, 0xc2, 0xa7, 0x9a, 0xc1, 0xa7, 0x54, 0x0b, 0x6a,
0x6c, 0xd2, 0x31, 0x56, 0xb4, 0x18, 0xed, 0x31, 0x98, 0xb7, 0x7d, 0x78, 0x60, 0x44, 0xb1, 0xd7, 0x83, 0xaf, 0x9e, 0x1b, 0x7c, 0xe8, 0x03, 0x00, 0xd1, 0x33, 0x5c, 0xb9, 0x48, 0x6d, 0x8b, 0xdf,
0xc9, 0x4b, 0xd0, 0x14, 0x5d, 0xdf, 0xde, 0x80, 0xf5, 0x43, 0xcc, 0x5e, 0x8b, 0x6b, 0x21, 0xc3, 0x1c, 0xc9, 0x39, 0xa7, 0xd0, 0x68, 0x16, 0xa3, 0x91, 0x6d, 0xc0, 0x97, 0x7a, 0x1f, 0x01, 0xef,
0xb3, 0x87, 0x80, 0xd2, 0x87, 0x37, 0xf6, 0xe4, 0x91, 0x6e, 0x4f, 0x8d, 0x45, 0x8a, 0x5f, 0x71, 0xa3, 0xfb, 0xc5, 0x7d, 0x54, 0x98, 0xd3, 0xff, 0xb9, 0x91, 0x1e, 0xc3, 0x66, 0xde, 0xec, 0xa5,
0xd9, 0x5f, 0x70, 0xdd, 0x47, 0x1e, 0x65, 0x24, 0xbc, 0xbe, 0x0b, 0xba, 0x0e, 0x94, 0xe7, 0xee, 0x07, 0xb3, 0x01, 0x5b, 0xcf, 0x42, 0xbf, 0xb0, 0x30, 0x8a, 0x5a, 0xe9, 0x1c, 0x54, 0x95, 0x02,
0x5b, 0xf9, 0x50, 0xc4, 0x4b, 0xfb, 0x90, 0x7b, 0x90, 0x88, 0x4a, 0x0f, 0xd2, 0xcf, 0xae, 0x51, 0xa8, 0xba, 0x50, 0x5b, 0xc4, 0xd1, 0x09, 0x96, 0xd0, 0x8b, 0x43, 0x16, 0x83, 0xaa, 0x86, 0x81,
0xec, 0xd9, 0xfd, 0x01, 0xd0, 0x2b, 0x9c, 0x4c, 0x00, 0xf7, 0xbc, 0x58, 0x2a, 0x09, 0x25, 0xbd, 0x33, 0x06, 0xeb, 0xbc, 0x0f, 0x97, 0x8c, 0x28, 0xf1, 0x3a, 0xfd, 0x90, 0xb6, 0xc4, 0x47, 0xd3,
0xd0, 0x4c, 0xa8, 0x4f, 0x7c, 0xec, 0x06, 0xd1, 0x42, 0xa6, 0x4d, 0x6d, 0xed, 0x1f, 0x61, 0x43, 0xb9, 0x06, 0x57, 0xf7, 0x31, 0x7b, 0x2e, 0xda, 0x56, 0x86, 0xe7, 0x0c, 0x01, 0x65, 0x2f, 0xcf,
0xd3, 0x2e, 0xfd, 0x8c, 0xe3, 0xa1, 0x17, 0x52, 0x7b, 0xbc, 0x44, 0x9f, 0x43, 0x4d, 0x8c, 0x45, 0xec, 0xc9, 0x2b, 0xdd, 0x9e, 0xda, 0x2a, 0x15, 0xbf, 0xe2, 0x72, 0xbe, 0xe1, 0xba, 0x0f, 0x7c,
0x5c, 0x77, 0x7b, 0xf0, 0x48, 0xf7, 0x9b, 0x2b, 0x89, 0x02, 0x39, 0x47, 0x39, 0x92, 0x77, 0xf0, 0xca, 0x48, 0xb4, 0xbc, 0x28, 0x75, 0x1d, 0x30, 0xe7, 0xde, 0x1b, 0xf9, 0x9d, 0x4d, 0x5e, 0x9d,
0x57, 0x03, 0xda, 0xea, 0xa1, 0x17, 0x43, 0x1b, 0xf2, 0x60, 0x35, 0x3d, 0xd1, 0xa0, 0x27, 0xf9, 0x7d, 0xee, 0x41, 0x2a, 0x2a, 0x3d, 0xc8, 0x6e, 0x2d, 0x46, 0xb9, 0xad, 0xe5, 0x17, 0x40, 0x4f,
0x33, 0xdd, 0xd2, 0x60, 0x6a, 0x3d, 0x2d, 0xc2, 0x2a, 0x22, 0xb0, 0x57, 0x3e, 0x31, 0x10, 0x85, 0x71, 0xba, 0x40, 0xbd, 0xe5, 0x83, 0xaf, 0x40, 0xa8, 0xe8, 0x8d, 0x60, 0x41, 0x63, 0x12, 0x60,
0xce, 0xf2, 0xa0, 0x81, 0x9e, 0x65, 0xeb, 0xc8, 0x99, 0x6c, 0xac, 0x7e, 0x51, 0x76, 0x65, 0x16, 0x2f, 0x8c, 0x17, 0x12, 0x36, 0x75, 0x74, 0x5e, 0xc0, 0x35, 0x4d, 0xbb, 0xf4, 0x33, 0x89, 0x87,
0x5d, 0xf1, 0x9a, 0xd1, 0xa7, 0x03, 0x74, 0xaf, 0x1a, 0x7d, 0x20, 0xb1, 0xf6, 0x0a, 0xf3, 0x27, 0x9e, 0xa8, 0x8a, 0x9d, 0xd3, 0x13, 0xf4, 0x15, 0xd4, 0xc5, 0x56, 0xc9, 0x75, 0x6f, 0x0c, 0x6e,
0x76, 0x7f, 0x86, 0x35, 0xed, 0x85, 0x43, 0x39, 0x68, 0x65, 0xcd, 0x1a, 0xd6, 0x47, 0x85, 0x78, 0xea, 0x7e, 0x73, 0x25, 0x71, 0x28, 0xd7, 0x50, 0x57, 0xf2, 0x0e, 0xfe, 0x69, 0xc2, 0x86, 0xda,
0x13, 0x5b, 0x73, 0x68, 0xeb, 0x4d, 0x0a, 0xe5, 0x28, 0xc8, 0xec, 0xfa, 0xd6, 0xc7, 0xc5, 0x98, 0x93, 0x44, 0x73, 0x21, 0x1f, 0xd6, 0xb3, 0x0b, 0x21, 0xba, 0xbd, 0x7a, 0x25, 0xce, 0xed, 0xf5,
0x13, 0x73, 0x14, 0x3a, 0xcb, 0x3d, 0x24, 0x2f, 0x8f, 0x39, 0xfd, 0x2e, 0x2f, 0x8f, 0x79, 0xad, 0xf6, 0x9d, 0x32, 0xac, 0x22, 0x02, 0x67, 0xed, 0x73, 0x03, 0x51, 0xe8, 0xe4, 0xf7, 0x34, 0x74,
0xc9, 0x5e, 0x41, 0x2e, 0xc0, 0x4d, 0x0b, 0x41, 0x8f, 0x73, 0x13, 0xa2, 0x77, 0x1e, 0xab, 0x77, 0xaf, 0x58, 0xc7, 0x8a, 0xc5, 0xd0, 0xee, 0x97, 0x65, 0x57, 0x66, 0xd1, 0x29, 0xaf, 0x19, 0x7d,
0x3f, 0x63, 0x62, 0x62, 0x01, 0xff, 0x5b, 0x7a, 0x63, 0x51, 0x0e, 0x34, 0xd9, 0x03, 0x87, 0xf5, 0xb9, 0x42, 0x6f, 0x55, 0xa3, 0xef, 0x73, 0xf6, 0x4e, 0x69, 0xfe, 0xd4, 0xee, 0xaf, 0x70, 0x45,
0xac, 0x20, 0xf7, 0x52, 0x50, 0xb2, 0x2b, 0xdd, 0x11, 0x94, 0xde, 0xf2, 0xee, 0x08, 0x6a, 0xa9, 0xfb, 0x02, 0xa3, 0x3b, 0xe5, 0x97, 0x03, 0xfb, 0x6e, 0x29, 0xde, 0xd4, 0xd6, 0x1c, 0x36, 0xf4,
0xc1, 0xd9, 0x2b, 0xc8, 0x83, 0xb6, 0x13, 0x05, 0xd2, 0x74, 0xdc, 0x16, 0x50, 0x8e, 0xf4, 0xed, 0x21, 0x85, 0xee, 0xbe, 0xc3, 0x04, 0xb5, 0x3f, 0x2b, 0xc7, 0x9c, 0x9a, 0xa3, 0xd0, 0xc9, 0xcf,
0xae, 0x66, 0x3d, 0x29, 0xc0, 0x79, 0x73, 0xbf, 0x9f, 0xc3, 0xf7, 0x0d, 0xc5, 0x7a, 0x5e, 0xe3, 0x90, 0x55, 0x38, 0xae, 0x98, 0x77, 0xab, 0x70, 0x5c, 0x35, 0x9a, 0x9c, 0x35, 0xe4, 0x01, 0x9c,
0xff, 0x69, 0x3f, 0xfb, 0x37, 0x00, 0x00, 0xff, 0xff, 0xf3, 0x7c, 0x9c, 0x49, 0xc1, 0x0f, 0x00, 0x8d, 0x10, 0x74, 0x6b, 0x25, 0x20, 0xfa, 0xe4, 0xb1, 0x7b, 0x6f, 0x67, 0x4c, 0x4d, 0x2c, 0xe0,
0x00, 0xbd, 0xdc, 0x0e, 0x80, 0x56, 0xa4, 0xa6, 0x78, 0x21, 0xb2, 0xef, 0x95, 0xe4, 0xce, 0x05, 0x25,
0xa7, 0xd2, 0x05, 0x41, 0xe9, 0x23, 0xef, 0x82, 0xa0, 0x72, 0x03, 0xce, 0x59, 0x43, 0x3e, 0x6c,
0xb8, 0x71, 0x28, 0x4d, 0x27, 0x63, 0x01, 0xad, 0x90, 0x3e, 0x3f, 0xd5, 0xec, 0xdb, 0x25, 0x38,
0xcf, 0xfa, 0xfb, 0x21, 0xfc, 0xdc, 0x54, 0xac, 0xc7, 0x75, 0xfe, 0x97, 0xc0, 0x97, 0xff, 0x05,
0x00, 0x00, 0xff, 0xff, 0xde, 0xd5, 0x38, 0x1a, 0x00, 0x11, 0x00, 0x00,
} }

@ -122,6 +122,7 @@ func (s *ReleaseServer) prepareRelease(req *services.InstallReleaseRequest) (*re
Manifest: manifestDoc.String(), Manifest: manifestDoc.String(),
Hooks: hooks, Hooks: hooks,
Version: int32(revision), Version: int32(revision),
Annotations: req.Annotations,
} }
if len(notesTxt) > 0 { if len(notesTxt) > 0 {
rel.Info.Status.Notes = notesTxt rel.Info.Status.Notes = notesTxt

@ -106,6 +106,7 @@ func (s *ReleaseServer) prepareRollback(req *services.RollbackReleaseRequest) (*
Version: crls.Version + 1, Version: crls.Version + 1,
Manifest: prls.Manifest, Manifest: prls.Manifest,
Hooks: prls.Hooks, Hooks: prls.Hooks,
Annotations: prls.Annotations,
} }
return crls, target, nil return crls, target, nil

@ -148,6 +148,12 @@ func (s *ReleaseServer) reuseValues(req *services.UpdateReleaseRequest, current
s.Log("copying values from %s (v%d) to new release.", current.Name, current.Version) s.Log("copying values from %s (v%d) to new release.", current.Name, current.Version)
req.Values = current.Config req.Values = current.Config
} }
if len(req.Annotations) == 0 {
s.Log("copying annotations from %s (v%d) to new release.", current.Name, current.Version)
req.Annotations = current.Annotations
}
return nil return nil
} }

@ -122,6 +122,7 @@ func (s *ReleaseServer) prepareUpdate(req *services.UpdateReleaseRequest) (*rele
Version: revision, Version: revision,
Manifest: manifestDoc.String(), Manifest: manifestDoc.String(),
Hooks: hooks, Hooks: hooks,
Annotations: req.Annotations,
} }
if len(notesTxt) > 0 { if len(notesTxt) > 0 {

Loading…
Cancel
Save