diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto
index 6f9f3a06eb22d..12d67796fb3c2 100644
--- a/api/proto/teleport/legacy/types/types.proto
+++ b/api/proto/teleport/legacy/types/types.proto
@@ -8104,12 +8104,14 @@ message OktaOptions {
message AccessGraphSync {
// AWS is a configuration for AWS Access Graph service poll service.
repeated AccessGraphAWSSync AWS = 1 [(gogoproto.jsontag) = "aws,omitempty"];
- // PollInterval is the frequency at which to poll for AWS resources
+ // PollInterval is the frequency at which to poll for resources
google.protobuf.Duration PollInterval = 2 [
(gogoproto.jsontag) = "poll_interval,omitempty",
(gogoproto.nullable) = false,
(gogoproto.stdduration) = true
];
+ // Azure is a configuration for Azure Access Graph service poll service.
+ repeated AccessGraphAzureSync Azure = 3 [(gogoproto.jsontag) = "azure,omitempty"];
}
// AccessGraphAWSSync is a configuration for AWS Access Graph service poll service.
@@ -8121,3 +8123,11 @@ message AccessGraphAWSSync {
// Integration is the integration name used to generate credentials to interact with AWS APIs.
string Integration = 4 [(gogoproto.jsontag) = "integration,omitempty"];
}
+
+// AccessGraphAzureSync is a configuration for Azure Access Graph service poll service.
+message AccessGraphAzureSync {
+ // SubscriptionID Is the ID of the Azure subscription to sync resources from
+ string SubscriptionID = 1 [(gogoproto.jsontag) = "subscription_id,omitempty"];
+ // Integration is the integration name used to generate credentials to interact with AWS APIs.
+ string Integration = 2 [(gogoproto.jsontag) = "integration,omitempty"];
+}
diff --git a/api/types/discoveryconfig/derived.gen.go b/api/types/discoveryconfig/derived.gen.go
index 9053fdd312473..c1f713517c7ca 100644
--- a/api/types/discoveryconfig/derived.gen.go
+++ b/api/types/discoveryconfig/derived.gen.go
@@ -117,7 +117,8 @@ func deriveTeleportEqual_6(this, that *types.AccessGraphSync) bool {
return (this == nil && that == nil) ||
this != nil && that != nil &&
deriveTeleportEqual_12(this.AWS, that.AWS) &&
- this.PollInterval == that.PollInterval
+ this.PollInterval == that.PollInterval &&
+ deriveTeleportEqual_13(this.Azure, that.Azure)
}
// deriveTeleportEqual_7 returns whether this and that are equal.
@@ -144,12 +145,12 @@ func deriveTeleportEqual_7(this, that map[string]string) bool {
func deriveTeleportEqual_8(this, that *types.AWSMatcher) bool {
return (this == nil && that == nil) ||
this != nil && that != nil &&
- deriveTeleportEqual_13(this.Types, that.Types) &&
- deriveTeleportEqual_13(this.Regions, that.Regions) &&
- deriveTeleportEqual_14(this.AssumeRole, that.AssumeRole) &&
- deriveTeleportEqual_15(this.Tags, that.Tags) &&
- deriveTeleportEqual_16(this.Params, that.Params) &&
- deriveTeleportEqual_17(this.SSM, that.SSM) &&
+ deriveTeleportEqual_14(this.Types, that.Types) &&
+ deriveTeleportEqual_14(this.Regions, that.Regions) &&
+ deriveTeleportEqual_15(this.AssumeRole, that.AssumeRole) &&
+ deriveTeleportEqual_16(this.Tags, that.Tags) &&
+ deriveTeleportEqual_17(this.Params, that.Params) &&
+ deriveTeleportEqual_18(this.SSM, that.SSM) &&
this.Integration == that.Integration &&
this.KubeAppDiscovery == that.KubeAppDiscovery &&
this.SetupAccessForARN == that.SetupAccessForARN
@@ -159,34 +160,34 @@ func deriveTeleportEqual_8(this, that *types.AWSMatcher) bool {
func deriveTeleportEqual_9(this, that *types.AzureMatcher) bool {
return (this == nil && that == nil) ||
this != nil && that != nil &&
- deriveTeleportEqual_13(this.Subscriptions, that.Subscriptions) &&
- deriveTeleportEqual_13(this.ResourceGroups, that.ResourceGroups) &&
- deriveTeleportEqual_13(this.Types, that.Types) &&
- deriveTeleportEqual_13(this.Regions, that.Regions) &&
- deriveTeleportEqual_15(this.ResourceTags, that.ResourceTags) &&
- deriveTeleportEqual_16(this.Params, that.Params)
+ deriveTeleportEqual_14(this.Subscriptions, that.Subscriptions) &&
+ deriveTeleportEqual_14(this.ResourceGroups, that.ResourceGroups) &&
+ deriveTeleportEqual_14(this.Types, that.Types) &&
+ deriveTeleportEqual_14(this.Regions, that.Regions) &&
+ deriveTeleportEqual_16(this.ResourceTags, that.ResourceTags) &&
+ deriveTeleportEqual_17(this.Params, that.Params)
}
// deriveTeleportEqual_10 returns whether this and that are equal.
func deriveTeleportEqual_10(this, that *types.GCPMatcher) bool {
return (this == nil && that == nil) ||
this != nil && that != nil &&
- deriveTeleportEqual_13(this.Types, that.Types) &&
- deriveTeleportEqual_13(this.Locations, that.Locations) &&
- deriveTeleportEqual_15(this.Tags, that.Tags) &&
- deriveTeleportEqual_13(this.ProjectIDs, that.ProjectIDs) &&
- deriveTeleportEqual_13(this.ServiceAccounts, that.ServiceAccounts) &&
- deriveTeleportEqual_16(this.Params, that.Params) &&
- deriveTeleportEqual_15(this.Labels, that.Labels)
+ deriveTeleportEqual_14(this.Types, that.Types) &&
+ deriveTeleportEqual_14(this.Locations, that.Locations) &&
+ deriveTeleportEqual_16(this.Tags, that.Tags) &&
+ deriveTeleportEqual_14(this.ProjectIDs, that.ProjectIDs) &&
+ deriveTeleportEqual_14(this.ServiceAccounts, that.ServiceAccounts) &&
+ deriveTeleportEqual_17(this.Params, that.Params) &&
+ deriveTeleportEqual_16(this.Labels, that.Labels)
}
// deriveTeleportEqual_11 returns whether this and that are equal.
func deriveTeleportEqual_11(this, that *types.KubernetesMatcher) bool {
return (this == nil && that == nil) ||
this != nil && that != nil &&
- deriveTeleportEqual_13(this.Types, that.Types) &&
- deriveTeleportEqual_13(this.Namespaces, that.Namespaces) &&
- deriveTeleportEqual_15(this.Labels, that.Labels)
+ deriveTeleportEqual_14(this.Types, that.Types) &&
+ deriveTeleportEqual_14(this.Namespaces, that.Namespaces) &&
+ deriveTeleportEqual_16(this.Labels, that.Labels)
}
// deriveTeleportEqual_12 returns whether this and that are equal.
@@ -198,7 +199,7 @@ func deriveTeleportEqual_12(this, that []*types.AccessGraphAWSSync) bool {
return false
}
for i := 0; i < len(this); i++ {
- if !(deriveTeleportEqual_18(this[i], that[i])) {
+ if !(deriveTeleportEqual_19(this[i], that[i])) {
return false
}
}
@@ -206,7 +207,7 @@ func deriveTeleportEqual_12(this, that []*types.AccessGraphAWSSync) bool {
}
// deriveTeleportEqual_13 returns whether this and that are equal.
-func deriveTeleportEqual_13(this, that []string) bool {
+func deriveTeleportEqual_13(this, that []*types.AccessGraphAzureSync) bool {
if this == nil || that == nil {
return this == nil && that == nil
}
@@ -214,7 +215,7 @@ func deriveTeleportEqual_13(this, that []string) bool {
return false
}
for i := 0; i < len(this); i++ {
- if !(this[i] == that[i]) {
+ if !(deriveTeleportEqual_20(this[i], that[i])) {
return false
}
}
@@ -222,15 +223,31 @@ func deriveTeleportEqual_13(this, that []string) bool {
}
// deriveTeleportEqual_14 returns whether this and that are equal.
-func deriveTeleportEqual_14(this, that *types.AssumeRole) bool {
+func deriveTeleportEqual_14(this, that []string) bool {
+ if this == nil || that == nil {
+ return this == nil && that == nil
+ }
+ if len(this) != len(that) {
+ return false
+ }
+ for i := 0; i < len(this); i++ {
+ if !(this[i] == that[i]) {
+ return false
+ }
+ }
+ return true
+}
+
+// deriveTeleportEqual_15 returns whether this and that are equal.
+func deriveTeleportEqual_15(this, that *types.AssumeRole) bool {
return (this == nil && that == nil) ||
this != nil && that != nil &&
this.RoleARN == that.RoleARN &&
this.ExternalID == that.ExternalID
}
-// deriveTeleportEqual_15 returns whether this and that are equal.
-func deriveTeleportEqual_15(this, that map[string]utils.Strings) bool {
+// deriveTeleportEqual_16 returns whether this and that are equal.
+func deriveTeleportEqual_16(this, that map[string]utils.Strings) bool {
if this == nil || that == nil {
return this == nil && that == nil
}
@@ -242,15 +259,15 @@ func deriveTeleportEqual_15(this, that map[string]utils.Strings) bool {
if !ok {
return false
}
- if !(deriveTeleportEqual_13(v, thatv)) {
+ if !(deriveTeleportEqual_14(v, thatv)) {
return false
}
}
return true
}
-// deriveTeleportEqual_16 returns whether this and that are equal.
-func deriveTeleportEqual_16(this, that *types.InstallerParams) bool {
+// deriveTeleportEqual_17 returns whether this and that are equal.
+func deriveTeleportEqual_17(this, that *types.InstallerParams) bool {
return (this == nil && that == nil) ||
this != nil && that != nil &&
this.JoinMethod == that.JoinMethod &&
@@ -259,28 +276,36 @@ func deriveTeleportEqual_16(this, that *types.InstallerParams) bool {
this.InstallTeleport == that.InstallTeleport &&
this.SSHDConfig == that.SSHDConfig &&
this.PublicProxyAddr == that.PublicProxyAddr &&
- deriveTeleportEqual_19(this.Azure, that.Azure) &&
+ deriveTeleportEqual_21(this.Azure, that.Azure) &&
this.EnrollMode == that.EnrollMode
}
-// deriveTeleportEqual_17 returns whether this and that are equal.
-func deriveTeleportEqual_17(this, that *types.AWSSSM) bool {
+// deriveTeleportEqual_18 returns whether this and that are equal.
+func deriveTeleportEqual_18(this, that *types.AWSSSM) bool {
return (this == nil && that == nil) ||
this != nil && that != nil &&
this.DocumentName == that.DocumentName
}
-// deriveTeleportEqual_18 returns whether this and that are equal.
-func deriveTeleportEqual_18(this, that *types.AccessGraphAWSSync) bool {
+// deriveTeleportEqual_19 returns whether this and that are equal.
+func deriveTeleportEqual_19(this, that *types.AccessGraphAWSSync) bool {
return (this == nil && that == nil) ||
this != nil && that != nil &&
- deriveTeleportEqual_13(this.Regions, that.Regions) &&
- deriveTeleportEqual_14(this.AssumeRole, that.AssumeRole) &&
+ deriveTeleportEqual_14(this.Regions, that.Regions) &&
+ deriveTeleportEqual_15(this.AssumeRole, that.AssumeRole) &&
this.Integration == that.Integration
}
-// deriveTeleportEqual_19 returns whether this and that are equal.
-func deriveTeleportEqual_19(this, that *types.AzureInstallerParams) bool {
+// deriveTeleportEqual_20 returns whether this and that are equal.
+func deriveTeleportEqual_20(this, that *types.AccessGraphAzureSync) bool {
+ return (this == nil && that == nil) ||
+ this != nil && that != nil &&
+ this.SubscriptionID == that.SubscriptionID &&
+ this.Integration == that.Integration
+}
+
+// deriveTeleportEqual_21 returns whether this and that are equal.
+func deriveTeleportEqual_21(this, that *types.AzureInstallerParams) bool {
return (this == nil && that == nil) ||
this != nil && that != nil &&
this.ClientID == that.ClientID
diff --git a/api/types/types.pb.go b/api/types/types.pb.go
index 39fb26f9e6173..438dad2b22dfe 100644
--- a/api/types/types.pb.go
+++ b/api/types/types.pb.go
@@ -21653,11 +21653,13 @@ var xxx_messageInfo_OktaOptions proto.InternalMessageInfo
type AccessGraphSync struct {
// AWS is a configuration for AWS Access Graph service poll service.
AWS []*AccessGraphAWSSync `protobuf:"bytes,1,rep,name=AWS,proto3" json:"aws,omitempty"`
- // PollInterval is the frequency at which to poll for AWS resources
- PollInterval time.Duration `protobuf:"bytes,2,opt,name=PollInterval,proto3,stdduration" json:"poll_interval,omitempty"`
- XXX_NoUnkeyedLiteral struct{} `json:"-"`
- XXX_unrecognized []byte `json:"-"`
- XXX_sizecache int32 `json:"-"`
+ // PollInterval is the frequency at which to poll for resources
+ PollInterval time.Duration `protobuf:"bytes,2,opt,name=PollInterval,proto3,stdduration" json:"poll_interval,omitempty"`
+ // Azure is a configuration for Azure Access Graph service poll service.
+ Azure []*AccessGraphAzureSync `protobuf:"bytes,3,rep,name=Azure,proto3" json:"azure,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
}
func (m *AccessGraphSync) Reset() { *m = AccessGraphSync{} }
@@ -21739,6 +21741,50 @@ func (m *AccessGraphAWSSync) XXX_DiscardUnknown() {
var xxx_messageInfo_AccessGraphAWSSync proto.InternalMessageInfo
+// AccessGraphAzureSync is a configuration for Azure Access Graph service poll service.
+type AccessGraphAzureSync struct {
+ // SubscriptionID Is the ID of the Azure subscription to sync resources from
+ SubscriptionID string `protobuf:"bytes,1,opt,name=SubscriptionID,proto3" json:"subscription_id,omitempty"`
+ // Integration is the integration name used to generate credentials to interact with AWS APIs.
+ Integration string `protobuf:"bytes,2,opt,name=Integration,proto3" json:"integration,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *AccessGraphAzureSync) Reset() { *m = AccessGraphAzureSync{} }
+func (m *AccessGraphAzureSync) String() string { return proto.CompactTextString(m) }
+func (*AccessGraphAzureSync) ProtoMessage() {}
+func (*AccessGraphAzureSync) Descriptor() ([]byte, []int) {
+ return fileDescriptor_9198ee693835762e, []int{375}
+}
+func (m *AccessGraphAzureSync) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *AccessGraphAzureSync) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_AccessGraphAzureSync.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 *AccessGraphAzureSync) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_AccessGraphAzureSync.Merge(m, src)
+}
+func (m *AccessGraphAzureSync) XXX_Size() int {
+ return m.Size()
+}
+func (m *AccessGraphAzureSync) XXX_DiscardUnknown() {
+ xxx_messageInfo_AccessGraphAzureSync.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AccessGraphAzureSync proto.InternalMessageInfo
+
func init() {
proto.RegisterEnum("types.IAMPolicyStatus", IAMPolicyStatus_name, IAMPolicyStatus_value)
proto.RegisterEnum("types.DatabaseTLSMode", DatabaseTLSMode_name, DatabaseTLSMode_value)
@@ -22181,12 +22227,13 @@ func init() {
proto.RegisterType((*OktaOptions)(nil), "types.OktaOptions")
proto.RegisterType((*AccessGraphSync)(nil), "types.AccessGraphSync")
proto.RegisterType((*AccessGraphAWSSync)(nil), "types.AccessGraphAWSSync")
+ proto.RegisterType((*AccessGraphAzureSync)(nil), "types.AccessGraphAzureSync")
}
func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) }
var fileDescriptor_9198ee693835762e = []byte{
- // 30581 bytes of a gzipped FileDescriptorProto
+ // 30628 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7d, 0x70, 0x1c, 0x49,
0x76, 0x20, 0x86, 0x4f, 0x77, 0xe3, 0xa3, 0xf1, 0xf0, 0xd5, 0x48, 0x80, 0x24, 0x88, 0x99, 0x61,
0x73, 0x6a, 0x66, 0x38, 0xe4, 0xec, 0x0c, 0xb9, 0x04, 0x77, 0xb8, 0x3b, 0x3b, 0x5f, 0xdb, 0xe8,
@@ -23670,435 +23717,438 @@ var fileDescriptor_9198ee693835762e = []byte{
0x72, 0x0d, 0x0a, 0xbb, 0xb6, 0x50, 0x15, 0xd6, 0xf7, 0xed, 0x76, 0x9b, 0x36, 0xc5, 0x36, 0x3d,
0x2d, 0xe1, 0x65, 0x0e, 0xe6, 0x9c, 0x8d, 0xf7, 0x60, 0x2e, 0x6d, 0x96, 0x90, 0x17, 0x60, 0x42,
0x8d, 0x20, 0x24, 0x98, 0x8c, 0xdb, 0x1d, 0x47, 0xc6, 0x10, 0x12, 0x0c, 0x7e, 0x33, 0x03, 0xcf,
- 0xf5, 0xdb, 0x73, 0xc8, 0xc2, 0xff, 0xc7, 0xde, 0xb7, 0xc4, 0x38, 0x72, 0x9c, 0x07, 0x6f, 0x93,
- 0x9c, 0x19, 0xce, 0x37, 0xaf, 0x9e, 0xda, 0xc7, 0x8c, 0xf6, 0xa9, 0x6d, 0xad, 0xd6, 0xbb, 0x94,
- 0x25, 0x6b, 0x57, 0xbf, 0x2c, 0xad, 0x6d, 0xd9, 0xee, 0xe1, 0xf4, 0x0c, 0xb9, 0xcb, 0x97, 0xbb,
- 0xc9, 0x59, 0xaf, 0xd7, 0x76, 0xbb, 0x97, 0xec, 0x99, 0x69, 0x8b, 0xc3, 0xa6, 0xd9, 0xa4, 0xd6,
- 0x63, 0xfc, 0xc0, 0x6f, 0xe3, 0x47, 0x6c, 0x20, 0x2f, 0x27, 0x4e, 0x82, 0x08, 0xb9, 0xf8, 0x10,
- 0x21, 0xc8, 0xc1, 0xd7, 0x00, 0x41, 0x7c, 0xf2, 0xcd, 0x80, 0x61, 0xc0, 0x40, 0x6e, 0x4e, 0xa0,
- 0x24, 0x02, 0x12, 0x20, 0x8f, 0x5b, 0x90, 0x1c, 0x7c, 0x0a, 0xea, 0xab, 0xaa, 0xee, 0xea, 0x07,
- 0xb9, 0xb3, 0x96, 0x94, 0xc4, 0x80, 0x4f, 0x33, 0xfc, 0xea, 0xab, 0xaf, 0xeb, 0x5d, 0x5f, 0x7d,
- 0x4f, 0x28, 0x0e, 0x47, 0x9e, 0x8f, 0xbc, 0x2d, 0x4f, 0xd1, 0x20, 0x7e, 0x63, 0xf6, 0x05, 0x64,
- 0xc2, 0xc6, 0xce, 0x01, 0xf7, 0x0a, 0x31, 0x17, 0x11, 0xd2, 0x76, 0x0e, 0x02, 0xf2, 0x02, 0xac,
- 0xf7, 0xdc, 0x7d, 0x67, 0xd2, 0x1f, 0xdb, 0x41, 0xf7, 0xd0, 0xed, 0xa1, 0xdf, 0x16, 0x5a, 0xfb,
- 0x99, 0x2a, 0x2f, 0xb0, 0x04, 0x3c, 0xd5, 0xe2, 0xb9, 0x29, 0x2d, 0xbe, 0x5b, 0x28, 0x2a, 0x6a,
- 0xce, 0x44, 0xf3, 0x2a, 0xed, 0x9b, 0x39, 0xd8, 0x9c, 0xb6, 0xc9, 0xc8, 0x1b, 0x59, 0x63, 0xc0,
- 0xb4, 0x1d, 0x32, 0x5c, 0xd6, 0x76, 0x48, 0x5f, 0x23, 0xb7, 0x21, 0xf4, 0xba, 0x7a, 0x52, 0x04,
- 0x05, 0x01, 0xa3, 0x75, 0x86, 0x4e, 0x10, 0x3c, 0xa6, 0xe7, 0x48, 0x5e, 0x8a, 0xc2, 0xcb, 0x61,
- 0x72, 0x1d, 0x01, 0x23, 0xaf, 0x01, 0x74, 0xfb, 0x7e, 0xe0, 0xa2, 0x51, 0x01, 0x67, 0x50, 0x98,
- 0x2d, 0x79, 0x08, 0x95, 0xb5, 0xc8, 0x08, 0x2d, 0xfb, 0x3d, 0x97, 0x4f, 0xa0, 0x03, 0x1b, 0x53,
- 0x4e, 0x55, 0x3a, 0x3d, 0x51, 0x4a, 0x7b, 0x91, 0x20, 0x6b, 0x12, 0x26, 0xb6, 0x4f, 0x8e, 0x78,
- 0x6e, 0xda, 0x1a, 0x39, 0x06, 0x92, 0x3e, 0x3a, 0x29, 0x75, 0x6e, 0x11, 0x3d, 0x19, 0x85, 0xd4,
- 0x19, 0xa4, 0x33, 0xea, 0x93, 0x2b, 0xb0, 0x24, 0x12, 0x60, 0xd2, 0x07, 0x00, 0x23, 0x0e, 0x1c,
- 0x74, 0xcf, 0xc5, 0xc5, 0x83, 0x61, 0x56, 0xd1, 0xb7, 0x8e, 0xb3, 0x16, 0x8b, 0x08, 0x69, 0x1f,
- 0x0f, 0x45, 0xef, 0x2e, 0x8a, 0xf5, 0x1d, 0xbf, 0xd0, 0x78, 0xe9, 0x1f, 0x29, 0x62, 0xfa, 0xd3,
- 0x37, 0xc2, 0x93, 0xda, 0x47, 0x00, 0x5d, 0x9b, 0x78, 0xc3, 0xf0, 0x7f, 0xca, 0xea, 0x88, 0x5d,
- 0xc7, 0x59, 0x1d, 0xfe, 0x93, 0x5c, 0x87, 0xb5, 0x11, 0x33, 0x7e, 0x1d, 0xfb, 0x7c, 0x3c, 0x59,
- 0xb2, 0x91, 0x15, 0x06, 0x6e, 0xfb, 0x38, 0xa6, 0xbc, 0x5d, 0x77, 0xc3, 0x01, 0x93, 0x2e, 0x48,
- 0xf2, 0x12, 0x2c, 0xd2, 0x0b, 0x12, 0xc3, 0xf3, 0x24, 0x7c, 0x2a, 0x10, 0x0f, 0xd9, 0x0d, 0xb3,
- 0xf8, 0x55, 0xfe, 0x3f, 0xa7, 0xf5, 0x76, 0x4e, 0x10, 0x93, 0xaf, 0x67, 0xb2, 0x01, 0x0b, 0xfe,
- 0xe8, 0x40, 0xea, 0xda, 0xbc, 0x3f, 0x3a, 0xa0, 0xfd, 0xba, 0x01, 0x2a, 0x73, 0xf1, 0x61, 0xa1,
- 0x16, 0x82, 0xe3, 0x01, 0x7b, 0xbf, 0x17, 0xcd, 0x55, 0x06, 0xc7, 0x2c, 0xff, 0xc7, 0x83, 0x2e,
- 0xc5, 0x0c, 0x02, 0xdf, 0x96, 0xa3, 0x72, 0xf1, 0x6e, 0xaf, 0x06, 0x81, 0x1f, 0x85, 0xe7, 0xea,
- 0x91, 0x2d, 0x58, 0xa1, 0x74, 0xc2, 0xd8, 0x60, 0x9c, 0x7b, 0xb8, 0x94, 0xe6, 0x1e, 0x8e, 0x07,
- 0x5d, 0xd1, 0x44, 0x73, 0x39, 0x90, 0x7e, 0x91, 0x7b, 0xa0, 0x4a, 0x6c, 0x16, 0xfa, 0x7c, 0x26,
- 0x0c, 0xb1, 0x23, 0x32, 0x12, 0x7b, 0x56, 0x1d, 0xec, 0xfb, 0xe6, 0x5a, 0x37, 0x0e, 0xe0, 0x43,
- 0xf3, 0x7d, 0x45, 0x9c, 0xa5, 0x19, 0x95, 0x88, 0x06, 0x2b, 0x87, 0x4e, 0x60, 0x07, 0xc1, 0x11,
- 0x33, 0x2c, 0xe3, 0xd1, 0x88, 0x97, 0x0e, 0x9d, 0xc0, 0x0a, 0x8e, 0x44, 0xb6, 0x93, 0xb3, 0x14,
- 0xc7, 0x77, 0x26, 0xe3, 0x43, 0x5b, 0x66, 0x1a, 0xd9, 0x88, 0x9d, 0x3e, 0x74, 0x82, 0x26, 0x2d,
- 0x93, 0x68, 0x93, 0x6b, 0xb0, 0x8a, 0x74, 0xbb, 0x9e, 0x20, 0x8c, 0xe1, 0x32, 0xcc, 0x65, 0x4a,
- 0xb8, 0xeb, 0x31, 0xca, 0xbc, 0x85, 0xff, 0x9c, 0x83, 0x73, 0xd9, 0xa3, 0x83, 0xcb, 0x93, 0x8e,
- 0x29, 0x3a, 0xf6, 0xf1, 0xb6, 0x2d, 0x52, 0x08, 0x0b, 0x75, 0x92, 0x35, 0x39, 0xb9, 0xcc, 0xc9,
- 0x29, 0xc1, 0x3a, 0x12, 0xe2, 0xec, 0x69, 0xdf, 0x0b, 0xc6, 0x3c, 0x82, 0x87, 0xb9, 0x46, 0x0b,
- 0xd8, 0x79, 0x5e, 0xa3, 0x60, 0xf2, 0x3c, 0xac, 0x8a, 0x13, 0xd9, 0x7f, 0x3c, 0xa0, 0x1f, 0x66,
- 0xc7, 0xf1, 0x0a, 0x87, 0x36, 0x11, 0x48, 0xce, 0xc2, 0xbc, 0x33, 0x1c, 0xd2, 0x4f, 0xb2, 0x53,
- 0x78, 0xce, 0x19, 0x0e, 0x59, 0x46, 0x1e, 0x74, 0x63, 0xb4, 0xf7, 0xd1, 0xb4, 0x88, 0xdb, 0x31,
- 0x9a, 0xcb, 0x08, 0x64, 0xe6, 0x46, 0x01, 0xdd, 0xf7, 0xb4, 0xae, 0x40, 0x59, 0x40, 0x14, 0x70,
- 0x86, 0x21, 0xc2, 0x33, 0x50, 0x14, 0x4a, 0x6e, 0xe6, 0x8d, 0x61, 0x2e, 0x38, 0x5c, 0xc1, 0xfd,
- 0x2a, 0x6c, 0xf4, 0xbc, 0x00, 0x17, 0x2f, 0xeb, 0xd2, 0x70, 0xc8, 0x1d, 0x27, 0x59, 0x64, 0x5f,
- 0xf3, 0x0c, 0x2f, 0xa6, 0x23, 0xa9, 0x0f, 0x87, 0xcc, 0x7d, 0x92, 0x8f, 0xf5, 0xeb, 0xb0, 0xc6,
- 0xd9, 0x34, 0x7e, 0x45, 0x62, 0x5b, 0xf8, 0x06, 0xa6, 0xef, 0x27, 0x9e, 0x03, 0x09, 0x38, 0xa8,
- 0xda, 0x13, 0x35, 0xff, 0x56, 0x81, 0xb3, 0x99, 0x7c, 0x1e, 0xf9, 0x0a, 0x30, 0x3f, 0xb1, 0xb1,
- 0x6f, 0x8f, 0xdc, 0xae, 0x37, 0xf4, 0x30, 0xf0, 0x06, 0x93, 0x83, 0xde, 0x9e, 0xc5, 0x21, 0xa2,
- 0xcf, 0x59, 0xdb, 0x37, 0xc3, 0x4a, 0x4c, 0x40, 0xa3, 0x8e, 0x12, 0xe0, 0xf3, 0x0f, 0xe1, 0x6c,
- 0x26, 0x6a, 0x86, 0xe0, 0xe4, 0xa3, 0xf1, 0x0c, 0xd4, 0x42, 0xb3, 0x95, 0xe8, 0xb4, 0x24, 0x50,
- 0xe1, 0xdd, 0xfb, 0x51, 0xd8, 0xbd, 0x04, 0x47, 0x48, 0x8c, 0xe4, 0xbe, 0xce, 0x7a, 0xd4, 0x88,
- 0x4a, 0xd3, 0xb7, 0xf6, 0x43, 0x38, 0xcb, 0x17, 0xdf, 0xc1, 0xc8, 0x19, 0x1e, 0x46, 0xe4, 0x58,
- 0x43, 0x3f, 0x92, 0x45, 0x8e, 0xad, 0xca, 0x5d, 0x8a, 0x1f, 0x52, 0x3d, 0xed, 0xa4, 0x81, 0xbc,
- 0x0f, 0xdf, 0xca, 0x89, 0xad, 0x9e, 0xd1, 0x9c, 0x8c, 0x65, 0xad, 0x64, 0x2d, 0xeb, 0x93, 0xef,
- 0xa9, 0x06, 0x10, 0xf9, 0xb0, 0x62, 0xa2, 0x52, 0x6e, 0x85, 0x25, 0x98, 0x7b, 0xde, 0x10, 0xe9,
- 0x68, 0xb0, 0x58, 0x06, 0xd0, 0xf5, 0x6e, 0x12, 0x44, 0x2e, 0xc0, 0x62, 0x98, 0x64, 0x9b, 0x5f,
- 0x1c, 0x45, 0x06, 0xa8, 0xf6, 0xc8, 0xb3, 0xb0, 0xcc, 0xf8, 0xf8, 0xd8, 0x9e, 0x03, 0x84, 0xe9,
- 0x74, 0xe3, 0x89, 0x31, 0x50, 0xe0, 0xd9, 0x27, 0x8d, 0x21, 0xb9, 0x0f, 0xe7, 0xd0, 0x16, 0x24,
- 0xf0, 0xc3, 0x69, 0xb0, 0xbb, 0x4e, 0xf7, 0xd0, 0xe5, 0xab, 0x56, 0xcb, 0x9c, 0x8c, 0xe1, 0xd0,
- 0xb2, 0x9a, 0xd2, 0x3c, 0x0c, 0x87, 0x56, 0xe0, 0x8b, 0xdf, 0x65, 0x5a, 0x9d, 0xb7, 0xa1, 0x07,
- 0x17, 0x66, 0xd4, 0x94, 0x0e, 0x0e, 0x45, 0x3e, 0x38, 0x6e, 0x80, 0xba, 0xef, 0xf6, 0x28, 0x4f,
- 0xec, 0xf6, 0xb0, 0x69, 0x6f, 0xdd, 0x66, 0x69, 0xe5, 0xcd, 0xd5, 0x10, 0x6e, 0x05, 0xfe, 0xde,
- 0x6d, 0xfe, 0x95, 0x23, 0x71, 0xe5, 0xc9, 0x6f, 0x11, 0xf2, 0x12, 0x9c, 0x4e, 0x04, 0x35, 0x89,
- 0xbc, 0xe4, 0xcd, 0x75, 0x5a, 0x14, 0x0f, 0x81, 0x75, 0x15, 0x96, 0xc5, 0xaa, 0x18, 0x85, 0xce,
- 0x73, 0xe6, 0x12, 0x87, 0xd1, 0x5d, 0xc7, 0x3f, 0x37, 0x11, 0x9d, 0xca, 0x7c, 0xc6, 0x9c, 0x80,
- 0x97, 0x26, 0x2f, 0x02, 0x09, 0xf9, 0xf6, 0xf0, 0xa0, 0xe0, 0x1f, 0x5c, 0x17, 0x25, 0xe1, 0x0e,
- 0xe7, 0x9f, 0xfd, 0xbb, 0x02, 0x9c, 0xce, 0x78, 0xff, 0xd0, 0x47, 0x80, 0x37, 0x18, 0xbb, 0x07,
- 0xec, 0x09, 0x21, 0x77, 0x72, 0x4d, 0x82, 0x73, 0xa1, 0xd6, 0x3c, 0x4b, 0x9b, 0xce, 0xbf, 0xc5,
- 0x7f, 0xd1, 0xc3, 0xc3, 0x19, 0x09, 0x79, 0x0d, 0xfd, 0x97, 0x54, 0x61, 0x1d, 0x73, 0x41, 0x04,
- 0x9e, 0x8f, 0x29, 0x25, 0x90, 0x09, 0x29, 0xc4, 0x5e, 0x48, 0xd8, 0x8a, 0x96, 0x84, 0x44, 0xb9,
- 0x10, 0x53, 0x1d, 0x26, 0x20, 0xe4, 0x93, 0x70, 0x5e, 0xba, 0x6b, 0xec, 0xc4, 0xce, 0x43, 0xf3,
- 0x78, 0x73, 0xc3, 0x09, 0x6f, 0x9d, 0xed, 0xd8, 0x1e, 0xdc, 0x82, 0xcb, 0x38, 0x89, 0x5e, 0x6f,
- 0x68, 0xa7, 0x92, 0x87, 0x60, 0x57, 0x59, 0xb4, 0xfd, 0xf3, 0x14, 0xab, 0xda, 0x1b, 0x26, 0xf2,
- 0x88, 0x60, 0xaf, 0x6b, 0x99, 0xbb, 0x73, 0x01, 0x77, 0xe7, 0x25, 0xb9, 0x33, 0x27, 0xda, 0x9b,
- 0x07, 0xb0, 0x1e, 0x72, 0x4a, 0xe1, 0xb5, 0x55, 0x8c, 0xa5, 0x50, 0x47, 0x62, 0x82, 0x6f, 0x62,
- 0xf7, 0x18, 0x73, 0xf0, 0x4f, 0x55, 0x94, 0xc3, 0x58, 0x4c, 0x62, 0x15, 0x02, 0xf2, 0x55, 0x20,
- 0xec, 0xfa, 0x8c, 0x7d, 0x09, 0xd2, 0x5f, 0x12, 0xba, 0x19, 0xfe, 0x25, 0x96, 0xa1, 0x32, 0x55,
- 0x53, 0x0e, 0x9f, 0x85, 0xa5, 0xd2, 0xb7, 0xf8, 0x0a, 0xfb, 0x0d, 0x05, 0x4e, 0x67, 0x50, 0x24,
- 0x1a, 0xe4, 0xc4, 0x16, 0x4d, 0xdb, 0x05, 0x55, 0x4e, 0x99, 0x39, 0xaf, 0x47, 0xee, 0x00, 0x60,
- 0x66, 0xc7, 0x91, 0x7b, 0xe0, 0x7e, 0x5d, 0x4e, 0x6b, 0x1f, 0x41, 0x63, 0x75, 0x16, 0x51, 0xd6,
- 0x4a, 0xc1, 0xfc, 0xd1, 0xbb, 0x08, 0x0b, 0xde, 0xa0, 0xdb, 0x9f, 0xf4, 0x5c, 0xed, 0x07, 0xa2,
- 0x1d, 0xf1, 0x31, 0x24, 0x6d, 0xe0, 0x0a, 0x39, 0x3e, 0xde, 0xd7, 0xa7, 0x8f, 0xb7, 0xac, 0xe7,
- 0xe0, 0xe1, 0x18, 0x10, 0x20, 0x4b, 0xf3, 0x19, 0xe4, 0x7d, 0x68, 0x20, 0xf8, 0xb0, 0x3d, 0x84,
- 0xb3, 0x99, 0x7b, 0x81, 0xb2, 0x2e, 0x68, 0xd7, 0x17, 0x71, 0xdd, 0x0b, 0xf4, 0x37, 0x65, 0xbb,
- 0xaf, 0xc2, 0xf2, 0x23, 0xd7, 0x19, 0xb9, 0x23, 0xce, 0x13, 0xf2, 0xc3, 0x86, 0xc1, 0x64, 0x96,
- 0xb0, 0x17, 0xdf, 0xf4, 0x5c, 0x84, 0x49, 0xea, 0x70, 0x9a, 0x4d, 0xb1, 0x77, 0x84, 0xcf, 0x0c,
- 0x2e, 0xf6, 0x54, 0x62, 0x8c, 0x36, 0x56, 0x41, 0xa6, 0xa7, 0x8a, 0x58, 0xac, 0xb6, 0xb9, 0x7e,
- 0x90, 0x04, 0xd1, 0xbb, 0xe2, 0x5c, 0x36, 0x36, 0xd9, 0x82, 0x25, 0x46, 0x9c, 0x3d, 0x38, 0x99,
- 0xbe, 0xea, 0xea, 0xcc, 0x2f, 0x94, 0xd1, 0xdc, 0x3d, 0x08, 0xff, 0xa7, 0x9c, 0x20, 0x9a, 0x06,
- 0xd8, 0x47, 0xb2, 0x3a, 0xce, 0x5c, 0x46, 0x20, 0x57, 0xc3, 0x69, 0x7f, 0xad, 0x88, 0xae, 0xc6,
- 0x64, 0x35, 0xf4, 0xd0, 0x0a, 0xdc, 0x81, 0x50, 0x49, 0x2e, 0x9a, 0xfc, 0xd7, 0x53, 0x1e, 0xa2,
- 0xe4, 0x35, 0x58, 0xa6, 0x64, 0x0f, 0x26, 0x03, 0x76, 0x98, 0xe5, 0x63, 0x61, 0xa2, 0xea, 0xac,
- 0x88, 0x4e, 0x5b, 0xe5, 0x94, 0xb9, 0x74, 0x14, 0xfd, 0xa4, 0xef, 0xb0, 0xe0, 0x68, 0x3c, 0x94,
- 0x8f, 0x40, 0x21, 0xb7, 0xb6, 0xea, 0xed, 0x16, 0xaf, 0x52, 0xa4, 0x38, 0xd1, 0x3b, 0x6c, 0x6b,
- 0x9e, 0x49, 0xae, 0xb5, 0x17, 0x60, 0x49, 0xa2, 0x4d, 0x3b, 0xc3, 0x1c, 0xb9, 0x44, 0x67, 0xd8,
- 0x2f, 0x3e, 0xd9, 0x8f, 0xa0, 0x28, 0x48, 0xd2, 0x07, 0xe7, 0xa1, 0x1f, 0x88, 0xeb, 0x03, 0xff,
- 0xa7, 0x30, 0x3a, 0xca, 0xd8, 0xc9, 0x39, 0x13, 0xff, 0x47, 0x2e, 0x65, 0xec, 0xd0, 0x97, 0x66,
- 0x3f, 0xb0, 0x87, 0x68, 0x10, 0x18, 0x3e, 0xcb, 0x28, 0xbc, 0xdd, 0x0f, 0x98, 0x99, 0x20, 0xff,
- 0xc6, 0x5f, 0x86, 0xec, 0x5d, 0x42, 0xb8, 0x35, 0xed, 0x36, 0x8e, 0x31, 0x23, 0xb9, 0x34, 0x33,
- 0xc2, 0xc2, 0xff, 0xf0, 0x9a, 0xec, 0xcb, 0x80, 0x30, 0x64, 0x46, 0xa4, 0x3b, 0xa7, 0x10, 0xbb,
- 0x73, 0x24, 0x69, 0x4f, 0x34, 0x7b, 0x8c, 0x97, 0x11, 0xd2, 0x9e, 0xe4, 0x0d, 0xf8, 0x4e, 0xb8,
- 0x42, 0x62, 0xe2, 0x35, 0xfa, 0x2c, 0x63, 0x4f, 0x32, 0x9e, 0x34, 0x3a, 0x71, 0xf5, 0x9e, 0xc6,
- 0x42, 0x96, 0x52, 0x2a, 0xbc, 0x82, 0x9f, 0x2c, 0xcd, 0x20, 0x2f, 0xc3, 0x99, 0x30, 0xcd, 0x69,
- 0xf0, 0xa6, 0x37, 0xb4, 0x31, 0xd1, 0xed, 0x31, 0x7f, 0x2c, 0x11, 0x51, 0x66, 0xbd, 0xe9, 0x0d,
- 0xf7, 0xb0, 0x84, 0x37, 0xf3, 0xcf, 0x72, 0x42, 0x46, 0xb6, 0xe5, 0xfb, 0xe3, 0x60, 0x3c, 0x72,
- 0x86, 0x31, 0x05, 0x02, 0x39, 0x82, 0x67, 0xb0, 0x49, 0xb7, 0x31, 0xf1, 0x8c, 0x3f, 0x12, 0x81,
- 0x71, 0xc2, 0x0d, 0xb6, 0x74, 0xfb, 0x63, 0xf1, 0x47, 0xae, 0x4e, 0xb1, 0x75, 0x19, 0x99, 0xee,
- 0x2b, 0x89, 0x6a, 0xe5, 0x94, 0xb9, 0xc1, 0x68, 0xa6, 0xb0, 0x48, 0x25, 0xe3, 0xac, 0x49, 0x6a,
- 0x10, 0xb6, 0xa2, 0x83, 0x27, 0x4e, 0x55, 0x3e, 0x92, 0xc8, 0xa7, 0x61, 0xd1, 0xeb, 0xc9, 0xf9,
- 0x55, 0x93, 0xb2, 0xeb, 0x6a, 0x8f, 0xc5, 0x78, 0x8f, 0x68, 0xd0, 0xad, 0xe1, 0x71, 0xe8, 0xd6,
- 0x4a, 0x4c, 0xd5, 0xa2, 0x6d, 0x09, 0x71, 0x4c, 0xba, 0x1a, 0x59, 0x8d, 0xee, 0x1c, 0xbc, 0x5f,
- 0xf0, 0x14, 0x88, 0xa2, 0xcc, 0x9b, 0xfc, 0x97, 0xf6, 0x7f, 0xe1, 0xc6, 0x49, 0xc7, 0x88, 0x9e,
- 0x18, 0x53, 0x06, 0x7c, 0x91, 0x05, 0x78, 0x8d, 0x8f, 0xdb, 0x55, 0x90, 0x83, 0x64, 0x7b, 0x62,
- 0x89, 0x08, 0x58, 0x67, 0xe4, 0x69, 0xff, 0x96, 0x87, 0xd5, 0xb8, 0x72, 0x89, 0xbc, 0x00, 0x05,
- 0xe9, 0xa0, 0xdc, 0xc8, 0xd0, 0x40, 0xe1, 0xf1, 0x88, 0x48, 0x27, 0x3a, 0x18, 0xc9, 0x5d, 0x58,
- 0x45, 0x73, 0x57, 0xbc, 0xcd, 0xc7, 0x1e, 0x57, 0x59, 0xce, 0xd6, 0x3a, 0x17, 0x7f, 0xfc, 0xee,
- 0x95, 0x53, 0xa8, 0x60, 0x5e, 0xa6, 0x75, 0xe9, 0xc5, 0x48, 0x0b, 0x25, 0xdd, 0x41, 0x61, 0xba,
- 0xee, 0x80, 0x77, 0x65, 0x8a, 0xee, 0x60, 0x6e, 0x86, 0xee, 0x20, 0xaa, 0x29, 0xeb, 0x0e, 0x50,
- 0x83, 0xb4, 0x30, 0x4d, 0x83, 0x14, 0xd5, 0x61, 0x1a, 0xa4, 0x48, 0xf6, 0x5f, 0x9c, 0x2a, 0xfb,
- 0x8f, 0xea, 0x70, 0xd9, 0x7f, 0x24, 0x8d, 0x5f, 0x9c, 0x2a, 0x8d, 0x97, 0x2a, 0x31, 0x69, 0xfc,
- 0x35, 0x3e, 0xb0, 0x23, 0xe7, 0xb1, 0x8d, 0x23, 0xce, 0x99, 0x49, 0x1c, 0x32, 0xd3, 0x79, 0x8c,
- 0x76, 0x6c, 0x94, 0x31, 0xe1, 0xc6, 0x6f, 0xda, 0x0f, 0x13, 0x07, 0x90, 0x98, 0xf3, 0xe7, 0x61,
- 0x95, 0xdd, 0xc3, 0x3c, 0x70, 0x30, 0xbb, 0x88, 0x57, 0xcc, 0x15, 0x01, 0x65, 0x42, 0x9a, 0x8f,
- 0xc0, 0x5a, 0x88, 0xc6, 0xe5, 0x14, 0xe8, 0x13, 0x6b, 0x86, 0xb5, 0x79, 0x80, 0x27, 0x99, 0xde,
- 0x88, 0x87, 0x50, 0x8a, 0xd1, 0x63, 0xf1, 0x75, 0x5e, 0x04, 0x12, 0xa1, 0x85, 0xa6, 0xc0, 0x05,
- 0x44, 0x5d, 0x0f, 0x51, 0x43, 0x7b, 0xdd, 0x3f, 0x50, 0x12, 0xd2, 0xff, 0x0f, 0xab, 0xf9, 0x2f,
- 0x40, 0xf8, 0x75, 0x9b, 0x4b, 0x70, 0x45, 0x0f, 0x54, 0x51, 0xd0, 0xe2, 0x70, 0xed, 0x20, 0x29,
- 0x6d, 0xf8, 0x90, 0x5a, 0xa5, 0xfd, 0x28, 0x1f, 0x93, 0x8c, 0x8a, 0xcf, 0x50, 0xfe, 0x26, 0xf0,
- 0x6d, 0x3e, 0xc5, 0xfc, 0xf8, 0xbd, 0x3a, 0x65, 0x99, 0x72, 0xe3, 0x47, 0xcb, 0x6a, 0x9a, 0x10,
- 0x04, 0xbe, 0xb0, 0x85, 0xb4, 0xd9, 0x2b, 0x5a, 0x62, 0xba, 0x05, 0x39, 0x76, 0xd6, 0x96, 0x66,
- 0x93, 0x13, 0xa2, 0x29, 0xba, 0x4b, 0xf1, 0x35, 0x1d, 0xfe, 0x12, 0x1f, 0xe8, 0x00, 0x2a, 0x12,
- 0x82, 0x38, 0xf1, 0x7c, 0x86, 0xbc, 0x24, 0x45, 0x1c, 0x47, 0x09, 0x29, 0xab, 0x13, 0xf1, 0xaf,
- 0x20, 0x6b, 0xc0, 0x32, 0xca, 0x25, 0x05, 0xc1, 0x42, 0x86, 0xae, 0x2e, 0xdd, 0xf9, 0x72, 0xb5,
- 0x6e, 0x2e, 0xd1, 0x7a, 0x82, 0xcc, 0x21, 0x3c, 0x23, 0x4b, 0x13, 0xe3, 0x8d, 0x9c, 0x13, 0xe1,
- 0xbe, 0x67, 0x8e, 0x40, 0x24, 0x74, 0xc4, 0xa6, 0x9e, 0x73, 0xe2, 0x00, 0x8e, 0xa6, 0x1d, 0xc2,
- 0xf9, 0xe9, 0x53, 0x32, 0x23, 0x95, 0x5c, 0xc4, 0xda, 0xe4, 0x64, 0xd6, 0x46, 0x96, 0x2d, 0xe6,
- 0x63, 0xb2, 0x45, 0xed, 0x4f, 0xf3, 0xf0, 0xdc, 0x09, 0xa6, 0x6b, 0xc6, 0x37, 0x3f, 0x1b, 0x67,
- 0x9c, 0x73, 0x31, 0x69, 0x10, 0x25, 0xca, 0xef, 0x84, 0xe3, 0x41, 0x77, 0x0a, 0xdb, 0xfc, 0x15,
- 0x58, 0x63, 0x07, 0x3f, 0xb3, 0x5f, 0xde, 0x9f, 0xf4, 0x4f, 0x70, 0xf2, 0x5f, 0x10, 0xce, 0x96,
- 0x89, 0xaa, 0x78, 0x19, 0xe0, 0x79, 0x67, 0x85, 0x30, 0xd2, 0x86, 0x25, 0x44, 0xdb, 0x77, 0xbc,
- 0xfe, 0x89, 0xbc, 0xfe, 0x84, 0x2b, 0xa7, 0x5c, 0x8d, 0xb9, 0x5d, 0x50, 0xc0, 0x0e, 0xfe, 0x26,
- 0xd7, 0x61, 0x6d, 0x30, 0x39, 0xa2, 0x2c, 0x21, 0x5b, 0x0b, 0xdc, 0x4c, 0x6c, 0xce, 0x5c, 0x19,
- 0x4c, 0x8e, 0xf4, 0xe1, 0x10, 0xa7, 0x14, 0xed, 0xc9, 0xd6, 0x29, 0x1e, 0xdb, 0xb5, 0x02, 0x73,
- 0x1e, 0x31, 0x29, 0x01, 0xb6, 0x6f, 0x39, 0xee, 0x19, 0x60, 0xd6, 0xc5, 0x3c, 0x95, 0x1e, 0xfb,
- 0xa1, 0xfd, 0x67, 0x4e, 0xc8, 0xb8, 0xa6, 0xaf, 0xfb, 0x5f, 0x4f, 0x51, 0xc6, 0x14, 0xdd, 0x00,
- 0x95, 0x0e, 0x7d, 0x74, 0xa8, 0x84, 0x73, 0xb4, 0x3a, 0x98, 0x1c, 0x85, 0x63, 0x27, 0x0f, 0xfc,
- 0xbc, 0x3c, 0xf0, 0xaf, 0x09, 0x19, 0x58, 0xe6, 0xf1, 0x30, 0x7d, 0xc8, 0x29, 0xc7, 0x74, 0xfd,
- 0x64, 0x87, 0xc0, 0xaf, 0xe7, 0x2d, 0x63, 0xde, 0x12, 0xea, 0x92, 0xb9, 0x94, 0xba, 0x24, 0x63,
- 0xef, 0xcd, 0x67, 0xed, 0xbd, 0x94, 0x72, 0x66, 0x21, 0x43, 0x39, 0x93, 0xb9, 0x41, 0x8b, 0x4f,
- 0xd8, 0xa0, 0x8b, 0xf2, 0x3a, 0xf9, 0xa7, 0x9c, 0xe0, 0x98, 0xe2, 0x4f, 0xa0, 0x87, 0x70, 0x5a,
- 0x3c, 0x81, 0xd8, 0xcd, 0x11, 0xe9, 0xdc, 0x96, 0x6e, 0xdf, 0xcc, 0x7a, 0xfc, 0x20, 0x5a, 0xc6,
- 0x03, 0x65, 0x9d, 0x3f, 0x7b, 0xa2, 0xf2, 0xff, 0x3d, 0x0f, 0x1e, 0xf2, 0x00, 0xce, 0x61, 0x22,
- 0x8a, 0xae, 0xac, 0x2d, 0xb4, 0x47, 0xee, 0x3e, 0x5f, 0x0f, 0x57, 0x53, 0xcf, 0x03, 0xaf, 0x2b,
- 0x35, 0xc7, 0x74, 0xf7, 0x2b, 0xa7, 0xcc, 0x33, 0x41, 0x06, 0x3c, 0xf9, 0x96, 0xfa, 0x81, 0x02,
- 0xda, 0x93, 0xc7, 0x0b, 0x9f, 0xbd, 0xc9, 0x01, 0xa7, 0xcf, 0x5e, 0x69, 0xf4, 0x9e, 0x83, 0x95,
- 0x91, 0xbb, 0x3f, 0x72, 0x83, 0xc3, 0x98, 0x6c, 0x6a, 0x99, 0x03, 0xc5, 0xc0, 0x88, 0xe8, 0xb5,
- 0x4f, 0xf5, 0x18, 0x11, 0x95, 0xb4, 0x9d, 0xf0, 0x89, 0x9c, 0x39, 0x0f, 0x74, 0x35, 0xc9, 0x0d,
- 0x64, 0x3f, 0xee, 0x16, 0x8a, 0x39, 0x35, 0x6f, 0xf2, 0x18, 0xbb, 0xfb, 0x5e, 0xdf, 0xd5, 0xfe,
- 0x4a, 0x11, 0x1c, 0x41, 0xd6, 0xe0, 0x91, 0x87, 0x92, 0xd5, 0x7f, 0x3e, 0xc5, 0x86, 0x64, 0x55,
- 0x39, 0x89, 0xe0, 0xb0, 0xf6, 0x01, 0x09, 0x0e, 0xef, 0x08, 0xd3, 0x41, 0x7a, 0xe6, 0xed, 0xdd,
- 0x22, 0x37, 0x61, 0x81, 0x59, 0x0b, 0x8a, 0xe6, 0xae, 0xc5, 0x9a, 0xbb, 0x77, 0xcb, 0x14, 0xe5,
- 0xda, 0xdb, 0xa1, 0x2e, 0x3b, 0xd5, 0x89, 0xbd, 0x5b, 0xe4, 0xb5, 0x93, 0x59, 0xf1, 0x17, 0x85,
- 0x15, 0x7f, 0x68, 0xc1, 0xff, 0x7a, 0xcc, 0x82, 0xff, 0xda, 0xec, 0xd1, 0xe2, 0x16, 0x08, 0x2c,
- 0x6e, 0x69, 0x14, 0xcf, 0xee, 0xe7, 0x39, 0xb8, 0x34, 0xb3, 0x06, 0xb9, 0x08, 0x45, 0xbd, 0x55,
- 0x6d, 0x47, 0xf3, 0x4b, 0xf7, 0x8c, 0x80, 0x90, 0x5d, 0x58, 0xdc, 0x72, 0x02, 0xaf, 0x4b, 0x97,
- 0x71, 0xa6, 0x4a, 0x30, 0x45, 0x36, 0x44, 0xaf, 0x9c, 0x32, 0xa3, 0xba, 0xc4, 0x86, 0x75, 0xdc,
- 0x0b, 0xb1, 0x1c, 0x75, 0xf9, 0x0c, 0xf1, 0x4a, 0x8a, 0x60, 0xaa, 0x1a, 0x3d, 0x67, 0x52, 0x40,
- 0xf2, 0x08, 0x88, 0x65, 0x55, 0xca, 0xee, 0x68, 0xcc, 0xc5, 0x0e, 0x63, 0x2f, 0x34, 0x09, 0x7f,
- 0xf9, 0x09, 0x63, 0x97, 0xaa, 0x57, 0x39, 0x65, 0x66, 0x50, 0x4b, 0x6e, 0xf3, 0xb7, 0x04, 0xbf,
- 0x33, 0x7d, 0x10, 0x9e, 0x22, 0x26, 0xf4, 0x0d, 0x28, 0xb6, 0x84, 0xfd, 0x91, 0xe4, 0x5a, 0x23,
- 0x6c, 0x8d, 0xcc, 0xb0, 0x54, 0xfb, 0x6d, 0x45, 0xc8, 0x59, 0x9e, 0x3c, 0x58, 0x52, 0x0a, 0xc1,
- 0xde, 0xec, 0x14, 0x82, 0xbd, 0x5f, 0x32, 0x85, 0xa0, 0xe6, 0xc1, 0xcd, 0x13, 0x0f, 0x2c, 0xf9,
- 0x14, 0xa8, 0x98, 0x6d, 0xcd, 0x91, 0x26, 0x89, 0xed, 0xaf, 0xf5, 0x30, 0x49, 0x40, 0x85, 0xa7,
- 0xb4, 0x34, 0xd7, 0xba, 0xf1, 0xda, 0xda, 0x9f, 0xf3, 0xe4, 0x10, 0xd5, 0x5e, 0x2b, 0xa1, 0x5c,
- 0x7a, 0xbf, 0xde, 0x58, 0x46, 0x6c, 0xb3, 0x3d, 0x27, 0x65, 0xbb, 0x4d, 0x7f, 0x6b, 0xba, 0x53,
- 0x96, 0xb4, 0xf3, 0xfe, 0x38, 0x0f, 0x17, 0x67, 0x55, 0xcf, 0xcc, 0xa7, 0xaf, 0x3c, 0x5d, 0x3e,
- 0xfd, 0x9b, 0x50, 0x64, 0xb0, 0xd0, 0xd5, 0x08, 0xe7, 0x96, 0x57, 0xa5, 0x73, 0x2b, 0x8a, 0xc9,
- 0x73, 0x30, 0xaf, 0x97, 0xad, 0x28, 0xc5, 0x23, 0xfa, 0x04, 0x38, 0xdd, 0x00, 0xad, 0xcd, 0x79,
- 0x11, 0xf9, 0x72, 0x3a, 0xab, 0x29, 0xcf, 0xed, 0x78, 0x41, 0x1a, 0x90, 0x54, 0xde, 0x16, 0x6c,
- 0x6f, 0x94, 0x67, 0x84, 0x87, 0xee, 0x37, 0xd3, 0x19, 0x52, 0x35, 0x98, 0x6f, 0x8d, 0xdc, 0xc0,
- 0x1d, 0xcb, 0xf6, 0xfa, 0x43, 0x84, 0x98, 0xbc, 0x84, 0x5b, 0xd3, 0x3b, 0xc7, 0x2c, 0x78, 0xca,
- 0xbc, 0x1c, 0xd0, 0x0a, 0xcd, 0xef, 0x29, 0xd8, 0x94, 0x50, 0x68, 0x85, 0x9a, 0x33, 0x19, 0x74,
- 0x0f, 0x3b, 0x66, 0x8d, 0x73, 0x4e, 0xac, 0x42, 0x1f, 0xa1, 0xb4, 0x83, 0x81, 0x29, 0xa1, 0x68,
- 0xdf, 0x51, 0xe0, 0x4c, 0x56, 0x3f, 0xc8, 0x45, 0x28, 0x0c, 0x32, 0x13, 0xb8, 0x0e, 0x58, 0xcc,
- 0x87, 0x25, 0x54, 0x9f, 0xed, 0xfb, 0xa3, 0x23, 0x67, 0x2c, 0x7b, 0x35, 0x48, 0x60, 0x13, 0x15,
- 0x6f, 0x3b, 0xf8, 0x3f, 0xb9, 0x22, 0xae, 0x9c, 0x7c, 0x2a, 0xe5, 0x2b, 0xfe, 0xd1, 0x74, 0x80,
- 0x6a, 0xaf, 0xd5, 0x1c, 0xb2, 0xbc, 0x21, 0xaf, 0x40, 0x81, 0x36, 0x2b, 0xb1, 0x7a, 0xe9, 0xfa,
- 0xd1, 0xeb, 0x35, 0x8e, 0xc4, 0x5a, 0x15, 0x38, 0x47, 0x7d, 0x13, 0x91, 0xb5, 0xfb, 0xb0, 0x1a,
- 0xc7, 0x20, 0x46, 0x3c, 0x74, 0xf4, 0xd2, 0x6d, 0x95, 0x53, 0xda, 0xf2, 0x7d, 0xe6, 0x59, 0xb7,
- 0xf5, 0xcc, 0xcf, 0xdf, 0xbd, 0x02, 0xf4, 0x27, 0xab, 0x93, 0x15, 0x5a, 0x5a, 0xfb, 0x6e, 0x0e,
- 0xce, 0x44, 0xc1, 0x3c, 0xc4, 0x1e, 0xfa, 0x95, 0xf5, 0x2c, 0xd7, 0x63, 0x9e, 0xcf, 0x82, 0x6f,
- 0x4c, 0x77, 0x70, 0x86, 0xc3, 0xe5, 0x2e, 0x6c, 0x4e, 0xc3, 0x27, 0x2f, 0xc0, 0x22, 0xc6, 0x7f,
- 0x1b, 0x3a, 0x5d, 0x57, 0x3e, 0x66, 0x07, 0x02, 0x68, 0x46, 0xe5, 0xda, 0x4f, 0x15, 0x38, 0xcf,
- 0xfd, 0xc1, 0xea, 0x8e, 0x37, 0x40, 0xfd, 0x4d, 0xd7, 0xfd, 0x60, 0x22, 0x23, 0xec, 0xc6, 0xce,
- 0xb1, 0xe7, 0xe3, 0x6e, 0x7f, 0xa9, 0xaf, 0x4d, 0xef, 0x2d, 0xb9, 0x89, 0x31, 0x0d, 0xb9, 0xe5,
- 0x4c, 0x81, 0x45, 0xa2, 0x19, 0x50, 0x80, 0x1c, 0x89, 0x06, 0x31, 0xb4, 0xff, 0x07, 0x97, 0x67,
- 0x7f, 0x80, 0x7c, 0x09, 0x56, 0x30, 0x49, 0x5f, 0x67, 0x78, 0x30, 0x72, 0x7a, 0xae, 0x90, 0xec,
- 0x09, 0x01, 0xb4, 0x5c, 0xc6, 0x42, 0x34, 0xf2, 0xc8, 0x28, 0x07, 0x98, 0xfe, 0x8f, 0x57, 0x8a,
- 0x39, 0x5d, 0xca, 0xd4, 0xb4, 0x6f, 0x2a, 0x40, 0xd2, 0x34, 0xc8, 0xc7, 0x61, 0xb9, 0xd3, 0x2e,
- 0x5b, 0x63, 0x67, 0x34, 0xae, 0xf8, 0x93, 0x11, 0x8f, 0x8f, 0xc8, 0x02, 0x65, 0x8c, 0xbb, 0x36,
- 0xd3, 0xd4, 0x1d, 0xfa, 0x93, 0x91, 0x19, 0xc3, 0xc3, 0x64, 0x70, 0xae, 0xfb, 0x66, 0xcf, 0x39,
- 0x8e, 0x27, 0x83, 0xe3, 0xb0, 0x58, 0x32, 0x38, 0x0e, 0xd3, 0xde, 0x51, 0xe0, 0x82, 0x30, 0x88,
- 0xee, 0x65, 0xb4, 0xa5, 0x8c, 0xe1, 0xa0, 0x46, 0x22, 0x20, 0xf7, 0x2c, 0x0e, 0x7d, 0x5d, 0x44,
- 0x4c, 0xc3, 0x06, 0x22, 0xab, 0xce, 0xea, 0x92, 0xcf, 0x42, 0xc1, 0x1a, 0xfb, 0xc3, 0x13, 0x84,
- 0x4c, 0x53, 0xc3, 0x19, 0x1d, 0xfb, 0x43, 0x24, 0x81, 0x35, 0x35, 0x17, 0xce, 0xc8, 0x8d, 0x13,
- 0x2d, 0x26, 0x75, 0x58, 0xe0, 0xb1, 0x31, 0x13, 0xb6, 0x46, 0x33, 0xfa, 0xb4, 0xb5, 0x26, 0xe2,
- 0xb2, 0xf1, 0x80, 0xd0, 0xa6, 0xa0, 0xa1, 0xfd, 0xae, 0x02, 0x4b, 0x94, 0xb1, 0xc1, 0x47, 0xe9,
- 0xfb, 0x5d, 0xd2, 0x71, 0x3e, 0x58, 0x98, 0xce, 0x85, 0xe4, 0x4f, 0x74, 0x1b, 0xbf, 0x0a, 0x6b,
- 0x89, 0x0a, 0x44, 0xc3, 0x88, 0x3c, 0x7d, 0xaf, 0xeb, 0xb0, 0xdc, 0x52, 0xcc, 0xec, 0x2c, 0x06,
- 0xd3, 0x7e, 0x53, 0x81, 0x33, 0xcd, 0x37, 0xc7, 0x0e, 0x53, 0xa8, 0x9b, 0x93, 0xbe, 0xd8, 0xef,
- 0x94, 0x59, 0x13, 0x96, 0xf5, 0x2c, 0x5a, 0x08, 0x63, 0xd6, 0x38, 0xcc, 0x0c, 0x4b, 0x49, 0x05,
- 0x8a, 0xfc, 0x7e, 0x09, 0x78, 0x1c, 0xe7, 0xcb, 0x92, 0x6c, 0x24, 0x22, 0xcc, 0x91, 0x68, 0x4f,
- 0xf0, 0x08, 0xe3, 0x75, 0xcc, 0xb0, 0xb6, 0xf6, 0xef, 0x0a, 0x6c, 0x4c, 0xa9, 0x43, 0xde, 0x80,
- 0x39, 0xf4, 0x64, 0xe6, 0xb3, 0x77, 0x71, 0xca, 0x27, 0xc6, 0xdd, 0xc3, 0xbd, 0x5b, 0xec, 0x22,
- 0x3a, 0xa2, 0x3f, 0x4c, 0x56, 0x8b, 0x3c, 0x84, 0x45, 0xbd, 0xd7, 0xe3, 0xaf, 0xb3, 0x5c, 0xec,
- 0x75, 0x36, 0xe5, 0x8b, 0x2f, 0x85, 0xf8, 0xec, 0x75, 0xc6, 0x7c, 0xea, 0x7a, 0x3d, 0x9b, 0x7b,
- 0x69, 0x47, 0xf4, 0xce, 0x7f, 0x0a, 0x56, 0xe3, 0xc8, 0x4f, 0xe5, 0x58, 0xfa, 0xb6, 0x02, 0x6a,
- 0xbc, 0x0d, 0x1f, 0x4e, 0x44, 0xb9, 0xac, 0x69, 0x7e, 0xc2, 0xa2, 0xfa, 0xfd, 0x1c, 0x9c, 0xcd,
- 0x1c, 0x61, 0xf2, 0x22, 0xcc, 0xeb, 0xc3, 0x61, 0x75, 0x9b, 0xaf, 0x2a, 0xce, 0x21, 0xa1, 0xd0,
- 0x3b, 0xf6, 0x78, 0x65, 0x48, 0xe4, 0x15, 0x28, 0x32, 0xbb, 0x8d, 0x6d, 0x71, 0xe0, 0x60, 0x88,
- 0x2c, 0x6e, 0x54, 0x12, 0x8f, 0xa8, 0x2c, 0x10, 0xc9, 0x0e, 0xac, 0xf2, 0xe0, 0x52, 0x68, 0xb9,
- 0x13, 0xa6, 0xf6, 0xc0, 0xec, 0x23, 0x42, 0x92, 0xce, 0x8c, 0x7d, 0x62, 0x67, 0x67, 0xa2, 0x16,
- 0xa9, 0x81, 0x8a, 0x34, 0x65, 0x4a, 0x2c, 0xac, 0xb3, 0x64, 0xbc, 0x34, 0x85, 0x56, 0xaa, 0x66,
- 0x38, 0x5d, 0x7a, 0x10, 0x78, 0x07, 0x83, 0x23, 0x77, 0x30, 0xfe, 0xf0, 0xa6, 0x2b, 0xfa, 0xc6,
- 0x89, 0xa6, 0xeb, 0x0f, 0x0b, 0x6c, 0x33, 0x27, 0xab, 0x51, 0x8e, 0x46, 0x8a, 0xe4, 0x8f, 0x1c,
- 0x0d, 0x7d, 0x9f, 0xf1, 0xf0, 0x49, 0xdb, 0xb0, 0xc0, 0xc2, 0x5a, 0x89, 0x9d, 0x71, 0x29, 0xb3,
- 0x09, 0x0c, 0x67, 0xef, 0x16, 0x63, 0x5f, 0x98, 0x4b, 0x75, 0x60, 0x8a, 0xaa, 0x64, 0x0f, 0x96,
- 0xca, 0x7d, 0xd7, 0x19, 0x4c, 0x86, 0xed, 0x93, 0x29, 0x8d, 0x37, 0x79, 0x5f, 0x96, 0xbb, 0xac,
- 0x1a, 0x2a, 0x9b, 0xf1, 0x24, 0x97, 0x09, 0x91, 0x76, 0xe8, 0x65, 0x59, 0x40, 0xc1, 0xeb, 0xcb,
- 0x33, 0xc6, 0x27, 0x09, 0xc4, 0x7a, 0x71, 0x17, 0x62, 0xee, 0x86, 0x69, 0xc3, 0x6a, 0xcd, 0x09,
- 0xc6, 0xed, 0x91, 0x33, 0x08, 0x30, 0x1c, 0xee, 0x09, 0xc2, 0x05, 0x5e, 0x10, 0xa9, 0xde, 0x51,
- 0x64, 0x3a, 0x0e, 0xab, 0x32, 0x81, 0x6c, 0x9c, 0x1c, 0xe5, 0x97, 0x76, 0xbc, 0x81, 0xd3, 0xf7,
- 0xbe, 0x21, 0x9c, 0xd1, 0x19, 0xbf, 0xb4, 0x2f, 0x80, 0x66, 0x54, 0xae, 0x7d, 0x31, 0x35, 0x6f,
- 0xac, 0x95, 0x4b, 0xb0, 0xc0, 0x43, 0x95, 0xb0, 0xd0, 0x1d, 0x2d, 0xa3, 0xb1, 0x5d, 0x6d, 0xec,
- 0xaa, 0x0a, 0x59, 0x05, 0x68, 0x99, 0xcd, 0xb2, 0x61, 0x59, 0xf4, 0x77, 0x8e, 0xfe, 0xe6, 0x71,
- 0x3d, 0x76, 0x3a, 0x35, 0x35, 0x2f, 0x85, 0xf6, 0x28, 0x68, 0x3f, 0x51, 0xe0, 0x5c, 0xf6, 0x54,
- 0x92, 0x36, 0x60, 0x70, 0x17, 0x6e, 0x3e, 0xf0, 0xf1, 0x99, 0xf3, 0x9e, 0x09, 0x4e, 0x06, 0x89,
- 0x19, 0xb3, 0xe0, 0x23, 0x39, 0xa1, 0xfb, 0x62, 0xde, 0xcc, 0x5e, 0xcf, 0xcc, 0x79, 0x3d, 0xad,
- 0x0c, 0x9b, 0xd3, 0x68, 0xc4, 0xbb, 0xba, 0x06, 0x4b, 0x7a, 0xab, 0x55, 0xab, 0x96, 0xf5, 0x76,
- 0xb5, 0xd9, 0x50, 0x15, 0xb2, 0x08, 0x73, 0xbb, 0x66, 0xb3, 0xd3, 0x52, 0x73, 0xda, 0xf7, 0x14,
- 0x58, 0xa9, 0x46, 0x96, 0xa6, 0xef, 0x77, 0xf3, 0x7d, 0x22, 0xb6, 0xf9, 0x36, 0xc3, 0x30, 0x48,
- 0xe1, 0x07, 0x4e, 0xb4, 0xf3, 0xde, 0xcb, 0xc1, 0x7a, 0xaa, 0x0e, 0xb1, 0x60, 0x41, 0xbf, 0x6f,
- 0x35, 0xab, 0xdb, 0x65, 0xde, 0xb2, 0x2b, 0x91, 0x21, 0x1b, 0x26, 0xc6, 0x4b, 0x7d, 0x85, 0x85,
- 0x0e, 0x78, 0x1c, 0xd8, 0xbe, 0xd7, 0xeb, 0xc6, 0x2c, 0x18, 0x05, 0x25, 0xbc, 0xc9, 0xbe, 0x31,
- 0x19, 0xb9, 0x48, 0x36, 0x17, 0x93, 0xeb, 0x86, 0xf0, 0x34, 0x61, 0x34, 0x8e, 0x74, 0x68, 0x79,
- 0x9a, 0x74, 0x44, 0x8f, 0x34, 0x60, 0x7e, 0xd7, 0x1b, 0x57, 0x26, 0x8f, 0xf8, 0xfe, 0xbd, 0x1c,
- 0xa5, 0x49, 0xab, 0x4c, 0x1e, 0xa5, 0xc9, 0xa2, 0xc8, 0x92, 0x85, 0xf9, 0x8a, 0x91, 0xe4, 0x54,
- 0x92, 0xde, 0xce, 0x85, 0xa7, 0xf2, 0x76, 0xde, 0x5a, 0x81, 0x25, 0xfe, 0x86, 0xc2, 0xe7, 0xc9,
- 0x8f, 0x14, 0xd8, 0x9c, 0x36, 0x72, 0xf4, 0x59, 0x16, 0x8f, 0x6a, 0x72, 0x2e, 0xcc, 0xa3, 0x13,
- 0x0f, 0x67, 0x22, 0xd0, 0xc8, 0x67, 0x60, 0x89, 0x59, 0x69, 0x59, 0xaf, 0x74, 0xcc, 0x2a, 0x5f,
- 0xae, 0x97, 0xfe, 0xe5, 0xdd, 0x2b, 0x1b, 0xdc, 0xb0, 0x2b, 0x78, 0xc5, 0x9e, 0x8c, 0xbc, 0x58,
- 0xce, 0x11, 0xb9, 0x06, 0xe5, 0xa2, 0x9d, 0x49, 0xcf, 0x73, 0xc5, 0x1b, 0x42, 0x44, 0x7e, 0xe0,
- 0x30, 0xf9, 0x4e, 0x13, 0x30, 0xed, 0xdb, 0x0a, 0x9c, 0x9f, 0x3e, 0x4d, 0xf4, 0x9e, 0x6c, 0x33,
- 0x63, 0x37, 0x11, 0x7b, 0x01, 0xef, 0xc9, 0xd0, 0x22, 0x4e, 0xa6, 0x29, 0x10, 0x69, 0x25, 0x2e,
- 0xe1, 0x12, 0x42, 0x12, 0x39, 0x71, 0x7e, 0xbc, 0x92, 0x40, 0xd4, 0x1e, 0xc0, 0xc6, 0x94, 0x49,
- 0x25, 0x9f, 0xce, 0xcc, 0xce, 0x85, 0xae, 0x89, 0x72, 0x76, 0xae, 0x58, 0x9a, 0x47, 0x09, 0xae,
- 0xfd, 0x6b, 0x0e, 0xce, 0xd1, 0xdd, 0xd5, 0x77, 0x83, 0x40, 0x8f, 0x12, 0x59, 0xd3, 0x53, 0xf1,
- 0x35, 0x98, 0x3f, 0x7c, 0x3a, 0x51, 0x31, 0x43, 0x27, 0x04, 0xf0, 0xc6, 0x12, 0x0e, 0x71, 0xf4,
- 0x7f, 0x72, 0x15, 0x40, 0x4a, 0x65, 0x9e, 0xc7, 0x38, 0xc8, 0xb9, 0x4d, 0xc5, 0x5c, 0x1c, 0x86,
- 0x09, 0xcb, 0x5f, 0x87, 0x39, 0x94, 0xa7, 0xf0, 0xbb, 0x43, 0xf0, 0xfc, 0xd9, 0xad, 0x43, 0x69,
- 0x8b, 0xc9, 0x2a, 0x90, 0x8f, 0x01, 0x44, 0x29, 0x64, 0xf8, 0xe5, 0x20, 0xe4, 0x0c, 0x61, 0x16,
- 0x19, 0x73, 0xf1, 0x68, 0xdf, 0xe1, 0x79, 0x59, 0x4a, 0xb0, 0x2e, 0x46, 0x7c, 0x28, 0xc2, 0xa7,
- 0x72, 0x2d, 0xe6, 0x1a, 0x2b, 0xa8, 0x0e, 0x45, 0x08, 0xd5, 0x6b, 0xa9, 0x4c, 0xee, 0x18, 0x45,
- 0x3d, 0x91, 0xae, 0xfd, 0x5a, 0x2a, 0x5d, 0x7b, 0x91, 0x61, 0xc9, 0x39, 0xd9, 0xb5, 0x7f, 0xcc,
- 0xc1, 0xe2, 0x7d, 0xca, 0x95, 0xa1, 0xac, 0x61, 0xb6, 0xec, 0xe2, 0x36, 0x2c, 0xd5, 0x7c, 0x87,
- 0xab, 0x8b, 0xb8, 0x1f, 0x19, 0xb3, 0xb1, 0xee, 0xfb, 0x8e, 0xd0, 0x3c, 0x05, 0xa6, 0x8c, 0xf4,
- 0x84, 0xc0, 0x15, 0x77, 0x61, 0x9e, 0xa9, 0xef, 0xb8, 0x18, 0x4d, 0xf0, 0xe5, 0x61, 0x8b, 0x5e,
- 0x62, 0xc5, 0x92, 0x86, 0x83, 0xa9, 0x00, 0x65, 0x26, 0x91, 0x1b, 0x5c, 0x4b, 0x92, 0x95, 0xb9,
- 0x93, 0x49, 0x56, 0xa4, 0xa0, 0x97, 0xf3, 0x27, 0x09, 0x7a, 0x79, 0xfe, 0x0e, 0x2c, 0x49, 0xed,
- 0x79, 0x2a, 0x36, 0xfd, 0x5b, 0x39, 0x58, 0xc1, 0x5e, 0x85, 0xb6, 0x3c, 0xbf, 0x9a, 0x72, 0xa2,
- 0x4f, 0xc4, 0xe4, 0x44, 0x9b, 0xf2, 0x7c, 0xb1, 0x9e, 0xcd, 0x10, 0x10, 0xdd, 0x85, 0xf5, 0x14,
- 0x22, 0x79, 0x15, 0xe6, 0x68, 0xf3, 0xc5, 0xbb, 0x5a, 0x4d, 0xae, 0x80, 0x28, 0x40, 0x3a, 0xed,
- 0x78, 0x60, 0x32, 0x6c, 0xed, 0x3f, 0x14, 0x58, 0xe6, 0xf9, 0x89, 0x06, 0xfb, 0xfe, 0x13, 0x87,
- 0xf3, 0x7a, 0x72, 0x38, 0x59, 0x18, 0x26, 0x3e, 0x9c, 0xff, 0xdd, 0x83, 0x78, 0x27, 0x36, 0x88,
- 0x1b, 0x61, 0xb8, 0x54, 0xd1, 0x9d, 0x19, 0x63, 0xf8, 0x43, 0x0c, 0x20, 0x1e, 0x47, 0x24, 0x5f,
- 0x86, 0xc5, 0x86, 0xfb, 0x38, 0xf6, 0x3c, 0xbd, 0x3e, 0x85, 0xe8, 0x4b, 0x21, 0x22, 0xdb, 0x53,
- 0xcc, 0xed, 0xc1, 0x7d, 0x6c, 0xa7, 0x34, 0x87, 0x11, 0x49, 0xfa, 0x42, 0x8d, 0x57, 0x7b, 0x9a,
- 0xa5, 0xcf, 0x9d, 0xda, 0x31, 0xb2, 0xd8, 0x77, 0xf2, 0x00, 0x91, 0x3f, 0x30, 0xdd, 0x80, 0x31,
- 0xa3, 0x09, 0x21, 0xd9, 0x47, 0x90, 0xbc, 0xc6, 0x85, 0x2d, 0xc5, 0x75, 0x2e, 0x81, 0xce, 0x4d,
- 0x0f, 0x67, 0x8b, 0xb2, 0xe8, 0x32, 0x77, 0x40, 0xed, 0xb9, 0x7d, 0x87, 0x9d, 0xed, 0xf9, 0xad,
- 0x6b, 0x18, 0xbd, 0x3c, 0x84, 0x4e, 0xc9, 0x4b, 0x8f, 0x6e, 0xaa, 0xdb, 0x14, 0x21, 0xe5, 0x63,
- 0x5f, 0x78, 0x3a, 0x1f, 0xfb, 0x16, 0x2c, 0x7a, 0x83, 0xb7, 0xdc, 0xc1, 0xd8, 0x1f, 0x1d, 0xa3,
- 0xd8, 0x3d, 0x92, 0xe7, 0xd1, 0x21, 0xa8, 0x8a, 0x32, 0x36, 0x0f, 0x78, 0xe7, 0x86, 0xf8, 0xf2,
- 0x34, 0x84, 0xc0, 0x30, 0x46, 0xc0, 0x9c, 0x3a, 0x7f, 0xb7, 0x50, 0x9c, 0x57, 0x17, 0xee, 0x16,
- 0x8a, 0x45, 0x75, 0xf1, 0x6e, 0xa1, 0xb8, 0xa8, 0x82, 0x29, 0xe9, 0xcc, 0x42, 0x9d, 0x98, 0xa4,
- 0xc6, 0x8a, 0xab, 0xa8, 0xb4, 0x5f, 0xe4, 0x80, 0xa4, 0x9b, 0x41, 0x3e, 0x01, 0x4b, 0xec, 0x80,
- 0xb5, 0x47, 0xc1, 0xd7, 0xb8, 0x23, 0x08, 0x8b, 0xcf, 0x26, 0x81, 0xe5, 0xf8, 0x6c, 0x0c, 0x6c,
- 0x06, 0x5f, 0xeb, 0x93, 0x2f, 0xc1, 0x69, 0x1c, 0xde, 0xa1, 0x3b, 0xf2, 0xfc, 0x9e, 0x8d, 0xc1,
- 0xb4, 0x9d, 0x3e, 0xcf, 0x21, 0xfb, 0x22, 0x26, 0x3b, 0x4f, 0x17, 0x4f, 0x99, 0x06, 0x74, 0xfb,
- 0x6d, 0x21, 0x66, 0x8b, 0x21, 0x92, 0x36, 0xa8, 0x72, 0xfd, 0xfd, 0x49, 0xbf, 0xcf, 0x67, 0xb6,
- 0x44, 0x5f, 0xf4, 0xc9, 0xb2, 0x29, 0x84, 0x57, 0x23, 0xc2, 0x3b, 0x93, 0x7e, 0x9f, 0xbc, 0x06,
- 0xe0, 0x0f, 0xec, 0x23, 0x2f, 0x08, 0x98, 0x32, 0x27, 0x74, 0x05, 0x8a, 0xa0, 0xf2, 0x64, 0xf8,
- 0x83, 0x3a, 0x03, 0x92, 0xff, 0x03, 0x18, 0xd6, 0x05, 0xe3, 0x1d, 0x31, 0x6b, 0x24, 0x9e, 0xe6,
- 0x49, 0x00, 0xe3, 0x01, 0x11, 0x0e, 0x5c, 0xcb, 0xfb, 0x86, 0x70, 0xca, 0xfb, 0x02, 0xac, 0x73,
- 0x7b, 0xe9, 0xfb, 0xde, 0xf8, 0x90, 0x3f, 0x25, 0xde, 0xcf, 0x3b, 0x44, 0x7a, 0x4b, 0xfc, 0x4d,
- 0x01, 0x40, 0xbf, 0x6f, 0x89, 0x50, 0x82, 0x37, 0x61, 0x8e, 0x3e, 0x90, 0x84, 0xa0, 0x05, 0xc5,
- 0xd4, 0x48, 0x57, 0x16, 0x53, 0x23, 0x06, 0xdd, 0x8d, 0x26, 0xba, 0x3b, 0x08, 0x21, 0x0b, 0xee,
- 0x46, 0xe6, 0x01, 0x11, 0x0b, 0xe5, 0xce, 0xb1, 0x48, 0x0d, 0x20, 0x0a, 0xee, 0xc7, 0x59, 0xfe,
- 0xf5, 0x28, 0x4a, 0x16, 0x2f, 0xe0, 0xe9, 0x64, 0xa2, 0x00, 0x81, 0xf2, 0xf2, 0x89, 0xd0, 0xc8,
- 0x3d, 0x28, 0xb4, 0x9d, 0xd0, 0xff, 0x7e, 0x4a, 0xc8, 0xc3, 0x67, 0x79, 0x8e, 0xdf, 0x28, 0xec,
- 0xe1, 0xea, 0xd8, 0x89, 0xa5, 0x42, 0x47, 0x22, 0xc4, 0x80, 0xf9, 0x96, 0x33, 0x72, 0x8e, 0x82,
- 0x69, 0xa1, 0x72, 0x59, 0xa9, 0x08, 0x90, 0x8f, 0x40, 0x99, 0xa7, 0x60, 0xc5, 0xe4, 0x36, 0xe4,
- 0x2d, 0xab, 0xce, 0x03, 0xfd, 0xac, 0x44, 0xcf, 0x2f, 0xcb, 0xaa, 0x33, 0xbd, 0x6f, 0x10, 0x1c,
- 0x49, 0xd5, 0x28, 0x32, 0xf9, 0x24, 0x2c, 0x49, 0x4c, 0x31, 0x0f, 0x91, 0x85, 0x63, 0x20, 0x79,
- 0x38, 0xca, 0x87, 0x86, 0x84, 0x4d, 0x6a, 0xa0, 0xde, 0x9b, 0x3c, 0x72, 0xf5, 0xe1, 0x10, 0x5d,
- 0x9f, 0xdf, 0x72, 0x47, 0x8c, 0x6d, 0x2b, 0x46, 0xb1, 0xe5, 0xd1, 0x7b, 0xa5, 0x27, 0x4a, 0x65,
- 0x61, 0x53, 0xb2, 0x26, 0x69, 0xc1, 0xba, 0xe5, 0x8e, 0x27, 0x43, 0x66, 0x5f, 0xb3, 0xe3, 0x8f,
- 0xe8, 0xfb, 0x86, 0x05, 0xd4, 0xc2, 0x30, 0xdc, 0x01, 0x2d, 0x14, 0x46, 0x4d, 0xfb, 0xfe, 0x28,
- 0xf1, 0xd6, 0x49, 0x57, 0xd6, 0x5c, 0x79, 0xca, 0xe9, 0xad, 0x1a, 0x7f, 0x35, 0xe1, 0xad, 0x2a,
- 0x5e, 0x4d, 0xd1, 0x5b, 0xe9, 0x63, 0x19, 0x41, 0x1f, 0x51, 0x33, 0x28, 0x05, 0x7d, 0x8c, 0x85,
- 0x7a, 0x7c, 0xa7, 0x20, 0xc5, 0x1d, 0xe6, 0x73, 0xf1, 0x06, 0xc0, 0x5d, 0xdf, 0x1b, 0xd4, 0xdd,
- 0xf1, 0xa1, 0xdf, 0x93, 0x62, 0x4f, 0x2e, 0x7d, 0xd5, 0xf7, 0x06, 0xf6, 0x11, 0x82, 0x7f, 0xf1,
- 0xee, 0x15, 0x09, 0xc9, 0x94, 0xfe, 0x27, 0x1f, 0x85, 0x45, 0xfa, 0xab, 0x1d, 0x59, 0x09, 0x31,
- 0x99, 0x2c, 0xd6, 0x66, 0xd9, 0x79, 0x22, 0x04, 0x72, 0x07, 0xf3, 0x51, 0x79, 0xc3, 0xb1, 0xc4,
- 0xbc, 0x8a, 0xe4, 0x53, 0xde, 0x70, 0x9c, 0x0c, 0x25, 0x2f, 0x21, 0x93, 0x4a, 0xd8, 0x74, 0x91,
- 0x42, 0x8e, 0xa7, 0xbd, 0x42, 0xc1, 0x23, 0x5f, 0x6b, 0xb6, 0x88, 0x61, 0x2d, 0x3b, 0x55, 0x26,
- 0xaa, 0x61, 0x23, 0xac, 0xca, 0x36, 0xd3, 0x14, 0x71, 0xa6, 0x96, 0x35, 0x22, 0x38, 0xec, 0xd9,
- 0x5d, 0x04, 0xc7, 0x1a, 0x11, 0x22, 0x93, 0x2d, 0x58, 0x63, 0x3c, 0x7e, 0x98, 0x8a, 0x96, 0xb3,
- 0xb8, 0x78, 0xb6, 0x45, 0xb9, 0x6a, 0xe5, 0xcf, 0x27, 0x2a, 0x90, 0x1d, 0x98, 0xc3, 0xb7, 0x26,
- 0xf7, 0x86, 0xb8, 0x20, 0x8b, 0x09, 0x92, 0xfb, 0x08, 0xcf, 0x15, 0x14, 0x10, 0xc8, 0xe7, 0x0a,
- 0xa2, 0x92, 0xcf, 0x03, 0x18, 0x83, 0x91, 0xdf, 0xef, 0x63, 0x94, 0xf5, 0x62, 0xcc, 0x95, 0x95,
- 0xd3, 0x41, 0x2a, 0x11, 0x12, 0x8f, 0x08, 0x8a, 0xbf, 0xed, 0x44, 0x2c, 0x76, 0x89, 0x96, 0x56,
- 0x85, 0x79, 0xb6, 0x19, 0x31, 0x63, 0x01, 0xcf, 0xc1, 0x24, 0xc5, 0xbb, 0x67, 0x19, 0x0b, 0x38,
- 0x3c, 0x9d, 0xb1, 0x40, 0xaa, 0xa0, 0xdd, 0x83, 0x33, 0x59, 0x1d, 0x8b, 0xbd, 0x8e, 0x95, 0x93,
- 0xbe, 0x8e, 0xbf, 0x9f, 0x87, 0x65, 0xa4, 0x26, 0x4e, 0x61, 0x1d, 0x56, 0xac, 0xc9, 0xa3, 0x30,
- 0x9c, 0x9f, 0x38, 0x8d, 0xb1, 0x7d, 0x81, 0x5c, 0x20, 0xeb, 0xf0, 0x62, 0x35, 0x88, 0x01, 0xab,
- 0xe2, 0x26, 0xd8, 0x15, 0x9e, 0x03, 0x61, 0xb2, 0x00, 0xe1, 0x50, 0x91, 0x4e, 0xc5, 0x9d, 0xa8,
- 0x14, 0xdd, 0x07, 0xf9, 0xa7, 0xb9, 0x0f, 0x0a, 0x27, 0xba, 0x0f, 0x1e, 0xc2, 0xb2, 0xf8, 0x1a,
- 0x9e, 0xe4, 0x73, 0xef, 0xef, 0x24, 0x8f, 0x11, 0x23, 0xb5, 0xf0, 0x44, 0x9f, 0x9f, 0x79, 0xa2,
- 0xa3, 0x62, 0x54, 0xec, 0xb2, 0x21, 0xc2, 0xd2, 0x07, 0x3b, 0xe6, 0xaa, 0xdd, 0x2d, 0xb7, 0x7e,
- 0x89, 0x5b, 0xf2, 0x55, 0x58, 0xac, 0xf9, 0x42, 0x27, 0x26, 0x29, 0x23, 0xfa, 0x02, 0x28, 0xb3,
- 0x0b, 0x21, 0x66, 0x78, 0xbb, 0xe5, 0x3f, 0x88, 0xdb, 0xed, 0x0e, 0x00, 0x77, 0x49, 0x89, 0x72,
- 0x4c, 0xe2, 0x96, 0x11, 0x51, 0x89, 0xe2, 0x3a, 0x11, 0x09, 0x99, 0x9e, 0x4e, 0xdc, 0xdc, 0x46,
- 0xef, 0x76, 0xfd, 0xc9, 0x60, 0x1c, 0x4b, 0xca, 0x2e, 0xbc, 0xd6, 0x1d, 0x5e, 0x26, 0x1f, 0x0f,
- 0x89, 0x6a, 0x1f, 0xec, 0x84, 0x90, 0xcf, 0x85, 0xc6, 0x8f, 0x0b, 0xb3, 0x46, 0x48, 0x4b, 0x8d,
- 0xd0, 0x54, 0x93, 0x47, 0xed, 0x27, 0x8a, 0x9c, 0xa9, 0xe5, 0x97, 0x98, 0xea, 0xd7, 0x01, 0x42,
- 0xa3, 0x04, 0x31, 0xd7, 0xa1, 0x9b, 0x38, 0x83, 0xca, 0xa3, 0x1c, 0xe1, 0x4a, 0xbd, 0xc9, 0x7f,
- 0x50, 0xbd, 0x69, 0xc3, 0x52, 0xf3, 0xcd, 0xb1, 0x13, 0x59, 0xb1, 0x80, 0x15, 0x72, 0xb2, 0x78,
- 0x32, 0xe5, 0xb7, 0x9e, 0xc7, 0xbb, 0x21, 0xe2, 0x83, 0xa7, 0xb0, 0xc0, 0x52, 0x45, 0xed, 0x2f,
- 0x14, 0x58, 0x93, 0x43, 0x6d, 0x1c, 0x0f, 0xba, 0xe4, 0xd3, 0x2c, 0x70, 0xb4, 0x12, 0x7b, 0xb2,
- 0x48, 0x48, 0xf4, 0xc8, 0x3d, 0x1e, 0x74, 0x19, 0x03, 0xe4, 0x3c, 0x96, 0x1b, 0x4b, 0x2b, 0x92,
- 0x47, 0xb0, 0xdc, 0xf2, 0xfb, 0x7d, 0xca, 0xd6, 0x8c, 0xde, 0xe2, 0x0f, 0x00, 0x4a, 0x28, 0xa9,
- 0x1a, 0x11, 0x0d, 0xda, 0x7a, 0x8e, 0xbf, 0x73, 0x37, 0x86, 0xf4, 0xbc, 0xf7, 0x78, 0xbd, 0x88,
- 0xec, 0xdb, 0xe8, 0x1a, 0x28, 0xd3, 0xd4, 0x7e, 0xa6, 0x00, 0x49, 0x37, 0x49, 0x3e, 0xb2, 0x94,
- 0xff, 0x01, 0x16, 0x36, 0xc1, 0xfa, 0x15, 0x9e, 0x86, 0xf5, 0x2b, 0xfd, 0x9e, 0x02, 0x6b, 0x55,
- 0xbd, 0xce, 0x73, 0xb7, 0x30, 0x0d, 0xce, 0x55, 0xb8, 0x54, 0xd5, 0xeb, 0x76, 0xab, 0x59, 0xab,
- 0x96, 0x1f, 0xd8, 0x99, 0x21, 0xd9, 0x2f, 0xc1, 0x33, 0x69, 0x94, 0x48, 0xd3, 0x73, 0x11, 0x36,
- 0xd3, 0xc5, 0x22, 0x6c, 0x7b, 0x76, 0x65, 0x11, 0xe1, 0x3d, 0x5f, 0xfa, 0x0c, 0xac, 0x89, 0x10,
- 0xe5, 0xed, 0x9a, 0x85, 0x49, 0x50, 0xd6, 0x60, 0x69, 0xcf, 0x30, 0xab, 0x3b, 0x0f, 0xec, 0x9d,
- 0x4e, 0xad, 0xa6, 0x9e, 0x22, 0x2b, 0xb0, 0xc8, 0x01, 0x65, 0x5d, 0x55, 0xc8, 0x32, 0x14, 0xab,
- 0x0d, 0xcb, 0x28, 0x77, 0x4c, 0x43, 0xcd, 0x95, 0x3e, 0x03, 0xab, 0xad, 0x91, 0xf7, 0x96, 0x33,
- 0x76, 0xef, 0xb9, 0xc7, 0xa8, 0xa8, 0x59, 0x80, 0xbc, 0xa9, 0xdf, 0x57, 0x4f, 0x11, 0x80, 0xf9,
- 0xd6, 0xbd, 0xb2, 0x75, 0xeb, 0x96, 0xaa, 0x90, 0x25, 0x58, 0xd8, 0x2d, 0xb7, 0xec, 0x7b, 0x75,
- 0x4b, 0xcd, 0xd1, 0x1f, 0xfa, 0x7d, 0x0b, 0x7f, 0xe4, 0x4b, 0x2f, 0xc3, 0x3a, 0x32, 0x24, 0x35,
- 0x2f, 0x18, 0xbb, 0x03, 0x77, 0x84, 0x6d, 0x58, 0x86, 0xa2, 0xe5, 0xd2, 0x93, 0x64, 0xec, 0xb2,
- 0x06, 0xd4, 0x27, 0xfd, 0xb1, 0x37, 0xec, 0xbb, 0x5f, 0x57, 0x95, 0xd2, 0x1d, 0x58, 0x33, 0xfd,
- 0xc9, 0xd8, 0x1b, 0x1c, 0x58, 0x63, 0x8a, 0x71, 0x70, 0x4c, 0xce, 0xc2, 0x7a, 0xa7, 0xa1, 0xd7,
- 0xb7, 0xaa, 0xbb, 0x9d, 0x66, 0xc7, 0xb2, 0xeb, 0x7a, 0xbb, 0x5c, 0x61, 0x6a, 0xa2, 0x7a, 0xd3,
- 0x6a, 0xdb, 0xa6, 0x51, 0x36, 0x1a, 0x6d, 0x55, 0x29, 0x7d, 0x17, 0x65, 0x2b, 0x5d, 0x7f, 0xd0,
- 0xdb, 0x71, 0xba, 0x63, 0x7f, 0x84, 0x0d, 0xd6, 0xe0, 0xb2, 0x65, 0x94, 0x9b, 0x8d, 0x6d, 0x7b,
- 0x47, 0x2f, 0xb7, 0x9b, 0x66, 0x56, 0x4e, 0x80, 0xf3, 0x70, 0x2e, 0x03, 0xa7, 0xd9, 0x6e, 0xa9,
- 0x0a, 0xb9, 0x02, 0x17, 0x32, 0xca, 0xee, 0x1b, 0x5b, 0x7a, 0xa7, 0x5d, 0x69, 0xa8, 0xb9, 0x29,
- 0x95, 0x2d, 0xab, 0xa9, 0xe6, 0x4b, 0xbf, 0xa5, 0xc0, 0x6a, 0x27, 0xe0, 0x26, 0xe7, 0x1d, 0x74,
- 0xb0, 0x7d, 0x16, 0x2e, 0x76, 0x2c, 0xc3, 0xb4, 0xdb, 0xcd, 0x7b, 0x46, 0xc3, 0xee, 0x58, 0xfa,
- 0x6e, 0xb2, 0x35, 0x57, 0xe0, 0x82, 0x84, 0x61, 0x1a, 0xe5, 0xe6, 0x9e, 0x61, 0xda, 0x2d, 0xdd,
- 0xb2, 0xee, 0x37, 0xcd, 0x6d, 0x55, 0xa1, 0x5f, 0xcc, 0x40, 0xa8, 0xef, 0xe8, 0xac, 0x35, 0xb1,
- 0xb2, 0x86, 0x71, 0x5f, 0xaf, 0xd9, 0x5b, 0xcd, 0xb6, 0x9a, 0x2f, 0xd5, 0xe9, 0xfd, 0x8e, 0x91,
- 0xb9, 0x99, 0x65, 0x61, 0x11, 0x0a, 0x8d, 0x66, 0xc3, 0x48, 0x2a, 0x17, 0x97, 0xa1, 0xa8, 0xb7,
- 0x5a, 0x66, 0x73, 0x0f, 0x97, 0x18, 0xc0, 0xfc, 0xb6, 0xd1, 0xa0, 0x2d, 0xcb, 0xd3, 0x92, 0x96,
- 0xd9, 0xac, 0x37, 0xdb, 0xc6, 0xb6, 0x5a, 0x28, 0x99, 0x62, 0x0b, 0x0b, 0xa2, 0x5d, 0x9f, 0x69,
- 0xf2, 0xb6, 0x8d, 0x1d, 0xbd, 0x53, 0x6b, 0xf3, 0x29, 0x7a, 0x60, 0x9b, 0xc6, 0xe7, 0x3a, 0x86,
- 0xd5, 0xb6, 0x54, 0x85, 0xa8, 0xb0, 0xdc, 0x30, 0x8c, 0x6d, 0xcb, 0x36, 0x8d, 0xbd, 0xaa, 0x71,
- 0x5f, 0xcd, 0x51, 0x9a, 0xec, 0x7f, 0xfa, 0x85, 0xd2, 0x3b, 0x0a, 0x10, 0x16, 0xd5, 0x5c, 0xa4,
- 0xca, 0xc2, 0x15, 0x73, 0x19, 0xce, 0x57, 0xe8, 0x54, 0x63, 0xd7, 0xea, 0xcd, 0xed, 0xe4, 0x90,
- 0x9d, 0x03, 0x92, 0x28, 0x6f, 0xee, 0xec, 0xa8, 0x0a, 0xb9, 0x00, 0xa7, 0x13, 0xf0, 0x6d, 0xb3,
- 0xd9, 0x52, 0x73, 0xe7, 0x73, 0x45, 0x85, 0x6c, 0xa4, 0x0a, 0xef, 0x19, 0x46, 0x4b, 0xcd, 0xd3,
- 0x29, 0x4a, 0x14, 0x88, 0x2d, 0xc1, 0xaa, 0x17, 0x4a, 0xdf, 0x56, 0xe0, 0x1c, 0x6b, 0xa6, 0xd8,
- 0x5f, 0x61, 0x53, 0x2f, 0xc2, 0x26, 0xcf, 0xd5, 0x90, 0xd5, 0xd0, 0x33, 0xa0, 0xc6, 0x4a, 0x59,
- 0x33, 0xcf, 0xc2, 0x7a, 0x0c, 0x8a, 0xed, 0xc8, 0xd1, 0xd3, 0x23, 0x06, 0xde, 0x32, 0xac, 0xb6,
- 0x6d, 0xec, 0xec, 0x34, 0xcd, 0x36, 0x6b, 0x48, 0xbe, 0xa4, 0xc1, 0x7a, 0xd9, 0x1d, 0x8d, 0xe9,
- 0xd3, 0x6b, 0x10, 0x78, 0xfe, 0x00, 0x9b, 0xb0, 0x02, 0x8b, 0xc6, 0xe7, 0xdb, 0x46, 0xc3, 0xaa,
- 0x36, 0x1b, 0xea, 0xa9, 0xd2, 0xc5, 0x04, 0x8e, 0xd8, 0xc7, 0x96, 0x55, 0x51, 0x4f, 0x95, 0x1c,
- 0x58, 0x11, 0x86, 0xd7, 0x6c, 0x55, 0x5c, 0x86, 0xf3, 0x62, 0xad, 0xe1, 0x89, 0x92, 0xec, 0xc2,
- 0x26, 0x9c, 0x49, 0x97, 0x1b, 0x6d, 0x55, 0xa1, 0xb3, 0x90, 0x28, 0xa1, 0xf0, 0x5c, 0xe9, 0xff,
- 0x2b, 0xb0, 0x12, 0x2a, 0x4d, 0x50, 0x4c, 0x7b, 0x05, 0x2e, 0xd4, 0x77, 0x74, 0x7b, 0xdb, 0xd8,
- 0xab, 0x96, 0x0d, 0xfb, 0x5e, 0xb5, 0xb1, 0x9d, 0xf8, 0xc8, 0x33, 0x70, 0x36, 0x03, 0x01, 0xbf,
- 0xb2, 0x09, 0x67, 0x92, 0x45, 0x6d, 0xba, 0x55, 0x73, 0x74, 0xe8, 0x93, 0x25, 0xe1, 0x3e, 0xcd,
- 0x97, 0xf6, 0x60, 0xd5, 0xd2, 0xeb, 0xb5, 0x1d, 0x7f, 0xd4, 0x75, 0xf5, 0xc9, 0xf8, 0x70, 0x40,
- 0x2e, 0xc0, 0xc6, 0x4e, 0xd3, 0x2c, 0x1b, 0x36, 0xa2, 0x24, 0x5a, 0x70, 0x1a, 0xd6, 0xe4, 0xc2,
- 0x07, 0x06, 0x5d, 0xbe, 0x04, 0x56, 0x65, 0x60, 0xa3, 0xa9, 0xe6, 0x4a, 0x5f, 0x84, 0xe5, 0x58,
- 0xc6, 0xcc, 0x0d, 0x38, 0x2d, 0xff, 0x6e, 0xb9, 0x83, 0x9e, 0x37, 0x38, 0x50, 0x4f, 0x25, 0x0b,
- 0xcc, 0xc9, 0x60, 0x40, 0x0b, 0x70, 0x3f, 0xcb, 0x05, 0x6d, 0x77, 0x74, 0xe4, 0x0d, 0x9c, 0xb1,
- 0xdb, 0x53, 0x73, 0xa5, 0x97, 0x60, 0x25, 0x16, 0xa7, 0x9f, 0x4e, 0x5c, 0xad, 0xc9, 0x0f, 0xe0,
- 0xba, 0xb1, 0x5d, 0xed, 0xd4, 0xd5, 0x39, 0xba, 0x93, 0x2b, 0xd5, 0xdd, 0x8a, 0x0a, 0xa5, 0xef,
- 0x29, 0xf4, 0x9d, 0x81, 0xd9, 0xb7, 0xea, 0x3b, 0xba, 0x98, 0x6a, 0xba, 0xcc, 0x58, 0xf6, 0x0f,
- 0xc3, 0xb2, 0x98, 0x4e, 0xfd, 0x22, 0x6c, 0xf2, 0x1f, 0xb6, 0xde, 0xd8, 0xb6, 0x2b, 0xba, 0xb9,
- 0x7d, 0x5f, 0x37, 0xe9, 0xda, 0x7b, 0xa0, 0xe6, 0x70, 0x43, 0x49, 0x10, 0xbb, 0xdd, 0xec, 0x94,
- 0x2b, 0x6a, 0x9e, 0xae, 0xdf, 0x18, 0xbc, 0x55, 0x6d, 0xa8, 0x05, 0xdc, 0x9e, 0x29, 0x6c, 0x24,
- 0x4b, 0xcb, 0xe7, 0x4a, 0xef, 0x29, 0xb0, 0x61, 0x79, 0x07, 0x03, 0x67, 0x3c, 0x19, 0xb9, 0x7a,
- 0xff, 0xc0, 0x1f, 0x79, 0xe3, 0xc3, 0x23, 0x6b, 0xe2, 0x8d, 0x5d, 0x72, 0x13, 0x9e, 0xb7, 0xaa,
- 0xbb, 0x0d, 0xbd, 0x4d, 0xb7, 0x97, 0x5e, 0xdb, 0x6d, 0x9a, 0xd5, 0x76, 0xa5, 0x6e, 0x5b, 0x9d,
- 0x6a, 0x6a, 0xe5, 0x5d, 0x83, 0x67, 0xa7, 0xa3, 0xd6, 0x8c, 0x5d, 0xbd, 0xfc, 0x40, 0x55, 0x66,
- 0x13, 0xdc, 0xd2, 0x6b, 0x7a, 0xa3, 0x6c, 0x6c, 0xdb, 0x7b, 0xb7, 0xd4, 0x1c, 0x79, 0x1e, 0xae,
- 0x4e, 0x47, 0xdd, 0xa9, 0xb6, 0x2c, 0x8a, 0x96, 0x9f, 0xfd, 0xdd, 0x8a, 0x55, 0xa7, 0x58, 0x85,
- 0xd2, 0x9f, 0x28, 0xb0, 0x39, 0x2d, 0xee, 0x1a, 0xb9, 0x0e, 0x9a, 0xd1, 0x68, 0x9b, 0x7a, 0x75,
- 0xdb, 0x2e, 0x9b, 0xc6, 0xb6, 0xd1, 0x68, 0x57, 0xf5, 0x9a, 0x65, 0x5b, 0xcd, 0x0e, 0x5d, 0x4d,
- 0x91, 0xe9, 0xc3, 0x73, 0x70, 0x65, 0x06, 0x5e, 0xb3, 0xba, 0x5d, 0x56, 0x15, 0x72, 0x0b, 0x5e,
- 0x9c, 0x81, 0x64, 0x3d, 0xb0, 0xda, 0x46, 0x5d, 0x2e, 0x51, 0x73, 0x78, 0x60, 0x65, 0x87, 0x9d,
- 0xa2, 0xbd, 0xc3, 0x92, 0xd9, 0x0d, 0xbb, 0x0a, 0x97, 0xa6, 0x62, 0xf1, 0x66, 0x3d, 0x07, 0x57,
- 0xa6, 0xa2, 0xb0, 0x46, 0xa9, 0xb9, 0x52, 0x19, 0xce, 0x4f, 0x8f, 0xe3, 0x43, 0xef, 0x8b, 0xf8,
- 0x94, 0x17, 0xa1, 0xb0, 0x4d, 0xaf, 0xa8, 0x58, 0xb6, 0x9a, 0x92, 0x07, 0x6a, 0x32, 0xc6, 0x45,
- 0xca, 0x58, 0xc6, 0xec, 0x34, 0x1a, 0xec, 0x3e, 0x5b, 0x83, 0xa5, 0x66, 0xbb, 0x62, 0x98, 0x3c,
- 0xdf, 0x0f, 0x26, 0xf8, 0xe9, 0x34, 0xe8, 0x0e, 0x6e, 0x9a, 0xd5, 0x2f, 0xe0, 0xc5, 0xb6, 0x09,
- 0x67, 0xac, 0x9a, 0x5e, 0xbe, 0x67, 0x37, 0x9a, 0x6d, 0xbb, 0xda, 0xb0, 0xcb, 0x15, 0xbd, 0xd1,
- 0x30, 0x6a, 0x2a, 0xe0, 0xac, 0x4e, 0x73, 0xf2, 0x24, 0x1f, 0x85, 0x1b, 0xcd, 0x7b, 0x6d, 0xdd,
- 0x6e, 0xd5, 0x3a, 0xbb, 0xd5, 0x86, 0x6d, 0x3d, 0x68, 0x94, 0x05, 0x13, 0x56, 0x4e, 0x9f, 0xfd,
- 0x37, 0xe0, 0xda, 0x4c, 0xec, 0x28, 0x33, 0xcf, 0x75, 0xd0, 0x66, 0x62, 0xf2, 0x8e, 0x94, 0x7e,
- 0xaa, 0xc0, 0x85, 0x19, 0xca, 0x6c, 0xf2, 0x22, 0xdc, 0xac, 0x18, 0xfa, 0x76, 0xcd, 0xb0, 0x2c,
- 0x3c, 0xb1, 0xe8, 0xa4, 0x30, 0xa3, 0x9a, 0xcc, 0x93, 0xfd, 0x26, 0x3c, 0x3f, 0x1b, 0x3d, 0xe2,
- 0x11, 0x6e, 0xc0, 0xb5, 0xd9, 0xa8, 0x9c, 0x67, 0xc8, 0x91, 0x12, 0x5c, 0x9f, 0x8d, 0x19, 0xf2,
- 0x1a, 0xf9, 0xd2, 0xef, 0x28, 0x70, 0x2e, 0x5b, 0xa2, 0x44, 0xdb, 0x56, 0x6d, 0x58, 0x6d, 0xbd,
- 0x56, 0xb3, 0x5b, 0xba, 0xa9, 0xd7, 0x6d, 0xa3, 0x61, 0x36, 0x6b, 0xb5, 0xac, 0x3b, 0xf6, 0x1a,
- 0x3c, 0x3b, 0x1d, 0xd5, 0x2a, 0x9b, 0xd5, 0x16, 0xbd, 0x46, 0x34, 0xb8, 0x3c, 0x1d, 0xcb, 0xa8,
- 0x96, 0x0d, 0x35, 0xb7, 0xf5, 0xc6, 0x8f, 0xff, 0xe1, 0xf2, 0xa9, 0x1f, 0xbf, 0x77, 0x59, 0xf9,
- 0xd9, 0x7b, 0x97, 0x95, 0xbf, 0x7f, 0xef, 0xb2, 0xf2, 0x85, 0x17, 0x4e, 0x96, 0xd4, 0x0e, 0x1f,
- 0x20, 0x8f, 0xe6, 0xf1, 0xa9, 0xf4, 0xca, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x77, 0xde, 0xcd,
- 0x5e, 0x9a, 0xc2, 0x01, 0x00,
+ 0xf5, 0xdb, 0x73, 0xc8, 0xc2, 0xff, 0xc7, 0xde, 0xb7, 0xf5, 0x46, 0x72, 0x5c, 0x07, 0x6f, 0xcf,
+ 0x0c, 0xc9, 0xe1, 0xe1, 0xad, 0x59, 0xcb, 0x5d, 0x52, 0x7b, 0xd5, 0xb6, 0x56, 0xeb, 0xdd, 0x91,
+ 0x25, 0x6b, 0x57, 0x9f, 0x2c, 0xc9, 0xb6, 0x6c, 0x37, 0x87, 0x4d, 0xce, 0xec, 0xce, 0xcd, 0xdd,
+ 0x33, 0x5c, 0xaf, 0x65, 0xbb, 0xdd, 0x3b, 0xd3, 0x24, 0xdb, 0x1a, 0x4e, 0x8f, 0xa7, 0x67, 0xb4,
+ 0xa6, 0xf1, 0x01, 0x9f, 0x8d, 0x0f, 0x9f, 0x0d, 0x7c, 0xb9, 0x38, 0x71, 0x12, 0x44, 0xf0, 0x8b,
+ 0x1f, 0x22, 0x04, 0x79, 0xf0, 0x0f, 0x08, 0xe2, 0x27, 0xbf, 0x19, 0x30, 0x0c, 0x18, 0xc8, 0x9b,
+ 0x13, 0x28, 0x89, 0x80, 0x04, 0xc8, 0xe5, 0x2d, 0x48, 0x1e, 0x0c, 0x04, 0x08, 0xea, 0x54, 0x55,
+ 0x77, 0xf5, 0x65, 0x66, 0xb9, 0x96, 0x94, 0xc4, 0x80, 0x9f, 0xc8, 0x39, 0x75, 0xea, 0x74, 0xdd,
+ 0xeb, 0xd4, 0xb9, 0x42, 0x71, 0x38, 0xf2, 0x7c, 0xe4, 0x6d, 0x79, 0x8a, 0x06, 0xf1, 0x1b, 0xb3,
+ 0x2f, 0x20, 0x13, 0x36, 0x76, 0x0e, 0xb9, 0x57, 0x88, 0xb9, 0x88, 0x90, 0xb6, 0x73, 0x18, 0x90,
+ 0xe7, 0x60, 0xbd, 0xe7, 0x1e, 0x38, 0x93, 0xfe, 0xd8, 0x0e, 0xba, 0x47, 0x6e, 0x0f, 0xfd, 0xb6,
+ 0xd0, 0xda, 0xcf, 0x54, 0x79, 0x81, 0x25, 0xe0, 0xa9, 0x16, 0xcf, 0x4d, 0x69, 0xf1, 0xdd, 0x42,
+ 0x51, 0x51, 0x73, 0x26, 0x9a, 0x57, 0x69, 0xdf, 0xcc, 0xc1, 0xd6, 0xb4, 0x4d, 0x46, 0x5e, 0xcf,
+ 0x1a, 0x03, 0xa6, 0xed, 0x90, 0xe1, 0xb2, 0xb6, 0x43, 0xfa, 0x1a, 0xb9, 0x03, 0xa1, 0xd7, 0xd5,
+ 0xe3, 0x22, 0x28, 0x08, 0x18, 0xad, 0x33, 0x74, 0x82, 0xe0, 0x11, 0x3d, 0x47, 0xf2, 0x52, 0x14,
+ 0x5e, 0x0e, 0x93, 0xeb, 0x08, 0x18, 0x79, 0x05, 0xa0, 0xdb, 0xf7, 0x03, 0x17, 0x8d, 0x0a, 0x38,
+ 0x83, 0xc2, 0x6c, 0xc9, 0x43, 0xa8, 0xac, 0x45, 0x46, 0x68, 0xd9, 0xef, 0xb9, 0x7c, 0x02, 0x1d,
+ 0xd8, 0x9c, 0x72, 0xaa, 0xd2, 0xe9, 0x89, 0x52, 0xda, 0x8b, 0x04, 0x59, 0x93, 0x30, 0xb1, 0x7d,
+ 0x72, 0xc4, 0x73, 0xd3, 0xd6, 0xc8, 0x09, 0x90, 0xf4, 0xd1, 0x49, 0xa9, 0x73, 0x8b, 0xe8, 0xc9,
+ 0x28, 0xa4, 0xce, 0x20, 0x9d, 0x51, 0x9f, 0x5c, 0x85, 0x25, 0x91, 0x00, 0x93, 0x3e, 0x00, 0x18,
+ 0x71, 0xe0, 0xa0, 0x7b, 0x2e, 0x2e, 0x1e, 0x0c, 0xb3, 0x8a, 0xbe, 0x75, 0x9c, 0xb5, 0x58, 0x44,
+ 0x48, 0xfb, 0x64, 0x28, 0x7a, 0x77, 0x49, 0xac, 0xef, 0xf8, 0x85, 0xc6, 0x4b, 0xff, 0x48, 0x11,
+ 0xd3, 0x9f, 0xbe, 0x11, 0x1e, 0xd7, 0x3e, 0x02, 0xe8, 0xda, 0xc4, 0x1b, 0x86, 0xff, 0x53, 0x56,
+ 0x47, 0xec, 0x3a, 0xce, 0xea, 0xf0, 0x9f, 0xe4, 0x06, 0xac, 0x8d, 0x98, 0xf1, 0xeb, 0xd8, 0xe7,
+ 0xe3, 0xc9, 0x92, 0x8d, 0xac, 0x30, 0x70, 0xdb, 0xc7, 0x31, 0xe5, 0xed, 0xba, 0x1b, 0x0e, 0x98,
+ 0x74, 0x41, 0x92, 0x17, 0x60, 0x91, 0x5e, 0x90, 0x18, 0x9e, 0x27, 0xe1, 0x53, 0x81, 0x78, 0xc8,
+ 0x6e, 0x98, 0xc5, 0xaf, 0xf2, 0xff, 0x39, 0xad, 0xb7, 0x73, 0x82, 0x98, 0x7c, 0x3d, 0x93, 0x4d,
+ 0x58, 0xf0, 0x47, 0x87, 0x52, 0xd7, 0xe6, 0xfd, 0xd1, 0x21, 0xed, 0xd7, 0x4d, 0x50, 0x99, 0x8b,
+ 0x0f, 0x0b, 0xb5, 0x10, 0x9c, 0x0c, 0xd8, 0xfb, 0xbd, 0x68, 0xae, 0x32, 0x38, 0x66, 0xf9, 0x3f,
+ 0x19, 0x74, 0x29, 0x66, 0x10, 0xf8, 0xb6, 0x1c, 0x95, 0x8b, 0x77, 0x7b, 0x35, 0x08, 0xfc, 0x28,
+ 0x3c, 0x57, 0x8f, 0x6c, 0xc3, 0x0a, 0xa5, 0x13, 0xc6, 0x06, 0xe3, 0xdc, 0xc3, 0xe5, 0x34, 0xf7,
+ 0x70, 0x32, 0xe8, 0x8a, 0x26, 0x9a, 0xcb, 0x81, 0xf4, 0x8b, 0xdc, 0x03, 0x55, 0x62, 0xb3, 0xd0,
+ 0xe7, 0x33, 0x61, 0x88, 0x1d, 0x91, 0x91, 0xd8, 0xb3, 0xea, 0xe0, 0xc0, 0x37, 0xd7, 0xba, 0x71,
+ 0x00, 0x1f, 0x9a, 0x1f, 0x28, 0xe2, 0x2c, 0xcd, 0xa8, 0x44, 0x34, 0x58, 0x39, 0x72, 0x02, 0x3b,
+ 0x08, 0x8e, 0x99, 0x61, 0x19, 0x8f, 0x46, 0xbc, 0x74, 0xe4, 0x04, 0x56, 0x70, 0x2c, 0xb2, 0x9d,
+ 0x9c, 0xa3, 0x38, 0xbe, 0x33, 0x19, 0x1f, 0xd9, 0x32, 0xd3, 0xc8, 0x46, 0xec, 0xec, 0x91, 0x13,
+ 0x34, 0x69, 0x99, 0x44, 0x9b, 0x5c, 0x87, 0x55, 0xa4, 0xdb, 0xf5, 0x04, 0x61, 0x0c, 0x97, 0x61,
+ 0x2e, 0x53, 0xc2, 0x5d, 0x8f, 0x51, 0xe6, 0x2d, 0xfc, 0xc7, 0x1c, 0x9c, 0xcf, 0x1e, 0x1d, 0x5c,
+ 0x9e, 0x74, 0x4c, 0xd1, 0xb1, 0x8f, 0xb7, 0x6d, 0x91, 0x42, 0x58, 0xa8, 0x93, 0xac, 0xc9, 0xc9,
+ 0x65, 0x4e, 0x4e, 0x09, 0xd6, 0x91, 0x10, 0x67, 0x4f, 0xfb, 0x5e, 0x30, 0xe6, 0x11, 0x3c, 0xcc,
+ 0x35, 0x5a, 0xc0, 0xce, 0xf3, 0x1a, 0x05, 0x93, 0x67, 0x61, 0x55, 0x9c, 0xc8, 0xfe, 0xa3, 0x01,
+ 0xfd, 0x30, 0x3b, 0x8e, 0x57, 0x38, 0xb4, 0x89, 0x40, 0x72, 0x0e, 0xe6, 0x9d, 0xe1, 0x90, 0x7e,
+ 0x92, 0x9d, 0xc2, 0x73, 0xce, 0x70, 0xc8, 0x32, 0xf2, 0xa0, 0x1b, 0xa3, 0x7d, 0x80, 0xa6, 0x45,
+ 0xdc, 0x8e, 0xd1, 0x5c, 0x46, 0x20, 0x33, 0x37, 0x0a, 0xe8, 0xbe, 0xa7, 0x75, 0x05, 0xca, 0x02,
+ 0xa2, 0x80, 0x33, 0x0c, 0x11, 0x9e, 0x82, 0xa2, 0x50, 0x72, 0x33, 0x6f, 0x0c, 0x73, 0xc1, 0xe1,
+ 0x0a, 0xee, 0x97, 0x61, 0xb3, 0xe7, 0x05, 0xb8, 0x78, 0x59, 0x97, 0x86, 0x43, 0xee, 0x38, 0xc9,
+ 0x22, 0xfb, 0x9a, 0x1b, 0xbc, 0x98, 0x8e, 0xa4, 0x3e, 0x1c, 0x32, 0xf7, 0x49, 0x3e, 0xd6, 0xaf,
+ 0xc2, 0x1a, 0x67, 0xd3, 0xf8, 0x15, 0x89, 0x6d, 0xe1, 0x1b, 0x98, 0xbe, 0x9f, 0x78, 0x0e, 0x24,
+ 0xe0, 0xa0, 0x6a, 0x4f, 0xd4, 0xfc, 0x6b, 0x05, 0xce, 0x65, 0xf2, 0x79, 0xe4, 0x2b, 0xc0, 0xfc,
+ 0xc4, 0xc6, 0xbe, 0x3d, 0x72, 0xbb, 0xde, 0xd0, 0xc3, 0xc0, 0x1b, 0x4c, 0x0e, 0x7a, 0x67, 0x16,
+ 0x87, 0x88, 0x3e, 0x67, 0x6d, 0xdf, 0x0c, 0x2b, 0x31, 0x01, 0x8d, 0x3a, 0x4a, 0x80, 0x2f, 0xbc,
+ 0x01, 0xe7, 0x32, 0x51, 0x33, 0x04, 0x27, 0x1f, 0x8d, 0x67, 0xa0, 0x16, 0x9a, 0xad, 0x44, 0xa7,
+ 0x25, 0x81, 0x0a, 0xef, 0xde, 0x8f, 0xc3, 0xee, 0x25, 0x38, 0x42, 0x62, 0x24, 0xf7, 0x75, 0xd6,
+ 0xa3, 0x46, 0x54, 0x9a, 0xbe, 0xb5, 0xdf, 0x80, 0x73, 0x7c, 0xf1, 0x1d, 0x8e, 0x9c, 0xe1, 0x51,
+ 0x44, 0x8e, 0x35, 0xf4, 0x23, 0x59, 0xe4, 0xd8, 0xaa, 0xdc, 0xa3, 0xf8, 0x21, 0xd5, 0xb3, 0x4e,
+ 0x1a, 0xc8, 0xfb, 0xf0, 0xad, 0x9c, 0xd8, 0xea, 0x19, 0xcd, 0xc9, 0x58, 0xd6, 0x4a, 0xd6, 0xb2,
+ 0x3e, 0xfd, 0x9e, 0x6a, 0x00, 0x91, 0x0f, 0x2b, 0x26, 0x2a, 0xe5, 0x56, 0x58, 0x82, 0xb9, 0xe7,
+ 0x0d, 0x91, 0x8e, 0x06, 0x8b, 0x65, 0x00, 0x5d, 0xef, 0x26, 0x41, 0xe4, 0x22, 0x2c, 0x86, 0x49,
+ 0xb6, 0xf9, 0xc5, 0x51, 0x64, 0x80, 0x6a, 0x8f, 0x3c, 0x0d, 0xcb, 0x8c, 0x8f, 0x8f, 0xed, 0x39,
+ 0x40, 0x98, 0x4e, 0x37, 0x9e, 0x18, 0x03, 0x05, 0x9e, 0x7e, 0xdc, 0x18, 0x92, 0xfb, 0x70, 0x1e,
+ 0x6d, 0x41, 0x02, 0x3f, 0x9c, 0x06, 0xbb, 0xeb, 0x74, 0x8f, 0x5c, 0xbe, 0x6a, 0xb5, 0xcc, 0xc9,
+ 0x18, 0x0e, 0x2d, 0xab, 0x29, 0xcd, 0xc3, 0x70, 0x68, 0x05, 0xbe, 0xf8, 0x5d, 0xa6, 0xd5, 0x79,
+ 0x1b, 0x7a, 0x70, 0x71, 0x46, 0x4d, 0xe9, 0xe0, 0x50, 0xe4, 0x83, 0xe3, 0x26, 0xa8, 0x07, 0x6e,
+ 0x8f, 0xf2, 0xc4, 0x6e, 0x0f, 0x9b, 0xf6, 0xd6, 0x1d, 0x96, 0x56, 0xde, 0x5c, 0x0d, 0xe1, 0x56,
+ 0xe0, 0xef, 0xdf, 0xe1, 0x5f, 0x39, 0x16, 0x57, 0x9e, 0xfc, 0x16, 0x21, 0x2f, 0xc0, 0xd9, 0x44,
+ 0x50, 0x93, 0xc8, 0x4b, 0xde, 0x5c, 0xa7, 0x45, 0xf1, 0x10, 0x58, 0xd7, 0x60, 0x59, 0xac, 0x8a,
+ 0x51, 0xe8, 0x3c, 0x67, 0x2e, 0x71, 0x18, 0xdd, 0x75, 0xfc, 0x73, 0x13, 0xd1, 0xa9, 0xcc, 0x67,
+ 0xcc, 0x29, 0x78, 0x69, 0xf2, 0x3c, 0x90, 0x90, 0x6f, 0x0f, 0x0f, 0x0a, 0xfe, 0xc1, 0x75, 0x51,
+ 0x12, 0xee, 0x70, 0xfe, 0xd9, 0xbf, 0x29, 0xc0, 0xd9, 0x8c, 0xf7, 0x0f, 0x7d, 0x04, 0x78, 0x83,
+ 0xb1, 0x7b, 0xc8, 0x9e, 0x10, 0x72, 0x27, 0xd7, 0x24, 0x38, 0x17, 0x6a, 0xcd, 0xb3, 0xb4, 0xe9,
+ 0xfc, 0x5b, 0xfc, 0x17, 0x3d, 0x3c, 0x9c, 0x91, 0x90, 0xd7, 0xd0, 0x7f, 0x49, 0x15, 0xd6, 0x31,
+ 0x17, 0x44, 0xe0, 0xf9, 0x98, 0x52, 0x02, 0x99, 0x90, 0x42, 0xec, 0x85, 0x84, 0xad, 0x68, 0x49,
+ 0x48, 0x94, 0x0b, 0x31, 0xd5, 0x61, 0x02, 0x42, 0x3e, 0x09, 0x17, 0xa4, 0xbb, 0xc6, 0x4e, 0xec,
+ 0x3c, 0x34, 0x8f, 0x37, 0x37, 0x9d, 0xf0, 0xd6, 0xd9, 0x89, 0xed, 0xc1, 0x6d, 0xb8, 0x82, 0x93,
+ 0xe8, 0xf5, 0x86, 0x76, 0x2a, 0x79, 0x08, 0x76, 0x95, 0x45, 0xdb, 0xbf, 0x40, 0xb1, 0xaa, 0xbd,
+ 0x61, 0x22, 0x8f, 0x08, 0xf6, 0xba, 0x96, 0xb9, 0x3b, 0x17, 0x70, 0x77, 0x5e, 0x96, 0x3b, 0x73,
+ 0xaa, 0xbd, 0x79, 0x08, 0xeb, 0x21, 0xa7, 0x14, 0x5e, 0x5b, 0xc5, 0x58, 0x0a, 0x75, 0x24, 0x26,
+ 0xf8, 0x26, 0x76, 0x8f, 0x31, 0x07, 0xff, 0x54, 0x45, 0x39, 0x8c, 0xc5, 0x24, 0x56, 0x21, 0x20,
+ 0x5f, 0x05, 0xc2, 0xae, 0xcf, 0xd8, 0x97, 0x20, 0xfd, 0x25, 0xa1, 0x9b, 0xe1, 0x5f, 0x62, 0x19,
+ 0x2a, 0x53, 0x35, 0xe5, 0xf0, 0x59, 0x58, 0x2a, 0x7d, 0x8b, 0xaf, 0xb0, 0xff, 0xa7, 0xc0, 0xd9,
+ 0x0c, 0x8a, 0x44, 0x83, 0x9c, 0xd8, 0xa2, 0x69, 0xbb, 0xa0, 0xca, 0x19, 0x33, 0xe7, 0xf5, 0xc8,
+ 0x6b, 0x00, 0x98, 0xd9, 0x71, 0xe4, 0x1e, 0xba, 0x5f, 0x97, 0xd3, 0xda, 0x47, 0xd0, 0x58, 0x9d,
+ 0x45, 0x94, 0xb5, 0x52, 0x30, 0x7f, 0xf4, 0x2e, 0xc2, 0x82, 0x37, 0xe8, 0xf6, 0x27, 0x3d, 0x57,
+ 0xfb, 0xa1, 0x68, 0x47, 0x7c, 0x0c, 0x49, 0x1b, 0xb8, 0x42, 0x8e, 0x8f, 0xf7, 0x8d, 0xe9, 0xe3,
+ 0x2d, 0xeb, 0x39, 0x78, 0x38, 0x06, 0x04, 0xc8, 0xd2, 0x7c, 0x06, 0x79, 0x1f, 0x1a, 0x08, 0x3e,
+ 0x6c, 0x6f, 0xc0, 0xb9, 0xcc, 0xbd, 0x40, 0x59, 0x17, 0xb4, 0xeb, 0x8b, 0xb8, 0xee, 0x05, 0xfa,
+ 0x9b, 0xb2, 0xdd, 0xd7, 0x60, 0xf9, 0xa1, 0xeb, 0x8c, 0xdc, 0x11, 0xe7, 0x09, 0xf9, 0x61, 0xc3,
+ 0x60, 0x32, 0x4b, 0xd8, 0x8b, 0x6f, 0x7a, 0x2e, 0xc2, 0x24, 0x75, 0x38, 0xcb, 0xa6, 0xd8, 0x3b,
+ 0xc6, 0x67, 0x06, 0x17, 0x7b, 0x2a, 0x31, 0x46, 0x1b, 0xab, 0x20, 0xd3, 0x53, 0x45, 0x2c, 0x56,
+ 0xdb, 0x5c, 0x3f, 0x4c, 0x82, 0xe8, 0x5d, 0x71, 0x3e, 0x1b, 0x9b, 0x6c, 0xc3, 0x12, 0x23, 0xce,
+ 0x1e, 0x9c, 0x4c, 0x5f, 0x75, 0x6d, 0xe6, 0x17, 0xca, 0x68, 0xee, 0x1e, 0x84, 0xff, 0x53, 0x4e,
+ 0x10, 0x4d, 0x03, 0xec, 0x63, 0x59, 0x1d, 0x67, 0x2e, 0x23, 0x90, 0xab, 0xe1, 0xb4, 0xbf, 0x54,
+ 0x44, 0x57, 0x63, 0xb2, 0x1a, 0x7a, 0x68, 0x05, 0xee, 0x40, 0xa8, 0x24, 0x17, 0x4d, 0xfe, 0xeb,
+ 0x09, 0x0f, 0x51, 0xf2, 0x0a, 0x2c, 0x53, 0xb2, 0x87, 0x93, 0x01, 0x3b, 0xcc, 0xf2, 0xb1, 0x30,
+ 0x51, 0x75, 0x56, 0x44, 0xa7, 0xad, 0x72, 0xc6, 0x5c, 0x3a, 0x8e, 0x7e, 0xd2, 0x77, 0x58, 0x70,
+ 0x3c, 0x1e, 0xca, 0x47, 0xa0, 0x90, 0x5b, 0x5b, 0xf5, 0x76, 0x8b, 0x57, 0x29, 0x52, 0x9c, 0xe8,
+ 0x1d, 0xb6, 0x3d, 0xcf, 0x24, 0xd7, 0xda, 0x73, 0xb0, 0x24, 0xd1, 0xa6, 0x9d, 0x61, 0x8e, 0x5c,
+ 0xa2, 0x33, 0xec, 0x17, 0x9f, 0xec, 0x87, 0x50, 0x14, 0x24, 0xe9, 0x83, 0xf3, 0xc8, 0x0f, 0xc4,
+ 0xf5, 0x81, 0xff, 0x53, 0x18, 0x1d, 0x65, 0xec, 0xe4, 0x9c, 0x89, 0xff, 0x23, 0x97, 0x32, 0x76,
+ 0xe8, 0x4b, 0xb3, 0x1f, 0xd8, 0x43, 0x34, 0x08, 0x0c, 0x9f, 0x65, 0x14, 0xde, 0xee, 0x07, 0xcc,
+ 0x4c, 0x90, 0x7f, 0xe3, 0xcf, 0x43, 0xf6, 0x2e, 0x21, 0xdc, 0x9a, 0x76, 0x1b, 0xc7, 0x98, 0x91,
+ 0x5c, 0x9a, 0x19, 0x61, 0xe1, 0x7f, 0x78, 0x4d, 0xf6, 0x65, 0x40, 0x18, 0x32, 0x23, 0xd2, 0x9d,
+ 0x53, 0x88, 0xdd, 0x39, 0x92, 0xb4, 0x27, 0x9a, 0x3d, 0xc6, 0xcb, 0x08, 0x69, 0x4f, 0xf2, 0x06,
+ 0x7c, 0x27, 0x5c, 0x21, 0x31, 0xf1, 0x1a, 0x7d, 0x96, 0xb1, 0x27, 0x19, 0x4f, 0x1a, 0x9d, 0xb8,
+ 0x7a, 0xcf, 0x62, 0x21, 0x4b, 0x29, 0x15, 0x5e, 0xc1, 0x8f, 0x97, 0x66, 0x90, 0x17, 0x61, 0x23,
+ 0x4c, 0x73, 0x1a, 0xbc, 0xe9, 0x0d, 0x6d, 0x4c, 0x74, 0x7b, 0xc2, 0x1f, 0x4b, 0x44, 0x94, 0x59,
+ 0x6f, 0x7a, 0xc3, 0x7d, 0x2c, 0xe1, 0xcd, 0xfc, 0xd3, 0x9c, 0x90, 0x91, 0x6d, 0xfb, 0xfe, 0x38,
+ 0x18, 0x8f, 0x9c, 0x61, 0x4c, 0x81, 0x40, 0x8e, 0xe1, 0x29, 0x6c, 0xd2, 0x1d, 0x4c, 0x3c, 0xe3,
+ 0x8f, 0x44, 0x60, 0x9c, 0x70, 0x83, 0x2d, 0xdd, 0xf9, 0x58, 0xfc, 0x91, 0xab, 0x53, 0x6c, 0x5d,
+ 0x46, 0xa6, 0xfb, 0x4a, 0xa2, 0x5a, 0x39, 0x63, 0x6e, 0x32, 0x9a, 0x29, 0x2c, 0x52, 0xc9, 0x38,
+ 0x6b, 0x92, 0x1a, 0x84, 0xed, 0xe8, 0xe0, 0x89, 0x53, 0x95, 0x8f, 0x24, 0xf2, 0x69, 0x58, 0xf4,
+ 0x7a, 0x72, 0x7e, 0xd5, 0xa4, 0xec, 0xba, 0xda, 0x63, 0x31, 0xde, 0x23, 0x1a, 0x74, 0x6b, 0x78,
+ 0x1c, 0xba, 0xbd, 0x12, 0x53, 0xb5, 0x68, 0xdb, 0x42, 0x1c, 0x93, 0xae, 0x46, 0x56, 0xa3, 0x3b,
+ 0x07, 0xef, 0x17, 0x3c, 0x05, 0xa2, 0x28, 0xf3, 0x26, 0xff, 0xa5, 0xfd, 0x6f, 0xb8, 0x79, 0xda,
+ 0x31, 0xa2, 0x27, 0xc6, 0x94, 0x01, 0x5f, 0x64, 0x01, 0x5e, 0xe3, 0xe3, 0x76, 0x0d, 0xe4, 0x20,
+ 0xd9, 0x9e, 0x58, 0x22, 0x02, 0xd6, 0x19, 0x79, 0xda, 0xbf, 0xe4, 0x61, 0x35, 0xae, 0x5c, 0x22,
+ 0xcf, 0x41, 0x41, 0x3a, 0x28, 0x37, 0x33, 0x34, 0x50, 0x78, 0x3c, 0x22, 0xd2, 0xa9, 0x0e, 0x46,
+ 0x72, 0x17, 0x56, 0xd1, 0xdc, 0x15, 0x6f, 0xf3, 0xb1, 0xc7, 0x55, 0x96, 0xb3, 0xb5, 0xce, 0xc5,
+ 0x9f, 0xbc, 0x7b, 0xf5, 0x0c, 0x2a, 0x98, 0x97, 0x69, 0x5d, 0x7a, 0x31, 0xd2, 0x42, 0x49, 0x77,
+ 0x50, 0x98, 0xae, 0x3b, 0xe0, 0x5d, 0x99, 0xa2, 0x3b, 0x98, 0x9b, 0xa1, 0x3b, 0x88, 0x6a, 0xca,
+ 0xba, 0x03, 0xd4, 0x20, 0x2d, 0x4c, 0xd3, 0x20, 0x45, 0x75, 0x98, 0x06, 0x29, 0x92, 0xfd, 0x17,
+ 0xa7, 0xca, 0xfe, 0xa3, 0x3a, 0x5c, 0xf6, 0x1f, 0x49, 0xe3, 0x17, 0xa7, 0x4a, 0xe3, 0xa5, 0x4a,
+ 0x4c, 0x1a, 0x7f, 0x9d, 0x0f, 0xec, 0xc8, 0x79, 0x64, 0xe3, 0x88, 0x73, 0x66, 0x12, 0x87, 0xcc,
+ 0x74, 0x1e, 0xa1, 0x1d, 0x1b, 0x65, 0x4c, 0xb8, 0xf1, 0x9b, 0xf6, 0xa3, 0xc4, 0x01, 0x24, 0xe6,
+ 0xfc, 0x59, 0x58, 0x65, 0xf7, 0x30, 0x0f, 0x1c, 0xcc, 0x2e, 0xe2, 0x15, 0x73, 0x45, 0x40, 0x99,
+ 0x90, 0xe6, 0x23, 0xb0, 0x16, 0xa2, 0x71, 0x39, 0x05, 0xfa, 0xc4, 0x9a, 0x61, 0x6d, 0x1e, 0xe0,
+ 0x49, 0xa6, 0x37, 0xe2, 0x21, 0x94, 0x62, 0xf4, 0x58, 0x7c, 0x9d, 0xe7, 0x81, 0x44, 0x68, 0xa1,
+ 0x29, 0x70, 0x01, 0x51, 0xd7, 0x43, 0xd4, 0xd0, 0x5e, 0xf7, 0x0f, 0x94, 0x84, 0xf4, 0xff, 0xc3,
+ 0x6a, 0xfe, 0x73, 0x10, 0x7e, 0xdd, 0xe6, 0x12, 0x5c, 0xd1, 0x03, 0x55, 0x14, 0xb4, 0x38, 0x5c,
+ 0x3b, 0x4c, 0x4a, 0x1b, 0x3e, 0xa4, 0x56, 0x69, 0x3f, 0xce, 0xc7, 0x24, 0xa3, 0xe2, 0x33, 0x94,
+ 0xbf, 0x09, 0x7c, 0x9b, 0x4f, 0x31, 0x3f, 0x7e, 0xaf, 0x4d, 0x59, 0xa6, 0xdc, 0xf8, 0xd1, 0xb2,
+ 0x9a, 0x26, 0x04, 0x81, 0x2f, 0x6c, 0x21, 0x6d, 0xf6, 0x8a, 0x96, 0x98, 0x6e, 0x41, 0x8e, 0x9d,
+ 0xb5, 0xa5, 0xd9, 0xe4, 0x84, 0x68, 0x8a, 0xee, 0x52, 0x7c, 0x4d, 0x87, 0xbf, 0xc4, 0x07, 0x3a,
+ 0x80, 0x8a, 0x84, 0x20, 0x4e, 0x3c, 0x9f, 0x21, 0x2f, 0x49, 0x11, 0xc7, 0x51, 0x42, 0xca, 0xea,
+ 0x44, 0xfc, 0x2b, 0xc8, 0x1a, 0xb0, 0x8c, 0x72, 0x49, 0x41, 0xb0, 0x90, 0xa1, 0xab, 0x4b, 0x77,
+ 0xbe, 0x5c, 0xad, 0x9b, 0x4b, 0xb4, 0x9e, 0x20, 0x73, 0x04, 0x4f, 0xc9, 0xd2, 0xc4, 0x78, 0x23,
+ 0xe7, 0x44, 0xb8, 0xef, 0x99, 0x23, 0x10, 0x09, 0x1d, 0xb1, 0xa9, 0xe7, 0x9d, 0x38, 0x80, 0xa3,
+ 0x69, 0x47, 0x70, 0x61, 0xfa, 0x94, 0xcc, 0x48, 0x25, 0x17, 0xb1, 0x36, 0x39, 0x99, 0xb5, 0x91,
+ 0x65, 0x8b, 0xf9, 0x98, 0x6c, 0x51, 0xfb, 0x93, 0x3c, 0x3c, 0x73, 0x8a, 0xe9, 0x9a, 0xf1, 0xcd,
+ 0xcf, 0xc6, 0x19, 0xe7, 0x5c, 0x4c, 0x1a, 0x44, 0x89, 0xf2, 0x3b, 0xe1, 0x64, 0xd0, 0x9d, 0xc2,
+ 0x36, 0x7f, 0x05, 0xd6, 0xd8, 0xc1, 0xcf, 0xec, 0x97, 0x0f, 0x26, 0xfd, 0x53, 0x9c, 0xfc, 0x17,
+ 0x85, 0xb3, 0x65, 0xa2, 0x2a, 0x5e, 0x06, 0x78, 0xde, 0x59, 0x21, 0x8c, 0xb4, 0x61, 0x09, 0xd1,
+ 0x0e, 0x1c, 0xaf, 0x7f, 0x2a, 0xaf, 0x3f, 0xe1, 0xca, 0x29, 0x57, 0x63, 0x6e, 0x17, 0x14, 0xb0,
+ 0x8b, 0xbf, 0xc9, 0x0d, 0x58, 0x1b, 0x4c, 0x8e, 0x29, 0x4b, 0xc8, 0xd6, 0x02, 0x37, 0x13, 0x9b,
+ 0x33, 0x57, 0x06, 0x93, 0x63, 0x7d, 0x38, 0xc4, 0x29, 0x45, 0x7b, 0xb2, 0x75, 0x8a, 0xc7, 0x76,
+ 0xad, 0xc0, 0x9c, 0x47, 0x4c, 0x4a, 0x80, 0xed, 0x5b, 0x8e, 0xbb, 0x01, 0xcc, 0xba, 0x98, 0xa7,
+ 0xd2, 0x63, 0x3f, 0xb4, 0x7f, 0xcf, 0x09, 0x19, 0xd7, 0xf4, 0x75, 0xff, 0x9b, 0x29, 0xca, 0x98,
+ 0xa2, 0x9b, 0xa0, 0xd2, 0xa1, 0x8f, 0x0e, 0x95, 0x70, 0x8e, 0x56, 0x07, 0x93, 0xe3, 0x70, 0xec,
+ 0xe4, 0x81, 0x9f, 0x97, 0x07, 0xfe, 0x15, 0x21, 0x03, 0xcb, 0x3c, 0x1e, 0xa6, 0x0f, 0x39, 0xe5,
+ 0x98, 0x6e, 0x9c, 0xee, 0x10, 0xf8, 0xcd, 0xbc, 0x65, 0xcc, 0x5b, 0x42, 0x5d, 0x32, 0x97, 0x52,
+ 0x97, 0x64, 0xec, 0xbd, 0xf9, 0xac, 0xbd, 0x97, 0x52, 0xce, 0x2c, 0x64, 0x28, 0x67, 0x32, 0x37,
+ 0x68, 0xf1, 0x31, 0x1b, 0x74, 0x51, 0x5e, 0x27, 0xff, 0x90, 0x13, 0x1c, 0x53, 0xfc, 0x09, 0xf4,
+ 0x06, 0x9c, 0x15, 0x4f, 0x20, 0x76, 0x73, 0x44, 0x3a, 0xb7, 0xa5, 0x3b, 0xb7, 0xb2, 0x1e, 0x3f,
+ 0x88, 0x96, 0xf1, 0x40, 0x59, 0xe7, 0xcf, 0x9e, 0xa8, 0xfc, 0x7f, 0xce, 0x83, 0x87, 0x3c, 0x80,
+ 0xf3, 0x98, 0x88, 0xa2, 0x2b, 0x6b, 0x0b, 0xed, 0x91, 0x7b, 0xc0, 0xd7, 0xc3, 0xb5, 0xd4, 0xf3,
+ 0xc0, 0xeb, 0x4a, 0xcd, 0x31, 0xdd, 0x83, 0xca, 0x19, 0x73, 0x23, 0xc8, 0x80, 0x27, 0xdf, 0x52,
+ 0x3f, 0x54, 0x40, 0x7b, 0xfc, 0x78, 0xe1, 0xb3, 0x37, 0x39, 0xe0, 0xf4, 0xd9, 0x2b, 0x8d, 0xde,
+ 0x33, 0xb0, 0x32, 0x72, 0x0f, 0x46, 0x6e, 0x70, 0x14, 0x93, 0x4d, 0x2d, 0x73, 0xa0, 0x18, 0x18,
+ 0x11, 0xbd, 0xf6, 0x89, 0x1e, 0x23, 0xa2, 0x92, 0xb6, 0x1b, 0x3e, 0x91, 0x33, 0xe7, 0x81, 0xae,
+ 0x26, 0xb9, 0x81, 0xec, 0xc7, 0xdd, 0x42, 0x31, 0xa7, 0xe6, 0x4d, 0x1e, 0x63, 0xf7, 0xc0, 0xeb,
+ 0xbb, 0xda, 0x5f, 0x28, 0x82, 0x23, 0xc8, 0x1a, 0x3c, 0xf2, 0x86, 0x64, 0xf5, 0x9f, 0x4f, 0xb1,
+ 0x21, 0x59, 0x55, 0x4e, 0x23, 0x38, 0xac, 0x7d, 0x40, 0x82, 0xc3, 0xd7, 0x84, 0xe9, 0x20, 0x3d,
+ 0xf3, 0xf6, 0x6f, 0x93, 0x5b, 0xb0, 0xc0, 0xac, 0x05, 0x45, 0x73, 0xd7, 0x62, 0xcd, 0xdd, 0xbf,
+ 0x6d, 0x8a, 0x72, 0xed, 0xed, 0x50, 0x97, 0x9d, 0xea, 0xc4, 0xfe, 0x6d, 0xf2, 0xca, 0xe9, 0xac,
+ 0xf8, 0x8b, 0xc2, 0x8a, 0x3f, 0xb4, 0xe0, 0x7f, 0x35, 0x66, 0xc1, 0x7f, 0x7d, 0xf6, 0x68, 0x71,
+ 0x0b, 0x04, 0x16, 0xb7, 0x34, 0x8a, 0x67, 0xf7, 0x8b, 0x1c, 0x5c, 0x9e, 0x59, 0x83, 0x5c, 0x82,
+ 0xa2, 0xde, 0xaa, 0xb6, 0xa3, 0xf9, 0xa5, 0x7b, 0x46, 0x40, 0xc8, 0x1e, 0x2c, 0x6e, 0x3b, 0x81,
+ 0xd7, 0xa5, 0xcb, 0x38, 0x53, 0x25, 0x98, 0x22, 0x1b, 0xa2, 0x57, 0xce, 0x98, 0x51, 0x5d, 0x62,
+ 0xc3, 0x3a, 0xee, 0x85, 0x58, 0x8e, 0xba, 0x7c, 0x86, 0x78, 0x25, 0x45, 0x30, 0x55, 0x8d, 0x9e,
+ 0x33, 0x29, 0x20, 0x79, 0x08, 0xc4, 0xb2, 0x2a, 0x65, 0x77, 0x34, 0xe6, 0x62, 0x87, 0xb1, 0x17,
+ 0x9a, 0x84, 0xbf, 0xf8, 0x98, 0xb1, 0x4b, 0xd5, 0xab, 0x9c, 0x31, 0x33, 0xa8, 0x25, 0xb7, 0xf9,
+ 0x5b, 0x82, 0xdf, 0x99, 0x3e, 0x08, 0x4f, 0x10, 0x13, 0xfa, 0x26, 0x14, 0x5b, 0xc2, 0xfe, 0x48,
+ 0x72, 0xad, 0x11, 0xb6, 0x46, 0x66, 0x58, 0xaa, 0xfd, 0xb6, 0x22, 0xe4, 0x2c, 0x8f, 0x1f, 0x2c,
+ 0x29, 0x85, 0x60, 0x6f, 0x76, 0x0a, 0xc1, 0xde, 0xaf, 0x98, 0x42, 0x50, 0xf3, 0xe0, 0xd6, 0xa9,
+ 0x07, 0x96, 0x7c, 0x0a, 0x54, 0xcc, 0xb6, 0xe6, 0x48, 0x93, 0xc4, 0xf6, 0xd7, 0x7a, 0x98, 0x24,
+ 0xa0, 0xc2, 0x53, 0x5a, 0x9a, 0x6b, 0xdd, 0x78, 0x6d, 0xed, 0xcf, 0x78, 0x72, 0x88, 0x6a, 0xaf,
+ 0x95, 0x50, 0x2e, 0xbd, 0x5f, 0x6f, 0x2c, 0x23, 0xb6, 0xd9, 0x9e, 0x91, 0xb2, 0xdd, 0xa6, 0xbf,
+ 0x35, 0xdd, 0x29, 0x4b, 0xda, 0x79, 0x7f, 0x9c, 0x87, 0x4b, 0xb3, 0xaa, 0x67, 0xe6, 0xd3, 0x57,
+ 0x9e, 0x2c, 0x9f, 0xfe, 0x2d, 0x28, 0x32, 0x58, 0xe8, 0x6a, 0x84, 0x73, 0xcb, 0xab, 0xd2, 0xb9,
+ 0x15, 0xc5, 0xe4, 0x19, 0x98, 0xd7, 0xcb, 0x56, 0x94, 0xe2, 0x11, 0x7d, 0x02, 0x9c, 0x6e, 0x80,
+ 0xd6, 0xe6, 0xbc, 0x88, 0x7c, 0x39, 0x9d, 0xd5, 0x94, 0xe7, 0x76, 0xbc, 0x28, 0x0d, 0x48, 0x2a,
+ 0x6f, 0x0b, 0xb6, 0x37, 0xca, 0x33, 0xc2, 0x43, 0xf7, 0x9b, 0xe9, 0x0c, 0xa9, 0x1a, 0xcc, 0xb7,
+ 0x46, 0x6e, 0xe0, 0x8e, 0x65, 0x7b, 0xfd, 0x21, 0x42, 0x4c, 0x5e, 0xc2, 0xad, 0xe9, 0x9d, 0x13,
+ 0x16, 0x3c, 0x65, 0x5e, 0x0e, 0x68, 0x85, 0xe6, 0xf7, 0x14, 0x6c, 0x4a, 0x28, 0xb4, 0x42, 0xcd,
+ 0x99, 0x0c, 0xba, 0x47, 0x1d, 0xb3, 0xc6, 0x39, 0x27, 0x56, 0xa1, 0x8f, 0x50, 0xda, 0xc1, 0xc0,
+ 0x94, 0x50, 0xb4, 0xef, 0x28, 0xb0, 0x91, 0xd5, 0x0f, 0x72, 0x09, 0x0a, 0x83, 0xcc, 0x04, 0xae,
+ 0x03, 0x16, 0xf3, 0x61, 0x09, 0xd5, 0x67, 0x07, 0xfe, 0xe8, 0xd8, 0x19, 0xcb, 0x5e, 0x0d, 0x12,
+ 0xd8, 0x44, 0xc5, 0xdb, 0x2e, 0xfe, 0x4f, 0xae, 0x8a, 0x2b, 0x27, 0x9f, 0x4a, 0xf9, 0x8a, 0x7f,
+ 0x34, 0x1d, 0xa0, 0xda, 0x6b, 0x35, 0x87, 0x2c, 0x6f, 0xc8, 0x4b, 0x50, 0xa0, 0xcd, 0x4a, 0xac,
+ 0x5e, 0xba, 0x7e, 0xf4, 0x7a, 0x8d, 0x23, 0xb1, 0x56, 0x05, 0xce, 0x71, 0xdf, 0x44, 0x64, 0xed,
+ 0x3e, 0xac, 0xc6, 0x31, 0x88, 0x11, 0x0f, 0x1d, 0xbd, 0x74, 0x47, 0xe5, 0x94, 0xb6, 0x7d, 0x9f,
+ 0x79, 0xd6, 0x6d, 0x3f, 0xf5, 0x8b, 0x77, 0xaf, 0x02, 0xfd, 0xc9, 0xea, 0x64, 0x85, 0x96, 0xd6,
+ 0xbe, 0x9b, 0x83, 0x8d, 0x28, 0x98, 0x87, 0xd8, 0x43, 0xbf, 0xb6, 0x9e, 0xe5, 0x7a, 0xcc, 0xf3,
+ 0x59, 0xf0, 0x8d, 0xe9, 0x0e, 0xce, 0x70, 0xb8, 0xdc, 0x83, 0xad, 0x69, 0xf8, 0xe4, 0x39, 0x58,
+ 0xc4, 0xf8, 0x6f, 0x43, 0xa7, 0xeb, 0xca, 0xc7, 0xec, 0x40, 0x00, 0xcd, 0xa8, 0x5c, 0xfb, 0x99,
+ 0x02, 0x17, 0xb8, 0x3f, 0x58, 0xdd, 0xf1, 0x06, 0xa8, 0xbf, 0xe9, 0xba, 0x1f, 0x4c, 0x64, 0x84,
+ 0xbd, 0xd8, 0x39, 0xf6, 0x6c, 0xdc, 0xed, 0x2f, 0xf5, 0xb5, 0xe9, 0xbd, 0x25, 0xb7, 0x30, 0xa6,
+ 0x21, 0xb7, 0x9c, 0x29, 0xb0, 0x48, 0x34, 0x03, 0x0a, 0x90, 0x23, 0xd1, 0x20, 0x86, 0xf6, 0x7f,
+ 0xe0, 0xca, 0xec, 0x0f, 0x90, 0x2f, 0xc1, 0x0a, 0x26, 0xe9, 0xeb, 0x0c, 0x0f, 0x47, 0x4e, 0xcf,
+ 0x15, 0x92, 0x3d, 0x21, 0x80, 0x96, 0xcb, 0x58, 0x88, 0x46, 0x1e, 0x19, 0xe5, 0x10, 0xd3, 0xff,
+ 0xf1, 0x4a, 0x31, 0xa7, 0x4b, 0x99, 0x9a, 0xf6, 0x4d, 0x05, 0x48, 0x9a, 0x06, 0xf9, 0x38, 0x2c,
+ 0x77, 0xda, 0x65, 0x6b, 0xec, 0x8c, 0xc6, 0x15, 0x7f, 0x32, 0xe2, 0xf1, 0x11, 0x59, 0xa0, 0x8c,
+ 0x71, 0xd7, 0x66, 0x9a, 0xba, 0x23, 0x7f, 0x32, 0x32, 0x63, 0x78, 0x98, 0x0c, 0xce, 0x75, 0xdf,
+ 0xec, 0x39, 0x27, 0xf1, 0x64, 0x70, 0x1c, 0x16, 0x4b, 0x06, 0xc7, 0x61, 0xda, 0x3b, 0x0a, 0x5c,
+ 0x14, 0x06, 0xd1, 0xbd, 0x8c, 0xb6, 0x94, 0x31, 0x1c, 0xd4, 0x48, 0x04, 0xe4, 0x9e, 0xc5, 0xa1,
+ 0xaf, 0x8b, 0x88, 0x69, 0xd8, 0x40, 0x64, 0xd5, 0x59, 0x5d, 0xf2, 0x59, 0x28, 0x58, 0x63, 0x7f,
+ 0x78, 0x8a, 0x90, 0x69, 0x6a, 0x38, 0xa3, 0x63, 0x7f, 0x88, 0x24, 0xb0, 0xa6, 0xe6, 0xc2, 0x86,
+ 0xdc, 0x38, 0xd1, 0x62, 0x52, 0x87, 0x05, 0x1e, 0x1b, 0x33, 0x61, 0x6b, 0x34, 0xa3, 0x4f, 0xdb,
+ 0x6b, 0x22, 0x2e, 0x1b, 0x0f, 0x08, 0x6d, 0x0a, 0x1a, 0xda, 0xef, 0x2a, 0xb0, 0x44, 0x19, 0x1b,
+ 0x7c, 0x94, 0xbe, 0xdf, 0x25, 0x1d, 0xe7, 0x83, 0x85, 0xe9, 0x5c, 0x48, 0xfe, 0x54, 0xb7, 0xf1,
+ 0xcb, 0xb0, 0x96, 0xa8, 0x40, 0x34, 0x8c, 0xc8, 0xd3, 0xf7, 0xba, 0x0e, 0xcb, 0x2d, 0xc5, 0xcc,
+ 0xce, 0x62, 0x30, 0xed, 0xff, 0x2b, 0xb0, 0xd1, 0x7c, 0x73, 0xec, 0x30, 0x85, 0xba, 0x39, 0xe9,
+ 0x8b, 0xfd, 0x4e, 0x99, 0x35, 0x61, 0x59, 0xcf, 0xa2, 0x85, 0x30, 0x66, 0x8d, 0xc3, 0xcc, 0xb0,
+ 0x94, 0x54, 0xa0, 0xc8, 0xef, 0x97, 0x80, 0xc7, 0x71, 0xbe, 0x22, 0xc9, 0x46, 0x22, 0xc2, 0x1c,
+ 0x89, 0xf6, 0x04, 0x8f, 0x30, 0x5e, 0xc7, 0x0c, 0x6b, 0x6b, 0xff, 0xaa, 0xc0, 0xe6, 0x94, 0x3a,
+ 0xe4, 0x75, 0x98, 0x43, 0x4f, 0x66, 0x3e, 0x7b, 0x97, 0xa6, 0x7c, 0x62, 0xdc, 0x3d, 0xda, 0xbf,
+ 0xcd, 0x2e, 0xa2, 0x63, 0xfa, 0xc3, 0x64, 0xb5, 0xc8, 0x1b, 0xb0, 0xa8, 0xf7, 0x7a, 0xfc, 0x75,
+ 0x96, 0x8b, 0xbd, 0xce, 0xa6, 0x7c, 0xf1, 0x85, 0x10, 0x9f, 0xbd, 0xce, 0x98, 0x4f, 0x5d, 0xaf,
+ 0x67, 0x73, 0x2f, 0xed, 0x88, 0xde, 0x85, 0x4f, 0xc1, 0x6a, 0x1c, 0xf9, 0x89, 0x1c, 0x4b, 0xdf,
+ 0x56, 0x40, 0x8d, 0xb7, 0xe1, 0xc3, 0x89, 0x28, 0x97, 0x35, 0xcd, 0x8f, 0x59, 0x54, 0xbf, 0x9f,
+ 0x83, 0x73, 0x99, 0x23, 0x4c, 0x9e, 0x87, 0x79, 0x7d, 0x38, 0xac, 0xee, 0xf0, 0x55, 0xc5, 0x39,
+ 0x24, 0x14, 0x7a, 0xc7, 0x1e, 0xaf, 0x0c, 0x89, 0xbc, 0x04, 0x45, 0x66, 0xb7, 0xb1, 0x23, 0x0e,
+ 0x1c, 0x0c, 0x91, 0xc5, 0x8d, 0x4a, 0xe2, 0x11, 0x95, 0x05, 0x22, 0xd9, 0x85, 0x55, 0x1e, 0x5c,
+ 0x0a, 0x2d, 0x77, 0xc2, 0xd4, 0x1e, 0x98, 0x7d, 0x44, 0x48, 0xd2, 0x99, 0xb1, 0x4f, 0xec, 0xec,
+ 0x4c, 0xd4, 0x22, 0x35, 0x50, 0x91, 0xa6, 0x4c, 0x89, 0x85, 0x75, 0x96, 0x8c, 0x97, 0xa6, 0xd0,
+ 0x4a, 0xd5, 0x0c, 0xa7, 0x4b, 0x0f, 0x02, 0xef, 0x70, 0x70, 0xec, 0x0e, 0xc6, 0x1f, 0xde, 0x74,
+ 0x45, 0xdf, 0x38, 0xd5, 0x74, 0xfd, 0x61, 0x81, 0x6d, 0xe6, 0x64, 0x35, 0xca, 0xd1, 0x48, 0x91,
+ 0xfc, 0x91, 0xa3, 0xa1, 0xef, 0x33, 0x1e, 0x3e, 0x69, 0x07, 0x16, 0x58, 0x58, 0x2b, 0xb1, 0x33,
+ 0x2e, 0x67, 0x36, 0x81, 0xe1, 0xec, 0xdf, 0x66, 0xec, 0x0b, 0x73, 0xa9, 0x0e, 0x4c, 0x51, 0x95,
+ 0xec, 0xc3, 0x52, 0xb9, 0xef, 0x3a, 0x83, 0xc9, 0xb0, 0x7d, 0x3a, 0xa5, 0xf1, 0x16, 0xef, 0xcb,
+ 0x72, 0x97, 0x55, 0x43, 0x65, 0x33, 0x9e, 0xe4, 0x32, 0x21, 0xd2, 0x0e, 0xbd, 0x2c, 0x0b, 0x28,
+ 0x78, 0x7d, 0x71, 0xc6, 0xf8, 0x24, 0x81, 0x58, 0x2f, 0xee, 0x42, 0xcc, 0xdd, 0x30, 0x6d, 0x58,
+ 0xad, 0x39, 0xc1, 0xb8, 0x3d, 0x72, 0x06, 0x01, 0x86, 0xc3, 0x3d, 0x45, 0xb8, 0xc0, 0x8b, 0x22,
+ 0xd5, 0x3b, 0x8a, 0x4c, 0xc7, 0x61, 0x55, 0x26, 0x90, 0x8d, 0x93, 0xa3, 0xfc, 0xd2, 0xae, 0x37,
+ 0x70, 0xfa, 0xde, 0x37, 0x84, 0x33, 0x3a, 0xe3, 0x97, 0x0e, 0x04, 0xd0, 0x8c, 0xca, 0xb5, 0x2f,
+ 0xa6, 0xe6, 0x8d, 0xb5, 0x72, 0x09, 0x16, 0x78, 0xa8, 0x12, 0x16, 0xba, 0xa3, 0x65, 0x34, 0x76,
+ 0xaa, 0x8d, 0x3d, 0x55, 0x21, 0xab, 0x00, 0x2d, 0xb3, 0x59, 0x36, 0x2c, 0x8b, 0xfe, 0xce, 0xd1,
+ 0xdf, 0x3c, 0xae, 0xc7, 0x6e, 0xa7, 0xa6, 0xe6, 0xa5, 0xd0, 0x1e, 0x05, 0xed, 0xa7, 0x0a, 0x9c,
+ 0xcf, 0x9e, 0x4a, 0xd2, 0x06, 0x0c, 0xee, 0xc2, 0xcd, 0x07, 0x3e, 0x3e, 0x73, 0xde, 0x33, 0xc1,
+ 0xc9, 0x20, 0x31, 0x63, 0x16, 0x7c, 0x24, 0x27, 0x74, 0x5f, 0xcc, 0x9b, 0xd9, 0xeb, 0x99, 0x39,
+ 0xaf, 0xa7, 0x95, 0x61, 0x6b, 0x1a, 0x8d, 0x78, 0x57, 0xd7, 0x60, 0x49, 0x6f, 0xb5, 0x6a, 0xd5,
+ 0xb2, 0xde, 0xae, 0x36, 0x1b, 0xaa, 0x42, 0x16, 0x61, 0x6e, 0xcf, 0x6c, 0x76, 0x5a, 0x6a, 0x4e,
+ 0xfb, 0x9e, 0x02, 0x2b, 0xd5, 0xc8, 0xd2, 0xf4, 0xfd, 0x6e, 0xbe, 0x4f, 0xc4, 0x36, 0xdf, 0x56,
+ 0x18, 0x06, 0x29, 0xfc, 0xc0, 0xa9, 0x76, 0xde, 0x7b, 0x39, 0x58, 0x4f, 0xd5, 0x21, 0x16, 0x2c,
+ 0xe8, 0xf7, 0xad, 0x66, 0x75, 0xa7, 0xcc, 0x5b, 0x76, 0x35, 0x32, 0x64, 0xc3, 0xc4, 0x78, 0xa9,
+ 0xaf, 0xb0, 0xd0, 0x01, 0x8f, 0x02, 0xdb, 0xf7, 0x7a, 0xdd, 0x98, 0x05, 0xa3, 0xa0, 0x84, 0x37,
+ 0xd9, 0x37, 0x26, 0x23, 0x17, 0xc9, 0xe6, 0x62, 0x72, 0xdd, 0x10, 0x9e, 0x26, 0x8c, 0xc6, 0x91,
+ 0x0e, 0x2d, 0x4f, 0x93, 0x8e, 0xe8, 0x91, 0x06, 0xcc, 0xef, 0x79, 0xe3, 0xca, 0xe4, 0x21, 0xdf,
+ 0xbf, 0x57, 0xa2, 0x34, 0x69, 0x95, 0xc9, 0xc3, 0x34, 0x59, 0x14, 0x59, 0xb2, 0x30, 0x5f, 0x31,
+ 0x92, 0x9c, 0x4a, 0xd2, 0xdb, 0xb9, 0xf0, 0x44, 0xde, 0xce, 0xdb, 0x2b, 0xb0, 0xc4, 0xdf, 0x50,
+ 0xf8, 0x3c, 0xf9, 0xb1, 0x02, 0x5b, 0xd3, 0x46, 0x8e, 0x3e, 0xcb, 0xe2, 0x51, 0x4d, 0xce, 0x87,
+ 0x79, 0x74, 0xe2, 0xe1, 0x4c, 0x04, 0x1a, 0xf9, 0x0c, 0x2c, 0x31, 0x2b, 0x2d, 0xeb, 0xa5, 0x8e,
+ 0x59, 0xe5, 0xcb, 0xf5, 0xf2, 0x3f, 0xbd, 0x7b, 0x75, 0x93, 0x1b, 0x76, 0x05, 0x2f, 0xd9, 0x93,
+ 0x91, 0x17, 0xcb, 0x39, 0x22, 0xd7, 0xa0, 0x5c, 0xb4, 0x33, 0xe9, 0x79, 0xae, 0x78, 0x43, 0x88,
+ 0xc8, 0x0f, 0x1c, 0x26, 0xdf, 0x69, 0x02, 0xa6, 0x7d, 0x5b, 0x81, 0x0b, 0xd3, 0xa7, 0x89, 0xde,
+ 0x93, 0x6d, 0x66, 0xec, 0x26, 0x62, 0x2f, 0xe0, 0x3d, 0x19, 0x5a, 0xc4, 0xc9, 0x34, 0x05, 0x22,
+ 0xad, 0xc4, 0x25, 0x5c, 0x42, 0x48, 0x22, 0x27, 0xce, 0x8f, 0x57, 0x12, 0x88, 0xda, 0x03, 0xd8,
+ 0x9c, 0x32, 0xa9, 0xe4, 0xd3, 0x99, 0xd9, 0xb9, 0xd0, 0x35, 0x51, 0xce, 0xce, 0x15, 0x4b, 0xf3,
+ 0x28, 0xc1, 0xb5, 0x7f, 0xce, 0xc1, 0x79, 0xba, 0xbb, 0xfa, 0x6e, 0x10, 0xe8, 0x51, 0x22, 0x6b,
+ 0x7a, 0x2a, 0xbe, 0x02, 0xf3, 0x47, 0x4f, 0x26, 0x2a, 0x66, 0xe8, 0x84, 0x00, 0xde, 0x58, 0xc2,
+ 0x21, 0x8e, 0xfe, 0x4f, 0xae, 0x01, 0x48, 0xa9, 0xcc, 0xf3, 0x18, 0x07, 0x39, 0xb7, 0xa5, 0x98,
+ 0x8b, 0xc3, 0x30, 0x61, 0xf9, 0xab, 0x30, 0x87, 0xf2, 0x14, 0x7e, 0x77, 0x08, 0x9e, 0x3f, 0xbb,
+ 0x75, 0x28, 0x6d, 0x31, 0x59, 0x05, 0xf2, 0x31, 0x80, 0x28, 0x85, 0x0c, 0xbf, 0x1c, 0x84, 0x9c,
+ 0x21, 0xcc, 0x22, 0x63, 0x2e, 0x1e, 0x1f, 0x38, 0x3c, 0x2f, 0x4b, 0x09, 0xd6, 0xc5, 0x88, 0x0f,
+ 0x45, 0xf8, 0x54, 0xae, 0xc5, 0x5c, 0x63, 0x05, 0xd5, 0xa1, 0x08, 0xa1, 0x7a, 0x3d, 0x95, 0xc9,
+ 0x1d, 0xa3, 0xa8, 0x27, 0xd2, 0xb5, 0x5f, 0x4f, 0xa5, 0x6b, 0x2f, 0x32, 0x2c, 0x39, 0x27, 0xbb,
+ 0xf6, 0xf7, 0x39, 0x58, 0xbc, 0x4f, 0xb9, 0x32, 0x94, 0x35, 0xcc, 0x96, 0x5d, 0xdc, 0x81, 0xa5,
+ 0x9a, 0xef, 0x70, 0x75, 0x11, 0xf7, 0x23, 0x63, 0x36, 0xd6, 0x7d, 0xdf, 0x11, 0x9a, 0xa7, 0xc0,
+ 0x94, 0x91, 0x1e, 0x13, 0xb8, 0xe2, 0x2e, 0xcc, 0x33, 0xf5, 0x1d, 0x17, 0xa3, 0x09, 0xbe, 0x3c,
+ 0x6c, 0xd1, 0x0b, 0xac, 0x58, 0xd2, 0x70, 0x30, 0x15, 0xa0, 0xcc, 0x24, 0x72, 0x83, 0x6b, 0x49,
+ 0xb2, 0x32, 0x77, 0x3a, 0xc9, 0x8a, 0x14, 0xf4, 0x72, 0xfe, 0x34, 0x41, 0x2f, 0x2f, 0xbc, 0x06,
+ 0x4b, 0x52, 0x7b, 0x9e, 0x88, 0x4d, 0xff, 0x56, 0x0e, 0x56, 0xb0, 0x57, 0xa1, 0x2d, 0xcf, 0xaf,
+ 0xa7, 0x9c, 0xe8, 0x13, 0x31, 0x39, 0xd1, 0x96, 0x3c, 0x5f, 0xac, 0x67, 0x33, 0x04, 0x44, 0x77,
+ 0x61, 0x3d, 0x85, 0x48, 0x5e, 0x86, 0x39, 0xda, 0x7c, 0xf1, 0xae, 0x56, 0x93, 0x2b, 0x20, 0x0a,
+ 0x90, 0x4e, 0x3b, 0x1e, 0x98, 0x0c, 0x5b, 0xfb, 0x37, 0x05, 0x96, 0x79, 0x7e, 0xa2, 0xc1, 0x81,
+ 0xff, 0xd8, 0xe1, 0xbc, 0x91, 0x1c, 0x4e, 0x16, 0x86, 0x89, 0x0f, 0xe7, 0x7f, 0xf5, 0x20, 0xbe,
+ 0x16, 0x1b, 0xc4, 0xcd, 0x30, 0x5c, 0xaa, 0xe8, 0xce, 0x8c, 0x31, 0xfc, 0x11, 0x06, 0x10, 0x8f,
+ 0x23, 0x92, 0x2f, 0xc3, 0x62, 0xc3, 0x7d, 0x14, 0x7b, 0x9e, 0xde, 0x98, 0x42, 0xf4, 0x85, 0x10,
+ 0x91, 0xed, 0x29, 0xe6, 0xf6, 0xe0, 0x3e, 0xb2, 0x53, 0x9a, 0xc3, 0x88, 0x24, 0x7d, 0xa1, 0xc6,
+ 0xab, 0x3d, 0xc9, 0xd2, 0xe7, 0x4e, 0xed, 0x18, 0x59, 0xec, 0x3b, 0x79, 0x80, 0xc8, 0x1f, 0x98,
+ 0x6e, 0xc0, 0x98, 0xd1, 0x84, 0x90, 0xec, 0x23, 0x48, 0x5e, 0xe3, 0xc2, 0x96, 0xe2, 0x06, 0x97,
+ 0x40, 0xe7, 0xa6, 0x87, 0xb3, 0x45, 0x59, 0x74, 0x99, 0x3b, 0xa0, 0xf6, 0xdc, 0xbe, 0xc3, 0xce,
+ 0xf6, 0xfc, 0xf6, 0x75, 0x8c, 0x5e, 0x1e, 0x42, 0xa7, 0xe4, 0xa5, 0x47, 0x37, 0xd5, 0x1d, 0x8a,
+ 0x90, 0xf2, 0xb1, 0x2f, 0x3c, 0x99, 0x8f, 0x7d, 0x0b, 0x16, 0xbd, 0xc1, 0x5b, 0xee, 0x60, 0xec,
+ 0x8f, 0x4e, 0x50, 0xec, 0x1e, 0xc9, 0xf3, 0xe8, 0x10, 0x54, 0x45, 0x19, 0x9b, 0x07, 0xbc, 0x73,
+ 0x43, 0x7c, 0x79, 0x1a, 0x42, 0x60, 0x18, 0x23, 0x60, 0x4e, 0x9d, 0xbf, 0x5b, 0x28, 0xce, 0xab,
+ 0x0b, 0x77, 0x0b, 0xc5, 0xa2, 0xba, 0x78, 0xb7, 0x50, 0x5c, 0x54, 0xc1, 0x94, 0x74, 0x66, 0xa1,
+ 0x4e, 0x4c, 0x52, 0x63, 0xc5, 0x55, 0x54, 0xda, 0x2f, 0x73, 0x40, 0xd2, 0xcd, 0x20, 0x9f, 0x80,
+ 0x25, 0x76, 0xc0, 0xda, 0xa3, 0xe0, 0x6b, 0xdc, 0x11, 0x84, 0xc5, 0x67, 0x93, 0xc0, 0x72, 0x7c,
+ 0x36, 0x06, 0x36, 0x83, 0xaf, 0xf5, 0xc9, 0x97, 0xe0, 0x2c, 0x0e, 0xef, 0xd0, 0x1d, 0x79, 0x7e,
+ 0xcf, 0xc6, 0x60, 0xda, 0x4e, 0x9f, 0xe7, 0x90, 0x7d, 0x1e, 0x93, 0x9d, 0xa7, 0x8b, 0xa7, 0x4c,
+ 0x03, 0xba, 0xfd, 0xb6, 0x10, 0xb3, 0xc5, 0x10, 0x49, 0x1b, 0x54, 0xb9, 0xfe, 0xc1, 0xa4, 0xdf,
+ 0xe7, 0x33, 0x5b, 0xa2, 0x2f, 0xfa, 0x64, 0xd9, 0x14, 0xc2, 0xab, 0x11, 0xe1, 0xdd, 0x49, 0xbf,
+ 0x4f, 0x5e, 0x01, 0xf0, 0x07, 0xf6, 0xb1, 0x17, 0x04, 0x4c, 0x99, 0x13, 0xba, 0x02, 0x45, 0x50,
+ 0x79, 0x32, 0xfc, 0x41, 0x9d, 0x01, 0xc9, 0xff, 0x02, 0x0c, 0xeb, 0x82, 0xf1, 0x8e, 0x98, 0x35,
+ 0x12, 0x4f, 0xf3, 0x24, 0x80, 0xf1, 0x80, 0x08, 0x87, 0xae, 0xe5, 0x7d, 0x43, 0x38, 0xe5, 0x7d,
+ 0x01, 0xd6, 0xb9, 0xbd, 0xf4, 0x7d, 0x6f, 0x7c, 0xc4, 0x9f, 0x12, 0xef, 0xe7, 0x1d, 0x22, 0xbd,
+ 0x25, 0xfe, 0xaa, 0x00, 0xa0, 0xdf, 0xb7, 0x44, 0x28, 0xc1, 0x5b, 0x30, 0x47, 0x1f, 0x48, 0x42,
+ 0xd0, 0x82, 0x62, 0x6a, 0xa4, 0x2b, 0x8b, 0xa9, 0x11, 0x83, 0xee, 0x46, 0x13, 0xdd, 0x1d, 0x84,
+ 0x90, 0x05, 0x77, 0x23, 0xf3, 0x80, 0x88, 0x85, 0x72, 0xe7, 0x58, 0xa4, 0x06, 0x10, 0x05, 0xf7,
+ 0xe3, 0x2c, 0xff, 0x7a, 0x14, 0x25, 0x8b, 0x17, 0xf0, 0x74, 0x32, 0x51, 0x80, 0x40, 0x79, 0xf9,
+ 0x44, 0x68, 0xe4, 0x1e, 0x14, 0xda, 0x4e, 0xe8, 0x7f, 0x3f, 0x25, 0xe4, 0xe1, 0xd3, 0x3c, 0xc7,
+ 0x6f, 0x14, 0xf6, 0x70, 0x75, 0xec, 0xc4, 0x52, 0xa1, 0x23, 0x11, 0x62, 0xc0, 0x7c, 0xcb, 0x19,
+ 0x39, 0xc7, 0xc1, 0xb4, 0x50, 0xb9, 0xac, 0x54, 0x04, 0xc8, 0x47, 0xa0, 0xcc, 0x53, 0xb0, 0x62,
+ 0x72, 0x07, 0xf2, 0x96, 0x55, 0xe7, 0x81, 0x7e, 0x56, 0xa2, 0xe7, 0x97, 0x65, 0xd5, 0x99, 0xde,
+ 0x37, 0x08, 0x8e, 0xa5, 0x6a, 0x14, 0x99, 0x7c, 0x12, 0x96, 0x24, 0xa6, 0x98, 0x87, 0xc8, 0xc2,
+ 0x31, 0x90, 0x3c, 0x1c, 0xe5, 0x43, 0x43, 0xc2, 0x26, 0x35, 0x50, 0xef, 0x4d, 0x1e, 0xba, 0xfa,
+ 0x70, 0x88, 0xae, 0xcf, 0x6f, 0xb9, 0x23, 0xc6, 0xb6, 0x15, 0xa3, 0xd8, 0xf2, 0xe8, 0xbd, 0xd2,
+ 0x13, 0xa5, 0xb2, 0xb0, 0x29, 0x59, 0x93, 0xb4, 0x60, 0xdd, 0x72, 0xc7, 0x93, 0x21, 0xb3, 0xaf,
+ 0xd9, 0xf5, 0x47, 0xf4, 0x7d, 0xc3, 0x02, 0x6a, 0x61, 0x18, 0xee, 0x80, 0x16, 0x0a, 0xa3, 0xa6,
+ 0x03, 0x7f, 0x94, 0x78, 0xeb, 0xa4, 0x2b, 0x6b, 0xae, 0x3c, 0xe5, 0xf4, 0x56, 0x8d, 0xbf, 0x9a,
+ 0xf0, 0x56, 0x15, 0xaf, 0xa6, 0xe8, 0xad, 0xf4, 0xb1, 0x8c, 0xa0, 0x8f, 0xa8, 0x19, 0x94, 0x82,
+ 0x3e, 0xc6, 0x42, 0x3d, 0xbe, 0x53, 0x90, 0xe2, 0x0e, 0xf3, 0xb9, 0x78, 0x1d, 0xe0, 0xae, 0xef,
+ 0x0d, 0xea, 0xee, 0xf8, 0xc8, 0xef, 0x49, 0xb1, 0x27, 0x97, 0xbe, 0xea, 0x7b, 0x03, 0xfb, 0x18,
+ 0xc1, 0xbf, 0x7c, 0xf7, 0xaa, 0x84, 0x64, 0x4a, 0xff, 0x93, 0x8f, 0xc2, 0x22, 0xfd, 0xd5, 0x8e,
+ 0xac, 0x84, 0x98, 0x4c, 0x16, 0x6b, 0xb3, 0xec, 0x3c, 0x11, 0x02, 0x79, 0x0d, 0xf3, 0x51, 0x79,
+ 0xc3, 0xb1, 0xc4, 0xbc, 0x8a, 0xe4, 0x53, 0xde, 0x70, 0x9c, 0x0c, 0x25, 0x2f, 0x21, 0x93, 0x4a,
+ 0xd8, 0x74, 0x91, 0x42, 0x8e, 0xa7, 0xbd, 0x42, 0xc1, 0x23, 0x5f, 0x6b, 0xb6, 0x88, 0x61, 0x2d,
+ 0x3b, 0x55, 0x26, 0xaa, 0x61, 0x23, 0xac, 0xca, 0x0e, 0xd3, 0x14, 0x71, 0xa6, 0x96, 0x35, 0x22,
+ 0x38, 0xea, 0xd9, 0x5d, 0x04, 0xc7, 0x1a, 0x11, 0x22, 0x93, 0x6d, 0x58, 0x63, 0x3c, 0x7e, 0x98,
+ 0x8a, 0x96, 0xb3, 0xb8, 0x78, 0xb6, 0x45, 0xb9, 0x6a, 0xe5, 0xcf, 0x27, 0x2a, 0x90, 0x5d, 0x98,
+ 0xc3, 0xb7, 0x26, 0xf7, 0x86, 0xb8, 0x28, 0x8b, 0x09, 0x92, 0xfb, 0x08, 0xcf, 0x15, 0x14, 0x10,
+ 0xc8, 0xe7, 0x0a, 0xa2, 0x92, 0xcf, 0x03, 0x18, 0x83, 0x91, 0xdf, 0xef, 0x63, 0x94, 0xf5, 0x62,
+ 0xcc, 0x95, 0x95, 0xd3, 0x41, 0x2a, 0x11, 0x12, 0x8f, 0x08, 0x8a, 0xbf, 0xed, 0x44, 0x2c, 0x76,
+ 0x89, 0x96, 0x56, 0x85, 0x79, 0xb6, 0x19, 0x31, 0x63, 0x01, 0xcf, 0xc1, 0x24, 0xc5, 0xbb, 0x67,
+ 0x19, 0x0b, 0x38, 0x3c, 0x9d, 0xb1, 0x40, 0xaa, 0xa0, 0xdd, 0x83, 0x8d, 0xac, 0x8e, 0xc5, 0x5e,
+ 0xc7, 0xca, 0x69, 0x5f, 0xc7, 0x3f, 0xc8, 0xc3, 0x32, 0x52, 0x13, 0xa7, 0xb0, 0x0e, 0x2b, 0xd6,
+ 0xe4, 0x61, 0x18, 0xce, 0x4f, 0x9c, 0xc6, 0xd8, 0xbe, 0x40, 0x2e, 0x90, 0x75, 0x78, 0xb1, 0x1a,
+ 0xc4, 0x80, 0x55, 0x71, 0x13, 0xec, 0x09, 0xcf, 0x81, 0x30, 0x59, 0x80, 0x70, 0xa8, 0x48, 0xa7,
+ 0xe2, 0x4e, 0x54, 0x8a, 0xee, 0x83, 0xfc, 0x93, 0xdc, 0x07, 0x85, 0x53, 0xdd, 0x07, 0x6f, 0xc0,
+ 0xb2, 0xf8, 0x1a, 0x9e, 0xe4, 0x73, 0xef, 0xef, 0x24, 0x8f, 0x11, 0x23, 0xb5, 0xf0, 0x44, 0x9f,
+ 0x9f, 0x79, 0xa2, 0xa3, 0x62, 0x54, 0xec, 0xb2, 0x21, 0xc2, 0xd2, 0x07, 0x3b, 0xe6, 0xaa, 0xdd,
+ 0x2b, 0xb7, 0x7e, 0x85, 0x5b, 0xf2, 0x65, 0x58, 0xac, 0xf9, 0x42, 0x27, 0x26, 0x29, 0x23, 0xfa,
+ 0x02, 0x28, 0xb3, 0x0b, 0x21, 0x66, 0x78, 0xbb, 0xe5, 0x3f, 0x88, 0xdb, 0xed, 0x35, 0x00, 0xee,
+ 0x92, 0x12, 0xe5, 0x98, 0xc4, 0x2d, 0x23, 0xa2, 0x12, 0xc5, 0x75, 0x22, 0x12, 0x32, 0x3d, 0x9d,
+ 0xb8, 0xb9, 0x8d, 0xde, 0xed, 0xfa, 0x93, 0xc1, 0x38, 0x96, 0x94, 0x5d, 0x78, 0xad, 0x3b, 0xbc,
+ 0x4c, 0x3e, 0x1e, 0x12, 0xd5, 0x3e, 0xd8, 0x09, 0x21, 0x9f, 0x0b, 0x8d, 0x1f, 0x17, 0x66, 0x8d,
+ 0x90, 0x96, 0x1a, 0xa1, 0xa9, 0x26, 0x8f, 0xda, 0x4f, 0x15, 0x39, 0x53, 0xcb, 0xaf, 0x30, 0xd5,
+ 0xaf, 0x02, 0x84, 0x46, 0x09, 0x62, 0xae, 0x43, 0x37, 0x71, 0x06, 0x95, 0x47, 0x39, 0xc2, 0x95,
+ 0x7a, 0x93, 0xff, 0xa0, 0x7a, 0xd3, 0x86, 0xa5, 0xe6, 0x9b, 0x63, 0x27, 0xb2, 0x62, 0x01, 0x2b,
+ 0xe4, 0x64, 0xf1, 0x64, 0xca, 0x6f, 0x3f, 0x8b, 0x77, 0x43, 0xc4, 0x07, 0x4f, 0x61, 0x81, 0xa5,
+ 0x8a, 0xda, 0x7f, 0x28, 0xb0, 0x26, 0x87, 0xda, 0x38, 0x19, 0x74, 0xc9, 0xa7, 0x59, 0xe0, 0x68,
+ 0x25, 0xf6, 0x64, 0x91, 0x90, 0xe8, 0x91, 0x7b, 0x32, 0xe8, 0x32, 0x06, 0xc8, 0x79, 0x24, 0x37,
+ 0x96, 0x56, 0x24, 0x0f, 0x61, 0xb9, 0xe5, 0xf7, 0xfb, 0x94, 0xad, 0x19, 0xbd, 0xc5, 0x1f, 0x00,
+ 0x94, 0x50, 0x52, 0x35, 0x22, 0x1a, 0xb4, 0xfd, 0x0c, 0x7f, 0xe7, 0x6e, 0x0e, 0xe9, 0x79, 0xef,
+ 0xf1, 0x7a, 0x11, 0xd9, 0xb7, 0xd1, 0x35, 0x50, 0xa6, 0x19, 0xdd, 0x4d, 0xf1, 0x8c, 0x23, 0x72,
+ 0x2b, 0x69, 0x31, 0xb6, 0x73, 0xc6, 0xdd, 0xa4, 0xfd, 0x5c, 0x01, 0x92, 0xee, 0x9a, 0x7c, 0xf4,
+ 0x29, 0xff, 0x0d, 0xac, 0x70, 0x82, 0x85, 0x2c, 0x3c, 0x09, 0x0b, 0xa9, 0x7d, 0x5f, 0x81, 0x8d,
+ 0xac, 0x71, 0xa0, 0x37, 0x88, 0x7c, 0xa5, 0x84, 0x17, 0x1a, 0xde, 0x20, 0xf2, 0x2d, 0x14, 0xbf,
+ 0xd6, 0x12, 0x95, 0x92, 0x8d, 0xcb, 0x3d, 0x49, 0xe3, 0x4a, 0xbf, 0xa7, 0xc0, 0x5a, 0x55, 0xaf,
+ 0xf3, 0x04, 0x35, 0x4c, 0x4d, 0x75, 0x0d, 0x2e, 0x57, 0xf5, 0xba, 0xdd, 0x6a, 0xd6, 0xaa, 0xe5,
+ 0x07, 0x76, 0x66, 0xdc, 0xf9, 0xcb, 0xf0, 0x54, 0x1a, 0x25, 0x52, 0x67, 0x5d, 0x82, 0xad, 0x74,
+ 0xb1, 0x88, 0x4d, 0x9f, 0x5d, 0x59, 0x84, 0xb1, 0xcf, 0x97, 0x3e, 0x03, 0x6b, 0x22, 0x0e, 0x7b,
+ 0xbb, 0x66, 0x61, 0xa6, 0x97, 0x35, 0x58, 0xda, 0x37, 0xcc, 0xea, 0xee, 0x03, 0x7b, 0xb7, 0x53,
+ 0xab, 0xa9, 0x67, 0xc8, 0x0a, 0x2c, 0x72, 0x40, 0x59, 0x57, 0x15, 0xb2, 0x0c, 0xc5, 0x6a, 0xc3,
+ 0x32, 0xca, 0x1d, 0xd3, 0x50, 0x73, 0xa5, 0xcf, 0xc0, 0x6a, 0x6b, 0xe4, 0xbd, 0xe5, 0x8c, 0xdd,
+ 0x7b, 0xee, 0x09, 0x6a, 0xa3, 0x16, 0x20, 0x6f, 0xea, 0xf7, 0xd5, 0x33, 0x04, 0x60, 0xbe, 0x75,
+ 0xaf, 0x6c, 0xdd, 0xbe, 0xad, 0x2a, 0x64, 0x09, 0x16, 0xf6, 0xca, 0x2d, 0xfb, 0x5e, 0xdd, 0x52,
+ 0x73, 0xf4, 0x87, 0x7e, 0xdf, 0xc2, 0x1f, 0xf9, 0xd2, 0x8b, 0xb0, 0x8e, 0x5c, 0x57, 0xcd, 0x0b,
+ 0xc6, 0xee, 0xc0, 0x1d, 0x61, 0x1b, 0x96, 0xa1, 0x68, 0xb9, 0xf4, 0xb8, 0x1c, 0xbb, 0xac, 0x01,
+ 0xf5, 0x49, 0x7f, 0xec, 0x0d, 0xfb, 0xee, 0xd7, 0x55, 0xa5, 0xf4, 0x1a, 0xac, 0x99, 0xfe, 0x64,
+ 0xec, 0x0d, 0x0e, 0xad, 0x31, 0xc5, 0x38, 0x3c, 0x21, 0xe7, 0x60, 0xbd, 0xd3, 0xd0, 0xeb, 0xdb,
+ 0xd5, 0xbd, 0x4e, 0xb3, 0x63, 0xd9, 0x75, 0xbd, 0x5d, 0xae, 0x30, 0x5d, 0x58, 0xbd, 0x69, 0xb5,
+ 0x6d, 0xd3, 0x28, 0x1b, 0x8d, 0xb6, 0xaa, 0x94, 0xbe, 0x8b, 0x02, 0xa4, 0xae, 0x3f, 0xe8, 0xed,
+ 0x3a, 0xdd, 0xb1, 0x3f, 0xc2, 0x06, 0x6b, 0x70, 0xc5, 0x32, 0xca, 0xcd, 0xc6, 0x8e, 0xbd, 0xab,
+ 0x97, 0xdb, 0x4d, 0x33, 0x2b, 0xf1, 0xc1, 0x05, 0x38, 0x9f, 0x81, 0xd3, 0x6c, 0xb7, 0x54, 0x85,
+ 0x5c, 0x85, 0x8b, 0x19, 0x65, 0xf7, 0x8d, 0x6d, 0xbd, 0xd3, 0xae, 0x34, 0xd4, 0xdc, 0x94, 0xca,
+ 0x96, 0xd5, 0x54, 0xf3, 0xa5, 0xdf, 0x52, 0x60, 0xb5, 0x13, 0x70, 0xbb, 0xfa, 0x0e, 0x7a, 0x11,
+ 0x3f, 0x0d, 0x97, 0x3a, 0x96, 0x61, 0xda, 0xed, 0xe6, 0x3d, 0xa3, 0x61, 0x77, 0x2c, 0x7d, 0x2f,
+ 0xd9, 0x9a, 0xab, 0x70, 0x51, 0xc2, 0x30, 0x8d, 0x72, 0x73, 0xdf, 0x30, 0xed, 0x96, 0x6e, 0x59,
+ 0xf7, 0x9b, 0xe6, 0x8e, 0xaa, 0xd0, 0x2f, 0x66, 0x20, 0xd4, 0x77, 0x75, 0xd6, 0x9a, 0x58, 0x59,
+ 0xc3, 0xb8, 0xaf, 0xd7, 0xec, 0xed, 0x66, 0x5b, 0xcd, 0x97, 0xea, 0x94, 0x89, 0xc1, 0xf0, 0xe3,
+ 0xcc, 0x7c, 0xb2, 0x08, 0x85, 0x46, 0xb3, 0x61, 0x24, 0x35, 0xa8, 0xcb, 0x50, 0xd4, 0x5b, 0x2d,
+ 0xb3, 0xb9, 0x8f, 0x4b, 0x0c, 0x60, 0x7e, 0xc7, 0x68, 0xd0, 0x96, 0xe5, 0x69, 0x49, 0xcb, 0x6c,
+ 0xd6, 0x9b, 0x6d, 0x63, 0x47, 0x2d, 0x94, 0x4c, 0x71, 0xbe, 0x08, 0xa2, 0x5d, 0x9f, 0xa9, 0x2b,
+ 0x77, 0x8c, 0x5d, 0xbd, 0x53, 0x6b, 0xf3, 0x29, 0x7a, 0x60, 0x9b, 0xc6, 0xe7, 0x3a, 0x86, 0xd5,
+ 0xb6, 0x54, 0x85, 0xa8, 0xb0, 0xdc, 0x30, 0x8c, 0x1d, 0xcb, 0x36, 0x8d, 0xfd, 0xaa, 0x71, 0x5f,
+ 0xcd, 0x51, 0x9a, 0xec, 0x7f, 0xfa, 0x85, 0xd2, 0x3b, 0x0a, 0x10, 0x16, 0xba, 0x5d, 0xe4, 0x03,
+ 0xc3, 0x15, 0x73, 0x05, 0x2e, 0x54, 0xe8, 0x54, 0x63, 0xd7, 0xea, 0xcd, 0x9d, 0xe4, 0x90, 0x9d,
+ 0x07, 0x92, 0x28, 0x6f, 0xee, 0xee, 0xaa, 0x0a, 0xb9, 0x08, 0x67, 0x13, 0xf0, 0x1d, 0xb3, 0xd9,
+ 0x52, 0x73, 0x17, 0x72, 0x45, 0x85, 0x6c, 0xa6, 0x0a, 0xef, 0x19, 0x46, 0x4b, 0xcd, 0xd3, 0x29,
+ 0x4a, 0x14, 0x88, 0x2d, 0xc1, 0xaa, 0x17, 0x4a, 0xdf, 0x56, 0xe0, 0x3c, 0x6b, 0xa6, 0xd8, 0x5f,
+ 0x61, 0x53, 0x2f, 0xc1, 0x16, 0x4f, 0x48, 0x91, 0xd5, 0xd0, 0x0d, 0x50, 0x63, 0xa5, 0xac, 0x99,
+ 0xe7, 0x60, 0x3d, 0x06, 0xc5, 0x76, 0xe4, 0xe8, 0xe9, 0x11, 0x03, 0x6f, 0x1b, 0x56, 0xdb, 0x36,
+ 0x76, 0x77, 0x9b, 0x66, 0x9b, 0x35, 0x24, 0x5f, 0xd2, 0x60, 0xbd, 0xec, 0x8e, 0xc6, 0xf4, 0x7d,
+ 0x39, 0x08, 0x3c, 0x7f, 0x80, 0x4d, 0x58, 0x81, 0x45, 0xe3, 0xf3, 0x6d, 0xa3, 0x61, 0x55, 0x9b,
+ 0x0d, 0xf5, 0x4c, 0xe9, 0x52, 0x02, 0x47, 0xec, 0x63, 0xcb, 0xaa, 0xa8, 0x67, 0x4a, 0x0e, 0xac,
+ 0x08, 0xeb, 0x72, 0xb6, 0x2a, 0xae, 0xc0, 0x05, 0xb1, 0xd6, 0xf0, 0x44, 0x49, 0x76, 0x61, 0x0b,
+ 0x36, 0xd2, 0xe5, 0x46, 0x5b, 0x55, 0xe8, 0x2c, 0x24, 0x4a, 0x28, 0x3c, 0x57, 0xfa, 0xbf, 0x0a,
+ 0xac, 0x84, 0x9a, 0x21, 0x94, 0x45, 0x5f, 0x85, 0x8b, 0xf5, 0x5d, 0xdd, 0xde, 0x31, 0xf6, 0xab,
+ 0x65, 0xc3, 0xbe, 0x57, 0x6d, 0xec, 0x24, 0x3e, 0xf2, 0x14, 0x9c, 0xcb, 0x40, 0xc0, 0xaf, 0x6c,
+ 0xc1, 0x46, 0xb2, 0xa8, 0x4d, 0xb7, 0x6a, 0x8e, 0x0e, 0x7d, 0xb2, 0x24, 0xdc, 0xa7, 0xf9, 0xd2,
+ 0x3e, 0xac, 0x5a, 0x7a, 0xbd, 0xb6, 0xeb, 0x8f, 0xba, 0xae, 0x3e, 0x19, 0x1f, 0x0d, 0xc8, 0x45,
+ 0xd8, 0xdc, 0x6d, 0x9a, 0x65, 0xc3, 0x46, 0x94, 0x44, 0x0b, 0xce, 0xc2, 0x9a, 0x5c, 0xf8, 0xc0,
+ 0xa0, 0xcb, 0x97, 0xc0, 0xaa, 0x0c, 0x6c, 0x34, 0xd5, 0x5c, 0xe9, 0x8b, 0xb0, 0x1c, 0x4b, 0x0b,
+ 0xba, 0x09, 0x67, 0xe5, 0xdf, 0x2d, 0x77, 0xd0, 0xf3, 0x06, 0x87, 0xea, 0x99, 0x64, 0x81, 0x39,
+ 0x19, 0x0c, 0x68, 0x01, 0xee, 0x67, 0xb9, 0xa0, 0xed, 0x8e, 0x8e, 0xbd, 0x81, 0x33, 0x76, 0x7b,
+ 0x6a, 0xae, 0xf4, 0x02, 0xac, 0xc4, 0x92, 0x11, 0xd0, 0x89, 0xab, 0x35, 0xf9, 0x01, 0x5c, 0x37,
+ 0x76, 0xaa, 0x9d, 0xba, 0x3a, 0x47, 0x77, 0x72, 0xa5, 0xba, 0x57, 0x51, 0xa1, 0xf4, 0x3d, 0x85,
+ 0x3e, 0xa6, 0x30, 0xc5, 0x58, 0x7d, 0x57, 0x17, 0x53, 0x4d, 0x97, 0x19, 0x4b, 0x71, 0x62, 0x58,
+ 0x16, 0x33, 0x1c, 0xb8, 0x04, 0x5b, 0xfc, 0x87, 0xad, 0x37, 0x76, 0xec, 0x8a, 0x6e, 0xee, 0xdc,
+ 0xd7, 0x4d, 0xba, 0xf6, 0x1e, 0xa8, 0x39, 0xdc, 0x50, 0x12, 0xc4, 0x6e, 0x37, 0x3b, 0xe5, 0x8a,
+ 0x9a, 0xa7, 0xeb, 0x37, 0x06, 0x6f, 0x55, 0x1b, 0x6a, 0x01, 0xb7, 0x67, 0x0a, 0x1b, 0xc9, 0xd2,
+ 0xf2, 0xb9, 0xd2, 0x7b, 0x0a, 0x6c, 0x5a, 0xde, 0xe1, 0xc0, 0x19, 0x4f, 0x46, 0xae, 0xde, 0x3f,
+ 0xf4, 0x47, 0xde, 0xf8, 0xe8, 0xd8, 0x9a, 0x78, 0x63, 0x97, 0xdc, 0x82, 0x67, 0xad, 0xea, 0x5e,
+ 0x43, 0x6f, 0xd3, 0xed, 0xa5, 0xd7, 0xf6, 0x9a, 0x66, 0xb5, 0x5d, 0xa9, 0xdb, 0x56, 0xa7, 0x9a,
+ 0x5a, 0x79, 0xd7, 0xe1, 0xe9, 0xe9, 0xa8, 0x35, 0x63, 0x4f, 0x2f, 0x3f, 0x50, 0x95, 0xd9, 0x04,
+ 0xb7, 0xf5, 0x9a, 0xde, 0x28, 0x1b, 0x3b, 0xf6, 0xfe, 0x6d, 0x35, 0x47, 0x9e, 0x85, 0x6b, 0xd3,
+ 0x51, 0x77, 0xab, 0x2d, 0x8b, 0xa2, 0xe5, 0x67, 0x7f, 0xb7, 0x62, 0xd5, 0x29, 0x56, 0xa1, 0xf4,
+ 0x7d, 0x05, 0xb6, 0xa6, 0x05, 0x97, 0x23, 0x37, 0x40, 0x33, 0x1a, 0x6d, 0x53, 0xaf, 0xee, 0xd8,
+ 0x65, 0xd3, 0xd8, 0x31, 0x1a, 0xed, 0xaa, 0x5e, 0xb3, 0x6c, 0xab, 0xd9, 0xa1, 0xab, 0x29, 0xb2,
+ 0xef, 0x78, 0x06, 0xae, 0xce, 0xc0, 0x6b, 0x56, 0x77, 0xca, 0xaa, 0x42, 0x6e, 0xc3, 0xf3, 0x33,
+ 0x90, 0xac, 0x07, 0x56, 0xdb, 0xa8, 0xcb, 0x25, 0x6a, 0x0e, 0x0f, 0xac, 0xec, 0xd8, 0x5a, 0xb4,
+ 0x77, 0x58, 0x32, 0xbb, 0x61, 0xd7, 0xe0, 0xf2, 0x54, 0x2c, 0xde, 0xac, 0x67, 0xe0, 0xea, 0x54,
+ 0x14, 0xd6, 0x28, 0x35, 0x57, 0x2a, 0xc3, 0x85, 0xe9, 0xc1, 0x8a, 0xe8, 0x7d, 0x11, 0x9f, 0xf2,
+ 0x22, 0x14, 0x76, 0xe8, 0x15, 0x15, 0x4b, 0xc9, 0x53, 0xf2, 0x40, 0x4d, 0x06, 0xf2, 0x48, 0x59,
+ 0x04, 0x99, 0x9d, 0x46, 0x83, 0xdd, 0x67, 0x6b, 0xb0, 0xd4, 0x6c, 0x57, 0x0c, 0x93, 0x27, 0x35,
+ 0xc2, 0x2c, 0x46, 0x9d, 0x06, 0xdd, 0xc1, 0x4d, 0xb3, 0xfa, 0x05, 0xbc, 0xd8, 0xb6, 0x60, 0xc3,
+ 0xaa, 0xe9, 0xe5, 0x7b, 0x76, 0xa3, 0xd9, 0xb6, 0xab, 0x0d, 0xbb, 0x5c, 0xd1, 0x1b, 0x0d, 0xa3,
+ 0xa6, 0x02, 0xce, 0xea, 0x34, 0x4f, 0x56, 0xf2, 0x51, 0xb8, 0xd9, 0xbc, 0xd7, 0xd6, 0xed, 0x56,
+ 0xad, 0xb3, 0x57, 0x6d, 0xd8, 0xd6, 0x83, 0x46, 0x59, 0x30, 0x61, 0xe5, 0xf4, 0xd9, 0x7f, 0x13,
+ 0xae, 0xcf, 0xc4, 0x8e, 0xd2, 0x0f, 0xdd, 0x00, 0x6d, 0x26, 0x26, 0xef, 0x48, 0xe9, 0x67, 0x0a,
+ 0x5c, 0x9c, 0xa1, 0xb1, 0x27, 0xcf, 0xc3, 0xad, 0x8a, 0xa1, 0xef, 0xd4, 0x0c, 0xcb, 0xc2, 0x13,
+ 0x8b, 0x4e, 0x0a, 0xb3, 0x1c, 0xca, 0x3c, 0xd9, 0x6f, 0xc1, 0xb3, 0xb3, 0xd1, 0x23, 0x1e, 0xe1,
+ 0x26, 0x5c, 0x9f, 0x8d, 0xca, 0x79, 0x86, 0x1c, 0x29, 0xc1, 0x8d, 0xd9, 0x98, 0x21, 0xaf, 0x91,
+ 0x2f, 0xfd, 0x8e, 0x02, 0xe7, 0xb3, 0xc5, 0x66, 0xb4, 0x6d, 0xd5, 0x86, 0xd5, 0xd6, 0x6b, 0x35,
+ 0xbb, 0xa5, 0x9b, 0x7a, 0xdd, 0x36, 0x1a, 0x66, 0xb3, 0x56, 0xcb, 0xba, 0x63, 0xaf, 0xc3, 0xd3,
+ 0xd3, 0x51, 0xad, 0xb2, 0x59, 0x6d, 0xd1, 0x6b, 0x44, 0x83, 0x2b, 0xd3, 0xb1, 0x8c, 0x6a, 0xd9,
+ 0x50, 0x73, 0xdb, 0xaf, 0xff, 0xe4, 0xef, 0xae, 0x9c, 0xf9, 0xc9, 0x7b, 0x57, 0x94, 0x9f, 0xbf,
+ 0x77, 0x45, 0xf9, 0xdb, 0xf7, 0xae, 0x28, 0x5f, 0x78, 0xee, 0x74, 0x99, 0xfb, 0xf0, 0x75, 0xf4,
+ 0x70, 0x1e, 0xdf, 0x83, 0x2f, 0xfd, 0x67, 0x00, 0x00, 0x00, 0xff, 0xff, 0x50, 0x79, 0x7a, 0x29,
+ 0x7f, 0xc3, 0x01, 0x00,
}
func (this *PluginSpecV1) Equal(that interface{}) bool {
@@ -51079,6 +51129,20 @@ func (m *AccessGraphSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized)
}
+ if len(m.Azure) > 0 {
+ for iNdEx := len(m.Azure) - 1; iNdEx >= 0; iNdEx-- {
+ {
+ size, err := m.Azure[iNdEx].MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x1a
+ }
+ }
n431, err431 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PollInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval):])
if err431 != nil {
return 0, err431
@@ -51159,6 +51223,47 @@ func (m *AccessGraphAWSSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
+func (m *AccessGraphAzureSync) 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 *AccessGraphAzureSync) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *AccessGraphAzureSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if m.XXX_unrecognized != nil {
+ i -= len(m.XXX_unrecognized)
+ copy(dAtA[i:], m.XXX_unrecognized)
+ }
+ if len(m.Integration) > 0 {
+ i -= len(m.Integration)
+ copy(dAtA[i:], m.Integration)
+ i = encodeVarintTypes(dAtA, i, uint64(len(m.Integration)))
+ i--
+ dAtA[i] = 0x12
+ }
+ if len(m.SubscriptionID) > 0 {
+ i -= len(m.SubscriptionID)
+ copy(dAtA[i:], m.SubscriptionID)
+ i = encodeVarintTypes(dAtA, i, uint64(len(m.SubscriptionID)))
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
func encodeVarintTypes(dAtA []byte, offset int, v uint64) int {
offset -= sovTypes(v)
base := offset
@@ -62647,6 +62752,12 @@ func (m *AccessGraphSync) Size() (n int) {
}
l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval)
n += 1 + l + sovTypes(uint64(l))
+ if len(m.Azure) > 0 {
+ for _, e := range m.Azure {
+ l = e.Size()
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ }
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
@@ -62679,6 +62790,26 @@ func (m *AccessGraphAWSSync) Size() (n int) {
return n
}
+func (m *AccessGraphAzureSync) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = len(m.SubscriptionID)
+ if l > 0 {
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ l = len(m.Integration)
+ if l > 0 {
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ if m.XXX_unrecognized != nil {
+ n += len(m.XXX_unrecognized)
+ }
+ return n
+}
+
func sovTypes(x uint64) (n int) {
return (math_bits.Len64(x|1) + 6) / 7
}
@@ -135582,6 +135713,40 @@ func (m *AccessGraphSync) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Azure", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Azure = append(m.Azure, &AccessGraphAzureSync{})
+ if err := m.Azure[len(m.Azure)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipTypes(dAtA[iNdEx:])
@@ -135755,6 +135920,121 @@ func (m *AccessGraphAWSSync) Unmarshal(dAtA []byte) error {
}
return nil
}
+func (m *AccessGraphAzureSync) 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 ErrIntOverflowTypes
+ }
+ 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: AccessGraphAzureSync: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: AccessGraphAzureSync: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field SubscriptionID", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.SubscriptionID = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Integration", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Integration = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipTypes(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
func skipTypes(dAtA []byte) (n int, err error) {
l := len(dAtA)
iNdEx := 0
diff --git a/gen/proto/go/accessgraph/v1alpha/azure.pb.go b/gen/proto/go/accessgraph/v1alpha/azure.pb.go
new file mode 100644
index 0000000000000..614433025a228
--- /dev/null
+++ b/gen/proto/go/accessgraph/v1alpha/azure.pb.go
@@ -0,0 +1,979 @@
+//
+// Teleport
+// Copyright (C) 2024 Gravitational, Inc.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.35.1
+// protoc (unknown)
+// source: accessgraph/v1alpha/azure.proto
+
+package accessgraphv1alpha
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+ reflect "reflect"
+ sync "sync"
+)
+
+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)
+)
+
+// AzureResourceList is a list of Azure resources
+type AzureResourceList struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Resources []*AzureResource `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"`
+}
+
+func (x *AzureResourceList) Reset() {
+ *x = AzureResourceList{}
+ mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *AzureResourceList) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AzureResourceList) ProtoMessage() {}
+
+func (x *AzureResourceList) ProtoReflect() protoreflect.Message {
+ mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[0]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use AzureResourceList.ProtoReflect.Descriptor instead.
+func (*AzureResourceList) Descriptor() ([]byte, []int) {
+ return file_accessgraph_v1alpha_azure_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *AzureResourceList) GetResources() []*AzureResource {
+ if x != nil {
+ return x.Resources
+ }
+ return nil
+}
+
+// AzureResource is a list of Azure resources supported by the access graph.
+type AzureResource struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Types that are assignable to Resource:
+ //
+ // *AzureResource_Principal
+ // *AzureResource_RoleDefinition
+ // *AzureResource_RoleAssignment
+ // *AzureResource_VirtualMachine
+ Resource isAzureResource_Resource `protobuf_oneof:"resource"`
+}
+
+func (x *AzureResource) Reset() {
+ *x = AzureResource{}
+ mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *AzureResource) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AzureResource) ProtoMessage() {}
+
+func (x *AzureResource) ProtoReflect() protoreflect.Message {
+ mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[1]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use AzureResource.ProtoReflect.Descriptor instead.
+func (*AzureResource) Descriptor() ([]byte, []int) {
+ return file_accessgraph_v1alpha_azure_proto_rawDescGZIP(), []int{1}
+}
+
+func (m *AzureResource) GetResource() isAzureResource_Resource {
+ if m != nil {
+ return m.Resource
+ }
+ return nil
+}
+
+func (x *AzureResource) GetPrincipal() *AzurePrincipal {
+ if x, ok := x.GetResource().(*AzureResource_Principal); ok {
+ return x.Principal
+ }
+ return nil
+}
+
+func (x *AzureResource) GetRoleDefinition() *AzureRoleDefinition {
+ if x, ok := x.GetResource().(*AzureResource_RoleDefinition); ok {
+ return x.RoleDefinition
+ }
+ return nil
+}
+
+func (x *AzureResource) GetRoleAssignment() *AzureRoleAssignment {
+ if x, ok := x.GetResource().(*AzureResource_RoleAssignment); ok {
+ return x.RoleAssignment
+ }
+ return nil
+}
+
+func (x *AzureResource) GetVirtualMachine() *AzureVirtualMachine {
+ if x, ok := x.GetResource().(*AzureResource_VirtualMachine); ok {
+ return x.VirtualMachine
+ }
+ return nil
+}
+
+type isAzureResource_Resource interface {
+ isAzureResource_Resource()
+}
+
+type AzureResource_Principal struct {
+ // principal is an Azure principal
+ Principal *AzurePrincipal `protobuf:"bytes,1,opt,name=principal,proto3,oneof"`
+}
+
+type AzureResource_RoleDefinition struct {
+ // role_definition is an Azure role definition
+ RoleDefinition *AzureRoleDefinition `protobuf:"bytes,2,opt,name=role_definition,json=roleDefinition,proto3,oneof"`
+}
+
+type AzureResource_RoleAssignment struct {
+ // role_assignment is an Azure role assignment, which assigns a role definition to a principal
+ RoleAssignment *AzureRoleAssignment `protobuf:"bytes,3,opt,name=role_assignment,json=roleAssignment,proto3,oneof"`
+}
+
+type AzureResource_VirtualMachine struct {
+ // virtual_machine is an Azure virtual machine, an instance of a compute resource
+ VirtualMachine *AzureVirtualMachine `protobuf:"bytes,4,opt,name=virtual_machine,json=virtualMachine,proto3,oneof"`
+}
+
+func (*AzureResource_Principal) isAzureResource_Resource() {}
+
+func (*AzureResource_RoleDefinition) isAzureResource_Resource() {}
+
+func (*AzureResource_RoleAssignment) isAzureResource_Resource() {}
+
+func (*AzureResource_VirtualMachine) isAzureResource_Resource() {}
+
+// AzureVirtualMachine is an Azure virtual machine
+type AzureVirtualMachine struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // id is the ID of the virtual machine
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+ // subscription_id is the ID of the subscription to which the virtual machine belongs
+ SubscriptionId string `protobuf:"bytes,2,opt,name=subscription_id,json=subscriptionId,proto3" json:"subscription_id,omitempty"`
+ // last_sync_time is when the virtual machine was last fetched from Azure
+ LastSyncTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_sync_time,json=lastSyncTime,proto3" json:"last_sync_time,omitempty"`
+ // name is the given name of the virtual machine
+ Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+ // resource_group is the name of the resource group to which the virtual machine belongs
+ ResourceGroup string `protobuf:"bytes,5,opt,name=resource_group,json=resourceGroup,proto3" json:"resource_group,omitempty"`
+ // tags are a collection of arbitrary key-values applied to the virtual machine
+ Tags map[string]string `protobuf:"bytes,6,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+ // location is the geographical location of the Virtual Machine
+ Location string `protobuf:"bytes,7,opt,name=location,proto3" json:"location,omitempty"`
+}
+
+func (x *AzureVirtualMachine) Reset() {
+ *x = AzureVirtualMachine{}
+ mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *AzureVirtualMachine) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AzureVirtualMachine) ProtoMessage() {}
+
+func (x *AzureVirtualMachine) ProtoReflect() protoreflect.Message {
+ mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[2]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use AzureVirtualMachine.ProtoReflect.Descriptor instead.
+func (*AzureVirtualMachine) Descriptor() ([]byte, []int) {
+ return file_accessgraph_v1alpha_azure_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *AzureVirtualMachine) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *AzureVirtualMachine) GetSubscriptionId() string {
+ if x != nil {
+ return x.SubscriptionId
+ }
+ return ""
+}
+
+func (x *AzureVirtualMachine) GetLastSyncTime() *timestamppb.Timestamp {
+ if x != nil {
+ return x.LastSyncTime
+ }
+ return nil
+}
+
+func (x *AzureVirtualMachine) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *AzureVirtualMachine) GetResourceGroup() string {
+ if x != nil {
+ return x.ResourceGroup
+ }
+ return ""
+}
+
+func (x *AzureVirtualMachine) GetTags() map[string]string {
+ if x != nil {
+ return x.Tags
+ }
+ return nil
+}
+
+func (x *AzureVirtualMachine) GetLocation() string {
+ if x != nil {
+ return x.Location
+ }
+ return ""
+}
+
+// AzureIdentity is a Graph API object identity
+type AzureIdentity struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // sign_in_type is the type of identity used when signing in, e.g. "emailAddress" or "userName"
+ SignInType string `protobuf:"bytes,1,opt,name=sign_in_type,json=signInType,proto3" json:"sign_in_type,omitempty"`
+ // issuer is the issuer of the identity, such as a domain name like "goteleport.com"
+ Issuer string `protobuf:"bytes,2,opt,name=issuer,proto3" json:"issuer,omitempty"`
+ // issuer_assigned_id unique identifier assigned to the user by the issuer
+ IssuerAssignedId string `protobuf:"bytes,3,opt,name=issuer_assigned_id,json=issuerAssignedId,proto3" json:"issuer_assigned_id,omitempty"`
+}
+
+func (x *AzureIdentity) Reset() {
+ *x = AzureIdentity{}
+ mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *AzureIdentity) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AzureIdentity) ProtoMessage() {}
+
+func (x *AzureIdentity) ProtoReflect() protoreflect.Message {
+ mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[3]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use AzureIdentity.ProtoReflect.Descriptor instead.
+func (*AzureIdentity) Descriptor() ([]byte, []int) {
+ return file_accessgraph_v1alpha_azure_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *AzureIdentity) GetSignInType() string {
+ if x != nil {
+ return x.SignInType
+ }
+ return ""
+}
+
+func (x *AzureIdentity) GetIssuer() string {
+ if x != nil {
+ return x.Issuer
+ }
+ return ""
+}
+
+func (x *AzureIdentity) GetIssuerAssignedId() string {
+ if x != nil {
+ return x.IssuerAssignedId
+ }
+ return ""
+}
+
+// AzurePrincipal is a Graph API principal (user, group, service principal)
+type AzurePrincipal struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // id is the ID of the principal
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+ // subscription_id is the ID of the subscription to which the principal belongs
+ SubscriptionId string `protobuf:"bytes,2,opt,name=subscription_id,json=subscriptionId,proto3" json:"subscription_id,omitempty"`
+ // last_sync_time is when the principal was last fetched from Azure
+ LastSyncTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_sync_time,json=lastSyncTime,proto3" json:"last_sync_time,omitempty"`
+ // display_name is the given name for the principal, e.g. a user's first+last name
+ DisplayName string `protobuf:"bytes,4,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
+ // member_of lists the groups and directories the principal is assigned to
+ MemberOf []string `protobuf:"bytes,5,rep,name=member_of,json=memberOf,proto3" json:"member_of,omitempty"`
+ // identities lists the identities that can be used to sign in to the account
+ Identities []*AzureIdentity `protobuf:"bytes,6,rep,name=identities,proto3" json:"identities,omitempty"`
+ // object_type defines the type of principal, e.g. "user" or "group"
+ ObjectType string `protobuf:"bytes,7,opt,name=object_type,json=objectType,proto3" json:"object_type,omitempty"`
+}
+
+func (x *AzurePrincipal) Reset() {
+ *x = AzurePrincipal{}
+ mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *AzurePrincipal) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AzurePrincipal) ProtoMessage() {}
+
+func (x *AzurePrincipal) ProtoReflect() protoreflect.Message {
+ mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[4]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use AzurePrincipal.ProtoReflect.Descriptor instead.
+func (*AzurePrincipal) Descriptor() ([]byte, []int) {
+ return file_accessgraph_v1alpha_azure_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *AzurePrincipal) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *AzurePrincipal) GetSubscriptionId() string {
+ if x != nil {
+ return x.SubscriptionId
+ }
+ return ""
+}
+
+func (x *AzurePrincipal) GetLastSyncTime() *timestamppb.Timestamp {
+ if x != nil {
+ return x.LastSyncTime
+ }
+ return nil
+}
+
+func (x *AzurePrincipal) GetDisplayName() string {
+ if x != nil {
+ return x.DisplayName
+ }
+ return ""
+}
+
+func (x *AzurePrincipal) GetMemberOf() []string {
+ if x != nil {
+ return x.MemberOf
+ }
+ return nil
+}
+
+func (x *AzurePrincipal) GetIdentities() []*AzureIdentity {
+ if x != nil {
+ return x.Identities
+ }
+ return nil
+}
+
+func (x *AzurePrincipal) GetObjectType() string {
+ if x != nil {
+ return x.ObjectType
+ }
+ return ""
+}
+
+// AzureRoleAssignment links an Azure principal to a role definition with a scope
+type AzureRoleAssignment struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // id is the ID of the role assignment
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+ // subscription_id is the ID of the subscription to which the role assignment belongs
+ SubscriptionId string `protobuf:"bytes,2,opt,name=subscription_id,json=subscriptionId,proto3" json:"subscription_id,omitempty"`
+ // last_sync_time is when the role assignment was last fetched from Azure
+ LastSyncTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_sync_time,json=lastSyncTime,proto3" json:"last_sync_time,omitempty"`
+ // principal_id is the ID of the principal being assigned a role
+ PrincipalId string `protobuf:"bytes,4,opt,name=principal_id,json=principalId,proto3" json:"principal_id,omitempty"`
+ // role_definition_id is the ID of the role definition assigned to the principal
+ RoleDefinitionId string `protobuf:"bytes,5,opt,name=role_definition_id,json=roleDefinitionId,proto3" json:"role_definition_id,omitempty"`
+ // scope constrains which resources the assignment applies to
+ Scope string `protobuf:"bytes,6,opt,name=scope,proto3" json:"scope,omitempty"`
+ // condition further which resources the assignment applies to
+ Condition string `protobuf:"bytes,7,opt,name=condition,proto3" json:"condition,omitempty"`
+}
+
+func (x *AzureRoleAssignment) Reset() {
+ *x = AzureRoleAssignment{}
+ mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *AzureRoleAssignment) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AzureRoleAssignment) ProtoMessage() {}
+
+func (x *AzureRoleAssignment) ProtoReflect() protoreflect.Message {
+ mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[5]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use AzureRoleAssignment.ProtoReflect.Descriptor instead.
+func (*AzureRoleAssignment) Descriptor() ([]byte, []int) {
+ return file_accessgraph_v1alpha_azure_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *AzureRoleAssignment) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *AzureRoleAssignment) GetSubscriptionId() string {
+ if x != nil {
+ return x.SubscriptionId
+ }
+ return ""
+}
+
+func (x *AzureRoleAssignment) GetLastSyncTime() *timestamppb.Timestamp {
+ if x != nil {
+ return x.LastSyncTime
+ }
+ return nil
+}
+
+func (x *AzureRoleAssignment) GetPrincipalId() string {
+ if x != nil {
+ return x.PrincipalId
+ }
+ return ""
+}
+
+func (x *AzureRoleAssignment) GetRoleDefinitionId() string {
+ if x != nil {
+ return x.RoleDefinitionId
+ }
+ return ""
+}
+
+func (x *AzureRoleAssignment) GetScope() string {
+ if x != nil {
+ return x.Scope
+ }
+ return ""
+}
+
+func (x *AzureRoleAssignment) GetCondition() string {
+ if x != nil {
+ return x.Condition
+ }
+ return ""
+}
+
+// AzureRoleDefinition defines a role by its permissions
+type AzureRoleDefinition struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // id is the ID of the role definition
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+ // subscription_id is the ID of the subscription to which the role definition belongs
+ SubscriptionId string `protobuf:"bytes,2,opt,name=subscription_id,json=subscriptionId,proto3" json:"subscription_id,omitempty"`
+ // last_sync_time is when the role definition was last fetched from Azure
+ LastSyncTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_sync_time,json=lastSyncTime,proto3" json:"last_sync_time,omitempty"`
+ // name is the given name for the role definition
+ Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+ // description provides additional detail about the role definition
+ Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"`
+ // assignable_scopes limits the scopes defined in corresponding role assignments
+ AssignableScopes []string `protobuf:"bytes,6,rep,name=assignable_scopes,json=assignableScopes,proto3" json:"assignable_scopes,omitempty"`
+ // permissions define the actions and not (disallowed) actions
+ Permissions []*AzureRBACPermission `protobuf:"bytes,7,rep,name=permissions,proto3" json:"permissions,omitempty"`
+ // role_name is the given name for the role itself
+ RoleName string `protobuf:"bytes,8,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"`
+ // type defines the type of role
+ Type string `protobuf:"bytes,9,opt,name=type,proto3" json:"type,omitempty"`
+}
+
+func (x *AzureRoleDefinition) Reset() {
+ *x = AzureRoleDefinition{}
+ mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[6]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *AzureRoleDefinition) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AzureRoleDefinition) ProtoMessage() {}
+
+func (x *AzureRoleDefinition) ProtoReflect() protoreflect.Message {
+ mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[6]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use AzureRoleDefinition.ProtoReflect.Descriptor instead.
+func (*AzureRoleDefinition) Descriptor() ([]byte, []int) {
+ return file_accessgraph_v1alpha_azure_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *AzureRoleDefinition) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *AzureRoleDefinition) GetSubscriptionId() string {
+ if x != nil {
+ return x.SubscriptionId
+ }
+ return ""
+}
+
+func (x *AzureRoleDefinition) GetLastSyncTime() *timestamppb.Timestamp {
+ if x != nil {
+ return x.LastSyncTime
+ }
+ return nil
+}
+
+func (x *AzureRoleDefinition) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *AzureRoleDefinition) GetDescription() string {
+ if x != nil {
+ return x.Description
+ }
+ return ""
+}
+
+func (x *AzureRoleDefinition) GetAssignableScopes() []string {
+ if x != nil {
+ return x.AssignableScopes
+ }
+ return nil
+}
+
+func (x *AzureRoleDefinition) GetPermissions() []*AzureRBACPermission {
+ if x != nil {
+ return x.Permissions
+ }
+ return nil
+}
+
+func (x *AzureRoleDefinition) GetRoleName() string {
+ if x != nil {
+ return x.RoleName
+ }
+ return ""
+}
+
+func (x *AzureRoleDefinition) GetType() string {
+ if x != nil {
+ return x.Type
+ }
+ return ""
+}
+
+// AzureRBACPermission defines the actions and not (disallowed) actions for a role definition
+type AzureRBACPermission struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // actions define the resources and verbs allowed on the resources
+ Actions []string `protobuf:"bytes,1,rep,name=actions,proto3" json:"actions,omitempty"`
+ // not_actions define the resources and verbs disallowed on the resources
+ NotActions []string `protobuf:"bytes,2,rep,name=not_actions,json=notActions,proto3" json:"not_actions,omitempty"`
+ // data_actions define fine-grained resources and verbs allowed within the resource
+ DataActions []string `protobuf:"bytes,3,rep,name=data_actions,json=dataActions,proto3" json:"data_actions,omitempty"`
+ // not_data_actions define fine-grained resources and verbs disallowed within the resource
+ NotDataActions []string `protobuf:"bytes,4,rep,name=not_data_actions,json=notDataActions,proto3" json:"not_data_actions,omitempty"`
+}
+
+func (x *AzureRBACPermission) Reset() {
+ *x = AzureRBACPermission{}
+ mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[7]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *AzureRBACPermission) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AzureRBACPermission) ProtoMessage() {}
+
+func (x *AzureRBACPermission) ProtoReflect() protoreflect.Message {
+ mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[7]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use AzureRBACPermission.ProtoReflect.Descriptor instead.
+func (*AzureRBACPermission) Descriptor() ([]byte, []int) {
+ return file_accessgraph_v1alpha_azure_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *AzureRBACPermission) GetActions() []string {
+ if x != nil {
+ return x.Actions
+ }
+ return nil
+}
+
+func (x *AzureRBACPermission) GetNotActions() []string {
+ if x != nil {
+ return x.NotActions
+ }
+ return nil
+}
+
+func (x *AzureRBACPermission) GetDataActions() []string {
+ if x != nil {
+ return x.DataActions
+ }
+ return nil
+}
+
+func (x *AzureRBACPermission) GetNotDataActions() []string {
+ if x != nil {
+ return x.NotDataActions
+ }
+ return nil
+}
+
+var File_accessgraph_v1alpha_azure_proto protoreflect.FileDescriptor
+
+var file_accessgraph_v1alpha_azure_proto_rawDesc = []byte{
+ 0x0a, 0x1f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x76, 0x31,
+ 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x12, 0x13, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76,
+ 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+ 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x55, 0x0a, 0x11, 0x41, 0x7a, 0x75, 0x72, 0x65,
+ 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x09,
+ 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
+ 0x22, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31,
+ 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75,
+ 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xdf,
+ 0x02, 0x0a, 0x0d, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+ 0x12, 0x43, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70,
+ 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x50,
+ 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e,
+ 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, 0x53, 0x0a, 0x0f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x64, 0x65,
+ 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28,
+ 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61,
+ 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x44, 0x65,
+ 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65,
+ 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x0f, 0x72, 0x6f,
+ 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70,
+ 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x52,
+ 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52,
+ 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12,
+ 0x53, 0x0a, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69,
+ 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73,
+ 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41,
+ 0x7a, 0x75, 0x72, 0x65, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69,
+ 0x6e, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x4d, 0x61, 0x63,
+ 0x68, 0x69, 0x6e, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+ 0x22, 0xe8, 0x02, 0x0a, 0x13, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61,
+ 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x73,
+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49,
+ 0x64, 0x12, 0x40, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74,
+ 0x69, 0x6d, 0x65, 0x18, 0x03, 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, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x54,
+ 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75,
+ 0x72, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x46,
+ 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61,
+ 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
+ 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x4d,
+ 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
+ 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
+ 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
+ 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x77, 0x0a, 0x0d, 0x41,
+ 0x7a, 0x75, 0x72, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0c,
+ 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16,
+ 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
+ 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72,
+ 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x10, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e,
+ 0x65, 0x64, 0x49, 0x64, 0x22, 0xb0, 0x02, 0x0a, 0x0e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x50, 0x72,
+ 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x73, 0x63,
+ 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64,
+ 0x12, 0x40, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x69,
+ 0x6d, 0x65, 0x18, 0x03, 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, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x69,
+ 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61,
+ 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61,
+ 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f,
+ 0x6f, 0x66, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72,
+ 0x4f, 0x66, 0x12, 0x42, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73,
+ 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67,
+ 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75,
+ 0x72, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x95, 0x02, 0x0a, 0x13, 0x41, 0x7a, 0x75, 0x72,
+ 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12,
+ 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
+ 0x27, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+ 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72,
+ 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74,
+ 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 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, 0x52, 0x0c, 0x6c, 0x61,
+ 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72,
+ 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x2c, 0x0a,
+ 0x12, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x6f, 0x6c, 0x65, 0x44,
+ 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73,
+ 0x63, 0x6f, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70,
+ 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22,
+ 0xf0, 0x02, 0x0a, 0x13, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x44, 0x65, 0x66,
+ 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x73, 0x63,
+ 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64,
+ 0x12, 0x40, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x69,
+ 0x6d, 0x65, 0x18, 0x03, 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, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x69,
+ 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73,
+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x73, 0x73, 0x69,
+ 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20,
+ 0x03, 0x28, 0x09, 0x52, 0x10, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53,
+ 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73,
+ 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x63, 0x63,
+ 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
+ 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x42, 0x41, 0x43, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73,
+ 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+ 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12,
+ 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79,
+ 0x70, 0x65, 0x22, 0x9d, 0x01, 0x0a, 0x13, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x42, 0x41, 0x43,
+ 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x6f, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x6f, 0x74, 0x41, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x61, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x61, 0x74,
+ 0x61, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x74, 0x5f,
+ 0x64, 0x61, 0x74, 0x61, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03,
+ 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x41, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x73, 0x42, 0x57, 0x5a, 0x55, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
+ 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74,
+ 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68,
+ 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x3b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67,
+ 0x72, 0x61, 0x70, 0x68, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_accessgraph_v1alpha_azure_proto_rawDescOnce sync.Once
+ file_accessgraph_v1alpha_azure_proto_rawDescData = file_accessgraph_v1alpha_azure_proto_rawDesc
+)
+
+func file_accessgraph_v1alpha_azure_proto_rawDescGZIP() []byte {
+ file_accessgraph_v1alpha_azure_proto_rawDescOnce.Do(func() {
+ file_accessgraph_v1alpha_azure_proto_rawDescData = protoimpl.X.CompressGZIP(file_accessgraph_v1alpha_azure_proto_rawDescData)
+ })
+ return file_accessgraph_v1alpha_azure_proto_rawDescData
+}
+
+var file_accessgraph_v1alpha_azure_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
+var file_accessgraph_v1alpha_azure_proto_goTypes = []any{
+ (*AzureResourceList)(nil), // 0: accessgraph.v1alpha.AzureResourceList
+ (*AzureResource)(nil), // 1: accessgraph.v1alpha.AzureResource
+ (*AzureVirtualMachine)(nil), // 2: accessgraph.v1alpha.AzureVirtualMachine
+ (*AzureIdentity)(nil), // 3: accessgraph.v1alpha.AzureIdentity
+ (*AzurePrincipal)(nil), // 4: accessgraph.v1alpha.AzurePrincipal
+ (*AzureRoleAssignment)(nil), // 5: accessgraph.v1alpha.AzureRoleAssignment
+ (*AzureRoleDefinition)(nil), // 6: accessgraph.v1alpha.AzureRoleDefinition
+ (*AzureRBACPermission)(nil), // 7: accessgraph.v1alpha.AzureRBACPermission
+ nil, // 8: accessgraph.v1alpha.AzureVirtualMachine.TagsEntry
+ (*timestamppb.Timestamp)(nil), // 9: google.protobuf.Timestamp
+}
+var file_accessgraph_v1alpha_azure_proto_depIdxs = []int32{
+ 1, // 0: accessgraph.v1alpha.AzureResourceList.resources:type_name -> accessgraph.v1alpha.AzureResource
+ 4, // 1: accessgraph.v1alpha.AzureResource.principal:type_name -> accessgraph.v1alpha.AzurePrincipal
+ 6, // 2: accessgraph.v1alpha.AzureResource.role_definition:type_name -> accessgraph.v1alpha.AzureRoleDefinition
+ 5, // 3: accessgraph.v1alpha.AzureResource.role_assignment:type_name -> accessgraph.v1alpha.AzureRoleAssignment
+ 2, // 4: accessgraph.v1alpha.AzureResource.virtual_machine:type_name -> accessgraph.v1alpha.AzureVirtualMachine
+ 9, // 5: accessgraph.v1alpha.AzureVirtualMachine.last_sync_time:type_name -> google.protobuf.Timestamp
+ 8, // 6: accessgraph.v1alpha.AzureVirtualMachine.tags:type_name -> accessgraph.v1alpha.AzureVirtualMachine.TagsEntry
+ 9, // 7: accessgraph.v1alpha.AzurePrincipal.last_sync_time:type_name -> google.protobuf.Timestamp
+ 3, // 8: accessgraph.v1alpha.AzurePrincipal.identities:type_name -> accessgraph.v1alpha.AzureIdentity
+ 9, // 9: accessgraph.v1alpha.AzureRoleAssignment.last_sync_time:type_name -> google.protobuf.Timestamp
+ 9, // 10: accessgraph.v1alpha.AzureRoleDefinition.last_sync_time:type_name -> google.protobuf.Timestamp
+ 7, // 11: accessgraph.v1alpha.AzureRoleDefinition.permissions:type_name -> accessgraph.v1alpha.AzureRBACPermission
+ 12, // [12:12] is the sub-list for method output_type
+ 12, // [12:12] is the sub-list for method input_type
+ 12, // [12:12] is the sub-list for extension type_name
+ 12, // [12:12] is the sub-list for extension extendee
+ 0, // [0:12] is the sub-list for field type_name
+}
+
+func init() { file_accessgraph_v1alpha_azure_proto_init() }
+func file_accessgraph_v1alpha_azure_proto_init() {
+ if File_accessgraph_v1alpha_azure_proto != nil {
+ return
+ }
+ file_accessgraph_v1alpha_azure_proto_msgTypes[1].OneofWrappers = []any{
+ (*AzureResource_Principal)(nil),
+ (*AzureResource_RoleDefinition)(nil),
+ (*AzureResource_RoleAssignment)(nil),
+ (*AzureResource_VirtualMachine)(nil),
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_accessgraph_v1alpha_azure_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 9,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_accessgraph_v1alpha_azure_proto_goTypes,
+ DependencyIndexes: file_accessgraph_v1alpha_azure_proto_depIdxs,
+ MessageInfos: file_accessgraph_v1alpha_azure_proto_msgTypes,
+ }.Build()
+ File_accessgraph_v1alpha_azure_proto = out.File
+ file_accessgraph_v1alpha_azure_proto_rawDesc = nil
+ file_accessgraph_v1alpha_azure_proto_goTypes = nil
+ file_accessgraph_v1alpha_azure_proto_depIdxs = nil
+}
diff --git a/go.mod b/go.mod
index 7bd7144e546f7..dee4baaf339a5 100644
--- a/go.mod
+++ b/go.mod
@@ -3,21 +3,21 @@ module github.com/gravitational/teleport
go 1.23.5
require (
- cloud.google.com/go/cloudsqlconn v1.12.1
- cloud.google.com/go/compute v1.28.1
- cloud.google.com/go/compute/metadata v0.5.2
- cloud.google.com/go/container v1.40.0
- cloud.google.com/go/firestore v1.17.0
- cloud.google.com/go/iam v1.2.1
- cloud.google.com/go/kms v1.20.0
- cloud.google.com/go/resourcemanager v1.10.1
- cloud.google.com/go/spanner v1.68.0
- cloud.google.com/go/storage v1.43.0
- connectrpc.com/connect v1.17.0
- github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0
- github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0
- github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3 v3.0.1
- github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v2 v2.4.0
+ cloud.google.com/go/cloudsqlconn v1.13.2
+ cloud.google.com/go/compute v1.31.1
+ cloud.google.com/go/compute/metadata v0.6.0
+ cloud.google.com/go/container v1.42.1
+ cloud.google.com/go/firestore v1.18.0
+ cloud.google.com/go/iam v1.3.1
+ cloud.google.com/go/kms v1.20.4
+ cloud.google.com/go/resourcemanager v1.10.3
+ cloud.google.com/go/spanner v1.73.0
+ cloud.google.com/go/storage v1.49.0
+ connectrpc.com/connect v1.18.0
+ github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0
+ github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0
+ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2 v2.2.0
+ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v6 v6.2.0
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/msi/armmsi v1.2.0
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/mysql/armmysql v1.2.0
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/mysql/armmysqlflexibleservers v1.2.0
@@ -91,7 +91,7 @@ require (
github.com/dustin/go-humanize v1.0.1
github.com/elastic/go-elasticsearch/v8 v8.15.0
github.com/elimity-com/scim v0.0.0-20240320110924-172bf2aee9c8
- github.com/envoyproxy/go-control-plane v0.13.0
+ github.com/envoyproxy/go-control-plane v0.13.1
github.com/evanphx/json-patch v5.9.0+incompatible
github.com/fatih/color v1.17.0
github.com/fsnotify/fsnotify v1.7.0
@@ -122,7 +122,7 @@ require (
github.com/google/safetext v0.0.0-20240104143208-7a7d9b3d812f
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
github.com/google/uuid v1.6.0
- github.com/googleapis/gax-go/v2 v2.13.0
+ github.com/googleapis/gax-go/v2 v2.14.0
github.com/gorilla/websocket v1.5.3
github.com/grafana/pyroscope-go v1.2.0
github.com/gravitational/license v0.0.0-20240313232707-8312e719d624
@@ -152,7 +152,7 @@ require (
github.com/mattn/go-shellwords v1.0.12
github.com/mattn/go-sqlite3 v1.14.23
github.com/mdlayher/netlink v1.7.2
- github.com/microsoft/go-mssqldb v1.7.2 // replaced
+ github.com/microsoft/go-mssqldb v1.8.0 // replaced
github.com/miekg/pkcs11 v1.1.1
github.com/mitchellh/mapstructure v1.5.0
github.com/moby/term v0.5.0
@@ -169,7 +169,7 @@ require (
github.com/prometheus/client_model v0.6.1
github.com/prometheus/common v0.55.0
github.com/quic-go/quic-go v0.48.2
- github.com/redis/go-redis/v9 v9.5.1 // replaced
+ github.com/redis/go-redis/v9 v9.6.1 // replaced
github.com/russellhaering/gosaml2 v0.9.1
github.com/russellhaering/goxmldsig v1.4.0
github.com/schollz/progressbar/v3 v3.16.0
@@ -201,22 +201,22 @@ require (
go.opentelemetry.io/otel/trace v1.30.0
go.opentelemetry.io/proto/otlp v1.3.1
go.uber.org/zap v1.27.0
- golang.org/x/crypto v0.31.0
+ golang.org/x/crypto v0.32.0
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56
golang.org/x/mod v0.21.0
- golang.org/x/net v0.33.0
- golang.org/x/oauth2 v0.23.0
+ golang.org/x/net v0.34.0
+ golang.org/x/oauth2 v0.24.0
golang.org/x/sync v0.10.0
- golang.org/x/sys v0.28.0
- golang.org/x/term v0.27.0
+ golang.org/x/sys v0.29.0
+ golang.org/x/term v0.28.0
golang.org/x/text v0.21.0
- golang.org/x/time v0.6.0
+ golang.org/x/time v0.8.0
golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173
- google.golang.org/api v0.197.0
- google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1
- google.golang.org/grpc v1.66.3
+ google.golang.org/api v0.214.0
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576
+ google.golang.org/grpc v1.67.3
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1
- google.golang.org/protobuf v1.35.1
+ google.golang.org/protobuf v1.35.2
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c
gopkg.in/dnaeon/go-vcr.v3 v3.2.0
gopkg.in/ini.v1 v1.67.0
@@ -242,13 +242,18 @@ require (
)
require (
- cel.dev/expr v0.16.0 // indirect
- cloud.google.com/go v0.115.1 // indirect
- cloud.google.com/go/auth v0.9.4 // indirect
- cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect
- cloud.google.com/go/longrunning v0.6.1 // indirect
- cloud.google.com/go/monitoring v1.21.0 // indirect
- cloud.google.com/go/pubsub v1.43.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3 v3.0.1
+ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v2 v2.4.0
+)
+
+require (
+ cel.dev/expr v0.16.1 // indirect
+ cloud.google.com/go v0.117.0 // indirect
+ cloud.google.com/go/auth v0.13.0 // indirect
+ cloud.google.com/go/auth/oauth2adapt v0.2.6 // indirect
+ cloud.google.com/go/longrunning v0.6.2 // indirect
+ cloud.google.com/go/monitoring v1.21.2 // indirect
+ cloud.google.com/go/pubsub v1.45.1 // indirect
dario.cat/mergo v1.0.1 // indirect
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect
github.com/99designs/keyring v1.2.2 // indirect
@@ -258,7 +263,9 @@ require (
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect
github.com/BurntSushi/toml v1.3.2 // indirect
github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 // indirect
- github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1 // indirect
+ github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 // indirect
+ github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 // indirect
+ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 // indirect
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c // indirect
github.com/MakeNowJust/heredoc v1.0.0 // indirect
github.com/Masterminds/goutils v1.1.1 // indirect
@@ -299,7 +306,7 @@ require (
github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0 // indirect
github.com/charmbracelet/x/term v0.2.0 // indirect
github.com/cloudflare/cfssl v1.6.4 // indirect
- github.com/cncf/xds/go v0.0.0-20240822171458-6449f94b4d59 // indirect
+ github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect
github.com/containerd/containerd v1.7.18 // indirect
github.com/containerd/errdefs v0.1.0 // indirect
github.com/containerd/log v0.1.0 // indirect
@@ -544,8 +551,8 @@ require (
golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
- google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect
+ google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
diff --git a/go.sum b/go.sum
index 50b11edc31ce7..bd0c438d9f04c 100644
--- a/go.sum
+++ b/go.sum
@@ -1,5 +1,5 @@
-cel.dev/expr v0.16.0 h1:yloc84fytn4zmJX2GU3TkXGsaieaV7dQ057Qs4sIG2Y=
-cel.dev/expr v0.16.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg=
+cel.dev/expr v0.16.1 h1:NR0+oFYzR1CqLFhTAqg3ql59G9VfN8fKq1TCHJ6gq1g=
+cel.dev/expr v0.16.1/go.mod h1:AsGA5zb3WruAEQeQng1RZdGEXmBj0jvMWh6l5SnNuC8=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -38,8 +38,8 @@ cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRY
cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM=
cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I=
cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY=
-cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ=
-cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc=
+cloud.google.com/go v0.117.0 h1:Z5TNFfQxj7WG2FgOGX1ekC5RiXrYgms6QscOm32M/4s=
+cloud.google.com/go v0.117.0/go.mod h1:ZbwhVTb1DBGt2Iwb3tNO6SEK4q+cplHZmLWH+DelYYc=
cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4=
cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw=
cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E=
@@ -101,10 +101,10 @@ cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVo
cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo=
cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0=
cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E=
-cloud.google.com/go/auth v0.9.4 h1:DxF7imbEbiFu9+zdKC6cKBko1e8XeJnipNqIbWZ+kDI=
-cloud.google.com/go/auth v0.9.4/go.mod h1:SHia8n6//Ya940F1rLimhJCjjx7KE17t0ctFEci3HkA=
-cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY=
-cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc=
+cloud.google.com/go/auth v0.13.0 h1:8Fu8TZy167JkW8Tj3q7dIkr2v4cndv41ouecJx0PAHs=
+cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/EMxX6Q=
+cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU=
+cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8=
cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0=
cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8=
cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8=
@@ -159,8 +159,8 @@ cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb
cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM=
cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk=
cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA=
-cloud.google.com/go/cloudsqlconn v1.12.1 h1:crfkYy4TsYXx+n/wELlPthDYaAmDo2olHLv9DmRuJzY=
-cloud.google.com/go/cloudsqlconn v1.12.1/go.mod h1:Y8x/9e+QsjJNkvOj9mdJ8/ixhE95Ab2H/vsyy0mXWNc=
+cloud.google.com/go/cloudsqlconn v1.13.2 h1:c7dmrgJnbTeCYgPl9CRljbOSkxzh209UKM4LC4Kk6ys=
+cloud.google.com/go/cloudsqlconn v1.13.2/go.mod h1:mjzL/CvXI8JHxMdjj9irBzGHIEMsZSP/hipODO/uxJc=
cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY=
cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI=
cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4=
@@ -182,14 +182,14 @@ cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63
cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs=
cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU=
cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE=
-cloud.google.com/go/compute v1.28.1 h1:XwPcZjgMCnU2tkwY10VleUjSAfpTj9RDn+kGrbYsi8o=
-cloud.google.com/go/compute v1.28.1/go.mod h1:b72iXMY4FucVry3NR3Li4kVyyTvbMDE7x5WsqvxjsYk=
+cloud.google.com/go/compute v1.31.1 h1:SObuy8Fs6woazArpXp1fsHCw+ZH4iJ/8dGGTxUhHZQA=
+cloud.google.com/go/compute v1.31.1/go.mod h1:hyOponWhXviDptJCJSoEh89XO1cfv616wbwbkde1/+8=
cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU=
cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
-cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo=
-cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k=
+cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I=
+cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg=
cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY=
cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck=
cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w=
@@ -198,8 +198,8 @@ cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3
cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4=
cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM=
cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA=
-cloud.google.com/go/container v1.40.0 h1:JVoEg/4RvoGW37r2Eja/cTBc3X9c2loGWYq7QDsRDuI=
-cloud.google.com/go/container v1.40.0/go.mod h1:wNI1mOUivm+ZkpHMbouutgbD4sQxyphMwK31X5cThY4=
+cloud.google.com/go/container v1.42.1 h1:eaMrgOl6NCk+Blhh29GgUVe3QGo7IiJQlP0w/EwLoV0=
+cloud.google.com/go/container v1.42.1/go.mod h1:5huIxYuOD8Ocuj0KbcyRq9MzB3J1mQObS0KSWHTYceY=
cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I=
cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4=
cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI=
@@ -287,8 +287,8 @@ cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLY
cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs=
cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg=
cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE=
-cloud.google.com/go/firestore v1.17.0 h1:iEd1LBbkDZTFsLw3sTH50eyg4qe8eoG6CjocmEXO9aQ=
-cloud.google.com/go/firestore v1.17.0/go.mod h1:69uPx1papBsY8ZETooc71fOhoKkD70Q1DwMrtKuOT/Y=
+cloud.google.com/go/firestore v1.18.0 h1:cuydCaLS7Vl2SatAeivXyhbhDEIR8BDmtn4egDhIn2s=
+cloud.google.com/go/firestore v1.18.0/go.mod h1:5ye0v48PhseZBdcl0qbl3uttu7FIEwEYVaWm0UIEOEU=
cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk=
cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg=
cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY=
@@ -327,8 +327,8 @@ cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGE
cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY=
cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY=
cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0=
-cloud.google.com/go/iam v1.2.1 h1:QFct02HRb7H12J/3utj0qf5tobFh9V4vR6h9eX5EBRU=
-cloud.google.com/go/iam v1.2.1/go.mod h1:3VUIJDPpwT6p/amXRC5GY8fCCh70lxPygguVtI0Z4/g=
+cloud.google.com/go/iam v1.3.1 h1:KFf8SaT71yYq+sQtRISn90Gyhyf4X8RGgeAVC8XGf3E=
+cloud.google.com/go/iam v1.3.1/go.mod h1:3wMtuyT4NcbnYNPLMBzYRFiEfjKfJlLVLrisE7bwm34=
cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc=
cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A=
cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk=
@@ -348,8 +348,8 @@ cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4
cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w=
cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24=
cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI=
-cloud.google.com/go/kms v1.20.0 h1:uKUvjGqbBlI96xGE669hcVnEMw1Px/Mvfa62dhM5UrY=
-cloud.google.com/go/kms v1.20.0/go.mod h1:/dMbFF1tLLFnQV44AoI2GlotbjowyUfgVwezxW291fM=
+cloud.google.com/go/kms v1.20.4 h1:CJ0hMpOg1ANN9tx/a/GPJ+Uxudy8k6f3fvGFuTHiE5A=
+cloud.google.com/go/kms v1.20.4/go.mod h1:gPLsp1r4FblUgBYPOcvI/bUPpdMg2Jm1ZVKU4tQUfcc=
cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=
cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI=
cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE=
@@ -360,11 +360,13 @@ cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6
cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo=
cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw=
cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M=
+cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk=
+cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM=
cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE=
cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc=
cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo=
-cloud.google.com/go/longrunning v0.6.1 h1:lOLTFxYpr8hcRtcwWir5ITh1PAKUD/sG2lKrTSYjyMc=
-cloud.google.com/go/longrunning v0.6.1/go.mod h1:nHISoOZpBcmlwbJmiVk5oDRz0qG/ZxPynEGs1iZ79s0=
+cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc=
+cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI=
cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE=
cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM=
cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA=
@@ -388,8 +390,8 @@ cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhI
cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4=
cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w=
cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw=
-cloud.google.com/go/monitoring v1.21.0 h1:EMc0tB+d3lUewT2NzKC/hr8cSR9WsUieVywzIHetGro=
-cloud.google.com/go/monitoring v1.21.0/go.mod h1:tuJ+KNDdJbetSsbSGTqnaBvbauS5kr3Q/koy3Up6r+4=
+cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU=
+cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU=
cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA=
cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o=
cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM=
@@ -447,8 +449,8 @@ cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcd
cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0=
cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8=
cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4=
-cloud.google.com/go/pubsub v1.43.0 h1:s3Qx+F96J7Kwey/uVHdK3QxFLIlOvvw4SfMYw2jFjb4=
-cloud.google.com/go/pubsub v1.43.0/go.mod h1:LNLfqItblovg7mHWgU5g84Vhza4J8kTxx0YqIeTzcXY=
+cloud.google.com/go/pubsub v1.45.1 h1:ZC/UzYcrmK12THWn1P72z+Pnp2vu/zCZRXyhAfP1hJY=
+cloud.google.com/go/pubsub v1.45.1/go.mod h1:3bn7fTmzZFwaUjllitv1WlsNMkqBgGUb3UdMhI54eCc=
cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg=
cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k=
cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM=
@@ -478,8 +480,8 @@ cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7L
cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots=
cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo=
cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI=
-cloud.google.com/go/resourcemanager v1.10.1 h1:fO/QoSJ1lepmTM9dCbSXYWgTIhecmQkpY0mM1X9OGN0=
-cloud.google.com/go/resourcemanager v1.10.1/go.mod h1:A/ANV/Sv7y7fcjd4LSH7PJGTZcWRkO/69yN5UhYUmvE=
+cloud.google.com/go/resourcemanager v1.10.3 h1:SHOMw0kX0xWratC5Vb5VULBeWiGlPYAs82kiZqNtWpM=
+cloud.google.com/go/resourcemanager v1.10.3/go.mod h1:JSQDy1JA3K7wtaFH23FBGld4dMtzqCoOpwY55XYR8gs=
cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU=
cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg=
cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA=
@@ -540,8 +542,8 @@ cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+
cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos=
cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk=
cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M=
-cloud.google.com/go/spanner v1.68.0 h1:54nL8lEUj5A6frSGnL9VPmHDYbV5UwVkK8fbdnZyDCs=
-cloud.google.com/go/spanner v1.68.0/go.mod h1:X5T0XftydYp0K1adeJQDJtdWpbrOeJ7wHecM4tK6FiE=
+cloud.google.com/go/spanner v1.73.0 h1:0bab8QDn6MNj9lNK6XyGAVFhMlhMU2waePPa6GZNoi8=
+cloud.google.com/go/spanner v1.73.0/go.mod h1:mw98ua5ggQXVWwp83yjwggqEmW9t8rjs9Po1ohcUGW4=
cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM=
cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ=
cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0=
@@ -559,8 +561,8 @@ cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeL
cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s=
cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y=
cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4=
-cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs=
-cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0=
+cloud.google.com/go/storage v1.49.0 h1:zenOPBOWHCnojRd9aJZAyQXBYqkJkdQS42dxL55CIMw=
+cloud.google.com/go/storage v1.49.0/go.mod h1:k1eHhhpLvrPjVGfo0mOUPEJ4Y2+a/Hv5PiwehZI9qGU=
cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w=
cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I=
cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4=
@@ -580,6 +582,8 @@ cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg
cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y=
cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA=
cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk=
+cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI=
+cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io=
cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs=
cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg=
cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0=
@@ -626,8 +630,8 @@ cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoIS
cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=
cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw=
-connectrpc.com/connect v1.17.0 h1:W0ZqMhtVzn9Zhn2yATuUokDLO5N+gIuBWMOnsQrfmZk=
-connectrpc.com/connect v1.17.0/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8=
+connectrpc.com/connect v1.18.0 h1:7ZHAkx8fTaRO4YIyvV00XiS8bx4XjWp0grk9oh0PIQ0=
+connectrpc.com/connect v1.18.0/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8=
cuelabs.dev/go/oci/ociregistry v0.0.0-20240404174027-a39bec0462d2 h1:BnG6pr9TTr6CYlrJznYUDj6V7xldD1W+1iXPum0wT/w=
cuelabs.dev/go/oci/ociregistry v0.0.0-20240404174027-a39bec0462d2/go.mod h1:pK23AUVXuNzzTpfMCA06sxZGeVQ/75FdVtW249de9Uo=
cuelang.org/go v0.9.2 h1:pfNiry2PdRBr02G/aKm5k2vhzmqbAOoaB4WurmEbWvs=
@@ -653,23 +657,31 @@ github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.3.0/go.mod h1:tZoQYdDZNOiIjdSn0dVWVfl0NEPGOJqVLzSrcFk4Is0=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 h1:nyQWyZvwGTvunIMxi1Y9uXkcyr+I7TeNrr/foo4Kpk8=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0/go.mod h1:XCW7KnZet0Opnr7HccfUw1PLc4CjHqpcaxW8DHklNkQ=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.0/go.mod h1:NBanQUfSWiWn3QEpWDTCU0IjBECKOYvl2R8xdRtMtiM=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 h1:B/dfvscEQtew9dVuoxqxrUKKv8Ih2f55PydknDamU+g=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0/go.mod h1:fiPSssYvltE08HJchL04dOy+RD4hgrjph0cwGGMntdI=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.0 h1:+m0M/LFxN43KvULkDNfdXOgrjtg6UYJPFBJyuEcRCAw=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.0/go.mod h1:PwOyop78lveYMRs6oCxjiVyBdyCgIYH6XHIVZO9/SFQ=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.1/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2 v2.2.0 h1:Hp+EScFOu9HeCbeW8WU2yQPJd4gGwhMgKxWe+G6jNzw=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2 v2.2.0/go.mod h1:/pz8dyNQe+Ey3yBp/XuYz7oqX8YDNWVpPB0hH3XWfbc=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3 v3.0.1 h1:H3g2mkmu105ON0c/Gqx3Bm+bzoIijLom8LmV9Gjn7X0=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3 v3.0.1/go.mod h1:EAc3kjhZf9soch7yLID8PeKcE6VfKvQTllSBHYVdXd8=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v6 v6.2.0 h1:JAebRMoc3vL+Nd97GBprHYHucO4+wlW+tNbBIumqJlk=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v6 v6.2.0/go.mod h1:zflC9v4VfViJrSvcvplqws/yGXVbUEMZi/iHpZdSPWA=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v2 v2.4.0 h1:1u/K2BFv0MwkG6he8RYuUcbbeK22rkoZbg4lKa/msZU=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v2 v2.4.0/go.mod h1:U5gpsREQZE6SLk1t/cFfc1eMhYAlYpEzvaYXuDfefy8=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2 h1:mLY+pNLjCUeKhgnAJWAKhEUQM+RJQo2H1fuGSw1Ky1E=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2/go.mod h1:FbdwsQ2EzwvXxOPcMFYO8ogEc9uMMIj3YkmCdXdAFmk=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v3 v3.1.0 h1:2qsIIvxVT+uE6yrNldntJKlLRgxGbZ85kgtz5SNBhMw=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v3 v3.1.0/go.mod h1:AW8VEadnhw9xox+VaVd9sP7NjzOAnaZBLRH6Tq3cJ38=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/msi/armmsi v1.2.0 h1:z4YeiSXxnUI+PqB46Yj6MZA3nwb1CcJIkEMDrzUd8Cs=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/msi/armmsi v1.2.0/go.mod h1:rko9SzMxcMk0NJsNAxALEGaTYyy79bNRwxgJfrH0Spw=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/mysql/armmysql v1.2.0 h1:dhywcZH9yPDIje9aTqwy6psZSPzI6CJLYEprDahIBSQ=
@@ -686,8 +698,8 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redis/armredis/v2 v2.3.0 h
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redis/armredis/v2 v2.3.0/go.mod h1:FMVQhV2nfxsI9cDUBqn/rWfN5y1KxwZ/+q1Bl1oqko0=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redisenterprise/armredisenterprise v1.2.0 h1:hTmVmyvriwO+ymGLEsH7HZokVwinC2MZl8F0LjvPdHU=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redisenterprise/armredisenterprise v1.2.0/go.mod h1:uHEpZj4TWSZEp35rIByJ8RX7hQBm3bxfPxS4tiz+x+g=
-github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1 h1:7CBQ+Ei8SP2c6ydQTGCCrS35bDxgTMfoP2miAwK++OU=
-github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1/go.mod h1:c/wcGeGx5FUPbM/JltUYHZcKmigwyVLJlDq+4HdtXaw=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql v1.2.0 h1:S087deZ0kP1RUg4pU7w9U9xpUedTCbOtz+mnd0+hrkQ=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql v1.2.0/go.mod h1:B4cEyXrWBmbfMDAPnpJ1di7MAt5DKP57jPEObAvZChg=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0 h1:PiSrjRPpkQNjrM8H0WwKMnZUdu1RGMtd/LdGKUrOo+c=
@@ -720,6 +732,8 @@ github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUM
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8=
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
+github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM=
+github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE=
github.com/AzureAD/microsoft-authentication-library-for-go v0.7.0/go.mod h1:BDJ5qMFKx9DugEg3+uQSDCdbYPr5s9vBTrL9P8TpqOU=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
@@ -737,8 +751,14 @@ github.com/DanielTitkov/go-adaptive-cards v0.2.2 h1:tBFExyvsbCcrBJEvPaV3FW4gcAkw
github.com/DanielTitkov/go-adaptive-cards v0.2.2/go.mod h1:RtCzt65p/zEos6+zhiCFQmiaHmro6M63l9NP7xXx/Lg=
github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 h1:oVLqHXhnYtUwM89y9T1fXGaK9wTkXHgNp8/ZNMQzUxE=
github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1 h1:pB2F2JKCj1Znmp2rwxxt1J0Fg0wezTMgWYk5Mpbi1kg=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1/go.mod h1:itPGVDKf9cC/ov4MdvJ2QZ0khw4bfoo9jzwTJlaxy2k=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 h1:3c8yed4lgqTt+oTQ+JNMDo+F4xprBf+O/il4ZC0nRLw=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 h1:UQ0AhxogsIRZDkElkblfnwjc3IaltCm2HUMvezQaL7s=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1 h1:oTX4vsorBZo/Zdum6OKPA4o7544hm6smoRv1QjpTwGo=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1/go.mod h1:0wEl7vrAD8mehJyohS9HZy+WyEOaQO2mJx86Cvh93kM=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE=
github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM=
github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU=
@@ -1045,8 +1065,8 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH
github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20240822171458-6449f94b4d59 h1:fLZ97KE86ELjEYJCEUVzmbhfzDxHHGwBrDVMd4XL6Bs=
-github.com/cncf/xds/go v0.0.0-20240822171458-6449f94b4d59/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
+github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI=
+github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
github.com/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEaIwg=
@@ -1164,8 +1184,8 @@ github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34=
github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q=
-github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les=
-github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8=
+github.com/envoyproxy/go-control-plane v0.13.1 h1:vPfJZCkob6yTMEgS+0TwfTUfbHjfy/6vOJ8hUWX/uXE=
+github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=
github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=
@@ -1508,8 +1528,8 @@ github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqE
github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY=
github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8=
github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
-github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
-github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
+github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o=
+github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk=
github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE=
@@ -1735,6 +1755,8 @@ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=
github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
+github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs=
+github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE=
@@ -2300,6 +2322,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 h1:m0yTi
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0/go.mod h1:wBQbT4UekBfegL2nx0Xk1vBcnzyBPsIVm9hRG4fYcr4=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8=
+go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc=
+go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I=
go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w=
go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ=
go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE=
@@ -2373,8 +2397,8 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf
golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
-golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
-golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
+golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
+golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -2509,8 +2533,8 @@ golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
-golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
-golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
+golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
+golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -2540,8 +2564,8 @@ golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec
golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=
golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=
golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
-golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
-golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE=
+golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -2668,8 +2692,8 @@ golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
-golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
+golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -2688,8 +2712,8 @@ golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
-golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
-golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
+golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
+golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -2718,8 +2742,8 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
-golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
+golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -2879,8 +2903,8 @@ google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/
google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI=
google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0=
google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg=
-google.golang.org/api v0.197.0 h1:x6CwqQLsFiA5JKAiGyGBjc2bNtHtLddhJCE2IKuhhcQ=
-google.golang.org/api v0.197.0/go.mod h1:AuOuo20GoQ331nq7DquGHlU6d+2wN2fZ8O0ta60nRNw=
+google.golang.org/api v0.214.0 h1:h2Gkq07OYi6kusGOaT/9rnNljuXmqPnaig7WGPmKbwA=
+google.golang.org/api v0.214.0/go.mod h1:bYPpLG8AyeMWwDU6NXoB00xC0DFkikVvd5MfwoxjLqE=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -3020,12 +3044,12 @@ google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOl
google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
-google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eYDVe+YvyR7Yc2vJGkO5/0UxD0/jZU=
-google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4=
-google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc=
-google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
+google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk=
+google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc=
+google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 h1:pgr/4QbFyktUv9CtQ/Fq4gzEE6/Xs7iCXbktaGzLHbQ=
+google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 h1:8ZmaLZE4XWrtU3MyClkYqqtl6Oegr3235h7jxsDyqCY=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@@ -3067,8 +3091,8 @@ google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g=
google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s=
-google.golang.org/grpc v1.66.3 h1:TWlsh8Mv0QI/1sIbs1W36lqRclxrmF+eFJ4DbI0fuhA=
-google.golang.org/grpc v1.66.3/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y=
+google.golang.org/grpc v1.67.3 h1:OgPcDAFKHnH8X3O4WcO4XUc8GRDeKsKReqbQtiCj7N8=
+google.golang.org/grpc v1.67.3/go.mod h1:YGaHCc6Oap+FzBJTZLBzkGSYt/cvGPFTPxkn7QfSU8s=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 h1:F29+wU6Ee6qgu9TddPgooOdaqsxTMunOoj8KA5yuS5A=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1/go.mod h1:5KF+wpkbTSbGcR9zteSqZV6fqFOWBl4Yde8En8MryZA=
@@ -3090,8 +3114,8 @@ google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw
google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
-google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
-google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
+google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
diff --git a/integrations/event-handler/go.mod b/integrations/event-handler/go.mod
index 02a0faf3ce610..fa932ea21a7dc 100644
--- a/integrations/event-handler/go.mod
+++ b/integrations/event-handler/go.mod
@@ -15,28 +15,29 @@ require (
github.com/peterbourgon/diskv/v3 v3.0.1
github.com/sethvargo/go-limiter v1.0.0
github.com/stretchr/testify v1.10.0
- golang.org/x/net v0.33.0
- golang.org/x/time v0.6.0
- google.golang.org/protobuf v1.35.1
+ golang.org/x/net v0.34.0
+ golang.org/x/time v0.8.0
+ google.golang.org/protobuf v1.35.2
)
require (
- cloud.google.com/go v0.115.1 // indirect
- cloud.google.com/go/auth v0.9.4 // indirect
- cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect
- cloud.google.com/go/compute v1.28.1 // indirect
- cloud.google.com/go/compute/metadata v0.5.2 // indirect
- cloud.google.com/go/container v1.40.0 // indirect
- cloud.google.com/go/iam v1.2.1 // indirect
- cloud.google.com/go/kms v1.20.0 // indirect
- cloud.google.com/go/longrunning v0.6.1 // indirect
- cloud.google.com/go/resourcemanager v1.10.1 // indirect
- connectrpc.com/connect v1.17.0 // indirect
+ cloud.google.com/go v0.117.0 // indirect
+ cloud.google.com/go/auth v0.13.0 // indirect
+ cloud.google.com/go/auth/oauth2adapt v0.2.6 // indirect
+ cloud.google.com/go/compute v1.31.1 // indirect
+ cloud.google.com/go/compute/metadata v0.6.0 // indirect
+ cloud.google.com/go/container v1.42.1 // indirect
+ cloud.google.com/go/iam v1.3.1 // indirect
+ cloud.google.com/go/kms v1.20.4 // indirect
+ cloud.google.com/go/longrunning v0.6.2 // indirect
+ cloud.google.com/go/resourcemanager v1.10.3 // indirect
+ connectrpc.com/connect v1.18.0 // indirect
dario.cat/mergo v1.0.1 // indirect
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect
- github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 // indirect
- github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2 v2.2.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3 v3.0.1 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v2 v2.4.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/msi/armmsi v1.2.0 // indirect
@@ -46,6 +47,7 @@ require (
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers v1.1.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redis/armredis/v2 v2.3.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redisenterprise/armredisenterprise v1.2.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql v1.2.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription v1.2.0 // indirect
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
@@ -156,7 +158,6 @@ require (
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
- github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/btree v1.1.3 // indirect
github.com/google/certificate-transparency-go v1.2.1 // indirect
@@ -172,7 +173,7 @@ require (
github.com/google/safetext v0.0.0-20240104143208-7a7d9b3d812f // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
- github.com/googleapis/gax-go/v2 v2.13.0 // indirect
+ github.com/googleapis/gax-go/v2 v2.14.0 // indirect
github.com/gorilla/mux v1.8.1 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/gosuri/uitable v0.0.4 // indirect
@@ -270,7 +271,6 @@ require (
github.com/zmap/zcrypto v0.0.0-20231219022726-a1f61fb1661c // indirect
github.com/zmap/zlint/v3 v3.6.0 // indirect
go.mongodb.org/mongo-driver v1.14.0 // indirect
- go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
@@ -282,19 +282,19 @@ require (
go.opentelemetry.io/otel/trace v1.30.0 // indirect
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
- golang.org/x/crypto v0.31.0 // indirect
+ golang.org/x/crypto v0.32.0 // indirect
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
golang.org/x/mod v0.21.0 // indirect
- golang.org/x/oauth2 v0.23.0 // indirect
+ golang.org/x/oauth2 v0.24.0 // indirect
golang.org/x/sync v0.10.0 // indirect
- golang.org/x/sys v0.28.0 // indirect
- golang.org/x/term v0.27.0 // indirect
+ golang.org/x/sys v0.29.0 // indirect
+ golang.org/x/term v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
- google.golang.org/api v0.197.0 // indirect
- google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
- google.golang.org/grpc v1.66.3 // indirect
+ google.golang.org/api v0.214.0 // indirect
+ google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 // indirect
+ google.golang.org/grpc v1.67.3 // indirect
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
diff --git a/integrations/event-handler/go.sum b/integrations/event-handler/go.sum
index fdd3960aa501f..ee180f7d67589 100644
--- a/integrations/event-handler/go.sum
+++ b/integrations/event-handler/go.sum
@@ -36,8 +36,8 @@ cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRY
cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM=
cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I=
cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY=
-cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ=
-cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc=
+cloud.google.com/go v0.117.0 h1:Z5TNFfQxj7WG2FgOGX1ekC5RiXrYgms6QscOm32M/4s=
+cloud.google.com/go v0.117.0/go.mod h1:ZbwhVTb1DBGt2Iwb3tNO6SEK4q+cplHZmLWH+DelYYc=
cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4=
cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw=
cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E=
@@ -99,10 +99,10 @@ cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVo
cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo=
cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0=
cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E=
-cloud.google.com/go/auth v0.9.4 h1:DxF7imbEbiFu9+zdKC6cKBko1e8XeJnipNqIbWZ+kDI=
-cloud.google.com/go/auth v0.9.4/go.mod h1:SHia8n6//Ya940F1rLimhJCjjx7KE17t0ctFEci3HkA=
-cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY=
-cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc=
+cloud.google.com/go/auth v0.13.0 h1:8Fu8TZy167JkW8Tj3q7dIkr2v4cndv41ouecJx0PAHs=
+cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/EMxX6Q=
+cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU=
+cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8=
cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0=
cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8=
cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8=
@@ -178,14 +178,14 @@ cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63
cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs=
cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU=
cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE=
-cloud.google.com/go/compute v1.28.1 h1:XwPcZjgMCnU2tkwY10VleUjSAfpTj9RDn+kGrbYsi8o=
-cloud.google.com/go/compute v1.28.1/go.mod h1:b72iXMY4FucVry3NR3Li4kVyyTvbMDE7x5WsqvxjsYk=
+cloud.google.com/go/compute v1.31.1 h1:SObuy8Fs6woazArpXp1fsHCw+ZH4iJ/8dGGTxUhHZQA=
+cloud.google.com/go/compute v1.31.1/go.mod h1:hyOponWhXviDptJCJSoEh89XO1cfv616wbwbkde1/+8=
cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU=
cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
-cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo=
-cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k=
+cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I=
+cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg=
cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY=
cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck=
cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w=
@@ -194,8 +194,8 @@ cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3
cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4=
cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM=
cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA=
-cloud.google.com/go/container v1.40.0 h1:JVoEg/4RvoGW37r2Eja/cTBc3X9c2loGWYq7QDsRDuI=
-cloud.google.com/go/container v1.40.0/go.mod h1:wNI1mOUivm+ZkpHMbouutgbD4sQxyphMwK31X5cThY4=
+cloud.google.com/go/container v1.42.1 h1:eaMrgOl6NCk+Blhh29GgUVe3QGo7IiJQlP0w/EwLoV0=
+cloud.google.com/go/container v1.42.1/go.mod h1:5huIxYuOD8Ocuj0KbcyRq9MzB3J1mQObS0KSWHTYceY=
cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I=
cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4=
cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI=
@@ -321,8 +321,8 @@ cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGE
cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY=
cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY=
cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0=
-cloud.google.com/go/iam v1.2.1 h1:QFct02HRb7H12J/3utj0qf5tobFh9V4vR6h9eX5EBRU=
-cloud.google.com/go/iam v1.2.1/go.mod h1:3VUIJDPpwT6p/amXRC5GY8fCCh70lxPygguVtI0Z4/g=
+cloud.google.com/go/iam v1.3.1 h1:KFf8SaT71yYq+sQtRISn90Gyhyf4X8RGgeAVC8XGf3E=
+cloud.google.com/go/iam v1.3.1/go.mod h1:3wMtuyT4NcbnYNPLMBzYRFiEfjKfJlLVLrisE7bwm34=
cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc=
cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A=
cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk=
@@ -342,8 +342,8 @@ cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4
cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w=
cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24=
cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI=
-cloud.google.com/go/kms v1.20.0 h1:uKUvjGqbBlI96xGE669hcVnEMw1Px/Mvfa62dhM5UrY=
-cloud.google.com/go/kms v1.20.0/go.mod h1:/dMbFF1tLLFnQV44AoI2GlotbjowyUfgVwezxW291fM=
+cloud.google.com/go/kms v1.20.4 h1:CJ0hMpOg1ANN9tx/a/GPJ+Uxudy8k6f3fvGFuTHiE5A=
+cloud.google.com/go/kms v1.20.4/go.mod h1:gPLsp1r4FblUgBYPOcvI/bUPpdMg2Jm1ZVKU4tQUfcc=
cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=
cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI=
cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE=
@@ -357,8 +357,8 @@ cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeN
cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE=
cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc=
cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo=
-cloud.google.com/go/longrunning v0.6.1 h1:lOLTFxYpr8hcRtcwWir5ITh1PAKUD/sG2lKrTSYjyMc=
-cloud.google.com/go/longrunning v0.6.1/go.mod h1:nHISoOZpBcmlwbJmiVk5oDRz0qG/ZxPynEGs1iZ79s0=
+cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc=
+cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI=
cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE=
cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM=
cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA=
@@ -468,8 +468,8 @@ cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7L
cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots=
cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo=
cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI=
-cloud.google.com/go/resourcemanager v1.10.1 h1:fO/QoSJ1lepmTM9dCbSXYWgTIhecmQkpY0mM1X9OGN0=
-cloud.google.com/go/resourcemanager v1.10.1/go.mod h1:A/ANV/Sv7y7fcjd4LSH7PJGTZcWRkO/69yN5UhYUmvE=
+cloud.google.com/go/resourcemanager v1.10.3 h1:SHOMw0kX0xWratC5Vb5VULBeWiGlPYAs82kiZqNtWpM=
+cloud.google.com/go/resourcemanager v1.10.3/go.mod h1:JSQDy1JA3K7wtaFH23FBGld4dMtzqCoOpwY55XYR8gs=
cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU=
cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg=
cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA=
@@ -612,8 +612,8 @@ cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoIS
cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=
cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw=
-connectrpc.com/connect v1.17.0 h1:W0ZqMhtVzn9Zhn2yATuUokDLO5N+gIuBWMOnsQrfmZk=
-connectrpc.com/connect v1.17.0/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8=
+connectrpc.com/connect v1.18.0 h1:7ZHAkx8fTaRO4YIyvV00XiS8bx4XjWp0grk9oh0PIQ0=
+connectrpc.com/connect v1.18.0/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8=
dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
@@ -623,12 +623,16 @@ gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zum
git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU=
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 h1:nyQWyZvwGTvunIMxi1Y9uXkcyr+I7TeNrr/foo4Kpk8=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0/go.mod h1:XCW7KnZet0Opnr7HccfUw1PLc4CjHqpcaxW8DHklNkQ=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 h1:B/dfvscEQtew9dVuoxqxrUKKv8Ih2f55PydknDamU+g=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0/go.mod h1:fiPSssYvltE08HJchL04dOy+RD4hgrjph0cwGGMntdI=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.0 h1:+m0M/LFxN43KvULkDNfdXOgrjtg6UYJPFBJyuEcRCAw=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.0/go.mod h1:PwOyop78lveYMRs6oCxjiVyBdyCgIYH6XHIVZO9/SFQ=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2 v2.2.0 h1:Hp+EScFOu9HeCbeW8WU2yQPJd4gGwhMgKxWe+G6jNzw=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2 v2.2.0/go.mod h1:/pz8dyNQe+Ey3yBp/XuYz7oqX8YDNWVpPB0hH3XWfbc=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3 v3.0.1 h1:H3g2mkmu105ON0c/Gqx3Bm+bzoIijLom8LmV9Gjn7X0=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3 v3.0.1/go.mod h1:EAc3kjhZf9soch7yLID8PeKcE6VfKvQTllSBHYVdXd8=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v2 v2.4.0 h1:1u/K2BFv0MwkG6he8RYuUcbbeK22rkoZbg4lKa/msZU=
@@ -653,8 +657,8 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redis/armredis/v2 v2.3.0 h
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redis/armredis/v2 v2.3.0/go.mod h1:FMVQhV2nfxsI9cDUBqn/rWfN5y1KxwZ/+q1Bl1oqko0=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redisenterprise/armredisenterprise v1.2.0 h1:hTmVmyvriwO+ymGLEsH7HZokVwinC2MZl8F0LjvPdHU=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redisenterprise/armredisenterprise v1.2.0/go.mod h1:uHEpZj4TWSZEp35rIByJ8RX7hQBm3bxfPxS4tiz+x+g=
-github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1 h1:7CBQ+Ei8SP2c6ydQTGCCrS35bDxgTMfoP2miAwK++OU=
-github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1/go.mod h1:c/wcGeGx5FUPbM/JltUYHZcKmigwyVLJlDq+4HdtXaw=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql v1.2.0 h1:S087deZ0kP1RUg4pU7w9U9xpUedTCbOtz+mnd0+hrkQ=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql v1.2.0/go.mod h1:B4cEyXrWBmbfMDAPnpJ1di7MAt5DKP57jPEObAvZChg=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription v1.2.0 h1:UrGzkHueDwAWDdjQxC+QaXHd4tVCkISYE9j7fSSXF8k=
@@ -663,6 +667,8 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8=
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
+github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM=
+github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
@@ -879,6 +885,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
github.com/di-wu/parser v0.2.2/go.mod h1:SLp58pW6WamdmznrVRrw2NTyn4wAvT9rrEFynKX7nYo=
github.com/di-wu/parser v0.3.0 h1:NMOvy5ifswgt4gsdhySVcKOQtvjC43cHZIfViWctqQY=
github.com/di-wu/parser v0.3.0/go.mod h1:SLp58pW6WamdmznrVRrw2NTyn4wAvT9rrEFynKX7nYo=
@@ -1167,8 +1175,8 @@ github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqE
github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY=
github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8=
github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
-github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
-github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
+github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o=
+github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk=
github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE=
@@ -1198,6 +1206,8 @@ github.com/gravitational/predicate v1.3.1 h1:f1uGg2FF6z5wZbcafYpLZJ1gl+82I0MlSd0
github.com/gravitational/predicate v1.3.1/go.mod h1:H5e9dUW7zb/cuKkkhfnyT9SsI/WHWJ8Ra011La16DTY=
github.com/gravitational/protobuf v1.3.2-teleport.1 h1:h5mh+UOKPurqDxn1hRVcr1WzSkmBi+D9qkXpaXA9PFM=
github.com/gravitational/protobuf v1.3.2-teleport.1/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/gravitational/redis/v9 v9.6.1-teleport.1 h1:gPirfPKArN2nPhTKR3h9fnEg5YuYU933+CjlDJMo4H0=
+github.com/gravitational/redis/v9 v9.6.1-teleport.1/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA=
github.com/gravitational/roundtrip v1.0.2 h1:eOCY0NEKKaB0ksJmvhO6lPMFz1pIIef+vyPBTBROQ5c=
github.com/gravitational/roundtrip v1.0.2/go.mod h1:fuI1booM2hLRA/B/m5MRAPOU6mBZNYcNycono2UuTw0=
github.com/gravitational/spdystream v0.0.0-20230512133543-4e46862ca9bf h1:aXnqDSit8L1qhI0+QdbJh+MTUFKXG7qbkZXnfr7L96A=
@@ -1284,6 +1294,8 @@ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=
github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
+github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs=
+github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE=
@@ -1650,8 +1662,8 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
-golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
-golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
+golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
+golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -1777,8 +1789,8 @@ golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
-golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
-golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
+golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
+golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1808,8 +1820,8 @@ golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec
golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=
golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=
golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
-golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
-golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE=
+golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1920,8 +1932,8 @@ golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
-golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
+golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -1938,8 +1950,8 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
-golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
-golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
+golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
+golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1968,8 +1980,8 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
-golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
+golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -2108,8 +2120,8 @@ google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/
google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI=
google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0=
google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg=
-google.golang.org/api v0.197.0 h1:x6CwqQLsFiA5JKAiGyGBjc2bNtHtLddhJCE2IKuhhcQ=
-google.golang.org/api v0.197.0/go.mod h1:AuOuo20GoQ331nq7DquGHlU6d+2wN2fZ8O0ta60nRNw=
+google.golang.org/api v0.214.0 h1:h2Gkq07OYi6kusGOaT/9rnNljuXmqPnaig7WGPmKbwA=
+google.golang.org/api v0.214.0/go.mod h1:bYPpLG8AyeMWwDU6NXoB00xC0DFkikVvd5MfwoxjLqE=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -2249,12 +2261,12 @@ google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOl
google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
-google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eYDVe+YvyR7Yc2vJGkO5/0UxD0/jZU=
-google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4=
-google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc=
-google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
+google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk=
+google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc=
+google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 h1:pgr/4QbFyktUv9CtQ/Fq4gzEE6/Xs7iCXbktaGzLHbQ=
+google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 h1:8ZmaLZE4XWrtU3MyClkYqqtl6Oegr3235h7jxsDyqCY=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@@ -2296,8 +2308,8 @@ google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g=
google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s=
-google.golang.org/grpc v1.66.3 h1:TWlsh8Mv0QI/1sIbs1W36lqRclxrmF+eFJ4DbI0fuhA=
-google.golang.org/grpc v1.66.3/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y=
+google.golang.org/grpc v1.67.3 h1:OgPcDAFKHnH8X3O4WcO4XUc8GRDeKsKReqbQtiCj7N8=
+google.golang.org/grpc v1.67.3/go.mod h1:YGaHCc6Oap+FzBJTZLBzkGSYt/cvGPFTPxkn7QfSU8s=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 h1:F29+wU6Ee6qgu9TddPgooOdaqsxTMunOoj8KA5yuS5A=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1/go.mod h1:5KF+wpkbTSbGcR9zteSqZV6fqFOWBl4Yde8En8MryZA=
@@ -2319,8 +2331,8 @@ google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw
google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
-google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
-google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
+google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/integrations/terraform/go.mod b/integrations/terraform/go.mod
index 807457d1e0c1a..afbe736656c8c 100644
--- a/integrations/terraform/go.mod
+++ b/integrations/terraform/go.mod
@@ -23,27 +23,28 @@ require (
github.com/jonboulle/clockwork v0.4.0
github.com/sirupsen/logrus v1.9.3
github.com/stretchr/testify v1.10.0
- google.golang.org/grpc v1.66.3
- google.golang.org/protobuf v1.35.1
+ google.golang.org/grpc v1.67.3
+ google.golang.org/protobuf v1.35.2
)
require (
- cloud.google.com/go v0.115.1 // indirect
- cloud.google.com/go/auth v0.9.4 // indirect
- cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect
- cloud.google.com/go/compute v1.28.1 // indirect
- cloud.google.com/go/compute/metadata v0.5.2 // indirect
- cloud.google.com/go/container v1.40.0 // indirect
- cloud.google.com/go/iam v1.2.1 // indirect
- cloud.google.com/go/kms v1.20.0 // indirect
- cloud.google.com/go/longrunning v0.6.1 // indirect
- cloud.google.com/go/resourcemanager v1.10.1 // indirect
- connectrpc.com/connect v1.17.0 // indirect
+ cloud.google.com/go v0.117.0 // indirect
+ cloud.google.com/go/auth v0.13.0 // indirect
+ cloud.google.com/go/auth/oauth2adapt v0.2.6 // indirect
+ cloud.google.com/go/compute v1.31.1 // indirect
+ cloud.google.com/go/compute/metadata v0.6.0 // indirect
+ cloud.google.com/go/container v1.42.1 // indirect
+ cloud.google.com/go/iam v1.3.1 // indirect
+ cloud.google.com/go/kms v1.20.4 // indirect
+ cloud.google.com/go/longrunning v0.6.2 // indirect
+ cloud.google.com/go/resourcemanager v1.10.3 // indirect
+ connectrpc.com/connect v1.18.0 // indirect
dario.cat/mergo v1.0.1 // indirect
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect
- github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 // indirect
- github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2 v2.2.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3 v3.0.1 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v2 v2.4.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/msi/armmsi v1.2.0 // indirect
@@ -53,6 +54,7 @@ require (
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers v1.1.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redis/armredis/v2 v2.3.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redisenterprise/armredisenterprise v1.2.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql v1.2.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription v1.2.0 // indirect
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
@@ -119,7 +121,7 @@ require (
github.com/chai2010/gettext-go v1.0.2 // indirect
github.com/cloudflare/cfssl v1.6.4 // indirect
github.com/cloudflare/circl v1.3.7 // indirect
- github.com/cncf/xds/go v0.0.0-20240822171458-6449f94b4d59 // indirect
+ github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect
github.com/containerd/containerd v1.7.18 // indirect
github.com/containerd/errdefs v0.1.0 // indirect
github.com/containerd/log v0.1.0 // indirect
@@ -145,7 +147,7 @@ require (
github.com/ebitengine/purego v0.8.0 // indirect
github.com/elimity-com/scim v0.0.0-20240320110924-172bf2aee9c8 // indirect
github.com/emicklei/go-restful/v3 v3.11.3 // indirect
- github.com/envoyproxy/go-control-plane v0.13.0 // indirect
+ github.com/envoyproxy/go-control-plane v0.13.1 // indirect
github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect
github.com/evanphx/json-patch v5.9.0+incompatible // indirect
github.com/evanphx/json-patch/v5 v5.9.0 // indirect
@@ -176,7 +178,6 @@ require (
github.com/gofrs/flock v0.12.1 // indirect
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
- github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/btree v1.1.3 // indirect
github.com/google/certificate-transparency-go v1.2.1 // indirect
@@ -193,7 +194,7 @@ require (
github.com/google/safetext v0.0.0-20240104143208-7a7d9b3d812f // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
- github.com/googleapis/gax-go/v2 v2.13.0 // indirect
+ github.com/googleapis/gax-go/v2 v2.14.0 // indirect
github.com/gorilla/mux v1.8.1 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/gosuri/uitable v0.0.4 // indirect
@@ -335,7 +336,6 @@ require (
github.com/zmap/zlint/v3 v3.6.0 // indirect
go.abhg.dev/goldmark/frontmatter v0.2.0 // indirect
go.mongodb.org/mongo-driver v1.14.0 // indirect
- go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
@@ -348,22 +348,22 @@ require (
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
go.uber.org/mock v0.4.0 // indirect
- golang.org/x/crypto v0.31.0 // indirect
+ golang.org/x/crypto v0.32.0 // indirect
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
golang.org/x/mod v0.21.0 // indirect
- golang.org/x/net v0.33.0 // indirect
- golang.org/x/oauth2 v0.23.0 // indirect
+ golang.org/x/net v0.34.0 // indirect
+ golang.org/x/oauth2 v0.24.0 // indirect
golang.org/x/sync v0.10.0 // indirect
- golang.org/x/sys v0.28.0 // indirect
- golang.org/x/term v0.27.0 // indirect
+ golang.org/x/sys v0.29.0 // indirect
+ golang.org/x/term v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
- golang.org/x/time v0.6.0 // indirect
+ golang.org/x/time v0.8.0 // indirect
golang.org/x/tools v0.24.0 // indirect
- google.golang.org/api v0.197.0 // indirect
+ google.golang.org/api v0.214.0 // indirect
google.golang.org/appengine v1.6.8 // indirect
- google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
+ google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 // indirect
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
diff --git a/integrations/terraform/go.sum b/integrations/terraform/go.sum
index 6e0a25af885dd..1b472d167f90c 100644
--- a/integrations/terraform/go.sum
+++ b/integrations/terraform/go.sum
@@ -1,5 +1,5 @@
-cel.dev/expr v0.16.0 h1:yloc84fytn4zmJX2GU3TkXGsaieaV7dQ057Qs4sIG2Y=
-cel.dev/expr v0.16.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg=
+cel.dev/expr v0.16.1 h1:NR0+oFYzR1CqLFhTAqg3ql59G9VfN8fKq1TCHJ6gq1g=
+cel.dev/expr v0.16.1/go.mod h1:AsGA5zb3WruAEQeQng1RZdGEXmBj0jvMWh6l5SnNuC8=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -39,8 +39,8 @@ cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRY
cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM=
cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I=
cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY=
-cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ=
-cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc=
+cloud.google.com/go v0.117.0 h1:Z5TNFfQxj7WG2FgOGX1ekC5RiXrYgms6QscOm32M/4s=
+cloud.google.com/go v0.117.0/go.mod h1:ZbwhVTb1DBGt2Iwb3tNO6SEK4q+cplHZmLWH+DelYYc=
cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4=
cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw=
cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E=
@@ -102,10 +102,10 @@ cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVo
cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo=
cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0=
cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E=
-cloud.google.com/go/auth v0.9.4 h1:DxF7imbEbiFu9+zdKC6cKBko1e8XeJnipNqIbWZ+kDI=
-cloud.google.com/go/auth v0.9.4/go.mod h1:SHia8n6//Ya940F1rLimhJCjjx7KE17t0ctFEci3HkA=
-cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY=
-cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc=
+cloud.google.com/go/auth v0.13.0 h1:8Fu8TZy167JkW8Tj3q7dIkr2v4cndv41ouecJx0PAHs=
+cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/EMxX6Q=
+cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU=
+cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8=
cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0=
cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8=
cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8=
@@ -160,8 +160,8 @@ cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb
cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM=
cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk=
cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA=
-cloud.google.com/go/cloudsqlconn v1.12.1 h1:crfkYy4TsYXx+n/wELlPthDYaAmDo2olHLv9DmRuJzY=
-cloud.google.com/go/cloudsqlconn v1.12.1/go.mod h1:Y8x/9e+QsjJNkvOj9mdJ8/ixhE95Ab2H/vsyy0mXWNc=
+cloud.google.com/go/cloudsqlconn v1.13.2 h1:c7dmrgJnbTeCYgPl9CRljbOSkxzh209UKM4LC4Kk6ys=
+cloud.google.com/go/cloudsqlconn v1.13.2/go.mod h1:mjzL/CvXI8JHxMdjj9irBzGHIEMsZSP/hipODO/uxJc=
cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY=
cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI=
cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4=
@@ -183,14 +183,14 @@ cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63
cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs=
cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU=
cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE=
-cloud.google.com/go/compute v1.28.1 h1:XwPcZjgMCnU2tkwY10VleUjSAfpTj9RDn+kGrbYsi8o=
-cloud.google.com/go/compute v1.28.1/go.mod h1:b72iXMY4FucVry3NR3Li4kVyyTvbMDE7x5WsqvxjsYk=
+cloud.google.com/go/compute v1.31.1 h1:SObuy8Fs6woazArpXp1fsHCw+ZH4iJ/8dGGTxUhHZQA=
+cloud.google.com/go/compute v1.31.1/go.mod h1:hyOponWhXviDptJCJSoEh89XO1cfv616wbwbkde1/+8=
cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU=
cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
-cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo=
-cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k=
+cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I=
+cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg=
cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY=
cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck=
cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w=
@@ -199,8 +199,8 @@ cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3
cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4=
cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM=
cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA=
-cloud.google.com/go/container v1.40.0 h1:JVoEg/4RvoGW37r2Eja/cTBc3X9c2loGWYq7QDsRDuI=
-cloud.google.com/go/container v1.40.0/go.mod h1:wNI1mOUivm+ZkpHMbouutgbD4sQxyphMwK31X5cThY4=
+cloud.google.com/go/container v1.42.1 h1:eaMrgOl6NCk+Blhh29GgUVe3QGo7IiJQlP0w/EwLoV0=
+cloud.google.com/go/container v1.42.1/go.mod h1:5huIxYuOD8Ocuj0KbcyRq9MzB3J1mQObS0KSWHTYceY=
cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I=
cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4=
cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI=
@@ -288,8 +288,8 @@ cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLY
cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs=
cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg=
cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE=
-cloud.google.com/go/firestore v1.17.0 h1:iEd1LBbkDZTFsLw3sTH50eyg4qe8eoG6CjocmEXO9aQ=
-cloud.google.com/go/firestore v1.17.0/go.mod h1:69uPx1papBsY8ZETooc71fOhoKkD70Q1DwMrtKuOT/Y=
+cloud.google.com/go/firestore v1.18.0 h1:cuydCaLS7Vl2SatAeivXyhbhDEIR8BDmtn4egDhIn2s=
+cloud.google.com/go/firestore v1.18.0/go.mod h1:5ye0v48PhseZBdcl0qbl3uttu7FIEwEYVaWm0UIEOEU=
cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk=
cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg=
cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY=
@@ -328,8 +328,8 @@ cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGE
cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY=
cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY=
cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0=
-cloud.google.com/go/iam v1.2.1 h1:QFct02HRb7H12J/3utj0qf5tobFh9V4vR6h9eX5EBRU=
-cloud.google.com/go/iam v1.2.1/go.mod h1:3VUIJDPpwT6p/amXRC5GY8fCCh70lxPygguVtI0Z4/g=
+cloud.google.com/go/iam v1.3.1 h1:KFf8SaT71yYq+sQtRISn90Gyhyf4X8RGgeAVC8XGf3E=
+cloud.google.com/go/iam v1.3.1/go.mod h1:3wMtuyT4NcbnYNPLMBzYRFiEfjKfJlLVLrisE7bwm34=
cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc=
cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A=
cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk=
@@ -349,8 +349,8 @@ cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4
cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w=
cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24=
cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI=
-cloud.google.com/go/kms v1.20.0 h1:uKUvjGqbBlI96xGE669hcVnEMw1Px/Mvfa62dhM5UrY=
-cloud.google.com/go/kms v1.20.0/go.mod h1:/dMbFF1tLLFnQV44AoI2GlotbjowyUfgVwezxW291fM=
+cloud.google.com/go/kms v1.20.4 h1:CJ0hMpOg1ANN9tx/a/GPJ+Uxudy8k6f3fvGFuTHiE5A=
+cloud.google.com/go/kms v1.20.4/go.mod h1:gPLsp1r4FblUgBYPOcvI/bUPpdMg2Jm1ZVKU4tQUfcc=
cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=
cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI=
cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE=
@@ -364,8 +364,8 @@ cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeN
cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE=
cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc=
cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo=
-cloud.google.com/go/longrunning v0.6.1 h1:lOLTFxYpr8hcRtcwWir5ITh1PAKUD/sG2lKrTSYjyMc=
-cloud.google.com/go/longrunning v0.6.1/go.mod h1:nHISoOZpBcmlwbJmiVk5oDRz0qG/ZxPynEGs1iZ79s0=
+cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc=
+cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI=
cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE=
cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM=
cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA=
@@ -389,8 +389,8 @@ cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhI
cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4=
cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w=
cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw=
-cloud.google.com/go/monitoring v1.21.0 h1:EMc0tB+d3lUewT2NzKC/hr8cSR9WsUieVywzIHetGro=
-cloud.google.com/go/monitoring v1.21.0/go.mod h1:tuJ+KNDdJbetSsbSGTqnaBvbauS5kr3Q/koy3Up6r+4=
+cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU=
+cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU=
cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA=
cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o=
cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM=
@@ -477,8 +477,8 @@ cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7L
cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots=
cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo=
cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI=
-cloud.google.com/go/resourcemanager v1.10.1 h1:fO/QoSJ1lepmTM9dCbSXYWgTIhecmQkpY0mM1X9OGN0=
-cloud.google.com/go/resourcemanager v1.10.1/go.mod h1:A/ANV/Sv7y7fcjd4LSH7PJGTZcWRkO/69yN5UhYUmvE=
+cloud.google.com/go/resourcemanager v1.10.3 h1:SHOMw0kX0xWratC5Vb5VULBeWiGlPYAs82kiZqNtWpM=
+cloud.google.com/go/resourcemanager v1.10.3/go.mod h1:JSQDy1JA3K7wtaFH23FBGld4dMtzqCoOpwY55XYR8gs=
cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU=
cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg=
cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA=
@@ -539,8 +539,8 @@ cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+
cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos=
cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk=
cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M=
-cloud.google.com/go/spanner v1.68.0 h1:54nL8lEUj5A6frSGnL9VPmHDYbV5UwVkK8fbdnZyDCs=
-cloud.google.com/go/spanner v1.68.0/go.mod h1:X5T0XftydYp0K1adeJQDJtdWpbrOeJ7wHecM4tK6FiE=
+cloud.google.com/go/spanner v1.73.0 h1:0bab8QDn6MNj9lNK6XyGAVFhMlhMU2waePPa6GZNoi8=
+cloud.google.com/go/spanner v1.73.0/go.mod h1:mw98ua5ggQXVWwp83yjwggqEmW9t8rjs9Po1ohcUGW4=
cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM=
cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ=
cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0=
@@ -558,8 +558,8 @@ cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeL
cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s=
cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y=
cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4=
-cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs=
-cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0=
+cloud.google.com/go/storage v1.49.0 h1:zenOPBOWHCnojRd9aJZAyQXBYqkJkdQS42dxL55CIMw=
+cloud.google.com/go/storage v1.49.0/go.mod h1:k1eHhhpLvrPjVGfo0mOUPEJ4Y2+a/Hv5PiwehZI9qGU=
cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w=
cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I=
cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4=
@@ -625,8 +625,8 @@ cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoIS
cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=
cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw=
-connectrpc.com/connect v1.17.0 h1:W0ZqMhtVzn9Zhn2yATuUokDLO5N+gIuBWMOnsQrfmZk=
-connectrpc.com/connect v1.17.0/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8=
+connectrpc.com/connect v1.18.0 h1:7ZHAkx8fTaRO4YIyvV00XiS8bx4XjWp0grk9oh0PIQ0=
+connectrpc.com/connect v1.18.0/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8=
dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
@@ -636,12 +636,16 @@ gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zum
git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU=
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 h1:nyQWyZvwGTvunIMxi1Y9uXkcyr+I7TeNrr/foo4Kpk8=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0/go.mod h1:XCW7KnZet0Opnr7HccfUw1PLc4CjHqpcaxW8DHklNkQ=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 h1:B/dfvscEQtew9dVuoxqxrUKKv8Ih2f55PydknDamU+g=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0/go.mod h1:fiPSssYvltE08HJchL04dOy+RD4hgrjph0cwGGMntdI=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.0 h1:+m0M/LFxN43KvULkDNfdXOgrjtg6UYJPFBJyuEcRCAw=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.0/go.mod h1:PwOyop78lveYMRs6oCxjiVyBdyCgIYH6XHIVZO9/SFQ=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2 v2.2.0 h1:Hp+EScFOu9HeCbeW8WU2yQPJd4gGwhMgKxWe+G6jNzw=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2 v2.2.0/go.mod h1:/pz8dyNQe+Ey3yBp/XuYz7oqX8YDNWVpPB0hH3XWfbc=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3 v3.0.1 h1:H3g2mkmu105ON0c/Gqx3Bm+bzoIijLom8LmV9Gjn7X0=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3 v3.0.1/go.mod h1:EAc3kjhZf9soch7yLID8PeKcE6VfKvQTllSBHYVdXd8=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v2 v2.4.0 h1:1u/K2BFv0MwkG6he8RYuUcbbeK22rkoZbg4lKa/msZU=
@@ -666,8 +670,8 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redis/armredis/v2 v2.3.0 h
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redis/armredis/v2 v2.3.0/go.mod h1:FMVQhV2nfxsI9cDUBqn/rWfN5y1KxwZ/+q1Bl1oqko0=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redisenterprise/armredisenterprise v1.2.0 h1:hTmVmyvriwO+ymGLEsH7HZokVwinC2MZl8F0LjvPdHU=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redisenterprise/armredisenterprise v1.2.0/go.mod h1:uHEpZj4TWSZEp35rIByJ8RX7hQBm3bxfPxS4tiz+x+g=
-github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1 h1:7CBQ+Ei8SP2c6ydQTGCCrS35bDxgTMfoP2miAwK++OU=
-github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1/go.mod h1:c/wcGeGx5FUPbM/JltUYHZcKmigwyVLJlDq+4HdtXaw=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql v1.2.0 h1:S087deZ0kP1RUg4pU7w9U9xpUedTCbOtz+mnd0+hrkQ=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql v1.2.0/go.mod h1:B4cEyXrWBmbfMDAPnpJ1di7MAt5DKP57jPEObAvZChg=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription v1.2.0 h1:UrGzkHueDwAWDdjQxC+QaXHd4tVCkISYE9j7fSSXF8k=
@@ -678,6 +682,8 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8=
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
+github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM=
+github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
@@ -694,8 +700,12 @@ github.com/DanielTitkov/go-adaptive-cards v0.2.2 h1:tBFExyvsbCcrBJEvPaV3FW4gcAkw
github.com/DanielTitkov/go-adaptive-cards v0.2.2/go.mod h1:RtCzt65p/zEos6+zhiCFQmiaHmro6M63l9NP7xXx/Lg=
github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 h1:oVLqHXhnYtUwM89y9T1fXGaK9wTkXHgNp8/ZNMQzUxE=
github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1 h1:pB2F2JKCj1Znmp2rwxxt1J0Fg0wezTMgWYk5Mpbi1kg=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1/go.mod h1:itPGVDKf9cC/ov4MdvJ2QZ0khw4bfoo9jzwTJlaxy2k=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 h1:3c8yed4lgqTt+oTQ+JNMDo+F4xprBf+O/il4ZC0nRLw=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 h1:UQ0AhxogsIRZDkElkblfnwjc3IaltCm2HUMvezQaL7s=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE=
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk=
github.com/Kunde21/markdownfmt/v3 v3.1.0 h1:KiZu9LKs+wFFBQKhrZJrFZwtLnCCWJahL+S+E/3VnM0=
github.com/Kunde21/markdownfmt/v3 v3.1.0/go.mod h1:tPXN1RTyOzJwhfHoon9wUr4HGYmWgVxSQN6VBJDkrVc=
@@ -927,8 +937,8 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH
github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20240822171458-6449f94b4d59 h1:fLZ97KE86ELjEYJCEUVzmbhfzDxHHGwBrDVMd4XL6Bs=
-github.com/cncf/xds/go v0.0.0-20240822171458-6449f94b4d59/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
+github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI=
+github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM=
github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw=
github.com/containerd/containerd v1.7.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao=
@@ -1020,8 +1030,8 @@ github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34=
github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q=
-github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les=
-github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8=
+github.com/envoyproxy/go-control-plane v0.13.1 h1:vPfJZCkob6yTMEgS+0TwfTUfbHjfy/6vOJ8hUWX/uXE=
+github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=
github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=
@@ -1293,8 +1303,8 @@ github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqE
github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY=
github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8=
github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
-github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
-github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
+github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o=
+github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk=
github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE=
@@ -1516,6 +1526,8 @@ github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
+github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs=
+github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE=
@@ -2002,8 +2014,8 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
-golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
-golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
+golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
+golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -2134,8 +2146,8 @@ golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
-golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
-golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
+golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
+golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -2165,8 +2177,8 @@ golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec
golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=
golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=
golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
-golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
-golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE=
+golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -2284,8 +2296,8 @@ golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
-golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
+golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -2303,8 +2315,8 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
-golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
-golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
+golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
+golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -2333,8 +2345,8 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
-golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
+golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -2476,8 +2488,8 @@ google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/
google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI=
google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0=
google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg=
-google.golang.org/api v0.197.0 h1:x6CwqQLsFiA5JKAiGyGBjc2bNtHtLddhJCE2IKuhhcQ=
-google.golang.org/api v0.197.0/go.mod h1:AuOuo20GoQ331nq7DquGHlU6d+2wN2fZ8O0ta60nRNw=
+google.golang.org/api v0.214.0 h1:h2Gkq07OYi6kusGOaT/9rnNljuXmqPnaig7WGPmKbwA=
+google.golang.org/api v0.214.0/go.mod h1:bYPpLG8AyeMWwDU6NXoB00xC0DFkikVvd5MfwoxjLqE=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -2621,12 +2633,12 @@ google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOl
google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
-google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eYDVe+YvyR7Yc2vJGkO5/0UxD0/jZU=
-google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4=
-google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc=
-google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
+google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk=
+google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc=
+google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 h1:pgr/4QbFyktUv9CtQ/Fq4gzEE6/Xs7iCXbktaGzLHbQ=
+google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 h1:8ZmaLZE4XWrtU3MyClkYqqtl6Oegr3235h7jxsDyqCY=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU=
google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
@@ -2670,8 +2682,8 @@ google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g=
google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s=
-google.golang.org/grpc v1.66.3 h1:TWlsh8Mv0QI/1sIbs1W36lqRclxrmF+eFJ4DbI0fuhA=
-google.golang.org/grpc v1.66.3/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y=
+google.golang.org/grpc v1.67.3 h1:OgPcDAFKHnH8X3O4WcO4XUc8GRDeKsKReqbQtiCj7N8=
+google.golang.org/grpc v1.67.3/go.mod h1:YGaHCc6Oap+FzBJTZLBzkGSYt/cvGPFTPxkn7QfSU8s=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 h1:F29+wU6Ee6qgu9TddPgooOdaqsxTMunOoj8KA5yuS5A=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1/go.mod h1:5KF+wpkbTSbGcR9zteSqZV6fqFOWBl4Yde8En8MryZA=
@@ -2693,8 +2705,8 @@ google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw
google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
-google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
-google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
+google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/lib/cloud/azure/roleassignments.go b/lib/cloud/azure/roleassignments.go
new file mode 100644
index 0000000000000..114bceef88b96
--- /dev/null
+++ b/lib/cloud/azure/roleassignments.go
@@ -0,0 +1,57 @@
+/*
+ * Teleport
+ * Copyright (C) 2024 Gravitational, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package azure
+
+import (
+ "context"
+
+ "github.com/Azure/azure-sdk-for-go/sdk/azcore"
+ "github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"
+ "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2"
+ "github.com/gravitational/trace"
+)
+
+// RoleAssignmentsClient wraps the Azure API to provide a high level subset of functionality
+type RoleAssignmentsClient struct {
+ cli *armauthorization.RoleAssignmentsClient
+}
+
+// NewRoleAssignmentsClient creates a new client for a given subscription and credentials
+func NewRoleAssignmentsClient(subscription string, cred azcore.TokenCredential, options *arm.ClientOptions) (*RoleAssignmentsClient, error) {
+ clientFactory, err := armauthorization.NewClientFactory(subscription, cred, options)
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+ roleDefCli := clientFactory.NewRoleAssignmentsClient()
+ return &RoleAssignmentsClient{cli: roleDefCli}, nil
+}
+
+// ListRoleAssignments returns role assignments for a given scope
+func (c *RoleAssignmentsClient) ListRoleAssignments(ctx context.Context, scope string) ([]*armauthorization.RoleAssignment, error) {
+ pager := c.cli.NewListForScopePager(scope, nil)
+ var roleDefs []*armauthorization.RoleAssignment
+ for pager.More() {
+ page, err := pager.NextPage(ctx)
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+ roleDefs = append(roleDefs, page.Value...)
+ }
+ return roleDefs, nil
+}
diff --git a/lib/cloud/azure/roledefinitions.go b/lib/cloud/azure/roledefinitions.go
new file mode 100644
index 0000000000000..cdc46196aa530
--- /dev/null
+++ b/lib/cloud/azure/roledefinitions.go
@@ -0,0 +1,57 @@
+/*
+ * Teleport
+ * Copyright (C) 2024 Gravitational, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package azure
+
+import (
+ "context"
+
+ "github.com/Azure/azure-sdk-for-go/sdk/azcore"
+ "github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"
+ "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2"
+ "github.com/gravitational/trace"
+)
+
+// RoleDefinitionsClient wraps the Azure API to provide a high level subset of functionality
+type RoleDefinitionsClient struct {
+ cli *armauthorization.RoleDefinitionsClient
+}
+
+// NewRoleDefinitionsClient creates a new client for a given subscription and credentials
+func NewRoleDefinitionsClient(subscription string, cred azcore.TokenCredential, options *arm.ClientOptions) (*RoleDefinitionsClient, error) {
+ clientFactory, err := armauthorization.NewClientFactory(subscription, cred, options)
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+ roleDefCli := clientFactory.NewRoleDefinitionsClient()
+ return &RoleDefinitionsClient{cli: roleDefCli}, nil
+}
+
+// ListRoleDefinitions returns role definitions for a given scope
+func (c *RoleDefinitionsClient) ListRoleDefinitions(ctx context.Context, scope string) ([]*armauthorization.RoleDefinition, error) {
+ pager := c.cli.NewListPager(scope, nil)
+ var roleDefs []*armauthorization.RoleDefinition
+ for pager.More() {
+ page, err := pager.NextPage(ctx)
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+ roleDefs = append(roleDefs, page.Value...)
+ }
+ return roleDefs, nil
+}
diff --git a/lib/cloud/clients.go b/lib/cloud/clients.go
index a100cdb4a4605..bc2b77d2d0abb 100644
--- a/lib/cloud/clients.go
+++ b/lib/cloud/clients.go
@@ -364,6 +364,10 @@ type azureClients struct {
azurePostgresFlexServersClients azure.ClientMap[azure.PostgresFlexServersClient]
// azureRunCommandClients contains the cached Azure Run Command clients.
azureRunCommandClients azure.ClientMap[azure.RunCommandClient]
+ // azureRoleDefinitionsClients contains the cached Azure Role Definitions clients.
+ azureRoleDefinitionsClients azure.ClientMap[azure.RoleDefinitionsClient]
+ // azureRoleAssignmentsClients contains the cached Azure Role Assignments clients.
+ azureRoleAssignmentsClients azure.ClientMap[azure.RoleAssignmentsClient]
}
// credentialsSource defines where the credentials must come from.
@@ -782,6 +786,16 @@ func (c *cloudClients) GetAzureRunCommandClient(subscription string) (azure.RunC
return c.azureRunCommandClients.Get(subscription, c.GetAzureCredential)
}
+// GetAzureRoleDefinitionsClient returns an Azure Role Definitions client
+func (c *cloudClients) GetAzureRoleDefinitionsClient(subscription string) (azure.RoleDefinitionsClient, error) {
+ return c.azureRoleDefinitionsClients.Get(subscription, c.GetAzureCredential)
+}
+
+// GetAzureRoleAssignmentsClient returns an Azure Role Assignments client
+func (c *cloudClients) GetAzureRoleAssignmentsClient(subscription string) (azure.RoleAssignmentsClient, error) {
+ return c.azureRoleAssignmentsClients.Get(subscription, c.GetAzureCredential)
+}
+
// Close closes all initialized clients.
func (c *cloudClients) Close() (err error) {
c.mtx.Lock()
@@ -1094,6 +1108,8 @@ type TestCloudClients struct {
AzureMySQLFlex azure.MySQLFlexServersClient
AzurePostgresFlex azure.PostgresFlexServersClient
AzureRunCommand azure.RunCommandClient
+ AzureRoleDefinitions azure.RoleDefinitionsClient
+ AzureRoleAssignments azure.RoleAssignmentsClient
}
// GetAWSSession returns AWS session for the specified region, optionally
@@ -1365,11 +1381,21 @@ func (c *TestCloudClients) GetAzurePostgresFlexServersClient(subscription string
return c.AzurePostgresFlex, nil
}
-// GetAzureRunCommand returns an Azure Run Command client for the given subscription.
+// GetAzureRunCommandClient returns an Azure Run Command client for the given subscription.
func (c *TestCloudClients) GetAzureRunCommandClient(subscription string) (azure.RunCommandClient, error) {
return c.AzureRunCommand, nil
}
+// GetAzureRoleDefinitionsClient returns an Azure Role Definitions client for the given subscription.
+func (c *TestCloudClients) GetAzureRoleDefinitionsClient(subscription string) (azure.RoleDefinitionsClient, error) {
+ return c.AzureRoleDefinitions, nil
+}
+
+// GetAzureRoleAssignmentsClient returns an Azure Role Assignments client for the given subscription.
+func (c *TestCloudClients) GetAzureRoleAssignmentsClient(subscription string) (azure.RoleAssignmentsClient, error) {
+ return c.AzureRoleAssignments, nil
+}
+
// Close closes all initialized clients.
func (c *TestCloudClients) Close() error {
return nil
diff --git a/lib/config/configuration.go b/lib/config/configuration.go
index e5a06e9b432c2..4d9180679afa2 100644
--- a/lib/config/configuration.go
+++ b/lib/config/configuration.go
@@ -1754,6 +1754,12 @@ kubernetes matchers are present`)
AssumeRole: assumeRole,
})
}
+ for _, azureMatcher := range fc.Discovery.AccessGraph.Azure {
+ subscriptionID := azureMatcher.SubscriptionID
+ tMatcher.Azure = append(tMatcher.Azure, &types.AccessGraphAzureSync{
+ SubscriptionID: subscriptionID,
+ })
+ }
if fc.Discovery.AccessGraph.PollInterval > 0 {
tMatcher.PollInterval = fc.Discovery.AccessGraph.PollInterval
}
diff --git a/lib/config/fileconf.go b/lib/config/fileconf.go
index a86cae7c9a214..6ed09e4af04cb 100644
--- a/lib/config/fileconf.go
+++ b/lib/config/fileconf.go
@@ -1523,6 +1523,8 @@ type GCPMatcher struct {
type AccessGraphSync struct {
// AWS is the AWS configuration for the AccessGraph Sync service.
AWS []AccessGraphAWSSync `yaml:"aws,omitempty"`
+ // Azure is the Azure configuration for the AccessGraph Sync service.
+ Azure []AccessGraphAzureSync `yaml:"azure,omitempty"`
// PollInterval is the frequency at which to poll for AWS resources
PollInterval time.Duration `yaml:"poll_interval,omitempty"`
}
@@ -1538,6 +1540,12 @@ type AccessGraphAWSSync struct {
ExternalID string `yaml:"external_id,omitempty"`
}
+// AccessGraphAzureSync represents the configuration for the Azure AccessGraph Sync service.
+type AccessGraphAzureSync struct {
+ // SubscriptionID is the Azure subscription ID configured for syncing
+ SubscriptionID string `yaml:"subscription_id,omitempty"`
+}
+
// CommandLabel is `command` section of `ssh_service` in the config file
type CommandLabel struct {
Name string `yaml:"name"`
diff --git a/lib/msgraph/paginated.go b/lib/msgraph/paginated.go
index 51c587f19d074..a0b9488af9d70 100644
--- a/lib/msgraph/paginated.go
+++ b/lib/msgraph/paginated.go
@@ -101,6 +101,14 @@ func (c *Client) IterateUsers(ctx context.Context, f func(*User) bool) error {
return iterateSimple(c, ctx, "users", f)
}
+// IterateServicePrincipals lists all service principals in the Entra ID directory using pagination.
+// `f` will be called for each object in the result set.
+// if `f` returns `false`, the iteration is stopped (equivalent to `break` in a normal loop).
+// Ref: [https://learn.microsoft.com/en-us/graph/api/serviceprincipal-list].
+func (c *Client) IterateServicePrincipals(ctx context.Context, f func(principal *ServicePrincipal) bool) error {
+ return iterateSimple(c, ctx, "servicePrincipals", f)
+}
+
// IterateGroupMembers lists all members for the given Entra ID group using pagination.
// `f` will be called for each object in the result set.
// if `f` returns `false`, the iteration is stopped (equivalent to `break` in a normal loop).
diff --git a/lib/srv/discovery/access_graph.go b/lib/srv/discovery/access_graph_aws.go
similarity index 94%
rename from lib/srv/discovery/access_graph.go
rename to lib/srv/discovery/access_graph_aws.go
index 7d65f99f88ef5..294aada7688de 100644
--- a/lib/srv/discovery/access_graph.go
+++ b/lib/srv/discovery/access_graph_aws.go
@@ -50,6 +50,15 @@ const (
batchSize = 500
// defaultPollInterval is the default interval between polling for access graph resources
defaultPollInterval = 15 * time.Minute
+ // Configure health check service to monitor access graph service and
+ // automatically reconnect if the connection is lost without
+ // relying on new events from the auth server to trigger a reconnect.
+ serviceConfig = `{
+ "loadBalancingPolicy": "round_robin",
+ "healthCheckConfig": {
+ "serviceName": ""
+ }
+ }`
)
// errNoAccessGraphFetchers is returned when there are no TAG fetchers.
@@ -145,15 +154,15 @@ func (s *Server) reconcileAccessGraph(ctx context.Context, currentTAGResources *
// getAllAWSSyncFetchers returns all AWS sync fetchers.
func (s *Server) getAllAWSSyncFetchers() []aws_sync.AWSSync {
- allFetchers := make([]aws_sync.AWSSync, 0, len(s.dynamicTAGSyncFetchers))
+ allFetchers := make([]aws_sync.AWSSync, 0, len(s.dynamicTAGAWSFetchers))
- s.muDynamicTAGSyncFetchers.RLock()
- for _, fetcherSet := range s.dynamicTAGSyncFetchers {
+ s.muDynamicTAGAWSFetchers.RLock()
+ for _, fetcherSet := range s.dynamicTAGAWSFetchers {
allFetchers = append(allFetchers, fetcherSet...)
}
- s.muDynamicTAGSyncFetchers.RUnlock()
+ s.muDynamicTAGAWSFetchers.RUnlock()
- allFetchers = append(allFetchers, s.staticTAGSyncFetchers...)
+ allFetchers = append(allFetchers, s.staticTAGAWSFetchers...)
// TODO(tigrato): submit fetchers event
return allFetchers
}
@@ -257,15 +266,6 @@ func (s *Server) initializeAndWatchAccessGraph(ctx context.Context, reloadCh <-c
const (
// aws discovery semaphore lock.
semaphoreName = "access_graph_aws_sync"
- // Configure health check service to monitor access graph service and
- // automatically reconnect if the connection is lost without
- // relying on new events from the auth server to trigger a reconnect.
- serviceConfig = `{
- "loadBalancingPolicy": "round_robin",
- "healthCheckConfig": {
- "serviceName": ""
- }
- }`
)
clusterFeatures := s.Config.ClusterFeatures()
@@ -438,12 +438,12 @@ func grpcCredentials(config AccessGraphConfig, getCert func() (*tls.Certificate,
return grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig)), nil
}
-func (s *Server) initAccessGraphWatchers(ctx context.Context, cfg *Config) error {
- fetchers, err := s.accessGraphFetchersFromMatchers(ctx, cfg.Matchers, "" /* discoveryConfigName */)
+func (s *Server) initTAGAWSWatchers(ctx context.Context, cfg *Config) error {
+ fetchers, err := s.accessGraphAWSFetchersFromMatchers(ctx, cfg.Matchers, "" /* discoveryConfigName */)
if err != nil {
s.Log.ErrorContext(ctx, "Error initializing access graph fetchers", "error", err)
}
- s.staticTAGSyncFetchers = fetchers
+ s.staticTAGAWSFetchers = fetchers
if cfg.AccessGraphConfig.Enabled {
go func() {
@@ -482,8 +482,8 @@ func (s *Server) initAccessGraphWatchers(ctx context.Context, cfg *Config) error
return nil
}
-// accessGraphFetchersFromMatchers converts Matchers into a set of AWS Sync Fetchers.
-func (s *Server) accessGraphFetchersFromMatchers(ctx context.Context, matchers Matchers, discoveryConfigName string) ([]aws_sync.AWSSync, error) {
+// accessGraphAWSFetchersFromMatchers converts Matchers into a set of AWS Sync Fetchers.
+func (s *Server) accessGraphAWSFetchersFromMatchers(ctx context.Context, matchers Matchers, discoveryConfigName string) ([]aws_sync.AWSSync, error) {
var fetchers []aws_sync.AWSSync
var errs []error
if matchers.AccessGraph == nil {
diff --git a/lib/srv/discovery/access_graph_azure.go b/lib/srv/discovery/access_graph_azure.go
new file mode 100644
index 0000000000000..d7f911bb2a449
--- /dev/null
+++ b/lib/srv/discovery/access_graph_azure.go
@@ -0,0 +1,404 @@
+/*
+ * Teleport
+ * Copyright (C) 2025 Gravitational, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package discovery
+
+import (
+ "context"
+ "errors"
+ "io"
+ "sync"
+ "time"
+
+ "github.com/gravitational/trace"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/connectivity"
+
+ "github.com/gravitational/teleport/api/types"
+ "github.com/gravitational/teleport/api/utils/retryutils"
+ "github.com/gravitational/teleport/entitlements"
+ accessgraphv1alpha "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha"
+ "github.com/gravitational/teleport/lib/modules"
+ "github.com/gravitational/teleport/lib/services"
+ "github.com/gravitational/teleport/lib/srv/discovery/fetchers/azuresync"
+)
+
+// reconcileAccessGraphAzure fetches Azure resources, creates a set of resources to delete and upsert based on
+// the previous fetch, and then sends the delete and upsert results to the Access Graph stream
+func (s *Server) reconcileAccessGraphAzure(
+ ctx context.Context,
+ currentTAGResources *azuresync.Resources,
+ stream accessgraphv1alpha.AccessGraphService_AzureEventsStreamClient,
+ features azuresync.Features,
+) error {
+ type fetcherResult struct {
+ result *azuresync.Resources
+ err error
+ }
+
+ // Get all the fetchers
+ allFetchers := s.getAllTAGSyncAzureFetchers()
+ if len(allFetchers) == 0 {
+ // If there are no fetchers, we don't need to continue.
+ // We will send a delete request for all resources and return.
+ upsert, toDel := azuresync.ReconcileResults(currentTAGResources, &azuresync.Resources{})
+
+ if err := azurePush(stream, upsert, toDel); err != nil {
+ s.Log.ErrorContext(ctx, "Error pushing empty resources to TAGs", "error", err)
+ }
+ return trace.Wrap(errNoAccessGraphFetchers)
+ }
+
+ // Fetch results concurrently
+ resultsC := make(chan fetcherResult, len(allFetchers))
+ // Restricts concurrently running fetchers to 3
+ tokens := make(chan struct{}, 3)
+ accountIds := map[string]struct{}{}
+ for _, fetcher := range allFetchers {
+ fetcher := fetcher
+ accountIds[fetcher.GetSubscriptionID()] = struct{}{}
+ tokens <- struct{}{}
+ go func() {
+ defer func() {
+ <-tokens
+ }()
+ result, err := fetcher.Poll(ctx, features)
+ resultsC <- fetcherResult{result, trace.Wrap(err)}
+ }()
+ }
+
+ // Collect the results from all fetchers.
+ results := make([]*azuresync.Resources, 0, len(allFetchers))
+ errs := make([]error, 0, len(allFetchers))
+ for i := 0; i < len(allFetchers); i++ {
+ // Each fetcher can return an error and a result.
+ fetcherResult := <-resultsC
+ if fetcherResult.err != nil {
+ errs = append(errs, fetcherResult.err)
+ }
+ if fetcherResult.result != nil {
+ results = append(results, fetcherResult.result)
+ }
+ }
+
+ // Aggregate all errors into a single error.
+ err := trace.NewAggregate(errs...)
+ if err != nil {
+ s.Log.ErrorContext(ctx, "Error polling TAGs", "error", err)
+ }
+ result := azuresync.MergeResources(results...)
+
+ // Merge all results into a single result
+ upsert, toDel := azuresync.ReconcileResults(currentTAGResources, result)
+ pushErr := azurePush(stream, upsert, toDel)
+
+ if pushErr != nil {
+ s.Log.ErrorContext(ctx, "Error pushing TAGs", "error", pushErr)
+ return nil
+ }
+
+ // Update the currentTAGResources with the result of the reconciliation.
+ *currentTAGResources = *result
+ return nil
+}
+
+// azurePushUpsertInBatches upserts resources to the Access Graph in batches
+func azurePushUpsertInBatches(
+ client accessgraphv1alpha.AccessGraphService_AzureEventsStreamClient,
+ upsert *accessgraphv1alpha.AzureResourceList,
+) error {
+ for i := 0; i < len(upsert.Resources); i += batchSize {
+ end := i + batchSize
+ if end > len(upsert.Resources) {
+ end = len(upsert.Resources)
+ }
+ err := client.Send(
+ &accessgraphv1alpha.AzureEventsStreamRequest{
+ Operation: &accessgraphv1alpha.AzureEventsStreamRequest_Upsert{
+ Upsert: &accessgraphv1alpha.AzureResourceList{
+ Resources: upsert.Resources[i:end],
+ },
+ },
+ },
+ )
+ if err != nil {
+ return trace.Wrap(err)
+ }
+ }
+ return nil
+}
+
+// azurePushDeleteInBatches deletes resources from the Access Graph in batches
+func azurePushDeleteInBatches(
+ client accessgraphv1alpha.AccessGraphService_AzureEventsStreamClient,
+ toDel *accessgraphv1alpha.AzureResourceList,
+) error {
+ for i := 0; i < len(toDel.Resources); i += batchSize {
+ end := i + batchSize
+ if end > len(toDel.Resources) {
+ end = len(toDel.Resources)
+ }
+ err := client.Send(
+ &accessgraphv1alpha.AzureEventsStreamRequest{
+ Operation: &accessgraphv1alpha.AzureEventsStreamRequest_Delete{
+ Delete: &accessgraphv1alpha.AzureResourceList{
+ Resources: toDel.Resources[i:end],
+ },
+ },
+ },
+ )
+ if err != nil {
+ return trace.Wrap(err)
+ }
+ }
+ return nil
+}
+
+// azurePush upserts and deletes Azure resources to/from the Access Graph
+func azurePush(
+ client accessgraphv1alpha.AccessGraphService_AzureEventsStreamClient,
+ upsert *accessgraphv1alpha.AzureResourceList,
+ toDel *accessgraphv1alpha.AzureResourceList,
+) error {
+ err := azurePushUpsertInBatches(client, upsert)
+ if err != nil {
+ return trace.Wrap(err)
+ }
+ err = azurePushDeleteInBatches(client, toDel)
+ if err != nil {
+ return trace.Wrap(err)
+ }
+ err = client.Send(
+ &accessgraphv1alpha.AzureEventsStreamRequest{
+ Operation: &accessgraphv1alpha.AzureEventsStreamRequest_Sync{},
+ },
+ )
+ return trace.Wrap(err)
+}
+
+// getAllTAGSyncAzureFetchers returns both static and dynamic TAG Azure fetchers
+func (s *Server) getAllTAGSyncAzureFetchers() []*azuresync.Fetcher {
+ allFetchers := make([]*azuresync.Fetcher, 0, len(s.dynamicTAGAzureFetchers))
+
+ s.muDynamicTAGAzureFetchers.RLock()
+ for _, fetcherSet := range s.dynamicTAGAzureFetchers {
+ allFetchers = append(allFetchers, fetcherSet...)
+ }
+ s.muDynamicTAGAzureFetchers.RUnlock()
+
+ allFetchers = append(allFetchers, s.staticTAGAzureFetchers...)
+ return allFetchers
+}
+
+// initializeAndWatchAzureAccessGraph initializes and watches the TAG Azure stream
+func (s *Server) initializeAndWatchAzureAccessGraph(ctx context.Context, reloadCh chan struct{}) error {
+ // Check if the access graph is enabled
+ clusterFeatures := s.Config.ClusterFeatures()
+ policy := modules.GetProtoEntitlement(&clusterFeatures, entitlements.Policy)
+ if !clusterFeatures.AccessGraph && !policy.Enabled {
+ return trace.Wrap(errTAGFeatureNotEnabled)
+ }
+
+ // Configure the access graph semaphore for constraining multiple discovery servers
+ const (
+ semaphoreExpiration = time.Minute
+ semaphoreName = "access_graph_azure_sync"
+ )
+ lease, err := services.AcquireSemaphoreLockWithRetry(
+ ctx,
+ services.SemaphoreLockConfigWithRetry{
+ SemaphoreLockConfig: services.SemaphoreLockConfig{
+ Service: s.AccessPoint,
+ Params: types.AcquireSemaphoreRequest{
+ SemaphoreKind: types.KindAccessGraph,
+ SemaphoreName: semaphoreName,
+ MaxLeases: 1,
+ Holder: s.Config.ServerID,
+ },
+ Expiry: semaphoreExpiration,
+ Clock: s.clock,
+ },
+ Retry: retryutils.LinearConfig{
+ Clock: s.clock,
+ First: time.Second,
+ Step: semaphoreExpiration / 2,
+ Max: semaphoreExpiration,
+ Jitter: retryutils.DefaultJitter,
+ },
+ },
+ )
+ if err != nil {
+ return trace.Wrap(err)
+ }
+ ctx, cancel := context.WithCancel(lease)
+ defer cancel()
+ defer func() {
+ lease.Stop()
+ if err := lease.Wait(); err != nil {
+ s.Log.WarnContext(ctx, "error cleaning up semaphore", "error", err, "semaphore", semaphoreName)
+ }
+ }()
+
+ // Create the access graph client
+ accessGraphConn, err := newAccessGraphClient(
+ ctx,
+ s.GetClientCert,
+ s.Config.AccessGraphConfig,
+ grpc.WithDefaultServiceConfig(serviceConfig),
+ )
+ if err != nil {
+ return trace.Wrap(err)
+ }
+ // Close the connection when the function returns.
+ defer accessGraphConn.Close()
+ client := accessgraphv1alpha.NewAccessGraphServiceClient(accessGraphConn)
+
+ // Create the event stream
+ stream, err := client.AzureEventsStream(ctx)
+ if err != nil {
+ s.Log.ErrorContext(ctx, "Failed to get TAG Azure service stream", "error", err)
+ return trace.Wrap(err)
+ }
+ header, err := stream.Header()
+ if err != nil {
+ s.Log.ErrorContext(ctx, "Failed to get TAG Azure service stream header", "error", err)
+ return trace.Wrap(err)
+ }
+ const (
+ supportedResourcesKey = "supported-kinds"
+ )
+ supportedKinds := header.Get(supportedResourcesKey)
+ if len(supportedKinds) == 0 {
+ return trace.BadParameter("TAG Azure service did not return supported kinds")
+ }
+ features := azuresync.BuildFeatures(supportedKinds...)
+
+ // Cancels the context to stop the event watcher if the access graph connection fails
+ var wg sync.WaitGroup
+ defer wg.Wait()
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ defer cancel()
+ if !accessGraphConn.WaitForStateChange(ctx, connectivity.Ready) {
+ s.Log.InfoContext(ctx, "access graph service connection was closed")
+ }
+ }()
+
+ // Configure the poll interval
+ tickerInterval := defaultPollInterval
+ if s.Config.Matchers.AccessGraph != nil {
+ if s.Config.Matchers.AccessGraph.PollInterval > defaultPollInterval {
+ tickerInterval = s.Config.Matchers.AccessGraph.PollInterval
+ } else {
+ s.Log.WarnContext(ctx,
+ "Access graph Azure service poll interval cannot be less than the default",
+ "default_poll_interval",
+ defaultPollInterval)
+ }
+ }
+ s.Log.InfoContext(ctx, "Access graph Azure service poll interval", "poll_interval", tickerInterval)
+
+ // Reconciles the resources as they're imported from Azure
+ azureResources := &azuresync.Resources{}
+ ticker := time.NewTicker(15 * time.Minute)
+ defer ticker.Stop()
+ for {
+ err := s.reconcileAccessGraphAzure(ctx, azureResources, stream, features)
+ if errors.Is(err, errNoAccessGraphFetchers) {
+ err := stream.CloseSend()
+ if errors.Is(err, io.EOF) {
+ err = nil
+ }
+ return trace.Wrap(err)
+ }
+ select {
+ case <-ctx.Done():
+ return trace.Wrap(ctx.Err())
+ case <-ticker.C:
+ case <-reloadCh:
+ }
+ }
+}
+
+// initTAGAzureWatchers initializes the TAG Azure watchers
+func (s *Server) initTAGAzureWatchers(ctx context.Context, cfg *Config) error {
+ staticFetchers, err := s.accessGraphAzureFetchersFromMatchers(cfg.Matchers, "" /* discoveryConfigName */)
+ if err != nil {
+ s.Log.ErrorContext(ctx, "Error initializing access graph fetchers", "error", err)
+ }
+ s.staticTAGAzureFetchers = staticFetchers
+ if !cfg.AccessGraphConfig.Enabled {
+ return nil
+ }
+ go func() {
+ reloadCh := s.newDiscoveryConfigChangedSub()
+ for {
+ fetchers := s.getAllTAGSyncAzureFetchers()
+ // Wait for the config to change and re-evaluate the fetchers before starting the sync.
+ if len(fetchers) == 0 {
+ s.Log.DebugContext(ctx, "No Azure sync fetchers configured. Access graph sync will not be enabled.")
+ select {
+ case <-ctx.Done():
+ return
+ case <-reloadCh:
+ // if the config changes, we need to get the updated list of fetchers
+ }
+ continue
+ }
+ // Reset the Azure resources to force a full sync
+ if err := s.initializeAndWatchAzureAccessGraph(ctx, reloadCh); errors.Is(err, errTAGFeatureNotEnabled) {
+ s.Log.WarnContext(ctx, "Access Graph specified in config, but the license does not include Teleport Policy. Access graph sync will not be enabled.")
+ break
+ } else if err != nil {
+ s.Log.WarnContext(ctx, "Error initializing and watching access graph", "error", err)
+ }
+
+ select {
+ case <-ctx.Done():
+ return
+ case <-time.After(time.Minute):
+ }
+ }
+ }()
+ return nil
+}
+
+// accessGraphAzureFetchersFromMatchers converts matcher configuration to fetchers for Azure resource synchronization
+func (s *Server) accessGraphAzureFetchersFromMatchers(
+ matchers Matchers, discoveryConfigName string) ([]*azuresync.Fetcher, error) {
+ var fetchers []*azuresync.Fetcher
+ var errs []error
+ if matchers.AccessGraph == nil {
+ return fetchers, nil
+ }
+ for _, matcher := range matchers.AccessGraph.Azure {
+ fetcherCfg := azuresync.Config{
+ SubscriptionID: matcher.SubscriptionID,
+ Integration: matcher.Integration,
+ DiscoveryConfigName: discoveryConfigName,
+ }
+ fetcher, err := azuresync.NewFetcher(fetcherCfg, s.ctx)
+ if err != nil {
+ errs = append(errs, err)
+ continue
+ }
+ fetchers = append(fetchers, fetcher)
+ }
+ return fetchers, trace.NewAggregate(errs...)
+}
diff --git a/lib/srv/discovery/discovery.go b/lib/srv/discovery/discovery.go
index d7eb68a47cd0e..2caad467f7ad9 100644
--- a/lib/srv/discovery/discovery.go
+++ b/lib/srv/discovery/discovery.go
@@ -60,6 +60,7 @@ import (
"github.com/gravitational/teleport/lib/srv/discovery/common"
"github.com/gravitational/teleport/lib/srv/discovery/fetchers"
aws_sync "github.com/gravitational/teleport/lib/srv/discovery/fetchers/aws-sync"
+ azure_sync "github.com/gravitational/teleport/lib/srv/discovery/fetchers/azuresync"
"github.com/gravitational/teleport/lib/srv/discovery/fetchers/db"
"github.com/gravitational/teleport/lib/srv/server"
logutils "github.com/gravitational/teleport/lib/utils/log"
@@ -331,11 +332,17 @@ type Server struct {
muDynamicServerGCPFetchers sync.RWMutex
staticServerGCPFetchers []server.Fetcher
- // dynamicTAGSyncFetchers holds the current TAG Fetchers for the Dynamic Matchers (those coming from DiscoveryConfig resource).
+ // dynamicTAGAWSFetchers holds the current TAG Fetchers for the Dynamic Matchers (those coming from DiscoveryConfig resource).
// The key is the DiscoveryConfig name.
- dynamicTAGSyncFetchers map[string][]aws_sync.AWSSync
- muDynamicTAGSyncFetchers sync.RWMutex
- staticTAGSyncFetchers []aws_sync.AWSSync
+ dynamicTAGAWSFetchers map[string][]aws_sync.AWSSync
+ muDynamicTAGAWSFetchers sync.RWMutex
+ staticTAGAWSFetchers []aws_sync.AWSSync
+
+ // dynamicTAGAzureFetchers holds the current TAG Fetchers for the Dynamic Matchers (those coming from DiscoveryConfig resource).
+ // The key is the DiscoveryConfig name.
+ dynamicTAGAzureFetchers map[string][]*azure_sync.Fetcher
+ muDynamicTAGAzureFetchers sync.RWMutex
+ staticTAGAzureFetchers []*azure_sync.Fetcher
// dynamicKubeFetchers holds the current kube fetchers that use integration as a source of credentials,
// for the Dynamic Matchers (those coming from DiscoveryConfig resource).
@@ -382,7 +389,8 @@ func New(ctx context.Context, cfg *Config) (*Server, error) {
dynamicServerAWSFetchers: make(map[string][]server.Fetcher),
dynamicServerAzureFetchers: make(map[string][]server.Fetcher),
dynamicServerGCPFetchers: make(map[string][]server.Fetcher),
- dynamicTAGSyncFetchers: make(map[string][]aws_sync.AWSSync),
+ dynamicTAGAWSFetchers: make(map[string][]aws_sync.AWSSync),
+ dynamicTAGAzureFetchers: make(map[string][]*azure_sync.Fetcher),
dynamicDiscoveryConfig: make(map[string]*discoveryconfig.DiscoveryConfig),
awsSyncStatus: awsSyncStatus{},
awsEC2ResourcesStatus: newAWSResourceStatusCollector(types.AWSMatcherEC2),
@@ -423,7 +431,11 @@ func New(ctx context.Context, cfg *Config) (*Server, error) {
return nil, trace.Wrap(err)
}
- if err := s.initAccessGraphWatchers(s.ctx, cfg); err != nil {
+ if err := s.initTAGAWSWatchers(s.ctx, cfg); err != nil {
+ return nil, trace.Wrap(err)
+ }
+
+ if err := s.initTAGAzureWatchers(s.ctx, cfg); err != nil {
return nil, trace.Wrap(err)
}
@@ -1653,9 +1665,13 @@ func (s *Server) deleteDynamicFetchers(name string) {
delete(s.dynamicServerGCPFetchers, name)
s.muDynamicServerGCPFetchers.Unlock()
- s.muDynamicTAGSyncFetchers.Lock()
- delete(s.dynamicTAGSyncFetchers, name)
- s.muDynamicTAGSyncFetchers.Unlock()
+ s.muDynamicTAGAWSFetchers.Lock()
+ delete(s.dynamicTAGAWSFetchers, name)
+ s.muDynamicTAGAWSFetchers.Unlock()
+
+ s.muDynamicTAGAzureFetchers.Lock()
+ delete(s.dynamicTAGAzureFetchers, name)
+ s.muDynamicTAGAzureFetchers.Unlock()
s.muDynamicKubeFetchers.Lock()
delete(s.dynamicKubeFetchers, name)
@@ -1703,15 +1719,23 @@ func (s *Server) upsertDynamicMatchers(ctx context.Context, dc *discoveryconfig.
s.dynamicDatabaseFetchers[dc.GetName()] = databaseFetchers
s.muDynamicDatabaseFetchers.Unlock()
- awsSyncMatchers, err := s.accessGraphFetchersFromMatchers(
+ awsSyncMatchers, err := s.accessGraphAWSFetchersFromMatchers(
ctx, matchers, dc.GetName(),
)
if err != nil {
return trace.Wrap(err)
}
- s.muDynamicTAGSyncFetchers.Lock()
- s.dynamicTAGSyncFetchers[dc.GetName()] = awsSyncMatchers
- s.muDynamicTAGSyncFetchers.Unlock()
+ s.muDynamicTAGAWSFetchers.Lock()
+ s.dynamicTAGAWSFetchers[dc.GetName()] = awsSyncMatchers
+ s.muDynamicTAGAWSFetchers.Unlock()
+
+ azureSyncMatchers, err := s.accessGraphAzureFetchersFromMatchers(matchers, dc.GetName())
+ if err != nil {
+ return trace.Wrap(err)
+ }
+ s.muDynamicTAGAzureFetchers.Lock()
+ s.dynamicTAGAzureFetchers[dc.GetName()] = azureSyncMatchers
+ s.muDynamicTAGAzureFetchers.Unlock()
kubeFetchers, err := s.kubeFetchersFromMatchers(matchers, dc.GetName())
if err != nil {
diff --git a/lib/srv/discovery/fetchers/azuresync/azure-sync.go b/lib/srv/discovery/fetchers/azuresync/azure-sync.go
new file mode 100644
index 0000000000000..53d4d4144c5cf
--- /dev/null
+++ b/lib/srv/discovery/fetchers/azuresync/azure-sync.go
@@ -0,0 +1,250 @@
+/*
+ * Teleport
+ * Copyright (C) 2025 Gravitational, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package azuresync
+
+import (
+ "context"
+
+ "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
+ "github.com/gravitational/trace"
+ "golang.org/x/sync/errgroup"
+
+ accessgraphv1alpha "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha"
+ "github.com/gravitational/teleport/lib/cloud/azure"
+ "github.com/gravitational/teleport/lib/msgraph"
+ "github.com/gravitational/teleport/lib/utils/slices"
+)
+
+// fetcherConcurrency is an arbitrary per-resource type concurrency to ensure significant throughput. As we increase
+// the number of resource types, we may increase this value or use some other approach to fetching concurrency.
+const fetcherConcurrency = 4
+
+// Config defines parameters required for fetching resources from Azure
+type Config struct {
+ // SubscriptionID is the Azure subscriptipn ID
+ SubscriptionID string
+ // Integration is the name of the associated Teleport integration
+ Integration string
+ // DiscoveryConfigName is the name of this Discovery configuration
+ DiscoveryConfigName string
+}
+
+// Resources represents the set of resources fetched from Azure
+type Resources struct {
+ // Principals are Azure users, groups, and service principals
+ Principals []*accessgraphv1alpha.AzurePrincipal
+ // RoleDefinitions are Azure role definitions
+ RoleDefinitions []*accessgraphv1alpha.AzureRoleDefinition
+ // RoleAssignments are Azure role assignments
+ RoleAssignments []*accessgraphv1alpha.AzureRoleAssignment
+ // VirtualMachines are Azure virtual machines
+ VirtualMachines []*accessgraphv1alpha.AzureVirtualMachine
+}
+
+// Fetcher provides the functionality for fetching resources from Azure
+type Fetcher struct {
+ // Config is the configuration values for this fetcher
+ Config
+ // lastError is the last error returned from polling
+ lastError error
+ // lastDiscoveredResources is the number of resources last returned from polling
+ lastDiscoveredResources uint64
+ // lastResult is the last set of resources returned from polling
+ lastResult *Resources
+
+ // graphClient is the MS graph client for fetching principals
+ graphClient *msgraph.Client
+ // roleAssignClient is the Azure client for fetching role assignments
+ roleAssignClient RoleAssignmentsClient
+ // roleDefClient is the Azure client for fetching role definitions
+ roleDefClient RoleDefinitionsClient
+ // vmClient is the Azure client for fetching virtual machines
+ vmClient VirtualMachinesClient
+}
+
+// NewFetcher returns a new fetcher based on configuration parameters
+func NewFetcher(cfg Config, ctx context.Context) (*Fetcher, error) {
+ // Establish the credential from the managed identity
+ cred, err := azidentity.NewDefaultAzureCredential(nil)
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+
+ // Create the clients for the fetcher
+ graphClient, err := msgraph.NewClient(msgraph.Config{
+ TokenProvider: cred,
+ })
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+ roleAssignClient, err := azure.NewRoleAssignmentsClient(cfg.SubscriptionID, cred, nil)
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+ roleDefClient, err := azure.NewRoleDefinitionsClient(cfg.SubscriptionID, cred, nil)
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+ vmClient, err := azure.NewVirtualMachinesClient(cfg.SubscriptionID, cred, nil)
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+
+ return &Fetcher{
+ Config: cfg,
+ lastResult: &Resources{},
+ graphClient: graphClient,
+ roleAssignClient: roleAssignClient,
+ roleDefClient: roleDefClient,
+ vmClient: vmClient,
+ }, nil
+}
+
+const (
+ featNamePrincipals = "azure/principals"
+ featNameRoleDefinitions = "azure/roledefinitions"
+ featNameRoleAssignments = "azure/roleassignments"
+ featNameVms = "azure/virtualmachines"
+)
+
+// Features is a set of booleans that are received from the Access Graph to indicate which resources it can receive
+type Features struct {
+ // Principals indicates Azure principals can be be fetched
+ Principals bool
+ // RoleDefinitions indicates Azure role definitions can be fetched
+ RoleDefinitions bool
+ // RoleAssignments indicates Azure role assignments can be fetched
+ RoleAssignments bool
+ // VirtualMachines indicates Azure virtual machines can be fetched
+ VirtualMachines bool
+}
+
+// BuildFeatures builds the feature flags based on supported types returned by Access Graph Azure endpoints.
+func BuildFeatures(values ...string) Features {
+ features := Features{}
+ for _, value := range values {
+ switch value {
+ case featNamePrincipals:
+ features.Principals = true
+ case featNameRoleAssignments:
+ features.RoleAssignments = true
+ case featNameRoleDefinitions:
+ features.RoleDefinitions = true
+ case featNameVms:
+ features.VirtualMachines = true
+ }
+ }
+ return features
+}
+
+// Poll fetches and deduplicates Azure resources specified by the Access Graph
+func (f *Fetcher) Poll(ctx context.Context, feats Features) (*Resources, error) {
+ res, err := f.fetch(ctx, feats)
+ if res == nil {
+ return nil, trace.Wrap(err)
+ }
+ res.Principals = slices.DeduplicateKey(res.Principals, azurePrincipalsKey)
+ res.RoleAssignments = slices.DeduplicateKey(res.RoleAssignments, azureRoleAssignKey)
+ res.RoleDefinitions = slices.DeduplicateKey(res.RoleDefinitions, azureRoleDefKey)
+ res.VirtualMachines = slices.DeduplicateKey(res.VirtualMachines, azureVmKey)
+ return res, trace.Wrap(err)
+}
+
+// fetch returns the resources specified by the Access Graph
+func (f *Fetcher) fetch(ctx context.Context, feats Features) (*Resources, error) {
+ // Accumulate Azure resources
+ eg, ctx := errgroup.WithContext(ctx)
+ eg.SetLimit(fetcherConcurrency)
+ var result = &Resources{}
+ // we use a larger value (50) here so there is always room for any returned error to be sent to errsCh without blocking.
+ errsCh := make(chan error, 50)
+ if feats.Principals {
+ eg.Go(func() error {
+ principals, err := fetchPrincipals(ctx, f.SubscriptionID, f.graphClient)
+ if err != nil {
+ errsCh <- err
+ return nil
+ }
+ result.Principals, err = expandMemberships(ctx, f.graphClient, principals)
+ if err != nil {
+ errsCh <- err
+ return err
+ }
+ return nil
+ })
+ }
+ if feats.RoleAssignments {
+ eg.Go(func() error {
+ roleAssigns, err := fetchRoleAssignments(ctx, f.SubscriptionID, f.roleAssignClient)
+ if err != nil {
+ errsCh <- err
+ return nil
+ }
+ result.RoleAssignments = roleAssigns
+ return nil
+ })
+ }
+ if feats.RoleDefinitions {
+ eg.Go(func() error {
+ roleDefs, err := fetchRoleDefinitions(ctx, f.SubscriptionID, f.roleDefClient)
+ if err != nil {
+ errsCh <- err
+ return nil
+ }
+ result.RoleDefinitions = roleDefs
+ return nil
+ })
+ }
+ if feats.VirtualMachines {
+ eg.Go(func() error {
+ vms, err := fetchVirtualMachines(ctx, f.SubscriptionID, f.vmClient)
+ if err != nil {
+ errsCh <- err
+ return nil
+ }
+ result.VirtualMachines = vms
+ return nil
+ })
+ }
+
+ // Return the result along with any errors collected
+ _ = eg.Wait()
+ close(errsCh)
+ return result, trace.NewAggregateFromChannel(errsCh, context.WithoutCancel(ctx))
+}
+
+// Status returns the number of resources last fetched and/or the last fetching/reconciling error
+func (f *Fetcher) Status() (uint64, error) {
+ return f.lastDiscoveredResources, f.lastError
+}
+
+// DiscoveryConfigName returns the name of the configured discovery
+func (f *Fetcher) DiscoveryConfigName() string {
+ return f.Config.DiscoveryConfigName
+}
+
+// IsFromDiscoveryConfig returns whether the discovery is from configuration or dynamic
+func (f *Fetcher) IsFromDiscoveryConfig() bool {
+ return f.Config.DiscoveryConfigName != ""
+}
+
+// GetSubscriptionID returns the ID of the Azure subscription
+func (f *Fetcher) GetSubscriptionID() string {
+ return f.Config.SubscriptionID
+}
diff --git a/lib/srv/discovery/fetchers/azuresync/azure-sync_test.go b/lib/srv/discovery/fetchers/azuresync/azure-sync_test.go
new file mode 100644
index 0000000000000..261555b21578e
--- /dev/null
+++ b/lib/srv/discovery/fetchers/azuresync/azure-sync_test.go
@@ -0,0 +1,234 @@
+/*
+ * Teleport
+ * Copyright (C) 2025 Gravitational, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package azuresync
+
+import (
+ "context"
+ "fmt"
+ "testing"
+
+ "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2"
+ "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v6"
+ "github.com/stretchr/testify/require"
+)
+
+type testRoleDefCli struct {
+ returnErr bool
+ roleDefs []*armauthorization.RoleDefinition
+}
+
+func (t testRoleDefCli) ListRoleDefinitions(ctx context.Context, scope string) ([]*armauthorization.RoleDefinition, error) {
+ if t.returnErr {
+ return nil, fmt.Errorf("error")
+ }
+ return t.roleDefs, nil
+}
+
+type testRoleAssignCli struct {
+ returnErr bool
+ roleAssigns []*armauthorization.RoleAssignment
+}
+
+func (t testRoleAssignCli) ListRoleAssignments(ctx context.Context, scope string) ([]*armauthorization.RoleAssignment, error) {
+ if t.returnErr {
+ return nil, fmt.Errorf("error")
+ }
+ return t.roleAssigns, nil
+}
+
+type testVmCli struct {
+ returnErr bool
+ vms []*armcompute.VirtualMachine
+}
+
+func (t testVmCli) ListVirtualMachines(ctx context.Context, resourceGroup string) ([]*armcompute.VirtualMachine, error) {
+ if t.returnErr {
+ return nil, fmt.Errorf("error")
+ }
+ return t.vms, nil
+}
+
+func newRoleDef(id string, name string) *armauthorization.RoleDefinition {
+ roleName := "test_role_name"
+ action1 := "Microsoft.Compute/virtualMachines/read"
+ action2 := "Microsoft.Compute/virtualMachines/*"
+ action3 := "Microsoft.Compute/*"
+ return &armauthorization.RoleDefinition{
+ ID: &id,
+ Name: &name,
+ Properties: &armauthorization.RoleDefinitionProperties{
+ Permissions: []*armauthorization.Permission{
+ {
+ Actions: []*string{&action1, &action2},
+ },
+ {
+ Actions: []*string{&action3},
+ },
+ },
+ RoleName: &roleName,
+ },
+ }
+}
+
+func newRoleAssign(id string, name string) *armauthorization.RoleAssignment {
+ scope := "test_scope"
+ principalId := "test_principal_id"
+ roleDefId := "test_role_def_id"
+ return &armauthorization.RoleAssignment{
+ ID: &id,
+ Name: &name,
+ Properties: &armauthorization.RoleAssignmentProperties{
+ PrincipalID: &principalId,
+ RoleDefinitionID: &roleDefId,
+ Scope: &scope,
+ },
+ }
+}
+
+func newVm(id string, name string) *armcompute.VirtualMachine {
+ return &armcompute.VirtualMachine{
+ ID: &id,
+ Name: &name,
+ }
+}
+
+func TestPoll(t *testing.T) {
+ roleDefs := []*armauthorization.RoleDefinition{
+ newRoleDef("id1", "name1"),
+ }
+ roleAssigns := []*armauthorization.RoleAssignment{
+ newRoleAssign("id1", "name1"),
+ }
+ vms := []*armcompute.VirtualMachine{
+ newVm("id1", "name2"),
+ }
+ roleDefClient := testRoleDefCli{}
+ roleAssignClient := testRoleAssignCli{}
+ vmClient := testVmCli{}
+ fetcher := Fetcher{
+ Config: Config{SubscriptionID: "1234567890"},
+ lastResult: &Resources{},
+ roleDefClient: &roleDefClient,
+ roleAssignClient: &roleAssignClient,
+ vmClient: &vmClient,
+ }
+ ctx := context.Background()
+ allFeats := Features{
+ RoleDefinitions: true,
+ RoleAssignments: true,
+ VirtualMachines: true,
+ }
+ noVmsFeats := allFeats
+ noVmsFeats.VirtualMachines = false
+
+ tests := []struct {
+ name string
+ returnErr bool
+ roleDefs []*armauthorization.RoleDefinition
+ roleAssigns []*armauthorization.RoleAssignment
+ vms []*armcompute.VirtualMachine
+ feats Features
+ }{
+ // Process no results from clients
+ {
+ name: "WithoutResults",
+ returnErr: false,
+ roleDefs: []*armauthorization.RoleDefinition{},
+ roleAssigns: []*armauthorization.RoleAssignment{},
+ vms: []*armcompute.VirtualMachine{},
+ feats: allFeats,
+ },
+ // Process test results from clients
+ {
+ name: "WithResults",
+ returnErr: false,
+ roleDefs: roleDefs,
+ roleAssigns: roleAssigns,
+ vms: vms,
+ feats: allFeats,
+ },
+ // Handle errors from clients
+ {
+ name: "PollErrors",
+ returnErr: true,
+ roleDefs: roleDefs,
+ roleAssigns: roleAssigns,
+ vms: vms,
+ feats: allFeats,
+ },
+ // Handle VM features being disabled
+ {
+ name: "NoVmsFeats",
+ returnErr: false,
+ roleDefs: roleDefs,
+ roleAssigns: roleAssigns,
+ vms: vms,
+ feats: noVmsFeats,
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ // Set the test data
+ roleDefClient.returnErr = tt.returnErr
+ roleDefClient.roleDefs = tt.roleDefs
+ roleAssignClient.returnErr = tt.returnErr
+ roleAssignClient.roleAssigns = tt.roleAssigns
+ vmClient.returnErr = tt.returnErr
+ vmClient.vms = tt.vms
+
+ // Poll for resources
+ resources, err := fetcher.Poll(ctx, tt.feats)
+
+ // Require no error unless otherwise specified
+ if tt.returnErr {
+ require.Error(t, err)
+ return
+ }
+ require.NoError(t, err)
+
+ // Verify the results, based on the features set
+ require.NotNil(t, resources)
+ require.Equal(t, tt.feats.RoleDefinitions == false || len(tt.roleDefs) == 0, len(resources.RoleDefinitions) == 0)
+ for idx, resource := range resources.RoleDefinitions {
+ roleDef := tt.roleDefs[idx]
+ require.Equal(t, *roleDef.ID, resource.Id)
+ require.Equal(t, fetcher.SubscriptionID, resource.SubscriptionId)
+ require.Equal(t, *roleDef.Properties.RoleName, resource.Name)
+ require.Len(t, roleDef.Properties.Permissions, len(resource.Permissions))
+ }
+ require.Equal(t, tt.feats.RoleAssignments == false || len(tt.roleAssigns) == 0, len(resources.RoleAssignments) == 0)
+ for idx, resource := range resources.RoleAssignments {
+ roleAssign := tt.roleAssigns[idx]
+ require.Equal(t, *roleAssign.ID, resource.Id)
+ require.Equal(t, fetcher.SubscriptionID, resource.SubscriptionId)
+ require.Equal(t, *roleAssign.Properties.PrincipalID, resource.PrincipalId)
+ require.Equal(t, *roleAssign.Properties.RoleDefinitionID, resource.RoleDefinitionId)
+ require.Equal(t, *roleAssign.Properties.Scope, resource.Scope)
+ }
+ require.Equal(t, tt.feats.VirtualMachines == false || len(tt.vms) == 0, len(resources.VirtualMachines) == 0)
+ for idx, resource := range resources.VirtualMachines {
+ vm := tt.vms[idx]
+ require.Equal(t, *vm.ID, resource.Id)
+ require.Equal(t, fetcher.SubscriptionID, resource.SubscriptionId)
+ require.Equal(t, *vm.Name, resource.Name)
+ }
+ })
+ }
+}
diff --git a/lib/srv/discovery/fetchers/azuresync/memberships.go b/lib/srv/discovery/fetchers/azuresync/memberships.go
new file mode 100644
index 0000000000000..f05be8f72567c
--- /dev/null
+++ b/lib/srv/discovery/fetchers/azuresync/memberships.go
@@ -0,0 +1,65 @@
+/*
+ * Teleport
+ * Copyright (C) 2025 Gravitational, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package azuresync
+
+import (
+ "context"
+
+ "github.com/gravitational/trace"
+ "golang.org/x/sync/errgroup"
+
+ accessgraphv1alpha "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha"
+ "github.com/gravitational/teleport/lib/msgraph"
+)
+
+const parallelism = 10 //nolint:unused // invoked in a dependent PR
+
+// expandMemberships adds membership data to AzurePrincipal objects by querying the Graph API for group memberships
+func expandMemberships(ctx context.Context, cli *msgraph.Client, principals []*accessgraphv1alpha.AzurePrincipal) ([]*accessgraphv1alpha.AzurePrincipal, error) { //nolint:unused // invoked in a dependent PR
+ // Map principals by ID
+ var principalsMap = make(map[string]*accessgraphv1alpha.AzurePrincipal)
+ for _, principal := range principals {
+ principalsMap[principal.Id] = principal
+ }
+ // Iterate through the Azure groups and add the group ID as a membership for its corresponding principal
+ eg, _ := errgroup.WithContext(ctx)
+ eg.SetLimit(parallelism)
+ errCh := make(chan error, len(principals))
+ for _, principal := range principals {
+ if principal.ObjectType != "group" {
+ continue
+ }
+ group := principal
+ eg.Go(func() error {
+ err := cli.IterateGroupMembers(ctx, group.Id, func(member msgraph.GroupMember) bool {
+ if memberPrincipal, ok := principalsMap[*member.GetID()]; ok {
+ memberPrincipal.MemberOf = append(memberPrincipal.MemberOf, group.Id)
+ }
+ return true
+ })
+ if err != nil {
+ errCh <- err
+ }
+ return nil
+ })
+ }
+ _ = eg.Wait()
+ close(errCh)
+ return principals, trace.NewAggregateFromChannel(errCh, ctx)
+}
diff --git a/lib/srv/discovery/fetchers/azuresync/principals.go b/lib/srv/discovery/fetchers/azuresync/principals.go
new file mode 100644
index 0000000000000..073d6c4713e0c
--- /dev/null
+++ b/lib/srv/discovery/fetchers/azuresync/principals.go
@@ -0,0 +1,87 @@
+/*
+ * Teleport
+ * Copyright (C) 2024 Gravitational, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package azuresync
+
+import (
+ "context"
+
+ "github.com/gravitational/trace"
+ "google.golang.org/protobuf/types/known/timestamppb"
+
+ accessgraphv1alpha "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha"
+ "github.com/gravitational/teleport/lib/msgraph"
+)
+
+type dirObjMetadata struct { //nolint:unused // invoked in a dependent PR
+ objectType string
+}
+
+type queryResult struct { //nolint:unused // invoked in a dependent PR
+ metadata dirObjMetadata
+ dirObj msgraph.DirectoryObject
+}
+
+// fetchPrincipals fetches the Azure principals (users, groups, and service principals) using the Graph API
+func fetchPrincipals(ctx context.Context, subscriptionID string, cli *msgraph.Client) ([]*accessgraphv1alpha.AzurePrincipal, error) { //nolint: unused // invoked in a dependent PR
+ // Fetch the users, groups, and service principals as directory objects
+ var queryResults []queryResult
+ err := cli.IterateUsers(ctx, func(user *msgraph.User) bool {
+ res := queryResult{metadata: dirObjMetadata{objectType: "user"}, dirObj: user.DirectoryObject}
+ queryResults = append(queryResults, res)
+ return true
+ })
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+ err = cli.IterateGroups(ctx, func(group *msgraph.Group) bool {
+ res := queryResult{metadata: dirObjMetadata{objectType: "group"}, dirObj: group.DirectoryObject}
+ queryResults = append(queryResults, res)
+ return true
+ })
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+ err = cli.IterateServicePrincipals(ctx, func(servicePrincipal *msgraph.ServicePrincipal) bool {
+ res := queryResult{metadata: dirObjMetadata{objectType: "servicePrincipal"}, dirObj: servicePrincipal.DirectoryObject}
+ queryResults = append(queryResults, res)
+ return true
+ })
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+
+ // Return the users, groups, and service principals as protobuf messages
+ var fetchErrs []error
+ var pbPrincipals []*accessgraphv1alpha.AzurePrincipal
+ for _, res := range queryResults {
+ if res.dirObj.ID == nil || res.dirObj.DisplayName == nil {
+ fetchErrs = append(fetchErrs,
+ trace.BadParameter("nil values on msgraph directory object: %v", res.dirObj))
+ continue
+ }
+ pbPrincipals = append(pbPrincipals, &accessgraphv1alpha.AzurePrincipal{
+ Id: *res.dirObj.ID,
+ SubscriptionId: subscriptionID,
+ LastSyncTime: timestamppb.Now(),
+ DisplayName: *res.dirObj.DisplayName,
+ ObjectType: res.metadata.objectType,
+ })
+ }
+ return pbPrincipals, trace.NewAggregate(fetchErrs...)
+}
diff --git a/lib/srv/discovery/fetchers/azuresync/reconcile.go b/lib/srv/discovery/fetchers/azuresync/reconcile.go
new file mode 100644
index 0000000000000..a874f48215811
--- /dev/null
+++ b/lib/srv/discovery/fetchers/azuresync/reconcile.go
@@ -0,0 +1,165 @@
+/*
+ * Teleport
+ * Copyright (C) 2025 Gravitational, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package azuresync
+
+import (
+ "fmt"
+
+ "google.golang.org/protobuf/proto"
+
+ accessgraphv1alpha "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha"
+ "github.com/gravitational/teleport/lib/utils/slices"
+)
+
+// MergeResources merges Azure resources fetched from multiple configured Azure fetchers
+func MergeResources(results ...*Resources) *Resources {
+ if len(results) == 0 {
+ return &Resources{}
+ }
+ if len(results) == 1 {
+ return results[0]
+ }
+ result := &Resources{}
+ for _, r := range results {
+ result.Principals = append(result.Principals, r.Principals...)
+ result.RoleAssignments = append(result.RoleAssignments, r.RoleAssignments...)
+ result.RoleDefinitions = append(result.RoleDefinitions, r.RoleDefinitions...)
+ result.VirtualMachines = append(result.VirtualMachines, r.VirtualMachines...)
+ }
+ result.Principals = slices.DeduplicateKey(result.Principals, azurePrincipalsKey)
+ result.RoleAssignments = slices.DeduplicateKey(result.RoleAssignments, azureRoleAssignKey)
+ result.RoleDefinitions = slices.DeduplicateKey(result.RoleDefinitions, azureRoleDefKey)
+ result.VirtualMachines = slices.DeduplicateKey(result.VirtualMachines, azureVmKey)
+ return result
+}
+
+// newResourceList creates a new resource list message
+func newResourceList() *accessgraphv1alpha.AzureResourceList {
+ return &accessgraphv1alpha.AzureResourceList{
+ Resources: make([]*accessgraphv1alpha.AzureResource, 0),
+ }
+}
+
+// ReconcileResults compares previously and currently fetched results and determines which resources to upsert and
+// which to delete.
+func ReconcileResults(old *Resources, new *Resources) (upsert, delete *accessgraphv1alpha.AzureResourceList) {
+ upsert, delete = newResourceList(), newResourceList()
+ reconciledResources := []*reconcilePair{
+ reconcile(old.Principals, new.Principals, azurePrincipalsKey, azurePrincipalsWrap),
+ reconcile(old.RoleAssignments, new.RoleAssignments, azureRoleAssignKey, azureRoleAssignWrap),
+ reconcile(old.RoleDefinitions, new.RoleDefinitions, azureRoleDefKey, azureRoleDefWrap),
+ reconcile(old.VirtualMachines, new.VirtualMachines, azureVmKey, azureVmWrap),
+ }
+ for _, res := range reconciledResources {
+ upsert.Resources = append(upsert.Resources, res.upsert.Resources...)
+ delete.Resources = append(delete.Resources, res.delete.Resources...)
+ }
+ return upsert, delete
+}
+
+// reconcilePair contains the Azure resources to upsert and delete
+type reconcilePair struct {
+ upsert, delete *accessgraphv1alpha.AzureResourceList
+}
+
+// reconcile compares old and new items to build a list of resources to upsert and delete in the Access Graph
+func reconcile[T proto.Message](
+ oldItems []T,
+ newItems []T,
+ keyFn func(T) string,
+ wrapFn func(T) *accessgraphv1alpha.AzureResource,
+) *reconcilePair {
+ // Remove duplicates from the new items
+ newItems = slices.DeduplicateKey(newItems, keyFn)
+ upsertRes := newResourceList()
+ deleteRes := newResourceList()
+
+ // Delete all old items if there are no new items
+ if len(newItems) == 0 {
+ for _, item := range oldItems {
+ deleteRes.Resources = append(deleteRes.Resources, wrapFn(item))
+ }
+ return &reconcilePair{upsertRes, deleteRes}
+ }
+
+ // Create all new items if there are no old items
+ if len(oldItems) == 0 {
+ for _, item := range newItems {
+ upsertRes.Resources = append(upsertRes.Resources, wrapFn(item))
+ }
+ return &reconcilePair{upsertRes, deleteRes}
+ }
+
+ // Map old and new items by their key
+ oldMap := make(map[string]T, len(oldItems))
+ for _, item := range oldItems {
+ oldMap[keyFn(item)] = item
+ }
+ newMap := make(map[string]T, len(newItems))
+ for _, item := range newItems {
+ newMap[keyFn(item)] = item
+ }
+
+ // Append new or modified items to the upsert list
+ for _, item := range newItems {
+ if oldItem, ok := oldMap[keyFn(item)]; !ok || !proto.Equal(oldItem, item) {
+ upsertRes.Resources = append(upsertRes.Resources, wrapFn(item))
+ }
+ }
+
+ // Append removed items to the delete list
+ for _, item := range oldItems {
+ if _, ok := newMap[keyFn(item)]; !ok {
+ deleteRes.Resources = append(deleteRes.Resources, wrapFn(item))
+ }
+ }
+ return &reconcilePair{upsertRes, deleteRes}
+}
+
+func azurePrincipalsKey(user *accessgraphv1alpha.AzurePrincipal) string {
+ return fmt.Sprintf("%s:%s", user.SubscriptionId, user.Id)
+}
+
+func azurePrincipalsWrap(principal *accessgraphv1alpha.AzurePrincipal) *accessgraphv1alpha.AzureResource {
+ return &accessgraphv1alpha.AzureResource{Resource: &accessgraphv1alpha.AzureResource_Principal{Principal: principal}}
+}
+
+func azureRoleAssignKey(roleAssign *accessgraphv1alpha.AzureRoleAssignment) string {
+ return fmt.Sprintf("%s:%s", roleAssign.SubscriptionId, roleAssign.Id)
+}
+
+func azureRoleAssignWrap(roleAssign *accessgraphv1alpha.AzureRoleAssignment) *accessgraphv1alpha.AzureResource {
+ return &accessgraphv1alpha.AzureResource{Resource: &accessgraphv1alpha.AzureResource_RoleAssignment{RoleAssignment: roleAssign}}
+}
+
+func azureRoleDefKey(roleDef *accessgraphv1alpha.AzureRoleDefinition) string {
+ return fmt.Sprintf("%s:%s", roleDef.SubscriptionId, roleDef.Id)
+}
+
+func azureRoleDefWrap(roleDef *accessgraphv1alpha.AzureRoleDefinition) *accessgraphv1alpha.AzureResource {
+ return &accessgraphv1alpha.AzureResource{Resource: &accessgraphv1alpha.AzureResource_RoleDefinition{RoleDefinition: roleDef}}
+}
+
+func azureVmKey(vm *accessgraphv1alpha.AzureVirtualMachine) string {
+ return fmt.Sprintf("%s:%s", vm.SubscriptionId, vm.Id)
+}
+
+func azureVmWrap(vm *accessgraphv1alpha.AzureVirtualMachine) *accessgraphv1alpha.AzureResource {
+ return &accessgraphv1alpha.AzureResource{Resource: &accessgraphv1alpha.AzureResource_VirtualMachine{VirtualMachine: vm}}
+}
diff --git a/lib/srv/discovery/fetchers/azuresync/reconcile_test.go b/lib/srv/discovery/fetchers/azuresync/reconcile_test.go
new file mode 100644
index 0000000000000..3652c4963218c
--- /dev/null
+++ b/lib/srv/discovery/fetchers/azuresync/reconcile_test.go
@@ -0,0 +1,197 @@
+/*
+ * Teleport
+ * Copyright (C) 2025 Gravitational, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+package azuresync
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/require"
+
+ accessgraphv1alpha "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha"
+)
+
+func TestReconcileResults(t *testing.T) {
+ principals := generatePrincipals()
+ roleDefs := generateRoleDefs()
+ roleAssigns := generateRoleAssigns()
+ vms := generateVms()
+
+ tests := []struct {
+ name string
+ oldResults *Resources
+ newResults *Resources
+ expectedUpserts *accessgraphv1alpha.AzureResourceList
+ expectedDeletes *accessgraphv1alpha.AzureResourceList
+ }{
+ // Overlapping old and new results
+ {
+ name: "OverlapOldAndNewResults",
+ oldResults: &Resources{
+ Principals: principals[0:2],
+ RoleDefinitions: roleDefs[0:2],
+ RoleAssignments: roleAssigns[0:2],
+ VirtualMachines: vms[0:2],
+ },
+ newResults: &Resources{
+ Principals: principals[1:3],
+ RoleDefinitions: roleDefs[1:3],
+ RoleAssignments: roleAssigns[1:3],
+ VirtualMachines: vms[1:3],
+ },
+ expectedUpserts: generateExpected(principals[2:3], roleDefs[2:3], roleAssigns[2:3], vms[2:3]),
+ expectedDeletes: generateExpected(principals[0:1], roleDefs[0:1], roleAssigns[0:1], vms[0:1]),
+ },
+ // Completely new results
+ {
+ name: "CompletelyNewResults",
+ oldResults: &Resources{
+ Principals: nil,
+ RoleDefinitions: nil,
+ RoleAssignments: nil,
+ VirtualMachines: nil,
+ },
+ newResults: &Resources{
+ Principals: principals[1:3],
+ RoleDefinitions: roleDefs[1:3],
+ RoleAssignments: roleAssigns[1:3],
+ VirtualMachines: vms[1:3],
+ },
+ expectedUpserts: generateExpected(principals[1:3], roleDefs[1:3], roleAssigns[1:3], vms[1:3]),
+ expectedDeletes: generateExpected(nil, nil, nil, nil),
+ },
+ // No new results
+ {
+ name: "NoNewResults",
+ oldResults: &Resources{
+ Principals: principals[1:3],
+ RoleDefinitions: roleDefs[1:3],
+ RoleAssignments: roleAssigns[1:3],
+ VirtualMachines: vms[1:3],
+ },
+ newResults: &Resources{
+ Principals: nil,
+ RoleDefinitions: nil,
+ RoleAssignments: nil,
+ VirtualMachines: nil,
+ },
+ expectedUpserts: generateExpected(nil, nil, nil, nil),
+ expectedDeletes: generateExpected(principals[1:3], roleDefs[1:3], roleAssigns[1:3], vms[1:3]),
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ upserts, deletes := ReconcileResults(tt.oldResults, tt.newResults)
+ require.ElementsMatch(t, upserts.Resources, tt.expectedUpserts.Resources)
+ require.ElementsMatch(t, deletes.Resources, tt.expectedDeletes.Resources)
+ })
+ }
+
+}
+
+func generateExpected(
+ principals []*accessgraphv1alpha.AzurePrincipal,
+ roleDefs []*accessgraphv1alpha.AzureRoleDefinition,
+ roleAssigns []*accessgraphv1alpha.AzureRoleAssignment,
+ vms []*accessgraphv1alpha.AzureVirtualMachine,
+) *accessgraphv1alpha.AzureResourceList {
+ resList := &accessgraphv1alpha.AzureResourceList{
+ Resources: make([]*accessgraphv1alpha.AzureResource, 0),
+ }
+ for _, principal := range principals {
+ resList.Resources = append(resList.Resources, azurePrincipalsWrap(principal))
+ }
+ for _, roleDef := range roleDefs {
+ resList.Resources = append(resList.Resources, azureRoleDefWrap(roleDef))
+ }
+ for _, roleAssign := range roleAssigns {
+ resList.Resources = append(resList.Resources, azureRoleAssignWrap(roleAssign))
+ }
+ for _, vm := range vms {
+ resList.Resources = append(resList.Resources, azureVmWrap(vm))
+ }
+ return resList
+}
+
+func generatePrincipals() []*accessgraphv1alpha.AzurePrincipal {
+ return []*accessgraphv1alpha.AzurePrincipal{
+ {
+ Id: "/principals/foo",
+ DisplayName: "userFoo",
+ },
+ {
+ Id: "/principals/bar",
+ DisplayName: "userBar",
+ },
+ {
+ Id: "/principals/charles",
+ DisplayName: "userCharles",
+ },
+ }
+}
+
+func generateRoleDefs() []*accessgraphv1alpha.AzureRoleDefinition {
+ return []*accessgraphv1alpha.AzureRoleDefinition{
+ {
+ Id: "/roledefinitions/foo",
+ Name: "roleFoo",
+ },
+ {
+ Id: "/roledefinitions/bar",
+ Name: "roleBar",
+ },
+ {
+ Id: "/roledefinitions/charles",
+ Name: "roleCharles",
+ },
+ }
+}
+
+func generateRoleAssigns() []*accessgraphv1alpha.AzureRoleAssignment {
+ return []*accessgraphv1alpha.AzureRoleAssignment{
+ {
+ Id: "/roleassignments/foo",
+ PrincipalId: "userFoo",
+ },
+ {
+ Id: "/roleassignments/bar",
+ PrincipalId: "userBar",
+ },
+ {
+ Id: "/roleassignments/charles",
+ PrincipalId: "userCharles",
+ },
+ }
+}
+
+func generateVms() []*accessgraphv1alpha.AzureVirtualMachine {
+ return []*accessgraphv1alpha.AzureVirtualMachine{
+ {
+ Id: "/vms/foo",
+ Name: "userFoo",
+ },
+ {
+ Id: "/vms/bar",
+ Name: "userBar",
+ },
+ {
+ Id: "/vms/charles",
+ Name: "userCharles",
+ },
+ }
+}
diff --git a/lib/srv/discovery/fetchers/azuresync/roleassignments.go b/lib/srv/discovery/fetchers/azuresync/roleassignments.go
new file mode 100644
index 0000000000000..a97fe69727ef8
--- /dev/null
+++ b/lib/srv/discovery/fetchers/azuresync/roleassignments.go
@@ -0,0 +1,68 @@
+/*
+ * Teleport
+ * Copyright (C) 2024 Gravitational, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package azuresync
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2"
+ "github.com/gravitational/trace"
+ "google.golang.org/protobuf/types/known/timestamppb"
+
+ accessgraphv1alpha "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha"
+)
+
+// RoleAssignmentsClient specifies the methods used to fetch role assignments from Azure
+type RoleAssignmentsClient interface {
+ ListRoleAssignments(ctx context.Context, scope string) ([]*armauthorization.RoleAssignment, error)
+}
+
+// fetchRoleAssignments fetches Azure role assignments using the Azure role assignments API
+func fetchRoleAssignments(ctx context.Context, subscriptionID string, cli RoleAssignmentsClient) ([]*accessgraphv1alpha.AzureRoleAssignment, error) { //nolint:unused // invoked in a dependent PR
+ // List the role definitions
+ roleAssigns, err := cli.ListRoleAssignments(ctx, fmt.Sprintf("/subscriptions/%s", subscriptionID))
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+
+ // Convert to protobuf format
+ pbRoleAssigns := make([]*accessgraphv1alpha.AzureRoleAssignment, 0, len(roleAssigns))
+ var fetchErrs []error
+ for _, roleAssign := range roleAssigns {
+ if roleAssign.ID == nil ||
+ roleAssign.Properties == nil ||
+ roleAssign.Properties.PrincipalID == nil ||
+ roleAssign.Properties.Scope == nil {
+ fetchErrs = append(fetchErrs,
+ trace.BadParameter("nil values on AzureRoleAssignment object: %v", roleAssign))
+ continue
+ }
+ pbRoleAssign := &accessgraphv1alpha.AzureRoleAssignment{
+ Id: *roleAssign.ID,
+ SubscriptionId: subscriptionID,
+ LastSyncTime: timestamppb.Now(),
+ PrincipalId: *roleAssign.Properties.PrincipalID,
+ RoleDefinitionId: *roleAssign.Properties.RoleDefinitionID,
+ Scope: *roleAssign.Properties.Scope,
+ }
+ pbRoleAssigns = append(pbRoleAssigns, pbRoleAssign)
+ }
+ return pbRoleAssigns, trace.NewAggregate(fetchErrs...)
+}
diff --git a/lib/srv/discovery/fetchers/azuresync/roledefinitions.go b/lib/srv/discovery/fetchers/azuresync/roledefinitions.go
new file mode 100644
index 0000000000000..485117f898b81
--- /dev/null
+++ b/lib/srv/discovery/fetchers/azuresync/roledefinitions.go
@@ -0,0 +1,78 @@
+/*
+ * Teleport
+ * Copyright (C) 2024 Gravitational, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package azuresync
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2"
+ "github.com/gravitational/trace"
+ "google.golang.org/protobuf/types/known/timestamppb"
+
+ accessgraphv1alpha "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha"
+ "github.com/gravitational/teleport/lib/utils/slices"
+)
+
+// RoleDefinitionsClient specifies the methods used to fetch roles from Azure
+type RoleDefinitionsClient interface {
+ ListRoleDefinitions(ctx context.Context, scope string) ([]*armauthorization.RoleDefinition, error)
+}
+
+func fetchRoleDefinitions(ctx context.Context, subscriptionID string, cli RoleDefinitionsClient) ([]*accessgraphv1alpha.AzureRoleDefinition, error) { //nolint:unused // used in a dependent PR
+ // List the role definitions
+ roleDefs, err := cli.ListRoleDefinitions(ctx, fmt.Sprintf("/subscriptions/%s", subscriptionID))
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+
+ // Convert to protobuf format
+ pbRoleDefs := make([]*accessgraphv1alpha.AzureRoleDefinition, 0, len(roleDefs))
+ var fetchErrs []error
+ for _, roleDef := range roleDefs {
+ if roleDef.ID == nil ||
+ roleDef.Properties == nil ||
+ roleDef.Properties.Permissions == nil ||
+ roleDef.Properties.RoleName == nil {
+ fetchErrs = append(fetchErrs, trace.BadParameter("nil values on AzureRoleDefinition object: %v", roleDef))
+ continue
+ }
+ pbPerms := make([]*accessgraphv1alpha.AzureRBACPermission, 0, len(roleDef.Properties.Permissions))
+ for _, perm := range roleDef.Properties.Permissions {
+ if perm.Actions == nil && perm.NotActions == nil {
+ fetchErrs = append(fetchErrs, trace.BadParameter("nil values on Permission object: %v", perm))
+ continue
+ }
+ pbPerm := accessgraphv1alpha.AzureRBACPermission{
+ Actions: slices.FromPointers(perm.Actions),
+ NotActions: slices.FromPointers(perm.NotActions),
+ }
+ pbPerms = append(pbPerms, &pbPerm)
+ }
+ pbRoleDef := &accessgraphv1alpha.AzureRoleDefinition{
+ Id: *roleDef.ID,
+ Name: *roleDef.Properties.RoleName,
+ SubscriptionId: subscriptionID,
+ LastSyncTime: timestamppb.Now(),
+ Permissions: pbPerms,
+ }
+ pbRoleDefs = append(pbRoleDefs, pbRoleDef)
+ }
+ return pbRoleDefs, trace.NewAggregate(fetchErrs...)
+}
diff --git a/lib/srv/discovery/fetchers/azuresync/virtualmachines.go b/lib/srv/discovery/fetchers/azuresync/virtualmachines.go
new file mode 100644
index 0000000000000..cf0d068db7b0c
--- /dev/null
+++ b/lib/srv/discovery/fetchers/azuresync/virtualmachines.go
@@ -0,0 +1,61 @@
+/*
+ * Teleport
+ * Copyright (C) 2024 Gravitational, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package azuresync
+
+import (
+ "context"
+
+ "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v6"
+ "github.com/gravitational/trace"
+ "google.golang.org/protobuf/types/known/timestamppb"
+
+ accessgraphv1alpha "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha"
+)
+
+const allResourceGroups = "*" //nolint:unused // invoked in a dependent PR
+
+// VirtualMachinesClient specifies the methods used to fetch virtual machines from Azure
+type VirtualMachinesClient interface {
+ ListVirtualMachines(ctx context.Context, resourceGroup string) ([]*armcompute.VirtualMachine, error)
+}
+
+func fetchVirtualMachines(ctx context.Context, subscriptionID string, cli VirtualMachinesClient) ([]*accessgraphv1alpha.AzureVirtualMachine, error) { //nolint:unused // invoked in a dependent PR
+ vms, err := cli.ListVirtualMachines(ctx, allResourceGroups)
+ if err != nil {
+ return nil, trace.Wrap(err)
+ }
+
+ // Return the VMs as protobuf messages
+ pbVms := make([]*accessgraphv1alpha.AzureVirtualMachine, 0, len(vms))
+ var fetchErrs []error
+ for _, vm := range vms {
+ if vm.ID == nil || vm.Name == nil {
+ fetchErrs = append(fetchErrs, trace.BadParameter("nil values on AzureVirtualMachine object: %v", vm))
+ continue
+ }
+ pbVm := accessgraphv1alpha.AzureVirtualMachine{
+ Id: *vm.ID,
+ SubscriptionId: subscriptionID,
+ LastSyncTime: timestamppb.Now(),
+ Name: *vm.Name,
+ }
+ pbVms = append(pbVms, &pbVm)
+ }
+ return pbVms, trace.NewAggregate(fetchErrs...)
+}
diff --git a/lib/utils/slices/slices.go b/lib/utils/slices/slices.go
index d0ce95010748f..077911c8738cf 100644
--- a/lib/utils/slices/slices.go
+++ b/lib/utils/slices/slices.go
@@ -35,3 +35,39 @@ func FilterMapUnique[T any, S comparable](ts []T, fn func(T) (s S, include bool)
return ss
}
+
+// ToPointers converts a slice of values to a slice of pointers to those values
+func ToPointers[T any](in []T) []*T {
+ out := make([]*T, len(in))
+ for i := range in {
+ out[i] = &in[i]
+ }
+ return out
+}
+
+// FromPointers converts a slice of pointers to values to a slice of values.
+// Nil pointers are converted to zero-values.
+func FromPointers[T any](in []*T) []T {
+ out := make([]T, len(in))
+ for i := range in {
+ if in[i] == nil {
+ continue
+ }
+ out[i] = *in[i]
+ }
+ return out
+}
+
+// DeduplicateKey returns a deduplicated slice by comparing key values from the key function
+func DeduplicateKey[T any](s []T, key func(T) string) []T {
+ out := make([]T, 0, len(s))
+ seen := make(map[string]struct{})
+ for _, v := range s {
+ if _, ok := seen[key(v)]; ok {
+ continue
+ }
+ seen[key(v)] = struct{}{}
+ out = append(out, v)
+ }
+ return out
+}
diff --git a/lib/utils/slices/slices_test.go b/lib/utils/slices/slices_test.go
index 1f031d21eca49..b0fe86a1bfd2e 100644
--- a/lib/utils/slices/slices_test.go
+++ b/lib/utils/slices/slices_test.go
@@ -19,6 +19,7 @@
package slices
import (
+ "fmt"
"strings"
"testing"
@@ -92,3 +93,92 @@ func TestFilterMapUnique(t *testing.T) {
require.Equal(t, expected, got)
})
}
+
+// TestDuplicateKey tests slice deduplication via key function
+func TestDeduplicateKey(t *testing.T) {
+ t.Parallel()
+
+ stringTests := []struct {
+ name string
+ slice []string
+ keyFn func(string) string
+ expected []string
+ }{
+ {
+ name: "EmptyStringSlice",
+ slice: []string{},
+ keyFn: func(s string) string { return s },
+ expected: []string{},
+ },
+ {
+ name: "NoStringDuplicates",
+ slice: []string{"foo", "bar", "baz"},
+ keyFn: func(s string) string { return s },
+ expected: []string{"foo", "bar", "baz"},
+ },
+ {
+ name: "StringDuplicates",
+ slice: []string{"foo", "bar", "bar", "bar", "baz", "baz"},
+ keyFn: func(s string) string { return s },
+ expected: []string{"foo", "bar", "baz"},
+ },
+ {
+ name: "StringDuplicatesWeirdKeyFn",
+ slice: []string{"foo", "bar", "bar", "bar", "baz", "baz"},
+ keyFn: func(s string) string { return "huh" },
+ expected: []string{"foo"},
+ },
+ }
+ for _, tt := range stringTests {
+ t.Run(tt.name, func(t *testing.T) {
+ res := DeduplicateKey(tt.slice, tt.keyFn)
+ require.Equal(t, tt.expected, res)
+ })
+ }
+
+ type dedupeStruct struct {
+ a string
+ b int
+ c bool
+ }
+ dedupeStructKeyFn := func(d dedupeStruct) string { return fmt.Sprintf("%s:%d:%v", d.a, d.b, d.c) }
+ structTests := []struct {
+ name string
+ slice []dedupeStruct
+ keyFn func(d dedupeStruct) string
+ expected []dedupeStruct
+ }{
+ {
+ name: "EmptySlice",
+ slice: []dedupeStruct{},
+ keyFn: dedupeStructKeyFn,
+ expected: []dedupeStruct{},
+ },
+ {
+ name: "NoStructDuplicates",
+ slice: []dedupeStruct{
+ {a: "foo", b: 1, c: true},
+ {a: "foo", b: 1, c: false},
+ {a: "foo", b: 2, c: true},
+ {a: "bar", b: 1, c: true},
+ {a: "bar", b: 1, c: false},
+ {a: "bar", b: 2, c: true},
+ },
+ keyFn: dedupeStructKeyFn,
+ expected: []dedupeStruct{
+ {a: "foo", b: 1, c: true},
+ {a: "foo", b: 1, c: false},
+ {a: "foo", b: 2, c: true},
+ {a: "bar", b: 1, c: true},
+ {a: "bar", b: 1, c: false},
+ {a: "bar", b: 2, c: true},
+ },
+ },
+ }
+ for _, tt := range structTests {
+ t.Run(tt.name, func(t *testing.T) {
+ res := DeduplicateKey(tt.slice, tt.keyFn)
+ require.Equal(t, tt.expected, res)
+ })
+ }
+}
diff --git a/proto/accessgraph/v1alpha/azure.proto b/proto/accessgraph/v1alpha/azure.proto
new file mode 100644
index 0000000000000..58bef9b36e97b
--- /dev/null
+++ b/proto/accessgraph/v1alpha/azure.proto
@@ -0,0 +1,140 @@
+/*
+ * Teleport
+ * Copyright (C) 2024 Gravitational, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+syntax = "proto3";
+package accessgraph.v1alpha;
+
+import "google/protobuf/timestamp.proto";
+
+option go_package = "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha;accessgraphv1alpha";
+
+// AzureResourceList is a list of Azure resources
+message AzureResourceList {
+ repeated AzureResource resources = 1;
+}
+
+// AzureResource is a list of Azure resources supported by the access graph.
+message AzureResource {
+ oneof resource {
+ // principal is an Azure principal
+ AzurePrincipal principal = 1;
+ // role_definition is an Azure role definition
+ AzureRoleDefinition role_definition = 2;
+ // role_assignment is an Azure role assignment, which assigns a role definition to a principal
+ AzureRoleAssignment role_assignment = 3;
+ // virtual_machine is an Azure virtual machine, an instance of a compute resource
+ AzureVirtualMachine virtual_machine = 4;
+ }
+}
+
+// AzureVirtualMachine is an Azure virtual machine
+message AzureVirtualMachine {
+ // id is the ID of the virtual machine
+ string id = 1;
+ // subscription_id is the ID of the subscription to which the virtual machine belongs
+ string subscription_id = 2;
+ // last_sync_time is when the virtual machine was last fetched from Azure
+ google.protobuf.Timestamp last_sync_time = 3;
+ // name is the given name of the virtual machine
+ string name = 4;
+ // resource_group is the name of the resource group to which the virtual machine belongs
+ string resource_group = 5;
+ // tags are a collection of arbitrary key-values applied to the virtual machine
+ map tags = 6;
+ // location is the geographical location of the Virtual Machine
+ string location = 7;
+}
+
+// AzureIdentity is a Graph API object identity
+message AzureIdentity {
+ // sign_in_type is the type of identity used when signing in, e.g. "emailAddress" or "userName"
+ string sign_in_type = 1;
+ // issuer is the issuer of the identity, such as a domain name like "goteleport.com"
+ string issuer = 2;
+ // issuer_assigned_id unique identifier assigned to the user by the issuer
+ string issuer_assigned_id = 3;
+}
+
+// AzurePrincipal is a Graph API principal (user, group, service principal)
+message AzurePrincipal {
+ // id is the ID of the principal
+ string id = 1;
+ // subscription_id is the ID of the subscription to which the principal belongs
+ string subscription_id = 2;
+ // last_sync_time is when the principal was last fetched from Azure
+ google.protobuf.Timestamp last_sync_time = 3;
+ // display_name is the given name for the principal, e.g. a user's first+last name
+ string display_name = 4;
+ // member_of lists the groups and directories the principal is assigned to
+ repeated string member_of = 5;
+ // identities lists the identities that can be used to sign in to the account
+ repeated AzureIdentity identities = 6;
+ // object_type defines the type of principal, e.g. "user" or "group"
+ string object_type = 7;
+}
+
+// AzureRoleAssignment links an Azure principal to a role definition with a scope
+message AzureRoleAssignment {
+ // id is the ID of the role assignment
+ string id = 1;
+ // subscription_id is the ID of the subscription to which the role assignment belongs
+ string subscription_id = 2;
+ // last_sync_time is when the role assignment was last fetched from Azure
+ google.protobuf.Timestamp last_sync_time = 3;
+ // principal_id is the ID of the principal being assigned a role
+ string principal_id = 4;
+ // role_definition_id is the ID of the role definition assigned to the principal
+ string role_definition_id = 5;
+ // scope constrains which resources the assignment applies to
+ string scope = 6;
+ // condition further which resources the assignment applies to
+ string condition = 7;
+}
+
+// AzureRoleDefinition defines a role by its permissions
+message AzureRoleDefinition {
+ // id is the ID of the role definition
+ string id = 1;
+ // subscription_id is the ID of the subscription to which the role definition belongs
+ string subscription_id = 2;
+ // last_sync_time is when the role definition was last fetched from Azure
+ google.protobuf.Timestamp last_sync_time = 3;
+ // name is the given name for the role definition
+ string name = 4;
+ // description provides additional detail about the role definition
+ string description = 5;
+ // assignable_scopes limits the scopes defined in corresponding role assignments
+ repeated string assignable_scopes = 6;
+ // permissions define the actions and not (disallowed) actions
+ repeated AzureRBACPermission permissions = 7;
+ // role_name is the given name for the role itself
+ string role_name = 8;
+ // type defines the type of role
+ string type = 9;
+}
+
+// AzureRBACPermission defines the actions and not (disallowed) actions for a role definition
+message AzureRBACPermission {
+ // actions define the resources and verbs allowed on the resources
+ repeated string actions = 1;
+ // not_actions define the resources and verbs disallowed on the resources
+ repeated string not_actions = 2;
+ // data_actions define fine-grained resources and verbs allowed within the resource
+ repeated string data_actions = 3;
+ // not_data_actions define fine-grained resources and verbs disallowed within the resource
+ repeated string not_data_actions = 4;
+}