Commit 5a5a44ec authored by Adam Reese's avatar Adam Reese

feat(*): add rollback to a release version

closes #1244
parent becc1200
......@@ -183,7 +183,6 @@ message UpdateReleaseRequest {
hapi.chart.Config values = 3;
// dry_run, if true, will run through the release logic, but neither create
bool dry_run = 4;
// DisableHooks causes the server to skip running any hooks for the upgrade.
bool disable_hooks = 5;
}
......@@ -200,6 +199,8 @@ message RollbackReleaseRequest {
bool dry_run = 2;
// DisableHooks causes the server to skip running any hooks for the rollback
bool disable_hooks = 3;
// Version is the version of the release to deploy.
int32 version = 4;
}
// RollbackReleaseResponse is the response to an update request.
......
......@@ -26,12 +26,13 @@ import (
)
const rollbackDesc = `
This command rolls back a release to the previous version.
This command rolls back a release to the previous revision.
The argument of the rollback command is the name of a release.
`
type rollbackCmd struct {
name string
version int32
dryRun bool
disableHooks bool
out io.Writer
......@@ -46,7 +47,7 @@ func newRollbackCmd(c helm.Interface, out io.Writer) *cobra.Command {
cmd := &cobra.Command{
Use: "rollback [RELEASE]",
Short: "roll back a release to the previous version",
Short: "roll back a release to a previous revision",
Long: rollbackDesc,
PersistentPreRunE: setupConnection,
RunE: func(cmd *cobra.Command, args []string) error {
......@@ -60,13 +61,19 @@ func newRollbackCmd(c helm.Interface, out io.Writer) *cobra.Command {
}
f := cmd.Flags()
f.Int32Var(&rollback.version, "revision", 0, "revision to deploy")
f.BoolVar(&rollback.dryRun, "dry-run", false, "simulate a rollback")
f.BoolVar(&rollback.disableHooks, "no-hooks", false, "prevent hooks from running during rollback")
return cmd
}
func (r *rollbackCmd) run() error {
_, err := r.client.RollbackRelease(r.name, helm.RollbackDryRun(r.dryRun), helm.RollbackDisableHooks(r.disableHooks))
_, err := r.client.RollbackRelease(
r.name,
helm.RollbackDryRun(r.dryRun),
helm.RollbackDisableHooks(r.disableHooks),
helm.RollbackVersion(r.version),
)
if err != nil {
return prettyError(err)
}
......
......@@ -29,7 +29,12 @@ func TestRollbackCmd(t *testing.T) {
{
name: "rollback a release",
args: []string{"funny-honey"},
resp: nil,
flags: []string{"revision", "1"},
expected: "Rollback was a success! Happy Helming!",
},
{
name: "rollback a release without version",
args: []string{"funny-honey"},
expected: "Rollback was a success! Happy Helming!",
},
}
......
......@@ -461,7 +461,17 @@ func (s *releaseServer) prepareRollback(req *services.RollbackReleaseRequest) (*
return nil, nil, err
}
previousRelease, err := s.env.Releases.Get(req.Name, currentRelease.Version-1)
v := req.Version
if v == 0 {
v = currentRelease.Version - 1
}
if v < 1 {
return nil, nil, errors.New("cannot rollback to version < 1")
}
log.Printf("rolling back %s to version %d", req.Name, v)
previousRelease, err := s.env.Releases.Get(req.Name, v)
if err != nil {
return nil, nil, err
}
......
......@@ -664,6 +664,27 @@ func TestRollbackReleaseNoHooks(t *testing.T) {
}
}
func TestRollbackWithReleaseVersion(t *testing.T) {
c := helm.NewContext()
rs := rsFixture()
rel := releaseStub()
rs.env.Releases.Create(rel)
upgradedRel := upgradeReleaseVersion(rel)
rs.env.Releases.Update(rel)
rs.env.Releases.Create(upgradedRel)
req := &services.RollbackReleaseRequest{
Name: rel.Name,
DisableHooks: true,
Version: 1,
}
_, err := rs.RollbackRelease(c, req)
if err != nil {
t.Fatalf("Failed rollback: %s", err)
}
}
func TestRollbackRelease(t *testing.T) {
c := helm.NewContext()
rs := rsFixture()
......
......@@ -196,6 +196,13 @@ func RollbackDryRun(dry bool) RollbackOption {
}
}
// RollbackVersion sets the version of the release to deploy.
func RollbackVersion(ver int32) RollbackOption {
return func(opts *options) {
opts.rollbackReq.Version = ver
}
}
// UpgradeDisableHooks will disable hooks for an upgrade operation.
func UpgradeDisableHooks(disable bool) UpdateOption {
return func(opts *options) {
......@@ -333,7 +340,7 @@ func (o *options) rpcRollbackRelease(rlsName string, rlc rls.ReleaseServiceClien
o.rollbackReq.DryRun = o.dryRun
o.rollbackReq.Name = rlsName
return rlc.RollbackRelease(context.TODO(), &o.rollbackReq)
return rlc.RollbackRelease(NewContext(), &o.rollbackReq)
}
// Executes tiller.GetReleaseStatus RPC.
......
......@@ -289,6 +289,8 @@ type RollbackReleaseRequest struct {
DryRun bool `protobuf:"varint,2,opt,name=dry_run,json=dryRun" json:"dry_run,omitempty"`
// DisableHooks causes the server to skip running any hooks for the rollback
DisableHooks bool `protobuf:"varint,3,opt,name=disable_hooks,json=disableHooks" json:"disable_hooks,omitempty"`
// Version is the version of the release to deploy.
Version int32 `protobuf:"varint,4,opt,name=version" json:"version,omitempty"`
}
func (m *RollbackReleaseRequest) Reset() { *m = RollbackReleaseRequest{} }
......@@ -807,64 +809,65 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 944 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x9c, 0x56, 0xdd, 0x6e, 0xe3, 0x44,
0x14, 0xae, 0xf3, 0x9f, 0xd3, 0x1f, 0xd2, 0xb3, 0x69, 0xe3, 0x5a, 0x80, 0x22, 0x23, 0xd8, 0xb0,
0xb0, 0x29, 0x84, 0x5b, 0x84, 0xd4, 0xcd, 0x46, 0x6d, 0xd9, 0x92, 0x95, 0x26, 0x14, 0x24, 0x2e,
0x88, 0xdc, 0x64, 0xb2, 0xf5, 0xae, 0xe3, 0x09, 0x9e, 0x49, 0x45, 0x1f, 0x81, 0x0b, 0x5e, 0x82,
0xf7, 0xe0, 0xc9, 0xb8, 0x41, 0x9e, 0xf1, 0xb8, 0x71, 0x62, 0x6f, 0xbd, 0xb9, 0x89, 0x3d, 0x73,
0x3e, 0x7f, 0xe7, 0x9b, 0xef, 0xcc, 0x9c, 0x09, 0x58, 0xb7, 0xce, 0xc2, 0x3d, 0xe5, 0x34, 0xb8,
0x73, 0x27, 0x94, 0x9f, 0x0a, 0xd7, 0xf3, 0x68, 0xd0, 0x5d, 0x04, 0x4c, 0x30, 0x6c, 0x86, 0xb1,
0xae, 0x8e, 0x75, 0x55, 0xcc, 0x3a, 0x96, 0x5f, 0x4c, 0x6e, 0x9d, 0x40, 0xa8, 0x5f, 0x85, 0xb6,
0x5a, 0xab, 0xf3, 0xcc, 0x9f, 0xb9, 0x6f, 0xa2, 0x80, 0x4a, 0x11, 0x50, 0x8f, 0x3a, 0x9c, 0xea,
0x67, 0xe2, 0x23, 0x1d, 0x73, 0xfd, 0x19, 0x8b, 0x02, 0x27, 0x89, 0x00, 0x17, 0x8e, 0x58, 0xf2,
0x04, 0xdf, 0x1d, 0x0d, 0xb8, 0xcb, 0x7c, 0xfd, 0x54, 0x31, 0xfb, 0x9f, 0x02, 0x3c, 0xb9, 0x72,
0xb9, 0x20, 0xea, 0x43, 0x4e, 0xe8, 0x1f, 0x4b, 0xca, 0x05, 0x36, 0xa1, 0xec, 0xb9, 0x73, 0x57,
0x98, 0x46, 0xdb, 0xe8, 0x14, 0x89, 0x1a, 0xe0, 0x31, 0x54, 0xd8, 0x6c, 0xc6, 0xa9, 0x30, 0x0b,
0x6d, 0xa3, 0x53, 0x27, 0xd1, 0x08, 0x7f, 0x80, 0x2a, 0x67, 0x81, 0x18, 0xdf, 0xdc, 0x9b, 0xc5,
0xb6, 0xd1, 0x39, 0xe8, 0x7d, 0xde, 0x4d, 0xb3, 0xa2, 0x1b, 0x66, 0x1a, 0xb1, 0x40, 0x74, 0xc3,
0x9f, 0x17, 0xf7, 0xa4, 0xc2, 0xe5, 0x33, 0xe4, 0x9d, 0xb9, 0x9e, 0xa0, 0x81, 0x59, 0x52, 0xbc,
0x6a, 0x84, 0xe7, 0x00, 0x92, 0x97, 0x05, 0x53, 0x1a, 0x98, 0x65, 0x49, 0xdd, 0xc9, 0x41, 0xfd,
0x3a, 0xc4, 0x93, 0x3a, 0xd7, 0xaf, 0xf8, 0x3d, 0xec, 0x29, 0x4b, 0xc6, 0x13, 0x36, 0xa5, 0xdc,
0xac, 0xb4, 0x8b, 0x9d, 0x83, 0xde, 0x89, 0xa2, 0xd2, 0x0e, 0x8f, 0x94, 0x69, 0x7d, 0x36, 0xa5,
0x64, 0x57, 0xc1, 0xc3, 0x77, 0x6e, 0xff, 0x0e, 0x35, 0x4d, 0x6f, 0xf7, 0xa0, 0xa2, 0xc4, 0xe3,
0x2e, 0x54, 0xaf, 0x87, 0xaf, 0x86, 0xaf, 0x7f, 0x1d, 0x36, 0x76, 0xb0, 0x06, 0xa5, 0xe1, 0xd9,
0x4f, 0x83, 0x86, 0x81, 0x87, 0xb0, 0x7f, 0x75, 0x36, 0xfa, 0x79, 0x4c, 0x06, 0x57, 0x83, 0xb3,
0xd1, 0xe0, 0x65, 0xa3, 0x60, 0x7f, 0x0a, 0xf5, 0x58, 0x15, 0x56, 0xa1, 0x78, 0x36, 0xea, 0xab,
0x4f, 0x5e, 0x0e, 0x46, 0xfd, 0x86, 0x61, 0xff, 0x65, 0x40, 0x33, 0x59, 0x04, 0xbe, 0x60, 0x3e,
0xa7, 0x61, 0x15, 0x26, 0x6c, 0xe9, 0xc7, 0x55, 0x90, 0x03, 0x44, 0x28, 0xf9, 0xf4, 0x4f, 0x5d,
0x03, 0xf9, 0x1e, 0x22, 0x05, 0x13, 0x8e, 0x27, 0xfd, 0x2f, 0x12, 0x35, 0xc0, 0x6f, 0xa1, 0x16,
0x2d, 0x8e, 0x9b, 0xa5, 0x76, 0xb1, 0xb3, 0xdb, 0x3b, 0x4a, 0x2e, 0x39, 0xca, 0x48, 0x62, 0x98,
0x7d, 0x0e, 0xad, 0x73, 0xaa, 0x95, 0x28, 0x47, 0xf4, 0x9e, 0x08, 0xf3, 0x3a, 0x73, 0x2a, 0xc5,
0x84, 0x79, 0x9d, 0x39, 0x45, 0x13, 0xaa, 0xd1, 0x86, 0x92, 0x72, 0xca, 0x44, 0x0f, 0x6d, 0x01,
0xe6, 0x26, 0x51, 0xb4, 0xae, 0x34, 0xa6, 0x2f, 0xa0, 0x14, 0x6e, 0x67, 0x49, 0xb3, 0xdb, 0xc3,
0xa4, 0xce, 0x4b, 0x7f, 0xc6, 0x88, 0x8c, 0xe3, 0xc7, 0x50, 0x0f, 0xf1, 0x7c, 0xe1, 0x4c, 0xa8,
0x5c, 0x6d, 0x9d, 0x3c, 0x4c, 0xd8, 0x17, 0xab, 0x59, 0xfb, 0xcc, 0x17, 0xd4, 0x17, 0xdb, 0xe9,
0xbf, 0x82, 0x93, 0x14, 0xa6, 0x68, 0x01, 0xa7, 0x50, 0x8d, 0xa4, 0x49, 0xb6, 0x4c, 0x5f, 0x35,
0xca, 0xfe, 0xd7, 0x80, 0xe6, 0xf5, 0x62, 0xea, 0x08, 0xaa, 0x43, 0xef, 0x11, 0xf5, 0x14, 0xca,
0xb2, 0x2d, 0x44, 0x5e, 0x1c, 0x2a, 0x6e, 0xd5, 0x3b, 0xfa, 0xe1, 0x2f, 0x51, 0x71, 0x7c, 0x06,
0x95, 0x3b, 0xc7, 0x5b, 0x52, 0x2e, 0x8d, 0x88, 0x5d, 0x8b, 0x90, 0xb2, 0xa7, 0x90, 0x08, 0x81,
0x2d, 0xa8, 0x4e, 0x83, 0xfb, 0x71, 0xb0, 0xf4, 0xe5, 0x21, 0xab, 0x91, 0xca, 0x34, 0xb8, 0x27,
0x4b, 0x1f, 0x3f, 0x83, 0xfd, 0xa9, 0xcb, 0x9d, 0x1b, 0x8f, 0x8e, 0x6f, 0x19, 0x7b, 0xc7, 0xe5,
0x39, 0xab, 0x91, 0xbd, 0x68, 0xf2, 0x22, 0x9c, 0xb3, 0x2f, 0xe0, 0x68, 0x4d, 0xfe, 0xb6, 0x4e,
0xbc, 0x85, 0x63, 0xc2, 0x3c, 0xef, 0xc6, 0x99, 0xbc, 0xcb, 0x61, 0xc5, 0x8a, 0xea, 0xc2, 0xfb,
0x55, 0x17, 0x53, 0x54, 0xff, 0x08, 0xad, 0x8d, 0x5c, 0xdb, 0xea, 0xfe, 0xcf, 0x80, 0xa3, 0x4b,
0x9f, 0x0b, 0xc7, 0xf3, 0xd6, 0x74, 0xc7, 0xe5, 0x32, 0x72, 0x97, 0xab, 0xf0, 0x21, 0xe5, 0x2a,
0x26, 0x16, 0xae, 0x5d, 0x2a, 0xad, 0xb8, 0x94, 0xa7, 0x84, 0xc9, 0x83, 0x53, 0x59, 0x3b, 0x38,
0xf8, 0x09, 0x40, 0x40, 0x97, 0x9c, 0x8e, 0x25, 0x79, 0x55, 0x7e, 0x5f, 0x97, 0x33, 0x43, 0x67,
0x4e, 0xed, 0x4b, 0x38, 0x5e, 0x5f, 0xfc, 0xb6, 0x46, 0xde, 0x42, 0xeb, 0xda, 0x77, 0x53, 0x9d,
0x4c, 0xdb, 0x01, 0x1b, 0x6b, 0x2b, 0xa4, 0xac, 0xad, 0x09, 0xe5, 0xc5, 0x32, 0x78, 0x43, 0x23,
0xaf, 0xd4, 0xc0, 0x7e, 0x05, 0xe6, 0x66, 0xa6, 0x6d, 0x65, 0x3f, 0x81, 0xc3, 0x73, 0x2a, 0x7e,
0x51, 0xdd, 0x21, 0x12, 0x6c, 0x0f, 0x00, 0x57, 0x27, 0x1f, 0xb8, 0xa3, 0xa9, 0x24, 0xb7, 0xbe,
0x7a, 0x35, 0x5e, 0xa3, 0x7a, 0x7f, 0x57, 0xe1, 0x40, 0x77, 0x4a, 0x75, 0xaf, 0xa1, 0x0b, 0x7b,
0xab, 0x57, 0x02, 0x7e, 0x99, 0x7d, 0xed, 0xad, 0xdd, 0xdd, 0xd6, 0xb3, 0x3c, 0x50, 0x25, 0xd5,
0xde, 0xf9, 0xc6, 0x40, 0x0e, 0x8d, 0xf5, 0x4e, 0x8d, 0xcf, 0xd3, 0x39, 0x32, 0xae, 0x06, 0xab,
0x9b, 0x17, 0xae, 0xd3, 0xe2, 0x9d, 0xb4, 0x33, 0xd9, 0x5e, 0xf1, 0x51, 0x9a, 0x64, 0x47, 0xb7,
0x4e, 0x73, 0xe3, 0xe3, 0xbc, 0x6f, 0x61, 0x3f, 0xd1, 0xc8, 0x30, 0xc3, 0xad, 0xb4, 0x66, 0x6d,
0x7d, 0x95, 0x0b, 0x1b, 0xe7, 0x9a, 0xc3, 0x41, 0xf2, 0xd0, 0x60, 0x06, 0x41, 0x6a, 0x5f, 0xb1,
0xbe, 0xce, 0x07, 0x8e, 0xd3, 0x71, 0x68, 0xac, 0x6f, 0xf7, 0xac, 0x3a, 0x66, 0x1c, 0xc0, 0xac,
0x3a, 0x66, 0x9d, 0x22, 0x7b, 0x07, 0x1d, 0x80, 0x87, 0x13, 0x80, 0x4f, 0x33, 0x0b, 0x92, 0x3c,
0x38, 0x56, 0xe7, 0x71, 0x60, 0x9c, 0x62, 0x01, 0x1f, 0xad, 0x75, 0x71, 0xcc, 0xb0, 0x26, 0xfd,
0x62, 0xb1, 0x9e, 0xe7, 0x44, 0xeb, 0x8c, 0x2f, 0xe0, 0xb7, 0x9a, 0x06, 0xdf, 0x54, 0xe4, 0x1f,
0xe5, 0xef, 0xfe, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x0b, 0x37, 0x7c, 0x73, 0xf9, 0x0b, 0x00, 0x00,
// 951 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x9c, 0x56, 0x5f, 0x6f, 0xe3, 0x44,
0x10, 0xaf, 0xf3, 0x3f, 0xd3, 0x3f, 0xa4, 0x73, 0x69, 0xe3, 0x5a, 0x80, 0x22, 0x23, 0xb8, 0x70,
0x70, 0x29, 0x84, 0x57, 0x84, 0xd4, 0xcb, 0x45, 0x6d, 0xb9, 0x92, 0x93, 0x36, 0x14, 0x24, 0x1e,
0x88, 0xdc, 0x64, 0x73, 0x35, 0xe7, 0x78, 0x83, 0x77, 0x53, 0xd1, 0x77, 0x5e, 0x78, 0xe0, 0x4b,
0xf0, 0x3d, 0xf8, 0x64, 0xbc, 0x20, 0xef, 0x7a, 0xdd, 0x38, 0xb1, 0xaf, 0xbe, 0xbc, 0xc4, 0xde,
0x9d, 0x9f, 0x7f, 0x33, 0xf3, 0x9b, 0x9d, 0xd9, 0x80, 0x75, 0xeb, 0x2c, 0xdc, 0x53, 0x4e, 0x83,
0x3b, 0x77, 0x42, 0xf9, 0xa9, 0x70, 0x3d, 0x8f, 0x06, 0xdd, 0x45, 0xc0, 0x04, 0xc3, 0x66, 0x68,
0xeb, 0x6a, 0x5b, 0x57, 0xd9, 0xac, 0x63, 0xf9, 0xc5, 0xe4, 0xd6, 0x09, 0x84, 0xfa, 0x55, 0x68,
0xab, 0xb5, 0xba, 0xcf, 0xfc, 0x99, 0xfb, 0x26, 0x32, 0x28, 0x17, 0x01, 0xf5, 0xa8, 0xc3, 0xa9,
0x7e, 0x26, 0x3e, 0xd2, 0x36, 0xd7, 0x9f, 0xb1, 0xc8, 0x70, 0x92, 0x30, 0x70, 0xe1, 0x88, 0x25,
0x4f, 0xf0, 0xdd, 0xd1, 0x80, 0xbb, 0xcc, 0xd7, 0x4f, 0x65, 0xb3, 0xff, 0x29, 0xc0, 0x93, 0x2b,
0x97, 0x0b, 0xa2, 0x3e, 0xe4, 0x84, 0xfe, 0xbe, 0xa4, 0x5c, 0x60, 0x13, 0xca, 0x9e, 0x3b, 0x77,
0x85, 0x69, 0xb4, 0x8d, 0x4e, 0x91, 0xa8, 0x05, 0x1e, 0x43, 0x85, 0xcd, 0x66, 0x9c, 0x0a, 0xb3,
0xd0, 0x36, 0x3a, 0x75, 0x12, 0xad, 0xf0, 0x3b, 0xa8, 0x72, 0x16, 0x88, 0xf1, 0xcd, 0xbd, 0x59,
0x6c, 0x1b, 0x9d, 0x83, 0xde, 0xa7, 0xdd, 0x34, 0x29, 0xba, 0xa1, 0xa7, 0x11, 0x0b, 0x44, 0x37,
0xfc, 0x79, 0x71, 0x4f, 0x2a, 0x5c, 0x3e, 0x43, 0xde, 0x99, 0xeb, 0x09, 0x1a, 0x98, 0x25, 0xc5,
0xab, 0x56, 0x78, 0x0e, 0x20, 0x79, 0x59, 0x30, 0xa5, 0x81, 0x59, 0x96, 0xd4, 0x9d, 0x1c, 0xd4,
0xaf, 0x43, 0x3c, 0xa9, 0x73, 0xfd, 0x8a, 0xdf, 0xc2, 0x9e, 0x92, 0x64, 0x3c, 0x61, 0x53, 0xca,
0xcd, 0x4a, 0xbb, 0xd8, 0x39, 0xe8, 0x9d, 0x28, 0x2a, 0xad, 0xf0, 0x48, 0x89, 0xd6, 0x67, 0x53,
0x4a, 0x76, 0x15, 0x3c, 0x7c, 0xe7, 0xf6, 0xaf, 0x50, 0xd3, 0xf4, 0x76, 0x0f, 0x2a, 0x2a, 0x78,
0xdc, 0x85, 0xea, 0xf5, 0xf0, 0xd5, 0xf0, 0xf5, 0xcf, 0xc3, 0xc6, 0x0e, 0xd6, 0xa0, 0x34, 0x3c,
0xfb, 0x61, 0xd0, 0x30, 0xf0, 0x10, 0xf6, 0xaf, 0xce, 0x46, 0x3f, 0x8e, 0xc9, 0xe0, 0x6a, 0x70,
0x36, 0x1a, 0xbc, 0x6c, 0x14, 0xec, 0x8f, 0xa1, 0x1e, 0x47, 0x85, 0x55, 0x28, 0x9e, 0x8d, 0xfa,
0xea, 0x93, 0x97, 0x83, 0x51, 0xbf, 0x61, 0xd8, 0x7f, 0x19, 0xd0, 0x4c, 0x16, 0x81, 0x2f, 0x98,
0xcf, 0x69, 0x58, 0x85, 0x09, 0x5b, 0xfa, 0x71, 0x15, 0xe4, 0x02, 0x11, 0x4a, 0x3e, 0xfd, 0x43,
0xd7, 0x40, 0xbe, 0x87, 0x48, 0xc1, 0x84, 0xe3, 0x49, 0xfd, 0x8b, 0x44, 0x2d, 0xf0, 0x6b, 0xa8,
0x45, 0xc9, 0x71, 0xb3, 0xd4, 0x2e, 0x76, 0x76, 0x7b, 0x47, 0xc9, 0x94, 0x23, 0x8f, 0x24, 0x86,
0xd9, 0xe7, 0xd0, 0x3a, 0xa7, 0x3a, 0x12, 0xa5, 0x88, 0x3e, 0x13, 0xa1, 0x5f, 0x67, 0x4e, 0x65,
0x30, 0xa1, 0x5f, 0x67, 0x4e, 0xd1, 0x84, 0x6a, 0x74, 0xa0, 0x64, 0x38, 0x65, 0xa2, 0x97, 0xb6,
0x00, 0x73, 0x93, 0x28, 0xca, 0x2b, 0x8d, 0xe9, 0x33, 0x28, 0x85, 0xc7, 0x59, 0xd2, 0xec, 0xf6,
0x30, 0x19, 0xe7, 0xa5, 0x3f, 0x63, 0x44, 0xda, 0xf1, 0x43, 0xa8, 0x87, 0x78, 0xbe, 0x70, 0x26,
0x54, 0x66, 0x5b, 0x27, 0x0f, 0x1b, 0xf6, 0xc5, 0xaa, 0xd7, 0x3e, 0xf3, 0x05, 0xf5, 0xc5, 0x76,
0xf1, 0x5f, 0xc1, 0x49, 0x0a, 0x53, 0x94, 0xc0, 0x29, 0x54, 0xa3, 0xd0, 0x24, 0x5b, 0xa6, 0xae,
0x1a, 0x65, 0xff, 0x6b, 0x40, 0xf3, 0x7a, 0x31, 0x75, 0x04, 0xd5, 0xa6, 0x77, 0x04, 0xf5, 0x14,
0xca, 0x72, 0x2c, 0x44, 0x5a, 0x1c, 0x2a, 0x6e, 0x35, 0x3b, 0xfa, 0xe1, 0x2f, 0x51, 0x76, 0x7c,
0x06, 0x95, 0x3b, 0xc7, 0x5b, 0x52, 0x2e, 0x85, 0x88, 0x55, 0x8b, 0x90, 0x72, 0xa6, 0x90, 0x08,
0x81, 0x2d, 0xa8, 0x4e, 0x83, 0xfb, 0x71, 0xb0, 0xf4, 0x65, 0x93, 0xd5, 0x48, 0x65, 0x1a, 0xdc,
0x93, 0xa5, 0x8f, 0x9f, 0xc0, 0xfe, 0xd4, 0xe5, 0xce, 0x8d, 0x47, 0xc7, 0xb7, 0x8c, 0xbd, 0xe5,
0xb2, 0xcf, 0x6a, 0x64, 0x2f, 0xda, 0xbc, 0x08, 0xf7, 0xec, 0x0b, 0x38, 0x5a, 0x0b, 0x7f, 0x5b,
0x25, 0xfe, 0x34, 0xe0, 0x98, 0x30, 0xcf, 0xbb, 0x71, 0x26, 0x6f, 0x73, 0x68, 0xb1, 0x12, 0x76,
0xe1, 0xdd, 0x61, 0x17, 0x37, 0xc3, 0x5e, 0x2d, 0x6f, 0x29, 0x59, 0xde, 0xef, 0xa1, 0xb5, 0x11,
0xc5, 0xb6, 0x29, 0xfd, 0x67, 0xc0, 0xd1, 0xa5, 0xcf, 0x85, 0xe3, 0x79, 0x6b, 0x19, 0xc5, 0x95,
0x34, 0x72, 0x57, 0xb2, 0xf0, 0x3e, 0x95, 0x2c, 0x26, 0x24, 0xd1, 0xfa, 0x95, 0x56, 0xf4, 0xcb,
0x53, 0xdd, 0x64, 0x4f, 0x55, 0xd6, 0x7a, 0x0a, 0x3f, 0x02, 0x08, 0xe8, 0x92, 0xd3, 0xb1, 0x24,
0xaf, 0xca, 0xef, 0xeb, 0x72, 0x67, 0xe8, 0xcc, 0xa9, 0x7d, 0x09, 0xc7, 0xeb, 0xc9, 0x6f, 0x2b,
0xe4, 0x2d, 0xb4, 0xae, 0x7d, 0x37, 0x55, 0xc9, 0xb4, 0xb3, 0xb1, 0x91, 0x5b, 0x21, 0x25, 0xb7,
0x26, 0x94, 0x17, 0xcb, 0xe0, 0x0d, 0x8d, 0xb4, 0x52, 0x0b, 0xfb, 0x15, 0x98, 0x9b, 0x9e, 0xb6,
0x0d, 0xfb, 0x09, 0x1c, 0x9e, 0x53, 0xf1, 0x93, 0x3a, 0x59, 0x51, 0xc0, 0xf6, 0x00, 0x70, 0x75,
0xf3, 0x81, 0x3b, 0xda, 0x4a, 0x72, 0xeb, 0x5b, 0x59, 0xe3, 0x35, 0xaa, 0xf7, 0x77, 0x15, 0x0e,
0xf4, 0x10, 0x55, 0x57, 0x1e, 0xba, 0xb0, 0xb7, 0x7a, 0x5b, 0xe0, 0xe7, 0xd9, 0x37, 0xe2, 0xda,
0xb5, 0x6e, 0x3d, 0xcb, 0x03, 0x55, 0xa1, 0xda, 0x3b, 0x5f, 0x19, 0xc8, 0xa1, 0xb1, 0x3e, 0xc4,
0xf1, 0x79, 0x3a, 0x47, 0xc6, 0xad, 0x61, 0x75, 0xf3, 0xc2, 0xb5, 0x5b, 0xbc, 0x93, 0x72, 0x26,
0x27, 0x2f, 0x3e, 0x4a, 0x93, 0x1c, 0xf6, 0xd6, 0x69, 0x6e, 0x7c, 0xec, 0xf7, 0x37, 0xd8, 0x4f,
0xcc, 0x38, 0xcc, 0x50, 0x2b, 0x6d, 0x8e, 0x5b, 0x5f, 0xe4, 0xc2, 0xc6, 0xbe, 0xe6, 0x70, 0x90,
0x6c, 0x1a, 0xcc, 0x20, 0x48, 0x9d, 0x2b, 0xd6, 0x97, 0xf9, 0xc0, 0xb1, 0x3b, 0x0e, 0x8d, 0xf5,
0xe3, 0x9e, 0x55, 0xc7, 0x8c, 0x06, 0xcc, 0xaa, 0x63, 0x56, 0x17, 0xd9, 0x3b, 0xe8, 0x00, 0x3c,
0x74, 0x00, 0x3e, 0xcd, 0x2c, 0x48, 0xb2, 0x71, 0xac, 0xce, 0xe3, 0xc0, 0xd8, 0xc5, 0x02, 0x3e,
0x58, 0x9b, 0xe2, 0x98, 0x21, 0x4d, 0xfa, 0x95, 0x63, 0x3d, 0xcf, 0x89, 0xd6, 0x1e, 0x5f, 0xc0,
0x2f, 0x35, 0x0d, 0xbe, 0xa9, 0xc8, 0xff, 0xd0, 0xdf, 0xfc, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x76,
0x9b, 0x44, 0xa7, 0x14, 0x0c, 0x00, 0x00,
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment