Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package forgejo-runner for openSUSE:Factory 
checked in at 2026-04-08 17:15:02
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/forgejo-runner (Old)
 and      /work/SRC/openSUSE:Factory/.forgejo-runner.new.21863 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "forgejo-runner"

Wed Apr  8 17:15:02 2026 rev:43 rq:1345023 version:12.8.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/forgejo-runner/forgejo-runner.changes    
2026-03-27 06:39:46.741919992 +0100
+++ /work/SRC/openSUSE:Factory/.forgejo-runner.new.21863/forgejo-runner.changes 
2026-04-08 17:15:13.678681485 +0200
@@ -1,0 +2,17 @@
+Tue Apr  7 13:49:36 UTC 2026 - Richard Rahl <[email protected]>
+
+- Update to version 12.8.1:
+  * fix: use ^{commit} to actually let rev-parse resolve to the commit
+- Update to version 12.8.0:
+  * feat: enable one-job to request a particular job
+  * feat: add options for declaring a connection to daemon, one-job
+  * feat: deprecate register, create-runner-file
+  * feat: allow timezone in on.schedule
+  * feat: remove experimental connect command without replacement
+  * fix: quit in daemon-mode when runner should be ephemeral
+  * fix: precedence of inputs in Docker actions
+  * fix: restore inheritance of env workflow variables
+  * fix: protect against tags & branches that look like pinned SHAs but are not
+  * fix: increase log level of client-side fetch timeout
+
+-------------------------------------------------------------------

Old:
----
  forgejo-runner-12.7.3.obscpio

New:
----
  forgejo-runner-12.8.1.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ forgejo-runner.spec ++++++
--- /var/tmp/diff_new_pack.mkMdav/_old  2026-04-08 17:15:15.610760919 +0200
+++ /var/tmp/diff_new_pack.mkMdav/_new  2026-04-08 17:15:15.622761413 +0200
@@ -18,7 +18,7 @@
 
 %define services %{name}.service
 Name:           forgejo-runner
-Version:        12.7.3
+Version:        12.8.1
 Release:        0
 Summary:        Daemon that connects to a Forgejo instance and runs CI jobs
 License:        GPL-3.0-or-later

++++++ _service ++++++
--- /var/tmp/diff_new_pack.mkMdav/_old  2026-04-08 17:15:15.774767662 +0200
+++ /var/tmp/diff_new_pack.mkMdav/_new  2026-04-08 17:15:15.798768649 +0200
@@ -2,7 +2,7 @@
   <service name="obs_scm" mode="manual">
     <param name="url">https://code.forgejo.org/forgejo/runner</param>
     <param name="scm">git</param>
-    <param name="revision">refs/tags/v12.7.3</param>
+    <param name="revision">refs/tags/v12.8.1</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="changesgenerate">disable</param>
     <param name="versionrewrite-pattern">v(.*)</param>

++++++ forgejo-runner-12.7.3.obscpio -> forgejo-runner-12.8.1.obscpio ++++++
++++ 9472 lines of diff (skipped)

++++++ forgejo-runner.obsinfo ++++++
--- /var/tmp/diff_new_pack.mkMdav/_old  2026-04-08 17:15:18.302871603 +0200
+++ /var/tmp/diff_new_pack.mkMdav/_new  2026-04-08 17:15:18.306871768 +0200
@@ -1,5 +1,5 @@
 name: forgejo-runner
-version: 12.7.3
-mtime: 1774360979
-commit: f89f3e3cdb1c89b51c925c78028752d78c2478c1
+version: 12.8.1
+mtime: 1775496018
+commit: 9eb2ed865c2bef5f5c8a38191bde86b3645442dc
 

++++++ vendor.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/code.forgejo.org/forgejo/actions-proto/runner/v1/messages.pb.go 
new/vendor/code.forgejo.org/forgejo/actions-proto/runner/v1/messages.pb.go
--- old/vendor/code.forgejo.org/forgejo/actions-proto/runner/v1/messages.pb.go  
2026-03-26 09:17:45.000000000 +0100
+++ new/vendor/code.forgejo.org/forgejo/actions-proto/runner/v1/messages.pb.go  
2026-04-07 15:49:09.000000000 +0200
@@ -384,7 +384,7 @@
        sizeCache     protoimpl.SizeCache
        unknownFields protoimpl.UnknownFields
 
-       // Runner use `tasks_version` to compare with Gitea and detemine 
whether new tasks may exist.
+       // Runner use `tasks_version` to compare with Gitea and determine 
whether new tasks may exist.
        TasksVersion int64 
`protobuf:"varint,1,opt,name=tasks_version,json=tasksVersion,proto3" 
json:"tasks_version,omitempty"`
        // If provided and `>1`, then multiple tasks may be returned from 
FetchTask in `additional_tasks`.
        TaskCapacity *int64 
`protobuf:"varint,2,opt,name=task_capacity,json=taskCapacity,proto3,oneof" 
json:"task_capacity,omitempty"`
@@ -503,6 +503,122 @@
        return nil
 }
 
