diff --git a/app/role.go b/app/role.go index 60ca1e98..ba044c71 100644 --- a/app/role.go +++ b/app/role.go @@ -11,11 +11,24 @@ import ( ) var ( - accountActionGroups = getAccountActionGroups() - namespaceActionGroups = getNamespaceActionGroups() + userAccountActionGroups = getUserAccountActionGroups() + allAccountActionGroups = getAllAccountActionGroups() + namespaceActionGroups = getNamespaceActionGroups() ) -func getAccountActionGroups() []string { +func getUserAccountActionGroups() []string { + var rv []string + for n, v := range auth.AccountActionGroup_value { + if v != int32(auth.ACCOUNT_ACTION_GROUP_UNSPECIFIED) && + v != int32(auth.ACCOUNT_ACTION_GROUP_METRICS_READ) { + rv = append(rv, n) + } + } + slices.Sort(rv) + return rv +} + +func getAllAccountActionGroups() []string { var rv []string for n, v := range auth.AccountActionGroup_value { if v != int32(auth.ACCOUNT_ACTION_GROUP_UNSPECIFIED) { @@ -98,7 +111,7 @@ func toAccountActionGroup(actionGroup string) (auth.AccountActionGroup, error) { } if ag == auth.ACCOUNT_ACTION_GROUP_UNSPECIFIED { return auth.ACCOUNT_ACTION_GROUP_UNSPECIFIED, - fmt.Errorf("invalid action group: should be one of: %s", accountActionGroups) + fmt.Errorf("invalid action group: should be one of: %s", allAccountActionGroups) } return ag, nil } diff --git a/app/serviceaccount.go b/app/serviceaccount.go index a1239802..b140150c 100644 --- a/app/serviceaccount.go +++ b/app/serviceaccount.go @@ -211,7 +211,7 @@ func NewServiceAccountCommand(getServiceAccountClientFn GetServiceAccountClientF RequestIDFlag, &cli.StringFlag{ Name: accountRoleFlagName, - Usage: fmt.Sprintf("The account role to set on the service account; valid types are: %v", accountActionGroups), + Usage: fmt.Sprintf("The account role to set on the service account; valid types are: %v", allAccountActionGroups), Required: true, Aliases: []string{"ar"}, }, @@ -227,7 +227,7 @@ func NewServiceAccountCommand(getServiceAccountClientFn GetServiceAccountClientF } if len(ctx.String(accountRoleFlagName)) == 0 { - return fmt.Errorf("account role must be specified; valid types are %v", accountActionGroups) + return fmt.Errorf("account role must be specified; valid types are %v", allAccountActionGroups) } ag, err := toAccountActionGroup(ctx.String(accountRoleFlagName)) @@ -425,7 +425,7 @@ func NewServiceAccountCommand(getServiceAccountClientFn GetServiceAccountClientF ResourceVersionFlag, &cli.StringFlag{ Name: accountRoleFlagName, - Usage: fmt.Sprintf("The account role to set on the service account; valid types are: %v", accountActionGroups), + Usage: fmt.Sprintf("The account role to set on the service account; valid types are: %v", allAccountActionGroups), Required: true, Aliases: []string{"ar"}, }, @@ -433,7 +433,7 @@ func NewServiceAccountCommand(getServiceAccountClientFn GetServiceAccountClientF Action: func(ctx *cli.Context) error { // validate input role if _, ok := auth.AccountActionGroup_value[ctx.String(accountRoleFlagName)]; !ok { - return fmt.Errorf("invalid account role %v; valid types are: %v", ctx.String(accountRoleFlagName), accountActionGroups) + return fmt.Errorf("invalid account role %v; valid types are: %v", ctx.String(accountRoleFlagName), allAccountActionGroups) } // if account role is admin unset the namespace permissions var namespacePermissions map[string]string diff --git a/app/user.go b/app/user.go index 3f98e520..83272722 100644 --- a/app/user.go +++ b/app/user.go @@ -150,6 +150,10 @@ func (c *UserClient) inviteUsers( if err != nil { return err } + if role.Spec.AccountRole.ActionGroup == auth.ACCOUNT_ACTION_GROUP_METRICS_READ { + return errors.New("metrics read role is not allowed for users") + } + roleIDs = append(roleIDs, role.GetId()) // get any optional namespace permissions @@ -261,6 +265,10 @@ func (c *UserClient) setAccountRole( if err != nil { return err } + if accountRoleToSet.Spec.AccountRole.ActionGroup == auth.ACCOUNT_ACTION_GROUP_METRICS_READ { + return errors.New("metrics read role is not allowed for users") + } + if accountRoleToSet.Spec.AccountRole.ActionGroup == auth.ACCOUNT_ACTION_GROUP_ADMIN { // set the user account admin role y, err := ConfirmPrompt(ctx, "Setting admin role on user. All existing namespace permissions will be replaced, please confirm") @@ -465,7 +473,7 @@ func NewUserCommand(getUserClientFn GetUserClientFn) (CommandOut, error) { }, &cli.StringFlag{ Name: accountRoleFlagName, - Usage: fmt.Sprintf("The account role to set on the user; valid types are: %v", accountActionGroups), + Usage: fmt.Sprintf("The account role to set on the user; valid types are: %v", userAccountActionGroups), Aliases: []string{"ar"}, Required: true, }, @@ -531,7 +539,7 @@ func NewUserCommand(getUserClientFn GetUserClientFn) (CommandOut, error) { ResourceVersionFlag, &cli.StringFlag{ Name: accountRoleFlagName, - Usage: fmt.Sprintf("The account role to set on the user; valid types are: %v", accountActionGroups), + Usage: fmt.Sprintf("The account role to set on the user; valid types are: %v", userAccountActionGroups), Required: true, Aliases: []string{"ar"}, }, diff --git a/app/user_group.go b/app/user_group.go index 0961df10..39f2c8dd 100644 --- a/app/user_group.go +++ b/app/user_group.go @@ -189,12 +189,12 @@ func NewUserGroupCommand(GetGroupClientFn GetGroupClientFn) (CommandOut, error) Flags: []cli.Flag{ &cli.StringFlag{ Name: pageTokenFlagName, - Usage: "list groups starting from this page token", + Usage: "List groups starting from this page token", Aliases: []string{"p"}, }, &cli.IntFlag{ Name: pageSizeFlagName, - Usage: "number of groups to list", + Usage: "Number of groups to list", Aliases: []string{"s"}, }, }, @@ -208,9 +208,10 @@ func NewUserGroupCommand(GetGroupClientFn GetGroupClientFn) (CommandOut, error) Aliases: []string{"g"}, Flags: []cli.Flag{ &cli.StringFlag{ - Name: groupIDFlagName, - Usage: "group ID", - Aliases: []string{"id"}, + Name: groupIDFlagName, + Usage: "The ID of the group", + Required: true, + Aliases: []string{"id"}, }, }, Action: func(ctx *cli.Context) error { @@ -223,18 +224,19 @@ func NewUserGroupCommand(GetGroupClientFn GetGroupClientFn) (CommandOut, error) Aliases: []string{"sa"}, Flags: []cli.Flag{ &cli.StringFlag{ - Name: groupIDFlagName, - Usage: "group ID", - Aliases: []string{"id"}, + Name: groupIDFlagName, + Usage: "The ID of the group", + Required: true, + Aliases: []string{"id"}, }, &cli.StringFlag{ Name: accountRoleFlagName, - Usage: "account role", + Usage: fmt.Sprintf("The account role to set on the group; valid types are: %v", userAccountActionGroups), Aliases: []string{"ar"}, }, &cli.StringSliceFlag{ Name: namespaceRoleFlagName, - Usage: "namespace roles", + Usage: "Flag can be used multiple times", Aliases: []string{"nr"}, }, }, diff --git a/app/user_test.go b/app/user_test.go index a4b1ef59..baf15893 100644 --- a/app/user_test.go +++ b/app/user_test.go @@ -3,6 +3,9 @@ package app import ( "context" "errors" + "reflect" + "testing" + "github.com/golang/mock/gomock" "github.com/stretchr/testify/suite" "github.com/temporalio/tcld/protogen/api/auth/v1" @@ -10,8 +13,6 @@ import ( "github.com/temporalio/tcld/protogen/api/request/v1" authservicemock "github.com/temporalio/tcld/protogen/apimock/authservice/v1" "github.com/urfave/cli/v2" - "reflect" - "testing" ) func TestUser(t *testing.T) { @@ -154,6 +155,11 @@ func (s *UserTestSuite) TestInviteErrors() { Roles: []*auth.Role{{ Id: "account-admin-role", Type: auth.ROLE_TYPE_PREDEFINED, + Spec: &auth.RoleSpec{ + AccountRole: &auth.AccountRoleSpec{ + ActionGroup: auth.ACCOUNT_ACTION_GROUP_ADMIN, + }, + }, }}, }, nil) s.mockAuthService.EXPECT().InviteUsers(gomock.Any(), gomock.Any()).Return(nil, errors.New("invite users error")).Times(1) @@ -162,6 +168,11 @@ func (s *UserTestSuite) TestInviteErrors() { Roles: []*auth.Role{{ Id: "account-dev-role", Type: auth.ROLE_TYPE_PREDEFINED, + Spec: &auth.RoleSpec{ + AccountRole: &auth.AccountRoleSpec{ + ActionGroup: auth.ACCOUNT_ACTION_GROUP_DEVELOPER, + }, + }, }}, }, nil).Times(1) s.mockAuthService.EXPECT().GetRolesByPermissions(gomock.Any(), gomock.Any()).Return(&authservice.GetRolesByPermissionsResponse{ @@ -205,6 +216,11 @@ func (s *UserTestSuite) TestInviteSuccess() { Roles: []*auth.Role{{ Id: "account-dev-role", Type: auth.ROLE_TYPE_PREDEFINED, + Spec: &auth.RoleSpec{ + AccountRole: &auth.AccountRoleSpec{ + ActionGroup: auth.ACCOUNT_ACTION_GROUP_DEVELOPER, + }, + }, }}, }, nil).Times(1) s.mockAuthService.EXPECT().GetRolesByPermissions(gomock.Any(), gomock.Any()).Return(&authservice.GetRolesByPermissionsResponse{ diff --git a/protogen/api/auth/v1/message.pb.go b/protogen/api/auth/v1/message.pb.go index 99761749..674bb12b 100644 --- a/protogen/api/auth/v1/message.pb.go +++ b/protogen/api/auth/v1/message.pb.go @@ -143,6 +143,8 @@ const ( ACCOUNT_ACTION_GROUP_OWNER AccountActionGroup = 4 // finance admin ACCOUNT_ACTION_GROUP_FINANCE_ADMIN AccountActionGroup = 5 + // read-only access to metrics + ACCOUNT_ACTION_GROUP_METRICS_READ AccountActionGroup = 6 ) var AccountActionGroup_name = map[int32]string{ @@ -152,6 +154,7 @@ var AccountActionGroup_name = map[int32]string{ 3: "Read", 4: "Owner", 5: "FinanceAdmin", + 6: "MetricsRead", } var AccountActionGroup_value = map[string]int32{ @@ -161,6 +164,7 @@ var AccountActionGroup_value = map[string]int32{ "Read": 3, "Owner": 4, "FinanceAdmin": 5, + "MetricsRead": 6, } func (AccountActionGroup) EnumDescriptor() ([]byte, []int) { @@ -1545,110 +1549,111 @@ func init() { func init() { proto.RegisterFile("api/auth/v1/message.proto", fileDescriptor_bea184b0c3eae56b) } var fileDescriptor_bea184b0c3eae56b = []byte{ - // 1641 bytes of a gzipped FileDescriptorProto + // 1654 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0xbd, 0x6f, 0xdb, 0xda, 0x15, 0x37, 0x65, 0x49, 0x96, 0x8f, 0x1c, 0x9b, 0xb9, 0xfe, 0x92, 0x55, 0x99, 0x96, 0xd9, 0xbc, - 0xf7, 0xfc, 0x94, 0x42, 0x46, 0x1c, 0x20, 0x0d, 0x1a, 0x34, 0x01, 0x23, 0xd1, 0x0e, 0x11, 0x47, - 0x12, 0x28, 0xd9, 0xa9, 0xbb, 0x10, 0xb4, 0x74, 0xe3, 0x10, 0x91, 0x44, 0x96, 0xa4, 0x9c, 0x6a, - 0xeb, 0xdc, 0xa9, 0x43, 0xa7, 0xae, 0x5d, 0xda, 0xa9, 0x7f, 0x45, 0x81, 0x8e, 0x19, 0x33, 0x26, - 0x0e, 0x0a, 0x04, 0x9d, 0x82, 0xae, 0x59, 0x8a, 0x7b, 0xf9, 0x21, 0x7e, 0x49, 0xf9, 0x68, 0x86, - 0x37, 0x59, 0x3c, 0xe7, 0x77, 0x7e, 0xe7, 0x9e, 0xdf, 0xbd, 0xe7, 0xdc, 0x0b, 0xc3, 0x96, 0x6a, - 0x68, 0xfb, 0xea, 0xc8, 0x7e, 0xbe, 0x7f, 0x79, 0x6b, 0x7f, 0x80, 0x2d, 0x4b, 0xbd, 0xc0, 0x55, - 0xc3, 0xd4, 0x6d, 0x1d, 0xe5, 0x55, 0x43, 0xab, 0x12, 0x57, 0xf5, 0xf2, 0x56, 0x71, 0xe7, 0x42, - 0xd7, 0x2f, 0xfa, 0x78, 0x9f, 0xba, 0xce, 0x47, 0xcf, 0xf6, 0x6d, 0x6d, 0x80, 0x2d, 0x5b, 0x1d, - 0x18, 0x0e, 0x9a, 0xbf, 0x03, 0xb9, 0x13, 0x0b, 0x9b, 0x6d, 0x03, 0x77, 0xd1, 0x1a, 0x64, 0xf0, - 0x40, 0xd5, 0xfa, 0x05, 0xa6, 0xcc, 0xec, 0x2d, 0xca, 0xce, 0x07, 0xb1, 0x9a, 0x7a, 0x1f, 0x5b, - 0x85, 0x54, 0x79, 0x9e, 0x58, 0xe9, 0x07, 0x3f, 0x86, 0x02, 0x89, 0x6b, 0xa8, 0x03, 0x6c, 0x19, - 0x6a, 0x17, 0xb7, 0xb0, 0x39, 0xd0, 0x2c, 0x4b, 0xd3, 0x87, 0x16, 0xda, 0x84, 0x85, 0x91, 0x85, - 0x4d, 0x45, 0xeb, 0xb9, 0x4c, 0x59, 0xf2, 0x29, 0xf5, 0x50, 0x1d, 0x96, 0xd4, 0xae, 0xad, 0xe9, - 0x43, 0xe5, 0xc2, 0xd4, 0x47, 0x46, 0x21, 0x55, 0x66, 0xf6, 0x96, 0x0f, 0x76, 0xab, 0x81, 0x15, - 0x57, 0x7d, 0x46, 0x81, 0x22, 0x8f, 0x08, 0x50, 0xce, 0xab, 0x93, 0x0f, 0xfe, 0x2f, 0x0c, 0x80, - 0x34, 0xbc, 0xd4, 0x6c, 0x95, 0xd8, 0x10, 0x0b, 0xf3, 0x23, 0x53, 0x73, 0x33, 0x91, 0x9f, 0xe8, - 0xd7, 0xb0, 0xd4, 0x35, 0xb1, 0x6a, 0xe3, 0x9e, 0x42, 0xca, 0xa5, 0x69, 0xf2, 0x07, 0xc5, 0xaa, - 0xa3, 0x45, 0xd5, 0xd3, 0xa2, 0xda, 0xf1, 0xb4, 0x90, 0xf3, 0x2e, 0x9e, 0x58, 0xd0, 0x3d, 0xc8, - 0xe3, 0xdf, 0x1b, 0x9a, 0x39, 0x76, 0xa2, 0xe7, 0x3f, 0x19, 0x0d, 0x0e, 0x9c, 0x18, 0xf8, 0x8f, - 0x29, 0x48, 0x13, 0x61, 0xd0, 0x32, 0xa4, 0xfc, 0xfa, 0x53, 0x5a, 0x0f, 0xfd, 0x08, 0xac, 0x89, - 0x2d, 0x7d, 0x64, 0x76, 0xb1, 0x72, 0x89, 0x4d, 0xa2, 0x14, 0x5d, 0xd8, 0xa2, 0xbc, 0xe2, 0xd9, - 0x4f, 0x1d, 0x33, 0xfa, 0x11, 0xd2, 0x96, 0x81, 0xbb, 0x6e, 0xe6, 0xf5, 0x90, 0x3c, 0xde, 0x66, - 0xc9, 0x14, 0x82, 0x7e, 0x01, 0x19, 0xcb, 0x56, 0x6d, 0x5c, 0x48, 0x53, 0x29, 0x37, 0xe2, 0x58, - 0xe2, 0x95, 0x1d, 0x10, 0xda, 0x06, 0x30, 0xf1, 0xef, 0x46, 0xd8, 0xb2, 0xc9, 0xde, 0x64, 0x68, - 0xf6, 0x45, 0xd7, 0x22, 0xf5, 0xd0, 0x2f, 0x01, 0x34, 0x5f, 0xd7, 0x42, 0x96, 0x66, 0xdf, 0x0c, - 0x31, 0x4e, 0x64, 0x97, 0x03, 0xd0, 0x98, 0xe0, 0x0b, 0x5f, 0x26, 0xf8, 0x23, 0x40, 0x7d, 0xd5, - 0xb2, 0x95, 0x81, 0xde, 0xd3, 0x9e, 0x69, 0x1e, 0x49, 0xee, 0x93, 0x24, 0x2c, 0x89, 0x7a, 0xe2, - 0x06, 0x51, 0xf5, 0x5f, 0xc2, 0x75, 0xff, 0xfc, 0xc8, 0x7a, 0x1f, 0xd3, 0x63, 0x5d, 0x82, 0xc5, - 0xa1, 0x67, 0x74, 0x37, 0x64, 0x62, 0xf8, 0x46, 0x67, 0xf2, 0x04, 0x56, 0x84, 0x6e, 0x57, 0x1f, - 0x0d, 0x6d, 0x3f, 0xed, 0xc3, 0x08, 0x31, 0x43, 0x89, 0x77, 0x42, 0xc4, 0x6e, 0xcc, 0x54, 0xda, - 0x3f, 0x33, 0x90, 0xf3, 0x09, 0x1f, 0x10, 0x42, 0x8a, 0x57, 0x48, 0x0f, 0x52, 0xc2, 0xfc, 0x41, - 0x29, 0x89, 0xd0, 0x8b, 0x21, 0x6c, 0xbe, 0x01, 0x1d, 0xc1, 0x8a, 0x5f, 0xb7, 0x32, 0xe9, 0xe9, - 0xfc, 0x01, 0x97, 0x5c, 0xad, 0xcf, 0xb2, 0x3c, 0x0c, 0x9a, 0x2c, 0xbe, 0x0f, 0x69, 0x4a, 0x18, - 0x3f, 0xe3, 0x69, 0x7b, 0x6c, 0x60, 0x57, 0xc3, 0xf0, 0xc1, 0x25, 0x01, 0x9d, 0xb1, 0x81, 0x65, - 0x0a, 0x99, 0x79, 0xc6, 0xfd, 0xbc, 0x14, 0xc2, 0xff, 0x87, 0x01, 0x10, 0x5a, 0xd2, 0x63, 0x3c, - 0xa6, 0x32, 0xdc, 0x07, 0x52, 0x14, 0xb6, 0x2c, 0x85, 0xe6, 0x72, 0x64, 0xdd, 0x0e, 0xab, 0x40, - 0xd1, 0x02, 0x45, 0xd1, 0x9c, 0xa0, 0xfa, 0xbf, 0xd1, 0x2e, 0x2c, 0xf5, 0x34, 0xcb, 0xe8, 0xab, - 0x63, 0x85, 0x94, 0xe5, 0x36, 0x61, 0xde, 0xb5, 0x91, 0xe2, 0x51, 0x19, 0xf2, 0x3d, 0x6c, 0x75, - 0x4d, 0xcd, 0xa0, 0x9d, 0x30, 0xef, 0x22, 0x26, 0xa6, 0xe8, 0x8c, 0x48, 0x7f, 0xc9, 0x8c, 0x40, - 0x45, 0xc8, 0xf5, 0x34, 0x4b, 0x3d, 0xef, 0x63, 0xa7, 0x09, 0x73, 0xb2, 0xff, 0xcd, 0x2b, 0x90, - 0x69, 0xbe, 0x1c, 0x62, 0x13, 0x6d, 0x41, 0x4e, 0x27, 0x3f, 0x26, 0x53, 0x74, 0x81, 0x7e, 0x4b, - 0x3d, 0x74, 0x0f, 0xc0, 0x71, 0x05, 0xc4, 0x2e, 0x25, 0x08, 0x40, 0x89, 0x68, 0xfd, 0x8b, 0xba, - 0xf7, 0x93, 0xff, 0x6f, 0x0a, 0xb2, 0x8e, 0x3b, 0xb6, 0x7d, 0x7b, 0x90, 0xa1, 0x38, 0x77, 0x60, - 0xa2, 0x10, 0x25, 0x25, 0x93, 0x1d, 0x00, 0xba, 0x19, 0xda, 0xbd, 0xcd, 0x84, 0xdc, 0x81, 0x19, - 0x95, 0x34, 0xf9, 0xd2, 0xc9, 0x93, 0xaf, 0xea, 0x8d, 0xb3, 0x0c, 0x2d, 0xaa, 0x90, 0x44, 0x3c, - 0x7d, 0xa0, 0x65, 0xa3, 0x03, 0xed, 0x27, 0x33, 0x97, 0xea, 0x70, 0xcd, 0x6f, 0x75, 0x72, 0x10, - 0xd1, 0x6d, 0x48, 0xfb, 0x3d, 0xfc, 0x19, 0x43, 0x81, 0x82, 0xf9, 0x0e, 0xac, 0x04, 0x26, 0x11, - 0xe5, 0x11, 0x00, 0x0c, 0xff, 0xe6, 0x75, 0xd9, 0x3e, 0x63, 0x76, 0x05, 0x82, 0xf8, 0x3f, 0x92, - 0x03, 0xe1, 0xb1, 0x2d, 0x7b, 0x13, 0xc6, 0x69, 0x18, 0x77, 0xc6, 0x14, 0x93, 0xd7, 0x47, 0x10, - 0xf2, 0x35, 0x35, 0x54, 0xd8, 0x19, 0xa0, 0xc9, 0x8c, 0x71, 0x48, 0xfc, 0x31, 0x53, 0x89, 0xd2, - 0x60, 0xcb, 0xaa, 0x46, 0x2a, 0xc2, 0x96, 0x38, 0xb4, 0xcd, 0xb1, 0x7c, 0x7d, 0x18, 0xb5, 0x17, - 0xcf, 0x61, 0x23, 0x19, 0x4c, 0x9e, 0x00, 0x2f, 0xf0, 0xd8, 0x7b, 0x02, 0xbc, 0xc0, 0x63, 0x74, - 0x00, 0x99, 0x4b, 0xb5, 0x3f, 0xf2, 0xee, 0xfe, 0xd2, 0x34, 0x49, 0x68, 0x09, 0x0e, 0xf4, 0x57, - 0xa9, 0xbb, 0x0c, 0xff, 0x26, 0x05, 0xcb, 0x6d, 0x6c, 0x5e, 0x6a, 0xd4, 0x49, 0xea, 0xfa, 0x7f, - 0x2e, 0xf2, 0xdb, 0xa1, 0x36, 0x09, 0xef, 0x72, 0x38, 0x4b, 0xa0, 0x5d, 0xee, 0x84, 0xaf, 0xf4, - 0xf2, 0xac, 0xa8, 0x2f, 0xb8, 0xdc, 0xa3, 0xbd, 0x90, 0xfd, 0x16, 0xbd, 0xb0, 0xf0, 0x15, 0xbd, - 0xf0, 0x0f, 0x06, 0x50, 0xbc, 0x78, 0x84, 0x20, 0x4d, 0xc7, 0xb1, 0x23, 0x34, 0xfd, 0x8d, 0x6e, - 0x42, 0xd6, 0x3d, 0x87, 0xce, 0x36, 0xae, 0x26, 0x1c, 0x20, 0xd9, 0x85, 0x7c, 0xc6, 0xd0, 0x26, - 0xca, 0x76, 0x75, 0xc3, 0x1b, 0xd7, 0x33, 0x95, 0x25, 0x38, 0xd9, 0x81, 0xf3, 0x4d, 0x58, 0x4d, - 0xf0, 0xa2, 0xbb, 0xee, 0x6d, 0xe7, 0x74, 0xdd, 0x8d, 0x4f, 0xb1, 0x4d, 0x2e, 0x3f, 0xfe, 0x9f, - 0x0c, 0x94, 0xa4, 0x1e, 0x1e, 0xda, 0x9a, 0x3d, 0x4e, 0x7c, 0x41, 0xef, 0x40, 0x5e, 0x73, 0xfd, - 0x93, 0xf9, 0x0f, 0x9e, 0x49, 0xea, 0xa1, 0xfb, 0x70, 0xcd, 0x07, 0x04, 0x6e, 0x81, 0xad, 0xf0, - 0x6b, 0xcd, 0x45, 0xd0, 0xcc, 0x4b, 0x5a, 0xe0, 0x2b, 0xf6, 0xea, 0x99, 0xff, 0x9a, 0x57, 0x4f, - 0xe5, 0x23, 0x03, 0x8b, 0xfe, 0x23, 0x13, 0x15, 0x61, 0xe3, 0xa4, 0x2d, 0xca, 0x4a, 0xbb, 0x23, - 0x74, 0x44, 0xe5, 0xa4, 0xd1, 0x6e, 0x89, 0x35, 0xe9, 0x50, 0x12, 0xeb, 0xec, 0x1c, 0xda, 0x84, - 0xd5, 0x80, 0xaf, 0x26, 0x8b, 0x42, 0x47, 0x6a, 0x1c, 0xb1, 0x0c, 0x2a, 0x41, 0x21, 0xea, 0x10, - 0x95, 0x43, 0x41, 0x3a, 0x16, 0xeb, 0x6c, 0x0a, 0xad, 0xc3, 0xf5, 0x80, 0x57, 0xa8, 0x75, 0xa4, - 0x53, 0x91, 0x9d, 0x8f, 0xb0, 0x9d, 0xb4, 0xea, 0x0e, 0x5b, 0x3a, 0xc2, 0x46, 0x1d, 0x3e, 0x5b, - 0x26, 0x12, 0x56, 0x17, 0x8f, 0x45, 0x1a, 0x96, 0x8d, 0x84, 0x51, 0x87, 0x1f, 0xb6, 0x80, 0x36, - 0x00, 0xc5, 0xbc, 0x75, 0x36, 0x57, 0x79, 0xe0, 0xbc, 0xcd, 0xa8, 0x9e, 0x5b, 0xb0, 0x2e, 0x37, - 0x8f, 0x45, 0xa5, 0x73, 0xd6, 0x8a, 0x96, 0x5e, 0x80, 0xb5, 0x89, 0xab, 0x25, 0x8b, 0x75, 0xf1, - 0x50, 0x6a, 0x88, 0x75, 0x96, 0xa9, 0xfc, 0x95, 0x81, 0xb5, 0x24, 0x91, 0xd1, 0xf7, 0xc0, 0x37, - 0x84, 0x27, 0x62, 0xbb, 0x25, 0xd4, 0x9c, 0xaa, 0x9b, 0x0d, 0xe5, 0x48, 0x6e, 0x9e, 0xb4, 0x22, - 0xd4, 0x65, 0x28, 0x4d, 0xc1, 0x09, 0xf5, 0x27, 0x52, 0x83, 0x65, 0x66, 0x20, 0x9e, 0xca, 0x52, - 0x47, 0x64, 0x53, 0x68, 0x07, 0x7e, 0x36, 0x05, 0x21, 0x8b, 0x42, 0x9d, 0x9d, 0xaf, 0xfc, 0x9b, - 0x01, 0x14, 0xbf, 0x92, 0xd0, 0x0d, 0x28, 0x0b, 0xb5, 0x5a, 0xf3, 0xa4, 0xd1, 0x99, 0xb5, 0x42, - 0x0e, 0x8a, 0x89, 0x28, 0x6f, 0x7d, 0x3c, 0x70, 0x89, 0xfe, 0xba, 0x78, 0x2a, 0x1e, 0x37, 0x5b, - 0xa2, 0xcc, 0xa6, 0xd0, 0x36, 0x6c, 0x25, 0x62, 0x9c, 0xf5, 0x4d, 0x4d, 0xd1, 0x7c, 0xda, 0x10, - 0x65, 0x36, 0x4d, 0xc4, 0x4c, 0xf4, 0x1f, 0x4a, 0x0d, 0xa1, 0x41, 0x6a, 0xa6, 0x4b, 0xc9, 0x54, - 0xba, 0xc0, 0x46, 0xdf, 0x8d, 0x74, 0x79, 0x2d, 0xe9, 0xb1, 0x78, 0xa6, 0x08, 0xb5, 0x9a, 0xd8, - 0x6e, 0x27, 0xed, 0xef, 0x4d, 0xf8, 0x21, 0x01, 0x23, 0x35, 0x1e, 0x89, 0xb2, 0xd4, 0x71, 0x56, - 0xe1, 0x7a, 0x58, 0xa6, 0xf2, 0x12, 0x56, 0x22, 0x6f, 0x33, 0xb4, 0x0b, 0xdb, 0x6e, 0xbc, 0x83, - 0x4d, 0x48, 0x51, 0x84, 0x8d, 0x04, 0x48, 0x5b, 0x94, 0x59, 0x06, 0x7d, 0x07, 0xbb, 0x71, 0x5f, - 0x5b, 0x94, 0x4f, 0x25, 0xba, 0x9f, 0xb4, 0x70, 0x36, 0x55, 0xf9, 0x7b, 0x0a, 0xf2, 0x81, 0x07, - 0x14, 0x39, 0xf2, 0x6e, 0x58, 0x52, 0xbb, 0x6e, 0xc1, 0x7a, 0xc8, 0x1b, 0x68, 0x58, 0x22, 0x77, - 0xcc, 0x15, 0x68, 0xd9, 0x4d, 0x58, 0x0d, 0xf9, 0xfd, 0xa6, 0x8d, 0x72, 0x06, 0xda, 0x36, 0xca, - 0x19, 0x6d, 0xdc, 0x02, 0xac, 0x85, 0xfc, 0xe2, 0x6f, 0x5a, 0x92, 0x2c, 0xd6, 0xd9, 0x6c, 0x8c, - 0xd4, 0x6f, 0xea, 0x85, 0x18, 0x69, 0xb8, 0xad, 0x73, 0x31, 0x52, 0xaf, 0xb1, 0x17, 0x2b, 0xef, - 0x53, 0xb1, 0x81, 0x4f, 0x35, 0xfb, 0x0e, 0x76, 0x23, 0xc2, 0x26, 0x8a, 0xc7, 0x03, 0x97, 0x0c, - 0x0b, 0xa8, 0xf8, 0x03, 0xfc, 0x7c, 0x06, 0x26, 0x20, 0x67, 0x19, 0x4a, 0xc9, 0x40, 0x5f, 0xd7, - 0xa9, 0xe9, 0x02, 0x02, 0x4f, 0x4d, 0x17, 0x55, 0x7a, 0x2a, 0x59, 0x60, 0x5a, 0x4e, 0x25, 0x8b, - 0x0e, 0xce, 0x5d, 0xd8, 0x9e, 0x05, 0x24, 0x33, 0x54, 0x87, 0xcd, 0x29, 0x57, 0x25, 0xaa, 0xc0, - 0xf7, 0xb1, 0xe8, 0x5a, 0xb3, 0x95, 0x38, 0x63, 0xf7, 0xe0, 0xc6, 0x0c, 0xac, 0x3f, 0xdf, 0x58, - 0xa6, 0xf2, 0x1c, 0x96, 0x82, 0xd7, 0x22, 0x19, 0x2e, 0x52, 0x5d, 0x6c, 0x74, 0xa4, 0xce, 0x59, - 0x12, 0xf1, 0x06, 0xa0, 0x88, 0xdb, 0xe9, 0xba, 0x5d, 0xd8, 0x0e, 0xdb, 0x63, 0x1d, 0xf7, 0x50, - 0x7e, 0xf5, 0x96, 0x9b, 0x7b, 0xfd, 0x96, 0x9b, 0xfb, 0xf0, 0x96, 0x63, 0xfe, 0x70, 0xc5, 0x31, - 0x7f, 0xbb, 0xe2, 0x98, 0x7f, 0x5d, 0x71, 0xcc, 0xab, 0x2b, 0x8e, 0x79, 0x73, 0xc5, 0x31, 0xef, - 0xaf, 0xb8, 0xb9, 0x0f, 0x57, 0x1c, 0xf3, 0xa7, 0x77, 0xdc, 0xdc, 0xab, 0x77, 0xdc, 0xdc, 0xeb, - 0x77, 0xdc, 0xdc, 0x6f, 0x4b, 0xf6, 0xc0, 0x30, 0xfb, 0xd5, 0x6e, 0x5f, 0x1f, 0xf5, 0xf6, 0x03, - 0xff, 0xe4, 0xbb, 0x47, 0xfe, 0x9e, 0x67, 0xe9, 0x0b, 0xeb, 0xf6, 0xff, 0x02, 0x00, 0x00, 0xff, - 0xff, 0x33, 0x85, 0x1a, 0xde, 0xff, 0x13, 0x00, 0x00, + 0xf7, 0xfc, 0x94, 0x42, 0xc6, 0x73, 0x80, 0xd7, 0xa0, 0x41, 0x13, 0x30, 0x12, 0xed, 0x10, 0xb1, + 0x25, 0x81, 0x92, 0x9d, 0xba, 0x0b, 0x41, 0x4b, 0x37, 0x0e, 0x11, 0x49, 0x64, 0x49, 0xca, 0xa9, + 0xb6, 0xce, 0x45, 0x87, 0x0e, 0x9d, 0xba, 0x76, 0x69, 0xa7, 0xfe, 0x15, 0x05, 0x3a, 0x66, 0xcc, + 0x98, 0x38, 0x4b, 0xd0, 0x29, 0xe8, 0x9a, 0xa5, 0xb8, 0x97, 0x1f, 0xe2, 0x97, 0x94, 0x8f, 0x66, + 0x78, 0x93, 0xc5, 0x73, 0x7e, 0xe7, 0x77, 0xee, 0xf9, 0xdd, 0x7b, 0xce, 0xbd, 0x30, 0x6c, 0xa9, + 0x86, 0xb6, 0xaf, 0x8e, 0xec, 0x67, 0xfb, 0x57, 0x3f, 0xec, 0x0f, 0xb0, 0x65, 0xa9, 0x97, 0xb8, + 0x6a, 0x98, 0xba, 0xad, 0xa3, 0xbc, 0x6a, 0x68, 0x55, 0xe2, 0xaa, 0x5e, 0xfd, 0x50, 0xdc, 0xb9, + 0xd4, 0xf5, 0xcb, 0x3e, 0xde, 0xa7, 0xae, 0x8b, 0xd1, 0xd3, 0x7d, 0x5b, 0x1b, 0x60, 0xcb, 0x56, + 0x07, 0x86, 0x83, 0xe6, 0x7f, 0x84, 0xdc, 0xa9, 0x85, 0xcd, 0xb6, 0x81, 0xbb, 0x68, 0x0d, 0x32, + 0x78, 0xa0, 0x6a, 0xfd, 0x02, 0x53, 0x66, 0xf6, 0x16, 0x65, 0xe7, 0x83, 0x58, 0x4d, 0xbd, 0x8f, + 0xad, 0x42, 0xaa, 0x3c, 0x4f, 0xac, 0xf4, 0x83, 0x1f, 0x43, 0x81, 0xc4, 0x35, 0xd4, 0x01, 0xb6, + 0x0c, 0xb5, 0x8b, 0x5b, 0xd8, 0x1c, 0x68, 0x96, 0xa5, 0xe9, 0x43, 0x0b, 0x6d, 0xc2, 0xc2, 0xc8, + 0xc2, 0xa6, 0xa2, 0xf5, 0x5c, 0xa6, 0x2c, 0xf9, 0x94, 0x7a, 0xa8, 0x0e, 0x4b, 0x6a, 0xd7, 0xd6, + 0xf4, 0xa1, 0x72, 0x69, 0xea, 0x23, 0xa3, 0x90, 0x2a, 0x33, 0x7b, 0xcb, 0x07, 0xbb, 0xd5, 0xc0, + 0x8a, 0xab, 0x3e, 0xa3, 0x40, 0x91, 0x47, 0x04, 0x28, 0xe7, 0xd5, 0xc9, 0x07, 0xff, 0x57, 0x06, + 0x40, 0x1a, 0x5e, 0x69, 0xb6, 0x4a, 0x6c, 0x88, 0x85, 0xf9, 0x91, 0xa9, 0xb9, 0x99, 0xc8, 0x4f, + 0xf4, 0x6b, 0x58, 0xea, 0x9a, 0x58, 0xb5, 0x71, 0x4f, 0x21, 0xe5, 0xd2, 0x34, 0xf9, 0x83, 0x62, + 0xd5, 0xd1, 0xa2, 0xea, 0x69, 0x51, 0xed, 0x78, 0x5a, 0xc8, 0x79, 0x17, 0x4f, 0x2c, 0xe8, 0x1e, + 0xe4, 0xf1, 0xef, 0x0d, 0xcd, 0x1c, 0x3b, 0xd1, 0xf3, 0x1f, 0x8d, 0x06, 0x07, 0x4e, 0x0c, 0xfc, + 0x87, 0x14, 0xa4, 0x89, 0x30, 0x68, 0x19, 0x52, 0x7e, 0xfd, 0x29, 0xad, 0x87, 0xbe, 0x07, 0xd6, + 0xc4, 0x96, 0x3e, 0x32, 0xbb, 0x58, 0xb9, 0xc2, 0x26, 0x51, 0x8a, 0x2e, 0x6c, 0x51, 0x5e, 0xf1, + 0xec, 0x67, 0x8e, 0x19, 0x7d, 0x0f, 0x69, 0xcb, 0xc0, 0x5d, 0x37, 0xf3, 0x7a, 0x48, 0x1e, 0x6f, + 0xb3, 0x64, 0x0a, 0x41, 0xbf, 0x80, 0x8c, 0x65, 0xab, 0x36, 0x2e, 0xa4, 0xa9, 0x94, 0x1b, 0x71, + 0x2c, 0xf1, 0xca, 0x0e, 0x08, 0x6d, 0x03, 0x98, 0xf8, 0x77, 0x23, 0x6c, 0xd9, 0x64, 0x6f, 0x32, + 0x34, 0xfb, 0xa2, 0x6b, 0x91, 0x7a, 0xe8, 0x97, 0x00, 0x9a, 0xaf, 0x6b, 0x21, 0x4b, 0xb3, 0x6f, + 0x86, 0x18, 0x27, 0xb2, 0xcb, 0x01, 0x68, 0x4c, 0xf0, 0x85, 0xcf, 0x13, 0xfc, 0x11, 0xa0, 0xbe, + 0x6a, 0xd9, 0xca, 0x40, 0xef, 0x69, 0x4f, 0x35, 0x8f, 0x24, 0xf7, 0x51, 0x12, 0x96, 0x44, 0x9d, + 0xb8, 0x41, 0x54, 0xfd, 0x17, 0x70, 0xd3, 0x3f, 0x3f, 0xb2, 0xde, 0xc7, 0xf4, 0x58, 0x97, 0x60, + 0x71, 0xe8, 0x19, 0xdd, 0x0d, 0x99, 0x18, 0xbe, 0xd2, 0x99, 0x3c, 0x85, 0x15, 0xa1, 0xdb, 0xd5, + 0x47, 0x43, 0xdb, 0x4f, 0xfb, 0x30, 0x42, 0xcc, 0x50, 0xe2, 0x9d, 0x10, 0xb1, 0x1b, 0x33, 0x95, + 0xf6, 0x2f, 0x0c, 0xe4, 0x7c, 0xc2, 0x07, 0x84, 0x90, 0xe2, 0x15, 0xd2, 0x83, 0x94, 0x30, 0x7f, + 0x50, 0x4a, 0x22, 0xf4, 0x62, 0x08, 0x9b, 0x6f, 0x40, 0x47, 0xb0, 0xe2, 0xd7, 0xad, 0x4c, 0x7a, + 0x3a, 0x7f, 0xc0, 0x25, 0x57, 0xeb, 0xb3, 0x2c, 0x0f, 0x83, 0x26, 0x8b, 0xef, 0x43, 0x9a, 0x12, + 0xc6, 0xcf, 0x78, 0xda, 0x1e, 0x1b, 0xd8, 0xd5, 0x30, 0x7c, 0x70, 0x49, 0x40, 0x67, 0x6c, 0x60, + 0x99, 0x42, 0x66, 0x9e, 0x71, 0x3f, 0x2f, 0x85, 0xf0, 0xff, 0x61, 0x00, 0x84, 0x96, 0xf4, 0x18, + 0x8f, 0xa9, 0x0c, 0xf7, 0x81, 0x14, 0x85, 0x2d, 0x4b, 0xa1, 0xb9, 0x1c, 0x59, 0xb7, 0xc3, 0x2a, + 0x50, 0xb4, 0x40, 0x51, 0x34, 0x27, 0xa8, 0xfe, 0x6f, 0xb4, 0x0b, 0x4b, 0x3d, 0xcd, 0x32, 0xfa, + 0xea, 0x58, 0x21, 0x65, 0xb9, 0x4d, 0x98, 0x77, 0x6d, 0xa4, 0x78, 0x54, 0x86, 0x7c, 0x0f, 0x5b, + 0x5d, 0x53, 0x33, 0x68, 0x27, 0xcc, 0xbb, 0x88, 0x89, 0x29, 0x3a, 0x23, 0xd2, 0x9f, 0x33, 0x23, + 0x50, 0x11, 0x72, 0x3d, 0xcd, 0x52, 0x2f, 0xfa, 0xd8, 0x69, 0xc2, 0x9c, 0xec, 0x7f, 0xf3, 0x0a, + 0x64, 0x9a, 0x2f, 0x86, 0xd8, 0x44, 0x5b, 0x90, 0xd3, 0xc9, 0x8f, 0xc9, 0x14, 0x5d, 0xa0, 0xdf, + 0x52, 0x0f, 0xdd, 0x03, 0x70, 0x5c, 0x01, 0xb1, 0x4b, 0x09, 0x02, 0x50, 0x22, 0x5a, 0xff, 0xa2, + 0xee, 0xfd, 0xe4, 0xff, 0x9b, 0x82, 0xac, 0xe3, 0x8e, 0x6d, 0xdf, 0x1e, 0x64, 0x28, 0xce, 0x1d, + 0x98, 0x28, 0x44, 0x49, 0xc9, 0x64, 0x07, 0x80, 0x6e, 0x87, 0x76, 0x6f, 0x33, 0x21, 0x77, 0x60, + 0x46, 0x25, 0x4d, 0xbe, 0x74, 0xf2, 0xe4, 0xab, 0x7a, 0xe3, 0x2c, 0x43, 0x8b, 0x2a, 0x24, 0x11, + 0x4f, 0x1f, 0x68, 0xd9, 0xe8, 0x40, 0xfb, 0xc9, 0xcc, 0xa5, 0x3a, 0xdc, 0xf0, 0x5b, 0x9d, 0x1c, + 0x44, 0x74, 0x07, 0xd2, 0x7e, 0x0f, 0x7f, 0xc2, 0x50, 0xa0, 0x60, 0xbe, 0x03, 0x2b, 0x81, 0x49, + 0x44, 0x79, 0x04, 0x00, 0xc3, 0xbf, 0x79, 0x5d, 0xb6, 0x4f, 0x98, 0x5d, 0x81, 0x20, 0xfe, 0x8f, + 0xe4, 0x40, 0x78, 0x6c, 0xcb, 0xde, 0x84, 0x71, 0x1a, 0xc6, 0x9d, 0x31, 0xc5, 0xe4, 0xf5, 0x11, + 0x84, 0x7c, 0x43, 0x0d, 0x15, 0x76, 0x0e, 0x68, 0x32, 0x63, 0x1c, 0x12, 0x7f, 0xcc, 0x54, 0xa2, + 0x34, 0xd8, 0xb2, 0xaa, 0x91, 0x8a, 0xb0, 0x25, 0x0e, 0x6d, 0x73, 0x2c, 0xdf, 0x1c, 0x46, 0xed, + 0xc5, 0x0b, 0xd8, 0x48, 0x06, 0x93, 0x27, 0xc0, 0x73, 0x3c, 0xf6, 0x9e, 0x00, 0xcf, 0xf1, 0x18, + 0x1d, 0x40, 0xe6, 0x4a, 0xed, 0x8f, 0xbc, 0xbb, 0xbf, 0x34, 0x4d, 0x12, 0x5a, 0x82, 0x03, 0xfd, + 0x55, 0xea, 0x2e, 0xc3, 0xbf, 0x4e, 0xc1, 0x72, 0x1b, 0x9b, 0x57, 0x1a, 0x75, 0x92, 0xba, 0xfe, + 0x9f, 0x8b, 0xfc, 0x4e, 0xa8, 0x4d, 0xc2, 0xbb, 0x1c, 0xce, 0x12, 0x68, 0x97, 0x1f, 0xc3, 0x57, + 0x7a, 0x79, 0x56, 0xd4, 0x67, 0x5c, 0xee, 0xd1, 0x5e, 0xc8, 0x7e, 0x8d, 0x5e, 0x58, 0xf8, 0x82, + 0x5e, 0xf8, 0x27, 0x03, 0x28, 0x5e, 0x3c, 0x42, 0x90, 0xa6, 0xe3, 0xd8, 0x11, 0x9a, 0xfe, 0x46, + 0xb7, 0x21, 0xeb, 0x9e, 0x43, 0x67, 0x1b, 0x57, 0x13, 0x0e, 0x90, 0xec, 0x42, 0x3e, 0x61, 0x68, + 0x13, 0x65, 0xbb, 0xba, 0xe1, 0x8d, 0xeb, 0x99, 0xca, 0x12, 0x9c, 0xec, 0xc0, 0xf9, 0x26, 0xac, + 0x26, 0x78, 0xd1, 0x5d, 0xf7, 0xb6, 0x73, 0xba, 0xee, 0xd6, 0xc7, 0xd8, 0x26, 0x97, 0x1f, 0xff, + 0x2f, 0x06, 0x4a, 0x52, 0x0f, 0x0f, 0x6d, 0xcd, 0x1e, 0x27, 0xbe, 0xa0, 0x77, 0x20, 0xaf, 0xb9, + 0xfe, 0xc9, 0xfc, 0x07, 0xcf, 0x24, 0xf5, 0xd0, 0x7d, 0xb8, 0xe1, 0x03, 0x02, 0xb7, 0xc0, 0x56, + 0xf8, 0xb5, 0xe6, 0x22, 0x68, 0xe6, 0x25, 0x2d, 0xf0, 0x15, 0x7b, 0xf5, 0xcc, 0x7f, 0xc9, 0xab, + 0xa7, 0xf2, 0x81, 0x81, 0x45, 0xff, 0x91, 0x89, 0x8a, 0xb0, 0x71, 0xda, 0x16, 0x65, 0xa5, 0xdd, + 0x11, 0x3a, 0xa2, 0x72, 0xda, 0x68, 0xb7, 0xc4, 0x9a, 0x74, 0x28, 0x89, 0x75, 0x76, 0x0e, 0x6d, + 0xc2, 0x6a, 0xc0, 0x57, 0x93, 0x45, 0xa1, 0x23, 0x35, 0x8e, 0x58, 0x06, 0x95, 0xa0, 0x10, 0x75, + 0x88, 0xca, 0xa1, 0x20, 0x1d, 0x8b, 0x75, 0x36, 0x85, 0xd6, 0xe1, 0x66, 0xc0, 0x2b, 0xd4, 0x3a, + 0xd2, 0x99, 0xc8, 0xce, 0x47, 0xd8, 0x4e, 0x5b, 0x75, 0x87, 0x2d, 0x1d, 0x61, 0xa3, 0x0e, 0x9f, + 0x2d, 0x13, 0x09, 0xab, 0x8b, 0xc7, 0x22, 0x0d, 0xcb, 0x46, 0xc2, 0xa8, 0xc3, 0x0f, 0x5b, 0x40, + 0x1b, 0x80, 0x62, 0xde, 0x3a, 0x9b, 0xab, 0x3c, 0x70, 0xde, 0x66, 0x54, 0xcf, 0x2d, 0x58, 0x97, + 0x9b, 0xc7, 0xa2, 0xd2, 0x39, 0x6f, 0x45, 0x4b, 0x2f, 0xc0, 0xda, 0xc4, 0xd5, 0x92, 0xc5, 0xba, + 0x78, 0x28, 0x35, 0xc4, 0x3a, 0xcb, 0x54, 0xfe, 0xc6, 0xc0, 0x5a, 0x92, 0xc8, 0xe8, 0x5b, 0xe0, + 0x1b, 0xc2, 0x89, 0xd8, 0x6e, 0x09, 0x35, 0xa7, 0xea, 0x66, 0x43, 0x39, 0x92, 0x9b, 0xa7, 0xad, + 0x08, 0x75, 0x19, 0x4a, 0x53, 0x70, 0x42, 0xfd, 0x44, 0x6a, 0xb0, 0xcc, 0x0c, 0xc4, 0x13, 0x59, + 0xea, 0x88, 0x6c, 0x0a, 0xed, 0xc0, 0xcf, 0xa6, 0x20, 0x64, 0x51, 0xa8, 0xb3, 0xf3, 0x95, 0x3f, + 0xa5, 0x00, 0xc5, 0xaf, 0x24, 0x74, 0x0b, 0xca, 0x42, 0xad, 0xd6, 0x3c, 0x6d, 0x74, 0x66, 0xad, + 0x90, 0x83, 0x62, 0x22, 0xca, 0x5b, 0x1f, 0x0f, 0x5c, 0xa2, 0xbf, 0x2e, 0x9e, 0x89, 0xc7, 0xcd, + 0x96, 0x28, 0xb3, 0x29, 0xb4, 0x0d, 0x5b, 0x89, 0x18, 0x67, 0x7d, 0x53, 0x53, 0x34, 0x9f, 0x34, + 0x44, 0x99, 0x4d, 0x13, 0x31, 0x13, 0xfd, 0x87, 0x52, 0x43, 0x68, 0x90, 0x9a, 0xe9, 0x52, 0x32, + 0xe8, 0x1b, 0xd8, 0x4d, 0xc4, 0x9d, 0x88, 0x1d, 0x59, 0xaa, 0xb5, 0x9d, 0x74, 0xd9, 0x4a, 0x17, + 0xd8, 0xe8, 0xf3, 0x92, 0x56, 0xd1, 0x92, 0x1e, 0x8b, 0xe7, 0x8a, 0x50, 0xab, 0x89, 0xed, 0x76, + 0xd2, 0x31, 0xb8, 0x0d, 0xdf, 0x25, 0x60, 0xa4, 0xc6, 0x23, 0x51, 0x96, 0x3a, 0xce, 0x62, 0x5d, + 0x0f, 0xcb, 0x54, 0x5e, 0xc0, 0x4a, 0xe4, 0x09, 0x87, 0x76, 0x61, 0xdb, 0x8d, 0x77, 0xb0, 0x09, + 0x29, 0x8a, 0xb0, 0x91, 0x00, 0x69, 0x8b, 0x32, 0xcb, 0xd0, 0xea, 0x62, 0xbe, 0xb6, 0x28, 0x9f, + 0x49, 0x74, 0xdb, 0x69, 0xdd, 0x6c, 0xaa, 0xf2, 0x8f, 0x14, 0xe4, 0x03, 0xef, 0x2c, 0xd2, 0x19, + 0x6e, 0x58, 0x52, 0x57, 0x6f, 0xc1, 0x7a, 0xc8, 0x1b, 0xe8, 0x6b, 0xb2, 0x2b, 0x31, 0x57, 0xa0, + 0xb3, 0x37, 0x61, 0x35, 0xe4, 0xf7, 0x7b, 0x3b, 0xca, 0x19, 0xe8, 0xee, 0x28, 0x67, 0xb4, 0xbf, + 0x0b, 0xb0, 0x16, 0xf2, 0x8b, 0xbf, 0x69, 0x49, 0xb2, 0x58, 0x67, 0xb3, 0x31, 0x52, 0xbf, 0xf7, + 0x17, 0x62, 0xa4, 0xe1, 0xee, 0xcf, 0xc5, 0x48, 0xbd, 0xfe, 0x5f, 0xac, 0xbc, 0x4b, 0xc5, 0xee, + 0x05, 0xaa, 0xd9, 0x37, 0xb0, 0x1b, 0x11, 0x36, 0x51, 0x3c, 0x1e, 0xb8, 0x64, 0x58, 0x40, 0xc5, + 0xef, 0xe0, 0xe7, 0x33, 0x30, 0x01, 0x39, 0xcb, 0x50, 0x4a, 0x06, 0xfa, 0xba, 0x4e, 0x4d, 0x17, + 0x10, 0x78, 0x6a, 0xba, 0xa8, 0xd2, 0x53, 0xc9, 0x02, 0x43, 0x75, 0x2a, 0x59, 0x74, 0xbe, 0xee, + 0xc2, 0xf6, 0x2c, 0x20, 0x19, 0xb5, 0x3a, 0x6c, 0x4e, 0xb9, 0x51, 0x51, 0x05, 0xbe, 0x8d, 0x45, + 0xd7, 0x9a, 0xad, 0xc4, 0x51, 0xbc, 0x07, 0xb7, 0x66, 0x60, 0xfd, 0x31, 0xc8, 0x32, 0x95, 0x67, + 0xb0, 0x14, 0xbc, 0x3d, 0xc9, 0x0c, 0x92, 0xea, 0x62, 0xa3, 0x23, 0x75, 0xce, 0x93, 0x88, 0x37, + 0x00, 0x45, 0xdc, 0x4e, 0xd7, 0xed, 0xc2, 0x76, 0xd8, 0x1e, 0xeb, 0xb8, 0x87, 0xf2, 0xcb, 0x37, + 0xdc, 0xdc, 0xab, 0x37, 0xdc, 0xdc, 0xfb, 0x37, 0x1c, 0xf3, 0x87, 0x6b, 0x8e, 0xf9, 0xfb, 0x35, + 0xc7, 0xfc, 0xfb, 0x9a, 0x63, 0x5e, 0x5e, 0x73, 0xcc, 0xeb, 0x6b, 0x8e, 0x79, 0x77, 0xcd, 0xcd, + 0xbd, 0xbf, 0xe6, 0x98, 0x3f, 0xbf, 0xe5, 0xe6, 0x5e, 0xbe, 0xe5, 0xe6, 0x5e, 0xbd, 0xe5, 0xe6, + 0x7e, 0x5b, 0xb2, 0x07, 0x86, 0xd9, 0xaf, 0x76, 0xfb, 0xfa, 0xa8, 0xb7, 0x1f, 0xf8, 0x5f, 0xe0, + 0x3d, 0xf2, 0xf7, 0x22, 0x4b, 0x1f, 0x62, 0x77, 0xfe, 0x17, 0x00, 0x00, 0xff, 0xff, 0xf3, 0xc5, + 0x04, 0xde, 0x26, 0x14, 0x00, 0x00, } func (x UserState) String() string {