Repository: open-telemetry/opamp-go
Pull request #43 (2021-12-13 17:42:32)

Generalize Agent description
This removes agent type and version fields and replaces them with generic identifying and non-identifying attributes. This will allow OpAMP to be used with other kinds of agents (e.g. Otel SDKs).

See spec issue https://github.com/open-telemetry/opamp-spec/issues/16

Implements spec PR changes https://github.com/open-telemetry/opamp-spec/pull/48

This change makes OpAMP more flexible, yet linecount/complexity of the code is almost the same (at least for the functionality that exists so far).

@open-telemetry/opamp-spec-approvers @open-telemetry/opamp-go-approvers please review/comment on the draft. If this looks reasonable I will submit a spec change and will finalize this PR.




Patch:
diff --git a/client/client.go b/client/client.go
index e06a0f0..7851767 100644
--- a/client/client.go
+++ b/client/client.go
@@ -3,7 +3,6 @@ package client
 import (
 	"context"
 	"crypto/tls"
-	"time"
 
 	"github.com/open-telemetry/opamp-go/client/types"
 	"github.com/open-telemetry/opamp-go/protobufs"
@@ -16,10 +15,11 @@ type StartSettings struct {
 	TLSConfig           *tls.Config
 
 	// Agent information.
-	InstanceUid  string
-	AgentType    string
-	AgentVersion string
-	StartTime    time.Time
+	InstanceUid string
+
+	// AgentDescription MUST be set and MUST describe the Agent. See OpAMP spec
+	// for details.
+	AgentDescription *protobufs.AgentDescription
 
 	// Callbacks that the client will call after Start() returns nil.
 	Callbacks types.Callbacks
@@ -51,8 +51,7 @@ type OpAMPClient interface {
 	// the connection is lost. All failed connection attempts will be reported via
 	// OnConnectFailed callback.
 	//
-	// AgentType and AgentVersion will be included in all status reports sent to server.
-	// If the type or the version have changed, Shutdown and Start the client again.
+	// AgentDescription in settings MUST be set.
 	//
 	// Start may immediately return an error if the settings are incorrect (e.g. the
 	// serverURL is not a valid URL).
@@ -80,13 +79,12 @@ type OpAMPClient interface {
 	// Once stopped OpAMPClient cannot be started again.
 	Stop(ctx context.Context) error
 
-	// SetAgentAttributes sets attributes of the Agent. The attributes will be included
+	// SetAgentDescription sets attributes of the Agent. The attributes will be included
 	// in the next status report sent to the server.
-	// MAY be called before Start(), in which case the attributes will be
-	// included in the first start report after  connection is established.
-	// MAY also be called after Start(), in which case the attributes will be included
+	// MUST NOT be called before Start().
+	// MAY be called after Start(), in which case the attributes will be included
 	// in the next outgoing status report.
-	SetAgentAttributes(attrs map[string]*protobufs.AnyValue) error
+	SetAgentDescription(descr *protobufs.AgentDescription) error
 
 	// SetEffectiveConfig sets the effective config of the Agent. The config will be
 	// included in the next status report sent to the server. The behavior regarding
diff --git a/client/clientimpl.go b/client/clientimpl.go
index 360e06f..f18a665 100644
--- a/client/clientimpl.go
+++ b/client/clientimpl.go
@@ -20,8 +20,9 @@ import (
 )
 
 var (
-	errAlreadyStarted       = errors.New("already started")
-	errCannotStopNotStarted = errors.New("cannot stop because not started")
+	errAlreadyStarted          = errors.New("already started")
+	errCannotStopNotStarted    = errors.New("cannot stop because not started")
+	errAgentDescriptionMissing = errors.New("AgentDescription is not set")
 )
 
 // client is a Client implementation.
@@ -79,6 +80,10 @@ func (w *client) Start(settings StartSettings) error {
 		return errAlreadyStarted
 	}
 
+	if settings.AgentDescription == nil {
+		return errAgentDescriptionMissing
+	}
+
 	w.settings = settings
 
 	var err error
@@ -104,11 +109,7 @@ func (w *client) Start(settings StartSettings) error {
 	// Prepare the first status report.
 	w.sender.UpdateNextStatus(
 		func(statusReport *protobufs.StatusReport) {
-			if statusReport.AgentDescription == nil {
-				statusReport.AgentDescription = &protobufs.AgentDescription{}
-			}
-			statusReport.AgentDescription.AgentType = w.settings.AgentType
-			statusReport.AgentDescription.AgentVersion = w.settings.AgentVersion
+			statusReport.AgentDescription = w.settings.AgentDescription
 		},
 	)
 
@@ -162,23 +163,13 @@ func (w *client) Stop(ctx context.Context) error {
 	return nil
 }
 
-func (w *client) SetAgentAttributes(attrs map[string]*protobufs.AnyValue) error {
-	var attrsSlice []*protobufs.KeyValue
-	for k, v := range attrs {
-		attrsSlice = append(attrsSlice, &protobufs.KeyValue{
-			Key:   k,
-			Value: v,
-		})
+func (w *client) SetAgentDescription(descr *protobufs.AgentDescription) error {
+	if descr == nil {
+		return errAgentDescriptionMissing
 	}
 
 	w.sender.UpdateNextStatus(func(statusReport *protobufs.StatusReport) {
-		if statusReport.AgentDescription == nil {
-			statusReport.AgentDescription = &protobufs.AgentDescription{
-				AgentType:       w.settings.AgentType,
-				AgentVersion:    w.settings.AgentVersion,
-				AgentAttributes: attrsSlice,
-			}
-		}
+		statusReport.AgentDescription = descr
 	})
 	w.sender.ScheduleSend()
 	return nil
diff --git a/internal/examples/agent/agent/agent.go b/internal/examples/agent/agent/agent.go
index 998f2db..8dbe1b7 100644
--- a/internal/examples/agent/agent/agent.go
+++ b/internal/examples/agent/agent/agent.go
@@ -82,10 +82,9 @@ func (agent *Agent) start() error {
 	agent.opampClient = client.New(agent.logger)
 
 	settings := client.StartSettings{
-		OpAMPServerURL: "ws://127.0.0.1:4320/v1/opamp",
-		InstanceUid:    agent.instanceId.String(),
-		AgentType:      agent.agentType,
-		AgentVersion:   agent.agentVersion,
+		OpAMPServerURL:   "ws://127.0.0.1:4320/v1/opamp",
+		InstanceUid:      agent.instanceId.String(),
+		AgentDescription: agent.agentDescription,
 		Callbacks: client.CallbacksStruct{
 			OnConnectFunc: func() {
 				agent.logger.Debugf("Connected to the server.")
@@ -123,9 +122,21 @@ func (agent *Agent) createAgentIdentity() {
 
 	// Create agent description.
 	agent.agentDescription = &protobufs.AgentDescription{
-		AgentType:    agent.agentType,
-		AgentVersion: agent.agentVersion,
-		AgentAttributes: []*protobufs.KeyValue{
+		IdentifyingAttributes: []*protobufs.KeyValue{
+			{
+				Key: "service.name",
+				Value: &protobufs.AnyValue{
+					Value: &protobufs.AnyValue_StringValue{StringValue: agent.agentType},
+				},
+			},
+			{
+				Key: "service.version",
+				Value: &protobufs.AnyValue{
+					Value: &protobufs.AnyValue_StringValue{StringValue: agent.agentVersion},
+				},
+			},
+		},
+		NonIdentifyingAttributes: []*protobufs.KeyValue{
 			{
 				Key: "os.family",
 				Value: &protobufs.AnyValue{
diff --git a/internal/examples/server/data/agents.go b/internal/examples/server/data/agents.go
index 978ac3c..5947104 100644
--- a/internal/examples/server/data/agents.go
+++ b/internal/examples/server/data/agents.go
@@ -44,14 +44,16 @@ func isEqualAgentDescr(d1, d2 *protobufs.AgentDescription) bool {
 	if d1 == nil || d2 == nil {
 		return false
 	}
-	if d1.AgentType != d2.AgentType || d1.AgentVersion != d2.AgentVersion {
-		return false
-	}
-	if len(d1.AgentAttributes) != len(d2.AgentAttributes) {
+	return isEqualAttrs(d1.IdentifyingAttributes, d2.IdentifyingAttributes) &&
+		isEqualAttrs(d1.NonIdentifyingAttributes, d2.NonIdentifyingAttributes)
+}
+
+func isEqualAttrs(attrs1, attrs2 []*protobufs.KeyValue) bool {
+	if len(attrs1) != len(attrs2) {
 		return false
 	}
-	for i, a1 := range d1.AgentAttributes {
-		a2 := d2.AgentAttributes[i]
+	for i, a1 := range attrs1 {
+		a2 := attrs2[i]
 		if !protobufshelpers.IsEqualKeyValue(a1, a2) {
 			return false
 		}
diff --git a/internal/examples/server/uisrv/html/agent.html b/internal/examples/server/uisrv/html/agent.html
index 6ff3e27..2ef0c4e 100644
--- a/internal/examples/server/uisrv/html/agent.html
+++ b/internal/examples/server/uisrv/html/agent.html
@@ -23,21 +23,20 @@
                 <tr>
                     <td>Instance ID:</td><td>{{ .InstanceId }}</td>
                 <tr>
-                </tr>
-                    <td>Type:</td><td>{{ .Status.AgentDescription.AgentType }}</td>
-                <tr>
-                </tr>
-                    <td>Version:</td><td>{{ .Status.AgentDescription.AgentVersion }}</td>
-                </tr>
             </table>
         </td>
         <td valign="top">
             <h3>Attributes</h3>
             <table border="1" style="border-collapse: collapse">
-                {{ range .Status.AgentDescription.AgentAttributes }}
-                    </tr>
-                    <td>{{ .Key }}</td><td>{{ .Value }}</td>
-                    </tr>
+                {{ range .Status.AgentDescription.IdentifyingAttributes }}
+                </tr>
+                <td>{{ .Key }}</td><td>{{ .Value }}</td>
+                </tr>
+                {{ end }}
+                {{ range .Status.AgentDescription.NonIdentifyingAttributes }}
+                </tr>
+                <td>{{ .Key }}</td><td>{{ .Value }}</td>
+                </tr>
                 {{ end }}
             </table>
         </td>
diff --git a/internal/proto/opamp.proto b/internal/proto/opamp.proto
index b81517a..ebf8ab2 100644
--- a/internal/proto/opamp.proto
+++ b/internal/proto/opamp.proto
@@ -280,22 +280,20 @@ message ConnectionSettingsOffers {
     // its own metrics, i.e. metrics of the agent process and any custom metrics that
     // describe the agent state.
     //
-    // The Resource in the OTLP metrics SHOULD describe the agent:
-    // - service.instance.id SHOULD be set to Agent's instance uid that is used in
-    //   the OpAMP messages.
-    // - service.name SHOULD be set to Agent's type, matching the value of
-    //   agent_type field in AgentDescription message.
-    // - service.version SHOULD be set to Agent's version, matching the value of
-    //   agent_version field in AgentDescription message.
-    // - any other applicable Resource attributes that describe the agent, such as
-    //   Operating System on which the Agent runs as described here
-    //   https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/os.md
+    // All attributes specified in the identifying_attributes field in AgentDescription
+    // message SHOULD be also specified in the Resource of the reported OTLP metrics.
+    //
+    // Attributes specified in the non_identifying_attributes field in
+    // AgentDescription message may be also specified in the Resource of the reported
+    // OTLP metrics, in which case they SHOULD have exactly the same values.
     //
     // Process metrics MUST follow the conventions for processes:
     // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/semantic_conventions/process-metrics.md
     ConnectionSettings own_metrics = 3;
+
     // Similar to own_metrics, but for traces.
     ConnectionSettings own_traces = 4;
+
     // Similar to own_metrics, but for logs.
     ConnectionSettings own_logs = 5;
 
@@ -410,30 +408,39 @@ message AgentPackageAvailable {
 // Status reporting
 
 message AgentDescription {
-    // Reverse FQDN that uniquely identifies the agent type, e.g. "io.opentelemetry.collector"
-    string agent_type = 1;
-
-    // Version number of the agent build. The server can use this information to
-    // decide if it wants to offer a package of a different version to the agent
-    // via PackageAvailable message.
-    string agent_version = 2;
-
-    // Attributes that describe the agent and the environment it runs in.
+    // Attributes that identify the agent.
     // Keys/values are according to OpenTelemetry semantic conventions, see:
     // https://github.com/open-telemetry/opentelemetry-specification/tree/main/specification/resource/semantic_conventions
     //
+    // For standalone running Agents (such as OpenTelemetry Collector) the following
+    // attributes SHOULD be specified:
+    // - service.name should be set to a reverse FQDN that uniquely identifies the
+    //   agent type, e.g. "io.opentelemetry.collector"
+    // - service.namespace if it is used in the environment where the Agent runs.
+    // - service.version should be set to version number of the Agent build.
+    // - service.instance.id should be set. It may be be set equal to the Agent's
+    //   instance uid (equal to ServerToAgent.instance_uid field) or any other value
+    //   that uniquely identifies the Agent in combination with other attributes.
+    // - any other attributes that are necessary for uniquely identifying the Agent's
+    //   own telemetry.
+    //
+    // The Agent SHOULD also include these attributes in the Resource of its own
+    // telemetry. The combination of identifying attributes SHOULD be sufficient to
+    // uniquely identify the Agent's own telemetry in the destination system to which
+    // the Agent sends its own telemetry.
+    repeated KeyValue identifying_attributes = 1;
+
+    // Attributes that do not necessarily identify the Agent but help describe
+    // where it runs.
     // The following attributes SHOULD be included:
     // - os.type, os.version - to describe where the agent runs.
-    //
-    // The following attributes are recommended to be included:
     // - host.* to describe the host the agent runs on.
     // - cloud.* to describe the cloud where the host is located.
-    // - other os.* attributes not listed in the previous paragraph.
     // - any other relevant Resource attributes that describe this agent and the
     //   environment it runs in.
-    // - any user-defined attributes that the end user would like to associate with
-    //   this agent.
-    repeated KeyValue agent_attributes = 3;
+    // - any user-defined attributes that the end user would like to associate
+    //   with this agent.
+    repeated KeyValue non_identifying_attributes = 2;
 
     // TODO: add ability to specify related entities (such as the Service the Agent is
     // is responsible/associated with).
diff --git a/protobufs/anyvalue.pb.go b/protobufs/anyvalue.pb.go
index b17e7f2..22b5c16 100644
--- a/protobufs/anyvalue.pb.go
+++ b/protobufs/anyvalue.pb.go
@@ -394,11 +394,10 @@ var file_anyvalue_proto_rawDesc = []byte{
 	0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
 	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72,
 	0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x6e, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61,
-	0x6c, 0x75, 0x65, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
+	0x6c, 0x75, 0x65, 0x42, 0x2e, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f,
 	0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x2d, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79,
-	0x2f, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2d, 0x67, 0x6f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
-	0x61, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0x62, 0x06, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x33,
+	0x2f, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/protobufs/opamp.pb.go b/protobufs/opamp.pb.go
index 3ff19ae..7dd085e 100644
--- a/protobufs/opamp.pb.go
+++ b/protobufs/opamp.pb.go
@@ -1158,16 +1158,12 @@ type ConnectionSettingsOffers struct {
 	// its own metrics, i.e. metrics of the agent process and any custom metrics that
 	// describe the agent state.
 	//
-	// The Resource in the OTLP metrics SHOULD describe the agent:
-	// - service.instance.id SHOULD be set to Agent's instance uid that is used in
-	//   the OpAMP messages.
-	// - service.name SHOULD be set to Agent's type, matching the value of
-	//   agent_type field in AgentDescription message.
-	// - service.version SHOULD be set to Agent's version, matching the value of
-	//   agent_version field in AgentDescription message.
-	// - any other applicable Resource attributes that describe the agent, such as
-	//   Operating System on which the Agent runs as described here
-	//   https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/os.md
+	// All attributes specified in the identifying_attributes field in AgentDescription
+	// message SHOULD be also specified in the Resource of the reported OTLP metrics.
+	//
+	// Attributes specified in the non_identifying_attributes field in
+	// AgentDescription message may be also specified in the Resource of the reported
+	// OTLP metrics, in which case they SHOULD have exactly the same values.
 	//
 	// Process metrics MUST follow the conventions for processes:
 	// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/semantic_conventions/process-metrics.md
@@ -1656,28 +1652,38 @@ type AgentDescription struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	// Reverse FQDN that uniquely identifies the agent type, e.g. "io.opentelemetry.collector"
-	AgentType string `protobuf:"bytes,1,opt,name=agent_type,json=agentType,proto3" json:"agent_type,omitempty"`
-	// Version number of the agent build. The server can use this information to
-	// decide if it wants to offer a package of a different version to the agent
-	// via PackageAvailable message.
-	AgentVersion string `protobuf:"bytes,2,opt,name=agent_version,json=agentVersion,proto3" json:"agent_version,omitempty"`
-	// Attributes that describe the agent and the environment it runs in.
+	// Attributes that identify the agent.
 	// Keys/values are according to OpenTelemetry semantic conventions, see:
 	// https://github.com/open-telemetry/opentelemetry-specification/tree/main/specification/resource/semantic_conventions
 	//
+	// For standalone running Agents (such as OpenTelemetry Collector) the following
+	// attributes SHOULD be specified:
+	// - service.name should be set to a reverse FQDN that uniquely identifies the
+	//   agent type, e.g. "io.opentelemetry.collector"
+	// - service.namespace if it is used in the environment where the Agent runs.
+	// - service.version should be set to version number of the Agent build.
+	// - service.instance.id should be set. It may be be set equal to the Agent's
+	//   instance uid (equal to ServerToAgent.instance_uid field) or any other value
+	//   that uniquely identifies the Agent in combination with other attributes.
+	// - any other attributes that are necessary for uniquely identifying the Agent's
+	//   own telemetry.
+	//
+	// The Agent SHOULD also include these attributes in the Resource of its own
+	// telemetry. The combination of identifying attributes SHOULD be sufficient to
+	// uniquely identify the Agent's own telemetry in the destination system to which
+	// the Agent sends its own telemetry.
+	IdentifyingAttributes []*KeyValue `protobuf:"bytes,1,rep,name=identifying_attributes,json=identifyingAttributes,proto3" json:"identifying_attributes,omitempty"`
+	// Attributes that do not necessarily identify the Agent but help describe
+	// where it runs.
 	// The following attributes SHOULD be included:
 	// - os.type, os.version - to describe where the agent runs.
-	//
-	// The following attributes are recommended to be included:
 	// - host.* to describe the host the agent runs on.
 	// - cloud.* to describe the cloud where the host is located.
-	// - other os.* attributes not listed in the previous paragraph.
 	// - any other relevant Resource attributes that describe this agent and the
 	//   environment it runs in.
-	// - any user-defined attributes that the end user would like to associate with
-	//   this agent.
-	AgentAttributes []*KeyValue `protobuf:"bytes,3,rep,name=agent_attributes,json=agentAttributes,proto3" json:"agent_attributes,omitempty"`
+	// - any user-defined attributes that the end user would like to associate
+	//   with this agent.
+	NonIdentifyingAttributes []*KeyValue `protobuf:"bytes,2,rep,name=non_identifying_attributes,json=nonIdentifyingAttributes,proto3" json:"non_identifying_attributes,omitempty"`
 }
 
 func (x *AgentDescription) Reset() {
@@ -1712,23 +1718,16 @@ func (*AgentDescription) Descriptor() ([]byte, []int) {
 	return file_opamp_proto_rawDescGZIP(), []int{14}
 }
 
-func (x *AgentDescription) GetAgentType() string {
-	if x != nil {
-		return x.AgentType
-	}
-	return ""
-}
-
-func (x *AgentDescription) GetAgentVersion() string {
+func (x *AgentDescription) GetIdentifyingAttributes() []*KeyValue {
 	if x != nil {
-		return x.AgentVersion
+		return x.IdentifyingAttributes
 	}
-	return ""
+	return nil
 }
 
-func (x *AgentDescription) GetAgentAttributes() []*KeyValue {
+func (x *AgentDescription) GetNonIdentifyingAttributes() []*KeyValue {
 	if x != nil {
-		return x.AgentAttributes
+		return x.NonIdentifyingAttributes
 	}
 	return nil
 }
@@ -2565,177 +2564,179 @@ var file_opamp_proto_rawDesc = []byte{
 	0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x04, 0x66, 0x69, 0x6c,
 	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e,
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x61, 0x62,
-	0x6c, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x98, 0x01, 0x0a,
+	0x6c, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x22, 0xb5, 0x01, 0x0a,
 	0x10, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
-	0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65,
-	0x12, 0x23, 0x0a, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
-	0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x56, 0x65,
-	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x10, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x61,
-	0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,
-	0x15, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4b, 0x65,
-	0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x74,
-	0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x22, 0xba, 0x02, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74,
-	0x75, 0x73, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x4a, 0x0a, 0x11, 0x61, 0x67, 0x65, 0x6e,
-	0x74, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
-	0x6f, 0x6e, 0x52, 0x10, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
-	0x74, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x10, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76,
-	0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c,
-	0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x66, 0x66,
-	0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0f, 0x65, 0x66,
-	0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x51, 0x0a,
-	0x14, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70,
-	0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65,
-	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x12, 0x72, 0x65,
-	0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x12, 0x42, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73,
-	0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69,
-	0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69,
-	0x74, 0x69, 0x65, 0x73, 0x22, 0x61, 0x0a, 0x0f, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76,
-	0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x3a, 0x0a, 0x0a, 0x63,
-	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x1b, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x67,
-	0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x61, 0x70, 0x52, 0x09, 0x63, 0x6f,
-	0x6e, 0x66, 0x69, 0x67, 0x4d, 0x61, 0x70, 0x22, 0xe1, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f,
-	0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x35,
-	0x0a, 0x17, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x6f,
-	0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52,
-	0x14, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69,
-	0x67, 0x48, 0x61, 0x73, 0x68, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
-	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d,
-	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72,
-	0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2f, 0x0a, 0x06, 0x53, 0x74,
-	0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x10,
-	0x00, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12,
-	0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x02, 0x22, 0xf9, 0x01, 0x0a, 0x12,
-	0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x65, 0x73, 0x12, 0x43, 0x0a, 0x06, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x65, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52,
-	0x06, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x12, 0x44, 0x0a, 0x1f, 0x73, 0x65, 0x72, 0x76, 0x65,
-	0x72, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x61,
-	0x64, 0x64, 0x6f, 0x6e, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c,
-	0x52, 0x1b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64,
-	0x41, 0x6c, 0x6c, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x48, 0x61, 0x73, 0x68, 0x1a, 0x58, 0x0a,
-	0x0b, 0x41, 0x64, 0x64, 0x6f, 0x6e, 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, 0x33,
-	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e,
-	0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x67, 0x65, 0x6e,
-	0x74, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61,
-	0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x10, 0x41, 0x67, 0x65, 0x6e,
-	0x74, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04,
-	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
-	0x12, 0x24, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x68, 0x61,
-	0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x48,
-	0x61, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
-	0x5f, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20,
-	0x01, 0x28, 0x0c, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x65, 0x72,
-	0x65, 0x64, 0x48, 0x61, 0x73, 0x68, 0x12, 0x3c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x53,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74,
-	0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65,
-	0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72,
-	0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x4e, 0x0a, 0x06, 0x53, 0x74, 0x61,
-	0x74, 0x75, 0x73, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64,
-	0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x50, 0x65, 0x6e,
-	0x64, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c,
-	0x6c, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c,
-	0x6c, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x03, 0x22, 0xb4, 0x02, 0x0a, 0x12, 0x41, 0x67,
-	0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x66, 0x65, 0x72,
-	0x65, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, 0x56,
-	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
-	0x5f, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x0c, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x65, 0x72,
-	0x65, 0x64, 0x48, 0x61, 0x73, 0x68, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c,
-	0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06,
-	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f,
-	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65,
-	0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x53, 0x0a, 0x06, 0x53,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c,
-	0x65, 0x64, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x69,
-	0x6e, 0x67, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x46,
-	0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x49, 0x6e, 0x73, 0x74, 0x61,
-	0x6c, 0x6c, 0x4e, 0x6f, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03,
-	0x22, 0x69, 0x0a, 0x11, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43,
-	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x33, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d,
-	0x61, 0x70, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f,
-	0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52,
-	0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x73, 0x68, 0x22, 0xb7, 0x01, 0x0a, 0x0e,
-	0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x61, 0x70, 0x12, 0x49,
-	0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x61, 0x70, 0x2e,
-	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09,
-	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x61, 0x70, 0x1a, 0x5a, 0x0a, 0x0e, 0x43, 0x6f, 0x6e,
-	0x66, 0x69, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,
-	0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x32, 0x0a,
-	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f,
+	0x6e, 0x12, 0x4c, 0x0a, 0x16, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67,
+	0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
+	0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69,
+	0x66, 0x79, 0x69, 0x6e, 0x67, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12,
+	0x53, 0x0a, 0x1a, 0x6e, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x69,
+	0x6e, 0x67, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x18, 0x6e, 0x6f, 0x6e, 0x49,
+	0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62,
+	0x75, 0x74, 0x65, 0x73, 0x22, 0xba, 0x02, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52,
+	0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x4a, 0x0a, 0x11, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x64,
+	0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41,
+	0x67, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52,
+	0x10, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x12, 0x47, 0x0a, 0x10, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x70,
+	0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74,
+	0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0f, 0x65, 0x66, 0x66, 0x65, 0x63,
+	0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x51, 0x0a, 0x14, 0x72, 0x65,
+	0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x12, 0x72, 0x65, 0x6d, 0x6f, 0x74,
+	0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x42, 0x0a,
+	0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74,
+	0x69, 0x65, 0x73, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65,
+	0x73, 0x22, 0x61, 0x0a, 0x0f, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x3a, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f,
 	0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74,
-	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
-	0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x48, 0x0a, 0x0f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f,
-	0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x21, 0x0a, 0x0c,
-	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x2a,
-	0xfd, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69,
-	0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x1b, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x63,
-	0x69, 0x66, 0x69, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62,
-	0x69, 0x6c, 0x69, 0x74, 0x79, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x63, 0x63, 0x65, 0x70,
-	0x74, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x66,
-	0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
-	0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x45, 0x66, 0x66,
-	0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x04, 0x12, 0x10,
-	0x0a, 0x0c, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x10, 0x08,
-	0x12, 0x17, 0x0a, 0x13, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x41, 0x64, 0x64, 0x6f, 0x6e,
-	0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x10, 0x10, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x66, 0x66,
-	0x65, 0x72, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x10,
-	0x20, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e,
-	0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x10, 0x40,
-	0x12, 0x1d, 0x0a, 0x18, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63,
-	0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x10, 0x80, 0x01, 0x2a,
-	0xed, 0x02, 0x0a, 0x11, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c,
-	0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x1a, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x69,
-	0x66, 0x69, 0x65, 0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c,
-	0x69, 0x74, 0x79, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73,
-	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x63, 0x63, 0x65,
-	0x70, 0x74, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10,
-	0x02, 0x12, 0x1a, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x66, 0x66, 0x65,
-	0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x04, 0x12, 0x11, 0x0a,
-	0x0d, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x10, 0x08,
-	0x12, 0x17, 0x0a, 0x13, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x41, 0x64, 0x64, 0x6f, 0x6e,
-	0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x10, 0x10, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x63, 0x63,
-	0x65, 0x70, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65,
-	0x10, 0x20, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x41, 0x67, 0x65,
-	0x6e, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x10,
-	0x40, 0x12, 0x15, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x4f, 0x77, 0x6e, 0x54,
-	0x72, 0x61, 0x63, 0x65, 0x73, 0x10, 0x80, 0x01, 0x12, 0x16, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6f,
-	0x72, 0x74, 0x73, 0x4f, 0x77, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x10, 0x80, 0x02,
-	0x12, 0x13, 0x0a, 0x0e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x4f, 0x77, 0x6e, 0x4c, 0x6f,
-	0x67, 0x73, 0x10, 0x80, 0x04, 0x12, 0x23, 0x0a, 0x1e, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73,
-	0x4f, 0x70, 0x41, 0x4d, 0x50, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53,
-	0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x10, 0x80, 0x08, 0x12, 0x23, 0x0a, 0x1e, 0x41, 0x63,
-	0x63, 0x65, 0x70, 0x74, 0x73, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63,
-	0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x10, 0x80, 0x10, 0x42,
-	0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70,
-	0x65, 0x6e, 0x2d, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2f, 0x6f, 0x70, 0x61,
-	0x6d, 0x70, 0x2d, 0x67, 0x6f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x61, 0x70, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x4d, 0x61, 0x70, 0x22, 0xe1, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x6c,
+	0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x6c, 0x61,
+	0x73, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61,
+	0x73, 0x68, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72,
+	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2f, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x10, 0x00, 0x12, 0x0c,
+	0x0a, 0x08, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06,
+	0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x02, 0x22, 0xf9, 0x01, 0x0a, 0x12, 0x41, 0x67, 0x65,
+	0x6e, 0x74, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12,
+	0x43, 0x0a, 0x06, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x2b, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x67,
+	0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73,
+	0x2e, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x61, 0x64,
+	0x64, 0x6f, 0x6e, 0x73, 0x12, 0x44, 0x0a, 0x1f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70,
+	0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x6f,
+	0x6e, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x1b, 0x73,
+	0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x41, 0x6c, 0x6c,
+	0x41, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x48, 0x61, 0x73, 0x68, 0x1a, 0x58, 0x0a, 0x0b, 0x41, 0x64,
+	0x64, 0x6f, 0x6e, 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, 0x33, 0x0a, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x61,
+	0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x64,
+	0x64, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+	0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x10, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x64,
+	0x64, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a,
+	0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x48,
+	0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6f, 0x66,
+	0x66, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c,
+	0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, 0x48,
+	0x61, 0x73, 0x68, 0x12, 0x3c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x4e, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x12, 0x0d, 0x0a, 0x09, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x10, 0x00, 0x12,
+	0x12, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e,
+	0x67, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6e,
+	0x67, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x46, 0x61,
+	0x69, 0x6c, 0x65, 0x64, 0x10, 0x03, 0x22, 0xb4, 0x02, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x6e, 0x74,
+	0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x34, 0x0a,
+	0x16, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, 0x5f,
+	0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73,
+	0x65, 0x72, 0x76, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, 0x56, 0x65, 0x72, 0x73,
+	0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6f, 0x66,
+	0x66, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c,
+	0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, 0x48,
+	0x61, 0x73, 0x68, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f,
+	0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x53, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x10,
+	0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x10,
+	0x01, 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x46, 0x61, 0x69, 0x6c,
+	0x65, 0x64, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4e,
+	0x6f, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x22, 0x69, 0x0a,
+	0x11, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x12, 0x33, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x61, 0x70, 0x52,
+	0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x73, 0x68, 0x22, 0xb7, 0x01, 0x0a, 0x0e, 0x41, 0x67, 0x65,
+	0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x61, 0x70, 0x12, 0x49, 0x0a, 0x0a, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x2a, 0x2e, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x67,
+	0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x61, 0x70, 0x2e, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x63, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x4d, 0x61, 0x70, 0x1a, 0x5a, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x32, 0x0a, 0x05, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x70, 0x61, 0x6d,
+	0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
+	0x38, 0x01, 0x22, 0x48, 0x0a, 0x0f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x2a, 0xfd, 0x01, 0x0a,
+	0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74,
+	0x69, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x1b, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69,
+	0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69,
+	0x74, 0x79, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x53,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x66, 0x66, 0x65, 0x72,
+	0x73, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x02, 0x12,
+	0x1a, 0x0a, 0x16, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74,
+	0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x4f,
+	0x66, 0x66, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x10, 0x08, 0x12, 0x17, 0x0a,
+	0x13, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x10, 0x10, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73,
+	0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x10, 0x20, 0x12, 0x1d,
+	0x0a, 0x19, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61,
+	0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x10, 0x40, 0x12, 0x1d, 0x0a,
+	0x18, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x10, 0x80, 0x01, 0x2a, 0xed, 0x02, 0x0a,
+	0x11, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69,
+	0x65, 0x73, 0x12, 0x1e, 0x0a, 0x1a, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65,
+	0x64, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,
+	0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x53, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73,
+	0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x02, 0x12, 0x1a,
+	0x0a, 0x16, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69,
+	0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x63,
+	0x63, 0x65, 0x70, 0x74, 0x73, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x10, 0x08, 0x12, 0x17, 0x0a,
+	0x13, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x10, 0x10, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74,
+	0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x10, 0x20, 0x12,
+	0x1d, 0x0a, 0x19, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50,
+	0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x10, 0x40, 0x12, 0x15,
+	0x0a, 0x10, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x4f, 0x77, 0x6e, 0x54, 0x72, 0x61, 0x63,
+	0x65, 0x73, 0x10, 0x80, 0x01, 0x12, 0x16, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73,
+	0x4f, 0x77, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x10, 0x80, 0x02, 0x12, 0x13, 0x0a,
+	0x0e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x4f, 0x77, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x10,
+	0x80, 0x04, 0x12, 0x23, 0x0a, 0x1e, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x4f, 0x70, 0x41,
+	0x4d, 0x50, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74,
+	0x69, 0x6e, 0x67, 0x73, 0x10, 0x80, 0x08, 0x12, 0x23, 0x0a, 0x1e, 0x41, 0x63, 0x63, 0x65, 0x70,
+	0x74, 0x73, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x10, 0x80, 0x10, 0x42, 0x2e, 0x5a, 0x2c,
+	0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x2d,
+	0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2f, 0x6f, 0x70, 0x61, 0x6d, 0x70, 0x2d,
+	0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x73, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -2818,27 +2819,28 @@ var file_opamp_proto_depIdxs = []int32{
 	4,  // 23: opamp.proto.ServerErrorResponse.type:type_name -> opamp.proto.ServerErrorResponse.Type
 	20, // 24: opamp.proto.ServerErrorResponse.retry_info:type_name -> opamp.proto.RetryInfo
 	18, // 25: opamp.proto.AgentPackageAvailable.file:type_name -> opamp.proto.DownloadableFile
-	36, // 26: opamp.proto.AgentDescription.agent_attributes:type_name -> opamp.proto.KeyValue
-	22, // 27: opamp.proto.StatusReport.agent_description:type_name -> opamp.proto.AgentDescription
-	24, // 28: opamp.proto.StatusReport.effective_config:type_name -> opamp.proto.EffectiveConfig
-	25, // 29: opamp.proto.StatusReport.remote_config_status:type_name -> opamp.proto.RemoteConfigStatus
-	1,  // 30: opamp.proto.StatusReport.capabilities:type_name -> opamp.proto.AgentCapabilities
-	30, // 31: opamp.proto.EffectiveConfig.config_map:type_name -> opamp.proto.AgentConfigMap
-	5,  // 32: opamp.proto.RemoteConfigStatus.status:type_name -> opamp.proto.RemoteConfigStatus.Status
-	34, // 33: opamp.proto.AgentAddonStatuses.addons:type_name -> opamp.proto.AgentAddonStatuses.AddonsEntry
-	6,  // 34: opamp.proto.AgentAddonStatus.status:type_name -> opamp.proto.AgentAddonStatus.Status
-	7,  // 35: opamp.proto.AgentInstallStatus.status:type_name -> opamp.proto.AgentInstallStatus.Status
-	30, // 36: opamp.proto.AgentRemoteConfig.config:type_name -> opamp.proto.AgentConfigMap
-	35, // 37: opamp.proto.AgentConfigMap.config_map:type_name -> opamp.proto.AgentConfigMap.ConfigMapEntry
-	11, // 38: opamp.proto.ConnectionSettingsOffers.OtherConnectionsEntry.value:type_name -> opamp.proto.ConnectionSettings
-	17, // 39: opamp.proto.AddonsAvailable.AddonsEntry.value:type_name -> opamp.proto.AddonAvailable
-	27, // 40: opamp.proto.AgentAddonStatuses.AddonsEntry.value:type_name -> opamp.proto.AgentAddonStatus
-	31, // 41: opamp.proto.AgentConfigMap.ConfigMapEntry.value:type_name -> opamp.proto.AgentConfigFile
-	42, // [42:42] is the sub-list for method output_type
-	42, // [42:42] is the sub-list for method input_type
-	42, // [42:42] is the sub-list for extension type_name
-	42, // [42:42] is the sub-list for extension extendee
-	0,  // [0:42] is the sub-list for field type_name
+	36, // 26: opamp.proto.AgentDescription.identifying_attributes:type_name -> opamp.proto.KeyValue
+	36, // 27: opamp.proto.AgentDescription.non_identifying_attributes:type_name -> opamp.proto.KeyValue
+	22, // 28: opamp.proto.StatusReport.agent_description:type_name -> opamp.proto.AgentDescription
+	24, // 29: opamp.proto.StatusReport.effective_config:type_name -> opamp.proto.EffectiveConfig
+	25, // 30: opamp.proto.StatusReport.remote_config_status:type_name -> opamp.proto.RemoteConfigStatus
+	1,  // 31: opamp.proto.StatusReport.capabilities:type_name -> opamp.proto.AgentCapabilities
+	30, // 32: opamp.proto.EffectiveConfig.config_map:type_name -> opamp.proto.AgentConfigMap
+	5,  // 33: opamp.proto.RemoteConfigStatus.status:type_name -> opamp.proto.RemoteConfigStatus.Status
+	34, // 34: opamp.proto.AgentAddonStatuses.addons:type_name -> opamp.proto.AgentAddonStatuses.AddonsEntry
+	6,  // 35: opamp.proto.AgentAddonStatus.status:type_name -> opamp.proto.AgentAddonStatus.Status
+	7,  // 36: opamp.proto.AgentInstallStatus.status:type_name -> opamp.proto.AgentInstallStatus.Status
+	30, // 37: opamp.proto.AgentRemoteConfig.config:type_name -> opamp.proto.AgentConfigMap
+	35, // 38: opamp.proto.AgentConfigMap.config_map:type_name -> opamp.proto.AgentConfigMap.ConfigMapEntry
+	11, // 39: opamp.proto.ConnectionSettingsOffers.OtherConnectionsEntry.value:type_name -> opamp.proto.ConnectionSettings
+	17, // 40: opamp.proto.AddonsAvailable.AddonsEntry.value:type_name -> opamp.proto.AddonAvailable
+	27, // 41: opamp.proto.AgentAddonStatuses.AddonsEntry.value:type_name -> opamp.proto.AgentAddonStatus
+	31, // 42: opamp.proto.AgentConfigMap.ConfigMapEntry.value:type_name -> opamp.proto.AgentConfigFile
+	43, // [43:43] is the sub-list for method output_type
+	43, // [43:43] is the sub-list for method input_type
+	43, // [43:43] is the sub-list for extension type_name
+	43, // [43:43] is the sub-list for extension extendee
+	0,  // [0:43] is the sub-list for field type_name
 }
 
 func init() { file_opamp_proto_init() }


Test patch:
diff --git a/client/clientimpl_test.go b/client/clientimpl_test.go
index 8d81104..04d7558 100644
--- a/client/clientimpl_test.go
+++ b/client/clientimpl_test.go
@@ -49,12 +49,16 @@ func startClient(t *testing.T, settings StartSettings) *client {
 	return client
 }
 
-func TestConnectNoServer(t *testing.T) {
-	settings := StartSettings{
-		OpAMPServerURL: "ws://" + testhelpers.GetAvailableLocalAddress(),
+// Create start settings that point to a non-existing server.
+func createNoServerSettings() StartSettings {
+	return StartSettings{
+		OpAMPServerURL:   "ws://" + testhelpers.GetAvailableLocalAddress(),
+		AgentDescription: &protobufs.AgentDescription{},
 	}
+}
 
-	client := startClient(t, settings)
+func TestConnectNoServer(t *testing.T) {
+	client := startClient(t, createNoServerSettings())
 
 	err := client.Stop(context.Background())
 	assert.NoError(t, err)
@@ -62,12 +66,10 @@ func TestConnectNoServer(t *testing.T) {
 
 func TestOnConnectFail(t *testing.T) {
 	var connectErr atomic.Value
-	settings := StartSettings{
-		OpAMPServerURL: "ws://" + testhelpers.GetAvailableLocalAddress(),
-		Callbacks: CallbacksStruct{
-			OnConnectFailedFunc: func(err error) {
-				connectErr.Store(err)
-			},
+	settings := createNoServerSettings()
+	settings.Callbacks = CallbacksStruct{
+		OnConnectFailedFunc: func(err error) {
+			connectErr.Store(err)
 		},
 	}
 
@@ -80,12 +82,10 @@ func TestOnConnectFail(t *testing.T) {
 }
 
 func TestStartStarted(t *testing.T) {
-	settings := StartSettings{
-		OpAMPServerURL: "ws://" + testhelpers.GetAvailableLocalAddress(),
-	}
-
+	settings := createNoServerSettings()
 	client := startClient(t, settings)
 
+	// Try to start again.
 	err := client.Start(settings)
 	assert.Error(t, err)
 
@@ -100,10 +100,7 @@ func TestStopWithoutStart(t *testing.T) {
 }
 
 func TestStopCancellation(t *testing.T) {
-	settings := StartSettings{
-		OpAMPServerURL: "ws://" + testhelpers.GetAvailableLocalAddress(),
-	}
-	client := startClient(t, settings)
+	client := startClient(t, createNoServerSettings())
 
 	ctx, cancel := context.WithCancel(context.Background())
 	cancel()
@@ -125,6 +122,7 @@ func TestConnectWithServer(t *testing.T) {
 				atomic.StoreInt64(&connected, 1)
 			},
 		},
+		AgentDescription: &protobufs.AgentDescription{},
 	}
 	settings.OpAMPServerURL = "ws://" + srv.Endpoint
 	client := startClient(t, settings)
@@ -165,6 +163,7 @@ func TestConnectWithServer503(t *testing.T) {
 				connectErr.Store(err)
 			},
 		},
+		AgentDescription: &protobufs.AgentDescription{},
 	}
 	settings.OpAMPServerURL = "ws://" + srv.Endpoint
 	client := startClient(t, settings)
@@ -194,6 +193,7 @@ func TestConnectWithHeader(t *testing.T) {
 	settings := StartSettings{
 		OpAMPServerURL:      "ws://" + srv.Endpoint,
 		AuthorizationHeader: "Bearer 12345678",
+		AgentDescription:    &protobufs.AgentDescription{},
 	}
 	client := startClient(t, settings)
 
@@ -225,6 +225,7 @@ func TestDisconnectByServer(t *testing.T) {
 				connectErr.Store(err)
 			},
 		},
+		AgentDescription: &protobufs.AgentDescription{},
 	}
 	settings.OpAMPServerURL = "ws://" + srv.Endpoint
 	client := startClient(t, settings)
@@ -281,6 +282,7 @@ func TestFirstStatusReport(t *testing.T) {
 				}, nil
 			},
 		},
+		AgentDescription: &protobufs.AgentDescription{},
 	}
 	settings.OpAMPServerURL = "ws://" + srv.Endpoint
 	client := startClient(t, settings)
@@ -315,6 +317,7 @@ func TestSetEffectiveConfig(t *testing.T) {
 	// Start a client.
 	settings := StartSettings{}
 	settings.OpAMPServerURL = "ws://" + srv.Endpoint
+	settings.AgentDescription = &protobufs.AgentDescription{}
 	client := prepareClient(settings)
 
 	sendConfig := &protobufs.EffectiveConfig{
@@ -348,17 +351,14 @@ func TestSetEffectiveConfig(t *testing.T) {
 	assert.NoError(t, err)
 }
 
-func isEqualAgentAttrs(set map[string]*protobufs.AnyValue, received []*protobufs.KeyValue) bool {
-	if len(set) != len(received) {
+func isEqualAgentAttrs(sent []*protobufs.KeyValue, received []*protobufs.KeyValue) bool {
+	if len(sent) != len(received) {
 		return false
 	}
 
-	for _, kv := range received {
-		val, exists := set[kv.Key]
-		if !exists {
-			return false
-		}
-		if !protobufshelpers.IsEqualAnyValue(kv.Value, val) {
+	for i, rval := range received {
+		sval := sent[i]
+		if !protobufshelpers.IsEqualKeyValue(rval, sval) {
 			return false
 		}
 	}
@@ -380,36 +380,41 @@ func TestSetAgentAttributes(t *testing.T) {
 	}
 
 	// Start a client.
-	settings := StartSettings{}
-	settings.OpAMPServerURL = "ws://" + srv.Endpoint
+	settings := StartSettings{
+		OpAMPServerURL:   "ws://" + srv.Endpoint,
+		AgentDescription: &protobufs.AgentDescription{},
+	}
 	client := prepareClient(settings)
 
-	sendAttrs := map[string]*protobufs.AnyValue{
-		"host.name": {
-			Value: &protobufs.AnyValue_StringValue{StringValue: "somehost"},
+	settings.AgentDescription = &protobufs.AgentDescription{
+		IdentifyingAttributes: []*protobufs.KeyValue{
+			{
+				Key:   "host.name",
+				Value: &protobufs.AnyValue{Value: &protobufs.AnyValue_StringValue{StringValue: "somehost"}},
+			},
 		},
 	}
 
-	// Set before start. It should be delivered immediately after Start().
-	client.SetAgentAttributes(sendAttrs)
-
 	assert.NoError(t, client.Start(settings))
 
 	// Verify it is delivered.
 	eventually(t, func() bool {
-		agentDescr := rcvAgentDescr.Load().(*protobufs.AgentDescription)
-		if agentDescr == nil {
+		agentDescr, ok := rcvAgentDescr.Load().(*protobufs.AgentDescription)
+		if !ok || agentDescr == nil {
 			return false
 		}
-		return isEqualAgentAttrs(sendAttrs, agentDescr.AgentAttributes)
+		return isEqualAgentAttrs(settings.AgentDescription.IdentifyingAttributes, agentDescr.IdentifyingAttributes)
 	})
 
 	// Now change again.
-	sendAttrs["key2"] = &protobufs.AnyValue{
-		Value: &protobufs.AnyValue_StringValue{StringValue: "somehost"},
+	settings.AgentDescription.NonIdentifyingAttributes = []*protobufs.KeyValue{
+		{
+			Key:   "os.name",
+			Value: &protobufs.AnyValue{Value: &protobufs.AnyValue_StringValue{StringValue: "linux"}},
+		},
 	}
 
-	client.SetAgentAttributes(sendAttrs)
+	client.SetAgentDescription(settings.AgentDescription)
 
 	// Verify change is delivered.
 	eventually(t, func() bool {
@@ -417,7 +422,8 @@ func TestSetAgentAttributes(t *testing.T) {
 		if agentDescr == nil {
 			return false
 		}
-		return isEqualAgentAttrs(sendAttrs, agentDescr.AgentAttributes)
+		return isEqualAgentAttrs(settings.AgentDescription.IdentifyingAttributes, agentDescr.IdentifyingAttributes) &&
+			isEqualAgentAttrs(settings.AgentDescription.NonIdentifyingAttributes, agentDescr.NonIdentifyingAttributes)
 	})
 
 	// Shutdown the server.
@@ -499,6 +505,7 @@ func TestConnectionSettings(t *testing.T) {
 				return nil
 			},
 		},
+		AgentDescription: &protobufs.AgentDescription{},
 	}
 	settings.OpAMPServerURL = "ws://" + srv.Endpoint
 	client := prepareClient(settings)