+type FetchSingleTaskRequest struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       // The latest `task_version` received from Forgejo or 0 when none has 
been received so far. Used by Forgejo to
+       // determine whether new tasks are waiting for this runner.
+       TasksVersion int64 
`protobuf:"varint,1,opt,name=tasks_version,json=tasksVersion,proto3" 
json:"tasks_version,omitempty"`
+       // Optionally request a particular attempt by providing its handle. If 
the attempt is not ready to be run or not
+       // suitable for this runner, Forgejo will not return any task.
+       Handle *string `protobuf:"bytes,2,opt,name=handle,proto3,oneof" 
json:"handle,omitempty"`
+}
+
+func (x *FetchSingleTaskRequest) Reset() {
+       *x = FetchSingleTaskRequest{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_runner_v1_messages_proto_msgTypes[6]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *FetchSingleTaskRequest) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FetchSingleTaskRequest) ProtoMessage() {}
+
+func (x *FetchSingleTaskRequest) ProtoReflect() protoreflect.Message {
+       mi := &file_runner_v1_messages_proto_msgTypes[6]
+       if protoimpl.UnsafeEnabled && x != nil {
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               if ms.LoadMessageInfo() == nil {
+                       ms.StoreMessageInfo(mi)
+               }
+               return ms
+       }
+       return mi.MessageOf(x)
+}
+
+// Deprecated: Use FetchSingleTaskRequest.ProtoReflect.Descriptor instead.
+func (*FetchSingleTaskRequest) Descriptor() ([]byte, []int) {
+       return file_runner_v1_messages_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *FetchSingleTaskRequest) GetTasksVersion() int64 {
+       if x != nil {
+               return x.TasksVersion
+       }
+       return 0
+}
+
+func (x *FetchSingleTaskRequest) GetHandle() string {
+       if x != nil && x.Handle != nil {
+               return *x.Handle
+       }
+       return ""
+}
+
+type FetchSingleTaskResponse struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       // The latest `task_version` recorded by Forgejo. To be included in the 
next FetchSingleTaskRequest.
+       TasksVersion int64 
`protobuf:"varint,1,opt,name=tasks_version,json=tasksVersion,proto3" 
json:"tasks_version,omitempty"`
+       // Task returned by Forgejo in response to the original request, if any.
+       Task *Task `protobuf:"bytes,2,opt,name=task,proto3" 
json:"task,omitempty"`
+}
+
+func (x *FetchSingleTaskResponse) Reset() {
+       *x = FetchSingleTaskResponse{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_runner_v1_messages_proto_msgTypes[7]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *FetchSingleTaskResponse) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FetchSingleTaskResponse) ProtoMessage() {}
+
+func (x *FetchSingleTaskResponse) ProtoReflect() protoreflect.Message {
+       mi := &file_runner_v1_messages_proto_msgTypes[7]
+       if protoimpl.UnsafeEnabled && x != nil {
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               if ms.LoadMessageInfo() == nil {
+                       ms.StoreMessageInfo(mi)
+               }
+               return ms
+       }
+       return mi.MessageOf(x)
+}
+
+// Deprecated: Use FetchSingleTaskResponse.ProtoReflect.Descriptor instead.
+func (*FetchSingleTaskResponse) Descriptor() ([]byte, []int) {
+       return file_runner_v1_messages_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *FetchSingleTaskResponse) GetTasksVersion() int64 {
+       if x != nil {
+               return x.TasksVersion
+       }
+       return 0
+}
+
+func (x *FetchSingleTaskResponse) GetTask() *Task {
+       if x != nil {
+               return x.Task
+       }
+       return nil
+}
+
 type UpdateTaskRequest struct {
        state         protoimpl.MessageState
        sizeCache     protoimpl.SizeCache
@@ -515,7 +631,7 @@
 func (x *UpdateTaskRequest) Reset() {
        *x = UpdateTaskRequest{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_runner_v1_messages_proto_msgTypes[6]
+               mi := &file_runner_v1_messages_proto_msgTypes[8]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -528,7 +644,7 @@
 func (*UpdateTaskRequest) ProtoMessage() {}
 
 func (x *UpdateTaskRequest) ProtoReflect() protoreflect.Message {
-       mi := &file_runner_v1_messages_proto_msgTypes[6]
+       mi := &file_runner_v1_messages_proto_msgTypes[8]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -541,7 +657,7 @@
 
 // Deprecated: Use UpdateTaskRequest.ProtoReflect.Descriptor instead.
 func (*UpdateTaskRequest) Descriptor() ([]byte, []int) {
-       return file_runner_v1_messages_proto_rawDescGZIP(), []int{6}
+       return file_runner_v1_messages_proto_rawDescGZIP(), []int{8}
 }
 
 func (x *UpdateTaskRequest) GetState() *TaskState {
@@ -570,7 +686,7 @@
 func (x *UpdateTaskResponse) Reset() {
        *x = UpdateTaskResponse{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_runner_v1_messages_proto_msgTypes[7]
+               mi := &file_runner_v1_messages_proto_msgTypes[9]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -583,7 +699,7 @@
 func (*UpdateTaskResponse) ProtoMessage() {}
 
 func (x *UpdateTaskResponse) ProtoReflect() protoreflect.Message {
-       mi := &file_runner_v1_messages_proto_msgTypes[7]
+       mi := &file_runner_v1_messages_proto_msgTypes[9]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -596,7 +712,7 @@
 
 // Deprecated: Use UpdateTaskResponse.ProtoReflect.Descriptor instead.
 func (*UpdateTaskResponse) Descriptor() ([]byte, []int) {
-       return file_runner_v1_messages_proto_rawDescGZIP(), []int{7}
+       return file_runner_v1_messages_proto_rawDescGZIP(), []int{9}
 }
 
 func (x *UpdateTaskResponse) GetState() *TaskState {
@@ -627,7 +743,7 @@
 func (x *UpdateLogRequest) Reset() {
        *x = UpdateLogRequest{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_runner_v1_messages_proto_msgTypes[8]
+               mi := &file_runner_v1_messages_proto_msgTypes[10]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -640,7 +756,7 @@
 func (*UpdateLogRequest) ProtoMessage() {}
 
 func (x *UpdateLogRequest) ProtoReflect() protoreflect.Message {
-       mi := &file_runner_v1_messages_proto_msgTypes[8]
+       mi := &file_runner_v1_messages_proto_msgTypes[10]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -653,7 +769,7 @@
 
 // Deprecated: Use UpdateLogRequest.ProtoReflect.Descriptor instead.
 func (*UpdateLogRequest) Descriptor() ([]byte, []int) {
-       return file_runner_v1_messages_proto_rawDescGZIP(), []int{8}
+       return file_runner_v1_messages_proto_rawDescGZIP(), []int{10}
 }
 
 func (x *UpdateLogRequest) GetTaskId() int64 {
@@ -695,7 +811,7 @@
 func (x *UpdateLogResponse) Reset() {
        *x = UpdateLogResponse{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_runner_v1_messages_proto_msgTypes[9]
+               mi := &file_runner_v1_messages_proto_msgTypes[11]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -708,7 +824,7 @@
 func (*UpdateLogResponse) ProtoMessage() {}
 
 func (x *UpdateLogResponse) ProtoReflect() protoreflect.Message {
-       mi := &file_runner_v1_messages_proto_msgTypes[9]
+       mi := &file_runner_v1_messages_proto_msgTypes[11]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -721,7 +837,7 @@
 
 // Deprecated: Use UpdateLogResponse.ProtoReflect.Descriptor instead.
 func (*UpdateLogResponse) Descriptor() ([]byte, []int) {
-       return file_runner_v1_messages_proto_rawDescGZIP(), []int{9}
+       return file_runner_v1_messages_proto_rawDescGZIP(), []int{11}
 }
 
 func (x *UpdateLogResponse) GetAckIndex() int64 {
@@ -754,7 +870,7 @@
 func (x *Runner) Reset() {
        *x = Runner{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_runner_v1_messages_proto_msgTypes[10]
+               mi := &file_runner_v1_messages_proto_msgTypes[12]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -767,7 +883,7 @@
 func (*Runner) ProtoMessage() {}
 
 func (x *Runner) ProtoReflect() protoreflect.Message {
-       mi := &file_runner_v1_messages_proto_msgTypes[10]
+       mi := &file_runner_v1_messages_proto_msgTypes[12]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -780,7 +896,7 @@
 
 // Deprecated: Use Runner.ProtoReflect.Descriptor instead.
 func (*Runner) Descriptor() ([]byte, []int) {
-       return file_runner_v1_messages_proto_rawDescGZIP(), []int{10}
+       return file_runner_v1_messages_proto_rawDescGZIP(), []int{12}
 }
 
 func (x *Runner) GetId() int64 {
@@ -874,7 +990,7 @@
 func (x *Task) Reset() {
        *x = Task{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_runner_v1_messages_proto_msgTypes[11]
+               mi := &file_runner_v1_messages_proto_msgTypes[13]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -887,7 +1003,7 @@
 func (*Task) ProtoMessage() {}
 
 func (x *Task) ProtoReflect() protoreflect.Message {
-       mi := &file_runner_v1_messages_proto_msgTypes[11]
+       mi := &file_runner_v1_messages_proto_msgTypes[13]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -900,7 +1016,7 @@
 
 // Deprecated: Use Task.ProtoReflect.Descriptor instead.
 func (*Task) Descriptor() ([]byte, []int) {
-       return file_runner_v1_messages_proto_rawDescGZIP(), []int{11}
+       return file_runner_v1_messages_proto_rawDescGZIP(), []int{13}
 }
 
 func (x *Task) GetId() int64 {
@@ -966,7 +1082,7 @@
 func (x *TaskNeed) Reset() {
        *x = TaskNeed{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_runner_v1_messages_proto_msgTypes[12]
+               mi := &file_runner_v1_messages_proto_msgTypes[14]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -979,7 +1095,7 @@
 func (*TaskNeed) ProtoMessage() {}
 
 func (x *TaskNeed) ProtoReflect() protoreflect.Message {
-       mi := &file_runner_v1_messages_proto_msgTypes[12]
+       mi := &file_runner_v1_messages_proto_msgTypes[14]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -992,7 +1108,7 @@
 
 // Deprecated: Use TaskNeed.ProtoReflect.Descriptor instead.
 func (*TaskNeed) Descriptor() ([]byte, []int) {
-       return file_runner_v1_messages_proto_rawDescGZIP(), []int{12}
+       return file_runner_v1_messages_proto_rawDescGZIP(), []int{14}
 }
 
 func (x *TaskNeed) GetOutputs() map[string]string {
@@ -1025,7 +1141,7 @@
 func (x *TaskState) Reset() {
        *x = TaskState{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_runner_v1_messages_proto_msgTypes[13]
+               mi := &file_runner_v1_messages_proto_msgTypes[15]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -1038,7 +1154,7 @@
 func (*TaskState) ProtoMessage() {}
 
 func (x *TaskState) ProtoReflect() protoreflect.Message {
-       mi := &file_runner_v1_messages_proto_msgTypes[13]
+       mi := &file_runner_v1_messages_proto_msgTypes[15]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -1051,7 +1167,7 @@
 
 // Deprecated: Use TaskState.ProtoReflect.Descriptor instead.
 func (*TaskState) Descriptor() ([]byte, []int) {
-       return file_runner_v1_messages_proto_rawDescGZIP(), []int{13}
+       return file_runner_v1_messages_proto_rawDescGZIP(), []int{15}
 }
 
 func (x *TaskState) GetId() int64 {
@@ -1106,7 +1222,7 @@
 func (x *StepState) Reset() {
        *x = StepState{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_runner_v1_messages_proto_msgTypes[14]
+               mi := &file_runner_v1_messages_proto_msgTypes[16]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -1119,7 +1235,7 @@
 func (*StepState) ProtoMessage() {}
 
 func (x *StepState) ProtoReflect() protoreflect.Message {
-       mi := &file_runner_v1_messages_proto_msgTypes[14]
+       mi := &file_runner_v1_messages_proto_msgTypes[16]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -1132,7 +1248,7 @@
 
 // Deprecated: Use StepState.ProtoReflect.Descriptor instead.
 func (*StepState) Descriptor() ([]byte, []int) {
-       return file_runner_v1_messages_proto_rawDescGZIP(), []int{14}
+       return file_runner_v1_messages_proto_rawDescGZIP(), []int{16}
 }
 
 func (x *StepState) GetId() int64 {
@@ -1190,7 +1306,7 @@
 func (x *LogRow) Reset() {
        *x = LogRow{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_runner_v1_messages_proto_msgTypes[15]
+               mi := &file_runner_v1_messages_proto_msgTypes[17]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -1203,7 +1319,7 @@
 func (*LogRow) ProtoMessage() {}
 
 func (x *LogRow) ProtoReflect() protoreflect.Message {
-       mi := &file_runner_v1_messages_proto_msgTypes[15]
+       mi := &file_runner_v1_messages_proto_msgTypes[17]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -1216,7 +1332,7 @@
 
 // Deprecated: Use LogRow.ProtoReflect.Descriptor instead.
 func (*LogRow) Descriptor() ([]byte, []int) {
-       return file_runner_v1_messages_proto_rawDescGZIP(), []int{15}
+       return file_runner_v1_messages_proto_rawDescGZIP(), []int{17}
 }
 
 func (x *LogRow) GetTime() *timestamppb.Timestamp {
@@ -1285,161 +1401,174 @@
        0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 
0x18, 0x03, 0x20, 0x03,
        0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 
0x76, 0x31, 0x2e, 0x54,
        0x61, 0x73, 0x6b, 0x52, 0x0f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 
0x6e, 0x61, 0x6c, 0x54,
-       0x61, 0x73, 0x6b, 0x73, 0x22, 0xc0, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 
0x61, 0x74, 0x65, 0x54,
-       0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 
0x0a, 0x05, 0x73, 0x74,
-       0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 
0x72, 0x75, 0x6e, 0x6e,
-       0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 
0x61, 0x74, 0x65, 0x52,
-       0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x6f, 0x75, 
0x74, 0x70, 0x75, 0x74,
-       0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x75, 
0x6e, 0x6e, 0x65, 0x72,
-       0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 
0x73, 0x6b, 0x52, 0x65,
-       0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 
0x73, 0x45, 0x6e, 0x74,
-       0x72, 0x79, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x1a, 
0x3a, 0x0a, 0x0c, 0x4f,
-       0x75, 0x74, 0x70, 0x75, 0x74, 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, 0x63, 0x0a, 0x12, 0x55, 
0x70, 0x64, 0x61, 0x74,
-       0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 
0x65, 0x12, 0x2a, 0x0a,
-       0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 
0x32, 0x14, 0x2e, 0x72,
-       0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 
0x6b, 0x53, 0x74, 0x61,
-       0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 
0x0c, 0x73, 0x65, 0x6e,
-       0x74, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 
0x03, 0x28, 0x09, 0x52,
-       0x0b, 0x73, 0x65, 0x6e, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 
0x22, 0x81, 0x01, 0x0a,
-       0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x52, 0x65, 
0x71, 0x75, 0x65, 0x73,
-       0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 
0x18, 0x01, 0x20, 0x01,
-       0x28, 0x03, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x14, 
0x0a, 0x05, 0x69, 0x6e,
-       0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x69, 
0x6e, 0x64, 0x65, 0x78,
-       0x12, 0x25, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x03, 
0x28, 0x0b, 0x32, 0x11,
-       0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 
0x6f, 0x67, 0x52, 0x6f,
-       0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6e, 
0x6f, 0x5f, 0x6d, 0x6f,
-       0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 
0x4d, 0x6f, 0x72, 0x65,
-       0x22, 0x30, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4c, 0x6f, 
0x67, 0x52, 0x65, 0x73,
-       0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x63, 0x6b, 
0x5f, 0x69, 0x6e, 0x64,
-       0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x61, 0x63, 
0x6b, 0x49, 0x6e, 0x64,
-       0x65, 0x78, 0x22, 0xa7, 0x02, 0x0a, 0x06, 0x52, 0x75, 0x6e, 0x6e, 0x65, 
0x72, 0x12, 0x0e, 0x0a,
-       0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 
0x64, 0x12, 0x12, 0x0a,
-       0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 
0x04, 0x75, 0x75, 0x69,
-       0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 
0x20, 0x01, 0x28, 0x09,
-       0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 
0x61, 0x6d, 0x65, 0x18,
-       0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 
0x2f, 0x0a, 0x06, 0x73,
-       0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 
0x17, 0x2e, 0x72, 0x75,
-       0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x6e, 
0x65, 0x72, 0x53, 0x74,
-       0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 
0x12, 0x25, 0x0a, 0x0c,
-       0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 
0x18, 0x06, 0x20, 0x03,
-       0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x61, 0x67, 0x65, 0x6e, 
0x74, 0x4c, 0x61, 0x62,
-       0x65, 0x6c, 0x73, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 
0x6d, 0x5f, 0x6c, 0x61,
-       0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 
0x18, 0x01, 0x52, 0x0c,
-       0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 
0x12, 0x18, 0x0a, 0x07,
-       0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 
0x09, 0x52, 0x07, 0x76,
-       0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, 
0x62, 0x65, 0x6c, 0x73,
-       0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 
0x6c, 0x73, 0x12, 0x1c,
-       0x0a, 0x09, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x18, 
0x0a, 0x20, 0x01, 0x28,
-       0x08, 0x52, 0x09, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 
0x22, 0x9a, 0x04, 0x0a,
-       0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 
0x01, 0x20, 0x01, 0x28,
-       0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x10, 0x77, 0x6f, 0x72, 
0x6b, 0x66, 0x6c, 0x6f,
-       0x77, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 
0x01, 0x28, 0x0c, 0x48,
-       0x00, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 
0x61, 0x79, 0x6c, 0x6f,
-       0x61, 0x64, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 
0x74, 0x65, 0x78, 0x74,
-       0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 
0x67, 0x6c, 0x65, 0x2e,
-       0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 
0x75, 0x63, 0x74, 0x48,
-       0x01, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x88, 0x01, 
0x01, 0x12, 0x36, 0x0a,
-       0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 
0x28, 0x0b, 0x32, 0x1c,
+       0x61, 0x73, 0x6b, 0x73, 0x22, 0x65, 0x0a, 0x16, 0x46, 0x65, 0x74, 0x63, 
0x68, 0x53, 0x69, 0x6e,
+       0x67, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 
0x73, 0x74, 0x12, 0x23,
+       0x0a, 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 
0x69, 0x6f, 0x6e, 0x18,
+       0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x73, 
0x56, 0x65, 0x72, 0x73,
+       0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 
0x65, 0x18, 0x02, 0x20,
+       0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 
0x65, 0x88, 0x01, 0x01,
+       0x42, 0x09, 0x0a, 0x07, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 
0x63, 0x0a, 0x17, 0x46,
+       0x65, 0x74, 0x63, 0x68, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x54, 0x61, 
0x73, 0x6b, 0x52, 0x65,
+       0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 
0x73, 0x6b, 0x73, 0x5f,
+       0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 
0x03, 0x52, 0x0c, 0x74,
+       0x61, 0x73, 0x6b, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 
0x23, 0x0a, 0x04, 0x74,
+       0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 
0x72, 0x75, 0x6e, 0x6e,
+       0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x04, 
0x74, 0x61, 0x73, 0x6b,
+       0x22, 0xc0, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 
0x61, 0x73, 0x6b, 0x52,
+       0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x05, 0x73, 0x74, 
0x61, 0x74, 0x65, 0x18,
+       0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 
0x65, 0x72, 0x2e, 0x76,
+       0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 
0x05, 0x73, 0x74, 0x61,
+       0x74, 0x65, 0x12, 0x43, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 
0x73, 0x18, 0x02, 0x20,
+       0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 
0x2e, 0x76, 0x31, 0x2e,
+       0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 
0x71, 0x75, 0x65, 0x73,
+       0x74, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x45, 0x6e, 0x74, 
0x72, 0x79, 0x52, 0x07,
+       0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x4f, 
0x75, 0x74, 0x70, 0x75,
+       0x74, 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, 0x63, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 
0x65, 0x54, 0x61, 0x73,
+       0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 
0x05, 0x73, 0x74, 0x61,
+       0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 
0x75, 0x6e, 0x6e, 0x65,
+       0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 
0x74, 0x65, 0x52, 0x05,
+       0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x6e, 
0x74, 0x5f, 0x6f, 0x75,
+       0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 
0x0b, 0x73, 0x65, 0x6e,
+       0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x22, 0x81, 0x01, 0x0a, 
0x10, 0x55, 0x70, 0x64,
+       0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 
0x74, 0x12, 0x17, 0x0a,
+       0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 
0x28, 0x03, 0x52, 0x06,
+       0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 
0x64, 0x65, 0x78, 0x18,
+       0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 
0x12, 0x25, 0x0a, 0x04,
+       0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 
0x2e, 0x72, 0x75, 0x6e,
+       0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 
0x77, 0x52, 0x04, 0x72,
+       0x6f, 0x77, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x5f, 0x6d, 0x6f, 
0x72, 0x65, 0x18, 0x04,
+       0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x4d, 0x6f, 0x72, 0x65, 
0x22, 0x30, 0x0a, 0x11,
+       0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 
0x70, 0x6f, 0x6e, 0x73,
+       0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 
0x65, 0x78, 0x18, 0x01,
+       0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x64, 
0x65, 0x78, 0x22, 0xa7,
+       0x02, 0x0a, 0x06, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x0e, 0x0a, 
0x02, 0x69, 0x64, 0x18,
+       0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 
0x04, 0x75, 0x75, 0x69,
+       0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 
0x64, 0x12, 0x14, 0x0a,
+       0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 
0x52, 0x05, 0x74, 0x6f,
+       0x6b, 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 
0x04, 0x20, 0x01, 0x28,
+       0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x73, 
0x74, 0x61, 0x74, 0x75,
+       0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x72, 0x75, 
0x6e, 0x6e, 0x65, 0x72,
+       0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x53, 0x74, 
0x61, 0x74, 0x75, 0x73,
+       0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0c, 
0x61, 0x67, 0x65, 0x6e,
+       0x74, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 
0x28, 0x09, 0x42, 0x02,
+       0x18, 0x01, 0x52, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x62, 
0x65, 0x6c, 0x73, 0x12,
+       0x27, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 
0x62, 0x65, 0x6c, 0x73,
+       0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0c, 
0x63, 0x75, 0x73, 0x74,
+       0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x18, 0x0a, 0x07, 
0x76, 0x65, 0x72, 0x73,
+       0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 
0x65, 0x72, 0x73, 0x69,
+       0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 
0x18, 0x09, 0x20, 0x03,
+       0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x1c, 
0x0a, 0x09, 0x65, 0x70,
+       0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 
0x08, 0x52, 0x09, 0x65,
+       0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x9a, 0x04, 0x0a, 
0x04, 0x54, 0x61, 0x73,
+       0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 
0x03, 0x52, 0x02, 0x69,
+       0x64, 0x12, 0x2e, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 
0x77, 0x5f, 0x70, 0x61,
+       0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 
0x00, 0x52, 0x0f, 0x77,
+       0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x79, 0x6c, 0x6f, 
0x61, 0x64, 0x88, 0x01,
+       0x01, 0x12, 0x36, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 
0x18, 0x03, 0x20, 0x01,
+       0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 
0x70, 0x72, 0x6f, 0x74,
+       0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x48, 
0x01, 0x52, 0x07, 0x63,
+       0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 
0x07, 0x73, 0x65, 0x63,
+       0x72, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 
0x2e, 0x72, 0x75, 0x6e,
+       0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x2e, 
0x53, 0x65, 0x63, 0x72,
+       0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x73, 0x65, 
0x63, 0x72, 0x65, 0x74,
+       0x73, 0x12, 0x1c, 0x0a, 0x07, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 
0x18, 0x05, 0x20, 0x01,
+       0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x63, 0x68, 
0x69, 0x6e, 0x65, 0x12,
+       0x30, 0x0a, 0x05, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 
0x28, 0x0b, 0x32, 0x1a,
        0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 
0x61, 0x73, 0x6b, 0x2e,
-       0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 
0x52, 0x07, 0x73, 0x65,
-       0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x07, 0x6d, 0x61, 0x63, 
0x68, 0x69, 0x6e, 0x65,
-       0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 
0x6d, 0x61, 0x63, 0x68,
-       0x69, 0x6e, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x6e, 0x65, 0x65, 0x64, 0x73, 
0x18, 0x06, 0x20, 0x03,
-       0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 
0x76, 0x31, 0x2e, 0x54,
-       0x61, 0x73, 0x6b, 0x2e, 0x4e, 0x65, 0x65, 0x64, 0x73, 0x45, 0x6e, 0x74, 
0x72, 0x79, 0x52, 0x05,
-       0x6e, 0x65, 0x65, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x76, 0x61, 0x72, 
0x73, 0x18, 0x07, 0x20,
-       0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 
0x2e, 0x76, 0x31, 0x2e,
-       0x54, 0x61, 0x73, 0x6b, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 
0x72, 0x79, 0x52, 0x04,
-       0x76, 0x61, 0x72, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 
0x65, 0x74, 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,
-       0x1a, 0x4d, 0x0a, 0x0a, 0x4e, 0x65, 0x65, 0x64, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 
0x01, 0x28, 0x0b, 0x32,
-       0x13, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 
0x54, 0x61, 0x73, 0x6b,
-       0x4e, 0x65, 0x65, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 
0x02, 0x38, 0x01, 0x1a,
-       0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 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, 0x42, 0x13, 0x0a, 0x11, 
0x5f, 0x77, 0x6f, 0x72,
-       0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 
0x64, 0x42, 0x0a, 0x0a,
-       0x08, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0xad, 0x01, 
0x0a, 0x08, 0x54, 0x61,
-       0x73, 0x6b, 0x4e, 0x65, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x07, 0x6f, 0x75, 
0x74, 0x70, 0x75, 0x74,
-       0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x75, 
0x6e, 0x6e, 0x65, 0x72,
-       0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x4e, 0x65, 0x65, 0x64, 
0x2e, 0x4f, 0x75, 0x74,
-       0x70, 0x75, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6f, 
0x75, 0x74, 0x70, 0x75,
-       0x74, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 
0x18, 0x02, 0x20, 0x01,
-       0x28, 0x0e, 0x32, 0x11, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 
0x76, 0x31, 0x2e, 0x52,
-       0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 
0x74, 0x1a, 0x3a, 0x0a,
-       0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 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, 0xe8, 0x01, 
0x0a, 0x09, 0x54, 0x61,
-       0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 
0x64, 0x18, 0x01, 0x20,
-       0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x06, 0x72, 
0x65, 0x73, 0x75, 0x6c,
-       0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x72, 0x75, 
0x6e, 0x6e, 0x65, 0x72,
-       0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 
0x72, 0x65, 0x73, 0x75,
-       0x6c, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 
0x64, 0x5f, 0x61, 0x74,
-       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, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 
0x74, 0x12, 0x39, 0x0a,
-       0x0a, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 
0x04, 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, 0x09, 0x73,
-       0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x41, 0x74, 0x12, 0x2a, 0x0a, 0x05, 
0x73, 0x74, 0x65, 0x70,
-       0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x75, 
0x6e, 0x6e, 0x65, 0x72,
-       0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 
0x65, 0x52, 0x05, 0x73,
-       0x74, 0x65, 0x70, 0x73, 0x22, 0xf8, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x65, 
0x70, 0x53, 0x74, 0x61,
-       0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 
0x28, 0x03, 0x52, 0x02,
-       0x69, 0x64, 0x12, 0x29, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 
0x18, 0x02, 0x20, 0x01,
-       0x28, 0x0e, 0x32, 0x11, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 
0x76, 0x31, 0x2e, 0x52,
-       0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 
0x74, 0x12, 0x39, 0x0a,
-       0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 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, 0x09, 0x73,
-       0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 
0x73, 0x74, 0x6f, 0x70,
-       0x70, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 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, 0x09, 0x73, 0x74, 
0x6f, 0x70, 0x70, 0x65,
-       0x64, 0x41, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 
0x6e, 0x64, 0x65, 0x78,
-       0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, 
0x6e, 0x64, 0x65, 0x78,
-       0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 
0x74, 0x68, 0x18, 0x06,
-       0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x6e, 
0x67, 0x74, 0x68, 0x22,
-       0x52, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x77, 0x12, 0x2e, 0x0a, 
0x04, 0x74, 0x69, 0x6d,
-       0x65, 0x18, 0x01, 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 
0x07, 0x63, 0x6f, 0x6e,
-       0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 
0x63, 0x6f, 0x6e, 0x74,
-       0x65, 0x6e, 0x74, 0x2a, 0x7a, 0x0a, 0x0c, 0x52, 0x75, 0x6e, 0x6e, 0x65, 
0x72, 0x53, 0x74, 0x61,
-       0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x55, 0x4e, 0x4e, 0x45, 
0x52, 0x5f, 0x53, 0x54,
-       0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 
0x46, 0x49, 0x45, 0x44,
-       0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x4e, 0x45, 0x52, 
0x5f, 0x53, 0x54, 0x41,
-       0x54, 0x55, 0x53, 0x5f, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x18, 
0x0a, 0x14, 0x52, 0x55,
-       0x4e, 0x4e, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 
0x41, 0x43, 0x54, 0x49,
-       0x56, 0x45, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x55, 0x4e, 0x4e, 
0x45, 0x52, 0x5f, 0x53,
-       0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4f, 0x46, 0x46, 0x4c, 0x49, 0x4e, 
0x45, 0x10, 0x03, 0x2a,
-       0x72, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 
0x12, 0x52, 0x45, 0x53,
-       0x55, 0x4c, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 
0x49, 0x45, 0x44, 0x10,
-       0x00, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 
0x53, 0x55, 0x43, 0x43,
-       0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x53, 
0x55, 0x4c, 0x54, 0x5f,
-       0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x02, 0x12, 0x14, 0x0a, 
0x10, 0x52, 0x45, 0x53,
-       0x55, 0x4c, 0x54, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 
0x44, 0x10, 0x03, 0x12,
-       0x12, 0x0a, 0x0e, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x53, 0x4b, 
0x49, 0x50, 0x50, 0x45,
-       0x44, 0x10, 0x04, 0x42, 0x9e, 0x01, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x2e, 
0x72, 0x75, 0x6e, 0x6e,
-       0x65, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x0d, 0x4d, 0x65, 0x73, 0x73, 0x61, 
0x67, 0x65, 0x73, 0x50,
-       0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x39, 0x63, 0x6f, 0x64, 0x65, 
0x2e, 0x66, 0x6f, 0x72,
-       0x67, 0x65, 0x6a, 0x6f, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x66, 0x6f, 0x72, 
0x67, 0x65, 0x6a, 0x6f,
-       0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2d, 0x70, 0x72, 0x6f, 
0x74, 0x6f, 0x2f, 0x72,
-       0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x75, 0x6e, 
0x6e, 0x65, 0x72, 0x76,
-       0x31, 0xa2, 0x02, 0x03, 0x52, 0x58, 0x58, 0xaa, 0x02, 0x09, 0x52, 0x75, 
0x6e, 0x6e, 0x65, 0x72,
-       0x2e, 0x56, 0x31, 0xca, 0x02, 0x09, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 
0x5c, 0x56, 0x31, 0xe2,
-       0x02, 0x15, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x5c, 0x56, 0x31, 0x5c, 
0x47, 0x50, 0x42, 0x4d,
-       0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x52, 0x75, 
0x6e, 0x6e, 0x65, 0x72,
-       0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+       0x4e, 0x65, 0x65, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 
0x6e, 0x65, 0x65, 0x64,
+       0x73, 0x12, 0x2d, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, 
0x03, 0x28, 0x0b, 0x32,
+       0x19, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 
0x54, 0x61, 0x73, 0x6b,
+       0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 
0x76, 0x61, 0x72, 0x73,
+       0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 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, 
0x1a, 0x4d, 0x0a, 0x0a,
+       0x4e, 0x65, 0x65, 0x64, 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, 0x29, 0x0a, 0x05,
+       0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 
0x13, 0x2e, 0x72, 0x75,
+       0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 
0x4e, 0x65, 0x65, 0x64,
+       0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 
0x37, 0x0a, 0x09, 0x56,
+       0x61, 0x72, 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, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x77, 0x6f, 0x72, 
0x6b, 0x66, 0x6c, 0x6f,
+       0x77, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x0a, 0x0a, 
0x08, 0x5f, 0x63, 0x6f,
+       0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0xad, 0x01, 0x0a, 0x08, 0x54, 0x61, 
0x73, 0x6b, 0x4e, 0x65,
+       0x65, 0x64, 0x12, 0x3a, 0x0a, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 
0x73, 0x18, 0x01, 0x20,
+       0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 
0x2e, 0x76, 0x31, 0x2e,
+       0x54, 0x61, 0x73, 0x6b, 0x4e, 0x65, 0x65, 0x64, 0x2e, 0x4f, 0x75, 0x74, 
0x70, 0x75, 0x74, 0x73,
+       0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x70, 0x75, 
0x74, 0x73, 0x12, 0x29,
+       0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 
0x28, 0x0e, 0x32, 0x11,
+       0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 
0x65, 0x73, 0x75, 0x6c,
+       0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x3a, 0x0a, 
0x0c, 0x4f, 0x75, 0x74,
+       0x70, 0x75, 0x74, 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, 0xe8, 0x01, 0x0a, 0x09, 0x54, 0x61, 
0x73, 0x6b, 0x53, 0x74,
+       0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 
0x01, 0x28, 0x03, 0x52,
+       0x02, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 
0x74, 0x18, 0x02, 0x20,
+       0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 
0x2e, 0x76, 0x31, 0x2e,
+       0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 
0x6c, 0x74, 0x12, 0x39,
+       0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 
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, 0x09,
+       0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 
0x0a, 0x73, 0x74, 0x6f,
+       0x70, 0x70, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 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, 0x09, 0x73, 
0x74, 0x6f, 0x70, 0x70,
+       0x65, 0x64, 0x41, 0x74, 0x12, 0x2a, 0x0a, 0x05, 0x73, 0x74, 0x65, 0x70, 
0x73, 0x18, 0x05, 0x20,
+       0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 
0x2e, 0x76, 0x31, 0x2e,
+       0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 
0x74, 0x65, 0x70, 0x73,
+       0x22, 0xf8, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 
0x74, 0x65, 0x12, 0x0e,
+       0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 
0x69, 0x64, 0x12, 0x29,
+       0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 
0x28, 0x0e, 0x32, 0x11,
+       0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 
0x65, 0x73, 0x75, 0x6c,
+       0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x39, 0x0a, 
0x0a, 0x73, 0x74, 0x61,
+       0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 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, 0x09, 0x73, 
0x74, 0x61, 0x72, 0x74,
+       0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x70, 
0x70, 0x65, 0x64, 0x5f,
+       0x61, 0x74, 0x18, 0x04, 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, 0x09, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 
0x64, 0x41, 0x74, 0x12,
+       0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 
0x18, 0x05, 0x20, 0x01,
+       0x28, 0x03, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 
0x12, 0x1d, 0x0a, 0x0a,
+       0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x06, 
0x20, 0x01, 0x28, 0x03,
+       0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 
0x52, 0x0a, 0x06, 0x4c,
+       0x6f, 0x67, 0x52, 0x6f, 0x77, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 
0x65, 0x18, 0x01, 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,
+       0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 
0x74, 0x65, 0x6e, 0x74,
+       0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 
0x65, 0x6e, 0x74, 0x2a,
+       0x7a, 0x0a, 0x0c, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 
0x74, 0x75, 0x73, 0x12,
+       0x1d, 0x0a, 0x19, 0x52, 0x55, 0x4e, 0x4e, 0x45, 0x52, 0x5f, 0x53, 0x54, 
0x41, 0x54, 0x55, 0x53,
+       0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 
0x10, 0x00, 0x12, 0x16,
+       0x0a, 0x12, 0x52, 0x55, 0x4e, 0x4e, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 
0x54, 0x55, 0x53, 0x5f,
+       0x49, 0x44, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x55, 
0x4e, 0x4e, 0x45, 0x52,
+       0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x43, 0x54, 0x49, 
0x56, 0x45, 0x10, 0x02,
+       0x12, 0x19, 0x0a, 0x15, 0x52, 0x55, 0x4e, 0x4e, 0x45, 0x52, 0x5f, 0x53, 
0x54, 0x41, 0x54, 0x55,
+       0x53, 0x5f, 0x4f, 0x46, 0x46, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x03, 0x2a, 
0x72, 0x0a, 0x06, 0x52,
+       0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 
0x55, 0x4c, 0x54, 0x5f,
+       0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 
0x00, 0x12, 0x12, 0x0a,
+       0x0e, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x53, 0x55, 0x43, 0x43, 
0x45, 0x53, 0x53, 0x10,
+       0x01, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 
0x46, 0x41, 0x49, 0x4c,
+       0x55, 0x52, 0x45, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x53, 
0x55, 0x4c, 0x54, 0x5f,
+       0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 
0x12, 0x0a, 0x0e, 0x52,
+       0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 
0x44, 0x10, 0x04, 0x42,
+       0x9e, 0x01, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 
0x65, 0x72, 0x2e, 0x76,
+       0x31, 0x42, 0x0d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x50, 
0x72, 0x6f, 0x74, 0x6f,
+       0x50, 0x01, 0x5a, 0x39, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x6f, 0x72, 
0x67, 0x65, 0x6a, 0x6f,
+       0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x66, 0x6f, 0x72, 0x67, 0x65, 0x6a, 0x6f, 
0x2f, 0x61, 0x63, 0x74,
+       0x69, 0x6f, 0x6e, 0x73, 0x2d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 
0x75, 0x6e, 0x6e, 0x65,
+       0x72, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x76, 
0x31, 0xa2, 0x02, 0x03,
+       0x52, 0x58, 0x58, 0xaa, 0x02, 0x09, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 
0x2e, 0x56, 0x31, 0xca,
+       0x02, 0x09, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x5c, 0x56, 0x31, 0xe2, 
0x02, 0x15, 0x52, 0x75,
+       0x6e, 0x6e, 0x65, 0x72, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 
0x65, 0x74, 0x61, 0x64,
+       0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 
0x3a, 0x3a, 0x56, 0x31,
+       0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -1455,64 +1584,67 @@
 }
 
 var file_runner_v1_messages_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
-var file_runner_v1_messages_proto_msgTypes = make([]protoimpl.MessageInfo, 21)
+var file_runner_v1_messages_proto_msgTypes = make([]protoimpl.MessageInfo, 23)
 var file_runner_v1_messages_proto_goTypes = []interface{}{
-       (RunnerStatus)(0),             // 0: runner.v1.RunnerStatus
-       (Result)(0),                   // 1: runner.v1.Result
-       (*RegisterRequest)(nil),       // 2: runner.v1.RegisterRequest
-       (*RegisterResponse)(nil),      // 3: runner.v1.RegisterResponse
-       (*DeclareRequest)(nil),        // 4: runner.v1.DeclareRequest
-       (*DeclareResponse)(nil),       // 5: runner.v1.DeclareResponse
-       (*FetchTaskRequest)(nil),      // 6: runner.v1.FetchTaskRequest
-       (*FetchTaskResponse)(nil),     // 7: runner.v1.FetchTaskResponse
-       (*UpdateTaskRequest)(nil),     // 8: runner.v1.UpdateTaskRequest
-       (*UpdateTaskResponse)(nil),    // 9: runner.v1.UpdateTaskResponse
-       (*UpdateLogRequest)(nil),      // 10: runner.v1.UpdateLogRequest
-       (*UpdateLogResponse)(nil),     // 11: runner.v1.UpdateLogResponse
-       (*Runner)(nil),                // 12: runner.v1.Runner
-       (*Task)(nil),                  // 13: runner.v1.Task
-       (*TaskNeed)(nil),              // 14: runner.v1.TaskNeed
-       (*TaskState)(nil),             // 15: runner.v1.TaskState
-       (*StepState)(nil),             // 16: runner.v1.StepState
-       (*LogRow)(nil),                // 17: runner.v1.LogRow
-       nil,                           // 18: 
runner.v1.UpdateTaskRequest.OutputsEntry
-       nil,                           // 19: runner.v1.Task.SecretsEntry
-       nil,                           // 20: runner.v1.Task.NeedsEntry
-       nil,                           // 21: runner.v1.Task.VarsEntry
-       nil,                           // 22: runner.v1.TaskNeed.OutputsEntry
-       (*structpb.Struct)(nil),       // 23: google.protobuf.Struct
-       (*timestamppb.Timestamp)(nil), // 24: google.protobuf.Timestamp
+       (RunnerStatus)(0),               // 0: runner.v1.RunnerStatus
+       (Result)(0),                     // 1: runner.v1.Result
+       (*RegisterRequest)(nil),         // 2: runner.v1.RegisterRequest
+       (*RegisterResponse)(nil),        // 3: runner.v1.RegisterResponse
+       (*DeclareRequest)(nil),          // 4: runner.v1.DeclareRequest
+       (*DeclareResponse)(nil),         // 5: runner.v1.DeclareResponse
+       (*FetchTaskRequest)(nil),        // 6: runner.v1.FetchTaskRequest
+       (*FetchTaskResponse)(nil),       // 7: runner.v1.FetchTaskResponse
+       (*FetchSingleTaskRequest)(nil),  // 8: runner.v1.FetchSingleTaskRequest
+       (*FetchSingleTaskResponse)(nil), // 9: runner.v1.FetchSingleTaskResponse
+       (*UpdateTaskRequest)(nil),       // 10: runner.v1.UpdateTaskRequest
+       (*UpdateTaskResponse)(nil),      // 11: runner.v1.UpdateTaskResponse
+       (*UpdateLogRequest)(nil),        // 12: runner.v1.UpdateLogRequest
+       (*UpdateLogResponse)(nil),       // 13: runner.v1.UpdateLogResponse
+       (*Runner)(nil),                  // 14: runner.v1.Runner
+       (*Task)(nil),                    // 15: runner.v1.Task
+       (*TaskNeed)(nil),                // 16: runner.v1.TaskNeed
+       (*TaskState)(nil),               // 17: runner.v1.TaskState
+       (*StepState)(nil),               // 18: runner.v1.StepState
+       (*LogRow)(nil),                  // 19: runner.v1.LogRow
+       nil,                             // 20: 
runner.v1.UpdateTaskRequest.OutputsEntry
+       nil,                             // 21: runner.v1.Task.SecretsEntry
+       nil,                             // 22: runner.v1.Task.NeedsEntry
+       nil,                             // 23: runner.v1.Task.VarsEntry
+       nil,                             // 24: runner.v1.TaskNeed.OutputsEntry
+       (*structpb.Struct)(nil),         // 25: google.protobuf.Struct
+       (*timestamppb.Timestamp)(nil),   // 26: google.protobuf.Timestamp
 }
 var file_runner_v1_messages_proto_depIdxs = []int32{
-       12, // 0: runner.v1.RegisterResponse.runner:type_name -> 
runner.v1.Runner
-       12, // 1: runner.v1.DeclareResponse.runner:type_name -> runner.v1.Runner
-       13, // 2: runner.v1.FetchTaskResponse.task:type_name -> runner.v1.Task
-       13, // 3: runner.v1.FetchTaskResponse.additional_tasks:type_name -> 
runner.v1.Task
-       15, // 4: runner.v1.UpdateTaskRequest.state:type_name -> 
runner.v1.TaskState
-       18, // 5: runner.v1.UpdateTaskRequest.outputs:type_name -> 
runner.v1.UpdateTaskRequest.OutputsEntry
-       15, // 6: runner.v1.UpdateTaskResponse.state:type_name -> 
runner.v1.TaskState
-       17, // 7: runner.v1.UpdateLogRequest.rows:type_name -> runner.v1.LogRow
-       0,  // 8: runner.v1.Runner.status:type_name -> runner.v1.RunnerStatus
-       23, // 9: runner.v1.Task.context:type_name -> google.protobuf.Struct
-       19, // 10: runner.v1.Task.secrets:type_name -> 
runner.v1.Task.SecretsEntry
-       20, // 11: runner.v1.Task.needs:type_name -> runner.v1.Task.NeedsEntry
-       21, // 12: runner.v1.Task.vars:type_name -> runner.v1.Task.VarsEntry
-       22, // 13: runner.v1.TaskNeed.outputs:type_name -> 
runner.v1.TaskNeed.OutputsEntry
-       1,  // 14: runner.v1.TaskNeed.result:type_name -> runner.v1.Result
-       1,  // 15: runner.v1.TaskState.result:type_name -> runner.v1.Result
-       24, // 16: runner.v1.TaskState.started_at:type_name -> 
google.protobuf.Timestamp
-       24, // 17: runner.v1.TaskState.stopped_at:type_name -> 
google.protobuf.Timestamp
-       16, // 18: runner.v1.TaskState.steps:type_name -> runner.v1.StepState
-       1,  // 19: runner.v1.StepState.result:type_name -> runner.v1.Result
-       24, // 20: runner.v1.StepState.started_at:type_name -> 
google.protobuf.Timestamp
-       24, // 21: runner.v1.StepState.stopped_at:type_name -> 
google.protobuf.Timestamp
-       24, // 22: runner.v1.LogRow.time:type_name -> google.protobuf.Timestamp
-       14, // 23: runner.v1.Task.NeedsEntry.value:type_name -> 
runner.v1.TaskNeed
-       24, // [24:24] is the sub-list for method output_type
-       24, // [24:24] is the sub-list for method input_type
-       24, // [24:24] is the sub-list for extension type_name
-       24, // [24:24] is the sub-list for extension extendee
-       0,  // [0:24] is the sub-list for field type_name
+       14, // 0: runner.v1.RegisterResponse.runner:type_name -> 
runner.v1.Runner
+       14, // 1: runner.v1.DeclareResponse.runner:type_name -> runner.v1.Runner
+       15, // 2: runner.v1.FetchTaskResponse.task:type_name -> runner.v1.Task
+       15, // 3: runner.v1.FetchTaskResponse.additional_tasks:type_name -> 
runner.v1.Task
+       15, // 4: runner.v1.FetchSingleTaskResponse.task:type_name -> 
runner.v1.Task
+       17, // 5: runner.v1.UpdateTaskRequest.state:type_name -> 
runner.v1.TaskState
+       20, // 6: runner.v1.UpdateTaskRequest.outputs:type_name -> 
runner.v1.UpdateTaskRequest.OutputsEntry
+       17, // 7: runner.v1.UpdateTaskResponse.state:type_name -> 
runner.v1.TaskState
+       19, // 8: runner.v1.UpdateLogRequest.rows:type_name -> runner.v1.LogRow
+       0,  // 9: runner.v1.Runner.status:type_name -> runner.v1.RunnerStatus
+       25, // 10: runner.v1.Task.context:type_name -> google.protobuf.Struct
+       21, // 11: runner.v1.Task.secrets:type_name -> 
runner.v1.Task.SecretsEntry
+       22, // 12: runner.v1.Task.needs:type_name -> runner.v1.Task.NeedsEntry
+       23, // 13: runner.v1.Task.vars:type_name -> runner.v1.Task.VarsEntry
+       24, // 14: runner.v1.TaskNeed.outputs:type_name -> 
runner.v1.TaskNeed.OutputsEntry
+       1,  // 15: runner.v1.TaskNeed.result:type_name -> runner.v1.Result
+       1,  // 16: runner.v1.TaskState.result:type_name -> runner.v1.Result
+       26, // 17: runner.v1.TaskState.started_at:type_name -> 
google.protobuf.Timestamp
+       26, // 18: runner.v1.TaskState.stopped_at:type_name -> 
google.protobuf.Timestamp
+       18, // 19: runner.v1.TaskState.steps:type_name -> runner.v1.StepState
+       1,  // 20: runner.v1.StepState.result:type_name -> runner.v1.Result
+       26, // 21: runner.v1.StepState.started_at:type_name -> 
google.protobuf.Timestamp
+       26, // 22: runner.v1.StepState.stopped_at:type_name -> 
google.protobuf.Timestamp
+       26, // 23: runner.v1.LogRow.time:type_name -> google.protobuf.Timestamp
+       16, // 24: runner.v1.Task.NeedsEntry.value:type_name -> 
runner.v1.TaskNeed
+       25, // [25:25] is the sub-list for method output_type
+       25, // [25:25] is the sub-list for method input_type
+       25, // [25:25] is the sub-list for extension type_name
+       25, // [25:25] is the sub-list for extension extendee
+       0,  // [0:25] is the sub-list for field type_name
 }
 
 func init() { file_runner_v1_messages_proto_init() }
@@ -1594,7 +1726,7 @@
                        }
                }
                file_runner_v1_messages_proto_msgTypes[6].Exporter = func(v 
interface{}, i int) interface{} {
-                       switch v := v.(*UpdateTaskRequest); i {
+                       switch v := v.(*FetchSingleTaskRequest); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -1606,7 +1738,7 @@
                        }
                }
                file_runner_v1_messages_proto_msgTypes[7].Exporter = func(v 
interface{}, i int) interface{} {
-                       switch v := v.(*UpdateTaskResponse); i {
+                       switch v := v.(*FetchSingleTaskResponse); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -1618,7 +1750,7 @@
                        }
                }
                file_runner_v1_messages_proto_msgTypes[8].Exporter = func(v 
interface{}, i int) interface{} {
-                       switch v := v.(*UpdateLogRequest); i {
+                       switch v := v.(*UpdateTaskRequest); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -1630,7 +1762,7 @@
                        }
                }
                file_runner_v1_messages_proto_msgTypes[9].Exporter = func(v 
interface{}, i int) interface{} {
-                       switch v := v.(*UpdateLogResponse); i {
+                       switch v := v.(*UpdateTaskResponse); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -1642,7 +1774,7 @@
                        }
                }
                file_runner_v1_messages_proto_msgTypes[10].Exporter = func(v 
interface{}, i int) interface{} {
-                       switch v := v.(*Runner); i {
+                       switch v := v.(*UpdateLogRequest); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -1654,7 +1786,7 @@
                        }
                }
                file_runner_v1_messages_proto_msgTypes[11].Exporter = func(v 
interface{}, i int) interface{} {
-                       switch v := v.(*Task); i {
+                       switch v := v.(*UpdateLogResponse); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -1666,7 +1798,7 @@
                        }
                }
                file_runner_v1_messages_proto_msgTypes[12].Exporter = func(v 
interface{}, i int) interface{} {
-                       switch v := v.(*TaskNeed); i {
+                       switch v := v.(*Runner); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -1678,7 +1810,7 @@
                        }
                }
                file_runner_v1_messages_proto_msgTypes[13].Exporter = func(v 
interface{}, i int) interface{} {
-                       switch v := v.(*TaskState); i {
+                       switch v := v.(*Task); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -1690,7 +1822,7 @@
                        }
                }
                file_runner_v1_messages_proto_msgTypes[14].Exporter = func(v 
interface{}, i int) interface{} {
-                       switch v := v.(*StepState); i {
+                       switch v := v.(*TaskNeed); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -1702,6 +1834,30 @@
                        }
                }
                file_runner_v1_messages_proto_msgTypes[15].Exporter = func(v 
interface{}, i int) interface{} {
+                       switch v := v.(*TaskState); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_runner_v1_messages_proto_msgTypes[16].Exporter = func(v 
interface{}, i int) interface{} {
+                       switch v := v.(*StepState); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_runner_v1_messages_proto_msgTypes[17].Exporter = func(v 
interface{}, i int) interface{} {
                        switch v := v.(*LogRow); i {
                        case 0:
                                return &v.state
@@ -1715,14 +1871,15 @@
                }
        }
        file_runner_v1_messages_proto_msgTypes[4].OneofWrappers = 
[]interface{}{}
-       file_runner_v1_messages_proto_msgTypes[11].OneofWrappers = 
[]interface{}{}
+       file_runner_v1_messages_proto_msgTypes[6].OneofWrappers = 
[]interface{}{}
+       file_runner_v1_messages_proto_msgTypes[13].OneofWrappers = 
[]interface{}{}
        type x struct{}
        out := protoimpl.TypeBuilder{
                File: protoimpl.DescBuilder{
                        GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
                        RawDescriptor: file_runner_v1_messages_proto_rawDesc,
                        NumEnums:      2,
-                       NumMessages:   21,
+                       NumMessages:   23,
                        NumExtensions: 0,
                        NumServices:   0,
                },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/code.forgejo.org/forgejo/actions-proto/runner/v1/runnerv1connect/services.connect.go
 
new/vendor/code.forgejo.org/forgejo/actions-proto/runner/v1/runnerv1connect/services.connect.go
--- 
old/vendor/code.forgejo.org/forgejo/actions-proto/runner/v1/runnerv1connect/services.connect.go
     2026-03-26 09:17:45.000000000 +0100
+++ 
new/vendor/code.forgejo.org/forgejo/actions-proto/runner/v1/runnerv1connect/services.connect.go
     2026-04-07 15:49:09.000000000 +0200
@@ -39,6 +39,9 @@
        RunnerServiceDeclareProcedure = "/runner.v1.RunnerService/Declare"
        // RunnerServiceFetchTaskProcedure is the fully-qualified name of the 
RunnerService's FetchTask RPC.
        RunnerServiceFetchTaskProcedure = "/runner.v1.RunnerService/FetchTask"
+       // RunnerServiceFetchSingleTaskProcedure is the fully-qualified name of 
the RunnerService's
+       // FetchSingleTask RPC.
+       RunnerServiceFetchSingleTaskProcedure = 
"/runner.v1.RunnerService/FetchSingleTask"
        // RunnerServiceUpdateTaskProcedure is the fully-qualified name of the 
RunnerService's UpdateTask
        // RPC.
        RunnerServiceUpdateTaskProcedure = "/runner.v1.RunnerService/UpdateTask"
@@ -48,12 +51,13 @@
 
 // These variables are the protoreflect.Descriptor objects for the RPCs 
defined in this package.
 var (
-       runnerServiceServiceDescriptor          = 
v1.File_runner_v1_services_proto.Services().ByName("RunnerService")
-       runnerServiceRegisterMethodDescriptor   = 
runnerServiceServiceDescriptor.Methods().ByName("Register")
-       runnerServiceDeclareMethodDescriptor    = 
runnerServiceServiceDescriptor.Methods().ByName("Declare")
-       runnerServiceFetchTaskMethodDescriptor  = 
runnerServiceServiceDescriptor.Methods().ByName("FetchTask")
-       runnerServiceUpdateTaskMethodDescriptor = 
runnerServiceServiceDescriptor.Methods().ByName("UpdateTask")
-       runnerServiceUpdateLogMethodDescriptor  = 
runnerServiceServiceDescriptor.Methods().ByName("UpdateLog")
+       runnerServiceServiceDescriptor               = 
v1.File_runner_v1_services_proto.Services().ByName("RunnerService")
+       runnerServiceRegisterMethodDescriptor        = 
runnerServiceServiceDescriptor.Methods().ByName("Register")
+       runnerServiceDeclareMethodDescriptor         = 
runnerServiceServiceDescriptor.Methods().ByName("Declare")
+       runnerServiceFetchTaskMethodDescriptor       = 
runnerServiceServiceDescriptor.Methods().ByName("FetchTask")
+       runnerServiceFetchSingleTaskMethodDescriptor = 
runnerServiceServiceDescriptor.Methods().ByName("FetchSingleTask")
+       runnerServiceUpdateTaskMethodDescriptor      = 
runnerServiceServiceDescriptor.Methods().ByName("UpdateTask")
+       runnerServiceUpdateLogMethodDescriptor       = 
runnerServiceServiceDescriptor.Methods().ByName("UpdateLog")
 )
 
 // RunnerServiceClient is a client for the runner.v1.RunnerService service.
@@ -64,6 +68,8 @@
        Declare(context.Context, *connect.Request[v1.DeclareRequest]) 
(*connect.Response[v1.DeclareResponse], error)
        // FetchTask requests the next available task for execution.
        FetchTask(context.Context, *connect.Request[v1.FetchTaskRequest]) 
(*connect.Response[v1.FetchTaskResponse], error)
+       // FetchSingleTask asks for a single task for execution.
+       FetchSingleTask(context.Context, 
*connect.Request[v1.FetchSingleTaskRequest]) 
(*connect.Response[v1.FetchSingleTaskResponse], error)
        // UpdateTask updates the task status.
        UpdateTask(context.Context, *connect.Request[v1.UpdateTaskRequest]) 
(*connect.Response[v1.UpdateTaskResponse], error)
        // UpdateLog uploads log of the task.
@@ -98,6 +104,12 @@
                        
connect.WithSchema(runnerServiceFetchTaskMethodDescriptor),
                        connect.WithClientOptions(opts...),
                ),
+               fetchSingleTask: connect.NewClient[v1.FetchSingleTaskRequest, 
v1.FetchSingleTaskResponse](
+                       httpClient,
+                       baseURL+RunnerServiceFetchSingleTaskProcedure,
+                       
connect.WithSchema(runnerServiceFetchSingleTaskMethodDescriptor),
+                       connect.WithClientOptions(opts...),
+               ),
                updateTask: connect.NewClient[v1.UpdateTaskRequest, 
v1.UpdateTaskResponse](
                        httpClient,
                        baseURL+RunnerServiceUpdateTaskProcedure,
@@ -115,11 +127,12 @@
 
 // runnerServiceClient implements RunnerServiceClient.
 type runnerServiceClient struct {
-       register   *connect.Client[v1.RegisterRequest, v1.RegisterResponse]
-       declare    *connect.Client[v1.DeclareRequest, v1.DeclareResponse]
-       fetchTask  *connect.Client[v1.FetchTaskRequest, v1.FetchTaskResponse]
-       updateTask *connect.Client[v1.UpdateTaskRequest, v1.UpdateTaskResponse]
-       updateLog  *connect.Client[v1.UpdateLogRequest, v1.UpdateLogResponse]
+       register        *connect.Client[v1.RegisterRequest, v1.RegisterResponse]
+       declare         *connect.Client[v1.DeclareRequest, v1.DeclareResponse]
+       fetchTask       *connect.Client[v1.FetchTaskRequest, 
v1.FetchTaskResponse]
+       fetchSingleTask *connect.Client[v1.FetchSingleTaskRequest, 
v1.FetchSingleTaskResponse]
+       updateTask      *connect.Client[v1.UpdateTaskRequest, 
v1.UpdateTaskResponse]
+       updateLog       *connect.Client[v1.UpdateLogRequest, 
v1.UpdateLogResponse]
 }
 
 // Register calls runner.v1.RunnerService.Register.
@@ -137,6 +150,11 @@
        return c.fetchTask.CallUnary(ctx, req)
 }
 
+// FetchSingleTask calls runner.v1.RunnerService.FetchSingleTask.
+func (c *runnerServiceClient) FetchSingleTask(ctx context.Context, req 
*connect.Request[v1.FetchSingleTaskRequest]) 
(*connect.Response[v1.FetchSingleTaskResponse], error) {
+       return c.fetchSingleTask.CallUnary(ctx, req)
+}
+
 // UpdateTask calls runner.v1.RunnerService.UpdateTask.
 func (c *runnerServiceClient) UpdateTask(ctx context.Context, req 
*connect.Request[v1.UpdateTaskRequest]) 
(*connect.Response[v1.UpdateTaskResponse], error) {
        return c.updateTask.CallUnary(ctx, req)
@@ -155,6 +173,8 @@
        Declare(context.Context, *connect.Request[v1.DeclareRequest]) 
(*connect.Response[v1.DeclareResponse], error)
        // FetchTask requests the next available task for execution.
        FetchTask(context.Context, *connect.Request[v1.FetchTaskRequest]) 
(*connect.Response[v1.FetchTaskResponse], error)
+       // FetchSingleTask asks for a single task for execution.
+       FetchSingleTask(context.Context, 
*connect.Request[v1.FetchSingleTaskRequest]) 
(*connect.Response[v1.FetchSingleTaskResponse], error)
        // UpdateTask updates the task status.
        UpdateTask(context.Context, *connect.Request[v1.UpdateTaskRequest]) 
(*connect.Response[v1.UpdateTaskResponse], error)
        // UpdateLog uploads log of the task.
@@ -185,6 +205,12 @@
                connect.WithSchema(runnerServiceFetchTaskMethodDescriptor),
                connect.WithHandlerOptions(opts...),
        )
+       runnerServiceFetchSingleTaskHandler := connect.NewUnaryHandler(
+               RunnerServiceFetchSingleTaskProcedure,
+               svc.FetchSingleTask,
+               
connect.WithSchema(runnerServiceFetchSingleTaskMethodDescriptor),
+               connect.WithHandlerOptions(opts...),
+       )
        runnerServiceUpdateTaskHandler := connect.NewUnaryHandler(
                RunnerServiceUpdateTaskProcedure,
                svc.UpdateTask,
@@ -205,6 +231,8 @@
                        runnerServiceDeclareHandler.ServeHTTP(w, r)
                case RunnerServiceFetchTaskProcedure:
                        runnerServiceFetchTaskHandler.ServeHTTP(w, r)
+               case RunnerServiceFetchSingleTaskProcedure:
+                       runnerServiceFetchSingleTaskHandler.ServeHTTP(w, r)
                case RunnerServiceUpdateTaskProcedure:
                        runnerServiceUpdateTaskHandler.ServeHTTP(w, r)
                case RunnerServiceUpdateLogProcedure:
@@ -230,6 +258,10 @@
        return nil, connect.NewError(connect.CodeUnimplemented, 
errors.New("runner.v1.RunnerService.FetchTask is not implemented"))
 }
 
+func (UnimplementedRunnerServiceHandler) FetchSingleTask(context.Context, 
*connect.Request[v1.FetchSingleTaskRequest]) 
(*connect.Response[v1.FetchSingleTaskResponse], error) {
+       return nil, connect.NewError(connect.CodeUnimplemented, 
errors.New("runner.v1.RunnerService.FetchSingleTask is not implemented"))
+}
+
 func (UnimplementedRunnerServiceHandler) UpdateTask(context.Context, 
*connect.Request[v1.UpdateTaskRequest]) 
(*connect.Response[v1.UpdateTaskResponse], error) {
        return nil, connect.NewError(connect.CodeUnimplemented, 
errors.New("runner.v1.RunnerService.UpdateTask is not implemented"))
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/code.forgejo.org/forgejo/actions-proto/runner/v1/services.pb.go 
new/vendor/code.forgejo.org/forgejo/actions-proto/runner/v1/services.pb.go
--- old/vendor/code.forgejo.org/forgejo/actions-proto/runner/v1/services.pb.go  
2026-03-26 09:17:45.000000000 +0100
+++ new/vendor/code.forgejo.org/forgejo/actions-proto/runner/v1/services.pb.go  
2026-04-07 15:49:09.000000000 +0200
@@ -26,7 +26,7 @@
        0x69, 0x63, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 
0x72, 0x75, 0x6e, 0x6e,
        0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x18, 0x72, 0x75, 0x6e, 0x6e, 0x65, 
0x72, 0x2f, 0x76, 0x31,
        0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x70, 0x72, 
0x6f, 0x74, 0x6f, 0x32,
-       0xfb, 0x02, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x53, 0x65, 
0x72, 0x76, 0x69, 0x63,
+       0xd7, 0x03, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x53, 0x65, 
0x72, 0x76, 0x69, 0x63,
        0x65, 0x12, 0x45, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 
0x72, 0x12, 0x1a, 0x2e,
        0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 
0x67, 0x69, 0x73, 0x74,
        0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 
0x72, 0x75, 0x6e, 0x6e,
@@ -40,57 +40,67 @@
        0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x54, 
0x61, 0x73, 0x6b, 0x52,
        0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x72, 0x75, 0x6e, 
0x6e, 0x65, 0x72, 0x2e,
        0x76, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 
0x52, 0x65, 0x73, 0x70,
-       0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x55, 0x70, 
0x64, 0x61, 0x74, 0x65,
-       0x54, 0x61, 0x73, 0x6b, 0x12, 0x1c, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 
0x72, 0x2e, 0x76, 0x31,
-       0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 
0x65, 0x71, 0x75, 0x65,
-       0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 
0x76, 0x31, 0x2e, 0x55,
-       0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 
0x70, 0x6f, 0x6e, 0x73,
-       0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 
0x65, 0x4c, 0x6f, 0x67,
-       0x12, 0x1b, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 
0x2e, 0x55, 0x70, 0x64,
-       0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 
0x74, 0x1a, 0x1c, 0x2e,
-       0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 
0x64, 0x61, 0x74, 0x65,
-       0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 
0x00, 0x42, 0x9e, 0x01,
-       0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 
0x2e, 0x76, 0x31, 0x42,
-       0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x50, 0x72, 0x6f, 
0x74, 0x6f, 0x50, 0x01,
-       0x5a, 0x39, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x67, 0x65, 
0x6a, 0x6f, 0x2e, 0x6f,
-       0x72, 0x67, 0x2f, 0x66, 0x6f, 0x72, 0x67, 0x65, 0x6a, 0x6f, 0x2f, 0x61, 
0x63, 0x74, 0x69, 0x6f,
-       0x6e, 0x73, 0x2d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x75, 0x6e, 
0x6e, 0x65, 0x72, 0x2f,
-       0x76, 0x31, 0x3b, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x76, 0x31, 0xa2, 
0x02, 0x03, 0x52, 0x58,
-       0x58, 0xaa, 0x02, 0x09, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x56, 
0x31, 0xca, 0x02, 0x09,
-       0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x15, 
0x52, 0x75, 0x6e, 0x6e,
-       0x65, 0x72, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 
0x61, 0x64, 0x61, 0x74,
-       0x61, 0xea, 0x02, 0x0a, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x3a, 0x3a, 
0x56, 0x31, 0x62, 0x06,
-       0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+       0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x46, 0x65, 
0x74, 0x63, 0x68, 0x53,
+       0x69, 0x6e, 0x67, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x21, 0x2e, 
0x72, 0x75, 0x6e, 0x6e,
+       0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x53, 
0x69, 0x6e, 0x67, 0x6c,
+       0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 
0x1a, 0x22, 0x2e, 0x72,
+       0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x74, 
0x63, 0x68, 0x53, 0x69,
+       0x6e, 0x67, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 
0x6f, 0x6e, 0x73, 0x65,
+       0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 
0x54, 0x61, 0x73, 0x6b,
+       0x12, 0x1c, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 
0x2e, 0x55, 0x70, 0x64,
+       0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 
0x73, 0x74, 0x1a, 0x1d,
+       0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 
0x70, 0x64, 0x61, 0x74,
+       0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 
0x65, 0x22, 0x00, 0x12,
+       0x48, 0x0a, 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 
0x12, 0x1b, 0x2e, 0x72,
+       0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 
0x61, 0x74, 0x65, 0x4c,
+       0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 
0x72, 0x75, 0x6e, 0x6e,
+       0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 
0x4c, 0x6f, 0x67, 0x52,
+       0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x9e, 0x01, 
0x0a, 0x0d, 0x63, 0x6f,
+       0x6d, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x42, 
0x0d, 0x53, 0x65, 0x72,
+       0x76, 0x69, 0x63, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 
0x5a, 0x39, 0x63, 0x6f,
+       0x64, 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x67, 0x65, 0x6a, 0x6f, 0x2e, 0x6f, 
0x72, 0x67, 0x2f, 0x66,
+       0x6f, 0x72, 0x67, 0x65, 0x6a, 0x6f, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 
0x6e, 0x73, 0x2d, 0x70,
+       0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 
0x76, 0x31, 0x3b, 0x72,
+       0x75, 0x6e, 0x6e, 0x65, 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x58, 
0x58, 0xaa, 0x02, 0x09,
+       0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x09, 
0x52, 0x75, 0x6e, 0x6e,
+       0x65, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x15, 0x52, 0x75, 0x6e, 0x6e, 
0x65, 0x72, 0x5c, 0x56,
+       0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 
0x61, 0xea, 0x02, 0x0a,
+       0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 
0x70, 0x72, 0x6f, 0x74,
+       0x6f, 0x33,
 }
 
 var file_runner_v1_services_proto_goTypes = []interface{}{
-       (*RegisterRequest)(nil),    // 0: runner.v1.RegisterRequest
-       (*DeclareRequest)(nil),     // 1: runner.v1.DeclareRequest
-       (*FetchTaskRequest)(nil),   // 2: runner.v1.FetchTaskRequest
-       (*UpdateTaskRequest)(nil),  // 3: runner.v1.UpdateTaskRequest
-       (*UpdateLogRequest)(nil),   // 4: runner.v1.UpdateLogRequest
-       (*RegisterResponse)(nil),   // 5: runner.v1.RegisterResponse
-       (*DeclareResponse)(nil),    // 6: runner.v1.DeclareResponse
-       (*FetchTaskResponse)(nil),  // 7: runner.v1.FetchTaskResponse
-       (*UpdateTaskResponse)(nil), // 8: runner.v1.UpdateTaskResponse
-       (*UpdateLogResponse)(nil),  // 9: runner.v1.UpdateLogResponse
+       (*RegisterRequest)(nil),         // 0: runner.v1.RegisterRequest
+       (*DeclareRequest)(nil),          // 1: runner.v1.DeclareRequest
+       (*FetchTaskRequest)(nil),        // 2: runner.v1.FetchTaskRequest
+       (*FetchSingleTaskRequest)(nil),  // 3: runner.v1.FetchSingleTaskRequest
+       (*UpdateTaskRequest)(nil),       // 4: runner.v1.UpdateTaskRequest
+       (*UpdateLogRequest)(nil),        // 5: runner.v1.UpdateLogRequest
+       (*RegisterResponse)(nil),        // 6: runner.v1.RegisterResponse
+       (*DeclareResponse)(nil),         // 7: runner.v1.DeclareResponse
+       (*FetchTaskResponse)(nil),       // 8: runner.v1.FetchTaskResponse
+       (*FetchSingleTaskResponse)(nil), // 9: runner.v1.FetchSingleTaskResponse
+       (*UpdateTaskResponse)(nil),      // 10: runner.v1.UpdateTaskResponse
+       (*UpdateLogResponse)(nil),       // 11: runner.v1.UpdateLogResponse
 }
 var file_runner_v1_services_proto_depIdxs = []int32{
-       0, // 0: runner.v1.RunnerService.Register:input_type -> 
runner.v1.RegisterRequest
-       1, // 1: runner.v1.RunnerService.Declare:input_type -> 
runner.v1.DeclareRequest
-       2, // 2: runner.v1.RunnerService.FetchTask:input_type -> 
runner.v1.FetchTaskRequest
-       3, // 3: runner.v1.RunnerService.UpdateTask:input_type -> 
runner.v1.UpdateTaskRequest
-       4, // 4: runner.v1.RunnerService.UpdateLog:input_type -> 
runner.v1.UpdateLogRequest
-       5, // 5: runner.v1.RunnerService.Register:output_type -> 
runner.v1.RegisterResponse
-       6, // 6: runner.v1.RunnerService.Declare:output_type -> 
runner.v1.DeclareResponse
-       7, // 7: runner.v1.RunnerService.FetchTask:output_type -> 
runner.v1.FetchTaskResponse
-       8, // 8: runner.v1.RunnerService.UpdateTask:output_type -> 
runner.v1.UpdateTaskResponse
-       9, // 9: runner.v1.RunnerService.UpdateLog:output_type -> 
runner.v1.UpdateLogResponse
-       5, // [5:10] is the sub-list for method output_type
-       0, // [0:5] is the sub-list for method input_type
-       0, // [0:0] is the sub-list for extension type_name
-       0, // [0:0] is the sub-list for extension extendee
-       0, // [0:0] is the sub-list for field type_name
+       0,  // 0: runner.v1.RunnerService.Register:input_type -> 
runner.v1.RegisterRequest
+       1,  // 1: runner.v1.RunnerService.Declare:input_type -> 
runner.v1.DeclareRequest
+       2,  // 2: runner.v1.RunnerService.FetchTask:input_type -> 
runner.v1.FetchTaskRequest
+       3,  // 3: runner.v1.RunnerService.FetchSingleTask:input_type -> 
runner.v1.FetchSingleTaskRequest
+       4,  // 4: runner.v1.RunnerService.UpdateTask:input_type -> 
runner.v1.UpdateTaskRequest
+       5,  // 5: runner.v1.RunnerService.UpdateLog:input_type -> 
runner.v1.UpdateLogRequest
+       6,  // 6: runner.v1.RunnerService.Register:output_type -> 
runner.v1.RegisterResponse
+       7,  // 7: runner.v1.RunnerService.Declare:output_type -> 
runner.v1.DeclareResponse
+       8,  // 8: runner.v1.RunnerService.FetchTask:output_type -> 
runner.v1.FetchTaskResponse
+       9,  // 9: runner.v1.RunnerService.FetchSingleTask:output_type -> 
runner.v1.FetchSingleTaskResponse
+       10, // 10: runner.v1.RunnerService.UpdateTask:output_type -> 
runner.v1.UpdateTaskResponse
+       11, // 11: runner.v1.RunnerService.UpdateLog:output_type -> 
runner.v1.UpdateLogResponse
+       6,  // [6:12] is the sub-list for method output_type
+       0,  // [0:6] is the sub-list for method input_type
+       0,  // [0:0] is the sub-list for extension type_name
+       0,  // [0:0] is the sub-list for extension extendee
+       0,  // [0:0] is the sub-list for field type_name
 }
 
 func init() { file_runner_v1_services_proto_init() }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/decoder.go 
new/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/decoder.go
--- old/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/decoder.go   
2026-03-26 09:17:46.000000000 +0100
+++ new/vendor/github.com/go-git/go-git/v5/plumbing/format/idxfile/decoder.go   
2026-04-07 15:49:10.000000000 +0200
@@ -91,8 +91,8 @@
                return err
        }
 
-       if v > VersionSupported {
-               return ErrUnsupportedVersion
+       if v != VersionSupported {
+               return fmt.Errorf("%w: v%d", ErrUnsupportedVersion, v)
        }
 
        idx.Version = v
@@ -106,6 +106,10 @@
                        return err
                }
 
+               if k > 0 && n < idx.Fanout[k-1] {
+                       return fmt.Errorf("%w: fanout table is not 
monotonically non-decreasing at entry %d", ErrMalformedIdxFile, k)
+               }
+
                idx.Fanout[k] = n
                idx.FanoutMapping[k] = noMapping
        }
@@ -155,7 +159,7 @@
 }
 
 func readOffsets(idx *MemoryIndex, r io.Reader) error {
-       var o64cnt int
+       var o64cnt int64
        for k := 0; k < fanout; k++ {
                if pos := idx.FanoutMapping[k]; pos != noMapping {
                        if _, err := io.ReadFull(r, idx.Offset32[pos]); err != 
nil {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/github.com/go-git/go-git/v5/plumbing/format/index/decoder.go 
new/vendor/github.com/go-git/go-git/v5/plumbing/format/index/decoder.go
--- old/vendor/github.com/go-git/go-git/v5/plumbing/format/index/decoder.go     
2026-03-26 09:17:46.000000000 +0100
+++ new/vendor/github.com/go-git/go-git/v5/plumbing/format/index/decoder.go     
2026-04-07 15:49:10.000000000 +0200
@@ -4,8 +4,8 @@
        "bufio"
        "bytes"
        "errors"
+       "fmt"
        "io"
-
        "strconv"
        "time"
 
@@ -26,12 +26,14 @@
        ErrInvalidChecksum = errors.New("invalid checksum")
        // ErrUnknownExtension is returned when an index extension is 
encountered that is considered mandatory
        ErrUnknownExtension = errors.New("unknown extension")
+       // ErrMalformedIndexFile is returned when the index file contents are
+       // structurally invalid.
+       ErrMalformedIndexFile = errors.New("index decoder: malformed index 
file")
 )
 
 const (
        entryHeaderLength = 62
        entryExtended     = 0x4000
-       entryValid        = 0x8000
        nameMask          = 0xfff
        intentToAddMask   = 1 << 13
        skipWorkTreeMask  = 1 << 14
@@ -140,33 +142,55 @@
                e.SkipWorktree = extended&skipWorkTreeMask != 0
        }
 
-       if err := d.readEntryName(idx, e, flags); err != nil {
+       nameConsumed, err := d.readEntryName(idx, e, flags)
+       if err != nil {
                return nil, err
        }
 
-       return e, d.padEntry(idx, e, read)
+       return e, d.padEntry(idx, e, read, nameConsumed)
 }
 
-func (d *Decoder) readEntryName(idx *Index, e *Entry, flags uint16) error {
-       var name string
-       var err error
-
+// readEntryName reads the entry path and sets e.Name. It returns the
+// number of bytes consumed from the stream for the name portion.
+func (d *Decoder) readEntryName(idx *Index, e *Entry, flags uint16) (int, 
error) {
        switch idx.Version {
        case 2, 3:
-               len := flags & nameMask
-               name, err = d.doReadEntryName(len)
+               nameLen := flags & nameMask
+               name, consumed, err := d.doReadEntryName(nameLen)
+               if err != nil {
+                       return 0, err
+               }
+               e.Name = name
+               return consumed, nil
        case 4:
-               name, err = d.doReadEntryNameV4()
+               name, err := d.doReadEntryNameV4()
+               if err != nil {
+                       return 0, err
+               }
+               e.Name = name
+               return 0, nil // V4 has no padding; consumed count unused
        default:
-               return ErrUnsupportedVersion
+               return 0, ErrUnsupportedVersion
        }
+}
 
-       if err != nil {
-               return err
+// doReadEntryName reads the entry path for V2/V3 indexes. It returns the
+// name, the number of bytes consumed from the stream, and any error.
+// When nameLen equals nameMask (0xFFF), the name was too long to fit in
+// the 12-bit field and the real length is found by scanning for the NUL
+// terminator — matching C Git's strlen(name) fallback in create_from_disk.
+func (d *Decoder) doReadEntryName(nameLen uint16) (string, int, error) {
+       if nameLen == nameMask {
+               name, err := binary.ReadUntil(d.r, '\x00')
+               if err != nil {
+                       return "", 0, err
+               }
+               return string(name), len(name) + 1, nil // +1 for the consumed 
NUL delimiter
        }
 
-       e.Name = name
-       return nil
+       name := make([]byte, nameLen)
+       _, err := io.ReadFull(d.r, name)
+       return string(name), int(nameLen), err
 }
 
 func (d *Decoder) doReadEntryNameV4() (string, error) {
@@ -177,7 +201,14 @@
 
        var base string
        if d.lastEntry != nil {
+               if l < 0 || int(l) > len(d.lastEntry.Name) {
+                       return "", fmt.Errorf("%w: invalid V4 entry name strip 
length %d (previous name length: %d)",
+                               ErrMalformedIndexFile, l, len(d.lastEntry.Name))
+               }
                base = d.lastEntry.Name[:len(d.lastEntry.Name)-int(l)]
+       } else if l > 0 {
+               return "", fmt.Errorf("%w: non-zero strip length %d on first V4 
entry",
+                       ErrMalformedIndexFile, l)
        }
 
        name, err := binary.ReadUntil(d.r, '\x00')
@@ -188,24 +219,23 @@
        return base + string(name), nil
 }
 
-func (d *Decoder) doReadEntryName(len uint16) (string, error) {
-       name := make([]byte, len)
-       _, err := io.ReadFull(d.r, name)
-
-       return string(name), err
-}
-
-// Index entries are padded out to the next 8 byte alignment
-// for historical reasons related to how C Git read the files.
-func (d *Decoder) padEntry(idx *Index, e *Entry, read int) error {
+// padEntry discards NUL padding bytes that follow each V2/V3 entry on
+// disk. nameConsumed is the number of stream bytes consumed while reading
+// the entry name (which may exceed len(e.Name) when a NUL terminator was
+// consumed for long names where the 12-bit length field overflowed).
+func (d *Decoder) padEntry(idx *Index, e *Entry, read, nameConsumed int) error 
{
        if idx.Version == 4 {
                return nil
        }
 
        entrySize := read + len(e.Name)
        padLen := 8 - entrySize%8
-       _, err := io.CopyN(io.Discard, d.r, int64(padLen))
-       return err
+       padLen -= nameConsumed - len(e.Name)
+       if padLen > 0 {
+               _, err := io.CopyN(io.Discard, d.r, int64(padLen))
+               return err
+       }
+       return nil
 }
 
 func (d *Decoder) readExtensions(idx *Index) error {
@@ -312,7 +342,7 @@
 }
 
 func validateHeader(r io.Reader) (version uint32, err error) {
-       var s = make([]byte, 4)
+       s := make([]byte, 4)
        if _, err := io.ReadFull(r, s); err != nil {
                return 0, err
        }
@@ -376,24 +406,26 @@
                return nil, err
        }
 
-       // An entry can be in an invalidated state and is represented by having 
a
-       // negative number in the entry_count field.
-       if i == -1 {
-               return nil, nil
-       }
-
        e.Entries = i
        trees, err := binary.ReadUntil(d.r, '\n')
        if err != nil {
                return nil, err
        }
 
-       i, err = strconv.Atoi(string(trees))
+       subtrees, err := strconv.Atoi(string(trees))
        if err != nil {
                return nil, err
        }
 
-       e.Trees = i
+       e.Trees = subtrees
+
+       // An entry can be in an invalidated state and is represented by having 
a
+       // negative number in the entry_count field. In this case, there is no
+       // object name and the next entry starts immediately after the newline.
+       if i < 0 {
+               return nil, nil
+       }
+
        _, err = io.ReadFull(d.r, e.Hash[:])
        if err != nil {
                return nil, err
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/github.com/go-git/go-git/v5/plumbing/format/index/encoder.go 
new/vendor/github.com/go-git/go-git/v5/plumbing/format/index/encoder.go
--- old/vendor/github.com/go-git/go-git/v5/plumbing/format/index/encoder.go     
2026-03-26 09:17:46.000000000 +0100
+++ new/vendor/github.com/go-git/go-git/v5/plumbing/format/index/encoder.go     
2026-04-07 15:49:10.000000000 +0200
@@ -5,9 +5,7 @@
        "errors"
        "fmt"
        "io"
-       "path"
        "sort"
-       "strings"
        "time"
 
        "github.com/go-git/go-git/v5/plumbing/hash"
@@ -160,26 +158,39 @@
 }
 
 func (e *Encoder) encodeEntryNameV4(entry *Entry) error {
-       name := entry.Name
-       l := 0
+       // V4 prefix compression: find the longest common prefix between the
+       // previous entry's name and the current one. The strip length tells
+       // the decoder how many bytes to remove from the end of the previous
+       // name, and the suffix is the remainder of the current name.
+       prefix := 0
        if e.lastEntry != nil {
-               dir := path.Dir(e.lastEntry.Name) + "/"
-               if strings.HasPrefix(entry.Name, dir) {
-                       l = len(e.lastEntry.Name) - len(dir)
-                       name = strings.TrimPrefix(entry.Name, dir)
-               } else {
-                       l = len(e.lastEntry.Name)
-               }
+               prefix = commonPrefixLen(e.lastEntry.Name, entry.Name)
+       }
+       stripLen := 0
+       if e.lastEntry != nil {
+               stripLen = len(e.lastEntry.Name) - prefix
        }
 
        e.lastEntry = entry
 
-       err := binary.WriteVariableWidthInt(e.w, int64(l))
-       if err != nil {
+       if err := binary.WriteVariableWidthInt(e.w, int64(stripLen)); err != 
nil {
                return err
        }
 
-       return binary.Write(e.w, []byte(name+string('\x00')))
+       suffix := entry.Name[prefix:]
+       return binary.Write(e.w, append([]byte(suffix), '\x00'))
+}
+
+// commonPrefixLen returns the length of the longest common byte prefix
+// between a and b.
+func commonPrefixLen(a, b string) int {
+       n := min(len(b), len(a))
+       for i := range n {
+               if a[i] != b[i] {
+                       return i
+               }
+       }
+       return n
 }
 
 func (e *Encoder) encodeRawExtension(signature string, data []byte) error {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/modules.txt new/vendor/modules.txt
--- old/vendor/modules.txt      2026-03-26 09:17:46.000000000 +0100
+++ new/vendor/modules.txt      2026-04-07 15:49:10.000000000 +0200
@@ -1,4 +1,4 @@
-# code.forgejo.org/forgejo/actions-proto v0.6.0
+# code.forgejo.org/forgejo/actions-proto v0.7.0
 ## explicit; go 1.24.0
 code.forgejo.org/forgejo/actions-proto/ping/v1
 code.forgejo.org/forgejo/actions-proto/ping/v1/pingv1connect
@@ -204,7 +204,7 @@
 github.com/go-git/go-billy/v5/memfs
 github.com/go-git/go-billy/v5/osfs
 github.com/go-git/go-billy/v5/util
-# github.com/go-git/go-git/v5 v5.17.0
+# github.com/go-git/go-git/v5 v5.17.1
 ## explicit; go 1.24.0
 github.com/go-git/go-git/v5
 github.com/go-git/go-git/v5/config

Reply via email to