diff --git a/CHANGELOG.md b/CHANGELOG.md index 769c9a67175c..7cb4d47436a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Features +* (x/staking) [#13122](https://github.com/cosmos/cosmos-sdk/pull/13122) Add `UnbondingCanComplete` and `PutUnbondingOnHold` to `x/staking` module. * [#13437](https://github.com/cosmos/cosmos-sdk/pull/13437) Add new flag `--modules-to-export` in `simd export` command to export only selected modules. * [#13435](https://github.com/cosmos/cosmos-sdk/pull/13435) Extend error context when a simulation fails. * [#13298](https://github.com/cosmos/cosmos-sdk/pull/13298) Add `AddGenesisAccount` helper func in x/auth module which helps adding accounts to genesis state. @@ -101,6 +102,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### API Breaking Changes +* (x/slashing, x/staking) [#13122](https://github.com/cosmos/cosmos-sdk/pull/13122) Add the infraction a validator commited type as an argument to the `Slash` keeper method. * [#13437](https://github.com/cosmos/cosmos-sdk/pull/13437) Add a list of modules to export argument in `ExportAppStateAndValidators`. * (x/slashing) [#13427](https://github.com/cosmos/cosmos-sdk/pull/13427) Move `x/slashing/testslashing` to `x/slashing/testutil` for consistency with other modules. * (x/staking) [#13427](https://github.com/cosmos/cosmos-sdk/pull/13427) Move `x/staking/teststaking` to `x/staking/testutil` for consistency with other modules. diff --git a/api/cosmos/staking/v1beta1/staking.pulsar.go b/api/cosmos/staking/v1beta1/staking.pulsar.go index c674415af918..b9acb126a61c 100644 --- a/api/cosmos/staking/v1beta1/staking.pulsar.go +++ b/api/cosmos/staking/v1beta1/staking.pulsar.go @@ -3,6 +3,7 @@ package stakingv1beta1 import ( v1beta1 "cosmossdk.io/api/cosmos/base/v1beta1" + abci "cosmossdk.io/api/tendermint/abci" types "cosmossdk.io/api/tendermint/types" fmt "fmt" _ "github.com/cosmos/cosmos-proto" @@ -2330,19 +2331,67 @@ func (x *fastReflection_Description) ProtoMethods() *protoiface.Methods { } } +var _ protoreflect.List = (*_Validator_13_list)(nil) + +type _Validator_13_list struct { + list *[]uint64 +} + +func (x *_Validator_13_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} + +func (x *_Validator_13_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfUint64((*x.list)[i]) +} + +func (x *_Validator_13_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.Uint() + concreteValue := valueUnwrapped + (*x.list)[i] = concreteValue +} + +func (x *_Validator_13_list) Append(value protoreflect.Value) { + valueUnwrapped := value.Uint() + concreteValue := valueUnwrapped + *x.list = append(*x.list, concreteValue) +} + +func (x *_Validator_13_list) AppendMutable() protoreflect.Value { + panic(fmt.Errorf("AppendMutable can not be called on message Validator at list field UnbondingIds as it is not of Message kind")) +} + +func (x *_Validator_13_list) Truncate(n int) { + *x.list = (*x.list)[:n] +} + +func (x *_Validator_13_list) NewElement() protoreflect.Value { + v := uint64(0) + return protoreflect.ValueOfUint64(v) +} + +func (x *_Validator_13_list) IsValid() bool { + return x.list != nil +} + var ( - md_Validator protoreflect.MessageDescriptor - fd_Validator_operator_address protoreflect.FieldDescriptor - fd_Validator_consensus_pubkey protoreflect.FieldDescriptor - fd_Validator_jailed protoreflect.FieldDescriptor - fd_Validator_status protoreflect.FieldDescriptor - fd_Validator_tokens protoreflect.FieldDescriptor - fd_Validator_delegator_shares protoreflect.FieldDescriptor - fd_Validator_description protoreflect.FieldDescriptor - fd_Validator_unbonding_height protoreflect.FieldDescriptor - fd_Validator_unbonding_time protoreflect.FieldDescriptor - fd_Validator_commission protoreflect.FieldDescriptor - fd_Validator_min_self_delegation protoreflect.FieldDescriptor + md_Validator protoreflect.MessageDescriptor + fd_Validator_operator_address protoreflect.FieldDescriptor + fd_Validator_consensus_pubkey protoreflect.FieldDescriptor + fd_Validator_jailed protoreflect.FieldDescriptor + fd_Validator_status protoreflect.FieldDescriptor + fd_Validator_tokens protoreflect.FieldDescriptor + fd_Validator_delegator_shares protoreflect.FieldDescriptor + fd_Validator_description protoreflect.FieldDescriptor + fd_Validator_unbonding_height protoreflect.FieldDescriptor + fd_Validator_unbonding_time protoreflect.FieldDescriptor + fd_Validator_commission protoreflect.FieldDescriptor + fd_Validator_min_self_delegation protoreflect.FieldDescriptor + fd_Validator_unbonding_on_hold_ref_count protoreflect.FieldDescriptor + fd_Validator_unbonding_ids protoreflect.FieldDescriptor ) func init() { @@ -2359,6 +2408,8 @@ func init() { fd_Validator_unbonding_time = md_Validator.Fields().ByName("unbonding_time") fd_Validator_commission = md_Validator.Fields().ByName("commission") fd_Validator_min_self_delegation = md_Validator.Fields().ByName("min_self_delegation") + fd_Validator_unbonding_on_hold_ref_count = md_Validator.Fields().ByName("unbonding_on_hold_ref_count") + fd_Validator_unbonding_ids = md_Validator.Fields().ByName("unbonding_ids") } var _ protoreflect.Message = (*fastReflection_Validator)(nil) @@ -2492,6 +2543,18 @@ func (x *fastReflection_Validator) Range(f func(protoreflect.FieldDescriptor, pr return } } + if x.UnbondingOnHoldRefCount != int64(0) { + value := protoreflect.ValueOfInt64(x.UnbondingOnHoldRefCount) + if !f(fd_Validator_unbonding_on_hold_ref_count, value) { + return + } + } + if len(x.UnbondingIds) != 0 { + value := protoreflect.ValueOfList(&_Validator_13_list{list: &x.UnbondingIds}) + if !f(fd_Validator_unbonding_ids, value) { + return + } + } } // Has reports whether a field is populated. @@ -2529,6 +2592,10 @@ func (x *fastReflection_Validator) Has(fd protoreflect.FieldDescriptor) bool { return x.Commission != nil case "cosmos.staking.v1beta1.Validator.min_self_delegation": return x.MinSelfDelegation != "" + case "cosmos.staking.v1beta1.Validator.unbonding_on_hold_ref_count": + return x.UnbondingOnHoldRefCount != int64(0) + case "cosmos.staking.v1beta1.Validator.unbonding_ids": + return len(x.UnbondingIds) != 0 default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Validator")) @@ -2567,6 +2634,10 @@ func (x *fastReflection_Validator) Clear(fd protoreflect.FieldDescriptor) { x.Commission = nil case "cosmos.staking.v1beta1.Validator.min_self_delegation": x.MinSelfDelegation = "" + case "cosmos.staking.v1beta1.Validator.unbonding_on_hold_ref_count": + x.UnbondingOnHoldRefCount = int64(0) + case "cosmos.staking.v1beta1.Validator.unbonding_ids": + x.UnbondingIds = nil default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Validator")) @@ -2616,6 +2687,15 @@ func (x *fastReflection_Validator) Get(descriptor protoreflect.FieldDescriptor) case "cosmos.staking.v1beta1.Validator.min_self_delegation": value := x.MinSelfDelegation return protoreflect.ValueOfString(value) + case "cosmos.staking.v1beta1.Validator.unbonding_on_hold_ref_count": + value := x.UnbondingOnHoldRefCount + return protoreflect.ValueOfInt64(value) + case "cosmos.staking.v1beta1.Validator.unbonding_ids": + if len(x.UnbondingIds) == 0 { + return protoreflect.ValueOfList(&_Validator_13_list{}) + } + listValue := &_Validator_13_list{list: &x.UnbondingIds} + return protoreflect.ValueOfList(listValue) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Validator")) @@ -2658,6 +2738,12 @@ func (x *fastReflection_Validator) Set(fd protoreflect.FieldDescriptor, value pr x.Commission = value.Message().Interface().(*Commission) case "cosmos.staking.v1beta1.Validator.min_self_delegation": x.MinSelfDelegation = value.Interface().(string) + case "cosmos.staking.v1beta1.Validator.unbonding_on_hold_ref_count": + x.UnbondingOnHoldRefCount = value.Int() + case "cosmos.staking.v1beta1.Validator.unbonding_ids": + lv := value.List() + clv := lv.(*_Validator_13_list) + x.UnbondingIds = *clv.list default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Validator")) @@ -2698,6 +2784,12 @@ func (x *fastReflection_Validator) Mutable(fd protoreflect.FieldDescriptor) prot x.Commission = new(Commission) } return protoreflect.ValueOfMessage(x.Commission.ProtoReflect()) + case "cosmos.staking.v1beta1.Validator.unbonding_ids": + if x.UnbondingIds == nil { + x.UnbondingIds = []uint64{} + } + value := &_Validator_13_list{list: &x.UnbondingIds} + return protoreflect.ValueOfList(value) case "cosmos.staking.v1beta1.Validator.operator_address": panic(fmt.Errorf("field operator_address of message cosmos.staking.v1beta1.Validator is not mutable")) case "cosmos.staking.v1beta1.Validator.jailed": @@ -2712,6 +2804,8 @@ func (x *fastReflection_Validator) Mutable(fd protoreflect.FieldDescriptor) prot panic(fmt.Errorf("field unbonding_height of message cosmos.staking.v1beta1.Validator is not mutable")) case "cosmos.staking.v1beta1.Validator.min_self_delegation": panic(fmt.Errorf("field min_self_delegation of message cosmos.staking.v1beta1.Validator is not mutable")) + case "cosmos.staking.v1beta1.Validator.unbonding_on_hold_ref_count": + panic(fmt.Errorf("field unbonding_on_hold_ref_count of message cosmos.staking.v1beta1.Validator is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Validator")) @@ -2751,6 +2845,11 @@ func (x *fastReflection_Validator) NewField(fd protoreflect.FieldDescriptor) pro return protoreflect.ValueOfMessage(m.ProtoReflect()) case "cosmos.staking.v1beta1.Validator.min_self_delegation": return protoreflect.ValueOfString("") + case "cosmos.staking.v1beta1.Validator.unbonding_on_hold_ref_count": + return protoreflect.ValueOfInt64(int64(0)) + case "cosmos.staking.v1beta1.Validator.unbonding_ids": + list := []uint64{} + return protoreflect.ValueOfList(&_Validator_13_list{list: &list}) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.Validator")) @@ -2861,6 +2960,16 @@ func (x *fastReflection_Validator) ProtoMethods() *protoiface.Methods { if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } + if x.UnbondingOnHoldRefCount != 0 { + n += 1 + runtime.Sov(uint64(x.UnbondingOnHoldRefCount)) + } + if len(x.UnbondingIds) > 0 { + l = 0 + for _, e := range x.UnbondingIds { + l += runtime.Sov(uint64(e)) + } + n += 1 + runtime.Sov(uint64(l)) + l + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -2890,6 +2999,31 @@ func (x *fastReflection_Validator) ProtoMethods() *protoiface.Methods { i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if len(x.UnbondingIds) > 0 { + var pksize2 int + for _, num := range x.UnbondingIds { + pksize2 += runtime.Sov(uint64(num)) + } + i -= pksize2 + j1 := i + for _, num := range x.UnbondingIds { + for num >= 1<<7 { + dAtA[j1] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j1++ + } + dAtA[j1] = uint8(num) + j1++ + } + i = runtime.EncodeVarint(dAtA, i, uint64(pksize2)) + i-- + dAtA[i] = 0x6a + } + if x.UnbondingOnHoldRefCount != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.UnbondingOnHoldRefCount)) + i-- + dAtA[i] = 0x60 + } if len(x.MinSelfDelegation) > 0 { i -= len(x.MinSelfDelegation) copy(dAtA[i:], x.MinSelfDelegation) @@ -3373,6 +3507,101 @@ func (x *fastReflection_Validator) ProtoMethods() *protoiface.Methods { } x.MinSelfDelegation = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 12: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHoldRefCount", wireType) + } + x.UnbondingOnHoldRefCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.UnbondingOnHoldRefCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 13: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + x.UnbondingIds = append(x.UnbondingIds, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(x.UnbondingIds) == 0 { + x.UnbondingIds = make([]uint64, 0, elementCount) + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + x.UnbondingIds = append(x.UnbondingIds, v) + } + } else { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field UnbondingIds", wireType) + } default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -7079,11 +7308,13 @@ func (x *fastReflection_UnbondingDelegation) ProtoMethods() *protoiface.Methods } var ( - md_UnbondingDelegationEntry protoreflect.MessageDescriptor - fd_UnbondingDelegationEntry_creation_height protoreflect.FieldDescriptor - fd_UnbondingDelegationEntry_completion_time protoreflect.FieldDescriptor - fd_UnbondingDelegationEntry_initial_balance protoreflect.FieldDescriptor - fd_UnbondingDelegationEntry_balance protoreflect.FieldDescriptor + md_UnbondingDelegationEntry protoreflect.MessageDescriptor + fd_UnbondingDelegationEntry_creation_height protoreflect.FieldDescriptor + fd_UnbondingDelegationEntry_completion_time protoreflect.FieldDescriptor + fd_UnbondingDelegationEntry_initial_balance protoreflect.FieldDescriptor + fd_UnbondingDelegationEntry_balance protoreflect.FieldDescriptor + fd_UnbondingDelegationEntry_unbonding_id protoreflect.FieldDescriptor + fd_UnbondingDelegationEntry_unbonding_on_hold_ref_count protoreflect.FieldDescriptor ) func init() { @@ -7093,6 +7324,8 @@ func init() { fd_UnbondingDelegationEntry_completion_time = md_UnbondingDelegationEntry.Fields().ByName("completion_time") fd_UnbondingDelegationEntry_initial_balance = md_UnbondingDelegationEntry.Fields().ByName("initial_balance") fd_UnbondingDelegationEntry_balance = md_UnbondingDelegationEntry.Fields().ByName("balance") + fd_UnbondingDelegationEntry_unbonding_id = md_UnbondingDelegationEntry.Fields().ByName("unbonding_id") + fd_UnbondingDelegationEntry_unbonding_on_hold_ref_count = md_UnbondingDelegationEntry.Fields().ByName("unbonding_on_hold_ref_count") } var _ protoreflect.Message = (*fastReflection_UnbondingDelegationEntry)(nil) @@ -7184,6 +7417,18 @@ func (x *fastReflection_UnbondingDelegationEntry) Range(f func(protoreflect.Fiel return } } + if x.UnbondingId != uint64(0) { + value := protoreflect.ValueOfUint64(x.UnbondingId) + if !f(fd_UnbondingDelegationEntry_unbonding_id, value) { + return + } + } + if x.UnbondingOnHoldRefCount != int64(0) { + value := protoreflect.ValueOfInt64(x.UnbondingOnHoldRefCount) + if !f(fd_UnbondingDelegationEntry_unbonding_on_hold_ref_count, value) { + return + } + } } // Has reports whether a field is populated. @@ -7207,6 +7452,10 @@ func (x *fastReflection_UnbondingDelegationEntry) Has(fd protoreflect.FieldDescr return x.InitialBalance != "" case "cosmos.staking.v1beta1.UnbondingDelegationEntry.balance": return x.Balance != "" + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_id": + return x.UnbondingId != uint64(0) + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_on_hold_ref_count": + return x.UnbondingOnHoldRefCount != int64(0) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.UnbondingDelegationEntry")) @@ -7231,6 +7480,10 @@ func (x *fastReflection_UnbondingDelegationEntry) Clear(fd protoreflect.FieldDes x.InitialBalance = "" case "cosmos.staking.v1beta1.UnbondingDelegationEntry.balance": x.Balance = "" + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_id": + x.UnbondingId = uint64(0) + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_on_hold_ref_count": + x.UnbondingOnHoldRefCount = int64(0) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.UnbondingDelegationEntry")) @@ -7259,6 +7512,12 @@ func (x *fastReflection_UnbondingDelegationEntry) Get(descriptor protoreflect.Fi case "cosmos.staking.v1beta1.UnbondingDelegationEntry.balance": value := x.Balance return protoreflect.ValueOfString(value) + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_id": + value := x.UnbondingId + return protoreflect.ValueOfUint64(value) + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_on_hold_ref_count": + value := x.UnbondingOnHoldRefCount + return protoreflect.ValueOfInt64(value) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.UnbondingDelegationEntry")) @@ -7287,6 +7546,10 @@ func (x *fastReflection_UnbondingDelegationEntry) Set(fd protoreflect.FieldDescr x.InitialBalance = value.Interface().(string) case "cosmos.staking.v1beta1.UnbondingDelegationEntry.balance": x.Balance = value.Interface().(string) + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_id": + x.UnbondingId = value.Uint() + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_on_hold_ref_count": + x.UnbondingOnHoldRefCount = value.Int() default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.UnbondingDelegationEntry")) @@ -7318,6 +7581,10 @@ func (x *fastReflection_UnbondingDelegationEntry) Mutable(fd protoreflect.FieldD panic(fmt.Errorf("field initial_balance of message cosmos.staking.v1beta1.UnbondingDelegationEntry is not mutable")) case "cosmos.staking.v1beta1.UnbondingDelegationEntry.balance": panic(fmt.Errorf("field balance of message cosmos.staking.v1beta1.UnbondingDelegationEntry is not mutable")) + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_id": + panic(fmt.Errorf("field unbonding_id of message cosmos.staking.v1beta1.UnbondingDelegationEntry is not mutable")) + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_on_hold_ref_count": + panic(fmt.Errorf("field unbonding_on_hold_ref_count of message cosmos.staking.v1beta1.UnbondingDelegationEntry is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.UnbondingDelegationEntry")) @@ -7340,6 +7607,10 @@ func (x *fastReflection_UnbondingDelegationEntry) NewField(fd protoreflect.Field return protoreflect.ValueOfString("") case "cosmos.staking.v1beta1.UnbondingDelegationEntry.balance": return protoreflect.ValueOfString("") + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_id": + return protoreflect.ValueOfUint64(uint64(0)) + case "cosmos.staking.v1beta1.UnbondingDelegationEntry.unbonding_on_hold_ref_count": + return protoreflect.ValueOfInt64(int64(0)) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.UnbondingDelegationEntry")) @@ -7424,6 +7695,12 @@ func (x *fastReflection_UnbondingDelegationEntry) ProtoMethods() *protoiface.Met if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } + if x.UnbondingId != 0 { + n += 1 + runtime.Sov(uint64(x.UnbondingId)) + } + if x.UnbondingOnHoldRefCount != 0 { + n += 1 + runtime.Sov(uint64(x.UnbondingOnHoldRefCount)) + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -7453,6 +7730,16 @@ func (x *fastReflection_UnbondingDelegationEntry) ProtoMethods() *protoiface.Met i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if x.UnbondingOnHoldRefCount != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.UnbondingOnHoldRefCount)) + i-- + dAtA[i] = 0x30 + } + if x.UnbondingId != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.UnbondingId)) + i-- + dAtA[i] = 0x28 + } if len(x.Balance) > 0 { i -= len(x.Balance) copy(dAtA[i:], x.Balance) @@ -7654,6 +7941,44 @@ func (x *fastReflection_UnbondingDelegationEntry) ProtoMethods() *protoiface.Met } x.Balance = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field UnbondingId", wireType) + } + x.UnbondingId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.UnbondingId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHoldRefCount", wireType) + } + x.UnbondingOnHoldRefCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.UnbondingOnHoldRefCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -7690,11 +8015,13 @@ func (x *fastReflection_UnbondingDelegationEntry) ProtoMethods() *protoiface.Met } var ( - md_RedelegationEntry protoreflect.MessageDescriptor - fd_RedelegationEntry_creation_height protoreflect.FieldDescriptor - fd_RedelegationEntry_completion_time protoreflect.FieldDescriptor - fd_RedelegationEntry_initial_balance protoreflect.FieldDescriptor - fd_RedelegationEntry_shares_dst protoreflect.FieldDescriptor + md_RedelegationEntry protoreflect.MessageDescriptor + fd_RedelegationEntry_creation_height protoreflect.FieldDescriptor + fd_RedelegationEntry_completion_time protoreflect.FieldDescriptor + fd_RedelegationEntry_initial_balance protoreflect.FieldDescriptor + fd_RedelegationEntry_shares_dst protoreflect.FieldDescriptor + fd_RedelegationEntry_unbonding_id protoreflect.FieldDescriptor + fd_RedelegationEntry_unbonding_on_hold_ref_count protoreflect.FieldDescriptor ) func init() { @@ -7704,6 +8031,8 @@ func init() { fd_RedelegationEntry_completion_time = md_RedelegationEntry.Fields().ByName("completion_time") fd_RedelegationEntry_initial_balance = md_RedelegationEntry.Fields().ByName("initial_balance") fd_RedelegationEntry_shares_dst = md_RedelegationEntry.Fields().ByName("shares_dst") + fd_RedelegationEntry_unbonding_id = md_RedelegationEntry.Fields().ByName("unbonding_id") + fd_RedelegationEntry_unbonding_on_hold_ref_count = md_RedelegationEntry.Fields().ByName("unbonding_on_hold_ref_count") } var _ protoreflect.Message = (*fastReflection_RedelegationEntry)(nil) @@ -7795,6 +8124,18 @@ func (x *fastReflection_RedelegationEntry) Range(f func(protoreflect.FieldDescri return } } + if x.UnbondingId != uint64(0) { + value := protoreflect.ValueOfUint64(x.UnbondingId) + if !f(fd_RedelegationEntry_unbonding_id, value) { + return + } + } + if x.UnbondingOnHoldRefCount != int64(0) { + value := protoreflect.ValueOfInt64(x.UnbondingOnHoldRefCount) + if !f(fd_RedelegationEntry_unbonding_on_hold_ref_count, value) { + return + } + } } // Has reports whether a field is populated. @@ -7818,6 +8159,10 @@ func (x *fastReflection_RedelegationEntry) Has(fd protoreflect.FieldDescriptor) return x.InitialBalance != "" case "cosmos.staking.v1beta1.RedelegationEntry.shares_dst": return x.SharesDst != "" + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_id": + return x.UnbondingId != uint64(0) + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_on_hold_ref_count": + return x.UnbondingOnHoldRefCount != int64(0) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.RedelegationEntry")) @@ -7842,6 +8187,10 @@ func (x *fastReflection_RedelegationEntry) Clear(fd protoreflect.FieldDescriptor x.InitialBalance = "" case "cosmos.staking.v1beta1.RedelegationEntry.shares_dst": x.SharesDst = "" + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_id": + x.UnbondingId = uint64(0) + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_on_hold_ref_count": + x.UnbondingOnHoldRefCount = int64(0) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.RedelegationEntry")) @@ -7870,6 +8219,12 @@ func (x *fastReflection_RedelegationEntry) Get(descriptor protoreflect.FieldDesc case "cosmos.staking.v1beta1.RedelegationEntry.shares_dst": value := x.SharesDst return protoreflect.ValueOfString(value) + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_id": + value := x.UnbondingId + return protoreflect.ValueOfUint64(value) + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_on_hold_ref_count": + value := x.UnbondingOnHoldRefCount + return protoreflect.ValueOfInt64(value) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.RedelegationEntry")) @@ -7898,6 +8253,10 @@ func (x *fastReflection_RedelegationEntry) Set(fd protoreflect.FieldDescriptor, x.InitialBalance = value.Interface().(string) case "cosmos.staking.v1beta1.RedelegationEntry.shares_dst": x.SharesDst = value.Interface().(string) + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_id": + x.UnbondingId = value.Uint() + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_on_hold_ref_count": + x.UnbondingOnHoldRefCount = value.Int() default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.RedelegationEntry")) @@ -7929,6 +8288,10 @@ func (x *fastReflection_RedelegationEntry) Mutable(fd protoreflect.FieldDescript panic(fmt.Errorf("field initial_balance of message cosmos.staking.v1beta1.RedelegationEntry is not mutable")) case "cosmos.staking.v1beta1.RedelegationEntry.shares_dst": panic(fmt.Errorf("field shares_dst of message cosmos.staking.v1beta1.RedelegationEntry is not mutable")) + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_id": + panic(fmt.Errorf("field unbonding_id of message cosmos.staking.v1beta1.RedelegationEntry is not mutable")) + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_on_hold_ref_count": + panic(fmt.Errorf("field unbonding_on_hold_ref_count of message cosmos.staking.v1beta1.RedelegationEntry is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.RedelegationEntry")) @@ -7951,6 +8314,10 @@ func (x *fastReflection_RedelegationEntry) NewField(fd protoreflect.FieldDescrip return protoreflect.ValueOfString("") case "cosmos.staking.v1beta1.RedelegationEntry.shares_dst": return protoreflect.ValueOfString("") + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_id": + return protoreflect.ValueOfUint64(uint64(0)) + case "cosmos.staking.v1beta1.RedelegationEntry.unbonding_on_hold_ref_count": + return protoreflect.ValueOfInt64(int64(0)) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.RedelegationEntry")) @@ -8035,6 +8402,12 @@ func (x *fastReflection_RedelegationEntry) ProtoMethods() *protoiface.Methods { if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } + if x.UnbondingId != 0 { + n += 1 + runtime.Sov(uint64(x.UnbondingId)) + } + if x.UnbondingOnHoldRefCount != 0 { + n += 1 + runtime.Sov(uint64(x.UnbondingOnHoldRefCount)) + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -8064,6 +8437,16 @@ func (x *fastReflection_RedelegationEntry) ProtoMethods() *protoiface.Methods { i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if x.UnbondingOnHoldRefCount != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.UnbondingOnHoldRefCount)) + i-- + dAtA[i] = 0x30 + } + if x.UnbondingId != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.UnbondingId)) + i-- + dAtA[i] = 0x28 + } if len(x.SharesDst) > 0 { i -= len(x.SharesDst) copy(dAtA[i:], x.SharesDst) @@ -8265,6 +8648,44 @@ func (x *fastReflection_RedelegationEntry) ProtoMethods() *protoiface.Methods { } x.SharesDst = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field UnbondingId", wireType) + } + x.UnbondingId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.UnbondingId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHoldRefCount", wireType) + } + x.UnbondingOnHoldRefCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.UnbondingOnHoldRefCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -11763,93 +12184,640 @@ func (x *fastReflection_Pool) ProtoMethods() *protoiface.Methods { } } -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.0 -// protoc (unknown) -// source: cosmos/staking/v1beta1/staking.proto +var _ protoreflect.List = (*_ValidatorUpdates_1_list)(nil) -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) +type _ValidatorUpdates_1_list struct { + list *[]*abci.ValidatorUpdate +} -// BondStatus is the status of a validator. -type BondStatus int32 +func (x *_ValidatorUpdates_1_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} -const ( - // UNSPECIFIED defines an invalid validator status. - BondStatus_BOND_STATUS_UNSPECIFIED BondStatus = 0 - // UNBONDED defines a validator that is not bonded. - BondStatus_BOND_STATUS_UNBONDED BondStatus = 1 - // UNBONDING defines a validator that is unbonding. - BondStatus_BOND_STATUS_UNBONDING BondStatus = 2 - // BONDED defines a validator that is bonded. - BondStatus_BOND_STATUS_BONDED BondStatus = 3 -) +func (x *_ValidatorUpdates_1_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfMessage((*x.list)[i].ProtoReflect()) +} -// Enum value maps for BondStatus. -var ( - BondStatus_name = map[int32]string{ - 0: "BOND_STATUS_UNSPECIFIED", - 1: "BOND_STATUS_UNBONDED", - 2: "BOND_STATUS_UNBONDING", - 3: "BOND_STATUS_BONDED", - } - BondStatus_value = map[string]int32{ - "BOND_STATUS_UNSPECIFIED": 0, - "BOND_STATUS_UNBONDED": 1, - "BOND_STATUS_UNBONDING": 2, - "BOND_STATUS_BONDED": 3, - } -) +func (x *_ValidatorUpdates_1_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*abci.ValidatorUpdate) + (*x.list)[i] = concreteValue +} -func (x BondStatus) Enum() *BondStatus { - p := new(BondStatus) - *p = x - return p +func (x *_ValidatorUpdates_1_list) Append(value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*abci.ValidatorUpdate) + *x.list = append(*x.list, concreteValue) } -func (x BondStatus) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +func (x *_ValidatorUpdates_1_list) AppendMutable() protoreflect.Value { + v := new(abci.ValidatorUpdate) + *x.list = append(*x.list, v) + return protoreflect.ValueOfMessage(v.ProtoReflect()) } -func (BondStatus) Descriptor() protoreflect.EnumDescriptor { - return file_cosmos_staking_v1beta1_staking_proto_enumTypes[0].Descriptor() +func (x *_ValidatorUpdates_1_list) Truncate(n int) { + for i := n; i < len(*x.list); i++ { + (*x.list)[i] = nil + } + *x.list = (*x.list)[:n] } -func (BondStatus) Type() protoreflect.EnumType { - return &file_cosmos_staking_v1beta1_staking_proto_enumTypes[0] +func (x *_ValidatorUpdates_1_list) NewElement() protoreflect.Value { + v := new(abci.ValidatorUpdate) + return protoreflect.ValueOfMessage(v.ProtoReflect()) } -func (x BondStatus) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) +func (x *_ValidatorUpdates_1_list) IsValid() bool { + return x.list != nil } -// Deprecated: Use BondStatus.Descriptor instead. -func (BondStatus) EnumDescriptor() ([]byte, []int) { - return file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP(), []int{0} +var ( + md_ValidatorUpdates protoreflect.MessageDescriptor + fd_ValidatorUpdates_updates protoreflect.FieldDescriptor +) + +func init() { + file_cosmos_staking_v1beta1_staking_proto_init() + md_ValidatorUpdates = File_cosmos_staking_v1beta1_staking_proto.Messages().ByName("ValidatorUpdates") + fd_ValidatorUpdates_updates = md_ValidatorUpdates.Fields().ByName("updates") } -// HistoricalInfo contains header and validator information for a given block. -// It is stored as part of staking module's state, which persists the `n` most -// recent HistoricalInfo -// (`n` is set by the staking module's `historical_entries` parameter). -type HistoricalInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +var _ protoreflect.Message = (*fastReflection_ValidatorUpdates)(nil) - Header *types.Header `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` - Valset []*Validator `protobuf:"bytes,2,rep,name=valset,proto3" json:"valset,omitempty"` +type fastReflection_ValidatorUpdates ValidatorUpdates + +func (x *ValidatorUpdates) ProtoReflect() protoreflect.Message { + return (*fastReflection_ValidatorUpdates)(x) } -func (x *HistoricalInfo) Reset() { - *x = HistoricalInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_cosmos_staking_v1beta1_staking_proto_msgTypes[0] +func (x *ValidatorUpdates) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_staking_v1beta1_staking_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_ValidatorUpdates_messageType fastReflection_ValidatorUpdates_messageType +var _ protoreflect.MessageType = fastReflection_ValidatorUpdates_messageType{} + +type fastReflection_ValidatorUpdates_messageType struct{} + +func (x fastReflection_ValidatorUpdates_messageType) Zero() protoreflect.Message { + return (*fastReflection_ValidatorUpdates)(nil) +} +func (x fastReflection_ValidatorUpdates_messageType) New() protoreflect.Message { + return new(fastReflection_ValidatorUpdates) +} +func (x fastReflection_ValidatorUpdates_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_ValidatorUpdates +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_ValidatorUpdates) Descriptor() protoreflect.MessageDescriptor { + return md_ValidatorUpdates +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_ValidatorUpdates) Type() protoreflect.MessageType { + return _fastReflection_ValidatorUpdates_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_ValidatorUpdates) New() protoreflect.Message { + return new(fastReflection_ValidatorUpdates) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_ValidatorUpdates) Interface() protoreflect.ProtoMessage { + return (*ValidatorUpdates)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_ValidatorUpdates) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if len(x.Updates) != 0 { + value := protoreflect.ValueOfList(&_ValidatorUpdates_1_list{list: &x.Updates}) + if !f(fd_ValidatorUpdates_updates, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_ValidatorUpdates) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ValidatorUpdates.updates": + return len(x.Updates) != 0 + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValidatorUpdates")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValidatorUpdates does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ValidatorUpdates) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ValidatorUpdates.updates": + x.Updates = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValidatorUpdates")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValidatorUpdates does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_ValidatorUpdates) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "cosmos.staking.v1beta1.ValidatorUpdates.updates": + if len(x.Updates) == 0 { + return protoreflect.ValueOfList(&_ValidatorUpdates_1_list{}) + } + listValue := &_ValidatorUpdates_1_list{list: &x.Updates} + return protoreflect.ValueOfList(listValue) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValidatorUpdates")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValidatorUpdates does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ValidatorUpdates) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ValidatorUpdates.updates": + lv := value.List() + clv := lv.(*_ValidatorUpdates_1_list) + x.Updates = *clv.list + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValidatorUpdates")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValidatorUpdates does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ValidatorUpdates) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ValidatorUpdates.updates": + if x.Updates == nil { + x.Updates = []*abci.ValidatorUpdate{} + } + value := &_ValidatorUpdates_1_list{list: &x.Updates} + return protoreflect.ValueOfList(value) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValidatorUpdates")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValidatorUpdates does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_ValidatorUpdates) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.staking.v1beta1.ValidatorUpdates.updates": + list := []*abci.ValidatorUpdate{} + return protoreflect.ValueOfList(&_ValidatorUpdates_1_list{list: &list}) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.staking.v1beta1.ValidatorUpdates")) + } + panic(fmt.Errorf("message cosmos.staking.v1beta1.ValidatorUpdates does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_ValidatorUpdates) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.staking.v1beta1.ValidatorUpdates", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_ValidatorUpdates) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_ValidatorUpdates) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_ValidatorUpdates) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_ValidatorUpdates) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*ValidatorUpdates) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if len(x.Updates) > 0 { + for _, e := range x.Updates { + l = options.Size(e) + n += 1 + l + runtime.Sov(uint64(l)) + } + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*ValidatorUpdates) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.Updates) > 0 { + for iNdEx := len(x.Updates) - 1; iNdEx >= 0; iNdEx-- { + encoded, err := options.Marshal(x.Updates[iNdEx]) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0xa + } + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*ValidatorUpdates) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: ValidatorUpdates: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: ValidatorUpdates: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Updates", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Updates = append(x.Updates, &abci.ValidatorUpdate{}) + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Updates[len(x.Updates)-1]); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.0 +// protoc (unknown) +// source: cosmos/staking/v1beta1/staking.proto + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// BondStatus is the status of a validator. +type BondStatus int32 + +const ( + // UNSPECIFIED defines an invalid validator status. + BondStatus_BOND_STATUS_UNSPECIFIED BondStatus = 0 + // UNBONDED defines a validator that is not bonded. + BondStatus_BOND_STATUS_UNBONDED BondStatus = 1 + // UNBONDING defines a validator that is unbonding. + BondStatus_BOND_STATUS_UNBONDING BondStatus = 2 + // BONDED defines a validator that is bonded. + BondStatus_BOND_STATUS_BONDED BondStatus = 3 +) + +// Enum value maps for BondStatus. +var ( + BondStatus_name = map[int32]string{ + 0: "BOND_STATUS_UNSPECIFIED", + 1: "BOND_STATUS_UNBONDED", + 2: "BOND_STATUS_UNBONDING", + 3: "BOND_STATUS_BONDED", + } + BondStatus_value = map[string]int32{ + "BOND_STATUS_UNSPECIFIED": 0, + "BOND_STATUS_UNBONDED": 1, + "BOND_STATUS_UNBONDING": 2, + "BOND_STATUS_BONDED": 3, + } +) + +func (x BondStatus) Enum() *BondStatus { + p := new(BondStatus) + *p = x + return p +} + +func (x BondStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BondStatus) Descriptor() protoreflect.EnumDescriptor { + return file_cosmos_staking_v1beta1_staking_proto_enumTypes[0].Descriptor() +} + +func (BondStatus) Type() protoreflect.EnumType { + return &file_cosmos_staking_v1beta1_staking_proto_enumTypes[0] +} + +func (x BondStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use BondStatus.Descriptor instead. +func (BondStatus) EnumDescriptor() ([]byte, []int) { + return file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP(), []int{0} +} + +// Infraction indicates the infraction a validator commited. +type Infraction int32 + +const ( + // UNSPECIFIED defines an empty infraction. + Infraction_INFRACTION_UNSPECIFIED Infraction = 0 + // DOUBLE_SIGN defines a validator that double-signs a block. + Infraction_INFRACTION_DOUBLE_SIGN Infraction = 1 + // DOWNTIME defines a validator that missed signing too many blocks. + Infraction_INFRACTION_DOWNTIME Infraction = 2 +) + +// Enum value maps for Infraction. +var ( + Infraction_name = map[int32]string{ + 0: "INFRACTION_UNSPECIFIED", + 1: "INFRACTION_DOUBLE_SIGN", + 2: "INFRACTION_DOWNTIME", + } + Infraction_value = map[string]int32{ + "INFRACTION_UNSPECIFIED": 0, + "INFRACTION_DOUBLE_SIGN": 1, + "INFRACTION_DOWNTIME": 2, + } +) + +func (x Infraction) Enum() *Infraction { + p := new(Infraction) + *p = x + return p +} + +func (x Infraction) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Infraction) Descriptor() protoreflect.EnumDescriptor { + return file_cosmos_staking_v1beta1_staking_proto_enumTypes[1].Descriptor() +} + +func (Infraction) Type() protoreflect.EnumType { + return &file_cosmos_staking_v1beta1_staking_proto_enumTypes[1] +} + +func (x Infraction) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Infraction.Descriptor instead. +func (Infraction) EnumDescriptor() ([]byte, []int) { + return file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP(), []int{1} +} + +// HistoricalInfo contains header and validator information for a given block. +// It is stored as part of staking module's state, which persists the `n` most +// recent HistoricalInfo +// (`n` is set by the staking module's `historical_entries` parameter). +type HistoricalInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Header *types.Header `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` + Valset []*Validator `protobuf:"bytes,2,rep,name=valset,proto3" json:"valset,omitempty"` +} + +func (x *HistoricalInfo) Reset() { + *x = HistoricalInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_staking_v1beta1_staking_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12092,6 +13060,10 @@ type Validator struct { // // Since: cosmos-sdk 0.46 MinSelfDelegation string `protobuf:"bytes,11,opt,name=min_self_delegation,json=minSelfDelegation,proto3" json:"min_self_delegation,omitempty"` + // strictly positive if this validator's unbonding has been stopped by external modules + UnbondingOnHoldRefCount int64 `protobuf:"varint,12,opt,name=unbonding_on_hold_ref_count,json=unbondingOnHoldRefCount,proto3" json:"unbonding_on_hold_ref_count,omitempty"` + // list of unbonding ids, each uniquely identifing an unbonding of this validator + UnbondingIds []uint64 `protobuf:"varint,13,rep,packed,name=unbonding_ids,json=unbondingIds,proto3" json:"unbonding_ids,omitempty"` } func (x *Validator) Reset() { @@ -12191,6 +13163,20 @@ func (x *Validator) GetMinSelfDelegation() string { return "" } +func (x *Validator) GetUnbondingOnHoldRefCount() int64 { + if x != nil { + return x.UnbondingOnHoldRefCount + } + return 0 +} + +func (x *Validator) GetUnbondingIds() []uint64 { + if x != nil { + return x.UnbondingIds + } + return nil +} + // ValAddresses defines a repeated set of validator addresses. type ValAddresses struct { state protoimpl.MessageState @@ -12527,6 +13513,10 @@ type UnbondingDelegationEntry struct { InitialBalance string `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3" json:"initial_balance,omitempty"` // balance defines the tokens to receive at completion. Balance string `protobuf:"bytes,4,opt,name=balance,proto3" json:"balance,omitempty"` + // Incrementing id that uniquely identifies this entry + UnbondingId uint64 `protobuf:"varint,5,opt,name=unbonding_id,json=unbondingId,proto3" json:"unbonding_id,omitempty"` + // Strictly positive if this entry's unbonding has been stopped by external modules + UnbondingOnHoldRefCount int64 `protobuf:"varint,6,opt,name=unbonding_on_hold_ref_count,json=unbondingOnHoldRefCount,proto3" json:"unbonding_on_hold_ref_count,omitempty"` } func (x *UnbondingDelegationEntry) Reset() { @@ -12577,6 +13567,20 @@ func (x *UnbondingDelegationEntry) GetBalance() string { return "" } +func (x *UnbondingDelegationEntry) GetUnbondingId() uint64 { + if x != nil { + return x.UnbondingId + } + return 0 +} + +func (x *UnbondingDelegationEntry) GetUnbondingOnHoldRefCount() int64 { + if x != nil { + return x.UnbondingOnHoldRefCount + } + return 0 +} + // RedelegationEntry defines a redelegation object with relevant metadata. type RedelegationEntry struct { state protoimpl.MessageState @@ -12591,6 +13595,10 @@ type RedelegationEntry struct { InitialBalance string `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3" json:"initial_balance,omitempty"` // shares_dst is the amount of destination-validator shares created by redelegation. SharesDst string `protobuf:"bytes,4,opt,name=shares_dst,json=sharesDst,proto3" json:"shares_dst,omitempty"` + // Incrementing id that uniquely identifies this entry + UnbondingId uint64 `protobuf:"varint,5,opt,name=unbonding_id,json=unbondingId,proto3" json:"unbonding_id,omitempty"` + // Strictly positive if this entry's unbonding has been stopped by external modules + UnbondingOnHoldRefCount int64 `protobuf:"varint,6,opt,name=unbonding_on_hold_ref_count,json=unbondingOnHoldRefCount,proto3" json:"unbonding_on_hold_ref_count,omitempty"` } func (x *RedelegationEntry) Reset() { @@ -12641,6 +13649,20 @@ func (x *RedelegationEntry) GetSharesDst() string { return "" } +func (x *RedelegationEntry) GetUnbondingId() uint64 { + if x != nil { + return x.UnbondingId + } + return 0 +} + +func (x *RedelegationEntry) GetUnbondingOnHoldRefCount() int64 { + if x != nil { + return x.UnbondingOnHoldRefCount + } + return 0 +} + // Redelegation contains the list of a particular delegator's redelegating bonds // from a particular source validator to a particular destination validator. type Redelegation struct { @@ -12970,6 +13992,43 @@ func (x *Pool) GetBondedTokens() string { return "" } +// ValidatorUpdates defines an array of abci.ValidatorUpdate objects. +// TODO: explore moving this to proto/cosmos/base to separate modules from tendermint dependence +type ValidatorUpdates struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Updates []*abci.ValidatorUpdate `protobuf:"bytes,1,rep,name=updates,proto3" json:"updates,omitempty"` +} + +func (x *ValidatorUpdates) Reset() { + *x = ValidatorUpdates{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_staking_v1beta1_staking_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValidatorUpdates) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatorUpdates) ProtoMessage() {} + +// Deprecated: Use ValidatorUpdates.ProtoReflect.Descriptor instead. +func (*ValidatorUpdates) Descriptor() ([]byte, []int) { + return file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP(), []int{20} +} + +func (x *ValidatorUpdates) GetUpdates() []*abci.ValidatorUpdate { + if x != nil { + return x.Updates + } + return nil +} + var File_cosmos_staking_v1beta1_staking_proto protoreflect.FileDescriptor var file_cosmos_staking_v1beta1_staking_proto_rawDesc = []byte{ @@ -12989,109 +14048,117 @@ var file_cosmos_staking_v1beta1_staking_proto_rawDesc = []byte{ 0x6d, 0x6f, 0x73, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x63, 0x6f, 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x89, 0x01, 0x0a, 0x0e, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x06, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, - 0x65, 0x6e, 0x64, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x06, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x73, 0x65, 0x74, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, - 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x06, 0x76, - 0x61, 0x6c, 0x73, 0x65, 0x74, 0x22, 0xac, 0x02, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x04, 0x72, 0x61, 0x74, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, - 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, 0x04, 0x72, 0x61, 0x74, 0x65, 0x12, 0x57, 0x0a, 0x08, 0x6d, - 0x61, 0x78, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, - 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, - 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, 0xd2, 0xb4, 0x2d, - 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, 0x07, 0x6d, 0x61, 0x78, - 0x52, 0x61, 0x74, 0x65, 0x12, 0x64, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, - 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, - 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, 0xd2, 0xb4, 0x2d, - 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, 0x0d, 0x6d, 0x61, 0x78, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, - 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xbb, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x61, 0x74, 0x65, 0x73, 0x42, 0x08, 0xc8, 0xde, 0x1f, 0x00, 0xd0, 0xde, 0x1f, 0x01, - 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, - 0x73, 0x12, 0x45, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x42, 0x08, 0xc8, 0xde, 0x1f, 0x00, 0x90, 0xdf, 0x1f, 0x01, 0x52, 0x0a, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, - 0x1f, 0x01, 0x22, 0xac, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x6e, 0x69, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x6e, 0x69, 0x6b, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, - 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, - 0x01, 0x22, 0xc9, 0x06, 0x0a, 0x09, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, - 0x43, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x59, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, - 0x73, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x41, 0x6e, 0x79, 0x42, 0x18, 0xca, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x0f, - 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x6a, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x6a, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x42, 0x6f, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x54, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, - 0x74, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x67, 0x0a, 0x10, 0x64, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x44, 0x65, 0x63, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, - 0x63, 0x52, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x68, 0x61, 0x72, - 0x65, 0x73, 0x12, 0x4b, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, - 0x1f, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x29, 0x0a, 0x10, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x75, 0x6e, 0x62, 0x6f, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4b, 0x0a, 0x0e, 0x75, 0x6e, - 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, - 0xc8, 0xde, 0x1f, 0x00, 0x90, 0xdf, 0x1f, 0x01, 0x52, 0x0d, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x42, - 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x6c, 0x0a, 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x64, 0x65, - 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, - 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, - 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x11, 0x6d, 0x69, - 0x6e, 0x53, 0x65, 0x6c, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, + 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x74, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2f, 0x61, 0x62, 0x63, 0x69, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x89, 0x01, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x69, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x06, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x12, 0x3f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, + 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x73, + 0x65, 0x74, 0x22, 0xac, 0x02, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x61, 0x74, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x04, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x44, 0x65, 0x63, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, + 0x65, 0x63, 0x52, 0x04, 0x72, 0x61, 0x74, 0x65, 0x12, 0x57, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, + 0x72, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, + 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, + 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x61, 0x74, + 0x65, 0x12, 0x64, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, + 0x72, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, + 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, + 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, + 0x01, 0x22, 0xbb, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x5c, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, + 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, + 0x74, 0x65, 0x73, 0x42, 0x08, 0xc8, 0xde, 0x1f, 0x00, 0xd0, 0xde, 0x1f, 0x01, 0x52, 0x0f, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x73, 0x12, 0x45, + 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, + 0x08, 0xc8, 0xde, 0x1f, 0x00, 0x90, 0xdf, 0x1f, 0x01, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, + 0xac, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x6e, 0x69, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x6f, 0x6e, 0x69, 0x6b, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, + 0x29, 0x0a, 0x10, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xac, + 0x07, 0x0a, 0x09, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x43, 0x0a, 0x10, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x59, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x5f, 0x70, + 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, + 0x79, 0x42, 0x18, 0xca, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x0f, 0x63, 0x6f, 0x6e, + 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x6a, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6a, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, + 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x42, 0x6f, + 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x54, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, + 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x06, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x67, 0x0a, 0x10, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, + 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, + 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, 0x0f, + 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x68, 0x61, 0x72, 0x65, 0x73, 0x12, + 0x4b, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, + 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, + 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4b, 0x0a, 0x0e, 0x75, 0x6e, 0x62, 0x6f, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xc8, 0xde, 0x1f, + 0x00, 0x90, 0xdf, 0x1f, 0x01, 0x52, 0x0d, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, + 0x1f, 0x00, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x6c, + 0x0a, 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, + 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, + 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x11, 0x6d, 0x69, 0x6e, 0x53, 0x65, + 0x6c, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x1b, + 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x68, 0x6f, 0x6c, + 0x64, 0x5f, 0x72, 0x65, 0x66, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x17, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4f, 0x6e, 0x48, 0x6f, + 0x6c, 0x64, 0x52, 0x65, 0x66, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x6e, + 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, + 0x04, 0x52, 0x0c, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x73, 0x3a, 0x0c, 0x88, 0xa0, 0x1f, 0x00, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0x50, 0x0a, 0x0c, 0x56, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, @@ -13166,7 +14233,7 @@ var file_cosmos_staking_v1beta1_staking_proto_rawDesc = []byte{ 0x74, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x3a, 0x0c, 0x88, 0xa0, 0x1f, - 0x00, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0xdb, 0x02, 0x0a, 0x18, 0x55, 0x6e, + 0x00, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0xbc, 0x03, 0x0a, 0x18, 0x55, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, @@ -13187,152 +14254,176 @@ var file_cosmos_staking_v1beta1_staking_proto_rawDesc = []byte{ 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x3a, 0x08, 0x98, - 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x52, 0x65, 0x64, 0x65, - 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x27, 0x0a, - 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4d, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xc8, 0xde, 0x1f, - 0x00, 0x90, 0xdf, 0x1f, 0x01, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x65, 0x0a, 0x0f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, - 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, - 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, - 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x0e, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x61, 0x6c, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x0a, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x5f, 0x64, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, - 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, 0x09, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x44, 0x73, 0x74, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, - 0xa0, 0x1f, 0x01, 0x22, 0xca, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x6f, - 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x10, 0x64, 0x65, 0x6c, 0x65, 0x67, - 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4c, 0x0a, 0x15, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, + 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0b, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x64, + 0x12, 0x3c, 0x0a, 0x1b, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x6e, + 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x72, 0x65, 0x66, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x4f, 0x6e, 0x48, 0x6f, 0x6c, 0x64, 0x52, 0x65, 0x66, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x08, + 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xba, 0x03, 0x0a, 0x11, 0x52, 0x65, 0x64, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x27, + 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4d, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xc8, 0xde, + 0x1f, 0x00, 0x90, 0xdf, 0x1f, 0x01, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x65, 0x0a, 0x0f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x6c, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xd2, + 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x0e, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x5b, 0x0a, + 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x5f, 0x64, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, + 0x63, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x52, + 0x09, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x44, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, + 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0b, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x3c, 0x0a, + 0x1b, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x68, 0x6f, + 0x6c, 0x64, 0x5f, 0x72, 0x65, 0x66, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x17, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4f, 0x6e, 0x48, + 0x6f, 0x6c, 0x64, 0x52, 0x65, 0x66, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x08, 0x98, 0xa0, 0x1f, + 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xca, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, + 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x10, 0x64, 0x65, 0x6c, + 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4c, 0x0a, + 0x15, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x72, 0x63, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, + 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4c, 0x0a, 0x15, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x64, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, - 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4c, 0x0a, 0x15, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x64, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x44, 0x73, 0x74, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x49, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x44, + 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x49, 0x0a, 0x07, 0x65, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x3a, 0x0c, 0x88, 0xa0, 0x1f, 0x00, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, + 0x1f, 0x00, 0x22, 0xf2, 0x02, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x4a, 0x0a, + 0x0e, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x08, 0xc8, 0xde, 0x1f, 0x00, 0x98, 0xdf, 0x1f, 0x01, 0x52, 0x0d, 0x75, 0x6e, 0x62, 0x6f, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x78, + 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x5f, + 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x68, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6f, 0x6e, 0x64, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x12, + 0x7c, 0x0a, 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0xc8, 0xde, + 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, + 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, 0xf2, 0xde, 0x1f, 0x1a, + 0x79, 0x61, 0x6d, 0x6c, 0x3a, 0x22, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x22, 0x52, 0x11, 0x6d, 0x69, 0x6e, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x3a, 0x08, 0x98, + 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xa3, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, + 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, + 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0a, 0x64, 0x65, + 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x43, 0x6f, 0x69, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0xd9, 0x01, + 0x0a, 0x19, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x12, 0x72, + 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2e, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x11, 0x72, 0x65, 0x64, 0x65, 0x6c, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x56, 0x0a, 0x07, 0x62, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, + 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, + 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xbf, 0x01, 0x0a, 0x14, 0x52, 0x65, + 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0c, 0x72, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x3a, 0x0c, 0x88, 0xa0, 0x1f, 0x00, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, - 0x22, 0xf2, 0x02, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x4a, 0x0a, 0x0e, 0x75, - 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, - 0xc8, 0xde, 0x1f, 0x00, 0x98, 0xdf, 0x1f, 0x01, 0x52, 0x0d, 0x75, 0x6e, 0x62, 0x6f, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0d, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1f, - 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, - 0x2d, 0x0a, 0x12, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x65, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x68, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1d, - 0x0a, 0x0a, 0x62, 0x6f, 0x6e, 0x64, 0x5f, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x62, 0x6f, 0x6e, 0x64, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x12, 0x7c, 0x0a, - 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, - 0x72, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0xc8, 0xde, 0x1f, 0x00, - 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, - 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x63, 0xf2, 0xde, 0x1f, 0x1a, 0x79, 0x61, - 0x6d, 0x6c, 0x3a, 0x22, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x22, 0x52, 0x11, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x3a, 0x08, 0x98, 0xa0, 0x1f, - 0x00, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xa3, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0a, - 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, - 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0a, 0x64, 0x65, 0x6c, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x43, 0x6f, - 0x69, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x3a, 0x08, 0x98, 0xa0, 0x1f, 0x00, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0xd9, 0x01, 0x0a, 0x19, - 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x12, 0x72, 0x65, 0x64, - 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, - 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, - 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x11, 0x72, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x56, 0x0a, 0x07, 0x62, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3c, 0xc8, 0xde, 0x1f, 0x00, + 0x31, 0x2e, 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, + 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, + 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x64, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x07, 0x65, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0x83, 0x02, 0x0a, 0x04, + 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x7d, 0x0a, 0x11, 0x6e, 0x6f, 0x74, 0x5f, 0x62, 0x6f, 0x6e, 0x64, + 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x51, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xea, + 0xde, 0x1f, 0x11, 0x6e, 0x6f, 0x74, 0x5f, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, + 0x6e, 0x74, 0x52, 0x0f, 0x6e, 0x6f, 0x74, 0x42, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x73, 0x12, 0x72, 0x0a, 0x0d, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4d, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, - 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xbf, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x64, 0x65, - 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4e, 0x0a, 0x0c, 0x72, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, - 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x52, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, - 0x1f, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x51, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x31, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x64, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x00, 0x22, 0x83, 0x02, 0x0a, 0x04, 0x50, 0x6f, - 0x6f, 0x6c, 0x12, 0x7d, 0x0a, 0x11, 0x6e, 0x6f, 0x74, 0x5f, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x51, 0xc8, - 0xde, 0x1f, 0x00, 0xda, 0xde, 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, - 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xea, 0xde, 0x1f, - 0x11, 0x6e, 0x6f, 0x74, 0x5f, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, - 0x52, 0x0f, 0x6e, 0x6f, 0x74, 0x42, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x12, 0x72, 0x0a, 0x0d, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4d, 0xc8, 0xde, 0x1f, 0x00, 0xda, 0xde, - 0x1f, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xea, 0xde, 0x1f, 0x0d, 0x62, 0x6f, 0x6e, 0x64, - 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x0c, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x3a, 0x08, 0xe8, 0xa0, 0x1f, 0x01, 0xf0, 0xa0, 0x1f, 0x01, 0x2a, - 0xb6, 0x01, 0x0a, 0x0a, 0x42, 0x6f, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2c, - 0x0a, 0x17, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x1a, 0x0f, 0x8a, 0x9d, 0x20, - 0x0b, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x14, + 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0xea, 0xde, 0x1f, 0x0d, 0x62, 0x6f, + 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0xd2, 0xb4, 0x2d, 0x0a, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x52, 0x0c, 0x62, 0x6f, 0x6e, 0x64, 0x65, + 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x3a, 0x08, 0xe8, 0xa0, 0x1f, 0x01, 0xf0, 0xa0, 0x1f, + 0x01, 0x22, 0x54, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x74, 0x2e, 0x61, 0x62, 0x63, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x07, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x2a, 0xb6, 0x01, 0x0a, 0x0a, 0x42, 0x6f, 0x6e, 0x64, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2c, 0x0a, 0x17, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x1a, 0x0f, 0x8a, 0x9d, 0x20, 0x0b, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x14, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x42, 0x4f, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x01, 0x1a, 0x0c, + 0x8a, 0x9d, 0x20, 0x08, 0x55, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x15, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x42, 0x4f, - 0x4e, 0x44, 0x45, 0x44, 0x10, 0x01, 0x1a, 0x0c, 0x8a, 0x9d, 0x20, 0x08, 0x55, 0x6e, 0x62, 0x6f, - 0x6e, 0x64, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x15, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x42, 0x4f, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x1a, - 0x0d, 0x8a, 0x9d, 0x20, 0x09, 0x55, 0x6e, 0x62, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x22, - 0x0a, 0x12, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x42, 0x4f, - 0x4e, 0x44, 0x45, 0x44, 0x10, 0x03, 0x1a, 0x0a, 0x8a, 0x9d, 0x20, 0x06, 0x42, 0x6f, 0x6e, 0x64, - 0x65, 0x64, 0x1a, 0x04, 0x88, 0xa3, 0x1e, 0x00, 0x42, 0xdc, 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, - 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x0c, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x36, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, - 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2f, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x3b, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xa2, - 0x02, 0x03, 0x43, 0x53, 0x58, 0xaa, 0x02, 0x16, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x53, - 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xca, 0x02, - 0x16, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5c, - 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x22, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x5c, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x18, 0x43, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x3a, 0x3a, - 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x1a, 0x0d, 0x8a, 0x9d, 0x20, 0x09, 0x55, 0x6e, 0x62, + 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x22, 0x0a, 0x12, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x03, 0x1a, 0x0a, + 0x8a, 0x9d, 0x20, 0x06, 0x42, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x1a, 0x04, 0x88, 0xa3, 0x1e, 0x00, + 0x2a, 0x5d, 0x0a, 0x0a, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, + 0x0a, 0x16, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, + 0x46, 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x5f, + 0x53, 0x49, 0x47, 0x4e, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x43, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x02, 0x42, + 0xdc, 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x73, + 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x0c, + 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x36, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2f, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x3b, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x53, 0x58, 0xaa, 0x02, 0x16, 0x43, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0xca, 0x02, 0x16, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x53, + 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, + 0x22, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5c, + 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x18, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x53, 0x74, + 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -13347,63 +14438,67 @@ func file_cosmos_staking_v1beta1_staking_proto_rawDescGZIP() []byte { return file_cosmos_staking_v1beta1_staking_proto_rawDescData } -var file_cosmos_staking_v1beta1_staking_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_cosmos_staking_v1beta1_staking_proto_msgTypes = make([]protoimpl.MessageInfo, 20) +var file_cosmos_staking_v1beta1_staking_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_cosmos_staking_v1beta1_staking_proto_msgTypes = make([]protoimpl.MessageInfo, 21) var file_cosmos_staking_v1beta1_staking_proto_goTypes = []interface{}{ (BondStatus)(0), // 0: cosmos.staking.v1beta1.BondStatus - (*HistoricalInfo)(nil), // 1: cosmos.staking.v1beta1.HistoricalInfo - (*CommissionRates)(nil), // 2: cosmos.staking.v1beta1.CommissionRates - (*Commission)(nil), // 3: cosmos.staking.v1beta1.Commission - (*Description)(nil), // 4: cosmos.staking.v1beta1.Description - (*Validator)(nil), // 5: cosmos.staking.v1beta1.Validator - (*ValAddresses)(nil), // 6: cosmos.staking.v1beta1.ValAddresses - (*DVPair)(nil), // 7: cosmos.staking.v1beta1.DVPair - (*DVPairs)(nil), // 8: cosmos.staking.v1beta1.DVPairs - (*DVVTriplet)(nil), // 9: cosmos.staking.v1beta1.DVVTriplet - (*DVVTriplets)(nil), // 10: cosmos.staking.v1beta1.DVVTriplets - (*Delegation)(nil), // 11: cosmos.staking.v1beta1.Delegation - (*UnbondingDelegation)(nil), // 12: cosmos.staking.v1beta1.UnbondingDelegation - (*UnbondingDelegationEntry)(nil), // 13: cosmos.staking.v1beta1.UnbondingDelegationEntry - (*RedelegationEntry)(nil), // 14: cosmos.staking.v1beta1.RedelegationEntry - (*Redelegation)(nil), // 15: cosmos.staking.v1beta1.Redelegation - (*Params)(nil), // 16: cosmos.staking.v1beta1.Params - (*DelegationResponse)(nil), // 17: cosmos.staking.v1beta1.DelegationResponse - (*RedelegationEntryResponse)(nil), // 18: cosmos.staking.v1beta1.RedelegationEntryResponse - (*RedelegationResponse)(nil), // 19: cosmos.staking.v1beta1.RedelegationResponse - (*Pool)(nil), // 20: cosmos.staking.v1beta1.Pool - (*types.Header)(nil), // 21: tendermint.types.Header - (*timestamppb.Timestamp)(nil), // 22: google.protobuf.Timestamp - (*anypb.Any)(nil), // 23: google.protobuf.Any - (*durationpb.Duration)(nil), // 24: google.protobuf.Duration - (*v1beta1.Coin)(nil), // 25: cosmos.base.v1beta1.Coin + (Infraction)(0), // 1: cosmos.staking.v1beta1.Infraction + (*HistoricalInfo)(nil), // 2: cosmos.staking.v1beta1.HistoricalInfo + (*CommissionRates)(nil), // 3: cosmos.staking.v1beta1.CommissionRates + (*Commission)(nil), // 4: cosmos.staking.v1beta1.Commission + (*Description)(nil), // 5: cosmos.staking.v1beta1.Description + (*Validator)(nil), // 6: cosmos.staking.v1beta1.Validator + (*ValAddresses)(nil), // 7: cosmos.staking.v1beta1.ValAddresses + (*DVPair)(nil), // 8: cosmos.staking.v1beta1.DVPair + (*DVPairs)(nil), // 9: cosmos.staking.v1beta1.DVPairs + (*DVVTriplet)(nil), // 10: cosmos.staking.v1beta1.DVVTriplet + (*DVVTriplets)(nil), // 11: cosmos.staking.v1beta1.DVVTriplets + (*Delegation)(nil), // 12: cosmos.staking.v1beta1.Delegation + (*UnbondingDelegation)(nil), // 13: cosmos.staking.v1beta1.UnbondingDelegation + (*UnbondingDelegationEntry)(nil), // 14: cosmos.staking.v1beta1.UnbondingDelegationEntry + (*RedelegationEntry)(nil), // 15: cosmos.staking.v1beta1.RedelegationEntry + (*Redelegation)(nil), // 16: cosmos.staking.v1beta1.Redelegation + (*Params)(nil), // 17: cosmos.staking.v1beta1.Params + (*DelegationResponse)(nil), // 18: cosmos.staking.v1beta1.DelegationResponse + (*RedelegationEntryResponse)(nil), // 19: cosmos.staking.v1beta1.RedelegationEntryResponse + (*RedelegationResponse)(nil), // 20: cosmos.staking.v1beta1.RedelegationResponse + (*Pool)(nil), // 21: cosmos.staking.v1beta1.Pool + (*ValidatorUpdates)(nil), // 22: cosmos.staking.v1beta1.ValidatorUpdates + (*types.Header)(nil), // 23: tendermint.types.Header + (*timestamppb.Timestamp)(nil), // 24: google.protobuf.Timestamp + (*anypb.Any)(nil), // 25: google.protobuf.Any + (*durationpb.Duration)(nil), // 26: google.protobuf.Duration + (*v1beta1.Coin)(nil), // 27: cosmos.base.v1beta1.Coin + (*abci.ValidatorUpdate)(nil), // 28: tendermint.abci.ValidatorUpdate } var file_cosmos_staking_v1beta1_staking_proto_depIdxs = []int32{ - 21, // 0: cosmos.staking.v1beta1.HistoricalInfo.header:type_name -> tendermint.types.Header - 5, // 1: cosmos.staking.v1beta1.HistoricalInfo.valset:type_name -> cosmos.staking.v1beta1.Validator - 2, // 2: cosmos.staking.v1beta1.Commission.commission_rates:type_name -> cosmos.staking.v1beta1.CommissionRates - 22, // 3: cosmos.staking.v1beta1.Commission.update_time:type_name -> google.protobuf.Timestamp - 23, // 4: cosmos.staking.v1beta1.Validator.consensus_pubkey:type_name -> google.protobuf.Any + 23, // 0: cosmos.staking.v1beta1.HistoricalInfo.header:type_name -> tendermint.types.Header + 6, // 1: cosmos.staking.v1beta1.HistoricalInfo.valset:type_name -> cosmos.staking.v1beta1.Validator + 3, // 2: cosmos.staking.v1beta1.Commission.commission_rates:type_name -> cosmos.staking.v1beta1.CommissionRates + 24, // 3: cosmos.staking.v1beta1.Commission.update_time:type_name -> google.protobuf.Timestamp + 25, // 4: cosmos.staking.v1beta1.Validator.consensus_pubkey:type_name -> google.protobuf.Any 0, // 5: cosmos.staking.v1beta1.Validator.status:type_name -> cosmos.staking.v1beta1.BondStatus - 4, // 6: cosmos.staking.v1beta1.Validator.description:type_name -> cosmos.staking.v1beta1.Description - 22, // 7: cosmos.staking.v1beta1.Validator.unbonding_time:type_name -> google.protobuf.Timestamp - 3, // 8: cosmos.staking.v1beta1.Validator.commission:type_name -> cosmos.staking.v1beta1.Commission - 7, // 9: cosmos.staking.v1beta1.DVPairs.pairs:type_name -> cosmos.staking.v1beta1.DVPair - 9, // 10: cosmos.staking.v1beta1.DVVTriplets.triplets:type_name -> cosmos.staking.v1beta1.DVVTriplet - 13, // 11: cosmos.staking.v1beta1.UnbondingDelegation.entries:type_name -> cosmos.staking.v1beta1.UnbondingDelegationEntry - 22, // 12: cosmos.staking.v1beta1.UnbondingDelegationEntry.completion_time:type_name -> google.protobuf.Timestamp - 22, // 13: cosmos.staking.v1beta1.RedelegationEntry.completion_time:type_name -> google.protobuf.Timestamp - 14, // 14: cosmos.staking.v1beta1.Redelegation.entries:type_name -> cosmos.staking.v1beta1.RedelegationEntry - 24, // 15: cosmos.staking.v1beta1.Params.unbonding_time:type_name -> google.protobuf.Duration - 11, // 16: cosmos.staking.v1beta1.DelegationResponse.delegation:type_name -> cosmos.staking.v1beta1.Delegation - 25, // 17: cosmos.staking.v1beta1.DelegationResponse.balance:type_name -> cosmos.base.v1beta1.Coin - 14, // 18: cosmos.staking.v1beta1.RedelegationEntryResponse.redelegation_entry:type_name -> cosmos.staking.v1beta1.RedelegationEntry - 15, // 19: cosmos.staking.v1beta1.RedelegationResponse.redelegation:type_name -> cosmos.staking.v1beta1.Redelegation - 18, // 20: cosmos.staking.v1beta1.RedelegationResponse.entries:type_name -> cosmos.staking.v1beta1.RedelegationEntryResponse - 21, // [21:21] is the sub-list for method output_type - 21, // [21:21] is the sub-list for method input_type - 21, // [21:21] is the sub-list for extension type_name - 21, // [21:21] is the sub-list for extension extendee - 0, // [0:21] is the sub-list for field type_name + 5, // 6: cosmos.staking.v1beta1.Validator.description:type_name -> cosmos.staking.v1beta1.Description + 24, // 7: cosmos.staking.v1beta1.Validator.unbonding_time:type_name -> google.protobuf.Timestamp + 4, // 8: cosmos.staking.v1beta1.Validator.commission:type_name -> cosmos.staking.v1beta1.Commission + 8, // 9: cosmos.staking.v1beta1.DVPairs.pairs:type_name -> cosmos.staking.v1beta1.DVPair + 10, // 10: cosmos.staking.v1beta1.DVVTriplets.triplets:type_name -> cosmos.staking.v1beta1.DVVTriplet + 14, // 11: cosmos.staking.v1beta1.UnbondingDelegation.entries:type_name -> cosmos.staking.v1beta1.UnbondingDelegationEntry + 24, // 12: cosmos.staking.v1beta1.UnbondingDelegationEntry.completion_time:type_name -> google.protobuf.Timestamp + 24, // 13: cosmos.staking.v1beta1.RedelegationEntry.completion_time:type_name -> google.protobuf.Timestamp + 15, // 14: cosmos.staking.v1beta1.Redelegation.entries:type_name -> cosmos.staking.v1beta1.RedelegationEntry + 26, // 15: cosmos.staking.v1beta1.Params.unbonding_time:type_name -> google.protobuf.Duration + 12, // 16: cosmos.staking.v1beta1.DelegationResponse.delegation:type_name -> cosmos.staking.v1beta1.Delegation + 27, // 17: cosmos.staking.v1beta1.DelegationResponse.balance:type_name -> cosmos.base.v1beta1.Coin + 15, // 18: cosmos.staking.v1beta1.RedelegationEntryResponse.redelegation_entry:type_name -> cosmos.staking.v1beta1.RedelegationEntry + 16, // 19: cosmos.staking.v1beta1.RedelegationResponse.redelegation:type_name -> cosmos.staking.v1beta1.Redelegation + 19, // 20: cosmos.staking.v1beta1.RedelegationResponse.entries:type_name -> cosmos.staking.v1beta1.RedelegationEntryResponse + 28, // 21: cosmos.staking.v1beta1.ValidatorUpdates.updates:type_name -> tendermint.abci.ValidatorUpdate + 22, // [22:22] is the sub-list for method output_type + 22, // [22:22] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name } func init() { file_cosmos_staking_v1beta1_staking_proto_init() } @@ -13652,14 +14747,26 @@ func file_cosmos_staking_v1beta1_staking_proto_init() { return nil } } + file_cosmos_staking_v1beta1_staking_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidatorUpdates); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_cosmos_staking_v1beta1_staking_proto_rawDesc, - NumEnums: 1, - NumMessages: 20, + NumEnums: 2, + NumMessages: 21, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/cosmos/staking/v1beta1/staking.proto b/proto/cosmos/staking/v1beta1/staking.proto index 193ff3c0def4..570ce074adf2 100644 --- a/proto/cosmos/staking/v1beta1/staking.proto +++ b/proto/cosmos/staking/v1beta1/staking.proto @@ -9,6 +9,7 @@ import "google/protobuf/timestamp.proto"; import "cosmos_proto/cosmos.proto"; import "cosmos/base/v1beta1/coin.proto"; import "tendermint/types/types.proto"; +import "tendermint/abci/types.proto"; option go_package = "github.com/cosmos/cosmos-sdk/x/staking/types"; @@ -124,6 +125,12 @@ message Validator { (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false ]; + + // strictly positive if this validator's unbonding has been stopped by external modules + int64 unbonding_on_hold_ref_count = 12; + + // list of unbonding ids, each uniquely identifing an unbonding of this validator + repeated uint64 unbonding_ids = 13; } // BondStatus is the status of a validator. @@ -216,7 +223,7 @@ message UnbondingDelegation { // validator_address is the bech32-encoded address of the validator. string validator_address = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"]; // entries are the unbonding delegation entries. - repeated UnbondingDelegationEntry entries = 3 [(gogoproto.nullable) = false]; // unbonding delegation entries + repeated UnbondingDelegationEntry entries = 3 [(gogoproto.nullable) = false]; // unbonding delegation entries } // UnbondingDelegationEntry defines an unbonding object with relevant metadata. @@ -240,6 +247,11 @@ message UnbondingDelegationEntry { (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false ]; + // Incrementing id that uniquely identifies this entry + uint64 unbonding_id = 5; + + // Strictly positive if this entry's unbonding has been stopped by external modules + int64 unbonding_on_hold_ref_count = 6; } // RedelegationEntry defines a redelegation object with relevant metadata. @@ -263,6 +275,11 @@ message RedelegationEntry { (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false ]; + // Incrementing id that uniquely identifies this entry + uint64 unbonding_id = 5; + + // Strictly positive if this entry's unbonding has been stopped by external modules + int64 unbonding_on_hold_ref_count = 6; } // Redelegation contains the list of a particular delegator's redelegating bonds @@ -279,7 +296,7 @@ message Redelegation { // validator_dst_address is the validator redelegation destination operator address. string validator_dst_address = 3 [(cosmos_proto.scalar) = "cosmos.AddressString"]; // entries are the redelegation entries. - repeated RedelegationEntry entries = 4 [(gogoproto.nullable) = false]; // redelegation entries + repeated RedelegationEntry entries = 4 [(gogoproto.nullable) = false]; // redelegation entries } // Params defines the parameters for the x/staking module. @@ -358,3 +375,19 @@ message Pool { (gogoproto.jsontag) = "bonded_tokens" ]; } + +// Infraction indicates the infraction a validator commited. +enum Infraction { + // UNSPECIFIED defines an empty infraction. + INFRACTION_UNSPECIFIED = 0; + // DOUBLE_SIGN defines a validator that double-signs a block. + INFRACTION_DOUBLE_SIGN = 1; + // DOWNTIME defines a validator that missed signing too many blocks. + INFRACTION_DOWNTIME = 2; +} + +// ValidatorUpdates defines an array of abci.ValidatorUpdate objects. +// TODO: explore moving this to proto/cosmos/base to separate modules from tendermint dependence +message ValidatorUpdates { + repeated tendermint.abci.ValidatorUpdate updates = 1 [(gogoproto.nullable) = false]; +} diff --git a/tests/go.mod b/tests/go.mod index d5314833d6f6..3ed57d9fd5e5 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -8,6 +8,7 @@ require ( cosmossdk.io/simapp v0.0.0-20220908203654-84d4bf5accad github.com/cosmos/cosmos-sdk v0.0.0-00010101000000-000000000000 github.com/cosmos/gogoproto v1.4.2 + github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.0 github.com/spf13/cobra v1.5.0 github.com/stretchr/testify v1.8.0 @@ -68,7 +69,6 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v1.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.0.1 // indirect diff --git a/tests/integration/distribution/keeper/delegation_test.go b/tests/integration/distribution/keeper/delegation_test.go index eab6e933cc0c..e8b0e1ad00c3 100644 --- a/tests/integration/distribution/keeper/delegation_test.go +++ b/tests/integration/distribution/keeper/delegation_test.go @@ -137,7 +137,7 @@ func TestCalculateRewardsAfterSlash(t *testing.T) { ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) // slash the validator by 50% - stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1)) + stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) // retrieve validator val = stakingKeeper.Validator(ctx, valAddrs[0]) @@ -212,7 +212,7 @@ func TestCalculateRewardsAfterManySlashes(t *testing.T) { ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) // slash the validator by 50% - stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1)) + stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) // fetch the validator again val = stakingKeeper.Validator(ctx, valAddrs[0]) @@ -226,7 +226,7 @@ func TestCalculateRewardsAfterManySlashes(t *testing.T) { distrKeeper.AllocateTokensToValidator(ctx, val, tokens) // slash the validator by 50% again - stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower/2, sdk.NewDecWithPrec(5, 1)) + stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower/2, sdk.NewDecWithPrec(5, 1), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) // fetch the validator again val = stakingKeeper.Validator(ctx, valAddrs[0]) @@ -466,10 +466,10 @@ func TestCalculateRewardsAfterManySlashesInSameBlock(t *testing.T) { distrKeeper.AllocateTokensToValidator(ctx, val, tokens) // slash the validator by 50% - stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1)) + stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) // slash the validator by 50% again - stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower/2, sdk.NewDecWithPrec(5, 1)) + stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower/2, sdk.NewDecWithPrec(5, 1), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) // fetch the validator again val = stakingKeeper.Validator(ctx, valAddrs[0]) @@ -535,7 +535,7 @@ func TestCalculateRewardsMultiDelegatorMultiSlash(t *testing.T) { // slash the validator ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) - stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1)) + stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) // second delegation @@ -554,7 +554,7 @@ func TestCalculateRewardsMultiDelegatorMultiSlash(t *testing.T) { // slash the validator again ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) - stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1)) + stakingKeeper.Slash(ctx, valConsAddr0, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1), stakingtypes.Infraction_INFRACTION_UNSPECIFIED) ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) // fetch updated validator diff --git a/tests/integration/slashing/keeper/keeper_test.go b/tests/integration/slashing/keeper/keeper_test.go index 28a49a647e8d..a17a521e8fb0 100644 --- a/tests/integration/slashing/keeper/keeper_test.go +++ b/tests/integration/slashing/keeper/keeper_test.go @@ -290,9 +290,11 @@ func (s *KeeperTestSuite) TestValidatorDippingInAndOut() { // shouldn't be jailed/kicked yet tstaking.CheckValidator(valAddr, stakingtypes.Bonded, false) - // validator misses an additional 500 more blocks, after the cooling off period of SignedBlockWindow (here 1000 blocks). + // validator misses an additional 500 more blocks within the SignedBlockWindow (here 1000 blocks). latest := s.slashingKeeper.SignedBlocksWindow(ctx) + height - for ; height < latest+s.slashingKeeper.MinSignedPerWindow(ctx); height++ { + // misses 500 blocks + within the signing windows i.e. 700-1700 + // validators misses all 1000 block of a SignedBlockWindows + for ; height < latest+1; height++ { ctx = ctx.WithBlockHeight(height) s.slashingKeeper.HandleValidatorSignature(ctx, val.Address(), newPower, false) } @@ -305,8 +307,8 @@ func (s *KeeperTestSuite) TestValidatorDippingInAndOut() { signInfo, found := s.slashingKeeper.GetValidatorSigningInfo(ctx, consAddr) s.Require().True(found) s.Require().Equal(int64(700), signInfo.StartHeight) - s.Require().Equal(int64(499), signInfo.MissedBlocksCounter) - s.Require().Equal(int64(499), signInfo.IndexOffset) + s.Require().Equal(int64(0), signInfo.MissedBlocksCounter) + s.Require().Equal(int64(0), signInfo.IndexOffset) // some blocks pass height = int64(5000) diff --git a/tests/integration/staking/keeper/msg_server_test.go b/tests/integration/staking/keeper/msg_server_test.go index 9ca6e69118b8..45efcde992bd 100644 --- a/tests/integration/staking/keeper/msg_server_test.go +++ b/tests/integration/staking/keeper/msg_server_test.go @@ -45,6 +45,7 @@ func TestCancelUnbondingDelegation(t *testing.T) { delegatorAddr, validatorAddr, 10, ctx.BlockTime().Add(time.Minute*10), unbondingAmount.Amount, + 0, ) // set and retrieve a record diff --git a/tests/integration/staking/keeper/slash_test.go b/tests/integration/staking/keeper/slash_test.go index 271851c270f9..416044208def 100644 --- a/tests/integration/staking/keeper/slash_test.go +++ b/tests/integration/staking/keeper/slash_test.go @@ -58,7 +58,7 @@ func TestSlashUnbondingDelegation(t *testing.T) { // set an unbonding delegation with expiration timestamp (beyond which the // unbonding delegation shouldn't be slashed) ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 0, - time.Unix(5, 0), sdk.NewInt(10)) + time.Unix(5, 0), sdk.NewInt(10), 0) app.StakingKeeper.SetUnbondingDelegation(ctx, ubd) @@ -109,7 +109,7 @@ func TestSlashRedelegation(t *testing.T) { // set a redelegation with an expiration timestamp beyond which the // redelegation shouldn't be slashed rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, - time.Unix(5, 0), sdk.NewInt(10), math.LegacyNewDec(10)) + time.Unix(5, 0), sdk.NewInt(10), math.LegacyNewDec(10), 0) app.StakingKeeper.SetRedelegation(ctx, rd) @@ -172,7 +172,7 @@ func TestSlashAtNegativeHeight(t *testing.T) { validator, found := app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - app.StakingKeeper.Slash(ctx, consAddr, -2, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, -2, 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) // read updated state validator, found = app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) @@ -203,7 +203,7 @@ func TestSlashValidatorAtCurrentHeight(t *testing.T) { validator, found := app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - app.StakingKeeper.Slash(ctx, consAddr, ctx.BlockHeight(), 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, ctx.BlockHeight(), 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) // read updated state validator, found = app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) @@ -233,7 +233,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // set an unbonding delegation with expiration timestamp beyond which the // unbonding delegation shouldn't be slashed ubdTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 4) - ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, time.Unix(0, 0), ubdTokens) + ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, time.Unix(0, 0), ubdTokens, 0) app.StakingKeeper.SetUnbondingDelegation(ctx, ubd) // slash validator for the first time @@ -243,7 +243,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { validator, found := app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - app.StakingKeeper.Slash(ctx, consAddr, 10, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, 10, 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) // end block applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) @@ -273,7 +273,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // slash validator again ctx = ctx.WithBlockHeight(13) - app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) ubd, found = app.StakingKeeper.GetUnbondingDelegation(ctx, addrDels[0], addrVals[0]) require.True(t, found) @@ -299,7 +299,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // on the unbonding delegation, but it will slash stake bonded since the infraction // this may not be the desirable behaviour, ref https://github.com/cosmos/cosmos-sdk/issues/1440 ctx = ctx.WithBlockHeight(13) - app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) ubd, found = app.StakingKeeper.GetUnbondingDelegation(ctx, addrDels[0], addrVals[0]) require.True(t, found) @@ -325,7 +325,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // on the unbonding delegation, but it will slash stake bonded since the infraction // this may not be the desirable behaviour, ref https://github.com/cosmos/cosmos-sdk/issues/1440 ctx = ctx.WithBlockHeight(13) - app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) ubd, found = app.StakingKeeper.GetUnbondingDelegation(ctx, addrDels[0], addrVals[0]) require.True(t, found) @@ -358,7 +358,7 @@ func TestSlashWithRedelegation(t *testing.T) { // set a redelegation rdTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) - rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), rdTokens, sdk.NewDecFromInt(rdTokens)) + rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), rdTokens, sdk.NewDecFromInt(rdTokens), 0) app.StakingKeeper.SetRedelegation(ctx, rd) // set the associated delegation @@ -382,7 +382,9 @@ func TestSlashWithRedelegation(t *testing.T) { validator, found := app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, fraction) }) + require.NotPanics(t, func() { + app.StakingKeeper.Slash(ctx, consAddr, 10, 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) + }) burnAmount := sdk.NewDecFromInt(app.StakingKeeper.TokensFromConsensusPower(ctx, 10)).Mul(fraction).TruncateInt() bondedPool = app.StakingKeeper.GetBondedPool(ctx) @@ -413,7 +415,9 @@ func TestSlashWithRedelegation(t *testing.T) { validator, found = app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, math.LegacyOneDec()) }) + require.NotPanics(t, func() { + app.StakingKeeper.Slash(ctx, consAddr, 10, 10, math.LegacyOneDec(), types.Infraction_INFRACTION_UNSPECIFIED) + }) burnAmount = app.StakingKeeper.TokensFromConsensusPower(ctx, 7) // read updated pool @@ -447,7 +451,9 @@ func TestSlashWithRedelegation(t *testing.T) { validator, found = app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, math.LegacyOneDec()) }) + require.NotPanics(t, func() { + app.StakingKeeper.Slash(ctx, consAddr, 10, 10, math.LegacyOneDec(), types.Infraction_INFRACTION_UNSPECIFIED) + }) burnAmount = sdk.NewDecFromInt(app.StakingKeeper.TokensFromConsensusPower(ctx, 10)).Mul(math.LegacyOneDec()).TruncateInt() burnAmount = burnAmount.Sub(math.LegacyOneDec().MulInt(rdTokens).TruncateInt()) @@ -480,7 +486,9 @@ func TestSlashWithRedelegation(t *testing.T) { validator, _ = app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.Equal(t, validator.GetStatus(), types.Unbonding) - require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, math.LegacyOneDec()) }) + require.NotPanics(t, func() { + app.StakingKeeper.Slash(ctx, consAddr, 10, 10, math.LegacyOneDec(), types.Infraction_INFRACTION_UNSPECIFIED) + }) // read updated pool bondedPool = app.StakingKeeper.GetBondedPool(ctx) @@ -510,7 +518,7 @@ func TestSlashBoth(t *testing.T) { // set a redelegation with expiration timestamp beyond which the // redelegation shouldn't be slashed rdATokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) - rdA := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), rdATokens, sdk.NewDecFromInt(rdATokens)) + rdA := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), rdATokens, sdk.NewDecFromInt(rdATokens), 0) app.StakingKeeper.SetRedelegation(ctx, rdA) // set the associated delegation @@ -521,7 +529,7 @@ func TestSlashBoth(t *testing.T) { // unbonding delegation shouldn't be slashed) ubdATokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 4) ubdA := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, - time.Unix(0, 0), ubdATokens) + time.Unix(0, 0), ubdATokens, 0) app.StakingKeeper.SetUnbondingDelegation(ctx, ubdA) bondedCoins := sdk.NewCoins(sdk.NewCoin(bondDenom, rdATokens.MulRaw(2))) @@ -544,7 +552,7 @@ func TestSlashBoth(t *testing.T) { validator, found := app.StakingKeeper.GetValidatorByConsAddr(ctx, sdk.GetConsAddress(PKs[0])) require.True(t, found) consAddr0 := sdk.ConsAddress(PKs[0].Address()) - app.StakingKeeper.Slash(ctx, consAddr0, 10, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr0, 10, 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) burnedNotBondedAmount := fraction.MulInt(ubdATokens).TruncateInt() burnedBondAmount := sdk.NewDecFromInt(app.StakingKeeper.TokensFromConsensusPower(ctx, 10)).Mul(fraction).TruncateInt() @@ -575,11 +583,11 @@ func TestSlashAmount(t *testing.T) { app, ctx, _, _ := bootstrapSlashTest(t, 10) consAddr := sdk.ConsAddress(PKs[0].Address()) fraction := sdk.NewDecWithPrec(5, 1) - burnedCoins := app.StakingKeeper.Slash(ctx, consAddr, ctx.BlockHeight(), 10, fraction) + burnedCoins := app.StakingKeeper.Slash(ctx, consAddr, ctx.BlockHeight(), 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) require.True(t, burnedCoins.GT(math.ZeroInt())) // test the case where the validator was not found, which should return no coins _, addrVals := generateAddresses(app, ctx, 100) - noBurned := app.StakingKeeper.Slash(ctx, sdk.ConsAddress(addrVals[0]), ctx.BlockHeight(), 10, fraction) + noBurned := app.StakingKeeper.Slash(ctx, sdk.ConsAddress(addrVals[0]), ctx.BlockHeight(), 10, fraction, types.Infraction_INFRACTION_UNSPECIFIED) require.True(t, sdk.NewInt(0).Equal(noBurned)) } diff --git a/tests/integration/staking/keeper/unbonding_test.go b/tests/integration/staking/keeper/unbonding_test.go new file mode 100644 index 000000000000..56c4c530de63 --- /dev/null +++ b/tests/integration/staking/keeper/unbonding_test.go @@ -0,0 +1,417 @@ +package keeper_test + +import ( + "testing" + "time" + + "cosmossdk.io/math" + "cosmossdk.io/simapp" + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" + sdk "github.com/cosmos/cosmos-sdk/types" + banktestutil "github.com/cosmos/cosmos-sdk/x/bank/testutil" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/testutil" + "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" +) + +// SetupUnbondingTests creates two validators and setup mocked staking hooks for testing unbonding +func SetupUnbondingTests(t *testing.T, app *simapp.SimApp, ctx sdk.Context, hookCalled *bool, ubdeID *uint64) (bondDenom string, addrDels []sdk.AccAddress, addrVals []sdk.ValAddress) { + // setup hooks + mockCtrl := gomock.NewController(t) + mockStackingHooks := testutil.NewMockStakingHooks(mockCtrl) + mockStackingHooks.EXPECT().AfterDelegationModified(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().AfterUnbondingInitiated(gomock.Any(), gomock.Any()).DoAndReturn(func(ctx sdk.Context, id uint64) error { + *hookCalled = true + // save id + *ubdeID = id + // call back to stop unbonding + err := app.StakingKeeper.PutUnbondingOnHold(ctx, id) + require.NoError(t, err) + + return nil + }).AnyTimes() + mockStackingHooks.EXPECT().AfterValidatorBeginUnbonding(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().AfterValidatorBonded(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().AfterValidatorCreated(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().AfterValidatorRemoved(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().BeforeDelegationCreated(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().BeforeDelegationRemoved(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().BeforeDelegationSharesModified(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().BeforeValidatorModified(gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + mockStackingHooks.EXPECT().BeforeValidatorSlashed(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes() + app.StakingKeeper.SetHooks(types.NewMultiStakingHooks(mockStackingHooks)) + + addrDels = simtestutil.AddTestAddrsIncremental(app.BankKeeper, app.StakingKeeper, ctx, 2, math.NewInt(10000)) + addrVals = simtestutil.ConvertAddrsToValAddrs(addrDels) + + valTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) + startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 20) + + bondDenom = app.StakingKeeper.BondDenom(ctx) + notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) + + require.NoError(t, banktestutil.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(bondDenom, startTokens)))) + app.BankKeeper.SendCoinsFromModuleToModule(ctx, types.BondedPoolName, types.NotBondedPoolName, sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, startTokens))) + app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) + + // Create a validator + validator1 := testutil.NewValidator(t, addrVals[0], PKs[0]) + validator1, issuedShares1 := validator1.AddTokensFromDel(valTokens) + require.Equal(t, valTokens, issuedShares1.RoundInt()) + + validator1 = stakingkeeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator1, true) + require.True(math.IntEq(t, valTokens, validator1.BondedTokens())) + require.True(t, validator1.IsBonded()) + + // Create a delegator + delegation := types.NewDelegation(addrDels[0], addrVals[0], issuedShares1) + app.StakingKeeper.SetDelegation(ctx, delegation) + + // Create a validator to redelegate to + validator2 := testutil.NewValidator(t, addrVals[1], PKs[1]) + validator2, issuedShares2 := validator2.AddTokensFromDel(valTokens) + require.Equal(t, valTokens, issuedShares2.RoundInt()) + + validator2 = stakingkeeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator2, true) + require.Equal(t, types.Bonded, validator2.Status) + require.True(t, validator2.IsBonded()) + + return bondDenom, addrDels, addrVals +} + +func doUnbondingDelegation( + t *testing.T, + stakingKeeper *stakingkeeper.Keeper, + bankKeeper types.BankKeeper, + ctx sdk.Context, + bondDenom string, + addrDels []sdk.AccAddress, + addrVals []sdk.ValAddress, + hookCalled *bool, +) (completionTime time.Time, bondedAmt math.Int, notBondedAmt math.Int) { + // UNDELEGATE + // Save original bonded and unbonded amounts + bondedAmt1 := bankKeeper.GetBalance(ctx, stakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt1 := bankKeeper.GetBalance(ctx, stakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + var err error + completionTime, err = stakingKeeper.Undelegate(ctx, addrDels[0], addrVals[0], sdk.NewDec(1)) + require.NoError(t, err) + + // check that the unbonding actually happened + bondedAmt2 := bankKeeper.GetBalance(ctx, stakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt2 := bankKeeper.GetBalance(ctx, stakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + // Bonded amount is less + require.True(math.IntEq(t, bondedAmt1.SubRaw(1), bondedAmt2)) + // Unbonded amount is more + require.True(math.IntEq(t, notBondedAmt1.AddRaw(1), notBondedAmt2)) + + // Check that the unbonding happened- we look up the entry and see that it has the correct number of shares + unbondingDelegations := stakingKeeper.GetUnbondingDelegationsFromValidator(ctx, addrVals[0]) + require.Equal(t, math.NewInt(1), unbondingDelegations[0].Entries[0].Balance) + + // check that our hook was called + require.True(t, *hookCalled) + + return completionTime, bondedAmt2, notBondedAmt2 +} + +func doRedelegation( + t *testing.T, + stakingKeeper *stakingkeeper.Keeper, + ctx sdk.Context, + addrDels []sdk.AccAddress, + addrVals []sdk.ValAddress, + hookCalled *bool, +) (completionTime time.Time) { + var err error + completionTime, err = stakingKeeper.BeginRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1], sdk.NewDec(1)) + require.NoError(t, err) + + // Check that the redelegation happened- we look up the entry and see that it has the correct number of shares + redelegations := stakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 1, len(redelegations)) + require.Equal(t, sdk.NewDec(1), redelegations[0].Entries[0].SharesDst) + + // check that our hook was called + require.True(t, *hookCalled) + + return completionTime +} + +func doValidatorUnbonding( + t *testing.T, + stakingKeeper *stakingkeeper.Keeper, + ctx sdk.Context, + addrVal sdk.ValAddress, + hookCalled *bool, +) (validator types.Validator) { + validator, found := stakingKeeper.GetValidator(ctx, addrVal) + require.True(t, found) + // Check that status is bonded + require.Equal(t, types.BondStatus(3), validator.Status) + + validator, err := stakingKeeper.BeginUnbondingValidator(ctx, validator) + require.NoError(t, err) + + // Check that status is unbonding + require.Equal(t, types.BondStatus(2), validator.Status) + + // check that our hook was called + require.True(t, *hookCalled) + + return validator +} + +func TestValidatorUnbondingOnHold1(t *testing.T) { + var ( + hookCalled bool + ubdeID uint64 + ) + + _, app, ctx := createTestInput(t) + _, _, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) + + // Start unbonding first validator + validator := doValidatorUnbonding(t, app.StakingKeeper, ctx, addrVals[0], &hookCalled) + + completionTime := validator.UnbondingTime + completionHeight := validator.UnbondingHeight + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Try to unbond validator + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that validator unbonding is not complete (is not mature yet) + validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + require.Equal(t, types.Unbonding, validator.Status) + unbondingVals := app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 1, len(unbondingVals)) + require.Equal(t, validator.OperatorAddress, unbondingVals[0]) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + ctx = ctx.WithBlockTime(completionTime.Add(time.Duration(1))) + ctx = ctx.WithBlockHeight(completionHeight + 1) + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that validator unbonding is complete + validator, found = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + require.Equal(t, types.Unbonded, validator.Status) + unbondingVals = app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 0, len(unbondingVals)) +} + +func TestValidatorUnbondingOnHold2(t *testing.T) { + var ( + hookCalled bool + ubdeID uint64 + ubdeIDs []uint64 + ) + + _, app, ctx := createTestInput(t) + _, _, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) + + // Start unbonding first validator + validator1 := doValidatorUnbonding(t, app.StakingKeeper, ctx, addrVals[0], &hookCalled) + ubdeIDs = append(ubdeIDs, ubdeID) + + // Reset hookCalled flag + hookCalled = false + + // Start unbonding second validator + validator2 := doValidatorUnbonding(t, app.StakingKeeper, ctx, addrVals[1], &hookCalled) + ubdeIDs = append(ubdeIDs, ubdeID) + + // Check that there are two unbonding operations + require.Equal(t, 2, len(ubdeIDs)) + + // Check that both validators have same unbonding time + require.Equal(t, validator1.UnbondingTime, validator2.UnbondingTime) + + completionTime := validator1.UnbondingTime + completionHeight := validator1.UnbondingHeight + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + ctx = ctx.WithBlockTime(completionTime.Add(time.Duration(1))) + ctx = ctx.WithBlockHeight(completionHeight + 1) + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that unbonding is not complete for both validators + validator1, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + require.Equal(t, types.Unbonding, validator1.Status) + validator2, found = app.StakingKeeper.GetValidator(ctx, addrVals[1]) + require.True(t, found) + require.Equal(t, types.Unbonding, validator2.Status) + unbondingVals := app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 2, len(unbondingVals)) + require.Equal(t, validator1.OperatorAddress, unbondingVals[0]) + require.Equal(t, validator2.OperatorAddress, unbondingVals[1]) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeIDs[0]) + require.NoError(t, err) + + // Try again to unbond validators + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that unbonding is complete for validator1, but not for validator2 + validator1, found = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + require.Equal(t, types.Unbonded, validator1.Status) + validator2, found = app.StakingKeeper.GetValidator(ctx, addrVals[1]) + require.True(t, found) + require.Equal(t, types.Unbonding, validator2.Status) + unbondingVals = app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 1, len(unbondingVals)) + require.Equal(t, validator2.OperatorAddress, unbondingVals[0]) + + // Unbonding for validator2 can complete + err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeIDs[1]) + require.NoError(t, err) + + // Try again to unbond validators + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that unbonding is complete for validator2 + validator2, found = app.StakingKeeper.GetValidator(ctx, addrVals[1]) + require.True(t, found) + require.Equal(t, types.Unbonded, validator2.Status) + unbondingVals = app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 0, len(unbondingVals)) +} + +func TestRedelegationOnHold1(t *testing.T) { + var ( + hookCalled bool + ubdeID uint64 + ) + + _, app, ctx := createTestInput(t) + _, addrDels, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) + completionTime := doRedelegation(t, app.StakingKeeper, ctx, addrDels, addrVals, &hookCalled) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Redelegation is not complete - still exists + redelegations := app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 1, len(redelegations)) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + ctx = ctx.WithBlockTime(completionTime) + _, err = app.StakingKeeper.CompleteRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1]) + require.NoError(t, err) + + // Redelegation is complete and record is gone + redelegations = app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 0, len(redelegations)) +} + +func TestRedelegationOnHold2(t *testing.T) { + var ( + hookCalled bool + ubdeID uint64 + ) + + _, app, ctx := createTestInput(t) + _, addrDels, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) + completionTime := doRedelegation(t, app.StakingKeeper, ctx, addrDels, addrVals, &hookCalled) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + ctx = ctx.WithBlockTime(completionTime) + _, err := app.StakingKeeper.CompleteRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1]) + require.NoError(t, err) + + // Redelegation is not complete - still exists + redelegations := app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 1, len(redelegations)) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Redelegation is complete and record is gone + redelegations = app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 0, len(redelegations)) +} + +func TestUnbondingDelegationOnHold1(t *testing.T) { + var ( + hookCalled bool + ubdeID uint64 + ) + + _, app, ctx := createTestInput(t) + bondDenom, addrDels, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) + completionTime, bondedAmt1, notBondedAmt1 := doUnbondingDelegation(t, app.StakingKeeper, app.BankKeeper, ctx, bondDenom, addrDels, addrVals, &hookCalled) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + bondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + // Bonded and unbonded amounts are the same as before because the completionTime has not yet passed and so the + // unbondingDelegation has not completed + require.True(math.IntEq(t, bondedAmt1, bondedAmt3)) + require.True(math.IntEq(t, notBondedAmt1, notBondedAmt3)) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + ctx = ctx.WithBlockTime(completionTime) + _, err = app.StakingKeeper.CompleteUnbonding(ctx, addrDels[0], addrVals[0]) + require.NoError(t, err) + + // Check that the unbonding was finally completed + bondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + require.True(math.IntEq(t, bondedAmt1, bondedAmt5)) + // Not bonded amount back to what it was originaly + require.True(math.IntEq(t, notBondedAmt1.SubRaw(1), notBondedAmt5)) +} + +func TestUnbondingDelegationOnHold2(t *testing.T) { + var ( + hookCalled bool + ubdeID uint64 + ) + + _, app, ctx := createTestInput(t) + bondDenom, addrDels, addrVals := SetupUnbondingTests(t, app, ctx, &hookCalled, &ubdeID) + completionTime, bondedAmt1, notBondedAmt1 := doUnbondingDelegation(t, app.StakingKeeper, app.BankKeeper, ctx, bondDenom, addrDels, addrVals, &hookCalled) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + ctx = ctx.WithBlockTime(completionTime) + _, err := app.StakingKeeper.CompleteUnbonding(ctx, addrDels[0], addrVals[0]) + require.NoError(t, err) + + bondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + // Bonded and unbonded amounts are the same as before because the completionTime has not yet passed and so the + // unbondingDelegation has not completed + require.True(math.IntEq(t, bondedAmt1, bondedAmt3)) + require.True(math.IntEq(t, notBondedAmt1, notBondedAmt3)) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Check that the unbonding was finally completed + bondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + require.True(math.IntEq(t, bondedAmt1, bondedAmt5)) + // Not bonded amount back to what it was originaly + require.True(math.IntEq(t, notBondedAmt1.SubRaw(1), notBondedAmt5)) +} diff --git a/tests/integration/staking/keeper/validator_test.go b/tests/integration/staking/keeper/validator_test.go index 04b3a7fb38cb..1599d1414c09 100644 --- a/tests/integration/staking/keeper/validator_test.go +++ b/tests/integration/staking/keeper/validator_test.go @@ -150,7 +150,7 @@ func TestSlashToZeroPowerRemoved(t *testing.T) { require.Equal(t, valTokens, validator.Tokens, "\nvalidator %v\npool %v", validator, valTokens) // slash the validator by 100% - app.StakingKeeper.Slash(ctx, sdk.ConsAddress(PKs[0].Address()), 0, 100, math.LegacyOneDec()) + app.StakingKeeper.Slash(ctx, sdk.ConsAddress(PKs[0].Address()), 0, 100, math.LegacyOneDec(), types.Infraction_INFRACTION_UNSPECIFIED) // apply TM updates applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) // validator should be unbonding diff --git a/x/distribution/keeper/hooks.go b/x/distribution/keeper/hooks.go index aa7a68422ea2..cb8ca0c3f757 100644 --- a/x/distribution/keeper/hooks.go +++ b/x/distribution/keeper/hooks.go @@ -126,3 +126,7 @@ func (h Hooks) AfterValidatorBeginUnbonding(_ sdk.Context, _ sdk.ConsAddress, _ func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) error { return nil } + +func (h Hooks) AfterUnbondingInitiated(_ sdk.Context, _ uint64) error { + return nil +} diff --git a/x/evidence/README.md b/x/evidence/README.md index c6fca6f9b3d3..1623a5307b45 100644 --- a/x/evidence/README.md +++ b/x/evidence/README.md @@ -222,15 +222,7 @@ The Cosmos SDK handles two types of evidence inside the ABCI `BeginBlock`: The evidence module handles these two evidence types the same way. First, the Cosmos SDK converts the Tendermint concrete evidence type to an SDK `Evidence` interface using `Equivocation` as the concrete type. -```proto -// Equivocation implements the Evidence interface. -message Equivocation { - int64 height = 1; - google.protobuf.Timestamp time = 2; - int64 power = 3; - string consensus_address = 4; -} -``` ++++ https://github.com/cosmos/cosmos-sdk/blob/v0.46.1/proto/cosmos/evidence/v1beta1/evidence.proto#L11-L22 For some `Equivocation` submitted in `block` to be valid, it must satisfy: @@ -252,106 +244,7 @@ validator to ever re-enter the validator set. The `Equivocation` evidence is handled as follows: -```go -func (k Keeper) HandleEquivocationEvidence(ctx sdk.Context, evidence *types.Equivocation) { - logger := k.Logger(ctx) - consAddr := evidence.GetConsensusAddress() - - if _, err := k.slashingKeeper.GetPubkey(ctx, consAddr.Bytes()); err != nil { - // Ignore evidence that cannot be handled. - // - // NOTE: We used to panic with: - // `panic(fmt.Sprintf("Validator consensus-address %v not found", consAddr))`, - // but this couples the expectations of the app to both Tendermint and - // the simulator. Both are expected to provide the full range of - // allowable but none of the disallowed evidence types. Instead of - // getting this coordination right, it is easier to relax the - // constraints and ignore evidence that cannot be handled. - return - } - - // calculate the age of the evidence - infractionHeight := evidence.GetHeight() - infractionTime := evidence.GetTime() - ageDuration := ctx.BlockHeader().Time.Sub(infractionTime) - ageBlocks := ctx.BlockHeader().Height - infractionHeight - - // Reject evidence if the double-sign is too old. Evidence is considered stale - // if the difference in time and number of blocks is greater than the allowed - // parameters defined. - cp := ctx.ConsensusParams() - if cp != nil && cp.Evidence != nil { - if ageDuration > cp.Evidence.MaxAgeDuration && ageBlocks > cp.Evidence.MaxAgeNumBlocks { - logger.Info( - "ignored equivocation; evidence too old", - "validator", consAddr, - "infraction_height", infractionHeight, - "max_age_num_blocks", cp.Evidence.MaxAgeNumBlocks, - "infraction_time", infractionTime, - "max_age_duration", cp.Evidence.MaxAgeDuration, - ) - return - } - } - - validator := k.stakingKeeper.ValidatorByConsAddr(ctx, consAddr) - if validator == nil || validator.IsUnbonded() { - // Defensive: Simulation doesn't take unbonding periods into account, and - // Tendermint might break this assumption at some point. - return - } - - if ok := k.slashingKeeper.HasValidatorSigningInfo(ctx, consAddr); !ok { - panic(fmt.Sprintf("expected signing info for validator %s but not found", consAddr)) - } - - // ignore if the validator is already tombstoned - if k.slashingKeeper.IsTombstoned(ctx, consAddr) { - logger.Info( - "ignored equivocation; validator already tombstoned", - "validator", consAddr, - "infraction_height", infractionHeight, - "infraction_time", infractionTime, - ) - return - } - - logger.Info( - "confirmed equivocation", - "validator", consAddr, - "infraction_height", infractionHeight, - "infraction_time", infractionTime, - ) - - // We need to retrieve the stake distribution which signed the block, so we - // subtract ValidatorUpdateDelay from the evidence height. - // Note, that this *can* result in a negative "distributionHeight", up to - // -ValidatorUpdateDelay, i.e. at the end of the - // pre-genesis block (none) = at the beginning of the genesis block. - // That's fine since this is just used to filter unbonding delegations & redelegations. - distributionHeight := infractionHeight - sdk.ValidatorUpdateDelay - - // Slash validator. The `power` is the int64 power of the validator as provided - // to/by Tendermint. This value is validator.Tokens as sent to Tendermint via - // ABCI, and now received as evidence. The fraction is passed in to separately - // to slash unbonding and rebonding delegations. - k.slashingKeeper.Slash( - ctx, - consAddr, - k.slashingKeeper.SlashFractionDoubleSign(ctx), - evidence.GetValidatorPower(), distributionHeight, - ) - - // Jail the validator if not already jailed. This will begin unbonding the - // validator if not already unbonding (tombstoned). - if !validator.IsJailed() { - k.slashingKeeper.Jail(ctx, consAddr) - } - - k.slashingKeeper.JailUntil(ctx, consAddr, types.DoubleSignJailEndTime) - k.slashingKeeper.Tombstone(ctx, consAddr) -} -``` ++++ https://github.com/cosmos/cosmos-sdk/blob/83260b0c2f9afcc7ec94a102f83906e8e56ef18e/x/evidence/keeper/infraction.go#L26-L140 **Note:** The slashing, jailing, and tombstoning calls are delegated through the `x/slashing` module that emits informative events and finally delegates calls to the `x/staking` module. See documentation diff --git a/x/evidence/keeper/infraction.go b/x/evidence/keeper/infraction.go index 3ae74bc216de..1c667c46ad8c 100644 --- a/x/evidence/keeper/infraction.go +++ b/x/evidence/keeper/infraction.go @@ -6,6 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/evidence/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) // HandleEquivocationEvidence implements an equivocation evidence handler. Assuming the @@ -70,6 +71,21 @@ func (k Keeper) HandleEquivocationEvidence(ctx sdk.Context, evidence *types.Equi return } + if !validator.GetOperator().Empty() { + if _, err := k.slashingKeeper.GetPubkey(ctx, consAddr.Bytes()); err != nil { + // Ignore evidence that cannot be handled. + // + // NOTE: We used to panic with: + // `panic(fmt.Sprintf("Validator consensus-address %v not found", consAddr))`, + // but this couples the expectations of the app to both Tendermint and + // the simulator. Both are expected to provide the full range of + // allowable but none of the disallowed evidence types. Instead of + // getting this coordination right, it is easier to relax the + // constraints and ignore evidence that cannot be handled. + return + } + } + if ok := k.slashingKeeper.HasValidatorSigningInfo(ctx, consAddr); !ok { panic(fmt.Sprintf("expected signing info for validator %s but not found", consAddr)) } @@ -109,6 +125,7 @@ func (k Keeper) HandleEquivocationEvidence(ctx sdk.Context, evidence *types.Equi consAddr, k.slashingKeeper.SlashFractionDoubleSign(ctx), evidence.GetValidatorPower(), distributionHeight, + stakingtypes.Infraction_INFRACTION_DOUBLE_SIGN, ) // Jail the validator if not already jailed. This will begin unbonding the diff --git a/x/evidence/testutil/expected_keepers_mocks.go b/x/evidence/testutil/expected_keepers_mocks.go index 7222ecf3f4c8..7f609130b457 100644 --- a/x/evidence/testutil/expected_keepers_mocks.go +++ b/x/evidence/testutil/expected_keepers_mocks.go @@ -157,15 +157,15 @@ func (mr *MockSlashingKeeperMockRecorder) JailUntil(arg0, arg1, arg2 interface{} } // Slash mocks base method. -func (m *MockSlashingKeeper) Slash(arg0 types0.Context, arg1 types0.ConsAddress, arg2 types0.Dec, arg3, arg4 int64) { +func (m *MockSlashingKeeper) Slash(arg0 types0.Context, arg1 types0.ConsAddress, arg2 types0.Dec, arg3, arg4 int64, arg5 types2.Infraction) { m.ctrl.T.Helper() - m.ctrl.Call(m, "Slash", arg0, arg1, arg2, arg3, arg4) + m.ctrl.Call(m, "Slash", arg0, arg1, arg2, arg3, arg4, arg5) } // Slash indicates an expected call of Slash. -func (mr *MockSlashingKeeperMockRecorder) Slash(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { +func (mr *MockSlashingKeeperMockRecorder) Slash(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Slash", reflect.TypeOf((*MockSlashingKeeper)(nil).Slash), arg0, arg1, arg2, arg3, arg4) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Slash", reflect.TypeOf((*MockSlashingKeeper)(nil).Slash), arg0, arg1, arg2, arg3, arg4, arg5) } // SlashFractionDoubleSign mocks base method. diff --git a/x/evidence/types/expected_keepers.go b/x/evidence/types/expected_keepers.go index 1101b8ae2031..8c157aff0c97 100644 --- a/x/evidence/types/expected_keepers.go +++ b/x/evidence/types/expected_keepers.go @@ -25,7 +25,7 @@ type ( IsTombstoned(sdk.Context, sdk.ConsAddress) bool HasValidatorSigningInfo(sdk.Context, sdk.ConsAddress) bool Tombstone(sdk.Context, sdk.ConsAddress) - Slash(sdk.Context, sdk.ConsAddress, sdk.Dec, int64, int64) + Slash(sdk.Context, sdk.ConsAddress, sdk.Dec, int64, int64, stakingtypes.Infraction) SlashFractionDoubleSign(sdk.Context) sdk.Dec Jail(sdk.Context, sdk.ConsAddress) JailUntil(sdk.Context, sdk.ConsAddress, time.Time) diff --git a/x/slashing/README.md b/x/slashing/README.md index 1f962ddb716a..4b12fa0b276e 100644 --- a/x/slashing/README.md +++ b/x/slashing/README.md @@ -283,7 +283,7 @@ for vote in block.LastCommitInfo.Votes { // That's fine since this is just used to filter unbonding delegations & redelegations. distributionHeight := height - sdk.ValidatorUpdateDelay - 1 - Slash(vote.Validator.Address, distributionHeight, vote.Validator.Power, SlashFractionDowntime()) + Slash(vote.Validator.Address, distributionHeight, vote.Validator.Power, SlashFractionDowntime(), stakingtypes.Downtime) Jail(vote.Validator.Address) signInfo.JailedUntil = block.Time.Add(DowntimeJailDuration()) diff --git a/x/slashing/keeper/hooks.go b/x/slashing/keeper/hooks.go index 01f2c2690a60..a10e44e4cb67 100644 --- a/x/slashing/keeper/hooks.go +++ b/x/slashing/keeper/hooks.go @@ -86,3 +86,7 @@ func (h Hooks) AfterDelegationModified(_ sdk.Context, _ sdk.AccAddress, _ sdk.Va func (h Hooks) BeforeValidatorSlashed(_ sdk.Context, _ sdk.ValAddress, _ sdk.Dec) error { return nil } + +func (h Hooks) AfterUnbondingInitiated(_ sdk.Context, _ uint64) error { + return nil +} diff --git a/x/slashing/keeper/infractions.go b/x/slashing/keeper/infractions.go index 426e54733a93..d89ddc14806b 100644 --- a/x/slashing/keeper/infractions.go +++ b/x/slashing/keeper/infractions.go @@ -6,6 +6,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/slashing/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) // HandleValidatorSignature handles a validator signature, must be called once per validator per block. @@ -19,6 +20,11 @@ func (k Keeper) HandleValidatorSignature(ctx sdk.Context, addr cryptotypes.Addre panic(fmt.Sprintf("Validator consensus-address %s not found", consAddr)) } + // don't update missed blocks when validator's jailed + if k.sk.IsValidatorJailed(ctx, consAddr) { + return + } + // fetch signing info signInfo, found := k.GetValidatorSigningInfo(ctx, consAddr) if !found { @@ -84,7 +90,7 @@ func (k Keeper) HandleValidatorSignature(ctx sdk.Context, addr cryptotypes.Addre // That's fine since this is just used to filter unbonding delegations & redelegations. distributionHeight := height - sdk.ValidatorUpdateDelay - 1 - coinsBurned := k.sk.Slash(ctx, consAddr, distributionHeight, power, k.SlashFractionDowntime(ctx)) + coinsBurned := k.sk.Slash(ctx, consAddr, distributionHeight, power, k.SlashFractionDowntime(ctx), stakingtypes.Infraction_INFRACTION_DOWNTIME) ctx.EventManager().EmitEvent( sdk.NewEvent( types.EventTypeSlash, diff --git a/x/slashing/keeper/keeper.go b/x/slashing/keeper/keeper.go index 8fe32f9edb32..50aef706dbe7 100644 --- a/x/slashing/keeper/keeper.go +++ b/x/slashing/keeper/keeper.go @@ -10,6 +10,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/slashing/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) // Keeper of the slashing store @@ -70,8 +71,8 @@ func (k Keeper) GetPubkey(ctx sdk.Context, a cryptotypes.Address) (cryptotypes.P // Slash attempts to slash a validator. The slash is delegated to the staking // module to make the necessary validator changes. -func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, fraction sdk.Dec, power, distributionHeight int64) { - coinsBurned := k.sk.Slash(ctx, consAddr, distributionHeight, power, fraction) +func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, fraction sdk.Dec, power, distributionHeight int64, infraction stakingtypes.Infraction) { + coinsBurned := k.sk.Slash(ctx, consAddr, distributionHeight, power, fraction, infraction) ctx.EventManager().EmitEvent( sdk.NewEvent( types.EventTypeSlash, diff --git a/x/slashing/testutil/expected_keepers_mocks.go b/x/slashing/testutil/expected_keepers_mocks.go index 321ca0561f44..d30b21f06178 100644 --- a/x/slashing/testutil/expected_keepers_mocks.go +++ b/x/slashing/testutil/expected_keepers_mocks.go @@ -281,6 +281,20 @@ func (mr *MockStakingKeeperMockRecorder) GetAllValidators(ctx interface{}) *gomo return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAllValidators", reflect.TypeOf((*MockStakingKeeper)(nil).GetAllValidators), ctx) } +// IsValidatorJailed mocks base method. +func (m *MockStakingKeeper) IsValidatorJailed(ctx types.Context, addr types.ConsAddress) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsValidatorJailed", ctx, addr) + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsValidatorJailed indicates an expected call of IsValidatorJailed. +func (mr *MockStakingKeeperMockRecorder) IsValidatorJailed(ctx, addr interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsValidatorJailed", reflect.TypeOf((*MockStakingKeeper)(nil).IsValidatorJailed), ctx, addr) +} + // IterateValidators mocks base method. func (m *MockStakingKeeper) IterateValidators(arg0 types.Context, arg1 func(int64, types2.ValidatorI) bool) { m.ctrl.T.Helper() @@ -320,17 +334,17 @@ func (mr *MockStakingKeeperMockRecorder) MaxValidators(arg0 interface{}) *gomock } // Slash mocks base method. -func (m *MockStakingKeeper) Slash(arg0 types.Context, arg1 types.ConsAddress, arg2, arg3 int64, arg4 types.Dec) math.Int { +func (m *MockStakingKeeper) Slash(arg0 types.Context, arg1 types.ConsAddress, arg2, arg3 int64, arg4 types.Dec, arg5 types2.Infraction) math.Int { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Slash", arg0, arg1, arg2, arg3, arg4) + ret := m.ctrl.Call(m, "Slash", arg0, arg1, arg2, arg3, arg4, arg5) ret0, _ := ret[0].(math.Int) return ret0 } // Slash indicates an expected call of Slash. -func (mr *MockStakingKeeperMockRecorder) Slash(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { +func (mr *MockStakingKeeperMockRecorder) Slash(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Slash", reflect.TypeOf((*MockStakingKeeper)(nil).Slash), arg0, arg1, arg2, arg3, arg4) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Slash", reflect.TypeOf((*MockStakingKeeper)(nil).Slash), arg0, arg1, arg2, arg3, arg4, arg5) } // Unjail mocks base method. diff --git a/x/slashing/types/expected_keepers.go b/x/slashing/types/expected_keepers.go index 0b1a8afe8c9c..5698c08ae2f7 100644 --- a/x/slashing/types/expected_keepers.go +++ b/x/slashing/types/expected_keepers.go @@ -1,5 +1,3 @@ -// noalias -// DONTCOVER package types import ( @@ -43,7 +41,7 @@ type StakingKeeper interface { ValidatorByConsAddr(sdk.Context, sdk.ConsAddress) stakingtypes.ValidatorI // get a particular validator by consensus address // slash the validator and delegators of the validator, specifying offence height, offence power, and slash fraction - Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec) math.Int + Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec, stakingtypes.Infraction) math.Int Jail(sdk.Context, sdk.ConsAddress) // jail a validator Unjail(sdk.Context, sdk.ConsAddress) // unjail a validator @@ -54,6 +52,9 @@ type StakingKeeper interface { // MaxValidators returns the maximum amount of bonded validators MaxValidators(sdk.Context) uint32 + + // IsValidatorJailed returns if the validator is jailed. + IsValidatorJailed(ctx sdk.Context, addr sdk.ConsAddress) bool } // StakingHooks event hooks for staking validator object (noalias) diff --git a/x/staking/README.md b/x/staking/README.md index cce4b7c4125a..be1fa22c183e 100644 --- a/x/staking/README.md +++ b/x/staking/README.md @@ -73,6 +73,19 @@ Store entries prefixed with "Last" must remain unchanged until EndBlock. * LastTotalPower: `0x12 -> ProtocolBuffer(math.Int)` +## ValidatorUpdates + +ValidatorUpdates contains the validator updates returned to ABCI at the end of every block. +The values are overwritten in every block. + +* ValidatorUpdates `0x61 -> []abci.ValidatorUpdate` + +## UnbondingID + +UnbondingID stores the ID of the latest unbonding operation. It enables to create unique IDs for unbonding operation, i.e., UnbondingID is incremented every time a new unbonding operation (validator unbonding, unbonding delegation, redelegation) is initiated. + +* UnbondingID: `0x37 -> uint64` + ## Params The staking module stores its params in state with the prefix of `0x51`, @@ -111,12 +124,16 @@ records within a block. * ValidatorsByConsAddr: `0x22 | ConsAddrLen (1 byte) | ConsAddr -> OperatorAddr` * ValidatorsByPower: `0x23 | BigEndian(ConsensusPower) | OperatorAddrLen (1 byte) | OperatorAddr -> OperatorAddr` * LastValidatorsPower: `0x11 | OperatorAddrLen (1 byte) | OperatorAddr -> ProtocolBuffer(ConsensusPower)` +* ValidatorsByUnbondingID: `0x38 | UnbondingID -> 0x21 | OperatorAddrLen (1 byte) | OperatorAddr` `Validators` is the primary index - it ensures that each operator can have only one associated validator, where the public key of that validator can change in the future. Delegators can refer to the immutable operator of the validator, without concern for the changing public key. +`ValidatorsByUnbondingID` is an additional index that enables lookups for + validators by the unbonding IDs corresponding to their current unbonding. + `ValidatorByConsAddr` is an additional index that enables lookups for slashing. When Tendermint reports evidence, it provides the validator address, so this map is needed to find the operator. Note that the `ConsAddr` corresponds to the @@ -180,11 +197,18 @@ detected. * UnbondingDelegation: `0x32 | DelegatorAddrLen (1 byte) | DelegatorAddr | ValidatorAddrLen (1 byte) | ValidatorAddr -> ProtocolBuffer(unbondingDelegation)` * UnbondingDelegationsFromValidator: `0x33 | ValidatorAddrLen (1 byte) | ValidatorAddr | DelegatorAddrLen (1 byte) | DelegatorAddr -> nil` +* UnbondingDelegationByUnbondingId: `0x38 | UnbondingId -> 0x32 | DelegatorAddrLen (1 byte) | DelegatorAddr | ValidatorAddrLen (1 byte) | ValidatorAddr` + `UnbondingDelegation` is used in queries, to lookup all unbonding delegations for + a given delegator. + +`UnbondingDelegationsFromValidator` is used in slashing, to lookup all + unbonding delegations associated with a given validator that need to be + slashed. + + `UnbondingDelegationByUnbondingId` is an additional index that enables + lookups for unbonding delegations by the unbonding IDs of the containing + unbonding delegation entries. -The first map here is used in queries, to lookup all unbonding delegations for -a given delegator, while the second map is used in slashing, to lookup all -unbonding delegations associated with a given validator that need to be -slashed. A UnbondingDelegation object is created every time an unbonding is initiated. @@ -203,11 +227,23 @@ committed by the source validator. * Redelegations: `0x34 | DelegatorAddrLen (1 byte) | DelegatorAddr | ValidatorAddrLen (1 byte) | ValidatorSrcAddr | ValidatorDstAddr -> ProtocolBuffer(redelegation)` * RedelegationsBySrc: `0x35 | ValidatorSrcAddrLen (1 byte) | ValidatorSrcAddr | ValidatorDstAddrLen (1 byte) | ValidatorDstAddr | DelegatorAddrLen (1 byte) | DelegatorAddr -> nil` * RedelegationsByDst: `0x36 | ValidatorDstAddrLen (1 byte) | ValidatorDstAddr | ValidatorSrcAddrLen (1 byte) | ValidatorSrcAddr | DelegatorAddrLen (1 byte) | DelegatorAddr -> nil` +* RedelegationByUnbondingId: `0x38 | UnbondingId -> 0x34 | DelegatorAddrLen (1 byte) | DelegatorAddr | ValidatorAddrLen (1 byte) | ValidatorSrcAddr | ValidatorDstAddr` + + `Redelegations` is used for queries, to lookup all redelegations for a given + delegator. + + `RedelegationsBySrc` is used for slashing based on the `ValidatorSrcAddr`. + + `RedelegationsByDst` is used for slashing based on the `ValidatorDstAddr` The first map here is used for queries, to lookup all redelegations for a given delegator. The second map is used for slashing based on the `ValidatorSrcAddr`, while the third map is for slashing based on the `ValidatorDstAddr`. +`RedelegationByUnbondingId` is an additional index that enables + lookups for redelegations by the unbonding IDs of the containing + redelegation entries. + A redelegation object is created every time a redelegation occurs. To prevent "redelegation hopping" redelegations may not occur under the situation that: @@ -355,13 +391,17 @@ As a part of the Undelegate and Complete Unbonding state transitions Unbond Delegation may be called. * subtract the unbonded shares from delegator -* add the unbonded tokens to an `UnbondingDelegation` Entry +* add the unbonded tokens to an `UnbondingDelegationEntry` * update the delegation or remove the delegation if there are no more shares * if the delegation is the operator of the validator and no more shares exist then trigger a jail validator * update the validator with removed the delegator shares and associated coins * if the validator state is `Bonded`, transfer the `Coins` worth of the unbonded shares from the `BondedPool` to the `NotBondedPool` `ModuleAccount` * remove the validator if it is unbonded and there are no more delegation shares. +* remove the validator if it is unbonded and there are no more delegation shares +* get a unique `unbondingId` and map it to the `UnbondingDelegationEntry` in `UnbondingDelegationByUnbondingId` +* call the `AfterUnbondingInitiated(unbondingId)` hook +* add the unbonding delegation to `UnbondingDelegationQueue` with the completion time set to `UnbondingTime` ### Cancel an `UnbondingDelegation` Entry @@ -705,6 +745,12 @@ validators that still have remaining delegations, the `validator.Status` is switched from `types.Unbonding` to `types.Unbonded`. +Unbonding operations can be put on hold by external modules via the `PutUnbondingOnHold(unbondingId)` method. + As a result, an unbonding operation (e.g., an unbonding delegation) that is on hold, cannot complete + even if it reaches maturity. For an unbonding operation with `unbondingId` to eventually complete + (after it reaches maturity), every call to `PutUnbondingOnHold(unbondingId)` must be matched + by a call to `UnbondingCanComplete(unbondingId)`. + ### Unbonding Delegations Complete the unbonding of all mature `UnbondingDelegations.Entries` within the @@ -749,6 +795,9 @@ following hooks can registered with staking: * called when a delegation is created or modified * `BeforeDelegationRemoved(Context, AccAddress, ValAddress) error` * called when a delegation is removed +* `AfterUnbondingInitiated(Context, UnbondingID)` + * called when an unbonding operation (validator unbonding, unbonding delegation, redelegation) was initiated + # Events diff --git a/x/staking/keeper/delegation.go b/x/staking/keeper/delegation.go index 94ab596d337d..23cb929099e8 100644 --- a/x/staking/keeper/delegation.go +++ b/x/staking/keeper/delegation.go @@ -271,17 +271,17 @@ func (k Keeper) HasMaxUnbondingDelegationEntries(ctx sdk.Context, delegatorAddr // SetUnbondingDelegation sets the unbonding delegation and associated index. func (k Keeper) SetUnbondingDelegation(ctx sdk.Context, ubd types.UnbondingDelegation) { - delegatorAddress := sdk.MustAccAddressFromBech32(ubd.DelegatorAddress) + delAddr := sdk.MustAccAddressFromBech32(ubd.DelegatorAddress) store := ctx.KVStore(k.storeKey) bz := types.MustMarshalUBD(k.cdc, ubd) - addr, err := sdk.ValAddressFromBech32(ubd.ValidatorAddress) + valAddr, err := sdk.ValAddressFromBech32(ubd.ValidatorAddress) if err != nil { panic(err) } - key := types.GetUBDKey(delegatorAddress, addr) + key := types.GetUBDKey(delAddr, valAddr) store.Set(key, bz) - store.Set(types.GetUBDByValIndexKey(delegatorAddress, addr), []byte{}) // index, store empty bytes + store.Set(types.GetUBDByValIndexKey(delAddr, valAddr), []byte{}) // index, store empty bytes } // RemoveUnbondingDelegation removes the unbonding delegation object and associated index. @@ -305,14 +305,22 @@ func (k Keeper) SetUnbondingDelegationEntry( creationHeight int64, minTime time.Time, balance math.Int, ) types.UnbondingDelegation { ubd, found := k.GetUnbondingDelegation(ctx, delegatorAddr, validatorAddr) + id := k.IncrementUnbondingID(ctx) if found { - ubd.AddEntry(creationHeight, minTime, balance) + ubd.AddEntry(creationHeight, minTime, balance, id) } else { - ubd = types.NewUnbondingDelegation(delegatorAddr, validatorAddr, creationHeight, minTime, balance) + ubd = types.NewUnbondingDelegation(delegatorAddr, validatorAddr, creationHeight, minTime, balance, id) } k.SetUnbondingDelegation(ctx, ubd) + // Add to the UBDByUnbondingOp index to look up the UBD by the UBDE ID + k.SetUnbondingDelegationByUnbondingID(ctx, ubd, id) + + if err := k.Hooks().AfterUnbondingInitiated(ctx, id); err != nil { + k.Logger(ctx).Error("failed to call after unbonding initiated hook", "error", err) + } + return ubd } @@ -488,15 +496,23 @@ func (k Keeper) SetRedelegationEntry(ctx sdk.Context, sharesSrc, sharesDst sdk.Dec, ) types.Redelegation { red, found := k.GetRedelegation(ctx, delegatorAddr, validatorSrcAddr, validatorDstAddr) + id := k.IncrementUnbondingID(ctx) if found { - red.AddEntry(creationHeight, minTime, balance, sharesDst) + red.AddEntry(creationHeight, minTime, balance, sharesDst, id) } else { red = types.NewRedelegation(delegatorAddr, validatorSrcAddr, - validatorDstAddr, creationHeight, minTime, balance, sharesDst) + validatorDstAddr, creationHeight, minTime, balance, sharesDst, id) } k.SetRedelegation(ctx, red) + // Add to the UBDByEntry index to look up the UBD by the UBDE ID + k.SetRedelegationByUnbondingID(ctx, red, id) + + if err := k.Hooks().AfterUnbondingInitiated(ctx, id); err != nil { + k.Logger(ctx).Error("failed to call after unbonding initiated hook", "error", err) + } + return red } @@ -846,9 +862,10 @@ func (k Keeper) CompleteUnbonding(ctx sdk.Context, delAddr sdk.AccAddress, valAd // loop through all the entries and complete unbonding mature entries for i := 0; i < len(ubd.Entries); i++ { entry := ubd.Entries[i] - if entry.IsMature(ctxTime) { + if entry.IsMature(ctxTime) && !entry.OnHold() { ubd.RemoveEntry(int64(i)) i-- + k.DeleteUnbondingIndex(ctx, entry.UnbondingId) // track undelegation only when remaining or truncated shares are non-zero if !entry.Balance.IsZero() { @@ -950,9 +967,10 @@ func (k Keeper) CompleteRedelegation( // loop through all the entries and complete mature redelegation entries for i := 0; i < len(red.Entries); i++ { entry := red.Entries[i] - if entry.IsMature(ctxTime) { + if entry.IsMature(ctxTime) && !entry.OnHold() { red.RemoveEntry(int64(i)) i-- + k.DeleteUnbondingIndex(ctx, entry.UnbondingId) if !entry.InitialBalance.IsZero() { balances = balances.Add(sdk.NewCoin(bondDenom, entry.InitialBalance)) diff --git a/x/staking/keeper/delegation_test.go b/x/staking/keeper/delegation_test.go index 7847255b4034..6a5782c9fca3 100644 --- a/x/staking/keeper/delegation_test.go +++ b/x/staking/keeper/delegation_test.go @@ -152,6 +152,7 @@ func (s *KeeperTestSuite) TestUnbondingDelegation() { 0, time.Unix(0, 0).UTC(), sdk.NewInt(5), + 0, ) // set and retrieve a record @@ -491,7 +492,7 @@ func (s *KeeperTestSuite) TestGetRedelegationsFromSrcValidator() { rd := stakingtypes.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, time.Unix(0, 0), sdk.NewInt(5), - math.LegacyNewDec(5)) + math.LegacyNewDec(5), 0) // set and retrieve a record keeper.SetRedelegation(ctx, rd) @@ -518,7 +519,7 @@ func (s *KeeperTestSuite) TestRedelegation() { rd := stakingtypes.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, time.Unix(0, 0).UTC(), sdk.NewInt(5), - math.LegacyNewDec(5)) + math.LegacyNewDec(5), 0) // test shouldn't have and redelegations has := keeper.HasReceivingRedelegation(ctx, addrDels[0], addrVals[1]) diff --git a/x/staking/keeper/grpc_query.go b/x/staking/keeper/grpc_query.go index 1389d7c05c92..2ff23e2f4cf0 100644 --- a/x/staking/keeper/grpc_query.go +++ b/x/staking/keeper/grpc_query.go @@ -597,6 +597,7 @@ func RedelegationsToRedelegationResponses(ctx sdk.Context, k *Keeper, redels typ entry.SharesDst, entry.InitialBalance, val.TokensFromShares(entry.SharesDst).TruncateInt(), + entry.UnbondingId, ) } diff --git a/x/staking/keeper/keeper.go b/x/staking/keeper/keeper.go index 675b0d41b067..fb61ea58b8af 100644 --- a/x/staking/keeper/keeper.go +++ b/x/staking/keeper/keeper.go @@ -6,6 +6,7 @@ import ( "cosmossdk.io/math" storetypes "github.com/cosmos/cosmos-sdk/store/types" + abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" "github.com/cosmos/cosmos-sdk/codec" @@ -111,3 +112,21 @@ func (k Keeper) SetLastTotalPower(ctx sdk.Context, power math.Int) { func (k Keeper) GetAuthority() string { return k.authority } + +// SetValidatorUpdates sets the ABCI validator power updates for the current block. +func (k Keeper) SetValidatorUpdates(ctx sdk.Context, valUpdates []abci.ValidatorUpdate) { + store := ctx.KVStore(k.storeKey) + bz := k.cdc.MustMarshal(&types.ValidatorUpdates{Updates: valUpdates}) + store.Set(types.ValidatorUpdatesKey, bz) +} + +// GetValidatorUpdates returns the ABCI validator power updates within the current block. +func (k Keeper) GetValidatorUpdates(ctx sdk.Context) []abci.ValidatorUpdate { + store := ctx.KVStore(k.storeKey) + bz := store.Get(types.ValidatorUpdatesKey) + + var valUpdates types.ValidatorUpdates + k.cdc.MustUnmarshal(bz, &valUpdates) + + return valUpdates.Updates +} diff --git a/x/staking/keeper/params.go b/x/staking/keeper/params.go index 89b6b823d0c0..99e30d26ce7f 100644 --- a/x/staking/keeper/params.go +++ b/x/staking/keeper/params.go @@ -27,12 +27,12 @@ func (k Keeper) MaxEntries(ctx sdk.Context) uint32 { // HistoricalEntries = number of historical info entries // to persist in store -func (k Keeper) HistoricalEntries(ctx sdk.Context) (res uint32) { +func (k Keeper) HistoricalEntries(ctx sdk.Context) uint32 { return k.GetParams(ctx).HistoricalEntries } // BondDenom - Bondable coin denomination -func (k Keeper) BondDenom(ctx sdk.Context) (res string) { +func (k Keeper) BondDenom(ctx sdk.Context) string { return k.GetParams(ctx).BondDenom } diff --git a/x/staking/keeper/slash.go b/x/staking/keeper/slash.go index 7b239e588f11..156bb73aee08 100644 --- a/x/staking/keeper/slash.go +++ b/x/staking/keeper/slash.go @@ -30,7 +30,10 @@ import ( // // Infraction was committed at the current height or at a past height, // not at a height in the future -func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, infractionHeight int64, power int64, slashFactor sdk.Dec) math.Int { +// --- +// +// Slash implementation doesn't require the infraction (types.Infraction) to work but the IS one does. It is here to have IS satisfy the Slash signature. +func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, infractionHeight int64, power int64, slashFactor sdk.Dec, _ types.Infraction) math.Int { logger := k.Logger(ctx) if slashFactor.IsNegative() { @@ -191,7 +194,7 @@ func (k Keeper) SlashUnbondingDelegation(ctx sdk.Context, unbondingDelegation ty continue } - if entry.IsMature(now) { + if entry.IsMature(now) && !entry.OnHold() { // Unbonding delegation no longer eligible for slashing, skip it continue } @@ -245,7 +248,7 @@ func (k Keeper) SlashRedelegation(ctx sdk.Context, srcValidator types.Validator, continue } - if entry.IsMature(now) { + if entry.IsMature(now) && !entry.OnHold() { // Redelegation no longer eligible for slashing, skip it continue } diff --git a/x/staking/keeper/slash_test.go b/x/staking/keeper/slash_test.go index b1f6d8c873c3..e1a70df69957 100644 --- a/x/staking/keeper/slash_test.go +++ b/x/staking/keeper/slash_test.go @@ -46,5 +46,5 @@ func (s *KeeperTestSuite) TestSlashAtFutureHeight() { require.NoError(err) fraction := sdk.NewDecWithPrec(5, 1) - require.Panics(func() { keeper.Slash(ctx, consAddr, 1, 10, fraction) }) + require.Panics(func() { keeper.Slash(ctx, consAddr, 1, 10, fraction, 0) }) } diff --git a/x/staking/keeper/unbonding.go b/x/staking/keeper/unbonding.go new file mode 100644 index 000000000000..275b4fda70b8 --- /dev/null +++ b/x/staking/keeper/unbonding.go @@ -0,0 +1,428 @@ +package keeper + +import ( + "encoding/binary" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +// Increments and returns a unique ID for an unbonding operation +func (k Keeper) IncrementUnbondingID(ctx sdk.Context) (unbondingID uint64) { + store := ctx.KVStore(k.storeKey) + bz := store.Get(types.UnbondingIDKey) + if bz != nil { + unbondingID = binary.BigEndian.Uint64(bz) + } + + unbondingID++ + + // Convert back into bytes for storage + bz = make([]byte, 8) + binary.BigEndian.PutUint64(bz, unbondingID) + + store.Set(types.UnbondingIDKey, bz) + + return unbondingID +} + +// Remove a mapping from UnbondingId to unbonding operation +func (k Keeper) DeleteUnbondingIndex(ctx sdk.Context, id uint64) { + store := ctx.KVStore(k.storeKey) + store.Delete(types.GetUnbondingIndexKey(id)) +} + +func (k Keeper) GetUnbondingType(ctx sdk.Context, id uint64) (unbondingType types.UnbondingType, found bool) { + store := ctx.KVStore(k.storeKey) + + bz := store.Get(types.GetUnbondingTypeKey(id)) + if bz == nil { + return unbondingType, false + } + + return types.UnbondingType(binary.BigEndian.Uint64(bz)), true +} + +func (k Keeper) SetUnbondingType(ctx sdk.Context, id uint64, unbondingType types.UnbondingType) { + store := ctx.KVStore(k.storeKey) + + // Convert into bytes for storage + bz := make([]byte, 8) + binary.BigEndian.PutUint64(bz, uint64(unbondingType)) + + store.Set(types.GetUnbondingTypeKey(id), bz) +} + +// GetUnbondingDelegationByUnbondingID returns a unbonding delegation that has an unbonding delegation entry with a certain ID +func (k Keeper) GetUnbondingDelegationByUnbondingID(ctx sdk.Context, id uint64) (ubd types.UnbondingDelegation, found bool) { + store := ctx.KVStore(k.storeKey) + + ubdKey := store.Get(types.GetUnbondingIndexKey(id)) + if ubdKey == nil { + return types.UnbondingDelegation{}, false + } + + value := store.Get(ubdKey) + if value == nil { + return types.UnbondingDelegation{}, false + } + + ubd, err := types.UnmarshalUBD(k.cdc, value) + // An error here means that what we got wasn't the right type + if err != nil { + return types.UnbondingDelegation{}, false + } + + return ubd, true +} + +// GetRedelegationByUnbondingID returns a unbonding delegation that has an unbonding delegation entry with a certain ID +func (k Keeper) GetRedelegationByUnbondingID(ctx sdk.Context, id uint64) (red types.Redelegation, found bool) { + store := ctx.KVStore(k.storeKey) + + redKey := store.Get(types.GetUnbondingIndexKey(id)) + if redKey == nil { + return types.Redelegation{}, false + } + + value := store.Get(redKey) + if value == nil { + return types.Redelegation{}, false + } + + red, err := types.UnmarshalRED(k.cdc, value) + // An error here means that what we got wasn't the right type + if err != nil { + return types.Redelegation{}, false + } + + return red, true +} + +// GetValidatorByUnbondingID returns the validator that is unbonding with a certain unbonding op ID +func (k Keeper) GetValidatorByUnbondingID(ctx sdk.Context, id uint64) (val types.Validator, found bool) { + store := ctx.KVStore(k.storeKey) + + valKey := store.Get(types.GetUnbondingIndexKey(id)) + if valKey == nil { + return types.Validator{}, false + } + + value := store.Get(valKey) + if value == nil { + return types.Validator{}, false + } + + val, err := types.UnmarshalValidator(k.cdc, value) + // An error here means that what we got wasn't the right type + if err != nil { + return types.Validator{}, false + } + + return val, true +} + +// SetUnbondingDelegationByUnbondingID sets an index to look up an UnbondingDelegation by the unbondingID of an UnbondingDelegationEntry that it contains +// Note, it does not set the unbonding delegation itself, use SetUnbondingDelegation(ctx, ubd) for that +func (k Keeper) SetUnbondingDelegationByUnbondingID(ctx sdk.Context, ubd types.UnbondingDelegation, id uint64) { + store := ctx.KVStore(k.storeKey) + delAddr := sdk.MustAccAddressFromBech32(ubd.DelegatorAddress) + valAddr, err := sdk.ValAddressFromBech32(ubd.ValidatorAddress) + if err != nil { + panic(err) + } + + ubdKey := types.GetUBDKey(delAddr, valAddr) + store.Set(types.GetUnbondingIndexKey(id), ubdKey) + + // Set unbonding type so that we know how to deserialize it later + k.SetUnbondingType(ctx, id, types.UnbondingType_UnbondingDelegation) +} + +// SetRedelegationByUnbondingID sets an index to look up an Redelegation by the unbondingID of an RedelegationEntry that it contains +// Note, it does not set the redelegation itself, use SetRedelegation(ctx, red) for that +func (k Keeper) SetRedelegationByUnbondingID(ctx sdk.Context, red types.Redelegation, id uint64) { + store := ctx.KVStore(k.storeKey) + + delAddr := sdk.MustAccAddressFromBech32(red.DelegatorAddress) + + valSrcAddr, err := sdk.ValAddressFromBech32(red.ValidatorSrcAddress) + if err != nil { + panic(err) + } + + valDstAddr, err := sdk.ValAddressFromBech32(red.ValidatorDstAddress) + if err != nil { + panic(err) + } + + redKey := types.GetREDKey(delAddr, valSrcAddr, valDstAddr) + store.Set(types.GetUnbondingIndexKey(id), redKey) + + // Set unbonding type so that we know how to deserialize it later + k.SetUnbondingType(ctx, id, types.UnbondingType_Redelegation) +} + +// SetValidatorByUnbondingID sets an index to look up a Validator by the unbondingID corresponding to its current unbonding +// Note, it does not set the validator itself, use SetValidator(ctx, val) for that +func (k Keeper) SetValidatorByUnbondingID(ctx sdk.Context, val types.Validator, id uint64) { + store := ctx.KVStore(k.storeKey) + + valAddr, err := sdk.ValAddressFromBech32(val.OperatorAddress) + if err != nil { + panic(err) + } + + valKey := types.GetValidatorKey(valAddr) + store.Set(types.GetUnbondingIndexKey(id), valKey) + + // Set unbonding type so that we know how to deserialize it later + k.SetUnbondingType(ctx, id, types.UnbondingType_ValidatorUnbonding) +} + +// unbondingDelegationEntryArrayIndex and redelegationEntryArrayIndex are utilities to find +// at which position in the Entries array the entry with a given id is +func unbondingDelegationEntryArrayIndex(ubd types.UnbondingDelegation, id uint64) (index int, found bool) { + for i, entry := range ubd.Entries { + // we find the entry with the right ID + if entry.UnbondingId == id { + return i, true + } + } + + return 0, false +} + +func redelegationEntryArrayIndex(red types.Redelegation, id uint64) (index int, found bool) { + for i, entry := range red.Entries { + // we find the entry with the right ID + if entry.UnbondingId == id { + return i, true + } + } + + return 0, false +} + +// UnbondingCanComplete allows a stopped unbonding operation, such as an +// unbonding delegation, a redelegation, or a validator unbonding to complete. +// In order for the unbonding operation with `id` to eventually complete, every call +// to PutUnbondingOnHold(id) must be matched by a call to UnbondingCanComplete(id). +func (k Keeper) UnbondingCanComplete(ctx sdk.Context, id uint64) error { + unbondingType, found := k.GetUnbondingType(ctx, id) + if !found { + return types.ErrUnbondingNotFound + } + + switch unbondingType { + case types.UnbondingType_UnbondingDelegation: + if err := k.unbondingDelegationEntryCanComplete(ctx, id); err != nil { + return err + } + case types.UnbondingType_Redelegation: + if err := k.redelegationEntryCanComplete(ctx, id); err != nil { + return err + } + case types.UnbondingType_ValidatorUnbonding: + if err := k.validatorUnbondingCanComplete(ctx, id); err != nil { + return err + } + default: + return types.ErrUnbondingNotFound + } + + return nil +} + +func (k Keeper) unbondingDelegationEntryCanComplete(ctx sdk.Context, id uint64) error { + ubd, found := k.GetUnbondingDelegationByUnbondingID(ctx, id) + if !found { + return types.ErrUnbondingNotFound + } + + i, found := unbondingDelegationEntryArrayIndex(ubd, id) + if !found { + return types.ErrUnbondingNotFound + } + + // The entry must be on hold + if !ubd.Entries[i].OnHold() { + return sdkerrors.Wrapf( + types.ErrUnbondingOnHoldRefCountNegative, + "undelegation unbondingID(%d), expecting UnbondingOnHoldRefCount > 0, got %T", + id, ubd.Entries[i].UnbondingOnHoldRefCount, + ) + } + ubd.Entries[i].UnbondingOnHoldRefCount-- + + // Check if entry is matured. + if !ubd.Entries[i].OnHold() && ubd.Entries[i].IsMature(ctx.BlockHeader().Time) { + // If matured, complete it. + delegatorAddress, err := sdk.AccAddressFromBech32(ubd.DelegatorAddress) + if err != nil { + return err + } + + bondDenom := k.GetParams(ctx).BondDenom + + // track undelegation only when remaining or truncated shares are non-zero + if !ubd.Entries[i].Balance.IsZero() { + amt := sdk.NewCoin(bondDenom, ubd.Entries[i].Balance) + if err := k.bankKeeper.UndelegateCoinsFromModuleToAccount( + ctx, types.NotBondedPoolName, delegatorAddress, sdk.NewCoins(amt), + ); err != nil { + return err + } + } + + // Remove entry + ubd.RemoveEntry(int64(i)) + // Remove from the UnbondingIndex + k.DeleteUnbondingIndex(ctx, id) + } + + // set the unbonding delegation or remove it if there are no more entries + if len(ubd.Entries) == 0 { + k.RemoveUnbondingDelegation(ctx, ubd) + } else { + k.SetUnbondingDelegation(ctx, ubd) + } + + // Successfully completed unbonding + return nil +} + +func (k Keeper) redelegationEntryCanComplete(ctx sdk.Context, id uint64) error { + red, found := k.GetRedelegationByUnbondingID(ctx, id) + if !found { + return types.ErrUnbondingNotFound + } + + i, found := redelegationEntryArrayIndex(red, id) + if !found { + return types.ErrUnbondingNotFound + } + + // The entry must be on hold + if !red.Entries[i].OnHold() { + return sdkerrors.Wrapf( + types.ErrUnbondingOnHoldRefCountNegative, + "redelegation unbondingID(%d), expecting UnbondingOnHoldRefCount > 0, got %T", + id, red.Entries[i].UnbondingOnHoldRefCount, + ) + } + red.Entries[i].UnbondingOnHoldRefCount-- + + if !red.Entries[i].OnHold() && red.Entries[i].IsMature(ctx.BlockHeader().Time) { + // If matured, complete it. + // Remove entry + red.RemoveEntry(int64(i)) + // Remove from the Unbonding index + k.DeleteUnbondingIndex(ctx, id) + } + + // set the redelegation or remove it if there are no more entries + if len(red.Entries) == 0 { + k.RemoveRedelegation(ctx, red) + } else { + k.SetRedelegation(ctx, red) + } + + // Successfully completed unbonding + return nil +} + +func (k Keeper) validatorUnbondingCanComplete(ctx sdk.Context, id uint64) error { + val, found := k.GetValidatorByUnbondingID(ctx, id) + if !found { + return types.ErrUnbondingNotFound + } + + if val.UnbondingOnHoldRefCount <= 0 { + return sdkerrors.Wrapf( + types.ErrUnbondingOnHoldRefCountNegative, + "val(%s), expecting UnbondingOnHoldRefCount > 0, got %T", + val.OperatorAddress, val.UnbondingOnHoldRefCount, + ) + } + val.UnbondingOnHoldRefCount-- + k.SetValidator(ctx, val) + + return nil +} + +// PutUnbondingOnHold allows an external module to stop an unbonding operation, +// such as an unbonding delegation, a redelegation, or a validator unbonding. +// In order for the unbonding operation with `id` to eventually complete, every call +// to PutUnbondingOnHold(id) must be matched by a call to UnbondingCanComplete(id). +func (k Keeper) PutUnbondingOnHold(ctx sdk.Context, id uint64) error { + unbondingType, found := k.GetUnbondingType(ctx, id) + if !found { + return types.ErrUnbondingNotFound + } + switch unbondingType { + case types.UnbondingType_UnbondingDelegation: + if err := k.putUnbondingDelegationEntryOnHold(ctx, id); err != nil { + return err + } + case types.UnbondingType_Redelegation: + if err := k.putRedelegationEntryOnHold(ctx, id); err != nil { + return err + } + case types.UnbondingType_ValidatorUnbonding: + if err := k.putValidatorOnHold(ctx, id); err != nil { + return err + } + default: + return types.ErrUnbondingNotFound + } + + return nil +} + +func (k Keeper) putUnbondingDelegationEntryOnHold(ctx sdk.Context, id uint64) error { + ubd, found := k.GetUnbondingDelegationByUnbondingID(ctx, id) + if !found { + return types.ErrUnbondingNotFound + } + + i, found := unbondingDelegationEntryArrayIndex(ubd, id) + if !found { + return types.ErrUnbondingNotFound + } + + ubd.Entries[i].UnbondingOnHoldRefCount++ + k.SetUnbondingDelegation(ctx, ubd) + + return nil +} + +func (k Keeper) putRedelegationEntryOnHold(ctx sdk.Context, id uint64) error { + red, found := k.GetRedelegationByUnbondingID(ctx, id) + if !found { + return types.ErrUnbondingNotFound + } + + i, found := redelegationEntryArrayIndex(red, id) + if !found { + return types.ErrUnbondingNotFound + } + + red.Entries[i].UnbondingOnHoldRefCount++ + k.SetRedelegation(ctx, red) + + return nil +} + +func (k Keeper) putValidatorOnHold(ctx sdk.Context, id uint64) error { + val, found := k.GetValidatorByUnbondingID(ctx, id) + if !found { + return types.ErrUnbondingNotFound + } + + val.UnbondingOnHoldRefCount++ + k.SetValidator(ctx, val) + + return nil +} diff --git a/x/staking/keeper/unbonding_test.go b/x/staking/keeper/unbonding_test.go new file mode 100644 index 000000000000..0f2b396a3ab3 --- /dev/null +++ b/x/staking/keeper/unbonding_test.go @@ -0,0 +1,332 @@ +package keeper_test + +import ( + "time" + + "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/staking/testutil" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +func (s *KeeperTestSuite) TestIncrementUnbondingID() { + for i := 1; i < 10; i++ { + s.Require().Equal(uint64(i), s.stakingKeeper.IncrementUnbondingID(s.ctx)) + } +} + +func (s *KeeperTestSuite) TestUnbondingTypeAccessors() { + cases := []struct { + exists bool + name string + expected types.UnbondingType + }{ + { + name: "existing 1", + exists: true, + expected: types.UnbondingType_UnbondingDelegation, + }, + { + name: "existing 2", + exists: true, + expected: types.UnbondingType_Redelegation, + }, + { + name: "not existing", + exists: false, + }, + } + + for i, tc := range cases { + s.Run(tc.name, func() { + if tc.exists { + s.stakingKeeper.SetUnbondingType(s.ctx, uint64(i), tc.expected) + } + + unbondingType, found := s.stakingKeeper.GetUnbondingType(s.ctx, uint64(i)) + if tc.exists { + s.Require().True(found) + s.Require().Equal(tc.expected, unbondingType) + } else { + s.Require().False(found) + } + }) + } +} + +func (s *KeeperTestSuite) TestUnbondingDelegationByUnbondingIDAccessors() { + delAddrs, valAddrs := createValAddrs(2) + + type exists struct { + setUnbondingDelegation bool + setUnbondingDelegationByUnbondingID bool + } + + cases := []struct { + exists exists + name string + expected types.UnbondingDelegation + }{ + { + name: "existing 1", + exists: exists{true, true}, + expected: types.NewUnbondingDelegation( + delAddrs[0], + valAddrs[0], + 0, + time.Unix(0, 0).UTC(), + sdk.NewInt(5), + 0, + ), + }, + { + name: "not existing 1", + exists: exists{false, true}, + expected: types.NewUnbondingDelegation( + delAddrs[1], + valAddrs[1], + 0, + time.Unix(0, 0).UTC(), + sdk.NewInt(5), + 0, + ), + }, + { + name: "not existing 2", + exists: exists{false, false}, + expected: types.NewUnbondingDelegation( + delAddrs[0], + valAddrs[0], + 0, + time.Unix(0, 0).UTC(), + sdk.NewInt(5), + 0, + ), + }, + } + + for i, tc := range cases { + s.Run(tc.name, func() { + if tc.exists.setUnbondingDelegation { + s.stakingKeeper.SetUnbondingDelegation(s.ctx, tc.expected) + } + + if tc.exists.setUnbondingDelegationByUnbondingID { + s.stakingKeeper.SetUnbondingDelegationByUnbondingID(s.ctx, tc.expected, uint64(i)) + } + + ubd, found := s.stakingKeeper.GetUnbondingDelegationByUnbondingID(s.ctx, uint64(i)) + if tc.exists.setUnbondingDelegation && tc.exists.setUnbondingDelegationByUnbondingID { + s.Require().True(found) + s.Require().Equal(tc.expected, ubd) + } else { + s.Require().False(found) + } + }) + } +} + +func (s *KeeperTestSuite) TestRedelegationByUnbondingIDAccessors() { + delAddrs, valAddrs := createValAddrs(2) + + type exists struct { + setRedelegation bool + setRedelegationByUnbondingID bool + } + + cases := []struct { + exists exists + name string + expected types.Redelegation + }{ + { + name: "existing 1", + exists: exists{true, true}, + expected: types.NewRedelegation( + delAddrs[0], + valAddrs[0], + valAddrs[1], + 0, + time.Unix(5, 0).UTC(), + sdk.NewInt(10), + math.LegacyNewDec(10), + 0, + ), + }, + { + name: "not existing 1", + exists: exists{false, true}, + expected: types.NewRedelegation( + delAddrs[1], + valAddrs[0], + valAddrs[1], + 0, + time.Unix(5, 0).UTC(), + sdk.NewInt(10), + math.LegacyNewDec(10), + 0, + ), + }, + { + name: "not existing 2", + exists: exists{false, false}, + expected: types.NewRedelegation( + delAddrs[1], + valAddrs[1], + valAddrs[0], + 0, + time.Unix(5, 0).UTC(), + sdk.NewInt(10), + math.LegacyNewDec(10), + 0, + ), + }, + } + + for i, tc := range cases { + s.Run(tc.name, func() { + if tc.exists.setRedelegation { + s.stakingKeeper.SetRedelegation(s.ctx, tc.expected) + } + + if tc.exists.setRedelegationByUnbondingID { + s.stakingKeeper.SetRedelegationByUnbondingID(s.ctx, tc.expected, uint64(i)) + } + + red, found := s.stakingKeeper.GetRedelegationByUnbondingID(s.ctx, uint64(i)) + if tc.exists.setRedelegation && tc.exists.setRedelegationByUnbondingID { + s.Require().True(found) + s.Require().Equal(tc.expected, red) + } else { + s.Require().False(found) + } + }) + } +} + +func (s *KeeperTestSuite) TestValidatorByUnbondingIDAccessors() { + _, valAddrs := createValAddrs(3) + + type exists struct { + setValidator bool + setValidatorByUnbondingID bool + } + + cases := []struct { + exists exists + name string + validator types.Validator + }{ + { + name: "existing 1", + exists: exists{true, true}, + validator: testutil.NewValidator(s.T(), valAddrs[0], PKs[0]), + }, + { + name: "not existing 1", + exists: exists{false, true}, + validator: testutil.NewValidator(s.T(), valAddrs[1], PKs[1]), + }, + { + name: "not existing 2", + exists: exists{false, false}, + validator: testutil.NewValidator(s.T(), valAddrs[2], PKs[0]), + }, + } + + for i, tc := range cases { + s.Run(tc.name, func() { + if tc.exists.setValidator { + s.stakingKeeper.SetValidator(s.ctx, tc.validator) + } + + if tc.exists.setValidatorByUnbondingID { + s.stakingKeeper.SetValidatorByUnbondingID(s.ctx, tc.validator, uint64(i)) + } + + val, found := s.stakingKeeper.GetValidatorByUnbondingID(s.ctx, uint64(i)) + if tc.exists.setValidator && tc.exists.setValidatorByUnbondingID { + s.Require().True(found) + s.Require().Equal(tc.validator, val) + } else { + s.Require().False(found) + } + }) + } +} + +func (s *KeeperTestSuite) TestUnbondingCanComplete() { + delAddrs, valAddrs := createValAddrs(3) + unbondingID := uint64(1) + + // no unbondingID set + err := s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().ErrorIs(err, types.ErrUnbondingNotFound) + + // unbonding delegation + s.stakingKeeper.SetUnbondingType(s.ctx, unbondingID, types.UnbondingType_UnbondingDelegation) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().ErrorIs(err, types.ErrUnbondingNotFound) + + ubd := types.NewUnbondingDelegation( + delAddrs[0], + valAddrs[0], + 0, + time.Unix(0, 0).UTC(), + sdk.NewInt(5), + unbondingID, + ) + s.stakingKeeper.SetUnbondingDelegation(s.ctx, ubd) + s.stakingKeeper.SetUnbondingDelegationByUnbondingID(s.ctx, ubd, unbondingID) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().ErrorIs(err, types.ErrUnbondingOnHoldRefCountNegative) + + err = s.stakingKeeper.PutUnbondingOnHold(s.ctx, unbondingID) + s.Require().NoError(err) + s.bankKeeper.EXPECT().UndelegateCoinsFromModuleToAccount(s.ctx, types.NotBondedPoolName, delAddrs[0], sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(5)))).Return(nil) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().NoError(err) + + // redelegation + unbondingID++ + s.stakingKeeper.SetUnbondingType(s.ctx, unbondingID, types.UnbondingType_Redelegation) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().ErrorIs(err, types.ErrUnbondingNotFound) + + red := types.NewRedelegation( + delAddrs[0], + valAddrs[0], + valAddrs[1], + 0, + time.Unix(5, 0).UTC(), + sdk.NewInt(10), + math.LegacyNewDec(10), + unbondingID, + ) + s.stakingKeeper.SetRedelegation(s.ctx, red) + s.stakingKeeper.SetRedelegationByUnbondingID(s.ctx, red, unbondingID) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().ErrorIs(err, types.ErrUnbondingOnHoldRefCountNegative) + + err = s.stakingKeeper.PutUnbondingOnHold(s.ctx, unbondingID) + s.Require().NoError(err) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().NoError(err) + + // validator unbonding + unbondingID++ + s.stakingKeeper.SetUnbondingType(s.ctx, unbondingID, types.UnbondingType_ValidatorUnbonding) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().ErrorIs(err, types.ErrUnbondingNotFound) + + val := testutil.NewValidator(s.T(), valAddrs[0], PKs[0]) + s.stakingKeeper.SetValidator(s.ctx, val) + s.stakingKeeper.SetValidatorByUnbondingID(s.ctx, val, unbondingID) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().ErrorIs(err, types.ErrUnbondingOnHoldRefCountNegative) + + err = s.stakingKeeper.PutUnbondingOnHold(s.ctx, unbondingID) + s.Require().NoError(err) + err = s.stakingKeeper.UnbondingCanComplete(s.ctx, unbondingID) + s.Require().NoError(err) +} diff --git a/x/staking/keeper/val_state_change.go b/x/staking/keeper/val_state_change.go index 5d63c458dca5..b45eb4ba8cbd 100644 --- a/x/staking/keeper/val_state_change.go +++ b/x/staking/keeper/val_state_change.go @@ -219,6 +219,9 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab k.SetLastTotalPower(ctx, totalPower) } + // set the list of validator updates + k.SetValidatorUpdates(ctx, updates) + return updates, err } @@ -229,7 +232,7 @@ func (k Keeper) bondedToUnbonding(ctx sdk.Context, validator types.Validator) (t panic(fmt.Sprintf("bad state transition bondedToUnbonding, validator: %v\n", validator)) } - return k.beginUnbondingValidator(ctx, validator) + return k.BeginUnbondingValidator(ctx, validator) } func (k Keeper) unbondingToBonded(ctx sdk.Context, validator types.Validator) (types.Validator, error) { @@ -307,7 +310,7 @@ func (k Keeper) bondValidator(ctx sdk.Context, validator types.Validator) (types } // perform all the store operations for when a validator begins unbonding -func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validator) (types.Validator, error) { +func (k Keeper) BeginUnbondingValidator(ctx sdk.Context, validator types.Validator) (types.Validator, error) { params := k.GetParams(ctx) // delete the validator by power index, as the key will change @@ -318,12 +321,16 @@ func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validat panic(fmt.Sprintf("should not already be unbonded or unbonding, validator: %v\n", validator)) } + id := k.IncrementUnbondingID(ctx) + validator = validator.UpdateStatus(types.Unbonding) // set the unbonding completion time and completion height appropriately validator.UnbondingTime = ctx.BlockHeader().Time.Add(params.UnbondingTime) validator.UnbondingHeight = ctx.BlockHeader().Height + validator.UnbondingIds = append(validator.UnbondingIds, id) + // save the now unbonded validator record and power index k.SetValidator(ctx, validator) k.SetValidatorByPowerIndex(ctx, validator) @@ -341,6 +348,12 @@ func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validat return validator, err } + k.SetValidatorByUnbondingID(ctx, validator, id) + + if err := k.Hooks().AfterUnbondingInitiated(ctx, id); err != nil { + return validator, err + } + return validator, nil } diff --git a/x/staking/keeper/validator.go b/x/staking/keeper/validator.go index 2589de1af881..d1315ed7793f 100644 --- a/x/staking/keeper/validator.go +++ b/x/staking/keeper/validator.go @@ -182,7 +182,6 @@ func (k Keeper) RemoveValidator(ctx sdk.Context, address sdk.ValAddress) { store.Delete(types.GetValidatorByConsAddrKey(valConsAddr)) store.Delete(types.GetValidatorsByPowerIndexKey(validator, k.PowerReduction(ctx))) - // call hooks if err := k.Hooks().AfterValidatorRemoved(ctx, valConsAddr, validator.GetOperator()); err != nil { k.Logger(ctx).Error("error in after validator removed hook", "error", err) } @@ -417,8 +416,6 @@ func (k Keeper) ValidatorQueueIterator(ctx sdk.Context, endTime time.Time, endHe // UnbondAllMatureValidators unbonds all the mature unbonding validators that // have finished their unbonding period. func (k Keeper) UnbondAllMatureValidators(ctx sdk.Context) { - store := ctx.KVStore(k.storeKey) - blockTime := ctx.BlockTime() blockHeight := ctx.BlockHeight() @@ -458,13 +455,33 @@ func (k Keeper) UnbondAllMatureValidators(ctx sdk.Context) { panic("unexpected validator in unbonding queue; status was not unbonding") } - val = k.UnbondingToUnbonded(ctx, val) - if val.GetDelegatorShares().IsZero() { - k.RemoveValidator(ctx, val.GetOperator()) + if val.UnbondingOnHoldRefCount == 0 { + for _, id := range val.UnbondingIds { + k.DeleteUnbondingIndex(ctx, id) + } + + val = k.UnbondingToUnbonded(ctx, val) + + if val.GetDelegatorShares().IsZero() { + k.RemoveValidator(ctx, val.GetOperator()) + } else { + // remove unbonding ids + val.UnbondingIds = []uint64{} + } + + // remove validator from queue + k.DeleteValidatorQueue(ctx, val) } } - - store.Delete(key) } } } + +func (k Keeper) IsValidatorJailed(ctx sdk.Context, addr sdk.ConsAddress) bool { + v, ok := k.GetValidatorByConsAddr(ctx, addr) + if !ok { + return false + } + + return v.Jailed +} diff --git a/x/staking/simulation/decoder_test.go b/x/staking/simulation/decoder_test.go index 06033a4cdb86..67fbd65760c5 100644 --- a/x/staking/simulation/decoder_test.go +++ b/x/staking/simulation/decoder_test.go @@ -40,8 +40,8 @@ func TestDecodeStore(t *testing.T) { val, err := types.NewValidator(valAddr1, delPk1, types.NewDescription("test", "test", "test", "test", "test")) require.NoError(t, err) del := types.NewDelegation(delAddr1, valAddr1, math.LegacyOneDec()) - ubd := types.NewUnbondingDelegation(delAddr1, valAddr1, 15, bondTime, math.OneInt()) - red := types.NewRedelegation(delAddr1, valAddr1, valAddr1, 12, bondTime, math.OneInt(), math.LegacyOneDec()) + ubd := types.NewUnbondingDelegation(delAddr1, valAddr1, 15, bondTime, math.OneInt(), 1) + red := types.NewRedelegation(delAddr1, valAddr1, valAddr1, 12, bondTime, math.OneInt(), math.LegacyOneDec(), 0) kvPairs := kv.Pairs{ Pairs: []kv.Pair{ diff --git a/x/staking/simulation/operations_test.go b/x/staking/simulation/operations_test.go index 301ece47d7b0..74394f834a0d 100644 --- a/x/staking/simulation/operations_test.go +++ b/x/staking/simulation/operations_test.go @@ -195,7 +195,7 @@ func (s *SimTestSuite) TestSimulateMsgCancelUnbondingDelegation() { s.setupValidatorRewards(ctx, validator0.GetOperator()) // unbonding delegation - udb := types.NewUnbondingDelegation(delegator.Address, validator0.GetOperator(), s.app.LastBlockHeight(), blockTime.Add(2*time.Minute), delTokens) + udb := types.NewUnbondingDelegation(delegator.Address, validator0.GetOperator(), s.app.LastBlockHeight(), blockTime.Add(2*time.Minute), delTokens, 0) s.stakingKeeper.SetUnbondingDelegation(ctx, udb) s.setupValidatorRewards(ctx, validator0.GetOperator()) diff --git a/x/staking/testutil/expected_keepers_mocks.go b/x/staking/testutil/expected_keepers_mocks.go index e84885bb5209..18f3e82fce2b 100644 --- a/x/staking/testutil/expected_keepers_mocks.go +++ b/x/staking/testutil/expected_keepers_mocks.go @@ -403,17 +403,17 @@ func (mr *MockValidatorSetMockRecorder) MaxValidators(arg0 interface{}) *gomock. } // Slash mocks base method. -func (m *MockValidatorSet) Slash(arg0 types.Context, arg1 types.ConsAddress, arg2, arg3 int64, arg4 types.Dec) math.Int { +func (m *MockValidatorSet) Slash(arg0 types.Context, arg1 types.ConsAddress, arg2, arg3 int64, arg4 types.Dec, arg5 types1.Infraction) math.Int { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Slash", arg0, arg1, arg2, arg3, arg4) + ret := m.ctrl.Call(m, "Slash", arg0, arg1, arg2, arg3, arg4, arg5) ret0, _ := ret[0].(math.Int) return ret0 } // Slash indicates an expected call of Slash. -func (mr *MockValidatorSetMockRecorder) Slash(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { +func (mr *MockValidatorSetMockRecorder) Slash(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Slash", reflect.TypeOf((*MockValidatorSet)(nil).Slash), arg0, arg1, arg2, arg3, arg4) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Slash", reflect.TypeOf((*MockValidatorSet)(nil).Slash), arg0, arg1, arg2, arg3, arg4, arg5) } // StakingTokenSupply mocks base method. @@ -570,6 +570,20 @@ func (mr *MockStakingHooksMockRecorder) AfterDelegationModified(ctx, delAddr, va return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AfterDelegationModified", reflect.TypeOf((*MockStakingHooks)(nil).AfterDelegationModified), ctx, delAddr, valAddr) } +// AfterUnbondingInitiated mocks base method. +func (m *MockStakingHooks) AfterUnbondingInitiated(ctx types.Context, id uint64) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AfterUnbondingInitiated", ctx, id) + ret0, _ := ret[0].(error) + return ret0 +} + +// AfterUnbondingInitiated indicates an expected call of AfterUnbondingInitiated. +func (mr *MockStakingHooksMockRecorder) AfterUnbondingInitiated(ctx, id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AfterUnbondingInitiated", reflect.TypeOf((*MockStakingHooks)(nil).AfterUnbondingInitiated), ctx, id) +} + // AfterValidatorBeginUnbonding mocks base method. func (m *MockStakingHooks) AfterValidatorBeginUnbonding(ctx types.Context, consAddr types.ConsAddress, valAddr types.ValAddress) error { m.ctrl.T.Helper() diff --git a/x/staking/types/delegation.go b/x/staking/types/delegation.go index 51df1eb78b68..d763ce2c7cd4 100644 --- a/x/staking/types/delegation.go +++ b/x/staking/types/delegation.go @@ -92,12 +92,14 @@ func (d Delegations) String() (out string) { return strings.TrimSpace(out) } -func NewUnbondingDelegationEntry(creationHeight int64, completionTime time.Time, balance math.Int) UnbondingDelegationEntry { +func NewUnbondingDelegationEntry(creationHeight int64, completionTime time.Time, balance math.Int, unbondingID uint64) UnbondingDelegationEntry { return UnbondingDelegationEntry{ - CreationHeight: creationHeight, - CompletionTime: completionTime, - InitialBalance: balance, - Balance: balance, + CreationHeight: creationHeight, + CompletionTime: completionTime, + InitialBalance: balance, + Balance: balance, + UnbondingId: unbondingID, + UnbondingOnHoldRefCount: 0, } } @@ -112,24 +114,50 @@ func (e UnbondingDelegationEntry) IsMature(currentTime time.Time) bool { return !e.CompletionTime.After(currentTime) } +// OnHold - is the current entry on hold due to external modules +func (e UnbondingDelegationEntry) OnHold() bool { + return e.UnbondingOnHoldRefCount > 0 +} + +// return the unbonding delegation entry +func MustMarshalUBDE(cdc codec.BinaryCodec, ubd UnbondingDelegationEntry) []byte { + return cdc.MustMarshal(&ubd) +} + +// unmarshal a unbonding delegation entry from a store value +func MustUnmarshalUBDE(cdc codec.BinaryCodec, value []byte) UnbondingDelegationEntry { + ubd, err := UnmarshalUBDE(cdc, value) + if err != nil { + panic(err) + } + + return ubd +} + +// unmarshal a unbonding delegation entry from a store value +func UnmarshalUBDE(cdc codec.BinaryCodec, value []byte) (ubd UnbondingDelegationEntry, err error) { + err = cdc.Unmarshal(value, &ubd) + return ubd, err +} + // NewUnbondingDelegation - create a new unbonding delegation object // //nolint:interfacer func NewUnbondingDelegation( delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, - creationHeight int64, minTime time.Time, balance math.Int, + creationHeight int64, minTime time.Time, balance math.Int, id uint64, ) UnbondingDelegation { return UnbondingDelegation{ DelegatorAddress: delegatorAddr.String(), ValidatorAddress: validatorAddr.String(), Entries: []UnbondingDelegationEntry{ - NewUnbondingDelegationEntry(creationHeight, minTime, balance), + NewUnbondingDelegationEntry(creationHeight, minTime, balance, id), }, } } // AddEntry - append entry to the unbonding delegation -func (ubd *UnbondingDelegation) AddEntry(creationHeight int64, minTime time.Time, balance math.Int) { +func (ubd *UnbondingDelegation) AddEntry(creationHeight int64, minTime time.Time, balance math.Int, unbondingID uint64) { // Check the entries exists with creation_height and complete_time entryIndex := -1 for index, ubdEntry := range ubd.Entries { @@ -148,7 +176,7 @@ func (ubd *UnbondingDelegation) AddEntry(creationHeight int64, minTime time.Time ubd.Entries[entryIndex] = ubdEntry } else { // append the new unbond delegation entry - entry := NewUnbondingDelegationEntry(creationHeight, minTime, balance) + entry := NewUnbondingDelegationEntry(creationHeight, minTime, balance, unbondingID) ubd.Entries = append(ubd.Entries, entry) } } @@ -207,12 +235,14 @@ func (ubds UnbondingDelegations) String() (out string) { return strings.TrimSpace(out) } -func NewRedelegationEntry(creationHeight int64, completionTime time.Time, balance math.Int, sharesDst sdk.Dec) RedelegationEntry { +func NewRedelegationEntry(creationHeight int64, completionTime time.Time, balance math.Int, sharesDst sdk.Dec, id uint64) RedelegationEntry { return RedelegationEntry{ - CreationHeight: creationHeight, - CompletionTime: completionTime, - InitialBalance: balance, - SharesDst: sharesDst, + CreationHeight: creationHeight, + CompletionTime: completionTime, + InitialBalance: balance, + SharesDst: sharesDst, + UnbondingId: id, + UnbondingOnHoldRefCount: 0, } } @@ -227,24 +257,29 @@ func (e RedelegationEntry) IsMature(currentTime time.Time) bool { return !e.CompletionTime.After(currentTime) } +// OnHold - is the current entry on hold due to external modules +func (e RedelegationEntry) OnHold() bool { + return e.UnbondingOnHoldRefCount > 0 +} + //nolint:interfacer func NewRedelegation( delegatorAddr sdk.AccAddress, validatorSrcAddr, validatorDstAddr sdk.ValAddress, - creationHeight int64, minTime time.Time, balance math.Int, sharesDst sdk.Dec, + creationHeight int64, minTime time.Time, balance math.Int, sharesDst sdk.Dec, id uint64, ) Redelegation { return Redelegation{ DelegatorAddress: delegatorAddr.String(), ValidatorSrcAddress: validatorSrcAddr.String(), ValidatorDstAddress: validatorDstAddr.String(), Entries: []RedelegationEntry{ - NewRedelegationEntry(creationHeight, minTime, balance, sharesDst), + NewRedelegationEntry(creationHeight, minTime, balance, sharesDst, id), }, } } // AddEntry - append entry to the unbonding delegation -func (red *Redelegation) AddEntry(creationHeight int64, minTime time.Time, balance math.Int, sharesDst sdk.Dec) { - entry := NewRedelegationEntry(creationHeight, minTime, balance, sharesDst) +func (red *Redelegation) AddEntry(creationHeight int64, minTime time.Time, balance math.Int, sharesDst sdk.Dec, id uint64) { + entry := NewRedelegationEntry(creationHeight, minTime, balance, sharesDst, id) red.Entries = append(red.Entries, entry) } @@ -371,10 +406,10 @@ func NewRedelegationResponse( // NewRedelegationEntryResponse creates a new RedelegationEntryResponse instance. func NewRedelegationEntryResponse( - creationHeight int64, completionTime time.Time, sharesDst sdk.Dec, initialBalance, balance math.Int, + creationHeight int64, completionTime time.Time, sharesDst sdk.Dec, initialBalance, balance math.Int, unbondingID uint64, ) RedelegationEntryResponse { return RedelegationEntryResponse{ - RedelegationEntry: NewRedelegationEntry(creationHeight, completionTime, initialBalance, sharesDst), + RedelegationEntry: NewRedelegationEntry(creationHeight, completionTime, initialBalance, sharesDst, unbondingID), Balance: balance, } } diff --git a/x/staking/types/delegation_test.go b/x/staking/types/delegation_test.go index 5cd9caca23b8..b259f95f45d9 100644 --- a/x/staking/types/delegation_test.go +++ b/x/staking/types/delegation_test.go @@ -34,7 +34,7 @@ func TestDelegationString(t *testing.T) { func TestUnbondingDelegationEqual(t *testing.T) { ubd1 := types.NewUnbondingDelegation(sdk.AccAddress(valAddr1), valAddr2, 0, - time.Unix(0, 0), sdk.NewInt(0)) + time.Unix(0, 0), sdk.NewInt(0), 1) ubd2 := ubd1 ok := ubd1.String() == ubd2.String() @@ -49,7 +49,7 @@ func TestUnbondingDelegationEqual(t *testing.T) { func TestUnbondingDelegationString(t *testing.T) { ubd := types.NewUnbondingDelegation(sdk.AccAddress(valAddr1), valAddr2, 0, - time.Unix(0, 0), sdk.NewInt(0)) + time.Unix(0, 0), sdk.NewInt(0), 1) require.NotEmpty(t, ubd.String()) } @@ -57,10 +57,10 @@ func TestUnbondingDelegationString(t *testing.T) { func TestRedelegationEqual(t *testing.T) { r1 := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, time.Unix(0, 0), sdk.NewInt(0), - math.LegacyNewDec(0)) + math.LegacyNewDec(0), 1) r2 := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, time.Unix(0, 0), sdk.NewInt(0), - math.LegacyNewDec(0)) + math.LegacyNewDec(0), 2) ok := r1.String() == r2.String() require.True(t, ok) @@ -75,7 +75,7 @@ func TestRedelegationEqual(t *testing.T) { func TestRedelegationString(t *testing.T) { r := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, time.Unix(0, 0), sdk.NewInt(0), - math.LegacyNewDec(10)) + math.LegacyNewDec(10), 1) require.NotEmpty(t, r.String()) } @@ -112,8 +112,8 @@ func TestDelegationResponses(t *testing.T) { func TestRedelegationResponses(t *testing.T) { cdc := codec.NewLegacyAmino() entries := []types.RedelegationEntryResponse{ - types.NewRedelegationEntryResponse(0, time.Unix(0, 0), math.LegacyNewDec(5), sdk.NewInt(5), sdk.NewInt(5)), - types.NewRedelegationEntryResponse(0, time.Unix(0, 0), math.LegacyNewDec(5), sdk.NewInt(5), sdk.NewInt(5)), + types.NewRedelegationEntryResponse(0, time.Unix(0, 0), math.LegacyNewDec(5), sdk.NewInt(5), sdk.NewInt(5), 0), + types.NewRedelegationEntryResponse(0, time.Unix(0, 0), math.LegacyNewDec(5), sdk.NewInt(5), sdk.NewInt(5), 0), } rdr1 := types.NewRedelegationResponse(sdk.AccAddress(valAddr1), valAddr2, valAddr3, entries) rdr2 := types.NewRedelegationResponse(sdk.AccAddress(valAddr2), valAddr1, valAddr3, entries) diff --git a/x/staking/types/errors.go b/x/staking/types/errors.go index a9a6e43e35b6..5cf482984dc5 100644 --- a/x/staking/types/errors.go +++ b/x/staking/types/errors.go @@ -50,4 +50,6 @@ var ( ErrNoHistoricalInfo = sdkerrors.Register(ModuleName, 38, "no historical info found") ErrEmptyValidatorPubKey = sdkerrors.Register(ModuleName, 39, "empty validator public key") ErrCommissionLTMinRate = sdkerrors.Register(ModuleName, 40, "commission cannot be less than min rate") + ErrUnbondingNotFound = sdkerrors.Register(ModuleName, 41, "unbonding operation not found") + ErrUnbondingOnHoldRefCountNegative = sdkerrors.Register(ModuleName, 42, "cannot un-hold unbonding operation that is not on hold") ) diff --git a/x/staking/types/expected_keepers.go b/x/staking/types/expected_keepers.go index 871adcba9202..0a3ef7477ab4 100644 --- a/x/staking/types/expected_keepers.go +++ b/x/staking/types/expected_keepers.go @@ -61,7 +61,7 @@ type ValidatorSet interface { StakingTokenSupply(sdk.Context) math.Int // total staking token supply // slash the validator and delegators of the validator, specifying offence height, offence power, and slash fraction - Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec) math.Int + Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec, Infraction) math.Int Jail(sdk.Context, sdk.ConsAddress) // jail a validator Unjail(sdk.Context, sdk.ConsAddress) // unjail a validator @@ -103,6 +103,7 @@ type StakingHooks interface { BeforeDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error // Must be called when a delegation is removed AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) error BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) error + AfterUnbondingInitiated(ctx sdk.Context, id uint64) error } // StakingHooksWrapper is a wrapper for modules to inject StakingHooks using depinject. diff --git a/x/staking/types/hooks.go b/x/staking/types/hooks.go index 93e0d21cc085..6fad1df77d6b 100644 --- a/x/staking/types/hooks.go +++ b/x/staking/types/hooks.go @@ -103,3 +103,12 @@ func (h MultiStakingHooks) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.V } return nil } + +func (h MultiStakingHooks) AfterUnbondingInitiated(ctx sdk.Context, id uint64) error { + for i := range h { + if err := h[i].AfterUnbondingInitiated(ctx, id); err != nil { + return err + } + } + return nil +} diff --git a/x/staking/types/keys.go b/x/staking/types/keys.go index c56348789a66..7b76bc2d9173 100644 --- a/x/staking/types/keys.go +++ b/x/staking/types/keys.go @@ -42,15 +42,44 @@ var ( RedelegationByValSrcIndexKey = []byte{0x35} // prefix for each key for an redelegation, by source validator operator RedelegationByValDstIndexKey = []byte{0x36} // prefix for each key for an redelegation, by destination validator operator + UnbondingIDKey = []byte{0x37} // key for the counter for the incrementing id for UnbondingOperations + UnbondingIndexKey = []byte{0x38} // prefix for an index for looking up unbonding operations by their IDs + UnbondingTypeKey = []byte{0x39} // prefix for an index containing the type of unbonding operations + UnbondingQueueKey = []byte{0x41} // prefix for the timestamps in unbonding queue RedelegationQueueKey = []byte{0x42} // prefix for the timestamps in redelegations queue ValidatorQueueKey = []byte{0x43} // prefix for the timestamps in validator queue - HistoricalInfoKey = []byte{0x50} // prefix for the historical info + HistoricalInfoKey = []byte{0x50} // prefix for the historical info + ValidatorUpdatesKey = []byte{0x61} // prefix for the end block validator updates key ParamsKey = []byte{0x51} // prefix for parameters for module x/staking ) +// UnbondingType defines the type of unbonding operation +type UnbondingType int + +const ( + UnbondingType_Undefined UnbondingType = iota + UnbondingType_UnbondingDelegation + UnbondingType_Redelegation + UnbondingType_ValidatorUnbonding +) + +// Returns a key for an index containing the type of unbonding operations +func GetUnbondingTypeKey(id uint64) []byte { + bz := make([]byte, 8) + binary.BigEndian.PutUint64(bz, id) + return append(UnbondingTypeKey, bz...) +} + +// Returns a key for the index for looking up UnbondingDelegations by the UnbondingDelegationEntries they contain +func GetUnbondingIndexKey(id uint64) []byte { + bz := make([]byte, 8) + binary.BigEndian.PutUint64(bz, id) + return append(UnbondingIndexKey, bz...) +} + // GetValidatorKey creates the key for the validator with address // VALUE: staking/Validator func GetValidatorKey(operatorAddr sdk.ValAddress) []byte { diff --git a/x/staking/types/params_test.go b/x/staking/types/params_test.go index d76ac7902f9e..6f0b3a79d8c5 100644 --- a/x/staking/types/params_test.go +++ b/x/staking/types/params_test.go @@ -23,7 +23,7 @@ func TestParamsEqual(t *testing.T) { require.False(t, ok) } -func Test_validateParams(t *testing.T) { +func TestValidateParams(t *testing.T) { params := types.DefaultParams() // default params have no error diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index b4d7523c1243..a4b53d53c671 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -16,6 +16,7 @@ import ( proto "github.com/cosmos/gogoproto/proto" github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor "github.com/cosmos/gogoproto/protoc-gen-gogo/descriptor" github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" + types3 "github.com/tendermint/tendermint/abci/types" types "github.com/tendermint/tendermint/proto/tendermint/types" _ "google.golang.org/protobuf/types/known/durationpb" _ "google.golang.org/protobuf/types/known/timestamppb" @@ -76,6 +77,38 @@ func (BondStatus) EnumDescriptor() ([]byte, []int) { return fileDescriptor_64c30c6cf92913c9, []int{0} } +// Infraction indicates the infraction a validator commited. +type Infraction int32 + +const ( + // UNSPECIFIED defines an empty infraction. + Infraction_INFRACTION_UNSPECIFIED Infraction = 0 + // DOUBLE_SIGN defines a validator that double-signs a block. + Infraction_INFRACTION_DOUBLE_SIGN Infraction = 1 + // DOWNTIME defines a validator that missed signing too many blocks. + Infraction_INFRACTION_DOWNTIME Infraction = 2 +) + +var Infraction_name = map[int32]string{ + 0: "INFRACTION_UNSPECIFIED", + 1: "INFRACTION_DOUBLE_SIGN", + 2: "INFRACTION_DOWNTIME", +} + +var Infraction_value = map[string]int32{ + "INFRACTION_UNSPECIFIED": 0, + "INFRACTION_DOUBLE_SIGN": 1, + "INFRACTION_DOWNTIME": 2, +} + +func (x Infraction) String() string { + return proto.EnumName(Infraction_name, int32(x)) +} + +func (Infraction) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{1} +} + // HistoricalInfo contains header and validator information for a given block. // It is stored as part of staking module's state, which persists the `n` most // recent HistoricalInfo @@ -336,6 +369,10 @@ type Validator struct { // // Since: cosmos-sdk 0.46 MinSelfDelegation github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,11,opt,name=min_self_delegation,json=minSelfDelegation,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"min_self_delegation"` + // strictly positive if this validator's unbonding has been stopped by external modules + UnbondingOnHoldRefCount int64 `protobuf:"varint,12,opt,name=unbonding_on_hold_ref_count,json=unbondingOnHoldRefCount,proto3" json:"unbonding_on_hold_ref_count,omitempty"` + // list of unbonding ids, each uniquely identifing an unbonding of this validator + UnbondingIds []uint64 `protobuf:"varint,13,rep,packed,name=unbonding_ids,json=unbondingIds,proto3" json:"unbonding_ids,omitempty"` } func (m *Validator) Reset() { *m = Validator{} } @@ -683,6 +720,10 @@ type UnbondingDelegationEntry struct { InitialBalance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"initial_balance"` // balance defines the tokens to receive at completion. Balance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=balance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"balance"` + // Incrementing id that uniquely identifies this entry + UnbondingId uint64 `protobuf:"varint,5,opt,name=unbonding_id,json=unbondingId,proto3" json:"unbonding_id,omitempty"` + // Strictly positive if this entry's unbonding has been stopped by external modules + UnbondingOnHoldRefCount int64 `protobuf:"varint,6,opt,name=unbonding_on_hold_ref_count,json=unbondingOnHoldRefCount,proto3" json:"unbonding_on_hold_ref_count,omitempty"` } func (m *UnbondingDelegationEntry) Reset() { *m = UnbondingDelegationEntry{} } @@ -731,6 +772,20 @@ func (m *UnbondingDelegationEntry) GetCompletionTime() time.Time { return time.Time{} } +func (m *UnbondingDelegationEntry) GetUnbondingId() uint64 { + if m != nil { + return m.UnbondingId + } + return 0 +} + +func (m *UnbondingDelegationEntry) GetUnbondingOnHoldRefCount() int64 { + if m != nil { + return m.UnbondingOnHoldRefCount + } + return 0 +} + // RedelegationEntry defines a redelegation object with relevant metadata. type RedelegationEntry struct { // creation_height defines the height which the redelegation took place. @@ -741,6 +796,10 @@ type RedelegationEntry struct { InitialBalance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"initial_balance"` // shares_dst is the amount of destination-validator shares created by redelegation. SharesDst github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=shares_dst,json=sharesDst,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"shares_dst"` + // Incrementing id that uniquely identifies this entry + UnbondingId uint64 `protobuf:"varint,5,opt,name=unbonding_id,json=unbondingId,proto3" json:"unbonding_id,omitempty"` + // Strictly positive if this entry's unbonding has been stopped by external modules + UnbondingOnHoldRefCount int64 `protobuf:"varint,6,opt,name=unbonding_on_hold_ref_count,json=unbondingOnHoldRefCount,proto3" json:"unbonding_on_hold_ref_count,omitempty"` } func (m *RedelegationEntry) Reset() { *m = RedelegationEntry{} } @@ -789,6 +848,20 @@ func (m *RedelegationEntry) GetCompletionTime() time.Time { return time.Time{} } +func (m *RedelegationEntry) GetUnbondingId() uint64 { + if m != nil { + return m.UnbondingId + } + return 0 +} + +func (m *RedelegationEntry) GetUnbondingOnHoldRefCount() int64 { + if m != nil { + return m.UnbondingOnHoldRefCount + } + return 0 +} + // Redelegation contains the list of a particular delegator's redelegating bonds // from a particular source validator to a particular destination validator. type Redelegation struct { @@ -1113,8 +1186,55 @@ func (m *Pool) XXX_DiscardUnknown() { var xxx_messageInfo_Pool proto.InternalMessageInfo +// ValidatorUpdates defines an array of abci.ValidatorUpdate objects. +// TODO: explore moving this to proto/cosmos/base to separate modules from tendermint dependence +type ValidatorUpdates struct { + Updates []types3.ValidatorUpdate `protobuf:"bytes,1,rep,name=updates,proto3" json:"updates"` +} + +func (m *ValidatorUpdates) Reset() { *m = ValidatorUpdates{} } +func (m *ValidatorUpdates) String() string { return proto.CompactTextString(m) } +func (*ValidatorUpdates) ProtoMessage() {} +func (*ValidatorUpdates) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{20} +} +func (m *ValidatorUpdates) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ValidatorUpdates) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ValidatorUpdates.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ValidatorUpdates) XXX_Merge(src proto.Message) { + xxx_messageInfo_ValidatorUpdates.Merge(m, src) +} +func (m *ValidatorUpdates) XXX_Size() int { + return m.Size() +} +func (m *ValidatorUpdates) XXX_DiscardUnknown() { + xxx_messageInfo_ValidatorUpdates.DiscardUnknown(m) +} + +var xxx_messageInfo_ValidatorUpdates proto.InternalMessageInfo + +func (m *ValidatorUpdates) GetUpdates() []types3.ValidatorUpdate { + if m != nil { + return m.Updates + } + return nil +} + func init() { proto.RegisterEnum("cosmos.staking.v1beta1.BondStatus", BondStatus_name, BondStatus_value) + proto.RegisterEnum("cosmos.staking.v1beta1.Infraction", Infraction_name, Infraction_value) proto.RegisterType((*HistoricalInfo)(nil), "cosmos.staking.v1beta1.HistoricalInfo") proto.RegisterType((*CommissionRates)(nil), "cosmos.staking.v1beta1.CommissionRates") proto.RegisterType((*Commission)(nil), "cosmos.staking.v1beta1.Commission") @@ -1135,6 +1255,7 @@ func init() { proto.RegisterType((*RedelegationEntryResponse)(nil), "cosmos.staking.v1beta1.RedelegationEntryResponse") proto.RegisterType((*RedelegationResponse)(nil), "cosmos.staking.v1beta1.RedelegationResponse") proto.RegisterType((*Pool)(nil), "cosmos.staking.v1beta1.Pool") + proto.RegisterType((*ValidatorUpdates)(nil), "cosmos.staking.v1beta1.ValidatorUpdates") } func init() { @@ -1142,112 +1263,123 @@ func init() { } var fileDescriptor_64c30c6cf92913c9 = []byte{ - // 1669 bytes of a gzipped FileDescriptorProto + // 1843 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0x4d, 0x6c, 0x1b, 0xc7, - 0x15, 0xe6, 0x52, 0x0c, 0x45, 0x3d, 0x4a, 0xa2, 0x34, 0x56, 0x52, 0x9a, 0x68, 0x49, 0x96, 0x4d, - 0x13, 0xa7, 0x88, 0xa9, 0x5a, 0x05, 0x02, 0x54, 0x28, 0x50, 0x98, 0x22, 0x53, 0xab, 0x4e, 0x5c, - 0x86, 0x94, 0x55, 0xf4, 0x07, 0x5d, 0x0c, 0x77, 0x47, 0xd4, 0x54, 0xbb, 0xb3, 0xc4, 0xce, 0xd0, - 0x15, 0x81, 0x16, 0x28, 0xd0, 0x4b, 0xea, 0x53, 0x8e, 0xb9, 0x18, 0x30, 0x90, 0x1e, 0x73, 0x0c, - 0x7a, 0xe9, 0xa1, 0xd7, 0x34, 0x27, 0x23, 0xa7, 0xa6, 0x2d, 0xd4, 0xc2, 0xbe, 0x14, 0x3d, 0x15, - 0xb9, 0xb7, 0x28, 0xe6, 0x67, 0x7f, 0x4c, 0x8a, 0x8a, 0x14, 0xa8, 0x40, 0x00, 0x5f, 0xec, 0x9d, - 0x99, 0xf7, 0xbe, 0x79, 0xef, 0x7b, 0x3f, 0x7a, 0x43, 0x78, 0xd1, 0x09, 0xb8, 0x1f, 0xf0, 0x4d, - 0x2e, 0xf0, 0x11, 0x65, 0xc3, 0xcd, 0x7b, 0x37, 0x06, 0x44, 0xe0, 0x1b, 0xd1, 0xba, 0x39, 0x0a, - 0x03, 0x11, 0xa0, 0x17, 0xb4, 0x54, 0x33, 0xda, 0x35, 0x52, 0x95, 0x8d, 0x61, 0x30, 0x0c, 0x94, - 0xc8, 0xa6, 0xfc, 0xd2, 0xd2, 0x95, 0xab, 0xc3, 0x20, 0x18, 0x7a, 0x64, 0x53, 0xad, 0x06, 0xe3, - 0x83, 0x4d, 0xcc, 0x26, 0xe6, 0xa8, 0x3a, 0x7d, 0xe4, 0x8e, 0x43, 0x2c, 0x68, 0xc0, 0xcc, 0x79, - 0x6d, 0xfa, 0x5c, 0x50, 0x9f, 0x70, 0x81, 0xfd, 0x51, 0x84, 0xad, 0x2d, 0xb1, 0xf5, 0xa5, 0xc6, - 0x2c, 0x83, 0x6d, 0x5c, 0x19, 0x60, 0x4e, 0x62, 0x3f, 0x9c, 0x80, 0x46, 0xd8, 0x5f, 0x16, 0x84, - 0xb9, 0x24, 0xf4, 0x29, 0x13, 0x9b, 0x62, 0x32, 0x22, 0x5c, 0xff, 0xab, 0x4f, 0x1b, 0xbf, 0xb5, - 0x60, 0xf5, 0x16, 0xe5, 0x22, 0x08, 0xa9, 0x83, 0xbd, 0x5d, 0x76, 0x10, 0xa0, 0xd7, 0x20, 0x7f, - 0x48, 0xb0, 0x4b, 0xc2, 0xb2, 0x55, 0xb7, 0xae, 0x15, 0xb7, 0xca, 0xcd, 0x04, 0xa1, 0xa9, 0x75, - 0x6f, 0xa9, 0xf3, 0x56, 0xee, 0xc3, 0x93, 0x5a, 0xa6, 0x67, 0xa4, 0xd1, 0x77, 0x21, 0x7f, 0x0f, - 0x7b, 0x9c, 0x88, 0x72, 0xb6, 0xbe, 0x70, 0xad, 0xb8, 0xf5, 0xd5, 0xe6, 0xe9, 0xf4, 0x35, 0xf7, - 0xb1, 0x47, 0x5d, 0x2c, 0x82, 0x18, 0x40, 0xab, 0x35, 0xde, 0xcf, 0x42, 0x69, 0x27, 0xf0, 0x7d, - 0xca, 0x39, 0x0d, 0x58, 0x0f, 0x0b, 0xc2, 0x51, 0x17, 0x72, 0x21, 0x16, 0x44, 0x99, 0xb2, 0xd4, - 0xfa, 0x8e, 0x94, 0xff, 0xcb, 0x49, 0xed, 0xa5, 0x21, 0x15, 0x87, 0xe3, 0x41, 0xd3, 0x09, 0x7c, - 0x43, 0x86, 0xf9, 0xef, 0x3a, 0x77, 0x8f, 0x8c, 0x7f, 0x6d, 0xe2, 0x7c, 0xfc, 0xc1, 0x75, 0x30, - 0x36, 0xb4, 0x89, 0xd3, 0x53, 0x48, 0xe8, 0x87, 0x50, 0xf0, 0xf1, 0xb1, 0xad, 0x50, 0xb3, 0x97, - 0x80, 0xba, 0xe8, 0xe3, 0x63, 0x69, 0x2b, 0x72, 0xa1, 0x24, 0x81, 0x9d, 0x43, 0xcc, 0x86, 0x44, - 0xe3, 0x2f, 0x5c, 0x02, 0xfe, 0x8a, 0x8f, 0x8f, 0x77, 0x14, 0xa6, 0xbc, 0x65, 0xbb, 0xf0, 0xee, - 0xc3, 0x5a, 0xe6, 0x9f, 0x0f, 0x6b, 0x56, 0xe3, 0x0f, 0x16, 0x40, 0x42, 0x17, 0xfa, 0x29, 0xac, - 0x39, 0xf1, 0x4a, 0x5d, 0xcf, 0x4d, 0x00, 0x5f, 0x9e, 0x17, 0x88, 0x29, 0xb2, 0x5b, 0x05, 0x69, - 0xe8, 0xa3, 0x93, 0x9a, 0xd5, 0x2b, 0x39, 0x53, 0x71, 0xe8, 0x40, 0x71, 0x3c, 0x72, 0xb1, 0x20, - 0xb6, 0x4c, 0x4d, 0x45, 0x5c, 0x71, 0xab, 0xd2, 0xd4, 0x79, 0xdb, 0x8c, 0xf2, 0xb6, 0xb9, 0x17, - 0xe5, 0xad, 0xc6, 0x7a, 0xe7, 0xef, 0x35, 0xab, 0x07, 0x5a, 0x51, 0x1e, 0xa5, 0xac, 0x7f, 0xdf, - 0x82, 0x62, 0x9b, 0x70, 0x27, 0xa4, 0x23, 0x59, 0x08, 0xa8, 0x0c, 0x8b, 0x7e, 0xc0, 0xe8, 0x91, - 0x49, 0xbb, 0xa5, 0x5e, 0xb4, 0x44, 0x15, 0x28, 0x50, 0x97, 0x30, 0x41, 0xc5, 0x44, 0x07, 0xac, - 0x17, 0xaf, 0xa5, 0xd6, 0x2f, 0xc8, 0x80, 0xd3, 0x88, 0xeb, 0x5e, 0xb4, 0x44, 0xaf, 0xc0, 0x1a, - 0x27, 0xce, 0x38, 0xa4, 0x62, 0x62, 0x3b, 0x01, 0x13, 0xd8, 0x11, 0xe5, 0x9c, 0x12, 0x29, 0x45, - 0xfb, 0x3b, 0x7a, 0x5b, 0x82, 0xb8, 0x44, 0x60, 0xea, 0xf1, 0xf2, 0x73, 0x1a, 0xc4, 0x2c, 0x53, - 0xe6, 0xfe, 0x29, 0x0f, 0x4b, 0x71, 0xde, 0xa2, 0x1d, 0x58, 0x0b, 0x46, 0x24, 0x94, 0xdf, 0x36, - 0x76, 0xdd, 0x90, 0x70, 0x6e, 0x32, 0xb4, 0xfc, 0xf1, 0x07, 0xd7, 0x37, 0x0c, 0xdd, 0x37, 0xf5, - 0x49, 0x5f, 0x84, 0x94, 0x0d, 0x7b, 0xa5, 0x48, 0xc3, 0x6c, 0xa3, 0x1f, 0xc9, 0x80, 0x31, 0x4e, - 0x18, 0x1f, 0x73, 0x7b, 0x34, 0x1e, 0x1c, 0x91, 0x89, 0xe1, 0x75, 0x63, 0x86, 0xd7, 0x9b, 0x6c, - 0xd2, 0x2a, 0x7f, 0x94, 0x40, 0x3b, 0xe1, 0x64, 0x24, 0x82, 0x66, 0x77, 0x3c, 0xb8, 0x4d, 0x26, - 0x32, 0x5a, 0x06, 0xa7, 0xab, 0x60, 0xd0, 0x0b, 0x90, 0xff, 0x39, 0xa6, 0x1e, 0x71, 0x15, 0x2b, - 0x85, 0x9e, 0x59, 0xa1, 0x6d, 0xc8, 0x73, 0x81, 0xc5, 0x98, 0x2b, 0x2a, 0x56, 0xb7, 0x1a, 0xf3, - 0x32, 0xa3, 0x15, 0x30, 0xb7, 0xaf, 0x24, 0x7b, 0x46, 0x03, 0xed, 0x41, 0x5e, 0x04, 0x47, 0x84, - 0x19, 0x92, 0x2e, 0x94, 0xd5, 0xbb, 0x4c, 0xa4, 0xb2, 0x7a, 0x97, 0x89, 0x9e, 0xc1, 0x42, 0x43, - 0x58, 0x73, 0x89, 0x47, 0x86, 0x8a, 0x4a, 0x7e, 0x88, 0x43, 0xc2, 0xcb, 0xf9, 0x4b, 0xa8, 0x9a, - 0x52, 0x8c, 0xda, 0x57, 0xa0, 0xe8, 0x36, 0x14, 0xdd, 0x24, 0xdd, 0xca, 0x8b, 0x8a, 0xe8, 0xaf, - 0xcd, 0xf3, 0x3f, 0x95, 0x99, 0xa6, 0x49, 0xa5, 0xb5, 0x65, 0x72, 0x8d, 0xd9, 0x20, 0x60, 0x2e, - 0x65, 0x43, 0xfb, 0x90, 0xd0, 0xe1, 0xa1, 0x28, 0x17, 0xea, 0xd6, 0xb5, 0x85, 0x5e, 0x29, 0xde, - 0xbf, 0xa5, 0xb6, 0xd1, 0x6d, 0x58, 0x4d, 0x44, 0x55, 0xed, 0x2c, 0x5d, 0xa0, 0x76, 0x56, 0x62, - 0x5d, 0x79, 0x8a, 0x6e, 0x01, 0x24, 0x85, 0x59, 0x06, 0x05, 0xd4, 0xf8, 0xec, 0xea, 0x36, 0x2e, - 0xa4, 0x74, 0x91, 0x07, 0x57, 0x7c, 0xca, 0x6c, 0x4e, 0xbc, 0x03, 0xdb, 0x50, 0x25, 0x21, 0x8b, - 0x97, 0x10, 0xda, 0x75, 0x9f, 0xb2, 0x3e, 0xf1, 0x0e, 0xda, 0x31, 0xec, 0xf6, 0xf2, 0xdb, 0x0f, - 0x6b, 0x19, 0x53, 0x4b, 0x99, 0x46, 0x17, 0x96, 0xf7, 0xb1, 0x67, 0xca, 0x80, 0x70, 0xf4, 0x1a, - 0x2c, 0xe1, 0x68, 0x51, 0xb6, 0xea, 0x0b, 0x67, 0x96, 0x51, 0x22, 0xaa, 0xab, 0xf3, 0xd7, 0x7f, - 0xab, 0x5b, 0x8d, 0xdf, 0x59, 0x90, 0x6f, 0xef, 0x77, 0x31, 0x0d, 0x51, 0x07, 0xd6, 0x93, 0x84, - 0x3a, 0x6f, 0x6d, 0x26, 0x39, 0x18, 0x15, 0x67, 0x07, 0xd6, 0xef, 0x45, 0xe5, 0x1e, 0xc3, 0x64, - 0x3f, 0x0b, 0x26, 0x56, 0x31, 0xfb, 0x53, 0x8e, 0x77, 0x60, 0x51, 0x5b, 0xc9, 0xd1, 0x36, 0x3c, - 0x37, 0x92, 0x1f, 0xca, 0xdf, 0xe2, 0x56, 0x75, 0x6e, 0x22, 0x2a, 0x79, 0x13, 0x40, 0xad, 0xd2, - 0xf8, 0x8f, 0x05, 0xd0, 0xde, 0xdf, 0xdf, 0x0b, 0xe9, 0xc8, 0x23, 0xe2, 0xb2, 0x3c, 0x7e, 0x03, - 0x9e, 0x4f, 0x3c, 0xe6, 0xa1, 0x73, 0x6e, 0xaf, 0xaf, 0xc4, 0x6a, 0xfd, 0xd0, 0x39, 0x15, 0xcd, - 0xe5, 0x22, 0x46, 0x5b, 0x38, 0x37, 0x5a, 0x9b, 0x8b, 0xd3, 0x69, 0xec, 0x43, 0x31, 0x71, 0x9f, - 0xa3, 0x36, 0x14, 0x84, 0xf9, 0x36, 0x6c, 0x36, 0xe6, 0xb3, 0x19, 0xa9, 0x19, 0x46, 0x63, 0xcd, - 0xc6, 0x7f, 0x25, 0xa9, 0x71, 0xc6, 0x7e, 0xb1, 0xd2, 0x48, 0xf6, 0x5e, 0xd3, 0x1b, 0x2f, 0x63, - 0xa2, 0x30, 0x58, 0x53, 0xac, 0xfe, 0x26, 0x0b, 0x57, 0xee, 0x46, 0xdd, 0xe6, 0x0b, 0xcb, 0x44, - 0x17, 0x16, 0x09, 0x13, 0x21, 0x55, 0x54, 0xc8, 0x58, 0x7f, 0x73, 0x5e, 0xac, 0x4f, 0xf1, 0xa5, - 0xc3, 0x44, 0x38, 0x31, 0x91, 0x8f, 0x60, 0xa6, 0x58, 0xf8, 0x6b, 0x16, 0xca, 0xf3, 0x34, 0xd1, - 0xcb, 0x50, 0x72, 0x42, 0xa2, 0x36, 0xa2, 0xae, 0x6f, 0xa9, 0xae, 0xbf, 0x1a, 0x6d, 0x9b, 0xa6, - 0xff, 0x26, 0xc8, 0x01, 0x4a, 0x26, 0x96, 0x14, 0xbd, 0xf0, 0xc4, 0xb4, 0x9a, 0x28, 0xab, 0xb6, - 0x4f, 0xa0, 0x44, 0x19, 0x15, 0x14, 0x7b, 0xf6, 0x00, 0x7b, 0x98, 0x39, 0x9f, 0x67, 0xb2, 0x9c, - 0x6d, 0xd4, 0xab, 0x06, 0xb4, 0xa5, 0x31, 0xd1, 0x3e, 0x2c, 0x46, 0xf0, 0xb9, 0x4b, 0x80, 0x8f, - 0xc0, 0x52, 0x53, 0xd4, 0x27, 0x59, 0x58, 0xef, 0x11, 0xf7, 0xd9, 0xa2, 0xf5, 0x27, 0x00, 0xba, - 0xe0, 0x64, 0x1f, 0xfc, 0x1c, 0xcc, 0xce, 0x16, 0xf0, 0x92, 0xc6, 0x6b, 0x73, 0x91, 0xe2, 0xf6, - 0xa3, 0x2c, 0x2c, 0xa7, 0xb9, 0x7d, 0x06, 0xfe, 0x2e, 0xa0, 0xdd, 0xa4, 0x1b, 0xe4, 0x54, 0x37, - 0x78, 0x65, 0x5e, 0x37, 0x98, 0xc9, 0xba, 0xb3, 0xdb, 0xc0, 0xa7, 0x59, 0xc8, 0x77, 0x71, 0x88, - 0x7d, 0x8e, 0xbe, 0x3f, 0x33, 0xc0, 0xe9, 0x57, 0xd5, 0xd5, 0x99, 0x9c, 0x6b, 0x9b, 0x47, 0xbd, - 0x4e, 0xb9, 0x77, 0x4f, 0x99, 0xdf, 0xbe, 0x0e, 0xab, 0xf2, 0x89, 0x18, 0xbb, 0xa2, 0x49, 0x5c, - 0x51, 0x6f, 0xbc, 0xf8, 0x75, 0xc1, 0x51, 0x0d, 0x8a, 0x52, 0x2c, 0x69, 0x74, 0x52, 0x06, 0x7c, - 0x7c, 0xdc, 0xd1, 0x3b, 0xe8, 0x3a, 0xa0, 0xc3, 0xf8, 0xd1, 0x6e, 0x27, 0x14, 0x48, 0xb9, 0xf5, - 0xe4, 0x24, 0x12, 0xff, 0x0a, 0x80, 0xb4, 0xc2, 0x76, 0x09, 0x0b, 0x7c, 0xf3, 0xc6, 0x59, 0x92, - 0x3b, 0x6d, 0xb9, 0x81, 0x7e, 0xa9, 0x67, 0xc1, 0xa9, 0xd7, 0xa3, 0x19, 0xc3, 0xdf, 0xb8, 0x58, - 0xa6, 0x7e, 0x7a, 0x52, 0xab, 0x4c, 0xb0, 0xef, 0x6d, 0x37, 0x4e, 0x81, 0x6c, 0xa8, 0xd9, 0xf0, - 0xe9, 0x57, 0x67, 0x2a, 0x83, 0xdf, 0xb3, 0x00, 0x25, 0x2d, 0xb7, 0x47, 0xf8, 0x48, 0x3e, 0x6b, - 0xe4, 0xd0, 0x9b, 0x9a, 0x50, 0xad, 0xb3, 0x87, 0xde, 0x44, 0x3f, 0x1a, 0x7a, 0x53, 0x15, 0xf1, - 0xed, 0xa4, 0xc1, 0x65, 0x4d, 0x0c, 0x0d, 0xcc, 0x00, 0x73, 0x92, 0x1a, 0x9c, 0x69, 0xa4, 0x3d, - 0xd3, 0xc3, 0x32, 0x8d, 0x4f, 0x2c, 0xb8, 0x3a, 0x93, 0x4d, 0xb1, 0xb1, 0x3f, 0x03, 0x14, 0xa6, - 0x0e, 0x55, 0x6c, 0x26, 0xc6, 0xe8, 0x0b, 0x27, 0xe7, 0x7a, 0x38, 0xd3, 0x2b, 0xff, 0x5f, 0x3d, - 0x3a, 0xa7, 0x22, 0xf0, 0x47, 0x0b, 0x36, 0xd2, 0xc6, 0xc4, 0x6e, 0xdd, 0x81, 0xe5, 0xb4, 0x2d, - 0xc6, 0xa1, 0x17, 0xcf, 0xe3, 0x90, 0xf1, 0xe5, 0x29, 0x7d, 0xf4, 0x56, 0x52, 0xb8, 0xfa, 0xc7, - 0xa2, 0x1b, 0xe7, 0xe6, 0x26, 0xb2, 0x69, 0xba, 0x80, 0x73, 0xd1, 0x14, 0x93, 0xeb, 0x06, 0x81, - 0x87, 0x7e, 0x05, 0xeb, 0x2c, 0x10, 0xb6, 0xcc, 0x72, 0xe2, 0xda, 0xe6, 0xe5, 0xaa, 0xbb, 0xdf, - 0x5b, 0x17, 0xa3, 0xec, 0x5f, 0x27, 0xb5, 0x59, 0xa8, 0x29, 0x1e, 0x4b, 0x2c, 0x10, 0x2d, 0x75, - 0xbe, 0xa7, 0xdf, 0xb5, 0x21, 0xac, 0x3c, 0x7d, 0xb5, 0xee, 0x96, 0x6f, 0x5e, 0xf8, 0xea, 0x95, - 0xb3, 0xae, 0x5d, 0x1e, 0xa4, 0xee, 0xdc, 0x2e, 0xc8, 0x18, 0xfe, 0xfb, 0x61, 0xcd, 0xfa, 0xc6, - 0xef, 0x2d, 0x80, 0xe4, 0x09, 0x8f, 0x5e, 0x85, 0x2f, 0xb5, 0x7e, 0x70, 0xa7, 0x6d, 0xf7, 0xf7, - 0x6e, 0xee, 0xdd, 0xed, 0xdb, 0x77, 0xef, 0xf4, 0xbb, 0x9d, 0x9d, 0xdd, 0xd7, 0x77, 0x3b, 0xed, - 0xb5, 0x4c, 0xa5, 0x74, 0xff, 0x41, 0xbd, 0x78, 0x97, 0xf1, 0x11, 0x71, 0xe8, 0x01, 0x25, 0x2e, - 0x7a, 0x09, 0x36, 0x9e, 0x96, 0x96, 0xab, 0x4e, 0x7b, 0xcd, 0xaa, 0x2c, 0xdf, 0x7f, 0x50, 0x2f, - 0xe8, 0xe9, 0x88, 0xb8, 0xe8, 0x1a, 0x3c, 0x3f, 0x2b, 0xb7, 0x7b, 0xe7, 0x7b, 0x6b, 0xd9, 0xca, - 0xca, 0xfd, 0x07, 0xf5, 0xa5, 0x78, 0x8c, 0x42, 0x0d, 0x40, 0x69, 0x49, 0x83, 0xb7, 0x50, 0x81, - 0xfb, 0x0f, 0xea, 0x79, 0x4d, 0x5b, 0x25, 0xf7, 0xf6, 0x7b, 0xd5, 0x4c, 0xeb, 0xf5, 0x0f, 0x1f, - 0x57, 0xad, 0x47, 0x8f, 0xab, 0xd6, 0x3f, 0x1e, 0x57, 0xad, 0x77, 0x9e, 0x54, 0x33, 0x8f, 0x9e, - 0x54, 0x33, 0x7f, 0x7e, 0x52, 0xcd, 0xfc, 0xf8, 0xd5, 0x33, 0x19, 0x3b, 0x8e, 0x7f, 0xc9, 0x55, - 0xdc, 0x0d, 0xf2, 0xaa, 0x29, 0x7f, 0xeb, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x49, 0x0e, 0x8f, - 0x94, 0xe8, 0x15, 0x00, 0x00, + 0x15, 0xe6, 0x52, 0x0c, 0x25, 0x3d, 0x4a, 0x22, 0x35, 0x76, 0x6c, 0x9a, 0x69, 0x45, 0x86, 0x49, + 0x13, 0x25, 0x88, 0xa9, 0x5a, 0x05, 0x02, 0x54, 0x08, 0xd0, 0x9a, 0x22, 0x1d, 0xb1, 0xb6, 0x65, + 0x65, 0x49, 0x29, 0xe8, 0xef, 0x62, 0xb8, 0x3b, 0xa2, 0xa6, 0x5a, 0xce, 0x12, 0x3b, 0x43, 0x57, + 0x04, 0x5a, 0xa0, 0x40, 0x2f, 0xa9, 0x4f, 0x39, 0xe6, 0x62, 0xc0, 0x40, 0x7a, 0xcc, 0x31, 0xe8, + 0xa1, 0x2d, 0xd0, 0x6b, 0x90, 0x93, 0x91, 0x53, 0x5b, 0x14, 0x6a, 0x61, 0x5f, 0x8a, 0x9e, 0x8a, + 0xdc, 0x5b, 0x14, 0x33, 0x3b, 0xfb, 0x23, 0x52, 0x92, 0xa5, 0x40, 0x2d, 0x02, 0xe4, 0x22, 0x71, + 0x66, 0xde, 0xfb, 0xf6, 0xbd, 0xef, 0xfd, 0xcc, 0x0f, 0xbc, 0x6c, 0x7b, 0xbc, 0xef, 0xf1, 0x15, + 0x2e, 0xf0, 0x3e, 0x65, 0xbd, 0x95, 0xfb, 0x37, 0xba, 0x44, 0xe0, 0x1b, 0xe1, 0xb8, 0x36, 0xf0, + 0x3d, 0xe1, 0xa1, 0x2b, 0x81, 0x54, 0x2d, 0x9c, 0xd5, 0x52, 0xa5, 0xcb, 0x3d, 0xaf, 0xe7, 0x29, + 0x91, 0x15, 0xf9, 0x2b, 0x90, 0x2e, 0x5d, 0xeb, 0x79, 0x5e, 0xcf, 0x25, 0x2b, 0x6a, 0xd4, 0x1d, + 0xee, 0xae, 0x60, 0x36, 0xd2, 0x4b, 0x4b, 0xe3, 0x4b, 0xce, 0xd0, 0xc7, 0x82, 0x7a, 0x4c, 0xaf, + 0x97, 0xc7, 0xd7, 0x05, 0xed, 0x13, 0x2e, 0x70, 0x7f, 0x10, 0x62, 0x07, 0x96, 0x58, 0xc1, 0x47, + 0xb5, 0x59, 0x1a, 0x5b, 0xbb, 0xd2, 0xc5, 0x9c, 0x44, 0x7e, 0xd8, 0x1e, 0x0d, 0xb1, 0xbf, 0x26, + 0x08, 0x73, 0x88, 0xdf, 0xa7, 0x4c, 0xac, 0x88, 0xd1, 0x80, 0xf0, 0xe0, 0xaf, 0x5e, 0x7d, 0x21, + 0xb1, 0x8a, 0xbb, 0x36, 0x4d, 0x2e, 0x56, 0x7f, 0x6d, 0xc0, 0xc2, 0x06, 0xe5, 0xc2, 0xf3, 0xa9, + 0x8d, 0xdd, 0x16, 0xdb, 0xf5, 0xd0, 0x9b, 0x90, 0xdd, 0x23, 0xd8, 0x21, 0x7e, 0xd1, 0xa8, 0x18, + 0xcb, 0xb9, 0xd5, 0x62, 0x2d, 0x06, 0xa8, 0x05, 0xba, 0x1b, 0x6a, 0xbd, 0x9e, 0xf9, 0xe4, 0xb0, + 0x9c, 0x32, 0xb5, 0x34, 0xfa, 0x0e, 0x64, 0xef, 0x63, 0x97, 0x13, 0x51, 0x4c, 0x57, 0xa6, 0x96, + 0x73, 0xab, 0x2f, 0xd6, 0x8e, 0xe7, 0xb6, 0xb6, 0x83, 0x5d, 0xea, 0x60, 0xe1, 0x45, 0x00, 0x81, + 0x5a, 0xf5, 0xa3, 0x34, 0xe4, 0xd7, 0xbd, 0x7e, 0x9f, 0x72, 0x4e, 0x3d, 0x66, 0x62, 0x41, 0x38, + 0xda, 0x82, 0x8c, 0x8f, 0x05, 0x51, 0xa6, 0xcc, 0xd6, 0xdf, 0x92, 0xf2, 0x7f, 0x39, 0x2c, 0xbf, + 0xd2, 0xa3, 0x62, 0x6f, 0xd8, 0xad, 0xd9, 0x5e, 0x5f, 0x33, 0xa5, 0xff, 0x5d, 0xe7, 0xce, 0xbe, + 0xf6, 0xaf, 0x41, 0xec, 0xcf, 0x3e, 0xbe, 0x0e, 0xda, 0x86, 0x06, 0xb1, 0x4d, 0x85, 0x84, 0xde, + 0x85, 0x99, 0x3e, 0x3e, 0xb0, 0x14, 0x6a, 0xfa, 0x02, 0x50, 0xa7, 0xfb, 0xf8, 0x40, 0xda, 0x8a, + 0x1c, 0xc8, 0x4b, 0x60, 0x7b, 0x0f, 0xb3, 0x1e, 0x09, 0xf0, 0xa7, 0x2e, 0x00, 0x7f, 0xbe, 0x8f, + 0x0f, 0xd6, 0x15, 0xa6, 0xfc, 0xca, 0xda, 0xcc, 0x07, 0x8f, 0xca, 0xa9, 0x7f, 0x3c, 0x2a, 0x1b, + 0xd5, 0xdf, 0x1b, 0x00, 0x31, 0x5d, 0xe8, 0x47, 0x50, 0xb0, 0xa3, 0x91, 0xfa, 0x3c, 0xd7, 0x01, + 0x7c, 0xf5, 0xa4, 0x40, 0x8c, 0x91, 0x5d, 0x9f, 0x91, 0x86, 0x3e, 0x3e, 0x2c, 0x1b, 0x66, 0xde, + 0x1e, 0x8b, 0x43, 0x13, 0x72, 0xc3, 0x81, 0x83, 0x05, 0xb1, 0x64, 0xde, 0x2a, 0xe2, 0x72, 0xab, + 0xa5, 0x5a, 0x90, 0xd4, 0xb5, 0x30, 0xa9, 0x6b, 0x9d, 0x30, 0xa9, 0x03, 0xac, 0xf7, 0xff, 0x56, + 0x36, 0x4c, 0x08, 0x14, 0xe5, 0x52, 0xc2, 0xfa, 0x8f, 0x0c, 0xc8, 0x35, 0x08, 0xb7, 0x7d, 0x3a, + 0x90, 0x55, 0x82, 0x8a, 0x30, 0xdd, 0xf7, 0x18, 0xdd, 0xd7, 0x69, 0x37, 0x6b, 0x86, 0x43, 0x54, + 0x82, 0x19, 0xea, 0x10, 0x26, 0xa8, 0x18, 0x05, 0x01, 0x33, 0xa3, 0xb1, 0xd4, 0xfa, 0x19, 0xe9, + 0x72, 0x1a, 0x72, 0x6d, 0x86, 0x43, 0xf4, 0x1a, 0x14, 0x38, 0xb1, 0x87, 0x3e, 0x15, 0x23, 0xcb, + 0xf6, 0x98, 0xc0, 0xb6, 0x28, 0x66, 0x94, 0x48, 0x3e, 0x9c, 0x5f, 0x0f, 0xa6, 0x25, 0x88, 0x43, + 0x04, 0xa6, 0x2e, 0x2f, 0x3e, 0x17, 0x80, 0xe8, 0x61, 0xd2, 0xdc, 0x69, 0x98, 0x8d, 0xf2, 0x16, + 0xad, 0x43, 0xc1, 0x1b, 0x10, 0x5f, 0xfe, 0xb6, 0xb0, 0xe3, 0xf8, 0x84, 0x73, 0x9d, 0xa1, 0xc5, + 0xcf, 0x3e, 0xbe, 0x7e, 0x59, 0xd3, 0x7d, 0x33, 0x58, 0x69, 0x0b, 0x9f, 0xb2, 0x9e, 0x99, 0x0f, + 0x35, 0xf4, 0x34, 0xfa, 0xbe, 0x0c, 0x18, 0xe3, 0x84, 0xf1, 0x21, 0xb7, 0x06, 0xc3, 0xee, 0x3e, + 0x19, 0x69, 0x5e, 0x2f, 0x4f, 0xf0, 0x7a, 0x93, 0x8d, 0xea, 0xc5, 0x4f, 0x63, 0x68, 0xdb, 0x1f, + 0x0d, 0x84, 0x57, 0xdb, 0x1a, 0x76, 0x6f, 0x93, 0x91, 0x8c, 0x96, 0xc6, 0xd9, 0x52, 0x30, 0xe8, + 0x0a, 0x64, 0x7f, 0x8a, 0xa9, 0x4b, 0x1c, 0xc5, 0xca, 0x8c, 0xa9, 0x47, 0x68, 0x0d, 0xb2, 0x5c, + 0x60, 0x31, 0xe4, 0x8a, 0x8a, 0x85, 0xd5, 0xea, 0x49, 0x99, 0x51, 0xf7, 0x98, 0xd3, 0x56, 0x92, + 0xa6, 0xd6, 0x40, 0x1d, 0xc8, 0x0a, 0x6f, 0x9f, 0x30, 0x4d, 0xd2, 0xb9, 0xb2, 0xba, 0xc5, 0x44, + 0x22, 0xab, 0x5b, 0x4c, 0x98, 0x1a, 0x0b, 0xf5, 0xa0, 0xe0, 0x10, 0x97, 0xf4, 0x14, 0x95, 0x7c, + 0x0f, 0xfb, 0x84, 0x17, 0xb3, 0x17, 0x50, 0x35, 0xf9, 0x08, 0xb5, 0xad, 0x40, 0xd1, 0x6d, 0xc8, + 0x39, 0x71, 0xba, 0x15, 0xa7, 0x15, 0xd1, 0x2f, 0x9d, 0xe4, 0x7f, 0x22, 0x33, 0x75, 0x93, 0x4a, + 0x6a, 0xcb, 0xe4, 0x1a, 0xb2, 0xae, 0xc7, 0x1c, 0xca, 0x7a, 0xd6, 0x1e, 0xa1, 0xbd, 0x3d, 0x51, + 0x9c, 0xa9, 0x18, 0xcb, 0x53, 0x66, 0x3e, 0x9a, 0xdf, 0x50, 0xd3, 0xe8, 0x36, 0x2c, 0xc4, 0xa2, + 0xaa, 0x76, 0x66, 0xcf, 0x51, 0x3b, 0xf3, 0x91, 0xae, 0x5c, 0x45, 0x1b, 0x00, 0x71, 0x61, 0x16, + 0x41, 0x01, 0x55, 0x9f, 0x5d, 0xdd, 0xda, 0x85, 0x84, 0x2e, 0x72, 0xe1, 0x52, 0x9f, 0x32, 0x8b, + 0x13, 0x77, 0xd7, 0xd2, 0x54, 0x49, 0xc8, 0xdc, 0x05, 0x84, 0x76, 0xb1, 0x4f, 0x59, 0x9b, 0xb8, + 0xbb, 0x8d, 0x08, 0x16, 0xbd, 0x05, 0x2f, 0xc4, 0x24, 0x78, 0xcc, 0xda, 0xf3, 0x5c, 0xc7, 0xf2, + 0xc9, 0xae, 0x65, 0x7b, 0x43, 0x26, 0x8a, 0x73, 0x8a, 0xba, 0xab, 0x91, 0xc8, 0x3d, 0xb6, 0xe1, + 0xb9, 0x8e, 0x49, 0x76, 0xd7, 0xe5, 0x32, 0x7a, 0x09, 0x62, 0x1a, 0x2c, 0xea, 0xf0, 0xe2, 0x7c, + 0x65, 0x6a, 0x39, 0x63, 0xce, 0x45, 0x93, 0x2d, 0x87, 0xaf, 0xcd, 0xbd, 0xf7, 0xa8, 0x9c, 0xd2, + 0xe5, 0x9a, 0xaa, 0x6e, 0xc1, 0xdc, 0x0e, 0x76, 0x75, 0xa5, 0x11, 0x8e, 0xde, 0x84, 0x59, 0x1c, + 0x0e, 0x8a, 0x46, 0x65, 0xea, 0xd4, 0x4a, 0x8d, 0x45, 0x83, 0x06, 0xf0, 0xcb, 0xbf, 0x56, 0x8c, + 0xea, 0x6f, 0x0c, 0xc8, 0x36, 0x76, 0xb6, 0x30, 0xf5, 0x51, 0x13, 0x16, 0xe3, 0x9c, 0x3d, 0x6b, + 0xf9, 0xc7, 0x69, 0x1e, 0xd6, 0x7f, 0x13, 0x16, 0xef, 0x87, 0x1d, 0x25, 0x82, 0x49, 0x3f, 0x0b, + 0x26, 0x52, 0xd1, 0xf3, 0x63, 0x8e, 0x37, 0x61, 0x3a, 0xb0, 0x92, 0xa3, 0x35, 0x78, 0x6e, 0x20, + 0x7f, 0x28, 0x7f, 0x73, 0xab, 0x4b, 0x27, 0xe6, 0xba, 0x92, 0xd7, 0x39, 0x12, 0xa8, 0x54, 0xff, + 0x6d, 0x00, 0x34, 0x76, 0x76, 0x3a, 0x3e, 0x1d, 0xb8, 0x44, 0x5c, 0x94, 0xc7, 0x77, 0xe0, 0xf9, + 0xd8, 0x63, 0xee, 0xdb, 0x67, 0xf6, 0xfa, 0x52, 0xa4, 0xd6, 0xf6, 0xed, 0x63, 0xd1, 0x1c, 0x2e, + 0x22, 0xb4, 0xa9, 0x33, 0xa3, 0x35, 0xb8, 0x38, 0x9e, 0xc6, 0x36, 0xe4, 0x62, 0xf7, 0x39, 0x6a, + 0xc0, 0x8c, 0xd0, 0xbf, 0x35, 0x9b, 0xd5, 0x93, 0xd9, 0x0c, 0xd5, 0x34, 0xa3, 0x91, 0x66, 0xf5, + 0x3f, 0x92, 0xd4, 0xb8, 0x28, 0xbe, 0x54, 0x69, 0x24, 0xdb, 0xbb, 0x6e, 0xbf, 0x17, 0x71, 0x68, + 0xd1, 0x58, 0x63, 0xac, 0xfe, 0x2a, 0x0d, 0x97, 0xb6, 0xc3, 0xa2, 0xfd, 0xd2, 0x32, 0xb1, 0x05, + 0xd3, 0x84, 0x09, 0x9f, 0x2a, 0x2a, 0x64, 0xac, 0xbf, 0x79, 0x52, 0xac, 0x8f, 0xf1, 0xa5, 0xc9, + 0x84, 0x3f, 0xd2, 0x91, 0x0f, 0x61, 0xc6, 0x58, 0xf8, 0xc3, 0x14, 0x14, 0x4f, 0xd2, 0x44, 0xaf, + 0x42, 0xde, 0xf6, 0x89, 0x9a, 0x08, 0x37, 0x16, 0x43, 0x75, 0xc7, 0x85, 0x70, 0x5a, 0xef, 0x2b, + 0x77, 0x41, 0x9e, 0xd1, 0x64, 0x62, 0x49, 0xd1, 0x73, 0x1f, 0xca, 0x16, 0x62, 0x65, 0xb5, 0xb3, + 0x10, 0xc8, 0x53, 0x46, 0x05, 0xc5, 0xae, 0xd5, 0xc5, 0x2e, 0x66, 0xf6, 0x17, 0x39, 0xbc, 0x4e, + 0xee, 0x05, 0x0b, 0x1a, 0xb4, 0x1e, 0x60, 0xa2, 0x1d, 0x98, 0x0e, 0xe1, 0x33, 0x17, 0x00, 0x1f, + 0x82, 0xa1, 0x17, 0x61, 0x2e, 0xb9, 0x45, 0xa8, 0x23, 0x4a, 0xc6, 0xcc, 0x25, 0x76, 0x88, 0x67, + 0xed, 0x41, 0xd9, 0x53, 0xf7, 0xa0, 0xc4, 0x49, 0xf0, 0x77, 0x53, 0xb0, 0x68, 0x12, 0xe7, 0xab, + 0x15, 0xb7, 0x1f, 0x02, 0x04, 0x15, 0x2d, 0x1b, 0xed, 0x17, 0x08, 0xdd, 0x64, 0x87, 0x98, 0x0d, + 0xf0, 0x1a, 0x5c, 0xfc, 0x3f, 0x83, 0xf7, 0x69, 0x1a, 0xe6, 0x92, 0xc1, 0xfb, 0x0a, 0xec, 0x6c, + 0xa8, 0x15, 0xf7, 0xb3, 0x8c, 0xea, 0x67, 0xaf, 0x9d, 0xd4, 0xcf, 0x26, 0xd2, 0xfa, 0xf4, 0x46, + 0xf6, 0x79, 0x1a, 0xb2, 0x5b, 0xd8, 0xc7, 0x7d, 0x8e, 0xbe, 0x37, 0x71, 0xca, 0x0d, 0xae, 0x9e, + 0xd7, 0x26, 0x92, 0xba, 0xa1, 0x9f, 0x45, 0x82, 0x9c, 0xfe, 0xe0, 0x98, 0x43, 0xee, 0x37, 0x60, + 0x41, 0xde, 0xa3, 0x23, 0x57, 0x02, 0x12, 0xe7, 0xd5, 0x45, 0x38, 0xba, 0x82, 0x71, 0x54, 0x86, + 0x9c, 0x14, 0x8b, 0x5b, 0xb5, 0x94, 0x81, 0x3e, 0x3e, 0x68, 0x06, 0x33, 0xe8, 0x3a, 0xa0, 0xbd, + 0xe8, 0x65, 0xc3, 0x8a, 0x29, 0x90, 0x72, 0x8b, 0xf1, 0x4a, 0x28, 0xfe, 0x75, 0x00, 0x69, 0x85, + 0xe5, 0x10, 0xe6, 0xf5, 0xf5, 0x45, 0x70, 0x56, 0xce, 0x34, 0xe4, 0x04, 0xfa, 0x79, 0x70, 0x60, + 0x1e, 0xbb, 0x62, 0xeb, 0xbb, 0xca, 0x9d, 0xf3, 0x95, 0xc2, 0xe7, 0x87, 0xe5, 0xd2, 0x08, 0xf7, + 0xdd, 0xb5, 0xea, 0x31, 0x90, 0x55, 0x75, 0x80, 0x3e, 0x7a, 0x35, 0x4f, 0x64, 0xf0, 0x87, 0x06, + 0xa0, 0x78, 0xd3, 0x30, 0x09, 0x1f, 0xc8, 0xbb, 0x9f, 0xbc, 0x19, 0x24, 0x8e, 0xf1, 0xc6, 0xe9, + 0x37, 0x83, 0x58, 0x3f, 0xbc, 0x19, 0x24, 0x2a, 0xe2, 0xdb, 0x71, 0x8b, 0x4e, 0xeb, 0x18, 0x6a, + 0x98, 0x2e, 0xe6, 0x24, 0x71, 0xbb, 0xa0, 0xa1, 0x76, 0x28, 0x1f, 0x59, 0x99, 0xaa, 0xfe, 0xd9, + 0x80, 0x6b, 0x13, 0xd9, 0x14, 0x19, 0xfb, 0x13, 0x40, 0x7e, 0x62, 0x51, 0xc5, 0x66, 0xa4, 0x8d, + 0x3e, 0x77, 0x72, 0x2e, 0xfa, 0x13, 0xcd, 0xf8, 0x7f, 0xb4, 0xcb, 0xac, 0x65, 0x54, 0x04, 0xfe, + 0x68, 0xc0, 0xe5, 0xa4, 0x31, 0x91, 0x5b, 0x9b, 0x30, 0x97, 0xb4, 0x45, 0x3b, 0xf4, 0xf2, 0x59, + 0x1c, 0xd2, 0xbe, 0x1c, 0xd1, 0x47, 0xef, 0xc4, 0x85, 0x1b, 0xbc, 0xa8, 0xdd, 0x38, 0x33, 0x37, + 0xa1, 0x4d, 0xe3, 0x05, 0x9c, 0x09, 0xcf, 0x61, 0x99, 0x2d, 0xcf, 0x73, 0xd1, 0x2f, 0x60, 0x91, + 0x79, 0xc2, 0x92, 0x59, 0x4e, 0x1c, 0x4b, 0x5f, 0xef, 0x83, 0xee, 0xf7, 0xce, 0xf9, 0x28, 0xfb, + 0xe7, 0x61, 0x79, 0x12, 0x6a, 0x8c, 0xc7, 0x3c, 0xf3, 0x44, 0x5d, 0xad, 0x77, 0x82, 0xcb, 0xbf, + 0x0f, 0xf3, 0x47, 0x3f, 0x1d, 0x74, 0xcb, 0xbb, 0xe7, 0xfe, 0xf4, 0xfc, 0x69, 0x9f, 0x9d, 0xeb, + 0x26, 0xbe, 0xb9, 0x36, 0x23, 0x63, 0xf8, 0x2f, 0x19, 0xc7, 0x0e, 0x14, 0xa2, 0x76, 0xb2, 0xad, + 0x9e, 0xa8, 0x38, 0xfa, 0x2e, 0x4c, 0x07, 0xaf, 0x55, 0xe1, 0x39, 0xbf, 0x92, 0x7c, 0xfc, 0xc4, + 0x5d, 0x9b, 0xd6, 0xc6, 0x74, 0x42, 0x86, 0xb5, 0xda, 0xeb, 0xbf, 0x35, 0x00, 0xe2, 0xd7, 0x13, + 0xf4, 0x06, 0x5c, 0xad, 0xdf, 0xdb, 0x6c, 0x58, 0xed, 0xce, 0xcd, 0xce, 0x76, 0xdb, 0xda, 0xde, + 0x6c, 0x6f, 0x35, 0xd7, 0x5b, 0xb7, 0x5a, 0xcd, 0x46, 0x21, 0x55, 0xca, 0x3f, 0x78, 0x58, 0xc9, + 0x6d, 0x33, 0x3e, 0x20, 0x36, 0xdd, 0xa5, 0xc4, 0x41, 0xaf, 0xc0, 0xe5, 0xa3, 0xd2, 0x72, 0xd4, + 0x6c, 0x14, 0x8c, 0xd2, 0xdc, 0x83, 0x87, 0x95, 0x99, 0xe0, 0xd4, 0x48, 0x1c, 0xb4, 0x0c, 0xcf, + 0x4f, 0xca, 0xb5, 0x36, 0xdf, 0x2e, 0xa4, 0x4b, 0xf3, 0x0f, 0x1e, 0x56, 0x66, 0xa3, 0xe3, 0x25, + 0xaa, 0x02, 0x4a, 0x4a, 0x6a, 0xbc, 0xa9, 0x12, 0x3c, 0x78, 0x58, 0xc9, 0x06, 0xc1, 0x28, 0x65, + 0xde, 0xfb, 0x70, 0x29, 0xf5, 0xfa, 0x8f, 0x01, 0x5a, 0x6c, 0xd7, 0xc7, 0xb6, 0xca, 0xbd, 0x12, + 0x5c, 0x69, 0x6d, 0xde, 0x32, 0x6f, 0xae, 0x77, 0x5a, 0xf7, 0x36, 0x8f, 0x9a, 0x3d, 0xb6, 0xd6, + 0xb8, 0xb7, 0x5d, 0xbf, 0xd3, 0xb4, 0xda, 0xad, 0xb7, 0x37, 0x0b, 0x06, 0xba, 0x0a, 0x97, 0x8e, + 0xac, 0xbd, 0xbb, 0xd9, 0x69, 0xdd, 0x6d, 0x16, 0xd2, 0xf5, 0x5b, 0x9f, 0x3c, 0x59, 0x32, 0x1e, + 0x3f, 0x59, 0x32, 0xfe, 0xfe, 0x64, 0xc9, 0x78, 0xff, 0xe9, 0x52, 0xea, 0xf1, 0xd3, 0xa5, 0xd4, + 0x9f, 0x9e, 0x2e, 0xa5, 0x7e, 0xf0, 0xc6, 0xa9, 0x61, 0x3e, 0x88, 0x1e, 0xf0, 0x55, 0xc0, 0xbb, + 0x59, 0xb5, 0x93, 0x7c, 0xeb, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x65, 0x79, 0x74, 0xab, 0xdf, + 0x17, 0x00, 0x00, } func (this *Pool) Description() (desc *github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor.FileDescriptorSet) { @@ -1256,477 +1388,659 @@ func (this *Pool) Description() (desc *github_com_cosmos_gogoproto_protoc_gen_go func StakingDescription() (desc *github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor.FileDescriptorSet) { d := &github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ - // 7520 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0xbc, 0x6b, 0x70, 0x24, 0xd7, - 0x75, 0x1f, 0x8e, 0x79, 0x60, 0x30, 0x73, 0x66, 0x30, 0xd3, 0xb8, 0xc0, 0xee, 0xce, 0x82, 0x24, - 0x00, 0x0e, 0x1f, 0xbb, 0x7c, 0x61, 0xc9, 0x25, 0x77, 0x97, 0x3b, 0x6b, 0x89, 0x7f, 0xcc, 0x63, - 0x41, 0xec, 0xe2, 0x31, 0xec, 0x01, 0x96, 0x0f, 0xff, 0x93, 0x4e, 0xa3, 0xe7, 0x62, 0xd0, 0x44, - 0x4f, 0x77, 0xbb, 0xbb, 0x67, 0x77, 0xc1, 0x72, 0x52, 0x74, 0x29, 0x0f, 0x69, 0x53, 0x71, 0x64, - 0x3b, 0x15, 0xcb, 0xb2, 0x56, 0xa1, 0x2c, 0x27, 0x72, 0x14, 0xe5, 0x61, 0x4b, 0x51, 0xe2, 0xb8, - 0x92, 0x28, 0xa9, 0x4a, 0x22, 0xeb, 0x43, 0x4a, 0xf6, 0x87, 0xd8, 0xce, 0x83, 0x71, 0x28, 0x55, - 0xc2, 0x38, 0x72, 0xec, 0xc8, 0x4c, 0x55, 0x52, 0x2a, 0xa5, 0x52, 0xf7, 0xd5, 0x8f, 0x79, 0x60, - 0x06, 0x9b, 0xa5, 0xec, 0x2a, 0x7f, 0xc2, 0xf4, 0xb9, 0xe7, 0xf7, 0xeb, 0x73, 0xcf, 0x3d, 0xf7, - 0xdc, 0x73, 0x6f, 0x77, 0x03, 0xfe, 0xe0, 0x0a, 0x2c, 0xb5, 0x2d, 0xab, 0x6d, 0xe0, 0x73, 0xb6, - 0x63, 0x79, 0xd6, 0x6e, 0x77, 0xef, 0x5c, 0x0b, 0xbb, 0x9a, 0xa3, 0xdb, 0x9e, 0xe5, 0x2c, 0x53, - 0x19, 0x2a, 0x30, 0x8d, 0x65, 0xa1, 0x51, 0xda, 0x80, 0x99, 0xab, 0xba, 0x81, 0x6b, 0xbe, 0x62, - 0x13, 0x7b, 0xe8, 0x45, 0x48, 0xee, 0xe9, 0x06, 0x2e, 0xc6, 0x96, 0x12, 0x67, 0xb3, 0xe7, 0x1f, - 0x5d, 0xee, 0x01, 0x2d, 0x47, 0x11, 0x0d, 0x22, 0x96, 0x29, 0xa2, 0xf4, 0xed, 0x24, 0xcc, 0x0e, - 0x68, 0x45, 0x08, 0x92, 0xa6, 0xda, 0x21, 0x8c, 0xb1, 0xb3, 0x19, 0x99, 0xfe, 0x46, 0x45, 0x98, - 0xb2, 0x55, 0xed, 0x40, 0x6d, 0xe3, 0x62, 0x9c, 0x8a, 0xc5, 0x25, 0x5a, 0x00, 0x68, 0x61, 0x1b, - 0x9b, 0x2d, 0x6c, 0x6a, 0x87, 0xc5, 0xc4, 0x52, 0xe2, 0x6c, 0x46, 0x0e, 0x49, 0xd0, 0x53, 0x30, - 0x63, 0x77, 0x77, 0x0d, 0x5d, 0x53, 0x42, 0x6a, 0xb0, 0x94, 0x38, 0x3b, 0x29, 0x4b, 0xac, 0xa1, - 0x16, 0x28, 0x9f, 0x81, 0xc2, 0x2d, 0xac, 0x1e, 0x84, 0x55, 0xb3, 0x54, 0x35, 0x4f, 0xc4, 0x21, - 0xc5, 0x2a, 0xe4, 0x3a, 0xd8, 0x75, 0xd5, 0x36, 0x56, 0xbc, 0x43, 0x1b, 0x17, 0x93, 0xb4, 0xf7, - 0x4b, 0x7d, 0xbd, 0xef, 0xed, 0x79, 0x96, 0xa3, 0xb6, 0x0f, 0x6d, 0x8c, 0x56, 0x20, 0x83, 0xcd, - 0x6e, 0x87, 0x31, 0x4c, 0x0e, 0xf1, 0x5f, 0xdd, 0xec, 0x76, 0x7a, 0x59, 0xd2, 0x04, 0xc6, 0x29, - 0xa6, 0x5c, 0xec, 0xdc, 0xd4, 0x35, 0x5c, 0x4c, 0x51, 0x82, 0x33, 0x7d, 0x04, 0x4d, 0xd6, 0xde, - 0xcb, 0x21, 0x70, 0xa8, 0x0a, 0x19, 0x7c, 0xdb, 0xc3, 0xa6, 0xab, 0x5b, 0x66, 0x71, 0x8a, 0x92, - 0x3c, 0x36, 0x60, 0x14, 0xb1, 0xd1, 0xea, 0xa5, 0x08, 0x70, 0xe8, 0x22, 0x4c, 0x59, 0xb6, 0xa7, - 0x5b, 0xa6, 0x5b, 0x4c, 0x2f, 0xc5, 0xce, 0x66, 0xcf, 0x3f, 0x38, 0x30, 0x10, 0xb6, 0x98, 0x8e, - 0x2c, 0x94, 0xd1, 0x1a, 0x48, 0xae, 0xd5, 0x75, 0x34, 0xac, 0x68, 0x56, 0x0b, 0x2b, 0xba, 0xb9, - 0x67, 0x15, 0x33, 0x94, 0x60, 0xb1, 0xbf, 0x23, 0x54, 0xb1, 0x6a, 0xb5, 0xf0, 0x9a, 0xb9, 0x67, - 0xc9, 0x79, 0x37, 0x72, 0x8d, 0x4e, 0x42, 0xca, 0x3d, 0x34, 0x3d, 0xf5, 0x76, 0x31, 0x47, 0x23, - 0x84, 0x5f, 0x95, 0x7e, 0x39, 0x05, 0x85, 0x71, 0x42, 0xec, 0x0a, 0x4c, 0xee, 0x91, 0x5e, 0x16, - 0xe3, 0xc7, 0xf1, 0x01, 0xc3, 0x44, 0x9d, 0x98, 0xba, 0x47, 0x27, 0xae, 0x40, 0xd6, 0xc4, 0xae, - 0x87, 0x5b, 0x2c, 0x22, 0x12, 0x63, 0xc6, 0x14, 0x30, 0x50, 0x7f, 0x48, 0x25, 0xef, 0x29, 0xa4, - 0x5e, 0x83, 0x82, 0x6f, 0x92, 0xe2, 0xa8, 0x66, 0x5b, 0xc4, 0xe6, 0xb9, 0x51, 0x96, 0x2c, 0xd7, - 0x05, 0x4e, 0x26, 0x30, 0x39, 0x8f, 0x23, 0xd7, 0xa8, 0x06, 0x60, 0x99, 0xd8, 0xda, 0x53, 0x5a, - 0x58, 0x33, 0x8a, 0xe9, 0x21, 0x5e, 0xda, 0x22, 0x2a, 0x7d, 0x5e, 0xb2, 0x98, 0x54, 0x33, 0xd0, - 0xe5, 0x20, 0xd4, 0xa6, 0x86, 0x44, 0xca, 0x06, 0x9b, 0x64, 0x7d, 0xd1, 0xb6, 0x03, 0x79, 0x07, - 0x93, 0xb8, 0xc7, 0x2d, 0xde, 0xb3, 0x0c, 0x35, 0x62, 0x79, 0x64, 0xcf, 0x64, 0x0e, 0x63, 0x1d, - 0x9b, 0x76, 0xc2, 0x97, 0xe8, 0x11, 0xf0, 0x05, 0x0a, 0x0d, 0x2b, 0xa0, 0x59, 0x28, 0x27, 0x84, - 0x9b, 0x6a, 0x07, 0xcf, 0xbf, 0x05, 0xf9, 0xa8, 0x7b, 0xd0, 0x1c, 0x4c, 0xba, 0x9e, 0xea, 0x78, - 0x34, 0x0a, 0x27, 0x65, 0x76, 0x81, 0x24, 0x48, 0x60, 0xb3, 0x45, 0xb3, 0xdc, 0xa4, 0x4c, 0x7e, - 0xa2, 0xff, 0x2f, 0xe8, 0x70, 0x82, 0x76, 0xf8, 0xf1, 0xfe, 0x11, 0x8d, 0x30, 0xf7, 0xf6, 0x7b, - 0xfe, 0x12, 0x4c, 0x47, 0x3a, 0x30, 0xee, 0xad, 0x4b, 0x3f, 0x0a, 0x27, 0x06, 0x52, 0xa3, 0xd7, - 0x60, 0xae, 0x6b, 0xea, 0xa6, 0x87, 0x1d, 0xdb, 0xc1, 0x24, 0x62, 0xd9, 0xad, 0x8a, 0xff, 0x65, - 0x6a, 0x48, 0xcc, 0xed, 0x84, 0xb5, 0x19, 0x8b, 0x3c, 0xdb, 0xed, 0x17, 0x3e, 0x99, 0x49, 0xbf, - 0x3f, 0x25, 0xbd, 0xfd, 0xf6, 0xdb, 0x6f, 0xc7, 0x4b, 0xff, 0x2c, 0x05, 0x73, 0x83, 0xe6, 0xcc, - 0xc0, 0xe9, 0x7b, 0x12, 0x52, 0x66, 0xb7, 0xb3, 0x8b, 0x1d, 0xea, 0xa4, 0x49, 0x99, 0x5f, 0xa1, - 0x15, 0x98, 0x34, 0xd4, 0x5d, 0x6c, 0x14, 0x93, 0x4b, 0xb1, 0xb3, 0xf9, 0xf3, 0x4f, 0x8d, 0x35, - 0x2b, 0x97, 0xd7, 0x09, 0x44, 0x66, 0x48, 0xf4, 0x51, 0x48, 0xf2, 0x14, 0x4d, 0x18, 0x9e, 0x1c, - 0x8f, 0x81, 0xcc, 0x25, 0x99, 0xe2, 0xd0, 0x03, 0x90, 0x21, 0x7f, 0x59, 0x6c, 0xa4, 0xa8, 0xcd, - 0x69, 0x22, 0x20, 0x71, 0x81, 0xe6, 0x21, 0x4d, 0xa7, 0x49, 0x0b, 0x8b, 0xa5, 0xcd, 0xbf, 0x26, - 0x81, 0xd5, 0xc2, 0x7b, 0x6a, 0xd7, 0xf0, 0x94, 0x9b, 0xaa, 0xd1, 0xc5, 0x34, 0xe0, 0x33, 0x72, - 0x8e, 0x0b, 0x6f, 0x10, 0x19, 0x5a, 0x84, 0x2c, 0x9b, 0x55, 0xba, 0xd9, 0xc2, 0xb7, 0x69, 0xf6, - 0x9c, 0x94, 0xd9, 0x44, 0x5b, 0x23, 0x12, 0x72, 0xfb, 0x37, 0x5d, 0xcb, 0x14, 0xa1, 0x49, 0x6f, - 0x41, 0x04, 0xf4, 0xf6, 0x97, 0x7a, 0x13, 0xf7, 0x43, 0x83, 0xbb, 0xd7, 0x37, 0x97, 0xce, 0x40, - 0x81, 0x6a, 0x3c, 0xcf, 0x87, 0x5e, 0x35, 0x8a, 0x33, 0x4b, 0xb1, 0xb3, 0x69, 0x39, 0xcf, 0xc4, - 0x5b, 0x5c, 0x5a, 0xfa, 0x6a, 0x1c, 0x92, 0x34, 0xb1, 0x14, 0x20, 0xbb, 0xfd, 0x7a, 0xa3, 0xae, - 0xd4, 0xb6, 0x76, 0x2a, 0xeb, 0x75, 0x29, 0x86, 0xf2, 0x00, 0x54, 0x70, 0x75, 0x7d, 0x6b, 0x65, - 0x5b, 0x8a, 0xfb, 0xd7, 0x6b, 0x9b, 0xdb, 0x17, 0x5f, 0x90, 0x12, 0x3e, 0x60, 0x87, 0x09, 0x92, - 0x61, 0x85, 0xe7, 0xcf, 0x4b, 0x93, 0x48, 0x82, 0x1c, 0x23, 0x58, 0x7b, 0xad, 0x5e, 0xbb, 0xf8, - 0x82, 0x94, 0x8a, 0x4a, 0x9e, 0x3f, 0x2f, 0x4d, 0xa1, 0x69, 0xc8, 0x50, 0x49, 0x65, 0x6b, 0x6b, - 0x5d, 0x4a, 0xfb, 0x9c, 0xcd, 0x6d, 0x79, 0x6d, 0x73, 0x55, 0xca, 0xf8, 0x9c, 0xab, 0xf2, 0xd6, - 0x4e, 0x43, 0x02, 0x9f, 0x61, 0xa3, 0xde, 0x6c, 0xae, 0xac, 0xd6, 0xa5, 0xac, 0xaf, 0x51, 0x79, - 0x7d, 0xbb, 0xde, 0x94, 0x72, 0x11, 0xb3, 0x9e, 0x3f, 0x2f, 0x4d, 0xfb, 0xb7, 0xa8, 0x6f, 0xee, - 0x6c, 0x48, 0x79, 0x34, 0x03, 0xd3, 0xec, 0x16, 0xc2, 0x88, 0x42, 0x8f, 0xe8, 0xe2, 0x0b, 0x92, - 0x14, 0x18, 0xc2, 0x58, 0x66, 0x22, 0x82, 0x8b, 0x2f, 0x48, 0xa8, 0x54, 0x85, 0x49, 0x1a, 0x86, - 0x08, 0x41, 0x7e, 0x7d, 0xa5, 0x52, 0x5f, 0x57, 0xb6, 0x1a, 0xdb, 0x6b, 0x5b, 0x9b, 0x2b, 0xeb, - 0x52, 0x2c, 0x90, 0xc9, 0xf5, 0x57, 0x76, 0xd6, 0xe4, 0x7a, 0x4d, 0x8a, 0x87, 0x65, 0x8d, 0xfa, - 0xca, 0x76, 0xbd, 0x26, 0x25, 0x4a, 0x1a, 0xcc, 0x0d, 0x4a, 0xa8, 0x03, 0xa7, 0x50, 0x28, 0x16, - 0xe2, 0x43, 0x62, 0x81, 0x72, 0xf5, 0xc6, 0x42, 0xe9, 0x5b, 0x71, 0x98, 0x1d, 0xb0, 0xa8, 0x0c, - 0xbc, 0xc9, 0x4b, 0x30, 0xc9, 0x62, 0x99, 0x2d, 0xb3, 0x4f, 0x0c, 0x5c, 0x9d, 0x68, 0x64, 0xf7, - 0x2d, 0xb5, 0x14, 0x17, 0x2e, 0x35, 0x12, 0x43, 0x4a, 0x0d, 0x42, 0xd1, 0x17, 0xb0, 0x7f, 0xa2, - 0x2f, 0xf9, 0xb3, 0xf5, 0xf1, 0xe2, 0x38, 0xeb, 0x23, 0x95, 0x1d, 0x6f, 0x11, 0x98, 0x1c, 0xb0, - 0x08, 0x5c, 0x81, 0x99, 0x3e, 0xa2, 0xb1, 0x93, 0xf1, 0xc7, 0x62, 0x50, 0x1c, 0xe6, 0x9c, 0x11, - 0x29, 0x31, 0x1e, 0x49, 0x89, 0x57, 0x7a, 0x3d, 0xf8, 0xf0, 0xf0, 0x41, 0xe8, 0x1b, 0xeb, 0x2f, - 0xc4, 0xe0, 0xe4, 0xe0, 0x92, 0x72, 0xa0, 0x0d, 0x1f, 0x85, 0x54, 0x07, 0x7b, 0xfb, 0x96, 0x28, - 0xab, 0x1e, 0x1f, 0xb0, 0x58, 0x93, 0xe6, 0xde, 0xc1, 0xe6, 0xa8, 0xf0, 0x6a, 0x9f, 0x18, 0x56, - 0x17, 0x32, 0x6b, 0xfa, 0x2c, 0xfd, 0x44, 0x1c, 0x4e, 0x0c, 0x24, 0x1f, 0x68, 0xe8, 0x43, 0x00, - 0xba, 0x69, 0x77, 0x3d, 0x56, 0x3a, 0xb1, 0x4c, 0x9c, 0xa1, 0x12, 0x9a, 0xbc, 0x48, 0x96, 0xed, - 0x7a, 0x7e, 0x7b, 0x82, 0xb6, 0x03, 0x13, 0x51, 0x85, 0x17, 0x03, 0x43, 0x93, 0xd4, 0xd0, 0x85, - 0x21, 0x3d, 0xed, 0x0b, 0xcc, 0x67, 0x41, 0xd2, 0x0c, 0x1d, 0x9b, 0x9e, 0xe2, 0x7a, 0x0e, 0x56, - 0x3b, 0xba, 0xd9, 0xa6, 0x4b, 0x4d, 0xba, 0x3c, 0xb9, 0xa7, 0x1a, 0x2e, 0x96, 0x0b, 0xac, 0xb9, - 0x29, 0x5a, 0x09, 0x82, 0x06, 0x90, 0x13, 0x42, 0xa4, 0x22, 0x08, 0xd6, 0xec, 0x23, 0x4a, 0x3f, - 0x91, 0x81, 0x6c, 0xa8, 0x00, 0x47, 0x0f, 0x43, 0xee, 0x4d, 0xf5, 0xa6, 0xaa, 0x88, 0x4d, 0x15, - 0xf3, 0x44, 0x96, 0xc8, 0x1a, 0x7c, 0x63, 0xf5, 0x2c, 0xcc, 0x51, 0x15, 0xab, 0xeb, 0x61, 0x47, - 0xd1, 0x0c, 0xd5, 0x75, 0xa9, 0xd3, 0xd2, 0x54, 0x15, 0x91, 0xb6, 0x2d, 0xd2, 0x54, 0x15, 0x2d, - 0xe8, 0x02, 0xcc, 0x52, 0x44, 0xa7, 0x6b, 0x78, 0xba, 0x6d, 0x60, 0x85, 0x6c, 0xf3, 0x5c, 0xba, - 0xe4, 0xf8, 0x96, 0xcd, 0x10, 0x8d, 0x0d, 0xae, 0x40, 0x2c, 0x72, 0x51, 0x0d, 0x1e, 0xa2, 0xb0, - 0x36, 0x36, 0xb1, 0xa3, 0x7a, 0x58, 0xc1, 0x3f, 0xd2, 0x55, 0x0d, 0x57, 0x51, 0xcd, 0x96, 0xb2, - 0xaf, 0xba, 0xfb, 0xc5, 0x39, 0x42, 0x50, 0x89, 0x17, 0x63, 0xf2, 0x69, 0xa2, 0xb8, 0xca, 0xf5, - 0xea, 0x54, 0x6d, 0xc5, 0x6c, 0xbd, 0xac, 0xba, 0xfb, 0xa8, 0x0c, 0x27, 0x29, 0x8b, 0xeb, 0x39, - 0xba, 0xd9, 0x56, 0xb4, 0x7d, 0xac, 0x1d, 0x28, 0x5d, 0x6f, 0xef, 0xc5, 0xe2, 0x03, 0xe1, 0xfb, - 0x53, 0x0b, 0x9b, 0x54, 0xa7, 0x4a, 0x54, 0x76, 0xbc, 0xbd, 0x17, 0x51, 0x13, 0x72, 0x64, 0x30, - 0x3a, 0xfa, 0x5b, 0x58, 0xd9, 0xb3, 0x1c, 0xba, 0x86, 0xe6, 0x07, 0xa4, 0xa6, 0x90, 0x07, 0x97, - 0xb7, 0x38, 0x60, 0xc3, 0x6a, 0xe1, 0xf2, 0x64, 0xb3, 0x51, 0xaf, 0xd7, 0xe4, 0xac, 0x60, 0xb9, - 0x6a, 0x39, 0x24, 0xa0, 0xda, 0x96, 0xef, 0xe0, 0x2c, 0x0b, 0xa8, 0xb6, 0x25, 0xdc, 0x7b, 0x01, - 0x66, 0x35, 0x8d, 0xf5, 0x59, 0xd7, 0x14, 0xbe, 0x19, 0x73, 0x8b, 0x52, 0xc4, 0x59, 0x9a, 0xb6, - 0xca, 0x14, 0x78, 0x8c, 0xbb, 0xe8, 0x32, 0x9c, 0x08, 0x9c, 0x15, 0x06, 0xce, 0xf4, 0xf5, 0xb2, - 0x17, 0x7a, 0x01, 0x66, 0xed, 0xc3, 0x7e, 0x20, 0x8a, 0xdc, 0xd1, 0x3e, 0xec, 0x85, 0x5d, 0x82, - 0x39, 0x7b, 0xdf, 0xee, 0xc7, 0x3d, 0x19, 0xc6, 0x21, 0x7b, 0xdf, 0xee, 0x05, 0x3e, 0x46, 0x77, - 0xe6, 0x0e, 0xd6, 0x54, 0x0f, 0xb7, 0x8a, 0xa7, 0xc2, 0xea, 0xa1, 0x06, 0xb4, 0x0c, 0x92, 0xa6, - 0x29, 0xd8, 0x54, 0x77, 0x0d, 0xac, 0xa8, 0x0e, 0x36, 0x55, 0xb7, 0xb8, 0x48, 0x95, 0x93, 0x9e, - 0xd3, 0xc5, 0x72, 0x5e, 0xd3, 0xea, 0xb4, 0x71, 0x85, 0xb6, 0xa1, 0x27, 0x61, 0xc6, 0xda, 0x7d, - 0x53, 0x63, 0x11, 0xa9, 0xd8, 0x0e, 0xde, 0xd3, 0x6f, 0x17, 0x1f, 0xa5, 0xee, 0x2d, 0x90, 0x06, - 0x1a, 0x8f, 0x0d, 0x2a, 0x46, 0x4f, 0x80, 0xa4, 0xb9, 0xfb, 0xaa, 0x63, 0xd3, 0x94, 0xec, 0xda, - 0xaa, 0x86, 0x8b, 0x8f, 0x31, 0x55, 0x26, 0xdf, 0x14, 0x62, 0x32, 0x23, 0xdc, 0x5b, 0xfa, 0x9e, - 0x27, 0x18, 0xcf, 0xb0, 0x19, 0x41, 0x65, 0x9c, 0xed, 0x2c, 0x48, 0xc4, 0x13, 0x91, 0x1b, 0x9f, - 0xa5, 0x6a, 0x79, 0x7b, 0xdf, 0x0e, 0xdf, 0xf7, 0x11, 0x98, 0x26, 0x9a, 0xc1, 0x4d, 0x9f, 0x60, - 0x85, 0x9b, 0xbd, 0x1f, 0xba, 0xe3, 0x0b, 0x70, 0x92, 0x28, 0x75, 0xb0, 0xa7, 0xb6, 0x54, 0x4f, - 0x0d, 0x69, 0x3f, 0x4d, 0xb5, 0x89, 0xdb, 0x37, 0x78, 0x63, 0xc4, 0x4e, 0xa7, 0xbb, 0x7b, 0xe8, - 0x07, 0xd6, 0x33, 0xcc, 0x4e, 0x22, 0x13, 0xa1, 0xf5, 0xa1, 0x15, 0xe7, 0xa5, 0x32, 0xe4, 0xc2, - 0x71, 0x8f, 0x32, 0xc0, 0x22, 0x5f, 0x8a, 0x91, 0x22, 0xa8, 0xba, 0x55, 0x23, 0xe5, 0xcb, 0x1b, - 0x75, 0x29, 0x4e, 0xca, 0xa8, 0xf5, 0xb5, 0xed, 0xba, 0x22, 0xef, 0x6c, 0x6e, 0xaf, 0x6d, 0xd4, - 0xa5, 0x44, 0xa8, 0xb0, 0xbf, 0x96, 0x4c, 0x3f, 0x2e, 0x9d, 0x21, 0x55, 0x43, 0x3e, 0xba, 0x53, - 0x43, 0x3f, 0x04, 0xa7, 0xc4, 0xb1, 0x8a, 0x8b, 0x3d, 0xe5, 0x96, 0xee, 0xd0, 0x09, 0xd9, 0x51, - 0xd9, 0xe2, 0xe8, 0xc7, 0xcf, 0x1c, 0xd7, 0x6a, 0x62, 0xef, 0x55, 0xdd, 0x21, 0xd3, 0xad, 0xa3, - 0x7a, 0x68, 0x1d, 0x16, 0x4d, 0x4b, 0x71, 0x3d, 0xd5, 0x6c, 0xa9, 0x4e, 0x4b, 0x09, 0x0e, 0xb4, - 0x14, 0x55, 0xd3, 0xb0, 0xeb, 0x5a, 0x6c, 0x21, 0xf4, 0x59, 0x1e, 0x34, 0xad, 0x26, 0x57, 0x0e, - 0x56, 0x88, 0x15, 0xae, 0xda, 0x13, 0xbe, 0x89, 0x61, 0xe1, 0xfb, 0x00, 0x64, 0x3a, 0xaa, 0xad, - 0x60, 0xd3, 0x73, 0x0e, 0x69, 0x7d, 0x9e, 0x96, 0xd3, 0x1d, 0xd5, 0xae, 0x93, 0xeb, 0x1f, 0xc8, - 0x36, 0xe9, 0x5a, 0x32, 0x9d, 0x94, 0x26, 0xaf, 0x25, 0xd3, 0x93, 0x52, 0xea, 0x5a, 0x32, 0x9d, - 0x92, 0xa6, 0xae, 0x25, 0xd3, 0x69, 0x29, 0x73, 0x2d, 0x99, 0xce, 0x48, 0x50, 0xfa, 0xc9, 0x24, - 0xe4, 0xc2, 0x15, 0x3c, 0xd9, 0x10, 0x69, 0x74, 0x0d, 0x8b, 0xd1, 0x2c, 0xf7, 0xc8, 0x91, 0xf5, - 0xfe, 0x72, 0x95, 0x2c, 0x6e, 0xe5, 0x14, 0x2b, 0x97, 0x65, 0x86, 0x24, 0x85, 0x05, 0x09, 0x3f, - 0xcc, 0xca, 0x93, 0xb4, 0xcc, 0xaf, 0xd0, 0x2a, 0xa4, 0xde, 0x74, 0x29, 0x77, 0x8a, 0x72, 0x3f, - 0x7a, 0x34, 0xf7, 0xb5, 0x26, 0x25, 0xcf, 0x5c, 0x6b, 0x2a, 0x9b, 0x5b, 0xf2, 0xc6, 0xca, 0xba, - 0xcc, 0xe1, 0xe8, 0x34, 0x24, 0x0d, 0xf5, 0xad, 0xc3, 0xe8, 0x32, 0x48, 0x45, 0x68, 0x19, 0x0a, - 0x5d, 0xf3, 0x26, 0x76, 0xf4, 0x3d, 0x1d, 0xb7, 0x14, 0xaa, 0x55, 0x08, 0x6b, 0xe5, 0x83, 0xd6, - 0x75, 0xa2, 0x3f, 0xe6, 0x30, 0x9e, 0x86, 0xe4, 0x2d, 0xac, 0x1e, 0x44, 0x17, 0x2b, 0x2a, 0xfa, - 0x10, 0xa7, 0xd3, 0x39, 0x98, 0xa4, 0xfe, 0x45, 0x00, 0xdc, 0xc3, 0xd2, 0x04, 0x4a, 0x43, 0xb2, - 0xba, 0x25, 0x93, 0x29, 0x25, 0x41, 0x8e, 0x49, 0x95, 0xc6, 0x5a, 0xbd, 0x5a, 0x97, 0xe2, 0xa5, - 0x0b, 0x90, 0x62, 0x4e, 0x23, 0xd3, 0xcd, 0x77, 0x9b, 0x34, 0xc1, 0x2f, 0x39, 0x47, 0x4c, 0xb4, - 0xee, 0x6c, 0x54, 0xea, 0xb2, 0x14, 0xef, 0x0b, 0x96, 0x92, 0x0b, 0xb9, 0x70, 0x25, 0xff, 0x83, - 0xd9, 0xce, 0x7f, 0x2d, 0x06, 0xd9, 0x50, 0x65, 0x4e, 0x4a, 0x2a, 0xd5, 0x30, 0xac, 0x5b, 0x8a, - 0x6a, 0xe8, 0xaa, 0xcb, 0x43, 0x09, 0xa8, 0x68, 0x85, 0x48, 0xc6, 0x1d, 0xba, 0x1f, 0xd0, 0x24, - 0x9b, 0x94, 0x52, 0xa5, 0xcf, 0xc6, 0x40, 0xea, 0x2d, 0x8d, 0x7b, 0xcc, 0x8c, 0xfd, 0x61, 0x9a, - 0x59, 0xfa, 0x4c, 0x0c, 0xf2, 0xd1, 0x7a, 0xb8, 0xc7, 0xbc, 0x87, 0xff, 0x50, 0xcd, 0xfb, 0xed, - 0x38, 0x4c, 0x47, 0xaa, 0xe0, 0x71, 0xad, 0xfb, 0x11, 0x98, 0xd1, 0x5b, 0xb8, 0x63, 0x5b, 0x1e, - 0x36, 0xb5, 0x43, 0xc5, 0xc0, 0x37, 0xb1, 0x51, 0x2c, 0xd1, 0x24, 0x73, 0xee, 0xe8, 0x3a, 0x7b, - 0x79, 0x2d, 0xc0, 0xad, 0x13, 0x58, 0x79, 0x76, 0xad, 0x56, 0xdf, 0x68, 0x6c, 0x6d, 0xd7, 0x37, - 0xab, 0xaf, 0x2b, 0x3b, 0x9b, 0xd7, 0x37, 0xb7, 0x5e, 0xdd, 0x94, 0x25, 0xbd, 0x47, 0xed, 0x43, - 0x9c, 0xf6, 0x0d, 0x90, 0x7a, 0x8d, 0x42, 0xa7, 0x60, 0x90, 0x59, 0xd2, 0x04, 0x9a, 0x85, 0xc2, - 0xe6, 0x96, 0xd2, 0x5c, 0xab, 0xd5, 0x95, 0xfa, 0xd5, 0xab, 0xf5, 0xea, 0x76, 0x93, 0x9d, 0x9c, - 0xf8, 0xda, 0xdb, 0x91, 0x09, 0x5e, 0xfa, 0x74, 0x02, 0x66, 0x07, 0x58, 0x82, 0x56, 0xf8, 0x9e, - 0x87, 0x6d, 0xc3, 0x9e, 0x19, 0xc7, 0xfa, 0x65, 0x52, 0x75, 0x34, 0x54, 0xc7, 0xe3, 0x5b, 0xa4, - 0x27, 0x80, 0x78, 0xc9, 0xf4, 0x48, 0x72, 0x75, 0xf8, 0x89, 0x14, 0xdb, 0x08, 0x15, 0x02, 0x39, - 0x3b, 0x94, 0x7a, 0x1a, 0x90, 0x6d, 0xb9, 0xba, 0xa7, 0xdf, 0xc4, 0x8a, 0x6e, 0x8a, 0xe3, 0x2b, - 0xb2, 0x31, 0x4a, 0xca, 0x92, 0x68, 0x59, 0x33, 0x3d, 0x5f, 0xdb, 0xc4, 0x6d, 0xb5, 0x47, 0x9b, - 0x24, 0xff, 0x84, 0x2c, 0x89, 0x16, 0x5f, 0xfb, 0x61, 0xc8, 0xb5, 0xac, 0x2e, 0xa9, 0x16, 0x99, - 0x1e, 0x59, 0x6b, 0x62, 0x72, 0x96, 0xc9, 0x7c, 0x15, 0xbe, 0x0f, 0x08, 0xce, 0xcd, 0x72, 0x72, - 0x96, 0xc9, 0x98, 0xca, 0x19, 0x28, 0xa8, 0xed, 0xb6, 0x43, 0xc8, 0x05, 0x11, 0xdb, 0xd9, 0xe4, - 0x7d, 0x31, 0x55, 0x9c, 0xbf, 0x06, 0x69, 0xe1, 0x07, 0xb2, 0xd8, 0x13, 0x4f, 0x28, 0x36, 0xdb, - 0xae, 0xc7, 0xcf, 0x66, 0xe4, 0xb4, 0x29, 0x1a, 0x1f, 0x86, 0x9c, 0xee, 0x2a, 0xc1, 0x63, 0x80, - 0xf8, 0x52, 0xfc, 0x6c, 0x5a, 0xce, 0xea, 0xae, 0x7f, 0x84, 0x5a, 0xfa, 0x42, 0x1c, 0xf2, 0xd1, - 0xc7, 0x18, 0xa8, 0x06, 0x69, 0xc3, 0xd2, 0x54, 0x1a, 0x5a, 0xec, 0x19, 0xda, 0xd9, 0x11, 0x4f, - 0x3e, 0x96, 0xd7, 0xb9, 0xbe, 0xec, 0x23, 0xe7, 0xff, 0x75, 0x0c, 0xd2, 0x42, 0x8c, 0x4e, 0x42, - 0xd2, 0x56, 0xbd, 0x7d, 0x4a, 0x37, 0x59, 0x89, 0x4b, 0x31, 0x99, 0x5e, 0x13, 0xb9, 0x6b, 0xab, - 0x26, 0x0d, 0x01, 0x2e, 0x27, 0xd7, 0x64, 0x5c, 0x0d, 0xac, 0xb6, 0xe8, 0xb6, 0xc9, 0xea, 0x74, - 0xb0, 0xe9, 0xb9, 0x62, 0x5c, 0xb9, 0xbc, 0xca, 0xc5, 0xe8, 0x29, 0x98, 0xf1, 0x1c, 0x55, 0x37, - 0x22, 0xba, 0x49, 0xaa, 0x2b, 0x89, 0x06, 0x5f, 0xb9, 0x0c, 0xa7, 0x05, 0x6f, 0x0b, 0x7b, 0xaa, - 0xb6, 0x8f, 0x5b, 0x01, 0x28, 0x45, 0x8f, 0x47, 0x4e, 0x71, 0x85, 0x1a, 0x6f, 0x17, 0xd8, 0xd2, - 0xaf, 0xc5, 0x60, 0x46, 0x6c, 0xf4, 0x5a, 0xbe, 0xb3, 0x36, 0x00, 0x54, 0xd3, 0xb4, 0xbc, 0xb0, - 0xbb, 0xfa, 0x43, 0xb9, 0x0f, 0xb7, 0xbc, 0xe2, 0x83, 0xe4, 0x10, 0xc1, 0x7c, 0x07, 0x20, 0x68, - 0x19, 0xea, 0xb6, 0x45, 0xc8, 0xf2, 0x67, 0x54, 0xf4, 0x41, 0x27, 0x3b, 0x1a, 0x00, 0x26, 0x22, - 0x3b, 0x42, 0x34, 0x07, 0x93, 0xbb, 0xb8, 0xad, 0x9b, 0xfc, 0xe4, 0x99, 0x5d, 0x88, 0x03, 0x9c, - 0xa4, 0x7f, 0x80, 0x53, 0xf9, 0x33, 0x30, 0xab, 0x59, 0x9d, 0x5e, 0x73, 0x2b, 0x52, 0xcf, 0xf1, - 0x84, 0xfb, 0x72, 0xec, 0x8d, 0x67, 0xb8, 0x52, 0xdb, 0x32, 0x54, 0xb3, 0xbd, 0x6c, 0x39, 0xed, - 0xe0, 0x41, 0x2d, 0xa9, 0x90, 0xdc, 0xd0, 0xe3, 0x5a, 0x7b, 0xf7, 0x7f, 0xc5, 0x62, 0x3f, 0x17, - 0x4f, 0xac, 0x36, 0x2a, 0x5f, 0x8c, 0xcf, 0xaf, 0x32, 0x60, 0x43, 0x38, 0x43, 0xc6, 0x7b, 0x06, - 0xd6, 0x48, 0x07, 0xe1, 0x77, 0x9f, 0x82, 0xb9, 0xb6, 0xd5, 0xb6, 0x28, 0xd3, 0x39, 0xf2, 0x8b, - 0x3f, 0xe9, 0xcd, 0xf8, 0xd2, 0xf9, 0x91, 0x8f, 0x85, 0xcb, 0x9b, 0x30, 0xcb, 0x95, 0x15, 0xfa, - 0xa8, 0x89, 0x6d, 0x84, 0xd0, 0x91, 0xa7, 0x70, 0xc5, 0x5f, 0xfc, 0x36, 0x5d, 0xbe, 0xe5, 0x19, - 0x0e, 0x25, 0x6d, 0x6c, 0xaf, 0x54, 0x96, 0xe1, 0x44, 0x84, 0x8f, 0x4d, 0x52, 0xec, 0x8c, 0x60, - 0xfc, 0x17, 0x9c, 0x71, 0x36, 0xc4, 0xd8, 0xe4, 0xd0, 0x72, 0x15, 0xa6, 0x8f, 0xc3, 0xf5, 0x2f, - 0x39, 0x57, 0x0e, 0x87, 0x49, 0x56, 0xa1, 0x40, 0x49, 0xb4, 0xae, 0xeb, 0x59, 0x1d, 0x9a, 0x01, - 0x8f, 0xa6, 0xf9, 0x57, 0xdf, 0x66, 0xb3, 0x26, 0x4f, 0x60, 0x55, 0x1f, 0x55, 0x2e, 0x03, 0x7d, - 0xba, 0xd6, 0xc2, 0x9a, 0x31, 0x82, 0xe1, 0xeb, 0xdc, 0x10, 0x5f, 0xbf, 0x7c, 0x03, 0xe6, 0xc8, - 0x6f, 0x9a, 0xa0, 0xc2, 0x96, 0x8c, 0x3e, 0xb2, 0x2b, 0xfe, 0xda, 0xc7, 0xd8, 0xc4, 0x9c, 0xf5, - 0x09, 0x42, 0x36, 0x85, 0x46, 0xb1, 0x8d, 0x3d, 0x0f, 0x3b, 0xae, 0xa2, 0x1a, 0x83, 0xcc, 0x0b, - 0x9d, 0x79, 0x14, 0x7f, 0xe6, 0x3b, 0xd1, 0x51, 0x5c, 0x65, 0xc8, 0x15, 0xc3, 0x28, 0xef, 0xc0, - 0xa9, 0x01, 0x51, 0x31, 0x06, 0xe7, 0xa7, 0x39, 0xe7, 0x5c, 0x5f, 0x64, 0x10, 0xda, 0x06, 0x08, - 0xb9, 0x3f, 0x96, 0x63, 0x70, 0xfe, 0x2c, 0xe7, 0x44, 0x1c, 0x2b, 0x86, 0x94, 0x30, 0x5e, 0x83, - 0x99, 0x9b, 0xd8, 0xd9, 0xb5, 0x5c, 0x7e, 0xce, 0x34, 0x06, 0xdd, 0x67, 0x38, 0x5d, 0x81, 0x03, - 0xe9, 0xc1, 0x13, 0xe1, 0xba, 0x0c, 0xe9, 0x3d, 0x55, 0xc3, 0x63, 0x50, 0xdc, 0xe5, 0x14, 0x53, - 0x44, 0x9f, 0x40, 0x57, 0x20, 0xd7, 0xb6, 0xf8, 0x1a, 0x35, 0x1a, 0xfe, 0x59, 0x0e, 0xcf, 0x0a, - 0x0c, 0xa7, 0xb0, 0x2d, 0xbb, 0x6b, 0x90, 0x05, 0x6c, 0x34, 0xc5, 0x5f, 0x13, 0x14, 0x02, 0xc3, - 0x29, 0x8e, 0xe1, 0xd6, 0x77, 0x04, 0x85, 0x1b, 0xf2, 0xe7, 0x4b, 0x90, 0xb5, 0x4c, 0xe3, 0xd0, - 0x32, 0xc7, 0x31, 0xe2, 0x73, 0x9c, 0x01, 0x38, 0x84, 0x10, 0x5c, 0x81, 0xcc, 0xb8, 0x03, 0xf1, - 0xd7, 0xbf, 0x23, 0xa6, 0x87, 0x18, 0x81, 0x55, 0x28, 0x88, 0x04, 0xa5, 0x5b, 0xe6, 0x18, 0x14, - 0x7f, 0x83, 0x53, 0xe4, 0x43, 0x30, 0xde, 0x0d, 0x0f, 0xbb, 0x5e, 0x1b, 0x8f, 0x43, 0xf2, 0x05, - 0xd1, 0x0d, 0x0e, 0xe1, 0xae, 0xdc, 0xc5, 0xa6, 0xb6, 0x3f, 0x1e, 0xc3, 0x2f, 0x08, 0x57, 0x0a, - 0x0c, 0xa1, 0xa8, 0xc2, 0x74, 0x47, 0x75, 0xdc, 0x7d, 0xd5, 0x18, 0x6b, 0x38, 0xfe, 0x26, 0xe7, - 0xc8, 0xf9, 0x20, 0xee, 0x91, 0xae, 0x79, 0x1c, 0x9a, 0x2f, 0x0a, 0x8f, 0x84, 0x60, 0x7c, 0xea, - 0xb9, 0x1e, 0x3d, 0x94, 0x3b, 0x0e, 0xdb, 0xdf, 0x12, 0x53, 0x8f, 0x61, 0x37, 0xc2, 0x8c, 0x57, - 0x20, 0xe3, 0xea, 0x6f, 0x8d, 0x45, 0xf3, 0x25, 0x31, 0xd2, 0x14, 0x40, 0xc0, 0xaf, 0xc3, 0xe9, - 0x81, 0xcb, 0xc4, 0x18, 0x64, 0x7f, 0x9b, 0x93, 0x9d, 0x1c, 0xb0, 0x54, 0xf0, 0x94, 0x70, 0x5c, - 0xca, 0xbf, 0x23, 0x52, 0x02, 0xee, 0xe1, 0x6a, 0x90, 0x5d, 0x83, 0xab, 0xee, 0x1d, 0xcf, 0x6b, - 0x7f, 0x57, 0x78, 0x8d, 0x61, 0x23, 0x5e, 0xdb, 0x86, 0x93, 0x9c, 0xf1, 0x78, 0xe3, 0xfa, 0xf7, - 0x44, 0x62, 0x65, 0xe8, 0x9d, 0xe8, 0xe8, 0xfe, 0x30, 0xcc, 0xfb, 0xee, 0x14, 0xe5, 0xa9, 0xab, - 0x74, 0x54, 0x7b, 0x0c, 0xe6, 0x5f, 0xe4, 0xcc, 0x22, 0xe3, 0xfb, 0xf5, 0xad, 0xbb, 0xa1, 0xda, - 0x84, 0xfc, 0x35, 0x28, 0x0a, 0xf2, 0xae, 0xe9, 0x60, 0xcd, 0x6a, 0x9b, 0xfa, 0x5b, 0xb8, 0x35, - 0x06, 0xf5, 0x2f, 0xf5, 0x0c, 0xd5, 0x4e, 0x08, 0x4e, 0x98, 0xd7, 0x40, 0xf2, 0x6b, 0x15, 0x45, - 0xef, 0xd8, 0x96, 0xe3, 0x8d, 0x60, 0xfc, 0xb2, 0x18, 0x29, 0x1f, 0xb7, 0x46, 0x61, 0xe5, 0x3a, - 0xb0, 0x27, 0xd5, 0xe3, 0x86, 0xe4, 0x57, 0x38, 0xd1, 0x74, 0x80, 0xe2, 0x89, 0x43, 0xb3, 0x3a, - 0xb6, 0xea, 0x8c, 0x93, 0xff, 0xfe, 0xbe, 0x48, 0x1c, 0x1c, 0xc2, 0x13, 0x07, 0xa9, 0xe8, 0xc8, - 0x6a, 0x3f, 0x06, 0xc3, 0x57, 0x45, 0xe2, 0x10, 0x18, 0x4e, 0x21, 0x0a, 0x86, 0x31, 0x28, 0xfe, - 0x81, 0xa0, 0x10, 0x18, 0x42, 0xf1, 0x4a, 0xb0, 0xd0, 0x3a, 0xb8, 0xad, 0xbb, 0x9e, 0xc3, 0x8a, - 0xe2, 0xa3, 0xa9, 0xfe, 0xe1, 0x77, 0xa2, 0x45, 0x98, 0x1c, 0x82, 0x92, 0x4c, 0xc4, 0x8f, 0x69, - 0xe9, 0x9e, 0x69, 0xb4, 0x61, 0xbf, 0x2c, 0x32, 0x51, 0x08, 0x46, 0x6c, 0x0b, 0x55, 0x88, 0xc4, - 0xed, 0x1a, 0xd9, 0x29, 0x8c, 0x41, 0xf7, 0x8f, 0x7a, 0x8c, 0x6b, 0x0a, 0x2c, 0xe1, 0x0c, 0xd5, - 0x3f, 0x5d, 0xf3, 0x00, 0x1f, 0x8e, 0x15, 0x9d, 0xbf, 0xd2, 0x53, 0xff, 0xec, 0x30, 0x24, 0xcb, - 0x21, 0x85, 0x9e, 0x7a, 0x0a, 0x8d, 0x7a, 0x2f, 0xa9, 0xf8, 0x63, 0x1f, 0xf0, 0xfe, 0x46, 0xcb, - 0xa9, 0xf2, 0x3a, 0x09, 0xf2, 0x68, 0xd1, 0x33, 0x9a, 0xec, 0x63, 0x1f, 0xf8, 0x71, 0x1e, 0xa9, - 0x79, 0xca, 0x57, 0x61, 0x3a, 0x52, 0xf0, 0x8c, 0xa6, 0xfa, 0xb3, 0x9c, 0x2a, 0x17, 0xae, 0x77, - 0xca, 0x17, 0x20, 0x49, 0x8a, 0x97, 0xd1, 0xf0, 0x3f, 0xc7, 0xe1, 0x54, 0xbd, 0xfc, 0x11, 0x48, - 0x8b, 0xa2, 0x65, 0x34, 0xf4, 0xcf, 0x73, 0xa8, 0x0f, 0x21, 0x70, 0x51, 0xb0, 0x8c, 0x86, 0xff, - 0x05, 0x01, 0x17, 0x10, 0x02, 0x1f, 0xdf, 0x85, 0x5f, 0xfb, 0x8b, 0x49, 0xbe, 0xe8, 0x08, 0xdf, - 0x5d, 0x81, 0x29, 0x5e, 0xa9, 0x8c, 0x46, 0x7f, 0x82, 0xdf, 0x5c, 0x20, 0xca, 0x97, 0x60, 0x72, - 0x4c, 0x87, 0xff, 0x25, 0x0e, 0x65, 0xfa, 0xe5, 0x2a, 0x64, 0x43, 0xd5, 0xc9, 0x68, 0xf8, 0x8f, - 0x73, 0x78, 0x18, 0x45, 0x4c, 0xe7, 0xd5, 0xc9, 0x68, 0x82, 0xbf, 0x2c, 0x4c, 0xe7, 0x08, 0xe2, - 0x36, 0x51, 0x98, 0x8c, 0x46, 0x7f, 0x52, 0x78, 0x5d, 0x40, 0xca, 0x2f, 0x41, 0xc6, 0x5f, 0x6c, - 0x46, 0xe3, 0x7f, 0x82, 0xe3, 0x03, 0x0c, 0xf1, 0x40, 0x68, 0xb1, 0x1b, 0x4d, 0xf1, 0x93, 0xc2, - 0x03, 0x21, 0x14, 0x99, 0x46, 0xbd, 0x05, 0xcc, 0x68, 0xa6, 0x9f, 0x12, 0xd3, 0xa8, 0xa7, 0x7e, - 0x21, 0xa3, 0x49, 0x73, 0xfe, 0x68, 0x8a, 0xbf, 0x22, 0x46, 0x93, 0xea, 0x13, 0x33, 0x7a, 0x2b, - 0x82, 0xd1, 0x1c, 0x3f, 0x2d, 0xcc, 0xe8, 0x29, 0x08, 0xca, 0x0d, 0x40, 0xfd, 0xd5, 0xc0, 0x68, - 0xbe, 0x4f, 0x71, 0xbe, 0x99, 0xbe, 0x62, 0xa0, 0xfc, 0x2a, 0x9c, 0x1c, 0x5c, 0x09, 0x8c, 0x66, - 0xfd, 0x99, 0x0f, 0x7a, 0xf6, 0x6e, 0xe1, 0x42, 0xa0, 0xbc, 0x1d, 0x2c, 0x29, 0xe1, 0x2a, 0x60, - 0x34, 0xed, 0xa7, 0x3f, 0x88, 0x26, 0xee, 0x70, 0x11, 0x50, 0x5e, 0x01, 0x08, 0x16, 0xe0, 0xd1, - 0x5c, 0x9f, 0xe1, 0x5c, 0x21, 0x10, 0x99, 0x1a, 0x7c, 0xfd, 0x1d, 0x8d, 0xbf, 0x2b, 0xa6, 0x06, - 0x47, 0x90, 0xa9, 0x21, 0x96, 0xde, 0xd1, 0xe8, 0xcf, 0x8a, 0xa9, 0x21, 0x20, 0x24, 0xb2, 0x43, - 0xab, 0xdb, 0x68, 0x86, 0xcf, 0x89, 0xc8, 0x0e, 0xa1, 0xca, 0x9b, 0x30, 0xd3, 0xb7, 0x20, 0x8e, - 0xa6, 0xfa, 0x39, 0x4e, 0x25, 0xf5, 0xae, 0x87, 0xe1, 0xc5, 0x8b, 0x2f, 0x86, 0xa3, 0xd9, 0x3e, - 0xdf, 0xb3, 0x78, 0xf1, 0xb5, 0xb0, 0x7c, 0x05, 0xd2, 0x66, 0xd7, 0x30, 0xc8, 0xe4, 0x41, 0x47, - 0xbf, 0x4b, 0x58, 0xfc, 0xaf, 0xdf, 0xe3, 0xde, 0x11, 0x80, 0xf2, 0x05, 0x98, 0xc4, 0x9d, 0x5d, - 0xdc, 0x1a, 0x85, 0xfc, 0x9d, 0xef, 0x89, 0x84, 0x49, 0xb4, 0xcb, 0x2f, 0x01, 0xb0, 0xa3, 0x11, - 0xfa, 0xf0, 0x70, 0x04, 0xf6, 0xbf, 0x7d, 0x8f, 0xbf, 0xbc, 0x13, 0x40, 0x02, 0x02, 0xf6, 0x2a, - 0xd0, 0xd1, 0x04, 0xdf, 0x89, 0x12, 0xd0, 0x11, 0xb9, 0x0c, 0x53, 0x6f, 0xba, 0x96, 0xe9, 0xa9, - 0xed, 0x51, 0xe8, 0xdf, 0xe5, 0x68, 0xa1, 0x4f, 0x1c, 0xd6, 0xb1, 0x1c, 0xec, 0xa9, 0x6d, 0x77, - 0x14, 0xf6, 0xbf, 0x73, 0xac, 0x0f, 0x20, 0x60, 0x4d, 0x75, 0xbd, 0x71, 0xfa, 0xfd, 0x7b, 0x02, - 0x2c, 0x00, 0xc4, 0x68, 0xf2, 0xfb, 0x00, 0x1f, 0x8e, 0xc2, 0xfe, 0xbe, 0x30, 0x9a, 0xeb, 0x97, - 0x3f, 0x02, 0x19, 0xf2, 0x93, 0xbd, 0x91, 0x37, 0x02, 0xfc, 0x3f, 0x38, 0x38, 0x40, 0x90, 0x3b, - 0xbb, 0x5e, 0xcb, 0xd3, 0x47, 0x3b, 0xfb, 0xbb, 0x7c, 0xa4, 0x85, 0x7e, 0x79, 0x05, 0xb2, 0xae, - 0xd7, 0x6a, 0x75, 0x79, 0x7d, 0x3a, 0x02, 0xfe, 0x07, 0xdf, 0xf3, 0x8f, 0x2c, 0x7c, 0x0c, 0x19, - 0xed, 0x5b, 0x07, 0x9e, 0x6d, 0xd1, 0x07, 0x1e, 0xa3, 0x18, 0x3e, 0xe0, 0x0c, 0x21, 0x48, 0xb9, - 0x0a, 0x39, 0xd2, 0x17, 0x07, 0xdb, 0x98, 0x3e, 0x9d, 0x1a, 0x41, 0xf1, 0x3f, 0xb9, 0x03, 0x22, - 0xa0, 0xca, 0x9f, 0xfa, 0xfa, 0x7b, 0x0b, 0xb1, 0x6f, 0xbe, 0xb7, 0x10, 0xfb, 0xed, 0xf7, 0x16, - 0x62, 0x9f, 0xfc, 0xd6, 0xc2, 0xc4, 0x37, 0xbf, 0xb5, 0x30, 0xf1, 0x9b, 0xdf, 0x5a, 0x98, 0x18, - 0x7c, 0x4a, 0x0c, 0xab, 0xd6, 0xaa, 0xc5, 0xce, 0x87, 0xdf, 0x78, 0xac, 0xad, 0x7b, 0xfb, 0xdd, - 0xdd, 0x65, 0xcd, 0xea, 0x9c, 0xd3, 0x2c, 0xb7, 0x63, 0xb9, 0xe7, 0xa2, 0xe7, 0xba, 0xf4, 0x17, - 0x7c, 0x3f, 0x46, 0xf6, 0xcc, 0xd1, 0xe3, 0x5c, 0xd5, 0x3c, 0x1c, 0xf6, 0x79, 0xcf, 0x45, 0x48, - 0xac, 0x98, 0x87, 0xe8, 0x34, 0x4b, 0x70, 0x4a, 0xd7, 0x31, 0xf8, 0x6b, 0x61, 0x53, 0xe4, 0x7a, - 0xc7, 0x31, 0xd0, 0x5c, 0xf0, 0xee, 0x66, 0xec, 0x6c, 0x8e, 0xbf, 0x90, 0x59, 0xf9, 0xf1, 0xd8, - 0xf1, 0x7a, 0x92, 0x5e, 0x31, 0x0f, 0x69, 0x47, 0x1a, 0xb1, 0x37, 0x9e, 0x1e, 0x79, 0xce, 0x7d, - 0x60, 0x5a, 0xb7, 0x4c, 0x62, 0xb6, 0xbd, 0x2b, 0xce, 0xb8, 0x17, 0x7a, 0xcf, 0xb8, 0x5f, 0xc5, - 0x86, 0x71, 0x9d, 0xe8, 0x6d, 0x13, 0xc8, 0x6e, 0x8a, 0xbd, 0x81, 0x0c, 0x3f, 0x15, 0x87, 0x85, - 0xbe, 0xe3, 0x6c, 0x1e, 0x04, 0xc3, 0x9c, 0x50, 0x86, 0x74, 0x4d, 0xc4, 0x56, 0x11, 0xa6, 0x5c, - 0xac, 0x59, 0x66, 0xcb, 0xa5, 0x8e, 0x48, 0xc8, 0xe2, 0x92, 0x38, 0xc2, 0x54, 0x4d, 0xcb, 0xe5, - 0x2f, 0x56, 0xb2, 0x8b, 0xca, 0xcf, 0x1e, 0xd3, 0x11, 0xd3, 0xe2, 0x4e, 0xc2, 0x1b, 0xcf, 0x8d, - 0xe9, 0x0d, 0xd1, 0x89, 0xc8, 0xc9, 0xff, 0xb8, 0x5e, 0xf9, 0xe9, 0x38, 0x2c, 0xf6, 0x7a, 0x85, - 0xcc, 0x2c, 0xd7, 0x53, 0x3b, 0xf6, 0x30, 0xb7, 0x5c, 0x81, 0xcc, 0xb6, 0xd0, 0x39, 0xb6, 0x5f, - 0xee, 0x1e, 0xd3, 0x2f, 0x79, 0xff, 0x56, 0xc2, 0x31, 0xe7, 0xc7, 0x74, 0x8c, 0xdf, 0x8f, 0x7b, - 0xf2, 0xcc, 0xff, 0x4e, 0xc1, 0x69, 0x36, 0x9d, 0x14, 0x36, 0x95, 0xd8, 0x05, 0xf7, 0x49, 0x2e, - 0xdc, 0x34, 0xfa, 0x39, 0x49, 0xe9, 0x3a, 0xcc, 0xae, 0x91, 0x6c, 0x41, 0x76, 0x41, 0xc1, 0x13, - 0x9e, 0x81, 0xef, 0x9e, 0x2e, 0x45, 0x0a, 0x7e, 0xfe, 0x84, 0x29, 0x2c, 0x2a, 0xfd, 0x58, 0x0c, - 0xa4, 0xa6, 0xa6, 0x1a, 0xaa, 0xf3, 0xff, 0x4a, 0x85, 0x2e, 0x01, 0xd0, 0x6f, 0x96, 0x82, 0x8f, - 0x8c, 0xf2, 0xe7, 0x8b, 0xcb, 0xe1, 0xce, 0x2d, 0xb3, 0x3b, 0xd1, 0x2f, 0x18, 0x32, 0x54, 0x97, - 0xfc, 0x7c, 0xf2, 0x35, 0x80, 0xa0, 0x01, 0x3d, 0x00, 0xa7, 0x9a, 0xd5, 0x95, 0xf5, 0x15, 0x59, - 0x61, 0x2f, 0xc3, 0x6f, 0x36, 0x1b, 0xf5, 0xea, 0xda, 0xd5, 0xb5, 0x7a, 0x4d, 0x9a, 0x40, 0x27, - 0x01, 0x85, 0x1b, 0xfd, 0xf7, 0x52, 0x4e, 0xc0, 0x4c, 0x58, 0xce, 0xde, 0xa8, 0x8f, 0x93, 0x4a, - 0x51, 0xef, 0xd8, 0x06, 0xa6, 0x8f, 0xfe, 0x14, 0x5d, 0x78, 0x6d, 0x74, 0x11, 0xf2, 0xab, 0xff, - 0x86, 0xbd, 0x65, 0x3d, 0x1b, 0xc0, 0x7d, 0x9f, 0x97, 0xd7, 0x61, 0x46, 0xd5, 0x34, 0x6c, 0x47, - 0x28, 0x47, 0xa4, 0x6a, 0x42, 0x48, 0x1f, 0x66, 0x72, 0x64, 0xc0, 0x76, 0x09, 0x52, 0x2e, 0xed, - 0xfd, 0x28, 0x8a, 0x6f, 0x70, 0x0a, 0xae, 0x5e, 0x36, 0x61, 0x86, 0x54, 0x7e, 0xaa, 0x83, 0x43, - 0x66, 0x1c, 0x7d, 0xce, 0xf0, 0x8f, 0xbf, 0xfc, 0x2c, 0x7d, 0xb4, 0xf9, 0x70, 0x74, 0x58, 0x06, - 0x84, 0x93, 0x2c, 0x71, 0xee, 0xc0, 0x50, 0x0c, 0x79, 0x71, 0x3f, 0x6e, 0xf0, 0xd1, 0x37, 0xfb, - 0x27, 0xfc, 0x66, 0x0b, 0x83, 0x62, 0x20, 0x74, 0xa7, 0x69, 0xce, 0xca, 0x1a, 0x2a, 0xf5, 0x61, - 0x73, 0xfa, 0x8d, 0xa7, 0xfa, 0x57, 0x27, 0xf6, 0xe7, 0x19, 0xca, 0x7c, 0x25, 0x7c, 0x1b, 0x7f, - 0xee, 0xfd, 0x46, 0x02, 0x16, 0xb8, 0xf2, 0xae, 0xea, 0xe2, 0x73, 0x37, 0x9f, 0xdb, 0xc5, 0x9e, - 0xfa, 0xdc, 0x39, 0xcd, 0xd2, 0x45, 0xae, 0x9e, 0xe5, 0xd3, 0x91, 0xb4, 0x2f, 0xf3, 0xf6, 0xf9, - 0x81, 0x0f, 0x34, 0xe7, 0x87, 0x4f, 0xe3, 0xd2, 0x0e, 0x24, 0xab, 0x96, 0x6e, 0x92, 0x54, 0xd5, - 0xc2, 0xa6, 0xd5, 0xe1, 0xb3, 0x87, 0x5d, 0xa0, 0xe7, 0x20, 0xa5, 0x76, 0xac, 0xae, 0xe9, 0xb1, - 0x99, 0x53, 0x39, 0xfd, 0xf5, 0x77, 0x17, 0x27, 0xfe, 0xed, 0xbb, 0x8b, 0x89, 0x35, 0xd3, 0xfb, - 0xf5, 0xaf, 0x3c, 0x03, 0x9c, 0x6a, 0xcd, 0xf4, 0x64, 0xae, 0x58, 0x4e, 0xbe, 0xff, 0xce, 0x62, - 0xac, 0xf4, 0x1a, 0x4c, 0xd5, 0xb0, 0x76, 0x2f, 0xcc, 0x35, 0xac, 0x85, 0x98, 0x6b, 0x58, 0xeb, - 0x61, 0xbe, 0x04, 0xe9, 0x35, 0xd3, 0x63, 0x2f, 0xae, 0x3f, 0x05, 0x09, 0xdd, 0x64, 0xef, 0x42, - 0x1e, 0x69, 0x1b, 0xd1, 0x22, 0xc0, 0x1a, 0xd6, 0x7c, 0x60, 0x0b, 0x6b, 0xbd, 0xc0, 0xfe, 0x5b, - 0x13, 0xad, 0x4a, 0xed, 0x37, 0xff, 0xd3, 0xc2, 0xc4, 0xdb, 0xef, 0x2d, 0x4c, 0x0c, 0x1d, 0xe2, - 0xd2, 0xd0, 0x21, 0x76, 0x5b, 0x07, 0x2c, 0x23, 0xfb, 0x23, 0xfb, 0xc5, 0x24, 0x3c, 0x44, 0xbf, - 0x67, 0x72, 0x3a, 0xba, 0xe9, 0x9d, 0xd3, 0x9c, 0x43, 0xdb, 0xb3, 0x48, 0xde, 0xb4, 0xf6, 0xf8, - 0xc0, 0xce, 0x04, 0xcd, 0xcb, 0xac, 0x79, 0xf0, 0xb0, 0x96, 0xf6, 0x60, 0xb2, 0x41, 0x70, 0xc4, - 0xc5, 0x9e, 0xe5, 0xa9, 0x06, 0x5f, 0x7f, 0xd8, 0x05, 0x91, 0xb2, 0x6f, 0xa0, 0xe2, 0x4c, 0xaa, - 0x8b, 0xcf, 0x9f, 0x0c, 0xac, 0xee, 0xb1, 0x57, 0xc9, 0x13, 0xb4, 0x70, 0x49, 0x13, 0x01, 0x7d, - 0x6b, 0x7c, 0x0e, 0x26, 0xd5, 0x2e, 0x7b, 0x87, 0x21, 0x41, 0x2a, 0x1a, 0x7a, 0x51, 0xba, 0x0e, - 0x53, 0xfc, 0x49, 0x2a, 0x92, 0x20, 0x71, 0x80, 0x0f, 0xe9, 0x7d, 0x72, 0x32, 0xf9, 0x89, 0x96, - 0x61, 0x92, 0x1a, 0xcf, 0xbf, 0x91, 0x29, 0x2e, 0xf7, 0x59, 0xbf, 0x4c, 0x8d, 0x94, 0x99, 0x5a, - 0xe9, 0x1a, 0xa4, 0x6b, 0x56, 0x47, 0x37, 0xad, 0x28, 0x5b, 0x86, 0xb1, 0x51, 0x9b, 0xed, 0x2e, - 0x8f, 0x0a, 0x99, 0x5d, 0xa0, 0x93, 0x90, 0x62, 0x9f, 0x16, 0xf0, 0xf7, 0x30, 0xf8, 0x55, 0xa9, - 0x0a, 0x53, 0x94, 0x7b, 0xcb, 0x26, 0xc9, 0xdf, 0x7f, 0x8b, 0x33, 0xc3, 0x3f, 0x34, 0xe3, 0xf4, - 0xf1, 0xc0, 0x58, 0x04, 0xc9, 0x96, 0xea, 0xa9, 0xbc, 0xdf, 0xf4, 0x77, 0xe9, 0xa3, 0x90, 0xe6, - 0x24, 0x2e, 0x3a, 0x0f, 0x09, 0xcb, 0x76, 0xf9, 0x9b, 0x14, 0xf3, 0xc3, 0xba, 0xb2, 0x65, 0x57, - 0x92, 0x24, 0x66, 0x64, 0xa2, 0x5c, 0x91, 0x87, 0x86, 0xc5, 0x8b, 0xa1, 0xb0, 0x08, 0x0d, 0x79, - 0xe8, 0x27, 0x1b, 0xd2, 0xbe, 0x70, 0xf0, 0x83, 0xe5, 0x73, 0x71, 0x58, 0x08, 0xb5, 0xde, 0xc4, - 0x8e, 0xab, 0x5b, 0x26, 0x8b, 0x28, 0x1e, 0x2d, 0x28, 0x64, 0x24, 0x6f, 0x1f, 0x12, 0x2e, 0x1f, - 0x81, 0xc4, 0x8a, 0x6d, 0xa3, 0x79, 0x48, 0xd3, 0x6b, 0xcd, 0x62, 0xf1, 0x92, 0x94, 0xfd, 0x6b, - 0xd2, 0xe6, 0x5a, 0x7b, 0xde, 0x2d, 0xd5, 0xf1, 0xbf, 0xbe, 0x13, 0xd7, 0xa5, 0xcb, 0x90, 0xa9, - 0x5a, 0xa6, 0x8b, 0x4d, 0xb7, 0x4b, 0x2b, 0x9b, 0x5d, 0xc3, 0xd2, 0x0e, 0x38, 0x03, 0xbb, 0x20, - 0x0e, 0x57, 0x6d, 0x9b, 0x22, 0x93, 0x32, 0xf9, 0xc9, 0xe6, 0x6c, 0xa5, 0x39, 0xd4, 0x45, 0x97, - 0x8f, 0xef, 0x22, 0xde, 0x49, 0xdf, 0x47, 0xdf, 0x8f, 0xc1, 0x83, 0xfd, 0x13, 0xea, 0x00, 0x1f, - 0xba, 0xc7, 0x9d, 0x4f, 0xaf, 0x41, 0xa6, 0x41, 0x3f, 0x81, 0xbf, 0x8e, 0x0f, 0xd1, 0x3c, 0x4c, - 0xe1, 0xd6, 0xf9, 0x0b, 0x17, 0x9e, 0xbb, 0xcc, 0xa2, 0xfd, 0xe5, 0x09, 0x59, 0x08, 0xd0, 0x02, - 0x64, 0x5c, 0xac, 0xd9, 0xe7, 0x2f, 0x5c, 0x3c, 0x78, 0x8e, 0x85, 0xd7, 0xcb, 0x13, 0x72, 0x20, - 0x2a, 0xa7, 0x49, 0xaf, 0xdf, 0xff, 0xdc, 0x62, 0xac, 0x32, 0x09, 0x09, 0xb7, 0xdb, 0xf9, 0x50, - 0x63, 0xe4, 0xd3, 0x93, 0xb0, 0x14, 0x46, 0xd2, 0xfa, 0xef, 0xa6, 0x6a, 0xe8, 0x2d, 0x35, 0xf8, - 0xe7, 0x05, 0x52, 0xc8, 0x07, 0x54, 0x63, 0xc8, 0x4a, 0x71, 0xa4, 0x27, 0x4b, 0xbf, 0x14, 0x83, - 0xdc, 0x0d, 0xc1, 0xdc, 0xc4, 0x1e, 0xba, 0x02, 0xe0, 0xdf, 0x49, 0x4c, 0x9b, 0x07, 0x96, 0x7b, - 0xef, 0xb5, 0xec, 0x63, 0xe4, 0x90, 0x3a, 0xba, 0x44, 0x03, 0xd1, 0xb6, 0x5c, 0xfe, 0x45, 0xd6, - 0x08, 0xa8, 0xaf, 0x8c, 0x9e, 0x06, 0x44, 0x33, 0x9c, 0x72, 0xd3, 0xf2, 0x74, 0xb3, 0xad, 0xd8, - 0xd6, 0x2d, 0xfe, 0x9d, 0x6b, 0x42, 0x96, 0x68, 0xcb, 0x0d, 0xda, 0xd0, 0x20, 0x72, 0x62, 0x74, - 0xc6, 0x67, 0x21, 0xc5, 0xba, 0xda, 0x6a, 0x39, 0xd8, 0x75, 0x79, 0x12, 0x13, 0x97, 0xe8, 0x0a, - 0x4c, 0xd9, 0xdd, 0x5d, 0x45, 0x64, 0x8c, 0xec, 0xf9, 0x07, 0x07, 0xcd, 0x7f, 0x11, 0x1f, 0x3c, - 0x03, 0xa4, 0xec, 0xee, 0x2e, 0x89, 0x96, 0x87, 0x21, 0x37, 0xc0, 0x98, 0xec, 0xcd, 0xc0, 0x0e, - 0xfa, 0x9f, 0x17, 0x78, 0x0f, 0x14, 0xdb, 0xd1, 0x2d, 0x47, 0xf7, 0x0e, 0xe9, 0xeb, 0x50, 0x09, - 0x59, 0x12, 0x0d, 0x0d, 0x2e, 0x2f, 0x1d, 0x40, 0xa1, 0x49, 0x8b, 0xb8, 0xc0, 0xf2, 0x0b, 0x81, - 0x7d, 0xb1, 0xd1, 0xf6, 0x0d, 0xb5, 0x2c, 0xde, 0x67, 0x59, 0xe5, 0x95, 0xa1, 0xd1, 0x79, 0xe9, - 0xf8, 0xd1, 0x19, 0x5d, 0xed, 0x7e, 0xef, 0x74, 0x64, 0x72, 0xb2, 0xe0, 0x0c, 0xa7, 0xaf, 0x71, - 0x03, 0x73, 0xd4, 0x1e, 0x6d, 0xfe, 0xe8, 0x45, 0x75, 0x7e, 0x44, 0x1a, 0x9d, 0x1f, 0x39, 0x85, - 0x4a, 0x97, 0x61, 0xba, 0xa1, 0x3a, 0x5e, 0x13, 0x7b, 0x2f, 0x63, 0xb5, 0x85, 0x9d, 0xe8, 0xaa, - 0x3b, 0x2d, 0x56, 0x5d, 0x04, 0x49, 0xba, 0xb4, 0xb2, 0x55, 0x87, 0xfe, 0x2e, 0xed, 0x43, 0x92, - 0xbe, 0x12, 0xe9, 0xaf, 0xc8, 0x1c, 0xc1, 0x56, 0x64, 0x92, 0x4b, 0x0f, 0x3d, 0xec, 0x8a, 0x63, - 0x04, 0x7a, 0x81, 0x5e, 0x10, 0xeb, 0x6a, 0xe2, 0xe8, 0x75, 0x95, 0x07, 0x22, 0x5f, 0x5d, 0x0d, - 0x98, 0xaa, 0x90, 0x54, 0xbc, 0x56, 0xf3, 0x0d, 0x89, 0x05, 0x86, 0xa0, 0x0d, 0x28, 0xd8, 0xaa, - 0xe3, 0xd1, 0xaf, 0x49, 0xf6, 0x69, 0x2f, 0x78, 0xac, 0x2f, 0xf6, 0xcf, 0xbc, 0x48, 0x67, 0xf9, - 0x5d, 0xa6, 0xed, 0xb0, 0xb0, 0xf4, 0x9f, 0x93, 0x90, 0xe2, 0xce, 0xf8, 0x08, 0x4c, 0x71, 0xb7, - 0xf2, 0xe8, 0x7c, 0x68, 0xb9, 0x7f, 0x61, 0x5a, 0xf6, 0x17, 0x10, 0xce, 0x27, 0x30, 0xe8, 0x71, - 0x48, 0x6b, 0xfb, 0xaa, 0x6e, 0x2a, 0x7a, 0x8b, 0x17, 0x84, 0xd9, 0xf7, 0xde, 0x5d, 0x9c, 0xaa, - 0x12, 0xd9, 0x5a, 0x4d, 0x9e, 0xa2, 0x8d, 0x6b, 0x2d, 0x52, 0x09, 0xec, 0x63, 0xbd, 0xbd, 0xef, - 0xf1, 0x19, 0xc6, 0xaf, 0xd0, 0x8b, 0x90, 0x24, 0x01, 0xc1, 0xbf, 0x35, 0x9c, 0xef, 0xab, 0xf0, - 0xfd, 0x2d, 0x74, 0x25, 0x4d, 0x6e, 0xfc, 0xc9, 0xff, 0xb8, 0x18, 0x93, 0x29, 0x02, 0x55, 0x61, - 0xda, 0x50, 0x5d, 0x4f, 0xa1, 0x2b, 0x18, 0xb9, 0xfd, 0x24, 0xa5, 0x38, 0xdd, 0xef, 0x10, 0xee, - 0x58, 0x6e, 0x7a, 0x96, 0xa0, 0x98, 0xa8, 0x85, 0xce, 0x82, 0x44, 0x49, 0x34, 0xab, 0xd3, 0xd1, - 0x3d, 0x56, 0x5b, 0xa5, 0xa8, 0xdf, 0xf3, 0x44, 0x5e, 0xa5, 0x62, 0x5a, 0x61, 0x3d, 0x00, 0x19, - 0xfa, 0x75, 0x13, 0x55, 0x61, 0xef, 0xe1, 0xa6, 0x89, 0x80, 0x36, 0x9e, 0x81, 0x42, 0x90, 0x1f, - 0x99, 0x4a, 0x9a, 0xb1, 0x04, 0x62, 0xaa, 0xf8, 0x2c, 0xcc, 0x99, 0xf8, 0x36, 0x7d, 0x33, 0x38, - 0xa2, 0x9d, 0xa1, 0xda, 0x88, 0xb4, 0xdd, 0x88, 0x22, 0x1e, 0x83, 0xbc, 0x26, 0x9c, 0xcf, 0x74, - 0x81, 0xea, 0x4e, 0xfb, 0x52, 0xaa, 0x76, 0x1a, 0xd2, 0xaa, 0x6d, 0x33, 0x85, 0x2c, 0xcf, 0x8f, - 0xb6, 0x4d, 0x9b, 0x9e, 0x84, 0x19, 0xda, 0x47, 0x07, 0xbb, 0x5d, 0xc3, 0xe3, 0x24, 0x39, 0xaa, - 0x53, 0x20, 0x0d, 0x32, 0x93, 0x53, 0xdd, 0x47, 0x60, 0x1a, 0xdf, 0xd4, 0x5b, 0xd8, 0xd4, 0x30, - 0xd3, 0x9b, 0xa6, 0x7a, 0x39, 0x21, 0xa4, 0x4a, 0x4f, 0x80, 0x9f, 0xf7, 0x14, 0x91, 0x93, 0xf3, - 0x8c, 0x4f, 0xc8, 0x57, 0x98, 0xb8, 0x54, 0x84, 0x64, 0x4d, 0xf5, 0x54, 0x52, 0x60, 0x78, 0xb7, - 0xd9, 0x42, 0x93, 0x93, 0xc9, 0xcf, 0xd2, 0xfb, 0x71, 0x48, 0xde, 0xb0, 0x3c, 0x8c, 0x9e, 0x0f, - 0x15, 0x80, 0xf9, 0x41, 0xf1, 0xdc, 0xd4, 0xdb, 0x26, 0x6e, 0x6d, 0xb8, 0xed, 0xd0, 0xbf, 0x22, - 0x08, 0xc2, 0x29, 0x1e, 0x09, 0xa7, 0x39, 0x98, 0x74, 0xac, 0xae, 0xd9, 0x12, 0xaf, 0xb0, 0xd2, - 0x0b, 0x54, 0x87, 0xb4, 0x1f, 0x25, 0xc9, 0x51, 0x51, 0x52, 0x20, 0x51, 0x42, 0x62, 0x98, 0x0b, - 0xe4, 0xa9, 0x5d, 0x1e, 0x2c, 0x15, 0xc8, 0xf8, 0xc9, 0x8b, 0x47, 0xdb, 0x78, 0x01, 0x1b, 0xc0, - 0xc8, 0x62, 0xe2, 0x8f, 0xbd, 0xef, 0x3c, 0x16, 0x71, 0x92, 0xdf, 0xc0, 0xbd, 0x17, 0x09, 0x2b, - 0xfe, 0x6f, 0x11, 0xa6, 0x68, 0xbf, 0x82, 0xb0, 0x62, 0xff, 0x1a, 0xe1, 0x41, 0xc8, 0xb8, 0x7a, - 0xdb, 0x54, 0xbd, 0xae, 0x83, 0x79, 0xe4, 0x05, 0x82, 0xd2, 0xd7, 0x62, 0x90, 0x62, 0x91, 0x1c, - 0xf2, 0x5b, 0x6c, 0xb0, 0xdf, 0xe2, 0xc3, 0xfc, 0x96, 0xb8, 0x77, 0xbf, 0xad, 0x00, 0xf8, 0xc6, - 0xb8, 0xfc, 0x6b, 0xf5, 0x01, 0x15, 0x03, 0x33, 0xb1, 0xa9, 0xb7, 0xf9, 0x44, 0x0d, 0x81, 0x4a, - 0xff, 0x21, 0x46, 0x8a, 0x58, 0xde, 0x8e, 0x56, 0x60, 0x5a, 0xd8, 0xa5, 0xec, 0x19, 0x6a, 0x9b, - 0xc7, 0xce, 0x43, 0x43, 0x8d, 0xbb, 0x6a, 0xa8, 0x6d, 0x39, 0xcb, 0xed, 0x21, 0x17, 0x83, 0xc7, - 0x21, 0x3e, 0x64, 0x1c, 0x22, 0x03, 0x9f, 0xb8, 0xb7, 0x81, 0x8f, 0x0c, 0x51, 0xb2, 0x77, 0x88, - 0xbe, 0x1c, 0xa7, 0x9b, 0x19, 0xdb, 0x72, 0x55, 0xe3, 0x07, 0x31, 0x23, 0x1e, 0x80, 0x8c, 0x6d, - 0x19, 0x0a, 0x6b, 0x61, 0xaf, 0x76, 0xa7, 0x6d, 0xcb, 0x90, 0xfb, 0x86, 0x7d, 0xf2, 0x3e, 0x4d, - 0x97, 0xd4, 0x7d, 0xf0, 0xda, 0x54, 0xaf, 0xd7, 0x1c, 0xc8, 0x31, 0x57, 0xf0, 0xb5, 0xec, 0x59, - 0xe2, 0x03, 0xba, 0x38, 0xc6, 0xfa, 0xd7, 0x5e, 0x66, 0x36, 0xd3, 0x94, 0xb9, 0x1e, 0x41, 0xb0, - 0xd4, 0x3f, 0x68, 0x17, 0x1c, 0x0e, 0x4b, 0x99, 0xeb, 0x95, 0xfe, 0x6a, 0x0c, 0x60, 0x9d, 0x78, - 0x96, 0xf6, 0x97, 0xac, 0x42, 0x2e, 0x35, 0x41, 0x89, 0xdc, 0x79, 0x61, 0xd8, 0xa0, 0xf1, 0xfb, - 0xe7, 0xdc, 0xb0, 0xdd, 0x55, 0x98, 0x0e, 0x82, 0xd1, 0xc5, 0xc2, 0x98, 0x85, 0x23, 0xaa, 0xea, - 0x26, 0xf6, 0xe4, 0xdc, 0xcd, 0xd0, 0x55, 0xe9, 0x9f, 0xc7, 0x20, 0x43, 0x6d, 0xda, 0xc0, 0x9e, - 0x1a, 0x19, 0xc3, 0xd8, 0xbd, 0x8f, 0xe1, 0x43, 0x00, 0x8c, 0xc6, 0xd5, 0xdf, 0xc2, 0x3c, 0xb2, - 0x32, 0x54, 0xd2, 0xd4, 0xdf, 0xc2, 0xe8, 0xa2, 0xef, 0xf0, 0xc4, 0xd1, 0x0e, 0x17, 0x55, 0x37, - 0x77, 0xfb, 0x29, 0x98, 0xa2, 0xff, 0xdd, 0xe9, 0xb6, 0xcb, 0x0b, 0xe9, 0x94, 0xd9, 0xed, 0x6c, - 0xdf, 0x76, 0x4b, 0x6f, 0xc2, 0xd4, 0xf6, 0x6d, 0x76, 0x36, 0xf2, 0x00, 0x64, 0x1c, 0xcb, 0xe2, - 0x6b, 0x32, 0xab, 0x85, 0xd2, 0x44, 0x40, 0x97, 0x20, 0x71, 0x1e, 0x10, 0x0f, 0xce, 0x03, 0x82, - 0x03, 0x8d, 0xc4, 0x58, 0x07, 0x1a, 0x4f, 0xfe, 0x46, 0x0c, 0xb2, 0xa1, 0xfc, 0x80, 0x9e, 0x83, - 0x13, 0x95, 0xf5, 0xad, 0xea, 0x75, 0x65, 0xad, 0xa6, 0x5c, 0x5d, 0x5f, 0x59, 0x0d, 0x3e, 0x5e, - 0x9a, 0x3f, 0x79, 0xe7, 0xee, 0x12, 0x0a, 0xe9, 0xee, 0x98, 0xf4, 0x9c, 0x1e, 0x9d, 0x83, 0xb9, - 0x28, 0x64, 0xa5, 0xd2, 0xac, 0x6f, 0x6e, 0x4b, 0xb1, 0xf9, 0x13, 0x77, 0xee, 0x2e, 0xcd, 0x84, - 0x10, 0x2b, 0xbb, 0x2e, 0x36, 0xbd, 0x7e, 0x40, 0x75, 0x6b, 0x63, 0x63, 0x6d, 0x5b, 0x8a, 0xf7, - 0x01, 0x78, 0xc2, 0x7e, 0x02, 0x66, 0xa2, 0x80, 0xcd, 0xb5, 0x75, 0x29, 0x31, 0x8f, 0xee, 0xdc, - 0x5d, 0xca, 0x87, 0xb4, 0x37, 0x75, 0x63, 0x3e, 0xfd, 0xf1, 0xcf, 0x2f, 0x4c, 0xfc, 0xc2, 0xcf, - 0x2f, 0xc4, 0x48, 0xcf, 0xa6, 0x23, 0x39, 0x02, 0x3d, 0x0d, 0xa7, 0x9a, 0x6b, 0xab, 0x9b, 0xf5, - 0x9a, 0xb2, 0xd1, 0x5c, 0x15, 0x27, 0xdd, 0xa2, 0x77, 0x85, 0x3b, 0x77, 0x97, 0xb2, 0xbc, 0x4b, - 0xc3, 0xb4, 0x1b, 0x72, 0xfd, 0xc6, 0xd6, 0x76, 0x5d, 0x8a, 0x31, 0xed, 0x86, 0x83, 0x6f, 0x5a, - 0x1e, 0xfb, 0xf7, 0x6f, 0xcf, 0xc2, 0xe9, 0x01, 0xda, 0x7e, 0xc7, 0x66, 0xee, 0xdc, 0x5d, 0x9a, - 0x6e, 0x38, 0x98, 0xcd, 0x1f, 0x8a, 0x58, 0x86, 0x62, 0x3f, 0x62, 0xab, 0xb1, 0xd5, 0x5c, 0x59, - 0x97, 0x96, 0xe6, 0xa5, 0x3b, 0x77, 0x97, 0x72, 0x22, 0x19, 0x12, 0xfd, 0xa0, 0x67, 0x1f, 0xe6, - 0x8e, 0xe7, 0xfd, 0xa7, 0xe0, 0x51, 0x7e, 0x06, 0xe8, 0x7a, 0xea, 0x81, 0x6e, 0xb6, 0xfd, 0xc3, - 0x5b, 0x7e, 0xcd, 0x77, 0x3e, 0x27, 0xf9, 0x39, 0xa3, 0x90, 0x8e, 0x38, 0xc2, 0x1d, 0xfa, 0xe4, - 0x72, 0x7e, 0xc4, 0x43, 0xbd, 0xd1, 0x5b, 0xa7, 0xe1, 0xc7, 0xc3, 0xf3, 0x23, 0x0e, 0xa1, 0xe7, - 0x8f, 0xdc, 0xdc, 0x95, 0x3e, 0x11, 0x83, 0xfc, 0xcb, 0xba, 0xeb, 0x59, 0x8e, 0xae, 0xa9, 0x06, - 0xfd, 0x64, 0xe9, 0xe2, 0xb8, 0xb9, 0xb5, 0x67, 0xaa, 0xbf, 0x04, 0xa9, 0x9b, 0xaa, 0xc1, 0x92, - 0x5a, 0xf8, 0x59, 0x40, 0xaf, 0xfb, 0x82, 0xd4, 0x26, 0x08, 0x18, 0xac, 0xf4, 0xa5, 0x38, 0x14, - 0xe8, 0x64, 0x70, 0xd9, 0x7f, 0xef, 0x22, 0x7b, 0xac, 0x06, 0x24, 0x1d, 0xd5, 0xe3, 0x87, 0x86, - 0x95, 0x1f, 0xe2, 0xe7, 0xc0, 0x8f, 0x8f, 0x3e, 0xcd, 0x5d, 0xee, 0x3f, 0x2a, 0xa6, 0x4c, 0xe8, - 0x55, 0x48, 0x77, 0xd4, 0xdb, 0x0a, 0x65, 0x8d, 0xdf, 0x07, 0xd6, 0xa9, 0x8e, 0x7a, 0x9b, 0xd8, - 0x8a, 0x5a, 0x50, 0x20, 0xc4, 0xda, 0xbe, 0x6a, 0xb6, 0x31, 0xe3, 0x4f, 0xdc, 0x07, 0xfe, 0xe9, - 0x8e, 0x7a, 0xbb, 0x4a, 0x39, 0xc9, 0x5d, 0xca, 0xe9, 0x4f, 0xbd, 0xb3, 0x38, 0x41, 0x8f, 0xd9, - 0x7f, 0x25, 0x06, 0x10, 0xb8, 0x0b, 0xfd, 0xff, 0x20, 0x69, 0xfe, 0x15, 0xbd, 0xbd, 0xcb, 0x07, - 0xf0, 0xcc, 0xb0, 0x81, 0xe8, 0x71, 0x36, 0x5b, 0x98, 0xbf, 0xf9, 0xee, 0x62, 0x4c, 0x2e, 0x68, - 0x3d, 0xe3, 0x50, 0x87, 0x6c, 0xd7, 0x6e, 0xa9, 0x1e, 0x56, 0xe8, 0x26, 0x2e, 0x7e, 0x8c, 0x45, - 0x1e, 0x18, 0x90, 0x34, 0x85, 0xac, 0xff, 0x52, 0x0c, 0xb2, 0xb5, 0xd0, 0x43, 0xbe, 0x22, 0x4c, - 0x75, 0x2c, 0x53, 0x3f, 0xe0, 0x61, 0x97, 0x91, 0xc5, 0x25, 0x9a, 0x87, 0x34, 0xfb, 0x58, 0xd3, - 0x3b, 0x14, 0x27, 0x9e, 0xe2, 0x9a, 0xa0, 0x6e, 0xe1, 0x5d, 0x57, 0x17, 0xbe, 0x96, 0xc5, 0x25, - 0xd9, 0xba, 0xb8, 0x58, 0xeb, 0x3a, 0xba, 0x77, 0xa8, 0x68, 0x96, 0xe9, 0xa9, 0x9a, 0xc7, 0x3f, - 0xfb, 0x2b, 0x08, 0x79, 0x95, 0x89, 0x09, 0x49, 0x0b, 0x7b, 0xaa, 0x6e, 0xb8, 0x45, 0xf6, 0x20, - 0x4c, 0x5c, 0x86, 0xcc, 0xfd, 0xd5, 0x54, 0xf8, 0x88, 0xaa, 0x0a, 0x92, 0x65, 0x63, 0x27, 0x52, - 0x52, 0xb2, 0x08, 0x2d, 0xfe, 0xfa, 0x57, 0x9e, 0x99, 0xe3, 0xee, 0xe6, 0x45, 0x25, 0x7b, 0xaf, - 0x55, 0x2e, 0x08, 0x84, 0xa8, 0x35, 0x5f, 0x27, 0x03, 0x26, 0xf6, 0x7b, 0x76, 0x77, 0x37, 0x38, - 0xd6, 0x9a, 0xeb, 0xf3, 0xeb, 0x8a, 0x79, 0x58, 0x29, 0x7e, 0x23, 0xa0, 0x0e, 0xce, 0x92, 0xae, - 0xe3, 0x43, 0x32, 0x5a, 0x9c, 0xa7, 0x41, 0x69, 0x48, 0x89, 0xf8, 0xa6, 0xaa, 0x1b, 0xe2, 0x1b, - 0x74, 0x99, 0x5f, 0xa1, 0x32, 0xa4, 0x5c, 0x4f, 0xf5, 0xba, 0x2e, 0xff, 0xdf, 0x72, 0xa5, 0x61, - 0x91, 0x51, 0xb1, 0xcc, 0x56, 0x93, 0x6a, 0xca, 0x1c, 0x81, 0xb6, 0x21, 0xe5, 0x59, 0x07, 0xd8, - 0xe4, 0x4e, 0x3a, 0x56, 0x54, 0x0f, 0x78, 0x16, 0xc5, 0xb8, 0x50, 0x1b, 0xa4, 0x16, 0x36, 0x70, - 0x9b, 0x15, 0x44, 0xfb, 0x2a, 0xd9, 0x37, 0xa4, 0xee, 0xc3, 0xac, 0x29, 0xf8, 0xac, 0x4d, 0x4a, - 0x8a, 0xae, 0x47, 0x1f, 0x33, 0xb3, 0x7f, 0xc4, 0xf8, 0xc8, 0xb0, 0xfe, 0x87, 0x22, 0x53, 0x1c, - 0x26, 0x84, 0x9f, 0x48, 0x3f, 0x01, 0x52, 0xd7, 0xdc, 0xb5, 0x4c, 0xfa, 0xa5, 0x28, 0x2f, 0xc6, - 0xd3, 0xb4, 0xbc, 0x29, 0xf8, 0xf2, 0x97, 0x59, 0x55, 0x7e, 0x1d, 0xf2, 0x81, 0x2a, 0x9d, 0x3b, - 0x99, 0x63, 0xcc, 0x9d, 0x69, 0x1f, 0x4b, 0x5a, 0xd1, 0xcb, 0x00, 0xc1, 0xc4, 0xa4, 0xc7, 0x03, - 0xd9, 0xe1, 0x63, 0x18, 0xcc, 0x6e, 0xb1, 0xcd, 0x0a, 0xb0, 0xc8, 0x80, 0xd9, 0x8e, 0x6e, 0x2a, - 0x2e, 0x36, 0xf6, 0x14, 0xee, 0x2a, 0x42, 0x99, 0xbd, 0x0f, 0x43, 0x3b, 0xd3, 0xd1, 0xcd, 0x26, - 0x36, 0xf6, 0x6a, 0x3e, 0x6d, 0x39, 0xf7, 0xf1, 0x77, 0x16, 0x27, 0xf8, 0x5c, 0x9a, 0x28, 0x35, - 0xe8, 0x11, 0x35, 0x9f, 0x06, 0xd8, 0x45, 0x17, 0x21, 0xa3, 0x8a, 0x0b, 0x7a, 0x70, 0x70, 0xd4, - 0x34, 0x0a, 0x54, 0xd9, 0xec, 0x7c, 0xfb, 0xdf, 0x2f, 0xc5, 0x4a, 0x3f, 0x1f, 0x83, 0x54, 0xed, - 0x46, 0x43, 0xd5, 0x1d, 0x54, 0x87, 0x99, 0x20, 0xa0, 0xc6, 0x9d, 0x9b, 0x41, 0x0c, 0x8a, 0xc9, - 0x59, 0x1f, 0xb6, 0x6b, 0x3c, 0x92, 0xa6, 0x77, 0x3f, 0xd9, 0xd3, 0xf1, 0x3a, 0x4c, 0x31, 0x2b, - 0x5d, 0x54, 0x86, 0x49, 0x9b, 0xfc, 0xe0, 0x27, 0xf2, 0x0b, 0x43, 0x03, 0x91, 0xea, 0xfb, 0x27, - 0x88, 0x04, 0x52, 0xfa, 0x7e, 0x0c, 0xa0, 0x76, 0xe3, 0xc6, 0xb6, 0xa3, 0xdb, 0x06, 0xf6, 0xee, - 0x57, 0x8f, 0xd7, 0xe1, 0x44, 0x68, 0x6b, 0xe2, 0x68, 0x63, 0xf7, 0x7a, 0x36, 0xd8, 0x9c, 0x38, - 0xda, 0x40, 0xb6, 0x96, 0xeb, 0xf9, 0x6c, 0x89, 0xb1, 0xd9, 0x6a, 0xae, 0x37, 0xd8, 0x8d, 0x4d, - 0xc8, 0x06, 0xdd, 0x77, 0x51, 0x0d, 0xd2, 0x1e, 0xff, 0xcd, 0xbd, 0x59, 0x1a, 0xee, 0x4d, 0x01, - 0xe3, 0x1e, 0xf5, 0x91, 0xa5, 0xff, 0x43, 0x9c, 0xea, 0x47, 0xec, 0x1f, 0xad, 0x30, 0x22, 0xb9, - 0x97, 0xe7, 0xc6, 0xfb, 0x51, 0x51, 0x70, 0xae, 0x1e, 0xaf, 0x7e, 0x2c, 0x0e, 0xb3, 0x3b, 0x22, - 0xdb, 0xfc, 0x91, 0xf5, 0x44, 0x03, 0xa6, 0xb0, 0xe9, 0x39, 0x3a, 0x75, 0x05, 0x19, 0xeb, 0x67, - 0x87, 0x8d, 0xf5, 0x80, 0xbe, 0xd0, 0x7f, 0x71, 0x24, 0xce, 0xb5, 0x39, 0x4d, 0x8f, 0x17, 0xfe, - 0x5d, 0x1c, 0x8a, 0xc3, 0x90, 0xe8, 0x0c, 0x14, 0x34, 0x07, 0x53, 0x81, 0x12, 0x39, 0x5c, 0xcb, - 0x0b, 0x31, 0x4f, 0xfa, 0x1b, 0x40, 0x0a, 0x28, 0x12, 0x58, 0x44, 0xf5, 0xd8, 0x15, 0x53, 0x3e, - 0x00, 0xd3, 0xb4, 0x8f, 0xa1, 0xa0, 0x9b, 0xba, 0xa7, 0xab, 0x86, 0xb2, 0xab, 0x1a, 0xaa, 0xa9, - 0xdd, 0x4b, 0x65, 0xd9, 0x9f, 0xa8, 0xf3, 0x9c, 0xb4, 0xc2, 0x38, 0xd1, 0x0d, 0x98, 0x12, 0xf4, - 0xc9, 0xfb, 0x40, 0x2f, 0xc8, 0x42, 0x55, 0xd4, 0x6f, 0xc5, 0x61, 0x46, 0xc6, 0xad, 0x3f, 0x5e, - 0x6e, 0xfd, 0x61, 0x00, 0x36, 0xe1, 0x48, 0x1e, 0xbc, 0x07, 0xcf, 0xf6, 0x4f, 0xe0, 0x0c, 0xe3, - 0xab, 0xb9, 0x5e, 0xc8, 0xb7, 0xdf, 0x88, 0x43, 0x2e, 0xec, 0xdb, 0x3f, 0x06, 0xeb, 0x02, 0x5a, - 0x0b, 0xb2, 0x41, 0x92, 0xff, 0x73, 0xd6, 0x21, 0xd9, 0xa0, 0x2f, 0xea, 0x8e, 0x4e, 0x03, 0xdf, - 0x8d, 0x43, 0xaa, 0xa1, 0x3a, 0x6a, 0xc7, 0x45, 0xd7, 0xfa, 0x0a, 0x38, 0x71, 0xca, 0xd6, 0xf7, - 0x2f, 0xb8, 0xf9, 0xa6, 0x9e, 0x85, 0xdc, 0xa7, 0x06, 0xd4, 0x6f, 0x8f, 0x41, 0x9e, 0x6c, 0x11, - 0x43, 0x0f, 0xe4, 0xe3, 0xf4, 0x31, 0x23, 0xd9, 0xe3, 0x05, 0x4f, 0x83, 0xd0, 0x22, 0x64, 0x89, - 0x5a, 0x90, 0xe8, 0x88, 0x0e, 0x74, 0xd4, 0xdb, 0x75, 0x26, 0x41, 0xcf, 0x00, 0xda, 0xf7, 0x37, - 0xed, 0x4a, 0xe0, 0x02, 0xa2, 0x37, 0x13, 0xb4, 0x08, 0xf5, 0x87, 0x00, 0x88, 0x15, 0x0a, 0x7b, - 0xc9, 0x8b, 0xed, 0x71, 0x32, 0x44, 0x52, 0xa3, 0x2f, 0x7a, 0xfd, 0x28, 0xab, 0x05, 0x7b, 0x76, - 0x8f, 0xbc, 0x0c, 0x5f, 0x3f, 0x5e, 0xa4, 0x7e, 0xf7, 0xdd, 0xc5, 0xf9, 0x43, 0xb5, 0x63, 0x94, - 0x4b, 0x03, 0x28, 0x4b, 0xb4, 0x36, 0x8c, 0xee, 0x3a, 0x43, 0x11, 0xfc, 0xf9, 0x18, 0xa0, 0x20, - 0xe5, 0xca, 0xd8, 0xb5, 0xc9, 0xb6, 0x86, 0x14, 0xbd, 0xa1, 0x0a, 0x35, 0x76, 0x74, 0xd1, 0x1b, - 0xe0, 0x45, 0xd1, 0x1b, 0x9a, 0x11, 0x97, 0x83, 0x04, 0x17, 0xe7, 0x63, 0x38, 0xe0, 0x0d, 0xbd, - 0xe5, 0xaa, 0xa5, 0x0b, 0x74, 0x5f, 0x0e, 0x9b, 0x28, 0xfd, 0x56, 0x0c, 0x4e, 0xf7, 0x45, 0x93, - 0x6f, 0xec, 0x9f, 0x04, 0xe4, 0x84, 0x1a, 0xf9, 0x7f, 0xd9, 0x63, 0x46, 0x1f, 0x3b, 0x38, 0x67, - 0x9c, 0xbe, 0x5c, 0xf9, 0x61, 0xe5, 0x68, 0xf6, 0xe6, 0xde, 0x3f, 0x8d, 0xc1, 0x5c, 0xd8, 0x18, - 0xbf, 0x5b, 0x9b, 0x90, 0x0b, 0xdb, 0xc2, 0x3b, 0xf4, 0xe8, 0x38, 0x1d, 0xe2, 0x7d, 0x89, 0xe0, - 0xd1, 0x2b, 0xc1, 0xc4, 0x65, 0x87, 0x45, 0xcf, 0x8d, 0xed, 0x1b, 0x61, 0x53, 0xef, 0x04, 0x4e, - 0x8a, 0x2a, 0x26, 0xd9, 0xb0, 0x2c, 0x03, 0xfd, 0x69, 0x98, 0x31, 0x2d, 0x4f, 0x21, 0x51, 0x8e, - 0x5b, 0x0a, 0xdf, 0xb9, 0xb2, 0xec, 0xf7, 0xca, 0xf1, 0x5c, 0xf6, 0x3b, 0xef, 0x2e, 0xf6, 0x53, - 0xf5, 0xf8, 0xb1, 0x60, 0x5a, 0x5e, 0x85, 0xb6, 0x6f, 0xb3, 0x7d, 0xad, 0x03, 0xd3, 0xd1, 0x5b, - 0xb3, 0x6c, 0xb9, 0x71, 0xec, 0x5b, 0x4f, 0x1f, 0x75, 0xdb, 0xdc, 0x6e, 0xe8, 0x9e, 0xec, 0x9d, - 0xa6, 0xdf, 0x7f, 0x67, 0x31, 0xf6, 0xe4, 0x57, 0x63, 0x00, 0xc1, 0x16, 0x1e, 0x3d, 0x0d, 0xa7, - 0x2a, 0x5b, 0x9b, 0x35, 0xa5, 0xb9, 0xbd, 0xb2, 0xbd, 0xd3, 0x8c, 0xbe, 0xf9, 0x2c, 0xce, 0x84, - 0x5d, 0x1b, 0x6b, 0xf4, 0x7f, 0x10, 0xa2, 0xc7, 0x61, 0x2e, 0xaa, 0x4d, 0xae, 0xea, 0x35, 0x29, - 0x36, 0x9f, 0xbb, 0x73, 0x77, 0x29, 0xcd, 0xaa, 0x23, 0xdc, 0x42, 0x67, 0xe1, 0x44, 0xbf, 0xde, - 0xda, 0xe6, 0xaa, 0x14, 0x9f, 0x9f, 0xbe, 0x73, 0x77, 0x29, 0xe3, 0x97, 0x51, 0xa8, 0x04, 0x28, - 0xac, 0xc9, 0xf9, 0x12, 0xf3, 0x70, 0xe7, 0xee, 0x52, 0x8a, 0xb9, 0x6d, 0x3e, 0xf9, 0xf1, 0xcf, - 0x2f, 0x4c, 0x54, 0xae, 0x0e, 0x3d, 0xf5, 0x7d, 0xfa, 0x48, 0x8f, 0xdd, 0xf6, 0x4f, 0x72, 0x23, - 0x47, 0xbd, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x6f, 0xff, 0x2d, 0x08, 0x37, 0x66, 0x00, 0x00, + // 10422 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7d, 0x6b, 0x74, 0x1c, 0xd7, + 0x79, 0x18, 0xf6, 0xbd, 0xfb, 0xed, 0x62, 0x77, 0x70, 0x01, 0x91, 0xe0, 0x52, 0x02, 0xa0, 0x91, + 0x25, 0x91, 0x94, 0x04, 0x4a, 0x94, 0x48, 0x8a, 0xa0, 0x65, 0x79, 0xb1, 0x58, 0x92, 0x4b, 0xe2, + 0xa5, 0x59, 0x80, 0x7a, 0x24, 0xf6, 0x78, 0x30, 0x7b, 0x01, 0x8c, 0xb8, 0x3b, 0x33, 0x9e, 0x99, + 0x25, 0x01, 0x9d, 0xb4, 0x47, 0xa9, 0x9a, 0xd6, 0x66, 0xdb, 0xd4, 0x49, 0x7a, 0x1a, 0xc7, 0x31, + 0x5d, 0x3b, 0x4e, 0x6a, 0xc7, 0x75, 0x1f, 0x89, 0x5d, 0xd7, 0x49, 0xda, 0xd4, 0xed, 0xe9, 0xc3, + 0xf5, 0xe9, 0xe9, 0x71, 0x72, 0xda, 0x26, 0xed, 0x49, 0x95, 0x54, 0xf6, 0x69, 0x5d, 0xd7, 0x69, + 0x52, 0xc7, 0x3d, 0x6d, 0x8f, 0x8f, 0xdb, 0x9e, 0xfb, 0x9a, 0xc7, 0x3e, 0xb0, 0x0b, 0x5a, 0x52, + 0xd2, 0xe3, 0x5f, 0xd8, 0x7b, 0xef, 0xf7, 0x7d, 0x73, 0xef, 0x77, 0xbf, 0xfb, 0xbd, 0xee, 0x03, + 0xf0, 0x47, 0x17, 0x61, 0x6e, 0xc7, 0xb2, 0x76, 0x5a, 0xf8, 0xb4, 0xed, 0x58, 0x9e, 0xb5, 0xd5, + 0xd9, 0x3e, 0xdd, 0xc4, 0xae, 0xee, 0x18, 0xb6, 0x67, 0x39, 0xf3, 0xb4, 0x0e, 0x95, 0x18, 0xc4, + 0xbc, 0x80, 0x90, 0x57, 0x60, 0xe2, 0x92, 0xd1, 0xc2, 0x4b, 0x3e, 0x60, 0x03, 0x7b, 0xe8, 0x69, + 0x48, 0x6e, 0x1b, 0x2d, 0x3c, 0x1d, 0x9b, 0x4b, 0x9c, 0xc8, 0x9f, 0x79, 0xc7, 0x7c, 0x17, 0xd2, + 0x7c, 0x14, 0x63, 0x9d, 0x54, 0x2b, 0x14, 0x43, 0xfe, 0x7a, 0x12, 0x26, 0xfb, 0xb4, 0x22, 0x04, + 0x49, 0x53, 0x6b, 0x13, 0x8a, 0xb1, 0x13, 0x39, 0x85, 0xfe, 0x46, 0xd3, 0x90, 0xb1, 0x35, 0xfd, + 0x86, 0xb6, 0x83, 0xa7, 0xe3, 0xb4, 0x5a, 0x14, 0xd1, 0x0c, 0x40, 0x13, 0xdb, 0xd8, 0x6c, 0x62, + 0x53, 0xdf, 0x9f, 0x4e, 0xcc, 0x25, 0x4e, 0xe4, 0x94, 0x50, 0x0d, 0x7a, 0x04, 0x26, 0xec, 0xce, + 0x56, 0xcb, 0xd0, 0xd5, 0x10, 0x18, 0xcc, 0x25, 0x4e, 0xa4, 0x14, 0x89, 0x35, 0x2c, 0x05, 0xc0, + 0x0f, 0x43, 0xe9, 0x16, 0xd6, 0x6e, 0x84, 0x41, 0xf3, 0x14, 0xb4, 0x48, 0xaa, 0x43, 0x80, 0x55, + 0x28, 0xb4, 0xb1, 0xeb, 0x6a, 0x3b, 0x58, 0xf5, 0xf6, 0x6d, 0x3c, 0x9d, 0xa4, 0xa3, 0x9f, 0xeb, + 0x19, 0x7d, 0xf7, 0xc8, 0xf3, 0x1c, 0x6b, 0x63, 0xdf, 0xc6, 0xa8, 0x02, 0x39, 0x6c, 0x76, 0xda, + 0x8c, 0x42, 0x6a, 0x00, 0xff, 0x6a, 0x66, 0xa7, 0xdd, 0x4d, 0x25, 0x4b, 0xd0, 0x38, 0x89, 0x8c, + 0x8b, 0x9d, 0x9b, 0x86, 0x8e, 0xa7, 0xd3, 0x94, 0xc0, 0xc3, 0x3d, 0x04, 0x1a, 0xac, 0xbd, 0x9b, + 0x86, 0xc0, 0x43, 0x55, 0xc8, 0xe1, 0x3d, 0x0f, 0x9b, 0xae, 0x61, 0x99, 0xd3, 0x19, 0x4a, 0xe4, + 0xc1, 0x3e, 0xb3, 0x88, 0x5b, 0xcd, 0x6e, 0x12, 0x01, 0x1e, 0x3a, 0x07, 0x19, 0xcb, 0xf6, 0x0c, + 0xcb, 0x74, 0xa7, 0xb3, 0x73, 0xb1, 0x13, 0xf9, 0x33, 0xf7, 0xf6, 0x15, 0x84, 0x35, 0x06, 0xa3, + 0x08, 0x60, 0x54, 0x07, 0xc9, 0xb5, 0x3a, 0x8e, 0x8e, 0x55, 0xdd, 0x6a, 0x62, 0xd5, 0x30, 0xb7, + 0xad, 0xe9, 0x1c, 0x25, 0x30, 0xdb, 0x3b, 0x10, 0x0a, 0x58, 0xb5, 0x9a, 0xb8, 0x6e, 0x6e, 0x5b, + 0x4a, 0xd1, 0x8d, 0x94, 0xd1, 0x11, 0x48, 0xbb, 0xfb, 0xa6, 0xa7, 0xed, 0x4d, 0x17, 0xa8, 0x84, + 0xf0, 0x92, 0xfc, 0x2b, 0x69, 0x28, 0x8d, 0x22, 0x62, 0x17, 0x21, 0xb5, 0x4d, 0x46, 0x39, 0x1d, + 0x3f, 0x0c, 0x0f, 0x18, 0x4e, 0x94, 0x89, 0xe9, 0xbb, 0x64, 0x62, 0x05, 0xf2, 0x26, 0x76, 0x3d, + 0xdc, 0x64, 0x12, 0x91, 0x18, 0x51, 0xa6, 0x80, 0x21, 0xf5, 0x8a, 0x54, 0xf2, 0xae, 0x44, 0xea, + 0x05, 0x28, 0xf9, 0x5d, 0x52, 0x1d, 0xcd, 0xdc, 0x11, 0xb2, 0x79, 0x7a, 0x58, 0x4f, 0xe6, 0x6b, + 0x02, 0x4f, 0x21, 0x68, 0x4a, 0x11, 0x47, 0xca, 0x68, 0x09, 0xc0, 0x32, 0xb1, 0xb5, 0xad, 0x36, + 0xb1, 0xde, 0x9a, 0xce, 0x0e, 0xe0, 0xd2, 0x1a, 0x01, 0xe9, 0xe1, 0x92, 0xc5, 0x6a, 0xf5, 0x16, + 0xba, 0x10, 0x88, 0x5a, 0x66, 0x80, 0xa4, 0xac, 0xb0, 0x45, 0xd6, 0x23, 0x6d, 0x9b, 0x50, 0x74, + 0x30, 0x91, 0x7b, 0xdc, 0xe4, 0x23, 0xcb, 0xd1, 0x4e, 0xcc, 0x0f, 0x1d, 0x99, 0xc2, 0xd1, 0xd8, + 0xc0, 0xc6, 0x9d, 0x70, 0x11, 0x3d, 0x00, 0x7e, 0x85, 0x4a, 0xc5, 0x0a, 0xa8, 0x16, 0x2a, 0x88, + 0xca, 0x55, 0xad, 0x8d, 0xcb, 0xaf, 0x40, 0x31, 0xca, 0x1e, 0x34, 0x05, 0x29, 0xd7, 0xd3, 0x1c, + 0x8f, 0x4a, 0x61, 0x4a, 0x61, 0x05, 0x24, 0x41, 0x02, 0x9b, 0x4d, 0xaa, 0xe5, 0x52, 0x0a, 0xf9, + 0x89, 0xde, 0x1d, 0x0c, 0x38, 0x41, 0x07, 0xfc, 0x50, 0xef, 0x8c, 0x46, 0x28, 0x77, 0x8f, 0xbb, + 0x7c, 0x1e, 0xc6, 0x23, 0x03, 0x18, 0xf5, 0xd3, 0xf2, 0x8f, 0xc0, 0x3d, 0x7d, 0x49, 0xa3, 0x17, + 0x60, 0xaa, 0x63, 0x1a, 0xa6, 0x87, 0x1d, 0xdb, 0xc1, 0x44, 0x62, 0xd9, 0xa7, 0xa6, 0xff, 0x73, + 0x66, 0x80, 0xcc, 0x6d, 0x86, 0xa1, 0x19, 0x15, 0x65, 0xb2, 0xd3, 0x5b, 0x79, 0x2a, 0x97, 0xfd, + 0x46, 0x46, 0x7a, 0xf5, 0xd5, 0x57, 0x5f, 0x8d, 0xcb, 0xff, 0x28, 0x0d, 0x53, 0xfd, 0xd6, 0x4c, + 0xdf, 0xe5, 0x7b, 0x04, 0xd2, 0x66, 0xa7, 0xbd, 0x85, 0x1d, 0xca, 0xa4, 0x94, 0xc2, 0x4b, 0xa8, + 0x02, 0xa9, 0x96, 0xb6, 0x85, 0x5b, 0xd3, 0xc9, 0xb9, 0xd8, 0x89, 0xe2, 0x99, 0x47, 0x46, 0x5a, + 0x95, 0xf3, 0xcb, 0x04, 0x45, 0x61, 0x98, 0xe8, 0x5d, 0x90, 0xe4, 0x2a, 0x9a, 0x50, 0x38, 0x35, + 0x1a, 0x05, 0xb2, 0x96, 0x14, 0x8a, 0x87, 0x8e, 0x43, 0x8e, 0xfc, 0x65, 0xb2, 0x91, 0xa6, 0x7d, + 0xce, 0x92, 0x0a, 0x22, 0x17, 0xa8, 0x0c, 0x59, 0xba, 0x4c, 0x9a, 0x58, 0x98, 0x36, 0xbf, 0x4c, + 0x04, 0xab, 0x89, 0xb7, 0xb5, 0x4e, 0xcb, 0x53, 0x6f, 0x6a, 0xad, 0x0e, 0xa6, 0x02, 0x9f, 0x53, + 0x0a, 0xbc, 0xf2, 0x3a, 0xa9, 0x43, 0xb3, 0x90, 0x67, 0xab, 0xca, 0x30, 0x9b, 0x78, 0x8f, 0x6a, + 0xcf, 0x94, 0xc2, 0x16, 0x5a, 0x9d, 0xd4, 0x90, 0xcf, 0xbf, 0xec, 0x5a, 0xa6, 0x10, 0x4d, 0xfa, + 0x09, 0x52, 0x41, 0x3f, 0x7f, 0xbe, 0x5b, 0x71, 0xdf, 0xd7, 0x7f, 0x78, 0x3d, 0x6b, 0xe9, 0x61, + 0x28, 0x51, 0x88, 0x27, 0xf9, 0xd4, 0x6b, 0xad, 0xe9, 0x89, 0xb9, 0xd8, 0x89, 0xac, 0x52, 0x64, + 0xd5, 0x6b, 0xbc, 0x56, 0xfe, 0x42, 0x1c, 0x92, 0x54, 0xb1, 0x94, 0x20, 0xbf, 0xf1, 0xe2, 0x7a, + 0x4d, 0x5d, 0x5a, 0xdb, 0x5c, 0x5c, 0xae, 0x49, 0x31, 0x54, 0x04, 0xa0, 0x15, 0x97, 0x96, 0xd7, + 0x2a, 0x1b, 0x52, 0xdc, 0x2f, 0xd7, 0x57, 0x37, 0xce, 0x3d, 0x25, 0x25, 0x7c, 0x84, 0x4d, 0x56, + 0x91, 0x0c, 0x03, 0x3c, 0x79, 0x46, 0x4a, 0x21, 0x09, 0x0a, 0x8c, 0x40, 0xfd, 0x85, 0xda, 0xd2, + 0xb9, 0xa7, 0xa4, 0x74, 0xb4, 0xe6, 0xc9, 0x33, 0x52, 0x06, 0x8d, 0x43, 0x8e, 0xd6, 0x2c, 0xae, + 0xad, 0x2d, 0x4b, 0x59, 0x9f, 0x66, 0x63, 0x43, 0xa9, 0xaf, 0x5e, 0x96, 0x72, 0x3e, 0xcd, 0xcb, + 0xca, 0xda, 0xe6, 0xba, 0x04, 0x3e, 0x85, 0x95, 0x5a, 0xa3, 0x51, 0xb9, 0x5c, 0x93, 0xf2, 0x3e, + 0xc4, 0xe2, 0x8b, 0x1b, 0xb5, 0x86, 0x54, 0x88, 0x74, 0xeb, 0xc9, 0x33, 0xd2, 0xb8, 0xff, 0x89, + 0xda, 0xea, 0xe6, 0x8a, 0x54, 0x44, 0x13, 0x30, 0xce, 0x3e, 0x21, 0x3a, 0x51, 0xea, 0xaa, 0x3a, + 0xf7, 0x94, 0x24, 0x05, 0x1d, 0x61, 0x54, 0x26, 0x22, 0x15, 0xe7, 0x9e, 0x92, 0x90, 0x5c, 0x85, + 0x14, 0x15, 0x43, 0x84, 0xa0, 0xb8, 0x5c, 0x59, 0xac, 0x2d, 0xab, 0x6b, 0xeb, 0x1b, 0xf5, 0xb5, + 0xd5, 0xca, 0xb2, 0x14, 0x0b, 0xea, 0x94, 0xda, 0x73, 0x9b, 0x75, 0xa5, 0xb6, 0x24, 0xc5, 0xc3, + 0x75, 0xeb, 0xb5, 0xca, 0x46, 0x6d, 0x49, 0x4a, 0xc8, 0x3a, 0x4c, 0xf5, 0x53, 0xa8, 0x7d, 0x97, + 0x50, 0x48, 0x16, 0xe2, 0x03, 0x64, 0x81, 0xd2, 0xea, 0x96, 0x05, 0xf9, 0x6b, 0x71, 0x98, 0xec, + 0x63, 0x54, 0xfa, 0x7e, 0xe4, 0x59, 0x48, 0x31, 0x59, 0x66, 0x66, 0xf6, 0x64, 0x5f, 0xeb, 0x44, + 0x25, 0xbb, 0xc7, 0xd4, 0x52, 0xbc, 0xb0, 0xab, 0x91, 0x18, 0xe0, 0x6a, 0x10, 0x12, 0x3d, 0x02, + 0xfb, 0x9e, 0x1e, 0xe5, 0xcf, 0xec, 0xe3, 0xb9, 0x51, 0xec, 0x23, 0xad, 0x3b, 0x9c, 0x11, 0x48, + 0xf5, 0x31, 0x02, 0x17, 0x61, 0xa2, 0x87, 0xd0, 0xc8, 0xca, 0xf8, 0xb5, 0x18, 0x4c, 0x0f, 0x62, + 0xce, 0x10, 0x95, 0x18, 0x8f, 0xa8, 0xc4, 0x8b, 0xdd, 0x1c, 0xbc, 0x7f, 0xf0, 0x24, 0xf4, 0xcc, + 0xf5, 0xa7, 0x62, 0x70, 0xa4, 0xbf, 0x4b, 0xd9, 0xb7, 0x0f, 0xef, 0x82, 0x74, 0x1b, 0x7b, 0xbb, + 0x96, 0x70, 0xab, 0x1e, 0xea, 0x63, 0xac, 0x49, 0x73, 0xf7, 0x64, 0x73, 0xac, 0xb0, 0xb5, 0x4f, + 0x0c, 0xf2, 0x0b, 0x59, 0x6f, 0x7a, 0x7a, 0xfa, 0xc1, 0x38, 0xdc, 0xd3, 0x97, 0x78, 0xdf, 0x8e, + 0xde, 0x07, 0x60, 0x98, 0x76, 0xc7, 0x63, 0xae, 0x13, 0xd3, 0xc4, 0x39, 0x5a, 0x43, 0x95, 0x17, + 0xd1, 0xb2, 0x1d, 0xcf, 0x6f, 0x4f, 0xd0, 0x76, 0x60, 0x55, 0x14, 0xe0, 0xe9, 0xa0, 0xa3, 0x49, + 0xda, 0xd1, 0x99, 0x01, 0x23, 0xed, 0x11, 0xcc, 0xc7, 0x41, 0xd2, 0x5b, 0x06, 0x36, 0x3d, 0xd5, + 0xf5, 0x1c, 0xac, 0xb5, 0x0d, 0x73, 0x87, 0x9a, 0x9a, 0xec, 0x42, 0x6a, 0x5b, 0x6b, 0xb9, 0x58, + 0x29, 0xb1, 0xe6, 0x86, 0x68, 0x25, 0x18, 0x54, 0x80, 0x9c, 0x10, 0x46, 0x3a, 0x82, 0xc1, 0x9a, + 0x7d, 0x0c, 0xf9, 0x27, 0x72, 0x90, 0x0f, 0x39, 0xe0, 0xe8, 0x7e, 0x28, 0xbc, 0xac, 0xdd, 0xd4, + 0x54, 0x11, 0x54, 0x31, 0x4e, 0xe4, 0x49, 0xdd, 0x3a, 0x0f, 0xac, 0x1e, 0x87, 0x29, 0x0a, 0x62, + 0x75, 0x3c, 0xec, 0xa8, 0x7a, 0x4b, 0x73, 0x5d, 0xca, 0xb4, 0x2c, 0x05, 0x45, 0xa4, 0x6d, 0x8d, + 0x34, 0x55, 0x45, 0x0b, 0x3a, 0x0b, 0x93, 0x14, 0xa3, 0xdd, 0x69, 0x79, 0x86, 0xdd, 0xc2, 0x2a, + 0x09, 0xf3, 0x5c, 0x6a, 0x72, 0xfc, 0x9e, 0x4d, 0x10, 0x88, 0x15, 0x0e, 0x40, 0x7a, 0xe4, 0xa2, + 0x25, 0xb8, 0x8f, 0xa2, 0xed, 0x60, 0x13, 0x3b, 0x9a, 0x87, 0x55, 0xfc, 0xfe, 0x8e, 0xd6, 0x72, + 0x55, 0xcd, 0x6c, 0xaa, 0xbb, 0x9a, 0xbb, 0x3b, 0x3d, 0x45, 0x08, 0x2c, 0xc6, 0xa7, 0x63, 0xca, + 0x31, 0x02, 0x78, 0x99, 0xc3, 0xd5, 0x28, 0x58, 0xc5, 0x6c, 0x5e, 0xd1, 0xdc, 0x5d, 0xb4, 0x00, + 0x47, 0x28, 0x15, 0xd7, 0x73, 0x0c, 0x73, 0x47, 0xd5, 0x77, 0xb1, 0x7e, 0x43, 0xed, 0x78, 0xdb, + 0x4f, 0x4f, 0x1f, 0x0f, 0x7f, 0x9f, 0xf6, 0xb0, 0x41, 0x61, 0xaa, 0x04, 0x64, 0xd3, 0xdb, 0x7e, + 0x1a, 0x35, 0xa0, 0x40, 0x26, 0xa3, 0x6d, 0xbc, 0x82, 0xd5, 0x6d, 0xcb, 0xa1, 0x36, 0xb4, 0xd8, + 0x47, 0x35, 0x85, 0x38, 0x38, 0xbf, 0xc6, 0x11, 0x56, 0xac, 0x26, 0x5e, 0x48, 0x35, 0xd6, 0x6b, + 0xb5, 0x25, 0x25, 0x2f, 0xa8, 0x5c, 0xb2, 0x1c, 0x22, 0x50, 0x3b, 0x96, 0xcf, 0xe0, 0x3c, 0x13, + 0xa8, 0x1d, 0x4b, 0xb0, 0xf7, 0x2c, 0x4c, 0xea, 0x3a, 0x1b, 0xb3, 0xa1, 0xab, 0x3c, 0x18, 0x73, + 0xa7, 0xa5, 0x08, 0xb3, 0x74, 0xfd, 0x32, 0x03, 0xe0, 0x32, 0xee, 0xa2, 0x0b, 0x70, 0x4f, 0xc0, + 0xac, 0x30, 0xe2, 0x44, 0xcf, 0x28, 0xbb, 0x51, 0xcf, 0xc2, 0xa4, 0xbd, 0xdf, 0x8b, 0x88, 0x22, + 0x5f, 0xb4, 0xf7, 0xbb, 0xd1, 0xce, 0xc3, 0x94, 0xbd, 0x6b, 0xf7, 0xe2, 0x9d, 0x0a, 0xe3, 0x21, + 0x7b, 0xd7, 0xee, 0x46, 0x7c, 0x90, 0x46, 0xe6, 0x0e, 0xd6, 0x35, 0x0f, 0x37, 0xa7, 0x8f, 0x86, + 0xc1, 0x43, 0x0d, 0x68, 0x1e, 0x24, 0x5d, 0x57, 0xb1, 0xa9, 0x6d, 0xb5, 0xb0, 0xaa, 0x39, 0xd8, + 0xd4, 0xdc, 0xe9, 0x59, 0x0a, 0x9c, 0xf4, 0x9c, 0x0e, 0x56, 0x8a, 0xba, 0x5e, 0xa3, 0x8d, 0x15, + 0xda, 0x86, 0x4e, 0xc1, 0x84, 0xb5, 0xf5, 0xb2, 0xce, 0x24, 0x52, 0xb5, 0x1d, 0xbc, 0x6d, 0xec, + 0x4d, 0xbf, 0x83, 0xb2, 0xb7, 0x44, 0x1a, 0xa8, 0x3c, 0xae, 0xd3, 0x6a, 0x74, 0x12, 0x24, 0xdd, + 0xdd, 0xd5, 0x1c, 0x9b, 0xaa, 0x64, 0xd7, 0xd6, 0x74, 0x3c, 0xfd, 0x20, 0x03, 0x65, 0xf5, 0xab, + 0xa2, 0x9a, 0xac, 0x08, 0xf7, 0x96, 0xb1, 0xed, 0x09, 0x8a, 0x0f, 0xb3, 0x15, 0x41, 0xeb, 0x38, + 0xb5, 0x13, 0x20, 0x11, 0x4e, 0x44, 0x3e, 0x7c, 0x82, 0x82, 0x15, 0xed, 0x5d, 0x3b, 0xfc, 0xdd, + 0x07, 0x60, 0x9c, 0x40, 0x06, 0x1f, 0x3d, 0xc9, 0x1c, 0x37, 0x7b, 0x37, 0xf4, 0xc5, 0xa7, 0xe0, + 0x08, 0x01, 0x6a, 0x63, 0x4f, 0x6b, 0x6a, 0x9e, 0x16, 0x82, 0x7e, 0x94, 0x42, 0x13, 0xb6, 0xaf, + 0xf0, 0xc6, 0x48, 0x3f, 0x9d, 0xce, 0xd6, 0xbe, 0x2f, 0x58, 0x8f, 0xb1, 0x7e, 0x92, 0x3a, 0x21, + 0x5a, 0x6f, 0x99, 0x73, 0x2e, 0x2f, 0x40, 0x21, 0x2c, 0xf7, 0x28, 0x07, 0x4c, 0xf2, 0xa5, 0x18, + 0x71, 0x82, 0xaa, 0x6b, 0x4b, 0xc4, 0x7d, 0x79, 0xa9, 0x26, 0xc5, 0x89, 0x1b, 0xb5, 0x5c, 0xdf, + 0xa8, 0xa9, 0xca, 0xe6, 0xea, 0x46, 0x7d, 0xa5, 0x26, 0x25, 0x42, 0x8e, 0xfd, 0xd5, 0x64, 0xf6, + 0x21, 0xe9, 0x61, 0xe2, 0x35, 0x14, 0xa3, 0x91, 0x1a, 0x7a, 0x27, 0x1c, 0x15, 0x69, 0x15, 0x17, + 0x7b, 0xea, 0x2d, 0xc3, 0xa1, 0x0b, 0xb2, 0xad, 0x31, 0xe3, 0xe8, 0xcb, 0xcf, 0x14, 0x87, 0x6a, + 0x60, 0xef, 0x79, 0xc3, 0x21, 0xcb, 0xad, 0xad, 0x79, 0x68, 0x19, 0x66, 0x4d, 0x4b, 0x75, 0x3d, + 0xcd, 0x6c, 0x6a, 0x4e, 0x53, 0x0d, 0x12, 0x5a, 0xaa, 0xa6, 0xeb, 0xd8, 0x75, 0x2d, 0x66, 0x08, + 0x7d, 0x2a, 0xf7, 0x9a, 0x56, 0x83, 0x03, 0x07, 0x16, 0xa2, 0xc2, 0x41, 0xbb, 0xc4, 0x37, 0x31, + 0x48, 0x7c, 0x8f, 0x43, 0xae, 0xad, 0xd9, 0x2a, 0x36, 0x3d, 0x67, 0x9f, 0xfa, 0xe7, 0x59, 0x25, + 0xdb, 0xd6, 0xec, 0x1a, 0x29, 0xbf, 0x2d, 0x61, 0xd2, 0xd5, 0x64, 0x36, 0x29, 0xa5, 0xae, 0x26, + 0xb3, 0x29, 0x29, 0x7d, 0x35, 0x99, 0x4d, 0x4b, 0x99, 0xab, 0xc9, 0x6c, 0x56, 0xca, 0x5d, 0x4d, + 0x66, 0x73, 0x12, 0xc8, 0x3f, 0x99, 0x84, 0x42, 0xd8, 0x83, 0x27, 0x01, 0x91, 0x4e, 0x6d, 0x58, + 0x8c, 0x6a, 0xb9, 0x07, 0x0e, 0xf4, 0xf7, 0xe7, 0xab, 0xc4, 0xb8, 0x2d, 0xa4, 0x99, 0xbb, 0xac, + 0x30, 0x4c, 0xe2, 0x58, 0x10, 0xf1, 0xc3, 0xcc, 0x3d, 0xc9, 0x2a, 0xbc, 0x84, 0x2e, 0x43, 0xfa, + 0x65, 0x97, 0xd2, 0x4e, 0x53, 0xda, 0xef, 0x38, 0x98, 0xf6, 0xd5, 0x06, 0x25, 0x9e, 0xbb, 0xda, + 0x50, 0x57, 0xd7, 0x94, 0x95, 0xca, 0xb2, 0xc2, 0xd1, 0xd1, 0x31, 0x48, 0xb6, 0xb4, 0x57, 0xf6, + 0xa3, 0x66, 0x90, 0x56, 0xa1, 0x79, 0x28, 0x75, 0xcc, 0x9b, 0xd8, 0x31, 0xb6, 0x0d, 0xdc, 0x54, + 0x29, 0x54, 0x29, 0x0c, 0x55, 0x0c, 0x5a, 0x97, 0x09, 0xfc, 0x88, 0xd3, 0x78, 0x0c, 0x92, 0xb7, + 0xb0, 0x76, 0x23, 0x6a, 0xac, 0x68, 0xd5, 0x5b, 0xb8, 0x9c, 0x4e, 0x43, 0x8a, 0xf2, 0x17, 0x01, + 0x70, 0x0e, 0x4b, 0x63, 0x28, 0x0b, 0xc9, 0xea, 0x9a, 0x42, 0x96, 0x94, 0x04, 0x05, 0x56, 0xab, + 0xae, 0xd7, 0x6b, 0xd5, 0x9a, 0x14, 0x97, 0xcf, 0x42, 0x9a, 0x31, 0x8d, 0x2c, 0x37, 0x9f, 0x6d, + 0xd2, 0x18, 0x2f, 0x72, 0x1a, 0x31, 0xd1, 0xba, 0xb9, 0xb2, 0x58, 0x53, 0xa4, 0x78, 0x8f, 0xb0, + 0xc8, 0x2e, 0x14, 0xc2, 0x9e, 0xfc, 0xdb, 0x13, 0xce, 0x7f, 0x29, 0x06, 0xf9, 0x90, 0x67, 0x4e, + 0x5c, 0x2a, 0xad, 0xd5, 0xb2, 0x6e, 0xa9, 0x5a, 0xcb, 0xd0, 0x5c, 0x2e, 0x4a, 0x40, 0xab, 0x2a, + 0xa4, 0x66, 0xd4, 0xa9, 0x7b, 0x9b, 0x16, 0x59, 0x4a, 0x4a, 0xcb, 0x1f, 0x8b, 0x81, 0xd4, 0xed, + 0x1a, 0x77, 0x75, 0x33, 0xf6, 0xc7, 0xd9, 0x4d, 0xf9, 0xa3, 0x31, 0x28, 0x46, 0xfd, 0xe1, 0xae, + 0xee, 0xdd, 0xff, 0xc7, 0xda, 0xbd, 0xdf, 0x8b, 0xc3, 0x78, 0xc4, 0x0b, 0x1e, 0xb5, 0x77, 0xef, + 0x87, 0x09, 0xa3, 0x89, 0xdb, 0xb6, 0xe5, 0x61, 0x53, 0xdf, 0x57, 0x5b, 0xf8, 0x26, 0x6e, 0x4d, + 0xcb, 0x54, 0xc9, 0x9c, 0x3e, 0xd8, 0xcf, 0x9e, 0xaf, 0x07, 0x78, 0xcb, 0x04, 0x6d, 0x61, 0xb2, + 0xbe, 0x54, 0x5b, 0x59, 0x5f, 0xdb, 0xa8, 0xad, 0x56, 0x5f, 0x54, 0x37, 0x57, 0xaf, 0xad, 0xae, + 0x3d, 0xbf, 0xaa, 0x48, 0x46, 0x17, 0xd8, 0x5b, 0xb8, 0xec, 0xd7, 0x41, 0xea, 0xee, 0x14, 0x3a, + 0x0a, 0xfd, 0xba, 0x25, 0x8d, 0xa1, 0x49, 0x28, 0xad, 0xae, 0xa9, 0x8d, 0xfa, 0x52, 0x4d, 0xad, + 0x5d, 0xba, 0x54, 0xab, 0x6e, 0x34, 0x58, 0xe6, 0xc4, 0x87, 0xde, 0x88, 0x2c, 0x70, 0xf9, 0x23, + 0x09, 0x98, 0xec, 0xd3, 0x13, 0x54, 0xe1, 0x31, 0x0f, 0x0b, 0xc3, 0x1e, 0x1b, 0xa5, 0xf7, 0xf3, + 0xc4, 0xeb, 0x58, 0xd7, 0x1c, 0x8f, 0x87, 0x48, 0x27, 0x81, 0x70, 0xc9, 0xf4, 0x88, 0x72, 0x75, + 0x78, 0x46, 0x8a, 0x05, 0x42, 0xa5, 0xa0, 0x9e, 0x25, 0xa5, 0x1e, 0x05, 0x64, 0x5b, 0xae, 0xe1, + 0x19, 0x37, 0xb1, 0x6a, 0x98, 0x22, 0x7d, 0x45, 0x02, 0xa3, 0xa4, 0x22, 0x89, 0x96, 0xba, 0xe9, + 0xf9, 0xd0, 0x26, 0xde, 0xd1, 0xba, 0xa0, 0x89, 0xf2, 0x4f, 0x28, 0x92, 0x68, 0xf1, 0xa1, 0xef, + 0x87, 0x42, 0xd3, 0xea, 0x10, 0x6f, 0x91, 0xc1, 0x11, 0x5b, 0x13, 0x53, 0xf2, 0xac, 0xce, 0x07, + 0xe1, 0x71, 0x40, 0x90, 0x37, 0x2b, 0x28, 0x79, 0x56, 0xc7, 0x40, 0x1e, 0x86, 0x92, 0xb6, 0xb3, + 0xe3, 0x10, 0xe2, 0x82, 0x10, 0x8b, 0x6c, 0x8a, 0x7e, 0x35, 0x05, 0x2c, 0x5f, 0x85, 0xac, 0xe0, + 0x03, 0x31, 0xf6, 0x84, 0x13, 0xaa, 0xcd, 0xc2, 0xf5, 0xf8, 0x89, 0x9c, 0x92, 0x35, 0x45, 0xe3, + 0xfd, 0x50, 0x30, 0x5c, 0x35, 0xd8, 0x06, 0x88, 0xcf, 0xc5, 0x4f, 0x64, 0x95, 0xbc, 0xe1, 0xfa, + 0x29, 0x54, 0xf9, 0x53, 0x71, 0x28, 0x46, 0xb7, 0x31, 0xd0, 0x12, 0x64, 0x5b, 0x96, 0xae, 0x51, + 0xd1, 0x62, 0x7b, 0x68, 0x27, 0x86, 0xec, 0x7c, 0xcc, 0x2f, 0x73, 0x78, 0xc5, 0xc7, 0x2c, 0xff, + 0xab, 0x18, 0x64, 0x45, 0x35, 0x3a, 0x02, 0x49, 0x5b, 0xf3, 0x76, 0x29, 0xb9, 0xd4, 0x62, 0x5c, + 0x8a, 0x29, 0xb4, 0x4c, 0xea, 0x5d, 0x5b, 0x33, 0xa9, 0x08, 0xf0, 0x7a, 0x52, 0x26, 0xf3, 0xda, + 0xc2, 0x5a, 0x93, 0x86, 0x4d, 0x56, 0xbb, 0x8d, 0x4d, 0xcf, 0x15, 0xf3, 0xca, 0xeb, 0xab, 0xbc, + 0x1a, 0x3d, 0x02, 0x13, 0x9e, 0xa3, 0x19, 0xad, 0x08, 0x6c, 0x92, 0xc2, 0x4a, 0xa2, 0xc1, 0x07, + 0x5e, 0x80, 0x63, 0x82, 0x6e, 0x13, 0x7b, 0x9a, 0xbe, 0x8b, 0x9b, 0x01, 0x52, 0x9a, 0xa6, 0x47, + 0x8e, 0x72, 0x80, 0x25, 0xde, 0x2e, 0x70, 0xe5, 0xdf, 0x88, 0xc1, 0x84, 0x08, 0xf4, 0x9a, 0x3e, + 0xb3, 0x56, 0x00, 0x34, 0xd3, 0xb4, 0xbc, 0x30, 0xbb, 0x7a, 0x45, 0xb9, 0x07, 0x6f, 0xbe, 0xe2, + 0x23, 0x29, 0x21, 0x02, 0xe5, 0x36, 0x40, 0xd0, 0x32, 0x90, 0x6d, 0xb3, 0x90, 0xe7, 0x7b, 0x54, + 0x74, 0xa3, 0x93, 0xa5, 0x06, 0x80, 0x55, 0x91, 0x88, 0x10, 0x4d, 0x41, 0x6a, 0x0b, 0xef, 0x18, + 0x26, 0xcf, 0x3c, 0xb3, 0x82, 0x48, 0xe0, 0x24, 0xfd, 0x04, 0xce, 0xe2, 0x9f, 0x86, 0x49, 0xdd, + 0x6a, 0x77, 0x77, 0x77, 0x51, 0xea, 0x4a, 0x4f, 0xb8, 0x57, 0x62, 0x2f, 0x3d, 0xc6, 0x81, 0x76, + 0xac, 0x96, 0x66, 0xee, 0xcc, 0x5b, 0xce, 0x4e, 0xb0, 0x51, 0x4b, 0x3c, 0x24, 0x37, 0xb4, 0x5d, + 0x6b, 0x6f, 0xfd, 0xaf, 0x58, 0xec, 0xe7, 0xe2, 0x89, 0xcb, 0xeb, 0x8b, 0x9f, 0x89, 0x97, 0x2f, + 0x33, 0xc4, 0x75, 0xc1, 0x0c, 0x05, 0x6f, 0xb7, 0xb0, 0x4e, 0x06, 0x08, 0xbf, 0xff, 0x08, 0x4c, + 0xed, 0x58, 0x3b, 0x16, 0xa5, 0x74, 0x9a, 0xfc, 0xe2, 0x3b, 0xbd, 0x39, 0xbf, 0xb6, 0x3c, 0x74, + 0x5b, 0x78, 0x61, 0x15, 0x26, 0x39, 0xb0, 0x4a, 0xb7, 0x9a, 0x58, 0x20, 0x84, 0x0e, 0xcc, 0xc2, + 0x4d, 0xff, 0xd2, 0xd7, 0xa9, 0xf9, 0x56, 0x26, 0x38, 0x2a, 0x69, 0x63, 0xb1, 0xd2, 0x82, 0x02, + 0xf7, 0x44, 0xe8, 0xb1, 0x45, 0x8a, 0x9d, 0x21, 0x14, 0xff, 0x29, 0xa7, 0x38, 0x19, 0xa2, 0xd8, + 0xe0, 0xa8, 0x0b, 0x55, 0x18, 0x3f, 0x0c, 0xad, 0x7f, 0xc6, 0x69, 0x15, 0x70, 0x98, 0xc8, 0x65, + 0x28, 0x51, 0x22, 0x7a, 0xc7, 0xf5, 0xac, 0x36, 0xd5, 0x80, 0x07, 0x93, 0xf9, 0xe7, 0x5f, 0x67, + 0xab, 0xa6, 0x48, 0xd0, 0xaa, 0x3e, 0xd6, 0xc2, 0x02, 0xd0, 0xdd, 0xb5, 0x26, 0xd6, 0x5b, 0x43, + 0x28, 0x7c, 0x99, 0x77, 0xc4, 0x87, 0x5f, 0xb8, 0x0e, 0x53, 0xe4, 0x37, 0x55, 0x50, 0xe1, 0x9e, + 0x0c, 0x4f, 0xd9, 0x4d, 0xff, 0xc6, 0x6b, 0x6c, 0x61, 0x4e, 0xfa, 0x04, 0x42, 0x7d, 0x0a, 0xcd, + 0xe2, 0x0e, 0xf6, 0x3c, 0xec, 0xb8, 0xaa, 0xd6, 0xea, 0xd7, 0xbd, 0x50, 0xce, 0x63, 0xfa, 0x67, + 0xbe, 0x15, 0x9d, 0xc5, 0xcb, 0x0c, 0xb3, 0xd2, 0x6a, 0x2d, 0x6c, 0xc2, 0xd1, 0x3e, 0x52, 0x31, + 0x02, 0xcd, 0x8f, 0x70, 0x9a, 0x53, 0x3d, 0x92, 0x41, 0xc8, 0xae, 0x83, 0xa8, 0xf7, 0xe7, 0x72, + 0x04, 0x9a, 0x3f, 0xcb, 0x69, 0x22, 0x8e, 0x2b, 0xa6, 0x94, 0x50, 0xbc, 0x0a, 0x13, 0x37, 0xb1, + 0xb3, 0x65, 0xb9, 0x3c, 0xcf, 0x34, 0x02, 0xb9, 0x8f, 0x72, 0x72, 0x25, 0x8e, 0x48, 0x13, 0x4f, + 0x84, 0xd6, 0x05, 0xc8, 0x6e, 0x6b, 0x3a, 0x1e, 0x81, 0xc4, 0x1d, 0x4e, 0x22, 0x43, 0xe0, 0x09, + 0x6a, 0x05, 0x0a, 0x3b, 0x16, 0xb7, 0x51, 0xc3, 0xd1, 0x3f, 0xc6, 0xd1, 0xf3, 0x02, 0x87, 0x93, + 0xb0, 0x2d, 0xbb, 0xd3, 0x22, 0x06, 0x6c, 0x38, 0x89, 0xbf, 0x26, 0x48, 0x08, 0x1c, 0x4e, 0xe2, + 0x10, 0x6c, 0xfd, 0xb8, 0x20, 0xe1, 0x86, 0xf8, 0xf9, 0x2c, 0xe4, 0x2d, 0xb3, 0xb5, 0x6f, 0x99, + 0xa3, 0x74, 0xe2, 0x13, 0x9c, 0x02, 0x70, 0x14, 0x42, 0xe0, 0x22, 0xe4, 0x46, 0x9d, 0x88, 0x5f, + 0xf8, 0x96, 0x58, 0x1e, 0x62, 0x06, 0x2e, 0x43, 0x49, 0x28, 0x28, 0xc3, 0x32, 0x47, 0x20, 0xf1, + 0xd7, 0x39, 0x89, 0x62, 0x08, 0x8d, 0x0f, 0xc3, 0xc3, 0xae, 0xb7, 0x83, 0x47, 0x21, 0xf2, 0x29, + 0x31, 0x0c, 0x8e, 0xc2, 0x59, 0xb9, 0x85, 0x4d, 0x7d, 0x77, 0x34, 0x0a, 0x9f, 0x16, 0xac, 0x14, + 0x38, 0x84, 0x44, 0x15, 0xc6, 0xdb, 0x9a, 0xe3, 0xee, 0x6a, 0xad, 0x91, 0xa6, 0xe3, 0x17, 0x39, + 0x8d, 0x82, 0x8f, 0xc4, 0x39, 0xd2, 0x31, 0x0f, 0x43, 0xe6, 0x33, 0x82, 0x23, 0x21, 0x34, 0xbe, + 0xf4, 0x5c, 0x8f, 0x26, 0xe5, 0x0e, 0x43, 0xed, 0x6f, 0x88, 0xa5, 0xc7, 0x70, 0x57, 0xc2, 0x14, + 0x2f, 0x42, 0xce, 0x35, 0x5e, 0x19, 0x89, 0xcc, 0x67, 0xc5, 0x4c, 0x53, 0x04, 0x82, 0xfc, 0x22, + 0x1c, 0xeb, 0x6b, 0x26, 0x46, 0x20, 0xf6, 0x37, 0x39, 0xb1, 0x23, 0x7d, 0x4c, 0x05, 0x57, 0x09, + 0x87, 0x25, 0xf9, 0xb7, 0x84, 0x4a, 0xc0, 0x5d, 0xb4, 0xd6, 0x49, 0xd4, 0xe0, 0x6a, 0xdb, 0x87, + 0xe3, 0xda, 0xdf, 0x16, 0x5c, 0x63, 0xb8, 0x11, 0xae, 0x6d, 0xc0, 0x11, 0x4e, 0xf1, 0x70, 0xf3, + 0xfa, 0x77, 0x84, 0x62, 0x65, 0xd8, 0x9b, 0xd1, 0xd9, 0xfd, 0x21, 0x28, 0xfb, 0xec, 0x14, 0xee, + 0xa9, 0xab, 0xb6, 0x35, 0x7b, 0x04, 0xca, 0xbf, 0xc4, 0x29, 0x0b, 0x8d, 0xef, 0xfb, 0xb7, 0xee, + 0x8a, 0x66, 0x13, 0xe2, 0x2f, 0xc0, 0xb4, 0x20, 0xde, 0x31, 0x1d, 0xac, 0x5b, 0x3b, 0xa6, 0xf1, + 0x0a, 0x6e, 0x8e, 0x40, 0xfa, 0x97, 0xbb, 0xa6, 0x6a, 0x33, 0x84, 0x4e, 0x28, 0xd7, 0x41, 0xf2, + 0x7d, 0x15, 0xd5, 0x68, 0xdb, 0x96, 0xe3, 0x0d, 0xa1, 0xf8, 0x39, 0x31, 0x53, 0x3e, 0x5e, 0x9d, + 0xa2, 0x2d, 0xd4, 0x80, 0xed, 0x54, 0x8f, 0x2a, 0x92, 0x9f, 0xe7, 0x84, 0xc6, 0x03, 0x2c, 0xae, + 0x38, 0x74, 0xab, 0x6d, 0x6b, 0xce, 0x28, 0xfa, 0xef, 0xef, 0x0a, 0xc5, 0xc1, 0x51, 0xb8, 0xe2, + 0x20, 0x1e, 0x1d, 0xb1, 0xf6, 0x23, 0x50, 0xf8, 0x82, 0x50, 0x1c, 0x02, 0x87, 0x93, 0x10, 0x0e, + 0xc3, 0x08, 0x24, 0xfe, 0x9e, 0x20, 0x21, 0x70, 0x08, 0x89, 0xe7, 0x02, 0x43, 0xeb, 0xe0, 0x1d, + 0xc3, 0xf5, 0x1c, 0xe6, 0x14, 0x1f, 0x4c, 0xea, 0x8b, 0xdf, 0x8a, 0x3a, 0x61, 0x4a, 0x08, 0x95, + 0x68, 0x22, 0x9e, 0xa6, 0xa5, 0x31, 0xd3, 0xf0, 0x8e, 0xfd, 0x8a, 0xd0, 0x44, 0x21, 0x34, 0xd2, + 0xb7, 0x90, 0x87, 0x48, 0xd8, 0xae, 0x93, 0x48, 0x61, 0x04, 0x72, 0xbf, 0xda, 0xd5, 0xb9, 0x86, + 0xc0, 0x25, 0x34, 0x43, 0xfe, 0x4f, 0xc7, 0xbc, 0x81, 0xf7, 0x47, 0x92, 0xce, 0x5f, 0xeb, 0xf2, + 0x7f, 0x36, 0x19, 0x26, 0xd3, 0x21, 0xa5, 0x2e, 0x7f, 0x0a, 0x0d, 0x3b, 0x97, 0x34, 0xfd, 0xa3, + 0xdf, 0xe1, 0xe3, 0x8d, 0xba, 0x53, 0x0b, 0xcb, 0x44, 0xc8, 0xa3, 0x4e, 0xcf, 0x70, 0x62, 0xaf, + 0x7d, 0xc7, 0x97, 0xf3, 0x88, 0xcf, 0xb3, 0x70, 0x09, 0xc6, 0x23, 0x0e, 0xcf, 0x70, 0x52, 0x7f, + 0x96, 0x93, 0x2a, 0x84, 0xfd, 0x9d, 0x85, 0xb3, 0x90, 0x24, 0xce, 0xcb, 0x70, 0xf4, 0x1f, 0xe3, + 0xe8, 0x14, 0x7c, 0xe1, 0x19, 0xc8, 0x0a, 0xa7, 0x65, 0x38, 0xea, 0x9f, 0xe3, 0xa8, 0x3e, 0x0a, + 0x41, 0x17, 0x0e, 0xcb, 0x70, 0xf4, 0x3f, 0x2f, 0xd0, 0x05, 0x0a, 0x41, 0x1f, 0x9d, 0x85, 0x5f, + 0xfa, 0x0b, 0x49, 0x6e, 0x74, 0x04, 0xef, 0x2e, 0x42, 0x86, 0x7b, 0x2a, 0xc3, 0xb1, 0x3f, 0xc8, + 0x3f, 0x2e, 0x30, 0x16, 0xce, 0x43, 0x6a, 0x44, 0x86, 0xff, 0x25, 0x8e, 0xca, 0xe0, 0x17, 0xaa, + 0x90, 0x0f, 0x79, 0x27, 0xc3, 0xd1, 0x7f, 0x9c, 0xa3, 0x87, 0xb1, 0x48, 0xd7, 0xb9, 0x77, 0x32, + 0x9c, 0xc0, 0x5f, 0x16, 0x5d, 0xe7, 0x18, 0x84, 0x6d, 0xc2, 0x31, 0x19, 0x8e, 0xfd, 0x21, 0xc1, + 0x75, 0x81, 0xb2, 0xf0, 0x2c, 0xe4, 0x7c, 0x63, 0x33, 0x1c, 0xff, 0x27, 0x38, 0x7e, 0x80, 0x43, + 0x38, 0x10, 0x32, 0x76, 0xc3, 0x49, 0xfc, 0xa4, 0xe0, 0x40, 0x08, 0x8b, 0x2c, 0xa3, 0x6e, 0x07, + 0x66, 0x38, 0xa5, 0x9f, 0x12, 0xcb, 0xa8, 0xcb, 0x7f, 0x21, 0xb3, 0x49, 0x75, 0xfe, 0x70, 0x12, + 0x7f, 0x45, 0xcc, 0x26, 0x85, 0x27, 0xdd, 0xe8, 0xf6, 0x08, 0x86, 0xd3, 0xf8, 0x69, 0xd1, 0x8d, + 0x2e, 0x87, 0x60, 0x61, 0x1d, 0x50, 0xaf, 0x37, 0x30, 0x9c, 0xde, 0x87, 0x39, 0xbd, 0x89, 0x1e, + 0x67, 0x60, 0xe1, 0x79, 0x38, 0xd2, 0xdf, 0x13, 0x18, 0x4e, 0xf5, 0x67, 0xbe, 0xd3, 0x15, 0xbb, + 0x85, 0x1d, 0x81, 0x85, 0x8d, 0xc0, 0xa4, 0x84, 0xbd, 0x80, 0xe1, 0x64, 0x3f, 0xf2, 0x9d, 0xa8, + 0xe2, 0x0e, 0x3b, 0x01, 0x0b, 0x15, 0x80, 0xc0, 0x00, 0x0f, 0xa7, 0xf5, 0x51, 0x4e, 0x2b, 0x84, + 0x44, 0x96, 0x06, 0xb7, 0xbf, 0xc3, 0xf1, 0xef, 0x88, 0xa5, 0xc1, 0x31, 0xc8, 0xd2, 0x10, 0xa6, + 0x77, 0x38, 0xf6, 0xc7, 0xc4, 0xd2, 0x10, 0x28, 0x44, 0xb2, 0x43, 0xd6, 0x6d, 0x38, 0x85, 0x4f, + 0x08, 0xc9, 0x0e, 0x61, 0x2d, 0xac, 0xc2, 0x44, 0x8f, 0x41, 0x1c, 0x4e, 0xea, 0xe7, 0x38, 0x29, + 0xa9, 0xdb, 0x1e, 0x86, 0x8d, 0x17, 0x37, 0x86, 0xc3, 0xa9, 0x7d, 0xb2, 0xcb, 0x78, 0x71, 0x5b, + 0xb8, 0x70, 0x11, 0xb2, 0x66, 0xa7, 0xd5, 0x22, 0x8b, 0x07, 0x1d, 0x7c, 0x96, 0x70, 0xfa, 0xbf, + 0x7c, 0x97, 0x73, 0x47, 0x20, 0x2c, 0x9c, 0x85, 0x14, 0x6e, 0x6f, 0xe1, 0xe6, 0x30, 0xcc, 0x6f, + 0x7e, 0x57, 0x28, 0x4c, 0x02, 0xbd, 0xf0, 0x2c, 0x00, 0x4b, 0x8d, 0xd0, 0xcd, 0xc3, 0x21, 0xb8, + 0xff, 0xf5, 0xbb, 0xfc, 0xf0, 0x4e, 0x80, 0x12, 0x10, 0x60, 0x47, 0x81, 0x0e, 0x26, 0xf0, 0xad, + 0x28, 0x01, 0x3a, 0x23, 0x17, 0x20, 0xf3, 0xb2, 0x6b, 0x99, 0x9e, 0xb6, 0x33, 0x0c, 0xfb, 0xf7, + 0x39, 0xb6, 0x80, 0x27, 0x0c, 0x6b, 0x5b, 0x0e, 0xf6, 0xb4, 0x1d, 0x77, 0x18, 0xee, 0x7f, 0xe3, + 0xb8, 0x3e, 0x02, 0x41, 0xd6, 0x35, 0xd7, 0x1b, 0x65, 0xdc, 0x7f, 0x20, 0x90, 0x05, 0x02, 0xe9, + 0x34, 0xf9, 0x7d, 0x03, 0xef, 0x0f, 0xc3, 0xfd, 0x43, 0xd1, 0x69, 0x0e, 0xbf, 0xf0, 0x0c, 0xe4, + 0xc8, 0x4f, 0x76, 0x22, 0x6f, 0x08, 0xf2, 0x7f, 0xe7, 0xc8, 0x01, 0x06, 0xf9, 0xb2, 0xeb, 0x35, + 0x3d, 0x63, 0x38, 0xb3, 0xbf, 0xcd, 0x67, 0x5a, 0xc0, 0x2f, 0x54, 0x20, 0xef, 0x7a, 0xcd, 0x66, + 0x87, 0xfb, 0xa7, 0x43, 0xd0, 0xff, 0xe8, 0xbb, 0x7e, 0xca, 0xc2, 0xc7, 0x21, 0xb3, 0x7d, 0xeb, + 0x86, 0x67, 0x5b, 0x74, 0xc3, 0x63, 0x18, 0x85, 0xef, 0x70, 0x0a, 0x21, 0x94, 0x85, 0x2a, 0x14, + 0xc8, 0x58, 0x1c, 0x6c, 0x63, 0xba, 0x3b, 0x35, 0x84, 0xc4, 0xff, 0xe0, 0x0c, 0x88, 0x20, 0x2d, + 0xbe, 0xef, 0xcb, 0x6f, 0xcc, 0xc4, 0xbe, 0xfa, 0xc6, 0x4c, 0xec, 0xf7, 0xde, 0x98, 0x89, 0x7d, + 0xe8, 0x6b, 0x33, 0x63, 0x5f, 0xfd, 0xda, 0xcc, 0xd8, 0x6f, 0x7f, 0x6d, 0x66, 0xac, 0x7f, 0x96, + 0x18, 0x2e, 0x5b, 0x97, 0x2d, 0x96, 0x1f, 0x7e, 0xe9, 0xc1, 0x1d, 0xc3, 0xdb, 0xed, 0x6c, 0xcd, + 0xeb, 0x56, 0xfb, 0xb4, 0x6e, 0xb9, 0x6d, 0xcb, 0x3d, 0x1d, 0xcd, 0xeb, 0xd2, 0x5f, 0xf0, 0xbd, + 0x18, 0x89, 0x99, 0xa3, 0xe9, 0x5c, 0xcd, 0xdc, 0x1f, 0x74, 0xbd, 0xe7, 0x1c, 0x24, 0x2a, 0xe6, + 0x3e, 0x3a, 0xc6, 0x14, 0x9c, 0xda, 0x71, 0x5a, 0xfc, 0x58, 0x58, 0x86, 0x94, 0x37, 0x9d, 0x16, + 0x9a, 0x0a, 0xce, 0x6e, 0xc6, 0x4e, 0x14, 0xf8, 0x81, 0xcc, 0xc5, 0x1f, 0x8f, 0x1d, 0x6e, 0x24, + 0xd9, 0x8a, 0xb9, 0x4f, 0x07, 0xb2, 0x1e, 0x7b, 0xe9, 0xd1, 0xa1, 0x79, 0xee, 0x1b, 0xa6, 0x75, + 0xcb, 0x24, 0xdd, 0xb6, 0xb7, 0x44, 0x8e, 0x7b, 0xa6, 0x3b, 0xc7, 0xfd, 0x3c, 0x6e, 0xb5, 0xae, + 0x11, 0xb8, 0x0d, 0x82, 0xb2, 0x95, 0x66, 0x27, 0x90, 0xe1, 0xa7, 0xe2, 0x30, 0xd3, 0x93, 0xce, + 0xe6, 0x42, 0x30, 0x88, 0x09, 0x0b, 0x90, 0x5d, 0x12, 0xb2, 0x35, 0x0d, 0x19, 0x17, 0xeb, 0x96, + 0xd9, 0x74, 0x29, 0x23, 0x12, 0x8a, 0x28, 0x12, 0x46, 0x98, 0x9a, 0x69, 0xb9, 0xfc, 0x60, 0x25, + 0x2b, 0x2c, 0xfe, 0xec, 0x21, 0x19, 0x31, 0x2e, 0xbe, 0x24, 0xb8, 0xf1, 0xc4, 0x88, 0xdc, 0x10, + 0x83, 0x88, 0x64, 0xfe, 0x47, 0xe5, 0xca, 0x4f, 0xc7, 0x61, 0xb6, 0x9b, 0x2b, 0x64, 0x65, 0xb9, + 0x9e, 0xd6, 0xb6, 0x07, 0xb1, 0xe5, 0x22, 0xe4, 0x36, 0x04, 0xcc, 0xa1, 0xf9, 0x72, 0xe7, 0x90, + 0x7c, 0x29, 0xfa, 0x9f, 0x12, 0x8c, 0x39, 0x33, 0x22, 0x63, 0xfc, 0x71, 0xdc, 0x15, 0x67, 0xfe, + 0x77, 0x1a, 0x8e, 0xb1, 0xe5, 0xa4, 0xb2, 0xa5, 0xc4, 0x0a, 0x9c, 0x27, 0x85, 0x70, 0xd3, 0xf0, + 0x7d, 0x12, 0xf9, 0x1a, 0x4c, 0xd6, 0x89, 0xb6, 0x20, 0x51, 0x50, 0xb0, 0xc3, 0xd3, 0xf7, 0xec, + 0xe9, 0x5c, 0xc4, 0xe1, 0xe7, 0x3b, 0x4c, 0xe1, 0x2a, 0xf9, 0x47, 0x63, 0x20, 0x35, 0x74, 0xad, + 0xa5, 0x39, 0xdf, 0x2f, 0x29, 0x74, 0x1e, 0x80, 0xde, 0x59, 0x0a, 0x2e, 0x19, 0x15, 0xcf, 0x4c, + 0xcf, 0x87, 0x07, 0x37, 0xcf, 0xbe, 0x44, 0x6f, 0x30, 0xe4, 0x28, 0x2c, 0xf9, 0x79, 0xea, 0x05, + 0x80, 0xa0, 0x01, 0x1d, 0x87, 0xa3, 0x8d, 0x6a, 0x65, 0xb9, 0xa2, 0xa8, 0xec, 0x30, 0xfc, 0x6a, + 0x63, 0xbd, 0x56, 0xad, 0x5f, 0xaa, 0xd7, 0x96, 0xa4, 0x31, 0x74, 0x04, 0x50, 0xb8, 0xd1, 0x3f, + 0x97, 0x72, 0x0f, 0x4c, 0x84, 0xeb, 0xd9, 0x89, 0xfa, 0x38, 0xf1, 0x14, 0x8d, 0xb6, 0xdd, 0xc2, + 0x74, 0xeb, 0x4f, 0x35, 0x04, 0xd7, 0x86, 0x3b, 0x21, 0xff, 0xe2, 0xdf, 0xb2, 0x53, 0xd6, 0x93, + 0x01, 0xba, 0xcf, 0xf3, 0x85, 0x65, 0x98, 0xd0, 0x74, 0x1d, 0xdb, 0x11, 0x92, 0x43, 0x54, 0x35, + 0x21, 0x48, 0x37, 0x33, 0x39, 0x66, 0x40, 0xed, 0x3c, 0xa4, 0x5d, 0x3a, 0xfa, 0x61, 0x24, 0xbe, + 0xc2, 0x49, 0x70, 0xf0, 0x05, 0x13, 0x26, 0x88, 0xe7, 0xa7, 0x39, 0x38, 0xd4, 0x8d, 0x83, 0xf3, + 0x0c, 0xff, 0xe0, 0x73, 0x8f, 0xd3, 0xad, 0xcd, 0xfb, 0xa3, 0xd3, 0xd2, 0x47, 0x9c, 0x14, 0x89, + 0xd3, 0x0e, 0x3a, 0x8a, 0xa1, 0x28, 0xbe, 0xc7, 0x3b, 0x7c, 0xf0, 0xc7, 0x7e, 0x9d, 0x7f, 0x6c, + 0xa6, 0x9f, 0x0c, 0x84, 0xbe, 0x34, 0xce, 0xa9, 0xb2, 0x86, 0xc5, 0xda, 0xa0, 0x35, 0xfd, 0xd2, + 0x23, 0xbd, 0xd6, 0x89, 0xfd, 0x79, 0x8c, 0x52, 0xbe, 0x18, 0xfe, 0x8c, 0xbf, 0xf6, 0x7e, 0x2b, + 0x01, 0x33, 0x1c, 0x78, 0x4b, 0x73, 0xf1, 0xe9, 0x9b, 0x4f, 0x6c, 0x61, 0x4f, 0x7b, 0xe2, 0xb4, + 0x6e, 0x19, 0x42, 0x57, 0x4f, 0xf2, 0xe5, 0x48, 0xda, 0xe7, 0x79, 0x7b, 0xb9, 0xef, 0x86, 0x66, + 0x79, 0xf0, 0x32, 0x96, 0x37, 0x21, 0x59, 0xb5, 0x0c, 0x93, 0xa8, 0xaa, 0x26, 0x36, 0xad, 0x36, + 0x5f, 0x3d, 0xac, 0x80, 0x9e, 0x80, 0xb4, 0xd6, 0xb6, 0x3a, 0xa6, 0xc7, 0x56, 0xce, 0xe2, 0xb1, + 0x2f, 0xbf, 0x3e, 0x3b, 0xf6, 0xef, 0x5f, 0x9f, 0x4d, 0xd4, 0x4d, 0xef, 0x37, 0x3f, 0xff, 0x18, + 0x70, 0x52, 0x75, 0xd3, 0x53, 0x38, 0xe0, 0x42, 0xf2, 0x1b, 0x1f, 0x9f, 0x8d, 0xc9, 0x2f, 0x40, + 0x66, 0x09, 0xeb, 0x77, 0x43, 0x79, 0x09, 0xeb, 0x21, 0xca, 0x4b, 0x58, 0xef, 0xa2, 0x7c, 0x1e, + 0xb2, 0x75, 0xd3, 0x63, 0x07, 0xd7, 0x1f, 0x81, 0x84, 0x61, 0xb2, 0xb3, 0x90, 0x07, 0xf6, 0x8d, + 0x40, 0x11, 0xc4, 0x25, 0xac, 0xfb, 0x88, 0x4d, 0xac, 0x77, 0x23, 0xf6, 0x7e, 0x9a, 0x40, 0x2d, + 0x2e, 0xfd, 0xf6, 0x7f, 0x9c, 0x19, 0x7b, 0xf5, 0x8d, 0x99, 0xb1, 0x81, 0x53, 0x2c, 0x0f, 0x9c, + 0x62, 0xb7, 0x79, 0x83, 0x69, 0x64, 0x7f, 0x66, 0x3f, 0x93, 0x84, 0xfb, 0xe8, 0x7d, 0x26, 0xa7, + 0x6d, 0x98, 0xde, 0x69, 0xdd, 0xd9, 0xb7, 0x3d, 0x8b, 0xe8, 0x4d, 0x6b, 0x9b, 0x4f, 0xec, 0x44, + 0xd0, 0x3c, 0xcf, 0x9a, 0xfb, 0x4f, 0xab, 0xbc, 0x0d, 0xa9, 0x75, 0x82, 0x47, 0x58, 0xec, 0x59, + 0x9e, 0xd6, 0xe2, 0xf6, 0x87, 0x15, 0x48, 0x2d, 0xbb, 0x03, 0x15, 0x67, 0xb5, 0x86, 0xb8, 0xfe, + 0xd4, 0xc2, 0xda, 0x36, 0x3b, 0x4a, 0x9e, 0xa0, 0x8e, 0x4b, 0x96, 0x54, 0xd0, 0x53, 0xe3, 0x53, + 0x90, 0xd2, 0x3a, 0xec, 0x0c, 0x43, 0x82, 0x78, 0x34, 0xb4, 0x20, 0x5f, 0x83, 0x0c, 0xdf, 0x49, + 0x45, 0x12, 0x24, 0x6e, 0xe0, 0x7d, 0xfa, 0x9d, 0x82, 0x42, 0x7e, 0xa2, 0x79, 0x48, 0xd1, 0xce, + 0xf3, 0x3b, 0x32, 0xd3, 0xf3, 0x3d, 0xbd, 0x9f, 0xa7, 0x9d, 0x54, 0x18, 0x98, 0x7c, 0x15, 0xb2, + 0x4b, 0x56, 0xdb, 0x30, 0xad, 0x28, 0xb5, 0x1c, 0xa3, 0x46, 0xfb, 0x6c, 0x77, 0xb8, 0x54, 0x28, + 0xac, 0x80, 0x8e, 0x40, 0x9a, 0x5d, 0x2d, 0xe0, 0xe7, 0x30, 0x78, 0x49, 0xae, 0x42, 0x86, 0xd2, + 0x5e, 0xb3, 0x89, 0xf2, 0xf7, 0x4f, 0x71, 0xe6, 0xf8, 0x45, 0x33, 0x4e, 0x3e, 0x1e, 0x74, 0x16, + 0x41, 0xb2, 0xa9, 0x79, 0x1a, 0x1f, 0x37, 0xfd, 0x2d, 0xbf, 0x0b, 0xb2, 0x9c, 0x88, 0x8b, 0xce, + 0x40, 0xc2, 0xb2, 0x5d, 0x7e, 0x92, 0xa2, 0x3c, 0x68, 0x28, 0x6b, 0xf6, 0x62, 0x92, 0xc8, 0x8c, + 0x42, 0x80, 0x17, 0x95, 0x81, 0x62, 0xf1, 0x74, 0x48, 0x2c, 0x42, 0x53, 0x1e, 0xfa, 0xc9, 0xa6, + 0xb4, 0x47, 0x1c, 0x7c, 0x61, 0xf9, 0x44, 0x1c, 0x66, 0x42, 0xad, 0x37, 0xb1, 0xe3, 0x1a, 0x96, + 0xc9, 0x24, 0x8a, 0x4b, 0x0b, 0x0a, 0x75, 0x92, 0xb7, 0x0f, 0x10, 0x97, 0x67, 0x20, 0x51, 0xb1, + 0x6d, 0x54, 0x86, 0x2c, 0x2d, 0xeb, 0x16, 0x93, 0x97, 0xa4, 0xe2, 0x97, 0x49, 0x9b, 0x6b, 0x6d, + 0x7b, 0xb7, 0x34, 0xc7, 0xbf, 0x7d, 0x27, 0xca, 0xf2, 0x05, 0xc8, 0x55, 0x2d, 0xd3, 0xc5, 0xa6, + 0xdb, 0xa1, 0x9e, 0xcd, 0x56, 0xcb, 0xd2, 0x6f, 0x70, 0x0a, 0xac, 0x40, 0x18, 0xae, 0xd9, 0x36, + 0xc5, 0x4c, 0x2a, 0xe4, 0x27, 0x5b, 0xb3, 0x8b, 0x8d, 0x81, 0x2c, 0xba, 0x70, 0x78, 0x16, 0xf1, + 0x41, 0xfa, 0x3c, 0xfa, 0x5e, 0x0c, 0xee, 0xed, 0x5d, 0x50, 0x37, 0xf0, 0xbe, 0x7b, 0xd8, 0xf5, + 0xf4, 0x02, 0xe4, 0xd6, 0xe9, 0x15, 0xf8, 0x6b, 0x78, 0x1f, 0x95, 0x21, 0x83, 0x9b, 0x67, 0xce, + 0x9e, 0x7d, 0xe2, 0x02, 0x93, 0xf6, 0x2b, 0x63, 0x8a, 0xa8, 0x40, 0x33, 0x90, 0x73, 0xb1, 0x6e, + 0x9f, 0x39, 0x7b, 0xee, 0xc6, 0x13, 0x4c, 0xbc, 0xae, 0x8c, 0x29, 0x41, 0xd5, 0x42, 0x96, 0x8c, + 0xfa, 0x1b, 0x9f, 0x98, 0x8d, 0x2d, 0xa6, 0x20, 0xe1, 0x76, 0xda, 0x6f, 0xa9, 0x8c, 0x7c, 0x24, + 0x05, 0x73, 0x61, 0x4c, 0xea, 0xff, 0xdd, 0xd4, 0x5a, 0x46, 0x53, 0x0b, 0x1e, 0x2f, 0x90, 0x42, + 0x3c, 0xa0, 0x10, 0x03, 0x2c, 0xc5, 0x81, 0x9c, 0x94, 0x7f, 0x39, 0x06, 0x85, 0xeb, 0x82, 0x72, + 0x03, 0x7b, 0xe8, 0x22, 0x80, 0xff, 0x25, 0xb1, 0x6c, 0x8e, 0xcf, 0x77, 0x7f, 0x6b, 0xde, 0xc7, + 0x51, 0x42, 0xe0, 0xe8, 0x3c, 0x15, 0x44, 0xdb, 0x72, 0xf9, 0x8d, 0xac, 0x21, 0xa8, 0x3e, 0x30, + 0x7a, 0x14, 0x10, 0xd5, 0x70, 0xea, 0x4d, 0xcb, 0x33, 0xcc, 0x1d, 0xd5, 0xb6, 0x6e, 0xf1, 0x7b, + 0xae, 0x09, 0x45, 0xa2, 0x2d, 0xd7, 0x69, 0xc3, 0x3a, 0xa9, 0x27, 0x9d, 0xce, 0xf9, 0x54, 0x88, + 0xb3, 0xae, 0x35, 0x9b, 0x0e, 0x76, 0x5d, 0xae, 0xc4, 0x44, 0x11, 0x5d, 0x84, 0x8c, 0xdd, 0xd9, + 0x52, 0x85, 0xc6, 0xc8, 0x9f, 0xb9, 0xb7, 0xdf, 0xfa, 0x17, 0xf2, 0xc1, 0x35, 0x40, 0xda, 0xee, + 0x6c, 0x11, 0x69, 0xb9, 0x1f, 0x0a, 0x7d, 0x3a, 0x93, 0xbf, 0x19, 0xf4, 0x83, 0xbe, 0xbc, 0xc0, + 0x47, 0xa0, 0xda, 0x8e, 0x61, 0x39, 0x86, 0xb7, 0x4f, 0x8f, 0x43, 0x25, 0x14, 0x49, 0x34, 0xac, + 0xf3, 0x7a, 0xf9, 0x06, 0x94, 0x1a, 0xd4, 0x89, 0x0b, 0x7a, 0x7e, 0x36, 0xe8, 0x5f, 0x6c, 0x78, + 0xff, 0x06, 0xf6, 0x2c, 0xde, 0xd3, 0xb3, 0xc5, 0xe7, 0x06, 0x4a, 0xe7, 0xf9, 0xc3, 0x4b, 0x67, + 0xd4, 0xda, 0xfd, 0xc1, 0xb1, 0xc8, 0xe2, 0x64, 0xc2, 0x19, 0x56, 0x5f, 0xa3, 0x0a, 0xe6, 0xb0, + 0x18, 0xad, 0x7c, 0xb0, 0x51, 0x2d, 0x0f, 0x51, 0xa3, 0xe5, 0xa1, 0x4b, 0x48, 0xbe, 0x00, 0xe3, + 0xeb, 0x9a, 0xe3, 0x35, 0xb0, 0x77, 0x05, 0x6b, 0x4d, 0xec, 0x44, 0xad, 0xee, 0xb8, 0xb0, 0xba, + 0x08, 0x92, 0xd4, 0xb4, 0x32, 0xab, 0x43, 0x7f, 0xcb, 0xbb, 0x90, 0xa4, 0x47, 0x22, 0x7d, 0x8b, + 0xcc, 0x31, 0x98, 0x45, 0x26, 0xba, 0x74, 0xdf, 0xc3, 0xae, 0x48, 0x23, 0xd0, 0x02, 0x7a, 0x4a, + 0xd8, 0xd5, 0xc4, 0xc1, 0x76, 0x95, 0x0b, 0x22, 0xb7, 0xae, 0x2d, 0xc8, 0x2c, 0x12, 0x55, 0x5c, + 0x5f, 0xf2, 0x3b, 0x12, 0x0b, 0x3a, 0x82, 0x56, 0xa0, 0x64, 0x6b, 0x8e, 0x47, 0x6f, 0x93, 0xec, + 0xd2, 0x51, 0x70, 0x59, 0x9f, 0xed, 0x5d, 0x79, 0x91, 0xc1, 0xf2, 0xaf, 0x8c, 0xdb, 0xe1, 0x4a, + 0xf9, 0x3f, 0x25, 0x21, 0xcd, 0x99, 0xf1, 0x0c, 0x64, 0x38, 0x5b, 0xb9, 0x74, 0xde, 0x37, 0xdf, + 0x6b, 0x98, 0xe6, 0x7d, 0x03, 0xc2, 0xe9, 0x09, 0x1c, 0xf4, 0x10, 0x64, 0xf5, 0x5d, 0xcd, 0x30, + 0x55, 0xa3, 0xc9, 0x1d, 0xc2, 0xfc, 0x1b, 0xaf, 0xcf, 0x66, 0xaa, 0xa4, 0xae, 0xbe, 0xa4, 0x64, + 0x68, 0x63, 0xbd, 0x49, 0x3c, 0x81, 0x5d, 0x6c, 0xec, 0xec, 0x7a, 0x7c, 0x85, 0xf1, 0x12, 0x7a, + 0x1a, 0x92, 0x44, 0x20, 0xf8, 0x5d, 0xc3, 0x72, 0x8f, 0x87, 0xef, 0x87, 0xd0, 0x8b, 0x59, 0xf2, + 0xe1, 0x0f, 0xfd, 0xee, 0x6c, 0x4c, 0xa1, 0x18, 0xa8, 0x0a, 0xe3, 0x2d, 0xcd, 0xf5, 0x54, 0x6a, + 0xc1, 0xc8, 0xe7, 0x53, 0x94, 0xc4, 0xb1, 0x5e, 0x86, 0x70, 0xc6, 0xf2, 0xae, 0xe7, 0x09, 0x16, + 0xab, 0x6a, 0xa2, 0x13, 0x20, 0x51, 0x22, 0xba, 0xd5, 0x6e, 0x1b, 0x1e, 0xf3, 0xad, 0xd2, 0x94, + 0xef, 0x45, 0x52, 0x5f, 0xa5, 0xd5, 0xd4, 0xc3, 0x3a, 0x0e, 0x39, 0x7a, 0xbb, 0x89, 0x82, 0xb0, + 0x73, 0xb8, 0x59, 0x52, 0x41, 0x1b, 0x1f, 0x86, 0x52, 0xa0, 0x1f, 0x19, 0x48, 0x96, 0x51, 0x09, + 0xaa, 0x29, 0xe0, 0xe3, 0x30, 0x65, 0xe2, 0x3d, 0x7a, 0x32, 0x38, 0x02, 0x9d, 0xa3, 0xd0, 0x88, + 0xb4, 0x5d, 0x8f, 0x62, 0x3c, 0x08, 0x45, 0x5d, 0x30, 0x9f, 0xc1, 0x02, 0x85, 0x1d, 0xf7, 0x6b, + 0x29, 0xd8, 0x31, 0xc8, 0x6a, 0xb6, 0xcd, 0x00, 0xf2, 0x5c, 0x3f, 0xda, 0x36, 0x6d, 0x3a, 0x05, + 0x13, 0x74, 0x8c, 0x0e, 0x76, 0x3b, 0x2d, 0x8f, 0x13, 0x29, 0x50, 0x98, 0x12, 0x69, 0x50, 0x58, + 0x3d, 0x85, 0x7d, 0x00, 0xc6, 0xf1, 0x4d, 0xa3, 0x89, 0x4d, 0x1d, 0x33, 0xb8, 0x71, 0x0a, 0x57, + 0x10, 0x95, 0x14, 0xe8, 0x24, 0xf8, 0x7a, 0x4f, 0x15, 0x3a, 0xb9, 0xc8, 0xe8, 0x89, 0xfa, 0x0a, + 0xab, 0x96, 0xa7, 0x21, 0xb9, 0xa4, 0x79, 0x1a, 0x71, 0x30, 0xbc, 0x3d, 0x66, 0x68, 0x0a, 0x0a, + 0xf9, 0x29, 0x7f, 0x23, 0x0e, 0xc9, 0xeb, 0x96, 0x87, 0xd1, 0x93, 0x21, 0x07, 0xb0, 0xd8, 0x4f, + 0x9e, 0x1b, 0xc6, 0x8e, 0x89, 0x9b, 0x2b, 0xee, 0x4e, 0xe8, 0x29, 0x82, 0x40, 0x9c, 0xe2, 0x11, + 0x71, 0x9a, 0x82, 0x94, 0x63, 0x75, 0xcc, 0xa6, 0x38, 0xc2, 0x4a, 0x0b, 0xa8, 0x06, 0x59, 0x5f, + 0x4a, 0x92, 0xc3, 0xa4, 0xa4, 0x44, 0xa4, 0x84, 0xc8, 0x30, 0xaf, 0x50, 0x32, 0x5b, 0x5c, 0x58, + 0x16, 0x21, 0xe7, 0x2b, 0x2f, 0x2e, 0x6d, 0xa3, 0x09, 0x6c, 0x80, 0x46, 0x8c, 0x89, 0x3f, 0xf7, + 0x3e, 0xf3, 0x98, 0xc4, 0x49, 0x7e, 0x03, 0xe7, 0x5e, 0x44, 0xac, 0xf8, 0xb3, 0x08, 0x19, 0x3a, + 0xae, 0x40, 0xac, 0xd8, 0xd3, 0x08, 0xf7, 0x42, 0xce, 0x35, 0x76, 0x4c, 0xcd, 0xeb, 0x38, 0x98, + 0x4b, 0x5e, 0x50, 0x21, 0x7f, 0x29, 0x06, 0x69, 0x26, 0xc9, 0x21, 0xbe, 0xc5, 0xfa, 0xf3, 0x2d, + 0x3e, 0x88, 0x6f, 0x89, 0xbb, 0xe7, 0x5b, 0x05, 0xc0, 0xef, 0x8c, 0xcb, 0x6f, 0xab, 0xf7, 0xf1, + 0x18, 0x58, 0x17, 0x1b, 0xc6, 0x0e, 0x5f, 0xa8, 0x21, 0x24, 0xf9, 0x3f, 0xc4, 0x88, 0x13, 0xcb, + 0xdb, 0x51, 0x05, 0xc6, 0x45, 0xbf, 0xd4, 0xed, 0x96, 0xb6, 0xc3, 0x65, 0xe7, 0xbe, 0x81, 0x9d, + 0xbb, 0xd4, 0xd2, 0x76, 0x94, 0x3c, 0xef, 0x0f, 0x29, 0xf4, 0x9f, 0x87, 0xf8, 0x80, 0x79, 0x88, + 0x4c, 0x7c, 0xe2, 0xee, 0x26, 0x3e, 0x32, 0x45, 0xc9, 0xee, 0x29, 0xfa, 0x5c, 0x9c, 0x06, 0x33, + 0xb6, 0xe5, 0x6a, 0xad, 0xb7, 0x63, 0x45, 0x1c, 0x87, 0x9c, 0x6d, 0xb5, 0x54, 0xd6, 0xc2, 0x8e, + 0x76, 0x67, 0x6d, 0xab, 0xa5, 0xf4, 0x4c, 0x7b, 0xea, 0x4d, 0x5a, 0x2e, 0xe9, 0x37, 0x81, 0x6b, + 0x99, 0x6e, 0xae, 0x39, 0x50, 0x60, 0xac, 0xe0, 0xb6, 0xec, 0x71, 0xc2, 0x03, 0x6a, 0x1c, 0x63, + 0xbd, 0xb6, 0x97, 0x75, 0x9b, 0x41, 0x2a, 0x1c, 0x8e, 0x60, 0x30, 0xd5, 0xdf, 0x2f, 0x0a, 0x0e, + 0x8b, 0xa5, 0xc2, 0xe1, 0xe4, 0xbf, 0x1a, 0x03, 0x58, 0x26, 0x9c, 0xa5, 0xe3, 0x25, 0x56, 0xc8, + 0xa5, 0x5d, 0x50, 0x23, 0x5f, 0x9e, 0x19, 0x34, 0x69, 0xfc, 0xfb, 0x05, 0x37, 0xdc, 0xef, 0x2a, + 0x8c, 0x07, 0xc2, 0xe8, 0x62, 0xd1, 0x99, 0x99, 0x03, 0xbc, 0xea, 0x06, 0xf6, 0x94, 0xc2, 0xcd, + 0x50, 0x49, 0xfe, 0xc7, 0x31, 0xc8, 0xd1, 0x3e, 0xad, 0x60, 0x4f, 0x8b, 0xcc, 0x61, 0xec, 0xee, + 0xe7, 0xf0, 0x3e, 0x00, 0x46, 0xc6, 0x35, 0x5e, 0xc1, 0x5c, 0xb2, 0x72, 0xb4, 0xa6, 0x61, 0xbc, + 0x82, 0xd1, 0x39, 0x9f, 0xe1, 0x89, 0x83, 0x19, 0x2e, 0xbc, 0x6e, 0xce, 0xf6, 0xa3, 0x90, 0xa1, + 0xaf, 0x3b, 0xed, 0xb9, 0xdc, 0x91, 0x4e, 0x9b, 0x9d, 0xf6, 0xc6, 0x9e, 0x2b, 0xbf, 0x0c, 0x99, + 0x8d, 0x3d, 0x96, 0x1b, 0x39, 0x0e, 0x39, 0xc7, 0xb2, 0xb8, 0x4d, 0x66, 0xbe, 0x50, 0x96, 0x54, + 0x50, 0x13, 0x24, 0xf2, 0x01, 0xf1, 0x20, 0x1f, 0x10, 0x24, 0x34, 0x12, 0x23, 0x25, 0x34, 0x4e, + 0xfd, 0x56, 0x0c, 0xf2, 0x21, 0xfd, 0x80, 0x9e, 0x80, 0x7b, 0x16, 0x97, 0xd7, 0xaa, 0xd7, 0xd4, + 0xfa, 0x92, 0x7a, 0x69, 0xb9, 0x72, 0x39, 0xb8, 0xbc, 0x54, 0x3e, 0x72, 0xfb, 0xce, 0x1c, 0x0a, + 0xc1, 0x6e, 0x9a, 0x34, 0x4f, 0x8f, 0x4e, 0xc3, 0x54, 0x14, 0xa5, 0xb2, 0xd8, 0xa8, 0xad, 0x6e, + 0x48, 0xb1, 0xf2, 0x3d, 0xb7, 0xef, 0xcc, 0x4d, 0x84, 0x30, 0x2a, 0x5b, 0x2e, 0x36, 0xbd, 0x5e, + 0x84, 0xea, 0xda, 0xca, 0x4a, 0x7d, 0x43, 0x8a, 0xf7, 0x20, 0x70, 0x85, 0x7d, 0x12, 0x26, 0xa2, + 0x08, 0xab, 0xf5, 0x65, 0x29, 0x51, 0x46, 0xb7, 0xef, 0xcc, 0x15, 0x43, 0xd0, 0xab, 0x46, 0xab, + 0x9c, 0xfd, 0xc0, 0x27, 0x67, 0xc6, 0x3e, 0xfd, 0xf3, 0x33, 0x31, 0x32, 0xb2, 0xf1, 0x88, 0x8e, + 0x40, 0x8f, 0xc2, 0xd1, 0x46, 0xfd, 0xf2, 0x6a, 0x6d, 0x49, 0x5d, 0x69, 0x5c, 0x16, 0x99, 0x6e, + 0x31, 0xba, 0xd2, 0xed, 0x3b, 0x73, 0x79, 0x3e, 0xa4, 0x41, 0xd0, 0xeb, 0x4a, 0xed, 0xfa, 0xda, + 0x46, 0x4d, 0x8a, 0x31, 0xe8, 0x75, 0x07, 0xdf, 0xb4, 0x3c, 0xf6, 0xfc, 0xdb, 0xe3, 0x70, 0xac, + 0x0f, 0xb4, 0x3f, 0xb0, 0x89, 0xdb, 0x77, 0xe6, 0xc6, 0xd7, 0x1d, 0xcc, 0xd6, 0x0f, 0xc5, 0x98, + 0x87, 0xe9, 0x5e, 0x8c, 0xb5, 0xf5, 0xb5, 0x46, 0x65, 0x59, 0x9a, 0x2b, 0x4b, 0xb7, 0xef, 0xcc, + 0x15, 0x84, 0x32, 0x24, 0xf0, 0xc1, 0xc8, 0xde, 0xca, 0x88, 0xe7, 0x76, 0x26, 0x92, 0xdf, 0x63, + 0xb1, 0x84, 0xad, 0x39, 0x5a, 0xfb, 0xb0, 0x21, 0xcf, 0x90, 0xcd, 0x3a, 0xf9, 0xd5, 0x38, 0x94, + 0x7c, 0x87, 0x7a, 0x9d, 0x7e, 0x01, 0x3d, 0x19, 0xce, 0xcb, 0xe4, 0x07, 0x9a, 0x32, 0x06, 0x2d, + 0xd2, 0x36, 0xef, 0x84, 0xac, 0x70, 0xcc, 0xb8, 0xca, 0x98, 0xeb, 0xc5, 0xab, 0x71, 0x08, 0x8e, + 0xea, 0x63, 0xa0, 0x67, 0x21, 0xe7, 0x2b, 0x10, 0xff, 0x01, 0x95, 0xc1, 0x1a, 0x87, 0xe3, 0x07, + 0x38, 0xe8, 0x42, 0x10, 0x3a, 0x24, 0x07, 0x05, 0x23, 0xd7, 0x19, 0x00, 0x47, 0x16, 0xf0, 0x72, + 0x9d, 0x2f, 0x3d, 0x3e, 0x7a, 0x7a, 0xf9, 0x7c, 0x4f, 0x65, 0xd1, 0x14, 0xf3, 0x4c, 0xb2, 0x6d, + 0x6d, 0x6f, 0x91, 0x06, 0x54, 0x47, 0x21, 0x43, 0x1a, 0x77, 0xf8, 0xdd, 0xda, 0x84, 0x92, 0x6e, + 0x6b, 0x7b, 0x97, 0x35, 0xf7, 0x6a, 0x32, 0x9b, 0x90, 0x92, 0xf2, 0x2f, 0xc6, 0xa0, 0x18, 0x1d, + 0x23, 0x7a, 0x04, 0x10, 0xc1, 0xd0, 0x76, 0xb0, 0x4a, 0xd4, 0x0c, 0x65, 0x96, 0xa0, 0x5b, 0x6a, + 0x6b, 0x7b, 0x95, 0x1d, 0xbc, 0xda, 0x69, 0xd3, 0x0e, 0xb8, 0x68, 0x05, 0x24, 0x01, 0x2c, 0xe6, + 0x89, 0x33, 0xf3, 0x58, 0xef, 0x73, 0x6a, 0x1c, 0x80, 0x19, 0xab, 0x0f, 0x13, 0x63, 0x55, 0x64, + 0xf4, 0xfc, 0xcd, 0xd6, 0xc8, 0x50, 0x12, 0xd1, 0xa1, 0xc8, 0xcf, 0x42, 0xa9, 0x8b, 0x9f, 0x48, + 0x86, 0x71, 0x9e, 0x1d, 0xa0, 0x1b, 0x59, 0xcc, 0x47, 0xce, 0x29, 0x79, 0x96, 0x05, 0xa0, 0x1b, + 0x7b, 0x0b, 0xd9, 0x2f, 0x7e, 0x7c, 0x36, 0x46, 0x93, 0xe8, 0x8f, 0xc0, 0x78, 0x84, 0xa3, 0x22, + 0x73, 0x17, 0x0b, 0x32, 0x77, 0x01, 0xf0, 0x4b, 0x50, 0x20, 0xca, 0x12, 0x37, 0x39, 0xec, 0x43, + 0x50, 0x62, 0xca, 0xbc, 0x9b, 0xd7, 0xcc, 0x9b, 0x5a, 0x11, 0x0c, 0x97, 0x85, 0x7b, 0x15, 0x65, + 0x7b, 0x5e, 0x40, 0x5d, 0xd6, 0xdc, 0xc5, 0xcd, 0x4f, 0xbf, 0x31, 0x13, 0x7b, 0xeb, 0x16, 0xe3, + 0xbf, 0x79, 0x0e, 0x8e, 0x87, 0x1a, 0xb5, 0x2d, 0xdd, 0x88, 0x64, 0x1f, 0x4a, 0x21, 0x41, 0x23, + 0x8d, 0xc3, 0xb2, 0x08, 0x07, 0xe6, 0x32, 0x0e, 0x4e, 0x9e, 0x95, 0x0f, 0xd6, 0x0a, 0xc3, 0x13, + 0x1c, 0xfd, 0x73, 0x96, 0xff, 0x37, 0x0b, 0x19, 0x05, 0xbf, 0xbf, 0x83, 0x5d, 0x0f, 0x9d, 0x81, + 0x24, 0xd6, 0x77, 0xad, 0x7e, 0xe9, 0x21, 0x32, 0xb8, 0x79, 0x0e, 0x57, 0xd3, 0x77, 0xad, 0x2b, + 0x63, 0x0a, 0x85, 0x45, 0x67, 0x21, 0xb5, 0xdd, 0xea, 0xf0, 0x7c, 0x45, 0x97, 0xc2, 0x08, 0x23, + 0x5d, 0x22, 0x40, 0x57, 0xc6, 0x14, 0x06, 0x4d, 0x3e, 0x45, 0x1f, 0xa7, 0x4c, 0x1c, 0xfc, 0xa9, + 0xba, 0xb9, 0x4d, 0x3f, 0x45, 0x60, 0xd1, 0x22, 0x80, 0x61, 0x1a, 0x9e, 0x4a, 0x63, 0x79, 0xee, + 0x11, 0xde, 0x3f, 0x18, 0xd3, 0xf0, 0x68, 0xf4, 0x7f, 0x65, 0x4c, 0xc9, 0x19, 0xa2, 0x40, 0xba, + 0xfb, 0xfe, 0x0e, 0x76, 0xf6, 0xb9, 0x23, 0x38, 0xb0, 0xbb, 0xcf, 0x11, 0x20, 0xd2, 0x5d, 0x0a, + 0x8d, 0x6a, 0x90, 0xa7, 0xb7, 0x10, 0xd9, 0x1a, 0xe6, 0x0f, 0x25, 0xca, 0x83, 0x90, 0x17, 0x09, + 0x28, 0x5d, 0xd6, 0x57, 0xc6, 0x14, 0xd8, 0xf2, 0x4b, 0x44, 0x51, 0xb2, 0x87, 0x74, 0xbc, 0x3d, + 0xfe, 0x3c, 0xdc, 0xec, 0x20, 0x1a, 0xf4, 0x35, 0x9d, 0x8d, 0xbd, 0x2b, 0x63, 0x4a, 0x46, 0x67, + 0x3f, 0xc9, 0xf8, 0x9b, 0xb8, 0x65, 0xdc, 0xc4, 0x0e, 0xc1, 0xcf, 0x1d, 0x3c, 0xfe, 0x25, 0x06, + 0x49, 0x29, 0xe4, 0x9a, 0xa2, 0x40, 0x94, 0x2d, 0x36, 0x9b, 0x7c, 0x18, 0xd0, 0xab, 0xab, 0x23, + 0xf3, 0x6c, 0x36, 0xc5, 0x20, 0xb2, 0x98, 0xff, 0x46, 0x4f, 0xfb, 0x9e, 0x6a, 0xbe, 0xd7, 0x39, + 0x8c, 0x0c, 0x80, 0xe5, 0x2c, 0xc6, 0x84, 0xc7, 0x8a, 0x56, 0xa1, 0xd8, 0x32, 0x5c, 0x4f, 0x75, + 0x4d, 0xcd, 0x76, 0x77, 0x2d, 0xcf, 0xa5, 0xc1, 0x7f, 0xfe, 0xcc, 0x83, 0x83, 0x28, 0x2c, 0x1b, + 0xae, 0xd7, 0x10, 0xc0, 0x57, 0xc6, 0x94, 0xf1, 0x56, 0xb8, 0x82, 0xd0, 0xb3, 0xb6, 0xb7, 0xb1, + 0xe3, 0x13, 0xa4, 0x49, 0x82, 0x03, 0xe8, 0xad, 0x11, 0x68, 0x81, 0x4f, 0xe8, 0x59, 0xe1, 0x0a, + 0xf4, 0x43, 0x30, 0xd9, 0xb2, 0xb4, 0xa6, 0x4f, 0x4e, 0xd5, 0x77, 0x3b, 0xe6, 0x0d, 0x9a, 0x51, + 0xc8, 0x9f, 0x39, 0x39, 0xb0, 0x93, 0x96, 0xd6, 0x14, 0x24, 0xaa, 0x04, 0xe1, 0xca, 0x98, 0x32, + 0xd1, 0xea, 0xae, 0x44, 0xef, 0x85, 0x29, 0xcd, 0xb6, 0x5b, 0xfb, 0xdd, 0xd4, 0x4b, 0x94, 0xfa, + 0xa9, 0x41, 0xd4, 0x2b, 0x04, 0xa7, 0x9b, 0x3c, 0xd2, 0x7a, 0x6a, 0xd1, 0x06, 0x48, 0xb6, 0x83, + 0xe9, 0xb5, 0x09, 0x9b, 0xbb, 0x2c, 0xf4, 0xed, 0xa3, 0xfc, 0x99, 0x87, 0x07, 0xd1, 0x5e, 0x67, + 0xf0, 0xc2, 0xc3, 0xb9, 0x32, 0xa6, 0x94, 0xec, 0x68, 0x15, 0xa3, 0x6a, 0xe9, 0x98, 0xbe, 0xcf, + 0xc3, 0xa9, 0x4e, 0x0c, 0xa3, 0x4a, 0xe1, 0xa3, 0x54, 0x23, 0x55, 0x8b, 0x19, 0x7e, 0xec, 0x89, + 0x3f, 0x9e, 0xf1, 0x30, 0xe4, 0x43, 0x8a, 0x05, 0x4d, 0x43, 0x86, 0x9f, 0xcd, 0x14, 0xc7, 0xa5, + 0x78, 0x51, 0x2e, 0x42, 0x21, 0xac, 0x4c, 0xe4, 0x0f, 0xc5, 0x7c, 0x4c, 0x7a, 0x9b, 0x79, 0x3a, + 0x9a, 0x42, 0xcc, 0x05, 0xd9, 0xc1, 0x07, 0x84, 0x25, 0x11, 0xed, 0x6c, 0x87, 0xa9, 0x40, 0x2b, + 0xb9, 0x21, 0x43, 0xb3, 0x90, 0xb7, 0xcf, 0xd8, 0x3e, 0x48, 0x82, 0x82, 0x80, 0x7d, 0xc6, 0x16, + 0x00, 0xf7, 0x43, 0x81, 0x8c, 0x54, 0x0d, 0x3b, 0x1b, 0x39, 0x25, 0x4f, 0xea, 0x38, 0x88, 0xfc, + 0x2f, 0xe3, 0x20, 0x75, 0x2b, 0x20, 0x3f, 0xb7, 0x18, 0x3b, 0x74, 0x6e, 0xf1, 0x58, 0x77, 0x56, + 0x33, 0x48, 0x64, 0x2e, 0x83, 0x14, 0xe4, 0xe3, 0x98, 0x21, 0x18, 0xec, 0x3c, 0x75, 0x79, 0x79, + 0x4a, 0x49, 0xef, 0x72, 0xfb, 0x2e, 0x45, 0xf6, 0x61, 0xc4, 0xeb, 0xcb, 0xdd, 0x53, 0xec, 0xfb, + 0x0c, 0x9b, 0x76, 0x53, 0xf3, 0xb0, 0xc8, 0x8f, 0x84, 0xb6, 0x64, 0x1e, 0x82, 0x92, 0x66, 0xdb, + 0xaa, 0xeb, 0x69, 0x1e, 0xe6, 0xa6, 0x3d, 0xc5, 0xd2, 0x84, 0x9a, 0x6d, 0x37, 0x48, 0x2d, 0x33, + 0xed, 0x0f, 0x42, 0x91, 0xe8, 0x64, 0x43, 0x6b, 0xa9, 0x3c, 0x5b, 0x90, 0x66, 0x1e, 0x00, 0xaf, + 0xbd, 0x42, 0x2b, 0xe5, 0xa6, 0x3f, 0xe3, 0x54, 0x1f, 0xfb, 0xe1, 0x56, 0x2c, 0x14, 0x6e, 0x21, + 0x7e, 0xcd, 0x9c, 0xf1, 0x47, 0xdc, 0xcc, 0xef, 0x9f, 0xe5, 0x9d, 0xa2, 0xa1, 0xd9, 0x4d, 0x96, + 0xf8, 0xc8, 0x2a, 0xac, 0x20, 0xbf, 0x16, 0x87, 0x89, 0x1e, 0xcd, 0xdd, 0x37, 0xfd, 0x1d, 0xc4, + 0x99, 0xf1, 0x43, 0xc5, 0x99, 0xd7, 0xa2, 0xe9, 0xdd, 0x90, 0xe5, 0x3b, 0xde, 0xc3, 0x64, 0xa6, + 0x37, 0x89, 0x40, 0x73, 0x22, 0xa1, 0x0c, 0x30, 0x15, 0xf3, 0x4d, 0x98, 0xda, 0xda, 0x7f, 0x45, + 0x33, 0x3d, 0xc3, 0xc4, 0x6a, 0xcf, 0xac, 0xf5, 0x9a, 0xd2, 0x15, 0xc3, 0xdd, 0xc2, 0xbb, 0xda, + 0x4d, 0xc3, 0x12, 0xdd, 0x9a, 0xf4, 0xf1, 0x83, 0x24, 0xaf, 0xac, 0x40, 0x31, 0x6a, 0x7a, 0x50, + 0x11, 0xe2, 0xde, 0x1e, 0x1f, 0x7f, 0xdc, 0xdb, 0x43, 0x8f, 0xf3, 0x7c, 0x50, 0x9c, 0xe6, 0x83, + 0x7a, 0x3f, 0xc4, 0xf1, 0x82, 0x64, 0x90, 0x2c, 0xfb, 0xab, 0xc1, 0x37, 0x47, 0xdd, 0x54, 0xe5, + 0x93, 0x50, 0xea, 0xb2, 0x37, 0x83, 0xb2, 0x83, 0x72, 0x09, 0xc6, 0x23, 0xc6, 0x45, 0x3e, 0x02, + 0x53, 0xfd, 0x6c, 0x85, 0xbc, 0xeb, 0xd7, 0x47, 0x74, 0x3e, 0x3a, 0x0b, 0x59, 0xdf, 0x58, 0xf4, + 0xc9, 0x46, 0xd0, 0x51, 0x08, 0x60, 0xc5, 0x07, 0x8d, 0x24, 0xb5, 0xe3, 0x91, 0xa4, 0xb6, 0xfc, + 0x3e, 0x98, 0x1e, 0x64, 0x08, 0xba, 0x86, 0x91, 0xf4, 0xa5, 0xf0, 0x08, 0xa4, 0xf9, 0x23, 0x5c, + 0x71, 0xba, 0x8d, 0xc3, 0x4b, 0x44, 0x3a, 0x99, 0x51, 0x48, 0xb0, 0xdd, 0x1d, 0x5a, 0x90, 0x55, + 0x38, 0x36, 0xd0, 0x18, 0x0c, 0xde, 0x10, 0x62, 0x84, 0xf8, 0x86, 0x90, 0x2e, 0xba, 0xe3, 0xd2, + 0xb1, 0x8a, 0x43, 0x10, 0xac, 0x24, 0x7f, 0x38, 0x01, 0x47, 0xfa, 0x9b, 0x04, 0x34, 0x07, 0x05, + 0xe2, 0x7b, 0x7b, 0x51, 0x37, 0x1d, 0xda, 0xda, 0xde, 0x06, 0xf7, 0xd1, 0x79, 0x42, 0x3d, 0xee, + 0x27, 0xd4, 0xd1, 0x26, 0x4c, 0xb4, 0x2c, 0x5d, 0x6b, 0xa9, 0x21, 0x89, 0xe7, 0xc2, 0xfe, 0x40, + 0x0f, 0xb3, 0x6b, 0xec, 0x69, 0xde, 0x66, 0x8f, 0xd0, 0x97, 0x28, 0x8d, 0x65, 0x5f, 0xf2, 0xd1, + 0x12, 0xe4, 0xdb, 0x81, 0x20, 0x1f, 0x42, 0xd8, 0xc3, 0x68, 0xa1, 0x29, 0x49, 0xf5, 0xdd, 0xfe, + 0x49, 0x1f, 0x5a, 0x45, 0x0f, 0xda, 0x49, 0xc9, 0x0c, 0xdc, 0x49, 0xe9, 0xb7, 0x6d, 0x91, 0xed, + 0xbf, 0x6d, 0xf1, 0x81, 0xf0, 0xd4, 0x44, 0x8c, 0x68, 0xef, 0x4e, 0x06, 0x6a, 0xc0, 0x14, 0xc7, + 0x6f, 0x46, 0x78, 0x1f, 0x1f, 0x55, 0xd1, 0x20, 0x81, 0x3e, 0x98, 0xed, 0x89, 0xbb, 0x63, 0xbb, + 0xd0, 0xa5, 0xc9, 0x90, 0x2e, 0xfd, 0xff, 0x6c, 0x2a, 0xfe, 0x75, 0x0e, 0xb2, 0x0a, 0x76, 0x6d, + 0x62, 0x38, 0xd1, 0x22, 0xe4, 0xf0, 0x9e, 0x8e, 0x6d, 0x2f, 0xd8, 0xae, 0xec, 0x17, 0x0c, 0x30, + 0xe8, 0x9a, 0x80, 0x24, 0x9e, 0xb8, 0x8f, 0x86, 0x9e, 0xe4, 0xc1, 0xd6, 0xe0, 0xb8, 0x89, 0xa3, + 0x87, 0xa3, 0xad, 0x73, 0x22, 0xda, 0x4a, 0x0c, 0x74, 0xbe, 0x19, 0x56, 0x57, 0xb8, 0xf5, 0x24, + 0x0f, 0xb7, 0x92, 0x43, 0x3e, 0x16, 0x89, 0xb7, 0xaa, 0x91, 0x78, 0x2b, 0x3d, 0x64, 0x98, 0x03, + 0x02, 0xae, 0x73, 0x22, 0xe0, 0xca, 0x0c, 0xe9, 0x71, 0x57, 0xc4, 0x75, 0x29, 0x1a, 0x71, 0x65, + 0x07, 0x28, 0x10, 0x81, 0x3d, 0x30, 0xe4, 0x7a, 0x26, 0x14, 0x72, 0xe5, 0x06, 0xc6, 0x3b, 0x8c, + 0x48, 0x9f, 0x98, 0xab, 0x1a, 0x89, 0xb9, 0x60, 0x08, 0x0f, 0x06, 0x04, 0x5d, 0xef, 0x0e, 0x07, + 0x5d, 0xf9, 0x81, 0x71, 0x1b, 0x9f, 0xef, 0x7e, 0x51, 0xd7, 0x05, 0x3f, 0xea, 0x2a, 0x0c, 0x0c, + 0x1b, 0xf9, 0x18, 0xba, 0xc3, 0xae, 0xb5, 0x9e, 0xb0, 0x6b, 0x9c, 0xbf, 0x7a, 0x3f, 0x88, 0xc4, + 0x90, 0xb8, 0x6b, 0xad, 0x27, 0xee, 0x2a, 0x0e, 0x21, 0x38, 0x24, 0xf0, 0xfa, 0xe1, 0xfe, 0x81, + 0xd7, 0xe0, 0xd0, 0x88, 0x77, 0x73, 0xb4, 0xc8, 0x4b, 0x1d, 0x10, 0x79, 0xb1, 0xe8, 0xe8, 0x91, + 0x81, 0xe4, 0x47, 0x0e, 0xbd, 0x36, 0xfb, 0x84, 0x5e, 0x2c, 0x48, 0x3a, 0x31, 0x90, 0xf8, 0x08, + 0xb1, 0xd7, 0x66, 0x9f, 0xd8, 0x0b, 0x0d, 0x25, 0x7b, 0x98, 0xe0, 0x2b, 0x25, 0xa5, 0xe5, 0x93, + 0xc4, 0xf5, 0xed, 0xd2, 0x53, 0xc4, 0x7f, 0xc0, 0x8e, 0x63, 0x39, 0xe2, 0xc4, 0x2d, 0x2d, 0xc8, + 0x27, 0x88, 0x33, 0x1e, 0xe8, 0xa4, 0x03, 0x02, 0x35, 0xea, 0xa7, 0x85, 0xf4, 0x90, 0xfc, 0xc5, + 0x58, 0x80, 0x4b, 0x7d, 0xd8, 0xb0, 0x23, 0x9f, 0xe3, 0x8e, 0x7c, 0x28, 0x7c, 0x8b, 0x47, 0xc3, + 0xb7, 0x59, 0xc8, 0x13, 0xff, 0xab, 0x2b, 0x32, 0xd3, 0x6c, 0x3f, 0x32, 0x13, 0x47, 0x0b, 0x58, + 0x90, 0xc7, 0xcd, 0x0a, 0xdb, 0xd1, 0x29, 0xf9, 0xc7, 0x2c, 0x58, 0x4c, 0x81, 0x1e, 0x83, 0xc9, + 0x10, 0xac, 0xef, 0xd7, 0xb1, 0x30, 0x45, 0xf2, 0xa1, 0x2b, 0xdc, 0xc1, 0xfb, 0x27, 0xb1, 0x80, + 0x43, 0x41, 0x48, 0xd7, 0x2f, 0xfa, 0x8a, 0xbd, 0x49, 0xd1, 0x57, 0xfc, 0xae, 0xa3, 0xaf, 0xb0, + 0x9f, 0x9a, 0x88, 0xfa, 0xa9, 0xff, 0x33, 0x16, 0xcc, 0x89, 0x1f, 0x4b, 0xe9, 0x56, 0x13, 0x73, + 0xcf, 0x91, 0xfe, 0x26, 0x4e, 0x45, 0xcb, 0xda, 0xe1, 0xfe, 0x21, 0xf9, 0x49, 0xa0, 0x7c, 0xc3, + 0x91, 0xe3, 0x76, 0xc1, 0x77, 0x3a, 0x53, 0xe1, 0x73, 0xc1, 0xfc, 0xb0, 0x6c, 0x3a, 0x38, 0x2c, + 0xeb, 0x5f, 0x6f, 0xca, 0x84, 0xae, 0x37, 0xa1, 0xa7, 0x21, 0x47, 0x33, 0xa2, 0xaa, 0x65, 0x8b, + 0xff, 0x91, 0x70, 0x7c, 0xf0, 0x41, 0x59, 0x97, 0x1e, 0xdb, 0x63, 0x87, 0x6b, 0x03, 0x8f, 0x21, + 0x17, 0xf1, 0x18, 0xee, 0x85, 0x1c, 0xe9, 0x3d, 0x7b, 0xeb, 0x17, 0xf8, 0xdd, 0x38, 0x51, 0x21, + 0xbf, 0x17, 0x50, 0xaf, 0x91, 0x40, 0x57, 0x20, 0x8d, 0x6f, 0xd2, 0x87, 0xd3, 0xd8, 0xa1, 0xc3, + 0x23, 0xbd, 0xae, 0x29, 0x69, 0x5e, 0x9c, 0x26, 0x4c, 0xfe, 0xe6, 0xeb, 0xb3, 0x12, 0x83, 0x7e, + 0xd4, 0x6a, 0x1b, 0x1e, 0x6e, 0xdb, 0xde, 0xbe, 0xc2, 0xf1, 0xe5, 0xdf, 0x89, 0x93, 0x00, 0x26, + 0x62, 0x40, 0xfa, 0xf2, 0xb6, 0xdf, 0x56, 0xe1, 0x68, 0xfc, 0x9e, 0x01, 0xd8, 0xd1, 0x5c, 0xf5, + 0x96, 0x66, 0x7a, 0xb8, 0xc9, 0x99, 0x1e, 0xaa, 0x41, 0x65, 0xc8, 0x92, 0x52, 0xc7, 0xc5, 0x4d, + 0x1e, 0x46, 0xfb, 0xe5, 0xd0, 0x38, 0x33, 0xdf, 0xdf, 0x38, 0xa3, 0x5c, 0xce, 0x76, 0x71, 0x39, + 0x14, 0x5c, 0xe4, 0xc2, 0xc1, 0x05, 0x3b, 0x2c, 0xcc, 0xcf, 0x2a, 0x02, 0xeb, 0x9b, 0x28, 0xa3, + 0x07, 0x60, 0xbc, 0x8d, 0xdb, 0xb6, 0x65, 0xb5, 0x54, 0xa6, 0x6e, 0xd8, 0xa3, 0xde, 0x05, 0x5e, + 0x59, 0xa3, 0x5a, 0xe7, 0xc7, 0xe2, 0xc1, 0xfa, 0x0b, 0x82, 0xc8, 0x1f, 0x38, 0x06, 0xcb, 0x7f, + 0x91, 0x66, 0x96, 0xa2, 0x2e, 0x02, 0x6a, 0x84, 0x4f, 0x8f, 0x74, 0xa8, 0x5a, 0x10, 0x02, 0x3d, + 0xaa, 0xfe, 0x08, 0x4e, 0x99, 0xb0, 0x6a, 0x17, 0xbd, 0x08, 0x47, 0xbb, 0x74, 0x9b, 0x4f, 0x3a, + 0x3e, 0xaa, 0x8a, 0xbb, 0x27, 0xaa, 0xe2, 0x04, 0xe9, 0x80, 0x59, 0x89, 0xef, 0x73, 0xd5, 0xd5, + 0xa1, 0x18, 0xf5, 0x78, 0xfa, 0x4e, 0x3f, 0xfd, 0x27, 0x12, 0x9e, 0x66, 0x98, 0x6a, 0x24, 0x1d, + 0x54, 0x60, 0x95, 0x3c, 0xc9, 0xb4, 0x0e, 0xf7, 0xf4, 0xf5, 0x7c, 0xd0, 0x79, 0xc8, 0x05, 0x4e, + 0x13, 0xe3, 0xea, 0x01, 0xe9, 0x82, 0x00, 0x56, 0xfe, 0xf5, 0x58, 0x40, 0x32, 0x9a, 0x80, 0xa8, + 0x41, 0x9a, 0x1d, 0x7f, 0xe3, 0x87, 0x6a, 0x1e, 0x1b, 0xcd, 0x67, 0x9a, 0x67, 0x67, 0xe3, 0x14, + 0x8e, 0x2c, 0xbf, 0x17, 0xd2, 0xac, 0x06, 0xe5, 0x21, 0x13, 0xbc, 0x6d, 0x0a, 0x90, 0xae, 0x54, + 0xab, 0xb5, 0xf5, 0x0d, 0x29, 0x86, 0x72, 0x90, 0xaa, 0x2c, 0xae, 0x29, 0x1b, 0x52, 0x9c, 0x54, + 0x2b, 0xb5, 0xab, 0xb5, 0xea, 0x86, 0x94, 0x40, 0x13, 0x30, 0xce, 0x7e, 0xab, 0x97, 0xd6, 0x94, + 0x95, 0xca, 0x86, 0x94, 0x0c, 0x55, 0x35, 0x6a, 0xab, 0x4b, 0x35, 0x45, 0x4a, 0xc9, 0x4f, 0xc0, + 0xb1, 0x81, 0x5e, 0x56, 0x90, 0x5d, 0x88, 0x85, 0xb2, 0x0b, 0xf2, 0x87, 0xe3, 0x50, 0x1e, 0xec, + 0x3a, 0xa1, 0xab, 0x5d, 0x03, 0x3f, 0x73, 0x08, 0xbf, 0xab, 0x6b, 0xf4, 0xe8, 0x41, 0x28, 0x3a, + 0x78, 0x1b, 0x7b, 0xfa, 0x2e, 0x73, 0xe5, 0x98, 0xc9, 0x1c, 0x57, 0xc6, 0x79, 0x2d, 0x45, 0x72, + 0x19, 0xd8, 0xcb, 0x58, 0xf7, 0x54, 0xa6, 0x8b, 0x5c, 0xfe, 0xdf, 0xec, 0xc6, 0x59, 0x6d, 0x83, + 0x55, 0xca, 0xef, 0x3b, 0x14, 0x2f, 0x73, 0x90, 0x52, 0x6a, 0x1b, 0xca, 0x8b, 0x52, 0x02, 0x21, + 0x28, 0xd2, 0x9f, 0x6a, 0x63, 0xb5, 0xb2, 0xde, 0xb8, 0xb2, 0x46, 0x78, 0x39, 0x09, 0x25, 0xc1, + 0x4b, 0x51, 0x99, 0x92, 0x1f, 0x81, 0xa3, 0x03, 0xfc, 0xbe, 0x3e, 0xe7, 0x11, 0x3f, 0x11, 0x0b, + 0x43, 0x47, 0x63, 0xfe, 0x35, 0x48, 0xbb, 0x9e, 0xe6, 0x75, 0x5c, 0xce, 0xc4, 0xf3, 0xa3, 0x3a, + 0x82, 0xf3, 0xe2, 0x47, 0x83, 0xa2, 0x2b, 0x9c, 0x8c, 0x7c, 0x16, 0x8a, 0xd1, 0x96, 0xc1, 0x3c, + 0x08, 0x84, 0x28, 0x2e, 0xbf, 0x08, 0x10, 0xca, 0x47, 0xfa, 0x27, 0xbb, 0x62, 0xe1, 0x93, 0x5d, + 0x67, 0x21, 0x75, 0xd3, 0x62, 0x3a, 0xa3, 0xff, 0xc2, 0xb9, 0x6e, 0x79, 0x38, 0x94, 0x7c, 0x60, + 0xd0, 0xb2, 0x01, 0xa8, 0x37, 0x27, 0x34, 0xe0, 0x13, 0xcf, 0x44, 0x3f, 0x71, 0xff, 0xc0, 0xec, + 0x52, 0xff, 0x4f, 0xbd, 0x02, 0x29, 0xaa, 0x6d, 0xfa, 0x5e, 0xfd, 0x79, 0x0f, 0x80, 0xe6, 0x79, + 0x8e, 0xb1, 0xd5, 0x09, 0x3e, 0x30, 0xdb, 0x5f, 0x5b, 0x55, 0x04, 0xdc, 0xe2, 0xbd, 0x5c, 0x6d, + 0x4d, 0x05, 0xa8, 0x21, 0xd5, 0x15, 0x22, 0x28, 0xaf, 0x42, 0x31, 0x8a, 0xdb, 0xff, 0x2a, 0x53, + 0x70, 0x3b, 0x3c, 0x27, 0xdc, 0x27, 0xdf, 0xf9, 0xe2, 0x2f, 0x36, 0xd0, 0x82, 0x7c, 0x3b, 0x06, + 0xd9, 0x8d, 0x3d, 0x2e, 0xc7, 0x07, 0x1c, 0xae, 0x0c, 0xee, 0x73, 0xf9, 0xc9, 0x42, 0x96, 0x8f, + 0x4d, 0xf8, 0x59, 0xde, 0x77, 0xfb, 0x2b, 0x35, 0x39, 0x6a, 0xb4, 0x2b, 0xb2, 0xdd, 0x5c, 0x3b, + 0x5d, 0x1c, 0xed, 0xbe, 0xc4, 0x14, 0xa4, 0xc2, 0x77, 0x1d, 0x58, 0x41, 0x6e, 0x86, 0x8e, 0x26, + 0x30, 0xb3, 0x11, 0xbe, 0x58, 0x11, 0x3b, 0xf4, 0xc5, 0x0a, 0xff, 0x2b, 0xf1, 0xf0, 0x57, 0x6e, + 0x42, 0x56, 0x08, 0x05, 0x7a, 0x57, 0xf8, 0xfc, 0x89, 0xd8, 0xa3, 0x19, 0x68, 0x3c, 0x39, 0xf9, + 0xd0, 0xf1, 0x93, 0x53, 0x30, 0xc1, 0x8f, 0xde, 0x05, 0x71, 0x05, 0x7f, 0x7d, 0xbd, 0xc4, 0x1a, + 0x96, 0x45, 0x50, 0x21, 0xff, 0x42, 0x0c, 0xa4, 0x6e, 0xa9, 0x7c, 0x3b, 0x3b, 0x40, 0x94, 0x22, + 0x91, 0xfe, 0xd0, 0xb3, 0xca, 0x6c, 0xe6, 0xc7, 0x49, 0x6d, 0xf0, 0xb0, 0xf2, 0x6b, 0x71, 0xc8, + 0x87, 0x72, 0x7a, 0xe8, 0xa9, 0xc8, 0x51, 0xd0, 0xb9, 0x83, 0xf2, 0x7f, 0xa1, 0xb3, 0xa0, 0x91, + 0x81, 0xc5, 0x0f, 0x3f, 0xb0, 0x37, 0xff, 0xb0, 0x7e, 0xff, 0x9b, 0x3f, 0xa9, 0x01, 0x37, 0x7f, + 0xfe, 0x4c, 0x0c, 0xb2, 0xbe, 0xe9, 0x3e, 0x6c, 0x36, 0xff, 0x08, 0xa4, 0xb9, 0x75, 0x62, 0xe9, + 0x7c, 0x5e, 0xea, 0x9b, 0x0b, 0x2d, 0x43, 0x56, 0xfc, 0xdb, 0x12, 0x1e, 0x88, 0xfa, 0xe5, 0x53, + 0x17, 0x20, 0x1f, 0xda, 0x58, 0x21, 0x7a, 0x62, 0xb5, 0xf6, 0xbc, 0x34, 0x56, 0xce, 0xdc, 0xbe, + 0x33, 0x97, 0x58, 0xc5, 0xb7, 0xc8, 0x0a, 0x53, 0x6a, 0xd5, 0x2b, 0xb5, 0xea, 0x35, 0x29, 0x56, + 0xce, 0xdf, 0xbe, 0x33, 0x97, 0x51, 0x30, 0x4d, 0x5f, 0x9d, 0xba, 0x06, 0xa5, 0xae, 0x89, 0x89, + 0xea, 0x77, 0x04, 0xc5, 0xa5, 0xcd, 0xf5, 0xe5, 0x7a, 0xb5, 0xb2, 0x51, 0x53, 0xd9, 0xb1, 0x3a, + 0x74, 0x14, 0x26, 0x97, 0xeb, 0x97, 0xaf, 0x6c, 0xa8, 0xd5, 0xe5, 0x7a, 0x6d, 0x75, 0x43, 0xad, + 0x6c, 0x6c, 0x54, 0xaa, 0xd7, 0xa4, 0xf8, 0x99, 0xef, 0x02, 0x94, 0x2a, 0x8b, 0xd5, 0x3a, 0xb1, + 0xcf, 0x06, 0x7f, 0x19, 0xbb, 0x0a, 0x49, 0x9a, 0x0a, 0x38, 0xf0, 0xa8, 0x48, 0xf9, 0xe0, 0xdc, + 0x26, 0xba, 0x04, 0x29, 0x9a, 0x25, 0x40, 0x07, 0x9f, 0x1d, 0x29, 0x0f, 0x49, 0x76, 0x92, 0xce, + 0xd0, 0xe5, 0x74, 0xe0, 0x61, 0x92, 0xf2, 0xc1, 0xb9, 0x4f, 0xa4, 0x40, 0x2e, 0x88, 0x32, 0x86, + 0x1f, 0xae, 0x28, 0x8f, 0xa0, 0x1d, 0xd1, 0x32, 0x64, 0x44, 0x60, 0x38, 0xec, 0xb8, 0x47, 0x79, + 0x68, 0x72, 0x92, 0xb0, 0x8b, 0x05, 0xf0, 0x07, 0x9f, 0x5d, 0x29, 0x0f, 0xc9, 0xb4, 0xa2, 0xba, + 0x7f, 0x18, 0x7f, 0xc8, 0x11, 0x8e, 0xf2, 0xb0, 0x64, 0x23, 0x61, 0x5a, 0x90, 0x1a, 0x19, 0x7e, + 0x22, 0xa7, 0x3c, 0x42, 0x12, 0x19, 0x6d, 0x02, 0x84, 0xc2, 0xf5, 0x11, 0x8e, 0xda, 0x94, 0x47, + 0x49, 0x0e, 0xa3, 0x35, 0xc8, 0xfa, 0xd1, 0xd3, 0xd0, 0x83, 0x2f, 0xe5, 0xe1, 0x59, 0x5a, 0xf4, + 0x5e, 0x18, 0x8f, 0x46, 0x0d, 0xa3, 0x1d, 0x67, 0x29, 0x8f, 0x98, 0x7e, 0x25, 0xf4, 0xa3, 0x21, + 0xc4, 0x68, 0xc7, 0x5b, 0xca, 0x23, 0x66, 0x63, 0xd1, 0xcb, 0x30, 0xd1, 0xeb, 0xe2, 0x8f, 0x7e, + 0xda, 0xa5, 0x7c, 0x88, 0xfc, 0x2c, 0x6a, 0x03, 0xea, 0x13, 0x1a, 0x1c, 0xe2, 0xf0, 0x4b, 0xf9, + 0x30, 0xe9, 0x5a, 0xd4, 0x84, 0x52, 0xb7, 0xbf, 0x3d, 0xea, 0x61, 0x98, 0xf2, 0xc8, 0xa9, 0x5b, + 0xf6, 0x95, 0xa8, 0x9f, 0x3e, 0xea, 0xe1, 0x98, 0xf2, 0xc8, 0x99, 0xdc, 0x11, 0x9f, 0x87, 0xe8, + 0x7f, 0xc6, 0x31, 0x38, 0xb5, 0xe8, 0x9f, 0x6b, 0xfc, 0xdd, 0xd3, 0xf0, 0x0e, 0xfe, 0xd0, 0x80, + 0xeb, 0x69, 0x37, 0x0c, 0x73, 0xc7, 0x7f, 0x21, 0x82, 0x97, 0xf9, 0x01, 0xc7, 0x23, 0xfc, 0x31, + 0x03, 0x51, 0x3b, 0xe4, 0x9d, 0x88, 0x81, 0xcf, 0x23, 0x0d, 0x3b, 0x8c, 0x3c, 0xfc, 0xf8, 0xe2, + 0xe0, 0x37, 0x28, 0xca, 0x43, 0x5e, 0xba, 0x18, 0x72, 0xea, 0xf2, 0xa0, 0x03, 0x9e, 0xf2, 0x07, + 0x63, 0x50, 0xbc, 0x62, 0xb8, 0x9e, 0xe5, 0x18, 0xba, 0xd6, 0xa2, 0x26, 0xe2, 0xdc, 0xa8, 0xb7, + 0x3b, 0xba, 0x0e, 0x81, 0x3c, 0x0b, 0xe9, 0x9b, 0x5a, 0x8b, 0x5d, 0xab, 0x08, 0xbf, 0x46, 0xd2, + 0xcd, 0xdb, 0x1e, 0x8f, 0x88, 0xa3, 0xc9, 0x9f, 0xa5, 0xe7, 0xb5, 0xdb, 0x6d, 0xc3, 0x65, 0xff, + 0x3f, 0xd8, 0xc3, 0x2e, 0x5a, 0x87, 0xa4, 0xa3, 0x79, 0x3c, 0x76, 0x59, 0x7c, 0x27, 0x7f, 0x89, + 0xe2, 0xa1, 0xe1, 0xef, 0x49, 0xcc, 0xf7, 0x3e, 0x56, 0x41, 0x29, 0xa1, 0xe7, 0x21, 0xdb, 0xd6, + 0xf6, 0x54, 0x4a, 0x35, 0xfe, 0x26, 0x50, 0xcd, 0xb4, 0xb5, 0x3d, 0xd2, 0x57, 0xb2, 0x50, 0x08, + 0x61, 0x7d, 0x57, 0x33, 0x77, 0x30, 0xa3, 0x9f, 0x78, 0x13, 0xe8, 0x8f, 0xb7, 0xb5, 0xbd, 0x2a, + 0xa5, 0x49, 0xbe, 0xb2, 0x90, 0xfd, 0xf0, 0xc7, 0x67, 0xc7, 0xe8, 0xb1, 0xe3, 0x5f, 0x8b, 0xf1, + 0x30, 0x95, 0xb2, 0x0b, 0xfd, 0x30, 0x48, 0xba, 0x5f, 0xa2, 0x9f, 0x17, 0x29, 0xfb, 0x87, 0x07, + 0x4d, 0x44, 0x17, 0xb3, 0x99, 0x37, 0xf9, 0xd5, 0xd7, 0x67, 0x63, 0x4a, 0x49, 0xef, 0x9a, 0x87, + 0x1a, 0xe4, 0x59, 0x92, 0x4c, 0xa5, 0x9e, 0x69, 0xfc, 0x10, 0x9e, 0x29, 0x30, 0x44, 0xd2, 0x14, + 0xea, 0xfd, 0x67, 0x63, 0x90, 0x5f, 0x0a, 0x3d, 0x33, 0x34, 0x0d, 0x99, 0xb6, 0x65, 0x1a, 0x37, + 0xb0, 0xe3, 0xef, 0xb6, 0xb0, 0x22, 0x71, 0x1e, 0xd9, 0xbf, 0x8b, 0xf1, 0xf6, 0xc5, 0x9b, 0x0b, + 0xa2, 0x4c, 0xb0, 0x6e, 0xe1, 0x2d, 0xd7, 0x10, 0xbc, 0x56, 0x44, 0x11, 0x9d, 0x04, 0xc9, 0xc5, + 0x7a, 0xc7, 0x31, 0xbc, 0x7d, 0x55, 0xb7, 0x4c, 0x4f, 0xd3, 0x3d, 0x9e, 0x13, 0x2d, 0x89, 0xfa, + 0x2a, 0xab, 0x26, 0x44, 0x9a, 0xd8, 0xd3, 0x8c, 0x16, 0x3b, 0xcc, 0x95, 0x53, 0x44, 0x31, 0xdc, + 0xdd, 0x4c, 0x38, 0xe8, 0xab, 0x82, 0x64, 0xd9, 0xd8, 0x89, 0x5c, 0x6a, 0x63, 0x12, 0x3a, 0xfd, + 0x9b, 0x9f, 0x7f, 0x6c, 0x8a, 0xb3, 0x9b, 0x6f, 0xad, 0xb3, 0x97, 0x75, 0x95, 0x92, 0xc0, 0x10, + 0xb7, 0xdd, 0x5e, 0x8c, 0xec, 0xb1, 0x74, 0xb6, 0x82, 0x8b, 0xf5, 0x53, 0x3d, 0x7c, 0xad, 0x98, + 0xfb, 0x8b, 0xd3, 0x5f, 0x09, 0x48, 0x07, 0x41, 0xe1, 0x35, 0xbc, 0x1f, 0xde, 0x70, 0xa1, 0x64, + 0x88, 0x6f, 0xfe, 0xb2, 0x66, 0xb4, 0xc4, 0x7f, 0xc1, 0x52, 0x78, 0x09, 0x2d, 0xf8, 0x09, 0x16, + 0xf6, 0xdf, 0xad, 0xe5, 0x41, 0x92, 0xb1, 0x68, 0x99, 0xcd, 0x68, 0x2e, 0x05, 0x6d, 0x40, 0xda, + 0xb3, 0x6e, 0x60, 0x93, 0x33, 0xe9, 0x50, 0x52, 0xdd, 0xe7, 0x35, 0x1c, 0x46, 0x0b, 0xed, 0x80, + 0xd4, 0xc4, 0x2d, 0xbc, 0xc3, 0xae, 0x64, 0xed, 0x6a, 0x0e, 0x66, 0xd7, 0x34, 0xbf, 0xdf, 0x55, + 0x53, 0xf2, 0xa9, 0x36, 0x28, 0x51, 0x74, 0x2d, 0xfa, 0xd0, 0x55, 0x86, 0xef, 0xb7, 0x0f, 0x18, + 0x7f, 0x48, 0x32, 0xc5, 0x79, 0x8f, 0xf0, 0x9b, 0x58, 0x27, 0x41, 0xea, 0x98, 0x5b, 0x96, 0x49, + 0xff, 0x57, 0x0d, 0x8f, 0x9a, 0xb2, 0x6c, 0x3b, 0xce, 0xaf, 0xe7, 0xdb, 0x71, 0xd7, 0xa0, 0x18, + 0x80, 0xd2, 0xb5, 0x93, 0x3b, 0xc4, 0xda, 0x19, 0xf7, 0x71, 0x49, 0x2b, 0xba, 0x02, 0x10, 0x2c, + 0x4c, 0x7f, 0xb7, 0x7e, 0xe8, 0xea, 0x16, 0x5b, 0x69, 0x01, 0x2e, 0x6a, 0xc1, 0x64, 0xdb, 0x30, + 0x55, 0x17, 0xb7, 0xb6, 0x55, 0xce, 0x2a, 0x42, 0x32, 0xff, 0x26, 0x4c, 0xed, 0x44, 0xdb, 0x30, + 0x1b, 0xb8, 0xb5, 0xbd, 0xe4, 0x93, 0x45, 0xef, 0x84, 0xe3, 0x01, 0x13, 0x2c, 0x53, 0xdd, 0xb5, + 0x5a, 0x4d, 0xd5, 0xc1, 0xdb, 0xaa, 0x4e, 0x5f, 0x38, 0x2a, 0x50, 0xd6, 0x1d, 0xf5, 0x41, 0xd6, + 0xcc, 0x2b, 0x56, 0xab, 0xa9, 0xe0, 0xed, 0x2a, 0x69, 0x46, 0x0f, 0x40, 0xc0, 0x06, 0xd5, 0x68, + 0xba, 0xd3, 0xe3, 0x73, 0x89, 0x13, 0x49, 0xa5, 0xe0, 0x57, 0xd6, 0x9b, 0xee, 0x42, 0xe1, 0x03, + 0x1f, 0x9f, 0x1d, 0xe3, 0xcb, 0x75, 0x4c, 0x5e, 0xa7, 0xef, 0x70, 0xf0, 0x95, 0x86, 0x5d, 0x74, + 0x0e, 0x72, 0x9a, 0x28, 0xb0, 0x9b, 0x1f, 0x07, 0xac, 0xd4, 0x00, 0x94, 0x29, 0x80, 0x57, 0x7f, + 0x67, 0x2e, 0x26, 0xff, 0x7c, 0x0c, 0xd2, 0x4b, 0xd7, 0xd7, 0x35, 0xc3, 0x41, 0x35, 0x98, 0x08, + 0x64, 0x76, 0xd4, 0xe5, 0x1f, 0x88, 0xb9, 0x58, 0xff, 0xb5, 0x41, 0x57, 0x63, 0x0f, 0x24, 0xd3, + 0x7d, 0x69, 0xb6, 0x6b, 0xe0, 0x35, 0xc8, 0xb0, 0x5e, 0xba, 0x68, 0x01, 0x52, 0x36, 0xf9, 0xc1, + 0x53, 0xfb, 0x33, 0x03, 0x65, 0x9d, 0xc2, 0xfb, 0xcf, 0x24, 0x10, 0x14, 0xf9, 0x7b, 0x31, 0x80, + 0xa5, 0xeb, 0xd7, 0x37, 0x1c, 0xc3, 0x6e, 0x61, 0xef, 0xcd, 0x1a, 0xf1, 0x32, 0xdc, 0x13, 0xba, + 0x7f, 0xe9, 0xe8, 0x23, 0x8f, 0x7a, 0x32, 0xb8, 0x81, 0xe9, 0xe8, 0x7d, 0xa9, 0x35, 0x5d, 0xcf, + 0xa7, 0x96, 0x18, 0x99, 0xda, 0x92, 0xeb, 0xf5, 0x67, 0x63, 0x03, 0xf2, 0xc1, 0xf0, 0x5d, 0xb4, + 0x04, 0x59, 0x8f, 0xff, 0xe6, 0xdc, 0x94, 0x07, 0x73, 0x53, 0xa0, 0x71, 0x8e, 0xfa, 0x98, 0xf2, + 0xff, 0x21, 0x4c, 0x0d, 0x16, 0xc5, 0x9f, 0x28, 0x31, 0x22, 0xea, 0x9d, 0xab, 0xdf, 0x37, 0xc3, + 0x69, 0xe1, 0xb4, 0xba, 0xb8, 0xfa, 0x5a, 0x1c, 0x26, 0x37, 0xc5, 0xa2, 0xfd, 0x13, 0xcb, 0x89, + 0x75, 0xc8, 0x60, 0xd3, 0x73, 0x0c, 0x2c, 0x76, 0xf1, 0x1e, 0x1f, 0x34, 0xd7, 0x7d, 0xc6, 0x42, + 0xff, 0x8f, 0xab, 0x78, 0xbc, 0x83, 0x93, 0xe9, 0xe2, 0xc2, 0xdf, 0x4f, 0xc0, 0xf4, 0x20, 0x4c, + 0xf4, 0x30, 0x94, 0x74, 0x07, 0xd3, 0x0a, 0x35, 0x92, 0xe4, 0x2e, 0x8a, 0x6a, 0x6e, 0x57, 0x56, + 0x80, 0xf8, 0x68, 0x44, 0xb0, 0x08, 0xe8, 0xa1, 0x9d, 0xb2, 0x62, 0x80, 0x4c, 0x2d, 0x0b, 0x86, + 0x92, 0x38, 0xb0, 0xbe, 0xa5, 0xb5, 0x34, 0x53, 0xbf, 0x1b, 0xe7, 0xb5, 0xd7, 0x16, 0x88, 0x53, + 0xf0, 0x8b, 0x8c, 0x26, 0xba, 0x0e, 0x19, 0x41, 0x3e, 0xf9, 0x26, 0x90, 0x17, 0xc4, 0xd0, 0xfd, + 0x50, 0x08, 0x9b, 0x08, 0xea, 0xa2, 0x24, 0x95, 0x7c, 0xc8, 0x42, 0x0c, 0xb3, 0x41, 0xe9, 0x03, + 0x6d, 0x50, 0xc8, 0x13, 0xfc, 0xd5, 0x04, 0x4c, 0x28, 0xb8, 0xf9, 0x83, 0x35, 0x6f, 0x3f, 0x04, + 0xc0, 0x56, 0x34, 0x51, 0xb4, 0x77, 0x31, 0x75, 0xbd, 0x1a, 0x22, 0xc7, 0xe8, 0x2d, 0xb9, 0xde, + 0xdb, 0x39, 0x79, 0x5f, 0x89, 0x43, 0x21, 0x3c, 0x79, 0x3f, 0x00, 0x96, 0x0d, 0xd5, 0x03, 0x7d, + 0xc6, 0x4e, 0x95, 0x9f, 0x1c, 0xa4, 0xcf, 0x7a, 0xc4, 0xfa, 0x60, 0x45, 0xf6, 0xed, 0x38, 0xa4, + 0xf9, 0x09, 0xaf, 0xab, 0x3d, 0x5e, 0x6e, 0x6c, 0xf4, 0xab, 0xbd, 0x5d, 0x4e, 0xee, 0x83, 0x50, + 0x24, 0x71, 0x74, 0xe4, 0xc4, 0x58, 0xec, 0xc4, 0x38, 0x0d, 0x84, 0x83, 0xf3, 0xcd, 0x68, 0x16, + 0xf2, 0x04, 0x2c, 0x50, 0xd5, 0x04, 0x06, 0xda, 0xda, 0x5e, 0x8d, 0xd5, 0xa0, 0xc7, 0x00, 0xed, + 0xfa, 0x99, 0x0d, 0x35, 0x60, 0x01, 0x81, 0x9b, 0x08, 0x5a, 0x04, 0xf8, 0x7d, 0x00, 0xa4, 0x17, + 0x2a, 0x7b, 0x8b, 0x93, 0x05, 0x82, 0x39, 0x52, 0xb3, 0x44, 0xdf, 0xe3, 0xfc, 0x11, 0xe6, 0x30, + 0x77, 0x85, 0xd8, 0x3c, 0x56, 0x59, 0x3e, 0xdc, 0x52, 0xf8, 0xf6, 0xeb, 0xb3, 0xe5, 0x7d, 0xad, + 0xdd, 0x5a, 0x90, 0xfb, 0x90, 0x94, 0xa9, 0x03, 0x1d, 0x0d, 0xcd, 0x43, 0x12, 0xfc, 0xc9, 0x18, + 0xa0, 0xc0, 0x68, 0xf8, 0x27, 0xb6, 0xaf, 0xd0, 0x73, 0xbc, 0xc2, 0x8d, 0x8f, 0x1d, 0x1c, 0x19, + 0x04, 0xf8, 0x22, 0x32, 0x08, 0xad, 0x88, 0x0b, 0x81, 0x8a, 0x16, 0xd7, 0xb3, 0xfb, 0x3c, 0xa4, + 0x3a, 0x5f, 0xb5, 0x0c, 0x81, 0x2d, 0xe0, 0xfd, 0x5e, 0x8e, 0xc9, 0xff, 0x2e, 0x06, 0xc7, 0x7a, + 0xa4, 0xc9, 0xef, 0xec, 0x7b, 0x01, 0x39, 0xa1, 0x46, 0xfe, 0xcf, 0xd0, 0x63, 0xfc, 0x22, 0xe2, + 0x21, 0x85, 0x73, 0xc2, 0xe9, 0x51, 0xc6, 0x6f, 0x91, 0x95, 0xe1, 0x0f, 0xac, 0xfe, 0xc3, 0x18, + 0x4c, 0x85, 0x3b, 0xe3, 0x0f, 0x6b, 0x15, 0x0a, 0xe1, 0xbe, 0xf0, 0x01, 0xbd, 0x63, 0x94, 0x01, + 0xf1, 0xb1, 0x44, 0xf0, 0xd1, 0x73, 0xc1, 0xc2, 0x65, 0x19, 0xb5, 0x27, 0x46, 0xe6, 0x8d, 0xbf, + 0x33, 0xd0, 0xb5, 0x80, 0x93, 0xc2, 0x0f, 0x4b, 0xae, 0x5b, 0x56, 0x0b, 0xfd, 0x29, 0x98, 0x30, + 0x2d, 0x4f, 0x25, 0x52, 0x8e, 0x9b, 0x2a, 0x0f, 0xef, 0x99, 0xf6, 0x7b, 0xee, 0x70, 0x2c, 0xfb, + 0xe6, 0xeb, 0xb3, 0xbd, 0xa4, 0xba, 0xf8, 0x58, 0x32, 0x2d, 0x6f, 0x91, 0xb6, 0x6f, 0xb0, 0xe0, + 0xdf, 0x81, 0xf1, 0xe8, 0xa7, 0x99, 0xb6, 0x5c, 0x39, 0xf4, 0xa7, 0xc7, 0x0f, 0xfa, 0x6c, 0x61, + 0x2b, 0xf4, 0x4d, 0xf6, 0xf4, 0xe4, 0x1f, 0x92, 0x79, 0xdc, 0x00, 0xe9, 0x7a, 0xf7, 0xd9, 0xb0, + 0x77, 0x43, 0xe6, 0xee, 0x8e, 0x99, 0x09, 0xb4, 0x53, 0x5f, 0x88, 0x01, 0x04, 0xd9, 0x13, 0xf4, + 0x28, 0x1c, 0x5d, 0x5c, 0x5b, 0x5d, 0x52, 0x1b, 0x1b, 0x95, 0x8d, 0xcd, 0x46, 0xf4, 0xd9, 0x6b, + 0xf1, 0x20, 0x88, 0x6b, 0x63, 0x9d, 0xfe, 0x03, 0x7a, 0xf4, 0x10, 0x4c, 0x45, 0xa1, 0x49, 0xa9, + 0xb6, 0x24, 0xc5, 0xca, 0x85, 0xdb, 0x77, 0xe6, 0xb2, 0xcc, 0x6b, 0xc4, 0x4d, 0x74, 0x02, 0xee, + 0xe9, 0x85, 0xab, 0xaf, 0x5e, 0x96, 0xe2, 0xe5, 0xf1, 0xdb, 0x77, 0xe6, 0x72, 0xbe, 0x7b, 0x89, + 0x64, 0x40, 0x61, 0x48, 0x4e, 0x2f, 0x51, 0x86, 0xdb, 0x77, 0xe6, 0xd2, 0x6c, 0x32, 0xca, 0xc9, + 0x0f, 0x7c, 0x72, 0x66, 0xec, 0xd4, 0x7b, 0x00, 0xea, 0xe6, 0xb6, 0xa3, 0xd1, 0xff, 0xfd, 0x8a, + 0xca, 0x70, 0xa4, 0xbe, 0x7a, 0x49, 0xa9, 0x54, 0x37, 0xea, 0x6b, 0xab, 0x5d, 0xaf, 0x75, 0x47, + 0xdb, 0x96, 0xd6, 0x36, 0x17, 0x97, 0x6b, 0x6a, 0xa3, 0x7e, 0x79, 0x95, 0x6d, 0xaf, 0x46, 0xda, + 0x9e, 0x5f, 0xdd, 0xa8, 0xaf, 0xd4, 0xa4, 0xf8, 0xe2, 0xa5, 0x81, 0x09, 0xfe, 0x47, 0x0f, 0x9c, + 0xe6, 0x3d, 0x3f, 0x81, 0x1f, 0xc9, 0xf0, 0xff, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x60, 0x19, + 0x3a, 0xd0, 0x93, 0x94, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) @@ -1866,6 +2180,12 @@ func (this *UnbondingDelegationEntry) Equal(that interface{}) bool { if !this.Balance.Equal(that1.Balance) { return false } + if this.UnbondingId != that1.UnbondingId { + return false + } + if this.UnbondingOnHoldRefCount != that1.UnbondingOnHoldRefCount { + return false + } return true } func (this *RedelegationEntry) Equal(that interface{}) bool { @@ -1899,6 +2219,12 @@ func (this *RedelegationEntry) Equal(that interface{}) bool { if !this.SharesDst.Equal(that1.SharesDst) { return false } + if this.UnbondingId != that1.UnbondingId { + return false + } + if this.UnbondingOnHoldRefCount != that1.UnbondingOnHoldRefCount { + return false + } return true } func (this *Params) Equal(that interface{}) bool { @@ -2213,6 +2539,29 @@ func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.UnbondingIds) > 0 { + dAtA5 := make([]byte, len(m.UnbondingIds)*10) + var j4 int + for _, num := range m.UnbondingIds { + for num >= 1<<7 { + dAtA5[j4] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j4++ + } + dAtA5[j4] = uint8(num) + j4++ + } + i -= j4 + copy(dAtA[i:], dAtA5[:j4]) + i = encodeVarintStaking(dAtA, i, uint64(j4)) + i-- + dAtA[i] = 0x6a + } + if m.UnbondingOnHoldRefCount != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingOnHoldRefCount)) + i-- + dAtA[i] = 0x60 + } { size := m.MinSelfDelegation.Size() i -= size @@ -2233,12 +2582,12 @@ func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x52 - n5, err5 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.UnbondingTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.UnbondingTime):]) - if err5 != nil { - return 0, err5 + n7, err7 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.UnbondingTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.UnbondingTime):]) + if err7 != nil { + return 0, err7 } - i -= n5 - i = encodeVarintStaking(dAtA, i, uint64(n5)) + i -= n7 + i = encodeVarintStaking(dAtA, i, uint64(n7)) i-- dAtA[i] = 0x4a if m.UnbondingHeight != 0 { @@ -2618,6 +2967,16 @@ func (m *UnbondingDelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error _ = i var l int _ = l + if m.UnbondingOnHoldRefCount != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingOnHoldRefCount)) + i-- + dAtA[i] = 0x30 + } + if m.UnbondingId != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingId)) + i-- + dAtA[i] = 0x28 + } { size := m.Balance.Size() i -= size @@ -2638,12 +2997,12 @@ func (m *UnbondingDelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error } i-- dAtA[i] = 0x1a - n8, err8 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CompletionTime):]) - if err8 != nil { - return 0, err8 + n10, err10 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CompletionTime):]) + if err10 != nil { + return 0, err10 } - i -= n8 - i = encodeVarintStaking(dAtA, i, uint64(n8)) + i -= n10 + i = encodeVarintStaking(dAtA, i, uint64(n10)) i-- dAtA[i] = 0x12 if m.CreationHeight != 0 { @@ -2674,6 +3033,16 @@ func (m *RedelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.UnbondingOnHoldRefCount != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingOnHoldRefCount)) + i-- + dAtA[i] = 0x30 + } + if m.UnbondingId != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingId)) + i-- + dAtA[i] = 0x28 + } { size := m.SharesDst.Size() i -= size @@ -2694,12 +3063,12 @@ func (m *RedelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x1a - n9, err9 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CompletionTime):]) - if err9 != nil { - return 0, err9 + n11, err11 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CompletionTime):]) + if err11 != nil { + return 0, err11 } - i -= n9 - i = encodeVarintStaking(dAtA, i, uint64(n9)) + i -= n11 + i = encodeVarintStaking(dAtA, i, uint64(n11)) i-- dAtA[i] = 0x12 if m.CreationHeight != 0 { @@ -2820,12 +3189,12 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x10 } - n10, err10 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.UnbondingTime):]) - if err10 != nil { - return 0, err10 + n12, err12 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.UnbondingTime):]) + if err12 != nil { + return 0, err12 } - i -= n10 - i = encodeVarintStaking(dAtA, i, uint64(n10)) + i -= n12 + i = encodeVarintStaking(dAtA, i, uint64(n12)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -3007,6 +3376,43 @@ func (m *Pool) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ValidatorUpdates) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ValidatorUpdates) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatorUpdates) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Updates) > 0 { + for iNdEx := len(m.Updates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Updates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintStaking(dAtA []byte, offset int, v uint64) int { offset -= sovStaking(v) base := offset @@ -3127,6 +3533,16 @@ func (m *Validator) Size() (n int) { n += 1 + l + sovStaking(uint64(l)) l = m.MinSelfDelegation.Size() n += 1 + l + sovStaking(uint64(l)) + if m.UnbondingOnHoldRefCount != 0 { + n += 1 + sovStaking(uint64(m.UnbondingOnHoldRefCount)) + } + if len(m.UnbondingIds) > 0 { + l = 0 + for _, e := range m.UnbondingIds { + l += sovStaking(uint64(e)) + } + n += 1 + sovStaking(uint64(l)) + l + } return n } @@ -3270,6 +3686,12 @@ func (m *UnbondingDelegationEntry) Size() (n int) { n += 1 + l + sovStaking(uint64(l)) l = m.Balance.Size() n += 1 + l + sovStaking(uint64(l)) + if m.UnbondingId != 0 { + n += 1 + sovStaking(uint64(m.UnbondingId)) + } + if m.UnbondingOnHoldRefCount != 0 { + n += 1 + sovStaking(uint64(m.UnbondingOnHoldRefCount)) + } return n } @@ -3288,6 +3710,12 @@ func (m *RedelegationEntry) Size() (n int) { n += 1 + l + sovStaking(uint64(l)) l = m.SharesDst.Size() n += 1 + l + sovStaking(uint64(l)) + if m.UnbondingId != 0 { + n += 1 + sovStaking(uint64(m.UnbondingId)) + } + if m.UnbondingOnHoldRefCount != 0 { + n += 1 + sovStaking(uint64(m.UnbondingOnHoldRefCount)) + } return n } @@ -3400,6 +3828,21 @@ func (m *Pool) Size() (n int) { return n } +func (m *ValidatorUpdates) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Updates) > 0 { + for _, e := range m.Updates { + l = e.Size() + n += 1 + l + sovStaking(uint64(l)) + } + } + return n +} + func sovStaking(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -4375,6 +4818,101 @@ func (m *Validator) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHoldRefCount", wireType) + } + m.UnbondingOnHoldRefCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingOnHoldRefCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 13: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.UnbondingIds = append(m.UnbondingIds, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.UnbondingIds) == 0 { + m.UnbondingIds = make([]uint64, 0, elementCount) + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.UnbondingIds = append(m.UnbondingIds, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingIds", wireType) + } default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) @@ -5351,6 +5889,44 @@ func (m *UnbondingDelegationEntry) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingId", wireType) + } + m.UnbondingId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHoldRefCount", wireType) + } + m.UnbondingOnHoldRefCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingOnHoldRefCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) @@ -5521,6 +6097,44 @@ func (m *RedelegationEntry) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingId", wireType) + } + m.UnbondingId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHoldRefCount", wireType) + } + m.UnbondingOnHoldRefCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingOnHoldRefCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) @@ -6396,6 +7010,90 @@ func (m *Pool) Unmarshal(dAtA []byte) error { } return nil } +func (m *ValidatorUpdates) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ValidatorUpdates: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ValidatorUpdates: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Updates", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Updates = append(m.Updates, types3.ValidatorUpdate{}) + if err := m.Updates[len(m.Updates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipStaking(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/staking/types/validator.go b/x/staking/types/validator.go index 434589554b91..933d3bf1b162 100644 --- a/x/staking/types/validator.go +++ b/x/staking/types/validator.go @@ -48,17 +48,18 @@ func NewValidator(operator sdk.ValAddress, pubKey cryptotypes.PubKey, descriptio } return Validator{ - OperatorAddress: operator.String(), - ConsensusPubkey: pkAny, - Jailed: false, - Status: Unbonded, - Tokens: math.ZeroInt(), - DelegatorShares: math.LegacyZeroDec(), - Description: description, - UnbondingHeight: int64(0), - UnbondingTime: time.Unix(0, 0).UTC(), - Commission: NewCommission(math.LegacyZeroDec(), math.LegacyZeroDec(), math.LegacyZeroDec()), - MinSelfDelegation: math.OneInt(), + OperatorAddress: operator.String(), + ConsensusPubkey: pkAny, + Jailed: false, + Status: Unbonded, + Tokens: math.ZeroInt(), + DelegatorShares: math.LegacyZeroDec(), + Description: description, + UnbondingHeight: int64(0), + UnbondingTime: time.Unix(0, 0).UTC(), + Commission: NewCommission(math.LegacyZeroDec(), math.LegacyZeroDec(), math.LegacyZeroDec()), + MinSelfDelegation: math.OneInt(), + UnbondingOnHoldRefCount: 0, }, nil }