Repository: argoproj/argo
Pull request #2352 (2020-03-03 23:34:48)

feat: Add `argo stop` command
Closes: #1405

Adds a new `argo stop` command that will stop execution by failing all running nodes. This command will still run all outstanding `onExit` handlers (both at `DAGTask`/`Step`-level and `Workflow`-level) – contrasted with `argo terminate`.

~Still needs testing.~ Ready for review

evetion: Would love to see this merged. At the moment we "implemented" this by killing the pod in the workflow with the label `workflows.argoproj.io/completed==false`. This will trigger the workflow as `failed` and trigger the `onExit` handler. @avgils
simster7: @evetion That is a clever workaround! Hopefully this will standardize that for you 
codecov[bot]: # [Codecov](https://codecov.io/gh/argoproj/argo/pull/2352?src=pr&el=h1) Report
> Merging [#2352](https://codecov.io/gh/argoproj/argo/pull/2352?src=pr&el=desc) into [master](https://codecov.io/gh/argoproj/argo/commit/9743831306714cc85b762487ac070f77e25f85d6?src=pr&el=desc) will **decrease** coverage by `<.01%`.
> The diff coverage is `31.42%`.

[![Impacted file tree graph](https://codecov.io/gh/argoproj/argo/pull/2352/graphs/tree.svg?width=650&token=4c3DPSTq8o&height=150&src=pr)](https://codecov.io/gh/argoproj/argo/pull/2352?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master    #2352      +/-   ##
==========================================
- Coverage   13.28%   13.27%   -0.01%     
==========================================
  Files          72       73       +1     
  Lines       24653    24689      +36     
==========================================
+ Hits         3274     3278       +4     
- Misses      20966    21000      +34     
+ Partials      413      411       -2
```


| [Impacted Files](https://codecov.io/gh/argoproj/argo/pull/2352?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [pkg/apis/workflow/v1alpha1/workflow\_types.go](https://codecov.io/gh/argoproj/argo/pull/2352/diff?src=pr&el=tree#diff-cGtnL2FwaXMvd29ya2Zsb3cvdjFhbHBoYTEvd29ya2Zsb3dfdHlwZXMuZ28=) | `8.43% <ø> (+0.19%)` | :arrow_up: |
| [cmd/argo/commands/stop.go](https://codecov.io/gh/argoproj/argo/pull/2352/diff?src=pr&el=tree#diff-Y21kL2FyZ28vY29tbWFuZHMvc3RvcC5nbw==) | `0% <0%> (ø)` | |
| [cmd/argo/commands/root.go](https://codecov.io/gh/argoproj/argo/pull/2352/diff?src=pr&el=tree#diff-Y21kL2FyZ28vY29tbWFuZHMvcm9vdC5nbw==) | `0% <0%> (ø)` | :arrow_up: |
| [server/workflow/workflow\_server.go](https://codecov.io/gh/argoproj/argo/pull/2352/diff?src=pr&el=tree#diff-c2VydmVyL3dvcmtmbG93L3dvcmtmbG93X3NlcnZlci5nbw==) | `31.72% <0%> (-1.62%)` | :arrow_down: |
| [pkg/apis/workflow/v1alpha1/generated.pb.go](https://codecov.io/gh/argoproj/argo/pull/2352/diff?src=pr&el=tree#diff-cGtnL2FwaXMvd29ya2Zsb3cvdjFhbHBoYTEvZ2VuZXJhdGVkLnBiLmdv) | `0.45% <0%> (-0.01%)` | :arrow_down: |
| [workflow/controller/exec\_control.go](https://codecov.io/gh/argoproj/argo/pull/2352/diff?src=pr&el=tree#diff-d29ya2Zsb3cvY29udHJvbGxlci9leGVjX2NvbnRyb2wuZ28=) | `25.84% <0%> (-2.21%)` | :arrow_down: |
| [workflow/controller/steps.go](https://codecov.io/gh/argoproj/argo/pull/2352/diff?src=pr&el=tree#diff-d29ya2Zsb3cvY29udHJvbGxlci9zdGVwcy5nbw==) | `60.46% <100%> (ø)` | :arrow_up: |
| [workflow/controller/dag.go](https://codecov.io/gh/argoproj/argo/pull/2352/diff?src=pr&el=tree#diff-d29ya2Zsb3cvY29udHJvbGxlci9kYWcuZ28=) | `58.09% <100%> (ø)` | :arrow_up: |
| [workflow/controller/workflowpod.go](https://codecov.io/gh/argoproj/argo/pull/2352/diff?src=pr&el=tree#diff-d29ya2Zsb3cvY29udHJvbGxlci93b3JrZmxvd3BvZC5nbw==) | `72.79% <100%> (+1.67%)` | :arrow_up: |
| [workflow/util/util.go](https://codecov.io/gh/argoproj/argo/pull/2352/diff?src=pr&el=tree#diff-d29ya2Zsb3cvdXRpbC91dGlsLmdv) | `15.59% <5%> (-0.46%)` | :arrow_down: |
| ... and [8 more](https://codecov.io/gh/argoproj/argo/pull/2352/diff?src=pr&el=tree-more) | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/argoproj/argo/pull/2352?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/argoproj/argo/pull/2352?src=pr&el=footer). Last update [9743831...85a5650](https://codecov.io/gh/argoproj/argo/pull/2352?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

mark9white: Should this be a flag on terminate rather than a separate command?
simster7: > Should this be a flag on terminate rather than a separate command?

I have no strong opinions either way
alexec: What does `kubectl delete` do for graceful vs non-graceful.
simster7: > What does `kubectl delete` do for graceful vs non-graceful.

Do you mean `kubectl delete wf` or `kubectl delete pod`?
simster7: I've renamed this to `argo fail` to better reflect what the command does and to fit nicely with #1904 
alexec: > > What does `kubectl delete` do for graceful vs non-graceful.
> 
> Do you mean `kubectl delete wf` or `kubectl delete pod`?

or 

```
Usage:	docker stop [OPTIONS] CONTAINER [CONTAINER...]

Stop one or more running containers

Options:
  -t, --time int   Seconds to wait for stop before killing it (default 10)
```

Should we have this under `terminate`?
alexec: ```
argo terminate --fail
```
???
simster7: > Should we have this under terminate?

I am indifferent to this. I think we either have two options:

1. Merge this and #1904 into `argo fail` as they both do abstractly the same thing.
2. Add this as `argo terminate --graceful` or `argo terminate --fail` or similar.

I don't think we should have a standalone `argo stop` anymore. Which one of these do you think?
simster7: I discussed this with @jessesuen and we are considering adding this command and #1904 back into `argo stop`. @jessesuen mentioned that he prefers "stop" over "fail" because it is more flexible (i.e. in the future it could be extended to allow commands such as `argo stop --skip` meaning that the node is stopped, but marked as "Skipped" instead of "Failed"). We are therefore also considering keeping this separate from `argo terminate`.

cc @alexec @mark9white 
alexec: This is quite a big change and I think that @jessesuen has a better handle on this code than I do - so I'd like him to take a look.

Patch:
diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json
index 88b6f0de6..d52fc99cc 100644
--- a/api/openapi-spec/swagger.json
+++ b/api/openapi-spec/swagger.json
@@ -1154,6 +1154,44 @@
         }
       }
     },
+    "/api/v1/workflows/{namespace}/{name}/stop": {
+      "put": {
+        "tags": [
+          "WorkflowService"
+        ],
+        "operationId": "StopWorkflow",
+        "parameters": [
+          {
+            "type": "string",
+            "name": "namespace",
+            "in": "path",
+            "required": true
+          },
+          {
+            "type": "string",
+            "name": "name",
+            "in": "path",
+            "required": true
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.WorkflowStopRequest"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.Workflow"
+            }
+          }
+        }
+      }
+    },
     "/api/v1/workflows/{namespace}/{name}/suspend": {
       "put": {
         "tags": [
@@ -2844,6 +2882,10 @@
           "description": "ServiceAccountName is the name of the ServiceAccount to run all pods of the workflow as.",
           "type": "string"
         },
+        "shutdown": {
+          "type": "string",
+          "title": "Shutdown will shutdown the workflow according to its ShutdownStrategy"
+        },
         "suspend": {
           "type": "boolean",
           "format": "boolean",
@@ -5719,6 +5761,17 @@
         }
       }
     },
+    "io.argoproj.workflow.v1alpha1.WorkflowStopRequest": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string"
+        },
+        "namespace": {
+          "type": "string"
+        }
+      }
+    },
     "io.argoproj.workflow.v1alpha1.WorkflowSuspendRequest": {
       "type": "object",
       "properties": {
diff --git a/cmd/argo/commands/list.go b/cmd/argo/commands/list.go
index 650217f9e..89e533f8d 100644
--- a/cmd/argo/commands/list.go
+++ b/cmd/argo/commands/list.go
@@ -230,7 +230,7 @@ func workflowStatus(wf *wfv1.Workflow) wfv1.NodePhase {
 		}
 		return wf.Status.Phase
 	case wfv1.NodeFailed:
-		if util.IsWorkflowTerminated(wf) {
+		if wf.Spec.Shutdown != "" {
 			return "Failed (Terminated)"
 		}
 		return wf.Status.Phase
diff --git a/cmd/argo/commands/root.go b/cmd/argo/commands/root.go
index 43d4c9f6b..f3dbee61d 100644
--- a/cmd/argo/commands/root.go
+++ b/cmd/argo/commands/root.go
@@ -48,6 +48,7 @@ If you're using the Argo Server (e.g. because you need large workflow support or
 	command.AddCommand(auth.NewAuthCommand())
 	command.AddCommand(NewWaitCommand())
 	command.AddCommand(NewWatchCommand())
+	command.AddCommand(NewStopCommand())
 	command.AddCommand(NewTerminateCommand())
 	command.AddCommand(archive.NewArchiveCommand())
 	command.AddCommand(cmd.NewVersionCmd(CLIName))
diff --git a/cmd/argo/commands/stop.go b/cmd/argo/commands/stop.go
new file mode 100644
index 000000000..ae4008ec8
--- /dev/null
+++ b/cmd/argo/commands/stop.go
@@ -0,0 +1,33 @@
+package commands
+
+import (
+	"fmt"
+
+	"github.com/argoproj/pkg/errors"
+	"github.com/spf13/cobra"
+
+	"github.com/argoproj/argo/cmd/argo/commands/client"
+	workflowpkg "github.com/argoproj/argo/pkg/apiclient/workflow"
+)
+
+func NewStopCommand() *cobra.Command {
+	var command = &cobra.Command{
+		Use:   "stop WORKFLOW WORKFLOW2...",
+		Short: "stop zero or more workflows",
+		Run: func(cmd *cobra.Command, args []string) {
+
+			ctx, apiClient := client.NewAPIClient()
+			serviceClient := apiClient.NewWorkflowServiceClient()
+			namespace := client.Namespace()
+			for _, name := range args {
+				wf, err := serviceClient.StopWorkflow(ctx, &workflowpkg.WorkflowStopRequest{
+					Name:      name,
+					Namespace: namespace,
+				})
+				errors.CheckError(err)
+				fmt.Printf("workflow %s stopped\n", wf.Name)
+			}
+		},
+	}
+	return command
+}
diff --git a/pkg/apiclient/argo-kube-workflow-service-client.go b/pkg/apiclient/argo-kube-workflow-service-client.go
index 6bde5165a..62ec18268 100644
--- a/pkg/apiclient/argo-kube-workflow-service-client.go
+++ b/pkg/apiclient/argo-kube-workflow-service-client.go
@@ -60,6 +60,10 @@ func (c argoKubeWorkflowServiceClient) SuspendWorkflow(ctx context.Context, req
 	return c.delegate.SuspendWorkflow(ctx, req)
 }
 
+func (c argoKubeWorkflowServiceClient) StopWorkflow(ctx context.Context, req *workflowpkg.WorkflowStopRequest, _ ...grpc.CallOption) (*v1alpha1.Workflow, error) {
+	return c.delegate.StopWorkflow(ctx, req)
+}
+
 func (c argoKubeWorkflowServiceClient) TerminateWorkflow(ctx context.Context, req *workflowpkg.WorkflowTerminateRequest, _ ...grpc.CallOption) (*v1alpha1.Workflow, error) {
 	return c.delegate.TerminateWorkflow(ctx, req)
 }
diff --git a/pkg/apiclient/cronworkflow/cron-workflow.swagger.json b/pkg/apiclient/cronworkflow/cron-workflow.swagger.json
index a832b2d8f..74e09df99 100644
--- a/pkg/apiclient/cronworkflow/cron-workflow.swagger.json
+++ b/pkg/apiclient/cronworkflow/cron-workflow.swagger.json
@@ -1710,6 +1710,10 @@
         "metrics": {
           "$ref": "#/definitions/github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.Metrics",
           "title": "Metrics are a list of metrics emitted from this Workflow"
+        },
+        "shutdown": {
+          "type": "string",
+          "title": "Shutdown will shutdown the workflow according to its ShutdownStrategy"
         }
       },
       "description": "WorkflowSpec is the specification of a Workflow."
diff --git a/pkg/apiclient/workflow/workflow.pb.go b/pkg/apiclient/workflow/workflow.pb.go
index 478efcffd..31dcaf9a4 100644
--- a/pkg/apiclient/workflow/workflow.pb.go
+++ b/pkg/apiclient/workflow/workflow.pb.go
@@ -478,6 +478,61 @@ func (m *WorkflowTerminateRequest) GetNamespace() string {
 	return ""
 }
 
+type WorkflowStopRequest struct {
+	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Namespace            string   `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *WorkflowStopRequest) Reset()         { *m = WorkflowStopRequest{} }
+func (m *WorkflowStopRequest) String() string { return proto.CompactTextString(m) }
+func (*WorkflowStopRequest) ProtoMessage()    {}
+func (*WorkflowStopRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_1f6bb75f9e833cb6, []int{7}
+}
+func (m *WorkflowStopRequest) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *WorkflowStopRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_WorkflowStopRequest.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalToSizedBuffer(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *WorkflowStopRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_WorkflowStopRequest.Merge(m, src)
+}
+func (m *WorkflowStopRequest) XXX_Size() int {
+	return m.Size()
+}
+func (m *WorkflowStopRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_WorkflowStopRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_WorkflowStopRequest proto.InternalMessageInfo
+
+func (m *WorkflowStopRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *WorkflowStopRequest) GetNamespace() string {
+	if m != nil {
+		return m.Namespace
+	}
+	return ""
+}
+
 type WorkflowSuspendRequest struct {
 	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
 	Namespace            string   `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"`
@@ -490,7 +545,7 @@ func (m *WorkflowSuspendRequest) Reset()         { *m = WorkflowSuspendRequest{}
 func (m *WorkflowSuspendRequest) String() string { return proto.CompactTextString(m) }
 func (*WorkflowSuspendRequest) ProtoMessage()    {}
 func (*WorkflowSuspendRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_1f6bb75f9e833cb6, []int{7}
+	return fileDescriptor_1f6bb75f9e833cb6, []int{8}
 }
 func (m *WorkflowSuspendRequest) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -547,7 +602,7 @@ func (m *WorkflowLogRequest) Reset()         { *m = WorkflowLogRequest{} }
 func (m *WorkflowLogRequest) String() string { return proto.CompactTextString(m) }
 func (*WorkflowLogRequest) ProtoMessage()    {}
 func (*WorkflowLogRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_1f6bb75f9e833cb6, []int{8}
+	return fileDescriptor_1f6bb75f9e833cb6, []int{9}
 }
 func (m *WorkflowLogRequest) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -617,7 +672,7 @@ func (m *WorkflowDeleteRequest) Reset()         { *m = WorkflowDeleteRequest{} }
 func (m *WorkflowDeleteRequest) String() string { return proto.CompactTextString(m) }
 func (*WorkflowDeleteRequest) ProtoMessage()    {}
 func (*WorkflowDeleteRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_1f6bb75f9e833cb6, []int{9}
+	return fileDescriptor_1f6bb75f9e833cb6, []int{10}
 }
 func (m *WorkflowDeleteRequest) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -677,7 +732,7 @@ func (m *WorkflowDeleteResponse) Reset()         { *m = WorkflowDeleteResponse{}
 func (m *WorkflowDeleteResponse) String() string { return proto.CompactTextString(m) }
 func (*WorkflowDeleteResponse) ProtoMessage()    {}
 func (*WorkflowDeleteResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_1f6bb75f9e833cb6, []int{10}
+	return fileDescriptor_1f6bb75f9e833cb6, []int{11}
 }
 func (m *WorkflowDeleteResponse) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -718,7 +773,7 @@ func (m *WatchWorkflowsRequest) Reset()         { *m = WatchWorkflowsRequest{} }
 func (m *WatchWorkflowsRequest) String() string { return proto.CompactTextString(m) }
 func (*WatchWorkflowsRequest) ProtoMessage()    {}
 func (*WatchWorkflowsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_1f6bb75f9e833cb6, []int{11}
+	return fileDescriptor_1f6bb75f9e833cb6, []int{12}
 }
 func (m *WatchWorkflowsRequest) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -775,7 +830,7 @@ func (m *WorkflowWatchEvent) Reset()         { *m = WorkflowWatchEvent{} }
 func (m *WorkflowWatchEvent) String() string { return proto.CompactTextString(m) }
 func (*WorkflowWatchEvent) ProtoMessage()    {}
 func (*WorkflowWatchEvent) Descriptor() ([]byte, []int) {
-	return fileDescriptor_1f6bb75f9e833cb6, []int{12}
+	return fileDescriptor_1f6bb75f9e833cb6, []int{13}
 }
 func (m *WorkflowWatchEvent) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -830,7 +885,7 @@ func (m *LogEntry) Reset()         { *m = LogEntry{} }
 func (m *LogEntry) String() string { return proto.CompactTextString(m) }
 func (*LogEntry) ProtoMessage()    {}
 func (*LogEntry) Descriptor() ([]byte, []int) {
-	return fileDescriptor_1f6bb75f9e833cb6, []int{13}
+	return fileDescriptor_1f6bb75f9e833cb6, []int{14}
 }
 func (m *LogEntry) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -885,7 +940,7 @@ func (m *WorkflowLintRequest) Reset()         { *m = WorkflowLintRequest{} }
 func (m *WorkflowLintRequest) String() string { return proto.CompactTextString(m) }
 func (*WorkflowLintRequest) ProtoMessage()    {}
 func (*WorkflowLintRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_1f6bb75f9e833cb6, []int{14}
+	return fileDescriptor_1f6bb75f9e833cb6, []int{15}
 }
 func (m *WorkflowLintRequest) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -936,6 +991,7 @@ func init() {
 	proto.RegisterType((*WorkflowRetryRequest)(nil), "workflow.WorkflowRetryRequest")
 	proto.RegisterType((*WorkflowResumeRequest)(nil), "workflow.WorkflowResumeRequest")
 	proto.RegisterType((*WorkflowTerminateRequest)(nil), "workflow.WorkflowTerminateRequest")
+	proto.RegisterType((*WorkflowStopRequest)(nil), "workflow.WorkflowStopRequest")
 	proto.RegisterType((*WorkflowSuspendRequest)(nil), "workflow.WorkflowSuspendRequest")
 	proto.RegisterType((*WorkflowLogRequest)(nil), "workflow.WorkflowLogRequest")
 	proto.RegisterType((*WorkflowDeleteRequest)(nil), "workflow.WorkflowDeleteRequest")
@@ -951,76 +1007,78 @@ func init() {
 }
 
 var fileDescriptor_1f6bb75f9e833cb6 = []byte{
-	// 1095 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x98, 0xdf, 0x6e, 0xdc, 0xc4,
-	0x17, 0xc7, 0x35, 0x49, 0x7e, 0xe9, 0x66, 0xd2, 0x6c, 0x7f, 0x0c, 0x50, 0x56, 0x56, 0xba, 0x4d,
-	0x07, 0x02, 0x51, 0xda, 0xd8, 0xd9, 0xa4, 0x40, 0xa9, 0x54, 0xa4, 0x92, 0x54, 0xa1, 0x68, 0x05,
-	0x95, 0x0b, 0x42, 0xe5, 0xce, 0xeb, 0x9d, 0x38, 0x6e, 0xec, 0x19, 0x63, 0xcf, 0x6e, 0xb5, 0x54,
-	0x01, 0xc1, 0x25, 0x17, 0xdc, 0x70, 0x83, 0xe0, 0x06, 0x09, 0x90, 0x90, 0x90, 0xf8, 0xf3, 0x16,
-	0x5c, 0x22, 0xf1, 0x02, 0x28, 0x42, 0xe2, 0x35, 0xd0, 0x8c, 0x3d, 0x63, 0x3b, 0xbb, 0x2c, 0x26,
-	0xae, 0xd4, 0xbb, 0x19, 0x8f, 0xe7, 0x7c, 0x3f, 0x3e, 0xe7, 0xcc, 0x9c, 0xb3, 0x0b, 0x57, 0xa3,
-	0x43, 0xcf, 0x72, 0x22, 0xdf, 0x0d, 0x7c, 0x42, 0xb9, 0xf5, 0x80, 0xc5, 0x87, 0xfb, 0x01, 0x7b,
-	0xa0, 0x07, 0x66, 0x14, 0x33, 0xce, 0x50, 0x43, 0xcd, 0x8d, 0x0d, 0xcf, 0xe7, 0x07, 0x83, 0x9e,
-	0xe9, 0xb2, 0xd0, 0xf2, 0x98, 0xc7, 0x2c, 0xf9, 0x42, 0x6f, 0xb0, 0x2f, 0x67, 0x72, 0x22, 0x47,
-	0xe9, 0x46, 0x63, 0xd9, 0x63, 0xcc, 0x0b, 0x88, 0x90, 0xb0, 0x1c, 0x4a, 0x19, 0x77, 0xb8, 0xcf,
-	0x68, 0x92, 0xad, 0x5e, 0x3d, 0xbc, 0x96, 0x98, 0x3e, 0x13, 0xab, 0xa1, 0xe3, 0x1e, 0xf8, 0x94,
-	0xc4, 0x23, 0x2b, 0x23, 0x4a, 0xac, 0x90, 0x70, 0xc7, 0x1a, 0x76, 0x2c, 0x8f, 0x50, 0x12, 0x3b,
-	0x9c, 0xf4, 0xb3, 0x5d, 0x3b, 0x05, 0x04, 0x27, 0x96, 0xa2, 0xf7, 0xe5, 0x20, 0xdf, 0xaa, 0xbf,
-	0x63, 0xd8, 0x71, 0x82, 0xe8, 0xc0, 0x19, 0x37, 0x82, 0x73, 0x69, 0xcb, 0x65, 0x31, 0x99, 0x20,
-	0x84, 0x7f, 0x9a, 0x81, 0x4f, 0xbf, 0x9b, 0x59, 0xda, 0x89, 0x89, 0xc3, 0x89, 0x4d, 0xde, 0x1f,
-	0x90, 0x84, 0xa3, 0x65, 0xb8, 0x40, 0x9d, 0x90, 0x24, 0x91, 0xe3, 0x92, 0x16, 0x58, 0x01, 0x6b,
-	0x0b, 0x76, 0xfe, 0x00, 0xdd, 0x83, 0xda, 0x5f, 0xad, 0x99, 0x15, 0xb0, 0xb6, 0xb8, 0x75, 0xc3,
-	0xcc, 0x99, 0x4d, 0xc5, 0x2c, 0x07, 0x66, 0x74, 0xe8, 0x99, 0x82, 0xd9, 0xd4, 0x2e, 0x57, 0xcc,
-	0xa6, 0xd2, 0xb6, 0xb5, 0x39, 0xd4, 0x86, 0xd0, 0xa7, 0x09, 0x77, 0xa8, 0x4b, 0x6e, 0xef, 0xb6,
-	0x66, 0xa5, 0x72, 0xe1, 0x09, 0xc2, 0xf0, 0x6c, 0x42, 0xe2, 0x21, 0x89, 0x77, 0xe3, 0x91, 0x3d,
-	0xa0, 0xad, 0xb9, 0x15, 0xb0, 0xd6, 0xb0, 0x4b, 0xcf, 0xd0, 0x3d, 0xb8, 0xe4, 0xca, 0xaf, 0x79,
-	0x2b, 0x92, 0xc1, 0x68, 0xfd, 0x4f, 0x32, 0x6e, 0x9b, 0xa9, 0x4b, 0xcc, 0x62, 0x34, 0x72, 0x3c,
-	0x11, 0x0d, 0x73, 0xd8, 0x31, 0x77, 0x8a, 0x5b, 0xed, 0xb2, 0x25, 0xfc, 0x33, 0x80, 0x48, 0x51,
-	0xef, 0x11, 0xae, 0xdc, 0x85, 0xe0, 0x9c, 0xf0, 0x4e, 0xe6, 0x29, 0x39, 0x2e, 0xbb, 0x70, 0xe6,
-	0xa4, 0x0b, 0xef, 0x40, 0xe8, 0x11, 0xae, 0x00, 0x67, 0x25, 0xe0, 0x66, 0x35, 0xc0, 0x3d, 0xbd,
-	0xcf, 0x2e, 0xd8, 0x40, 0xe7, 0xe1, 0xfc, 0xbe, 0x4f, 0x82, 0x7e, 0x22, 0x7d, 0xb2, 0x60, 0x67,
-	0x33, 0xfc, 0x35, 0x80, 0x4f, 0x2a, 0xe4, 0xae, 0x9f, 0xf0, 0x6a, 0x21, 0xbe, 0x0b, 0x17, 0x03,
-	0x3f, 0xd1, 0x80, 0x69, 0x94, 0x3b, 0xd5, 0x00, 0xbb, 0xf9, 0x46, 0xbb, 0x68, 0xa5, 0x80, 0x38,
-	0x5b, 0x42, 0xf4, 0xe0, 0x33, 0x3a, 0x15, 0x48, 0x32, 0xe8, 0x85, 0x7e, 0x0d, 0xcf, 0x1a, 0xb0,
-	0x11, 0x92, 0x90, 0xf9, 0x1f, 0x90, 0xbe, 0x94, 0x69, 0xd8, 0x7a, 0x8e, 0x5f, 0x87, 0x4f, 0xe5,
-	0x42, 0x3c, 0x1e, 0x9d, 0x5a, 0x05, 0xdf, 0xce, 0x4f, 0x8e, 0x40, 0x0e, 0xc9, 0xe9, 0x4d, 0x75,
-	0x61, 0x4b, 0x99, 0x7a, 0x9b, 0xc4, 0xa1, 0x4f, 0x0b, 0xe7, 0xf0, 0xbf, 0x5b, 0x7b, 0x03, 0x9e,
-	0x57, 0xd6, 0xee, 0x0e, 0x92, 0x88, 0xd0, 0xfe, 0xe9, 0x6d, 0x7d, 0x53, 0xc8, 0xf6, 0x2e, 0xf3,
-	0x4e, 0x1f, 0x93, 0x16, 0x3c, 0x13, 0xb1, 0xfe, 0x9b, 0x62, 0x53, 0x1a, 0x79, 0x35, 0x45, 0x37,
-	0x21, 0x0c, 0x98, 0xa7, 0xd2, 0x6c, 0x4e, 0xa6, 0xd9, 0xa5, 0x42, 0x9a, 0x99, 0xe2, 0xee, 0x12,
-	0x49, 0x75, 0x87, 0xf5, 0xbb, 0xfa, 0x45, 0xbb, 0xb0, 0x09, 0x7f, 0x0b, 0xf2, 0x58, 0xec, 0x92,
-	0x80, 0xd4, 0xf0, 0x9e, 0xb8, 0x3a, 0xfa, 0xd2, 0x44, 0xf9, 0x64, 0x56, 0xbc, 0x3a, 0x76, 0x8b,
-	0x5b, 0xed, 0xb2, 0x25, 0xdc, 0xca, 0x03, 0xa3, 0x28, 0x93, 0x88, 0xd1, 0x84, 0xe0, 0x4f, 0xc5,
-	0x07, 0x38, 0xdc, 0x3d, 0x50, 0xeb, 0xc9, 0xe3, 0x3b, 0xa3, 0xf8, 0xa3, 0x3c, 0xe4, 0x92, 0xe9,
-	0xd6, 0x90, 0x50, 0xe9, 0x49, 0x3e, 0x8a, 0xb4, 0x27, 0xc5, 0x18, 0xbd, 0x03, 0xe7, 0x59, 0xef,
-	0x3e, 0x71, 0xf9, 0xa3, 0xa9, 0x01, 0x99, 0x31, 0xfc, 0x2a, 0x6c, 0x74, 0x99, 0x77, 0x8b, 0xf2,
-	0x78, 0x24, 0xf2, 0xc6, 0x65, 0x94, 0x13, 0xca, 0x33, 0x65, 0x35, 0x2d, 0x66, 0xd4, 0x4c, 0x29,
-	0xa3, 0xf0, 0x67, 0xa5, 0xfb, 0x8e, 0xf2, 0xc7, 0x5d, 0xd2, 0xb6, 0xfe, 0x6a, 0xc2, 0x73, 0xfa,
-	0x48, 0x92, 0x78, 0xe8, 0xbb, 0x04, 0x7d, 0x09, 0x60, 0x33, 0x2d, 0x34, 0x6a, 0x05, 0x5d, 0xcc,
-	0xad, 0x4d, 0xac, 0xc9, 0x46, 0x3d, 0x20, 0xbc, 0xf6, 0xc9, 0xef, 0x7f, 0x7e, 0x3e, 0x83, 0xf1,
-	0x05, 0xd9, 0x12, 0x0c, 0x3b, 0xba, 0x87, 0x48, 0xac, 0x87, 0xda, 0x0f, 0x47, 0xd7, 0xc1, 0x3a,
-	0xfa, 0x02, 0xc0, 0xc5, 0x3d, 0xc2, 0x35, 0xd9, 0xf2, 0x38, 0x59, 0x5e, 0xfb, 0xea, 0x62, 0x5d,
-	0x91, 0x58, 0xcf, 0xa3, 0xe7, 0xa6, 0x62, 0xa5, 0xe3, 0x23, 0x81, 0xb6, 0x24, 0x52, 0x57, 0x9f,
-	0x14, 0x74, 0x61, 0x1c, 0xae, 0x50, 0xe5, 0x8c, 0x9b, 0xb5, 0xe8, 0x84, 0x25, 0xbc, 0x2a, 0x09,
-	0x2f, 0xa2, 0xe9, 0x8e, 0x43, 0x1f, 0xc2, 0x66, 0xf9, 0x10, 0x97, 0x22, 0x3a, 0xe9, 0x78, 0x1b,
-	0x13, 0x1c, 0x9b, 0x9f, 0x39, 0x7c, 0x59, 0xea, 0xae, 0xa2, 0x67, 0x4f, 0xea, 0x6e, 0x10, 0xb1,
-	0x5e, 0x52, 0xdf, 0x04, 0xe8, 0x63, 0x00, 0x9b, 0xe9, 0xc5, 0x32, 0x2d, 0xa5, 0x4a, 0x17, 0xa4,
-	0xb1, 0xf2, 0xcf, 0x2f, 0x64, 0x77, 0x53, 0x16, 0x9e, 0xf5, 0x6a, 0xe1, 0xf9, 0x0e, 0xc0, 0x25,
-	0x59, 0x58, 0x35, 0x42, 0x7b, 0x5c, 0xa1, 0x58, 0x79, 0xeb, 0x66, 0xcf, 0x8b, 0x12, 0xcf, 0x32,
-	0xd6, 0xab, 0xe0, 0x59, 0xb1, 0x50, 0x16, 0x19, 0xfe, 0x23, 0x80, 0xff, 0x57, 0x9d, 0x86, 0x46,
-	0xbd, 0x34, 0x09, 0xb5, 0xd4, 0x8d, 0xd4, 0xa5, 0xbd, 0x26, 0x69, 0xb7, 0x8c, 0x8d, 0x8a, 0xb4,
-	0xa9, 0xb8, 0x00, 0xfe, 0x1e, 0xc0, 0x66, 0xda, 0x67, 0x4c, 0x0b, 0x6e, 0xa9, 0x13, 0xa9, 0x0b,
-	0xfb, 0x92, 0x84, 0xdd, 0x34, 0x2e, 0x57, 0x86, 0x0d, 0x89, 0x40, 0xfd, 0x01, 0xc0, 0x73, 0x59,
-	0xe7, 0xa1, 0x59, 0x27, 0xe4, 0x59, 0xb9, 0x39, 0xa9, 0x0b, 0xfb, 0xb2, 0x84, 0xed, 0x18, 0x57,
-	0x2a, 0xc1, 0x26, 0xa9, 0xb6, 0xa0, 0xfd, 0x05, 0xc0, 0x27, 0x74, 0xd7, 0xa5, 0x79, 0xf1, 0x38,
-	0xef, 0xc9, 0xd6, 0xac, 0x2e, 0xf1, 0x2b, 0x92, 0x78, 0xdb, 0x30, 0x2b, 0x11, 0x73, 0xa5, 0x2e,
-	0x98, 0xbf, 0x02, 0xf0, 0xac, 0xa8, 0x6c, 0x1a, 0x77, 0xe2, 0x1d, 0x48, 0x1f, 0x55, 0xd6, 0x6e,
-	0x48, 0xd2, 0x17, 0x30, 0x9e, 0x4e, 0x1a, 0xf8, 0x54, 0xa6, 0xea, 0x08, 0x9e, 0x49, 0x7b, 0xb5,
-	0x64, 0x52, 0xe1, 0xc8, 0xdb, 0x48, 0x03, 0xe5, 0xab, 0xaa, 0xe0, 0xe3, 0xeb, 0x52, 0xeb, 0x2a,
-	0xda, 0xaa, 0xe4, 0x95, 0x87, 0x59, 0xcd, 0x3f, 0xb2, 0x02, 0xe6, 0x6d, 0x82, 0xd7, 0x6e, 0xfc,
-	0x7a, 0xdc, 0x06, 0xbf, 0x1d, 0xb7, 0xc1, 0x1f, 0xc7, 0x6d, 0xf0, 0x9e, 0xf5, 0x6f, 0x3f, 0xa3,
-	0x4f, 0xfc, 0x27, 0xd0, 0x9b, 0x97, 0xbf, 0x8a, 0xb7, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x88,
-	0xf6, 0xfb, 0x76, 0x34, 0x10, 0x00, 0x00,
+	// 1125 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x98, 0x5b, 0x6f, 0xdc, 0x44,
+	0x14, 0x80, 0x35, 0x49, 0x48, 0x93, 0x93, 0x4b, 0xcb, 0x00, 0x65, 0x65, 0xa5, 0x69, 0x3a, 0x10,
+	0x08, 0x69, 0x63, 0x67, 0x93, 0x00, 0xa5, 0x52, 0x91, 0x4a, 0x52, 0x85, 0xa2, 0x15, 0x54, 0x2e,
+	0x08, 0x95, 0x37, 0xaf, 0x77, 0xe2, 0xb8, 0xb1, 0x3d, 0xc6, 0x9e, 0xdd, 0x6a, 0xa9, 0x02, 0x82,
+	0x47, 0x84, 0x78, 0xe1, 0x05, 0xc1, 0x0b, 0xe2, 0x22, 0x21, 0x21, 0x71, 0xf9, 0x17, 0x3c, 0x22,
+	0xf1, 0x07, 0x50, 0xc4, 0x0f, 0x41, 0x33, 0xb6, 0xc7, 0x76, 0x76, 0x59, 0xcc, 0xba, 0x52, 0xdf,
+	0x66, 0x3c, 0x3e, 0xe7, 0x7c, 0x3e, 0x97, 0x39, 0x47, 0x86, 0xd5, 0xf0, 0xc8, 0x31, 0xac, 0xd0,
+	0xb5, 0x3d, 0x97, 0x06, 0xdc, 0xb8, 0xcf, 0xa2, 0xa3, 0x03, 0x8f, 0xdd, 0x57, 0x0b, 0x3d, 0x8c,
+	0x18, 0x67, 0x78, 0x26, 0xdb, 0x6b, 0x1b, 0x8e, 0xcb, 0x0f, 0xbb, 0x6d, 0xdd, 0x66, 0xbe, 0xe1,
+	0x30, 0x87, 0x19, 0xf2, 0x85, 0x76, 0xf7, 0x40, 0xee, 0xe4, 0x46, 0xae, 0x12, 0x41, 0x6d, 0xc9,
+	0x61, 0xcc, 0xf1, 0xa8, 0x30, 0x61, 0x58, 0x41, 0xc0, 0xb8, 0xc5, 0x5d, 0x16, 0xc4, 0xe9, 0xe9,
+	0xce, 0xd1, 0xd5, 0x58, 0x77, 0x99, 0x38, 0xf5, 0x2d, 0xfb, 0xd0, 0x0d, 0x68, 0xd4, 0x37, 0x52,
+	0xa2, 0xd8, 0xf0, 0x29, 0xb7, 0x8c, 0x5e, 0xd3, 0x70, 0x68, 0x40, 0x23, 0x8b, 0xd3, 0x4e, 0x2a,
+	0xb5, 0x5b, 0x40, 0xb0, 0x22, 0x69, 0xf4, 0x9e, 0x5c, 0xe4, 0xa2, 0xea, 0x3b, 0x7a, 0x4d, 0xcb,
+	0x0b, 0x0f, 0xad, 0x41, 0x25, 0x24, 0x37, 0x6d, 0xd8, 0x2c, 0xa2, 0x43, 0x0c, 0x91, 0x5f, 0x26,
+	0xe0, 0xa9, 0x77, 0x53, 0x4d, 0xbb, 0x11, 0xb5, 0x38, 0x35, 0xe9, 0xfb, 0x5d, 0x1a, 0x73, 0xbc,
+	0x04, 0xb3, 0x81, 0xe5, 0xd3, 0x38, 0xb4, 0x6c, 0xda, 0x40, 0x2b, 0x68, 0x6d, 0xd6, 0xcc, 0x1f,
+	0xe0, 0xbb, 0xa0, 0xfc, 0xd5, 0x98, 0x58, 0x41, 0x6b, 0x73, 0x5b, 0xd7, 0xf5, 0x9c, 0x59, 0xcf,
+	0x98, 0xe5, 0x42, 0x0f, 0x8f, 0x1c, 0x5d, 0x30, 0xeb, 0xca, 0xe5, 0x19, 0xb3, 0x9e, 0xd9, 0x36,
+	0x95, 0x3a, 0xbc, 0x0c, 0xe0, 0x06, 0x31, 0xb7, 0x02, 0x9b, 0xde, 0xda, 0x6b, 0x4c, 0x4a, 0xcb,
+	0x85, 0x27, 0x98, 0xc0, 0x7c, 0x4c, 0xa3, 0x1e, 0x8d, 0xf6, 0xa2, 0xbe, 0xd9, 0x0d, 0x1a, 0x53,
+	0x2b, 0x68, 0x6d, 0xc6, 0x2c, 0x3d, 0xc3, 0x77, 0x61, 0xc1, 0x96, 0x5f, 0xf3, 0x56, 0x28, 0x83,
+	0xd1, 0x78, 0x4c, 0x32, 0x6e, 0xeb, 0x89, 0x4b, 0xf4, 0x62, 0x34, 0x72, 0x3c, 0x11, 0x0d, 0xbd,
+	0xd7, 0xd4, 0x77, 0x8b, 0xa2, 0x66, 0x59, 0x13, 0xf9, 0x15, 0x01, 0xce, 0xa8, 0xf7, 0x29, 0xcf,
+	0xdc, 0x85, 0x61, 0x4a, 0x78, 0x27, 0xf5, 0x94, 0x5c, 0x97, 0x5d, 0x38, 0x71, 0xda, 0x85, 0xb7,
+	0x01, 0x1c, 0xca, 0x33, 0xc0, 0x49, 0x09, 0xb8, 0x59, 0x0d, 0x70, 0x5f, 0xc9, 0x99, 0x05, 0x1d,
+	0xf8, 0x3c, 0x4c, 0x1f, 0xb8, 0xd4, 0xeb, 0xc4, 0xd2, 0x27, 0xb3, 0x66, 0xba, 0x23, 0xdf, 0x20,
+	0x78, 0x22, 0x43, 0x6e, 0xb9, 0x31, 0xaf, 0x16, 0xe2, 0x3b, 0x30, 0xe7, 0xb9, 0xb1, 0x02, 0x4c,
+	0xa2, 0xdc, 0xac, 0x06, 0xd8, 0xca, 0x05, 0xcd, 0xa2, 0x96, 0x02, 0xe2, 0x64, 0x09, 0xd1, 0x81,
+	0xa7, 0x55, 0x2a, 0xd0, 0xb8, 0xdb, 0xf6, 0xdd, 0x1a, 0x9e, 0xd5, 0x60, 0xc6, 0xa7, 0x3e, 0x73,
+	0x3f, 0xa0, 0x1d, 0x69, 0x66, 0xc6, 0x54, 0x7b, 0xf2, 0x3a, 0x3c, 0x99, 0x1b, 0xe2, 0x51, 0x7f,
+	0x6c, 0x2b, 0xe4, 0x56, 0x5e, 0x39, 0x02, 0xd9, 0xa7, 0xe3, 0xab, 0x6a, 0x41, 0x23, 0x53, 0xf5,
+	0x36, 0x8d, 0x7c, 0x37, 0x28, 0xd4, 0xe1, 0xff, 0xd7, 0xb6, 0x9f, 0x47, 0xfb, 0x0e, 0x67, 0xe1,
+	0xf8, 0x8a, 0xde, 0x80, 0xf3, 0x4a, 0x51, 0x37, 0x0e, 0x69, 0xd0, 0x19, 0x5f, 0xd7, 0x77, 0x85,
+	0xb2, 0x69, 0x31, 0x67, 0xfc, 0xe0, 0x36, 0xe0, 0x4c, 0xc8, 0x3a, 0x6f, 0x0a, 0xa1, 0x24, 0x85,
+	0xb2, 0x2d, 0xbe, 0x01, 0xe0, 0x31, 0x27, 0xcb, 0xd7, 0x29, 0x99, 0xaf, 0x97, 0x0a, 0xf9, 0xaa,
+	0x8b, 0x4b, 0x50, 0x64, 0xe7, 0x6d, 0xd6, 0x69, 0xa9, 0x17, 0xcd, 0x82, 0x10, 0xf9, 0x1e, 0xe5,
+	0x41, 0xdd, 0xa3, 0x1e, 0xad, 0x11, 0x06, 0x71, 0x07, 0x75, 0xa4, 0x8a, 0x72, 0x89, 0x57, 0xbc,
+	0x83, 0xf6, 0x8a, 0xa2, 0x66, 0x59, 0x13, 0x69, 0xe4, 0x81, 0xc9, 0x28, 0xe3, 0x90, 0x05, 0x31,
+	0x25, 0x9f, 0x8a, 0x0f, 0xb0, 0xb8, 0x7d, 0x98, 0x9d, 0xc7, 0x8f, 0xae, 0xd8, 0xc9, 0x47, 0x79,
+	0xc8, 0x25, 0xd3, 0xcd, 0x1e, 0x0d, 0xa4, 0x27, 0x79, 0x3f, 0x54, 0x9e, 0x14, 0x6b, 0xfc, 0x0e,
+	0x4c, 0xb3, 0xf6, 0x3d, 0x6a, 0xf3, 0x87, 0xd3, 0x4c, 0x52, 0x65, 0xe4, 0x55, 0x98, 0x69, 0x31,
+	0xe7, 0x66, 0xc0, 0xa3, 0xbe, 0xc8, 0x1b, 0x9b, 0x05, 0x9c, 0x06, 0x3c, 0xb5, 0x9c, 0x6d, 0x8b,
+	0x19, 0x35, 0x51, 0xca, 0x28, 0xf2, 0x79, 0xe9, 0xe2, 0x0c, 0xf8, 0xa3, 0xee, 0x8d, 0x5b, 0x9f,
+	0x9d, 0x83, 0xb3, 0xaa, 0x24, 0x69, 0xd4, 0x73, 0x6d, 0x8a, 0xbf, 0x42, 0xb0, 0x98, 0x74, 0xac,
+	0xec, 0x04, 0x5f, 0xcc, 0xb5, 0x0d, 0x6d, 0xee, 0x5a, 0x3d, 0x20, 0xb2, 0xf6, 0xc9, 0x9f, 0x7f,
+	0x7f, 0x31, 0x41, 0xc8, 0x05, 0x39, 0x5b, 0xf4, 0x9a, 0x6a, 0x18, 0x89, 0x8d, 0x07, 0xca, 0x0f,
+	0xc7, 0xd7, 0xd0, 0x3a, 0xfe, 0x12, 0xc1, 0xdc, 0x3e, 0xe5, 0x8a, 0x6c, 0x69, 0x90, 0x2c, 0x6f,
+	0xa2, 0x75, 0xb1, 0xae, 0x48, 0xac, 0xe7, 0xf0, 0xb3, 0x23, 0xb1, 0x92, 0xf5, 0xb1, 0x40, 0x5b,
+	0x10, 0xa9, 0xab, 0x2a, 0x05, 0x5f, 0x18, 0x84, 0x2b, 0xb4, 0x4b, 0xed, 0x46, 0x2d, 0x3a, 0xa1,
+	0x89, 0xac, 0x4a, 0xc2, 0x8b, 0x78, 0xb4, 0xe3, 0xf0, 0x87, 0xb0, 0x58, 0x2e, 0xe2, 0x52, 0x44,
+	0x87, 0x95, 0xb7, 0x36, 0xc4, 0xb1, 0x79, 0xcd, 0x91, 0xcb, 0xd2, 0xee, 0x2a, 0x7e, 0xe6, 0xb4,
+	0xdd, 0x0d, 0x2a, 0xce, 0x4b, 0xd6, 0x37, 0x11, 0xfe, 0x18, 0xc1, 0x62, 0x72, 0xb1, 0x8c, 0x4a,
+	0xa9, 0xd2, 0x05, 0xa9, 0xad, 0xfc, 0xfb, 0x0b, 0xe9, 0xdd, 0x94, 0x86, 0x67, 0xbd, 0x5a, 0x78,
+	0x7e, 0x40, 0xb0, 0x20, 0x3b, 0xb4, 0x42, 0x58, 0x1e, 0xb4, 0x50, 0x6c, 0xe1, 0x75, 0xb3, 0xe7,
+	0x45, 0x89, 0x67, 0x68, 0xeb, 0x55, 0xf0, 0x8c, 0x48, 0x58, 0x16, 0x19, 0xfe, 0x33, 0x82, 0x73,
+	0xd9, 0xc8, 0xa2, 0x50, 0x2f, 0x0d, 0x43, 0x2d, 0x8d, 0x35, 0x75, 0x69, 0xaf, 0x4a, 0xda, 0x2d,
+	0x6d, 0xa3, 0x22, 0x6d, 0x62, 0x5c, 0x00, 0xff, 0x88, 0x60, 0x31, 0x19, 0x58, 0x46, 0x05, 0xb7,
+	0x34, 0xd2, 0xd4, 0x85, 0x7d, 0x49, 0xc2, 0x6e, 0x6a, 0x97, 0x2b, 0xc3, 0xfa, 0x54, 0xa0, 0xfe,
+	0x84, 0xe0, 0x6c, 0x3a, 0x79, 0x28, 0xd6, 0x21, 0x79, 0x56, 0x1e, 0x4e, 0xea, 0xc2, 0xbe, 0x2c,
+	0x61, 0x9b, 0xda, 0x95, 0x4a, 0xb0, 0x71, 0x62, 0x5b, 0xd0, 0xfe, 0x86, 0xe0, 0x71, 0x35, 0xbe,
+	0x29, 0x5e, 0x32, 0xc8, 0x7b, 0x7a, 0xc6, 0xab, 0x4b, 0xfc, 0x8a, 0x24, 0xde, 0xd6, 0xf4, 0x4a,
+	0xc4, 0x3c, 0xb3, 0x2e, 0x98, 0xbf, 0x45, 0x30, 0x2f, 0x86, 0x44, 0x85, 0x3b, 0xe4, 0x0e, 0x2c,
+	0x0c, 0x91, 0x75, 0x49, 0x77, 0x24, 0xa9, 0xae, 0xbd, 0x50, 0xcd, 0xb7, 0x9c, 0x85, 0x02, 0xf2,
+	0x6b, 0x04, 0xf3, 0xa2, 0xfd, 0x8e, 0x82, 0x2c, 0xb4, 0xe7, 0xba, 0x90, 0x1b, 0x12, 0xf2, 0x79,
+	0x42, 0x46, 0x43, 0x7a, 0x6e, 0x20, 0xeb, 0xa9, 0x0f, 0x67, 0x92, 0x81, 0x32, 0x1e, 0xd6, 0xdd,
+	0xf2, 0x59, 0x57, 0xc3, 0xf9, 0x69, 0x36, 0x95, 0x90, 0x6b, 0xd2, 0xd6, 0x0e, 0xde, 0xaa, 0xe4,
+	0x90, 0x07, 0xe9, 0x60, 0x72, 0x6c, 0x78, 0xcc, 0xd9, 0x44, 0xaf, 0x5d, 0xff, 0xfd, 0x64, 0x19,
+	0xfd, 0x71, 0xb2, 0x8c, 0xfe, 0x3a, 0x59, 0x46, 0xef, 0x19, 0xff, 0xf5, 0xd3, 0xe0, 0xd4, 0x1f,
+	0x90, 0xf6, 0xb4, 0xfc, 0x07, 0xb0, 0xfd, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb7, 0x33, 0x07,
+	0xf1, 0x22, 0x11, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -1045,6 +1103,7 @@ type WorkflowServiceClient interface {
 	ResumeWorkflow(ctx context.Context, in *WorkflowResumeRequest, opts ...grpc.CallOption) (*v1alpha1.Workflow, error)
 	SuspendWorkflow(ctx context.Context, in *WorkflowSuspendRequest, opts ...grpc.CallOption) (*v1alpha1.Workflow, error)
 	TerminateWorkflow(ctx context.Context, in *WorkflowTerminateRequest, opts ...grpc.CallOption) (*v1alpha1.Workflow, error)
+	StopWorkflow(ctx context.Context, in *WorkflowStopRequest, opts ...grpc.CallOption) (*v1alpha1.Workflow, error)
 	LintWorkflow(ctx context.Context, in *WorkflowLintRequest, opts ...grpc.CallOption) (*v1alpha1.Workflow, error)
 	PodLogs(ctx context.Context, in *WorkflowLogRequest, opts ...grpc.CallOption) (WorkflowService_PodLogsClient, error)
 }
@@ -1170,6 +1229,15 @@ func (c *workflowServiceClient) TerminateWorkflow(ctx context.Context, in *Workf
 	return out, nil
 }
 
+func (c *workflowServiceClient) StopWorkflow(ctx context.Context, in *WorkflowStopRequest, opts ...grpc.CallOption) (*v1alpha1.Workflow, error) {
+	out := new(v1alpha1.Workflow)
+	err := c.cc.Invoke(ctx, "/workflow.WorkflowService/StopWorkflow", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *workflowServiceClient) LintWorkflow(ctx context.Context, in *WorkflowLintRequest, opts ...grpc.CallOption) (*v1alpha1.Workflow, error) {
 	out := new(v1alpha1.Workflow)
 	err := c.cc.Invoke(ctx, "/workflow.WorkflowService/LintWorkflow", in, out, opts...)
@@ -1223,6 +1291,7 @@ type WorkflowServiceServer interface {
 	ResumeWorkflow(context.Context, *WorkflowResumeRequest) (*v1alpha1.Workflow, error)
 	SuspendWorkflow(context.Context, *WorkflowSuspendRequest) (*v1alpha1.Workflow, error)
 	TerminateWorkflow(context.Context, *WorkflowTerminateRequest) (*v1alpha1.Workflow, error)
+	StopWorkflow(context.Context, *WorkflowStopRequest) (*v1alpha1.Workflow, error)
 	LintWorkflow(context.Context, *WorkflowLintRequest) (*v1alpha1.Workflow, error)
 	PodLogs(*WorkflowLogRequest, WorkflowService_PodLogsServer) error
 }
@@ -1261,6 +1330,9 @@ func (*UnimplementedWorkflowServiceServer) SuspendWorkflow(ctx context.Context,
 func (*UnimplementedWorkflowServiceServer) TerminateWorkflow(ctx context.Context, req *WorkflowTerminateRequest) (*v1alpha1.Workflow, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method TerminateWorkflow not implemented")
 }
+func (*UnimplementedWorkflowServiceServer) StopWorkflow(ctx context.Context, req *WorkflowStopRequest) (*v1alpha1.Workflow, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method StopWorkflow not implemented")
+}
 func (*UnimplementedWorkflowServiceServer) LintWorkflow(ctx context.Context, req *WorkflowLintRequest) (*v1alpha1.Workflow, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method LintWorkflow not implemented")
 }
@@ -1455,6 +1527,24 @@ func _WorkflowService_TerminateWorkflow_Handler(srv interface{}, ctx context.Con
 	return interceptor(ctx, in, info, handler)
 }
 
+func _WorkflowService_StopWorkflow_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(WorkflowStopRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(WorkflowServiceServer).StopWorkflow(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/workflow.WorkflowService/StopWorkflow",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(WorkflowServiceServer).StopWorkflow(ctx, req.(*WorkflowStopRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 func _WorkflowService_LintWorkflow_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(WorkflowLintRequest)
 	if err := dec(in); err != nil {
@@ -1534,6 +1624,10 @@ var _WorkflowService_serviceDesc = grpc.ServiceDesc{
 			MethodName: "TerminateWorkflow",
 			Handler:    _WorkflowService_TerminateWorkflow_Handler,
 		},
+		{
+			MethodName: "StopWorkflow",
+			Handler:    _WorkflowService_StopWorkflow_Handler,
+		},
 		{
 			MethodName: "LintWorkflow",
 			Handler:    _WorkflowService_LintWorkflow_Handler,
@@ -1916,6 +2010,47 @@ func (m *WorkflowTerminateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error
 	return len(dAtA) - i, nil
 }
 
+func (m *WorkflowStopRequest) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBuffer(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *WorkflowStopRequest) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *WorkflowStopRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	if m.XXX_unrecognized != nil {
+		i -= len(m.XXX_unrecognized)
+		copy(dAtA[i:], m.XXX_unrecognized)
+	}
+	if len(m.Namespace) > 0 {
+		i -= len(m.Namespace)
+		copy(dAtA[i:], m.Namespace)
+		i = encodeVarintWorkflow(dAtA, i, uint64(len(m.Namespace)))
+		i--
+		dAtA[i] = 0x12
+	}
+	if len(m.Name) > 0 {
+		i -= len(m.Name)
+		copy(dAtA[i:], m.Name)
+		i = encodeVarintWorkflow(dAtA, i, uint64(len(m.Name)))
+		i--
+		dAtA[i] = 0xa
+	}
+	return len(dAtA) - i, nil
+}
+
 func (m *WorkflowSuspendRequest) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -2453,6 +2588,26 @@ func (m *WorkflowTerminateRequest) Size() (n int) {
 	return n
 }
 
+func (m *WorkflowStopRequest) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	l = len(m.Name)
+	if l > 0 {
+		n += 1 + l + sovWorkflow(uint64(l))
+	}
+	l = len(m.Namespace)
+	if l > 0 {
+		n += 1 + l + sovWorkflow(uint64(l))
+	}
+	if m.XXX_unrecognized != nil {
+		n += len(m.XXX_unrecognized)
+	}
+	return n
+}
+
 func (m *WorkflowSuspendRequest) Size() (n int) {
 	if m == nil {
 		return 0
@@ -3665,6 +3820,124 @@ func (m *WorkflowTerminateRequest) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *WorkflowStopRequest) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowWorkflow
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: WorkflowStopRequest: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: WorkflowStopRequest: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowWorkflow
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthWorkflow
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthWorkflow
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Name = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowWorkflow
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthWorkflow
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthWorkflow
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Namespace = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipWorkflow(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthWorkflow
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthWorkflow
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
 func (m *WorkflowSuspendRequest) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
diff --git a/pkg/apiclient/workflow/workflow.pb.gw.go b/pkg/apiclient/workflow/workflow.pb.gw.go
index c573cbbab..d055452bf 100644
--- a/pkg/apiclient/workflow/workflow.pb.gw.go
+++ b/pkg/apiclient/workflow/workflow.pb.gw.go
@@ -858,6 +858,98 @@ func local_request_WorkflowService_TerminateWorkflow_0(ctx context.Context, mars
 
 }
 
+func request_WorkflowService_StopWorkflow_0(ctx context.Context, marshaler runtime.Marshaler, client WorkflowServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq WorkflowStopRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["namespace"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace")
+	}
+
+	protoReq.Namespace, err = runtime.String(val)
+
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err)
+	}
+
+	val, ok = pathParams["name"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name")
+	}
+
+	protoReq.Name, err = runtime.String(val)
+
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
+	}
+
+	msg, err := client.StopWorkflow(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
+	return msg, metadata, err
+
+}
+
+func local_request_WorkflowService_StopWorkflow_0(ctx context.Context, marshaler runtime.Marshaler, server WorkflowServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
+	var protoReq WorkflowStopRequest
+	var metadata runtime.ServerMetadata
+
+	newReader, berr := utilities.IOReaderFactory(req.Body)
+	if berr != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
+	}
+	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
+	}
+
+	var (
+		val string
+		ok  bool
+		err error
+		_   = err
+	)
+
+	val, ok = pathParams["namespace"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "namespace")
+	}
+
+	protoReq.Namespace, err = runtime.String(val)
+
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "namespace", err)
+	}
+
+	val, ok = pathParams["name"]
+	if !ok {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name")
+	}
+
+	protoReq.Name, err = runtime.String(val)
+
+	if err != nil {
+		return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
+	}
+
+	msg, err := server.StopWorkflow(ctx, &protoReq)
+	return msg, metadata, err
+
+}
+
 func request_WorkflowService_LintWorkflow_0(ctx context.Context, marshaler runtime.Marshaler, client WorkflowServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
 	var protoReq WorkflowLintRequest
 	var metadata runtime.ServerMetadata
@@ -1188,6 +1280,26 @@ func RegisterWorkflowServiceHandlerServer(ctx context.Context, mux *runtime.Serv
 
 	})
 
+	mux.Handle("PUT", pattern_WorkflowService_StopWorkflow_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := local_request_WorkflowService_StopWorkflow_0(rctx, inboundMarshaler, server, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_WorkflowService_StopWorkflow_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
 	mux.Handle("POST", pattern_WorkflowService_LintWorkflow_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
@@ -1456,6 +1568,26 @@ func RegisterWorkflowServiceHandlerClient(ctx context.Context, mux *runtime.Serv
 
 	})
 
+	mux.Handle("PUT", pattern_WorkflowService_StopWorkflow_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_WorkflowService_StopWorkflow_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_WorkflowService_StopWorkflow_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
+
+	})
+
 	mux.Handle("POST", pattern_WorkflowService_LintWorkflow_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
 		ctx, cancel := context.WithCancel(req.Context())
 		defer cancel()
@@ -1520,6 +1652,8 @@ var (
 
 	pattern_WorkflowService_TerminateWorkflow_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"api", "v1", "workflows", "namespace", "name", "terminate"}, "", runtime.AssumeColonVerbOpt(true)))
 
+	pattern_WorkflowService_StopWorkflow_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"api", "v1", "workflows", "namespace", "name", "stop"}, "", runtime.AssumeColonVerbOpt(true)))
+
 	pattern_WorkflowService_LintWorkflow_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "workflows", "namespace", "lint"}, "", runtime.AssumeColonVerbOpt(true)))
 
 	pattern_WorkflowService_PodLogs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"api", "v1", "workflows", "namespace", "name", "podName", "log"}, "", runtime.AssumeColonVerbOpt(true)))
@@ -1546,6 +1680,8 @@ var (
 
 	forward_WorkflowService_TerminateWorkflow_0 = runtime.ForwardResponseMessage
 
+	forward_WorkflowService_StopWorkflow_0 = runtime.ForwardResponseMessage
+
 	forward_WorkflowService_LintWorkflow_0 = runtime.ForwardResponseMessage
 
 	forward_WorkflowService_PodLogs_0 = runtime.ForwardResponseStream
diff --git a/pkg/apiclient/workflow/workflow.proto b/pkg/apiclient/workflow/workflow.proto
index c7c4d0001..ac18ee454 100644
--- a/pkg/apiclient/workflow/workflow.proto
+++ b/pkg/apiclient/workflow/workflow.proto
@@ -55,6 +55,11 @@ message WorkflowTerminateRequest {
     string namespace = 2;
 }
 
+message WorkflowStopRequest {
+     string name = 1;
+     string namespace = 2;
+}
+
 message WorkflowSuspendRequest {
     string name = 1;
     string namespace = 2;
@@ -157,6 +162,13 @@ service WorkflowService {
 		};
     }
 
+    rpc StopWorkflow (WorkflowStopRequest) returns (github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.Workflow) {
+        option (google.api.http) = {
+			put: "/api/v1/workflows/{namespace}/{name}/stop"
+			body: "*"
+		};
+    }
+
     rpc LintWorkflow (WorkflowLintRequest) returns (github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.Workflow) {
         option (google.api.http) = {
 			post: "/api/v1/workflows/{namespace}/lint"
diff --git a/pkg/apiclient/workflow/workflow.swagger.json b/pkg/apiclient/workflow/workflow.swagger.json
index 9d397e4d3..3baf9893f 100644
--- a/pkg/apiclient/workflow/workflow.swagger.json
+++ b/pkg/apiclient/workflow/workflow.swagger.json
@@ -483,6 +483,44 @@
         ]
       }
     },
+    "/api/v1/workflows/{namespace}/{name}/stop": {
+      "put": {
+        "operationId": "StopWorkflow",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.Workflow"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "namespace",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "name",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/workflow.WorkflowStopRequest"
+            }
+          }
+        ],
+        "tags": [
+          "WorkflowService"
+        ]
+      }
+    },
     "/api/v1/workflows/{namespace}/{name}/suspend": {
       "put": {
         "operationId": "SuspendWorkflow",
@@ -2071,6 +2109,10 @@
         "metrics": {
           "$ref": "#/definitions/github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.Metrics",
           "title": "Metrics are a list of metrics emitted from this Workflow"
+        },
+        "shutdown": {
+          "type": "string",
+          "title": "Shutdown will shutdown the workflow according to its ShutdownStrategy"
         }
       },
       "description": "WorkflowSpec is the specification of a Workflow."
@@ -4819,6 +4861,17 @@
         }
       }
     },
+    "workflow.WorkflowStopRequest": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string"
+        },
+        "namespace": {
+          "type": "string"
+        }
+      }
+    },
     "workflow.WorkflowSuspendRequest": {
       "type": "object",
       "properties": {
diff --git a/pkg/apiclient/workflowarchive/workflow-archive.swagger.json b/pkg/apiclient/workflowarchive/workflow-archive.swagger.json
index 965f121bd..f0f41e82b 100644
--- a/pkg/apiclient/workflowarchive/workflow-archive.swagger.json
+++ b/pkg/apiclient/workflowarchive/workflow-archive.swagger.json
@@ -1540,6 +1540,10 @@
         "metrics": {
           "$ref": "#/definitions/github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.Metrics",
           "title": "Metrics are a list of metrics emitted from this Workflow"
+        },
+        "shutdown": {
+          "type": "string",
+          "title": "Shutdown will shutdown the workflow according to its ShutdownStrategy"
         }
       },
       "description": "WorkflowSpec is the specification of a Workflow."
diff --git a/pkg/apiclient/workflowtemplate/workflow-template.swagger.json b/pkg/apiclient/workflowtemplate/workflow-template.swagger.json
index aedf07d00..0eb1ae64a 100644
--- a/pkg/apiclient/workflowtemplate/workflow-template.swagger.json
+++ b/pkg/apiclient/workflowtemplate/workflow-template.swagger.json
@@ -1578,6 +1578,10 @@
         "metrics": {
           "$ref": "#/definitions/github.com.argoproj.argo.pkg.apis.workflow.v1alpha1.Metrics",
           "title": "Metrics are a list of metrics emitted from this Workflow"
+        },
+        "shutdown": {
+          "type": "string",
+          "title": "Shutdown will shutdown the workflow according to its ShutdownStrategy"
         }
       },
       "description": "WorkflowSpec is the specification of a Workflow."
diff --git a/pkg/apis/workflow/v1alpha1/generated.pb.go b/pkg/apis/workflow/v1alpha1/generated.pb.go
index 94a57cdf4..7b9373d03 100644
--- a/pkg/apis/workflow/v1alpha1/generated.pb.go
+++ b/pkg/apis/workflow/v1alpha1/generated.pb.go
@@ -1878,365 +1878,367 @@ func init() {
 }
 
 var fileDescriptor_c23edafa7e7ea072 = []byte{
-	// 5727 bytes of a gzipped FileDescriptorProto
+	// 5760 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7c, 0x4d, 0x6c, 0x1c, 0xc9,
-	0x75, 0xbf, 0x86, 0xe4, 0x0c, 0x67, 0xde, 0x90, 0x22, 0x55, 0xa2, 0xa4, 0x59, 0x5a, 0xcb, 0x91,
-	0x7b, 0xff, 0xbb, 0x7f, 0x39, 0xb1, 0x87, 0x5e, 0xad, 0x9d, 0xac, 0x3f, 0x76, 0xd7, 0x1c, 0x52,
-	0x94, 0xa8, 0x0f, 0x92, 0x7e, 0x43, 0x49, 0x71, 0x76, 0x61, 0xa7, 0x39, 0x5d, 0x33, 0xd3, 0xe2,
-	0x4c, 0x77, 0xbb, 0xab, 0x47, 0x5a, 0x7a, 0x13, 0xc4, 0x09, 0x12, 0x38, 0x41, 0x60, 0x20, 0x46,
-	0x00, 0xc3, 0x80, 0x11, 0x20, 0xf0, 0x21, 0xb9, 0xe4, 0xe2, 0x43, 0x2e, 0x39, 0xf8, 0x60, 0xe4,
-	0x60, 0xf8, 0x12, 0x23, 0x97, 0xf8, 0x10, 0x10, 0x5e, 0x06, 0x08, 0x02, 0x24, 0x40, 0x2e, 0x01,
-	0x82, 0x10, 0x39, 0x04, 0xf5, 0xd1, 0xd5, 0x1f, 0xd3, 0x94, 0xa8, 0x1e, 0x4a, 0x70, 0x60, 0xdf,
-	0x66, 0xde, 0x7b, 0xf5, 0x7b, 0xd5, 0xd5, 0x55, 0xaf, 0xde, 0x7b, 0xf5, 0xaa, 0x61, 0xb5, 0x6b,
-	0x07, 0xbd, 0xe1, 0x6e, 0xa3, 0xed, 0x0e, 0x96, 0x4d, 0xbf, 0xeb, 0x7a, 0xbe, 0xfb, 0x50, 0xfc,
-	0x58, 0xf6, 0xf6, 0xba, 0xcb, 0xa6, 0x67, 0xb3, 0xe5, 0xc7, 0xae, 0xbf, 0xd7, 0xe9, 0xbb, 0x8f,
-	0x97, 0x1f, 0xbd, 0x6e, 0xf6, 0xbd, 0x9e, 0xf9, 0xfa, 0x72, 0x97, 0x3a, 0xd4, 0x37, 0x03, 0x6a,
-	0x35, 0x3c, 0xdf, 0x0d, 0x5c, 0xf2, 0x46, 0x04, 0xd2, 0x08, 0x41, 0xc4, 0x8f, 0x86, 0xb7, 0xd7,
-	0x6d, 0x70, 0x90, 0x46, 0x08, 0xd2, 0x08, 0x41, 0x16, 0x3f, 0x11, 0xd3, 0xdc, 0x75, 0xb9, 0x42,
-	0x8e, 0xb5, 0x3b, 0xec, 0x88, 0x7f, 0xe2, 0x8f, 0xf8, 0x25, 0x75, 0x2c, 0x1a, 0x7b, 0x6f, 0xb2,
-	0x86, 0xed, 0xf2, 0x2e, 0x2d, 0xb7, 0x5d, 0x9f, 0x2e, 0x3f, 0x1a, 0xe9, 0xc7, 0xe2, 0xc7, 0x62,
-	0x32, 0x9e, 0xdb, 0xb7, 0xdb, 0xfb, 0xcb, 0x8f, 0x5e, 0xdf, 0xa5, 0xc1, 0x68, 0x97, 0x17, 0x3f,
-	0x15, 0x89, 0x0e, 0xcc, 0x76, 0xcf, 0x76, 0xa8, 0xbf, 0x1f, 0x3d, 0xf2, 0x80, 0x06, 0x66, 0x96,
-	0x82, 0xe5, 0xe3, 0x5a, 0xf9, 0x43, 0x27, 0xb0, 0x07, 0x74, 0xa4, 0xc1, 0xaf, 0x3d, 0xad, 0x01,
-	0x6b, 0xf7, 0xe8, 0xc0, 0x4c, 0xb7, 0x33, 0xfe, 0xbe, 0x00, 0x73, 0x2b, 0x7e, 0xbb, 0x67, 0x3f,
-	0xa2, 0xad, 0x80, 0x33, 0xba, 0xfb, 0xe4, 0x5d, 0x98, 0x0c, 0x4c, 0xbf, 0x56, 0xb8, 0x52, 0xb8,
-	0x5a, 0xbd, 0xf6, 0x85, 0x46, 0x8e, 0x31, 0x6f, 0xec, 0x98, 0x7e, 0x08, 0xd7, 0x9c, 0x3e, 0x3c,
-	0xa8, 0x4f, 0xee, 0x98, 0x3e, 0x72, 0x54, 0xf2, 0x15, 0x98, 0x72, 0x5c, 0x87, 0xd6, 0x26, 0x04,
-	0xfa, 0x4a, 0x2e, 0xf4, 0x4d, 0xd7, 0xd1, 0xbd, 0x6d, 0x96, 0x0f, 0x0f, 0xea, 0x53, 0x9c, 0x82,
-	0x02, 0xd8, 0xf8, 0x8f, 0x02, 0x54, 0x56, 0xfc, 0xee, 0x70, 0x40, 0x9d, 0x80, 0x11, 0x1f, 0xc0,
-	0x33, 0x7d, 0x73, 0x40, 0x03, 0xea, 0xb3, 0x5a, 0xe1, 0xca, 0xe4, 0xd5, 0xea, 0xb5, 0xb7, 0x73,
-	0x29, 0xdd, 0x0e, 0x61, 0x9a, 0xe4, 0x47, 0x07, 0xf5, 0x33, 0x87, 0x07, 0x75, 0xd0, 0x24, 0x86,
+	0x75, 0xbf, 0x86, 0xe4, 0x0c, 0x67, 0xde, 0x90, 0x12, 0x55, 0xa2, 0xa4, 0x59, 0x5a, 0xcb, 0x91,
+	0x7b, 0xff, 0xbb, 0x7f, 0x39, 0xb1, 0x87, 0x5e, 0xad, 0x9d, 0xac, 0x3f, 0xf6, 0x83, 0x43, 0x8a,
+	0x12, 0xf5, 0x41, 0xd2, 0x6f, 0x28, 0x29, 0xce, 0x2e, 0xec, 0x34, 0xa7, 0x6b, 0x66, 0x5a, 0x9c,
+	0xe9, 0x6e, 0x77, 0xf5, 0x88, 0x4b, 0x6f, 0x82, 0x38, 0x41, 0x02, 0x27, 0x08, 0x0c, 0xc4, 0x08,
+	0x60, 0x18, 0x30, 0x02, 0x04, 0x3e, 0x24, 0x97, 0x5c, 0x7c, 0xc8, 0x25, 0x07, 0x1f, 0x8c, 0x1c,
+	0x0c, 0x5f, 0x62, 0xe4, 0x92, 0x45, 0x10, 0x10, 0x5e, 0x06, 0x08, 0x02, 0x24, 0x40, 0x2e, 0x01,
+	0x82, 0x10, 0x39, 0x04, 0xf5, 0xd1, 0xd5, 0x1f, 0xd3, 0xd4, 0x52, 0x3d, 0x94, 0x90, 0xc0, 0xbe,
+	0xcd, 0xbc, 0xf7, 0xea, 0xf7, 0xaa, 0xab, 0xab, 0x5e, 0xbd, 0xf7, 0xea, 0x55, 0xc3, 0x4a, 0xd7,
+	0x0e, 0x7a, 0xc3, 0x9d, 0x46, 0xdb, 0x1d, 0x2c, 0x99, 0x7e, 0xd7, 0xf5, 0x7c, 0xf7, 0x91, 0xf8,
+	0xb1, 0xe4, 0xed, 0x76, 0x97, 0x4c, 0xcf, 0x66, 0x4b, 0x7b, 0xae, 0xbf, 0xdb, 0xe9, 0xbb, 0x7b,
+	0x4b, 0x8f, 0x5f, 0x35, 0xfb, 0x5e, 0xcf, 0x7c, 0x75, 0xa9, 0x4b, 0x1d, 0xea, 0x9b, 0x01, 0xb5,
+	0x1a, 0x9e, 0xef, 0x06, 0x2e, 0x79, 0x2d, 0x02, 0x69, 0x84, 0x20, 0xe2, 0x47, 0xc3, 0xdb, 0xed,
+	0x36, 0x38, 0x48, 0x23, 0x04, 0x69, 0x84, 0x20, 0x0b, 0x9f, 0x8a, 0x69, 0xee, 0xba, 0x5c, 0x21,
+	0xc7, 0xda, 0x19, 0x76, 0xc4, 0x3f, 0xf1, 0x47, 0xfc, 0x92, 0x3a, 0x16, 0x8c, 0xdd, 0xd7, 0x59,
+	0xc3, 0x76, 0x79, 0x97, 0x96, 0xda, 0xae, 0x4f, 0x97, 0x1e, 0x8f, 0xf4, 0x63, 0xe1, 0x13, 0x31,
+	0x19, 0xcf, 0xed, 0xdb, 0xed, 0xfd, 0xa5, 0xc7, 0xaf, 0xee, 0xd0, 0x60, 0xb4, 0xcb, 0x0b, 0x9f,
+	0x89, 0x44, 0x07, 0x66, 0xbb, 0x67, 0x3b, 0xd4, 0xdf, 0x8f, 0x1e, 0x79, 0x40, 0x03, 0x33, 0x4b,
+	0xc1, 0xd2, 0x71, 0xad, 0xfc, 0xa1, 0x13, 0xd8, 0x03, 0x3a, 0xd2, 0xe0, 0x57, 0x3e, 0xaa, 0x01,
+	0x6b, 0xf7, 0xe8, 0xc0, 0x4c, 0xb7, 0x33, 0xfe, 0xb6, 0x00, 0xe7, 0x96, 0xfd, 0x76, 0xcf, 0x7e,
+	0x4c, 0x5b, 0x01, 0x67, 0x74, 0xf7, 0xc9, 0x3b, 0x30, 0x19, 0x98, 0x7e, 0xad, 0x70, 0xb5, 0x70,
+	0xad, 0x7a, 0xfd, 0xed, 0x46, 0x8e, 0x31, 0x6f, 0x6c, 0x9b, 0x7e, 0x08, 0xd7, 0x9c, 0x3e, 0x3c,
+	0xa8, 0x4f, 0x6e, 0x9b, 0x3e, 0x72, 0x54, 0xf2, 0x55, 0x98, 0x72, 0x5c, 0x87, 0xd6, 0x26, 0x04,
+	0xfa, 0x72, 0x2e, 0xf4, 0x0d, 0xd7, 0xd1, 0xbd, 0x6d, 0x96, 0x0f, 0x0f, 0xea, 0x53, 0x9c, 0x82,
+	0x02, 0xd8, 0xf8, 0xf7, 0x02, 0x54, 0x96, 0xfd, 0xee, 0x70, 0x40, 0x9d, 0x80, 0x11, 0x1f, 0xc0,
+	0x33, 0x7d, 0x73, 0x40, 0x03, 0xea, 0xb3, 0x5a, 0xe1, 0xea, 0xe4, 0xb5, 0xea, 0xf5, 0x37, 0x73,
+	0x29, 0xdd, 0x0a, 0x61, 0x9a, 0xe4, 0xc7, 0x07, 0xf5, 0x33, 0x87, 0x07, 0x75, 0xd0, 0x24, 0x86,
 	0x31, 0x2d, 0xc4, 0x81, 0x8a, 0xe9, 0x07, 0x76, 0xc7, 0x6c, 0x07, 0xac, 0x36, 0x21, 0x54, 0xbe,
-	0x95, 0x4b, 0xe5, 0x8a, 0x42, 0x69, 0x9e, 0x53, 0x1a, 0x2b, 0x21, 0x85, 0x61, 0xa4, 0xc2, 0xf8,
-	0xb7, 0x49, 0x28, 0x87, 0x0c, 0x72, 0x05, 0xa6, 0x1c, 0x73, 0x40, 0xc5, 0xdb, 0xab, 0x34, 0x67,
-	0x54, 0xc3, 0xa9, 0x4d, 0x73, 0xc0, 0x07, 0xc8, 0x1c, 0x50, 0x2e, 0xe1, 0x99, 0x41, 0x4f, 0xbc,
-	0x81, 0x98, 0xc4, 0xb6, 0x19, 0xf4, 0x50, 0x70, 0xc8, 0x65, 0x98, 0x1a, 0xb8, 0x16, 0xad, 0x4d,
-	0x5e, 0x29, 0x5c, 0x2d, 0xca, 0x01, 0xbe, 0xeb, 0x5a, 0x14, 0x05, 0x95, 0xb7, 0xef, 0xf8, 0xee,
-	0xa0, 0x36, 0x95, 0x6c, 0xbf, 0xee, 0xbb, 0x03, 0x14, 0x1c, 0xf2, 0x27, 0x05, 0x98, 0x0f, 0xbb,
-	0x77, 0xc7, 0x6d, 0x9b, 0x81, 0xed, 0x3a, 0xb5, 0xa2, 0x78, 0xe1, 0xd7, 0xc7, 0x1a, 0x88, 0x10,
-	0xac, 0x59, 0x53, 0x5a, 0xe7, 0xd3, 0x1c, 0x1c, 0x51, 0x4c, 0xae, 0x01, 0x74, 0xfb, 0xee, 0xae,
-	0xd9, 0xe7, 0x63, 0x50, 0x2b, 0x89, 0x5e, 0xeb, 0x57, 0x78, 0x43, 0x73, 0x30, 0x26, 0x45, 0xf6,
-	0x60, 0xda, 0x94, 0xab, 0xa2, 0x36, 0x2d, 0xfa, 0xbd, 0x96, 0xb3, 0xdf, 0x89, 0x95, 0xd5, 0xac,
-	0x1e, 0x1e, 0xd4, 0xa7, 0x15, 0x11, 0x43, 0x0d, 0xe4, 0xe3, 0x50, 0x76, 0x3d, 0xde, 0x55, 0xb3,
-	0x5f, 0x2b, 0x5f, 0x29, 0x5c, 0x2d, 0x37, 0xe7, 0x55, 0xf7, 0xca, 0x5b, 0x8a, 0x8e, 0x5a, 0xc2,
-	0xf8, 0xcf, 0x22, 0x8c, 0x3c, 0x35, 0x79, 0x1d, 0xaa, 0x0a, 0xed, 0x8e, 0xdb, 0x65, 0xe2, 0xe5,
-	0x97, 0x9b, 0x73, 0x87, 0x07, 0xf5, 0xea, 0x4a, 0x44, 0xc6, 0xb8, 0x0c, 0x79, 0x00, 0x13, 0xec,
-	0x0d, 0xb5, 0x0c, 0xdf, 0xc9, 0xf5, 0x74, 0xad, 0x37, 0xf4, 0x04, 0x2d, 0x1d, 0x1e, 0xd4, 0x27,
-	0x5a, 0x6f, 0xe0, 0x04, 0x7b, 0x83, 0x9b, 0x8f, 0xae, 0x1d, 0x88, 0xc9, 0x93, 0xd7, 0x7c, 0xdc,
-	0xb0, 0x03, 0x0d, 0x2d, 0xcc, 0xc7, 0x0d, 0x3b, 0x40, 0x8e, 0xca, 0xcd, 0x47, 0x2f, 0x08, 0x3c,
-	0x31, 0xf9, 0xf2, 0x9a, 0x8f, 0x9b, 0x3b, 0x3b, 0xdb, 0x1a, 0x5e, 0xcc, 0x6e, 0x4e, 0x41, 0x01,
-	0x4c, 0x3e, 0xe0, 0x23, 0x29, 0x79, 0xae, 0xbf, 0xaf, 0x66, 0xed, 0xcd, 0xb1, 0x66, 0xad, 0xeb,
-	0xef, 0x6b, 0x75, 0xea, 0x9d, 0x68, 0x06, 0xc6, 0xb5, 0x89, 0xa7, 0xb3, 0x3a, 0x4c, 0x4c, 0xd2,
-	0xdc, 0x4f, 0xb7, 0xb6, 0xde, 0x4a, 0x3d, 0xdd, 0xda, 0x7a, 0x0b, 0x05, 0x30, 0x7f, 0x37, 0xbe,
-	0xf9, 0x58, 0xcd, 0xe9, 0x7c, 0xef, 0x06, 0xcd, 0xc7, 0xc9, 0x77, 0x83, 0xe6, 0x63, 0xe4, 0xa8,
-	0x1c, 0xdc, 0x65, 0x4c, 0x4c, 0xe1, 0xbc, 0xe0, 0x5b, 0xad, 0x56, 0x12, 0x7c, 0xab, 0xd5, 0x42,
-	0x8e, 0x6a, 0x74, 0xe1, 0x42, 0xc8, 0x41, 0xea, 0xb9, 0xcc, 0x16, 0xa3, 0x47, 0x3b, 0x64, 0x19,
-	0x2a, 0x6d, 0xd7, 0xe9, 0xd8, 0xdd, 0xbb, 0xa6, 0xa7, 0xac, 0x9e, 0x36, 0x97, 0xab, 0x21, 0x03,
-	0x23, 0x19, 0xf2, 0x32, 0x4c, 0xee, 0xd1, 0x7d, 0x65, 0xfe, 0xaa, 0x4a, 0x74, 0xf2, 0x36, 0xdd,
-	0x47, 0x4e, 0x37, 0x7e, 0x50, 0x80, 0xf3, 0x19, 0x6f, 0x8e, 0x37, 0x1b, 0xfa, 0x7d, 0xa5, 0x41,
-	0x37, 0xbb, 0x87, 0x77, 0x90, 0xd3, 0xc9, 0x37, 0x0a, 0x30, 0x17, 0x7b, 0x95, 0x2b, 0x43, 0x65,
-	0x61, 0xf3, 0x9b, 0x8e, 0x04, 0x56, 0xf3, 0x92, 0xd2, 0x38, 0x97, 0x62, 0x60, 0x5a, 0xab, 0xf1,
-	0x8f, 0x62, 0x4b, 0x4f, 0xd0, 0x88, 0x09, 0x67, 0x87, 0x8c, 0xfa, 0xdc, 0xfe, 0xb7, 0x68, 0xdb,
-	0xa7, 0x81, 0xda, 0xdd, 0x5f, 0x6d, 0x48, 0xbf, 0x81, 0xf7, 0xa2, 0xc1, 0xbd, 0x9d, 0xc6, 0xa3,
-	0xd7, 0x1b, 0x52, 0xe2, 0x36, 0xdd, 0x6f, 0xd1, 0x3e, 0xe5, 0x18, 0x4d, 0x72, 0x78, 0x50, 0x3f,
-	0x7b, 0x2f, 0x01, 0x80, 0x29, 0x40, 0xae, 0xc2, 0x33, 0x19, 0x7b, 0xec, 0xfa, 0x96, 0x52, 0x31,
-	0xf1, 0xcc, 0x2a, 0xb6, 0x13, 0x00, 0x98, 0x02, 0x34, 0xbe, 0x5d, 0x80, 0xe9, 0xa6, 0xd9, 0xde,
-	0x73, 0x3b, 0x1d, 0x6e, 0x34, 0xad, 0xa1, 0x2f, 0xb7, 0x16, 0xf9, 0x4e, 0xb4, 0xd1, 0x5c, 0x53,
-	0x74, 0xd4, 0x12, 0xe4, 0x35, 0x28, 0xc9, 0xe1, 0x10, 0x9d, 0x2a, 0x36, 0xcf, 0x2a, 0xd9, 0xd2,
-	0xba, 0xa0, 0xa2, 0xe2, 0x92, 0x4f, 0x43, 0x75, 0x60, 0xbe, 0x1f, 0x02, 0x08, 0x1b, 0x56, 0x69,
-	0x9e, 0x57, 0xc2, 0xd5, 0xbb, 0x11, 0x0b, 0xe3, 0x72, 0xc6, 0x37, 0x0b, 0xc0, 0xe7, 0x9a, 0x65,
-	0x0b, 0x65, 0x5f, 0x86, 0x12, 0x0b, 0xcc, 0x60, 0xc8, 0x54, 0xc7, 0xd6, 0x43, 0x65, 0x2d, 0x41,
-	0x3d, 0x3a, 0xa8, 0x9f, 0xc8, 0x29, 0x6c, 0x68, 0x44, 0xd9, 0x0e, 0x15, 0x2a, 0xdf, 0x80, 0x83,
-	0x7d, 0x8f, 0xa6, 0x37, 0xf0, 0x9d, 0x7d, 0x8f, 0xa2, 0xe0, 0x18, 0x5f, 0x02, 0x58, 0x75, 0x9d,
-	0xc0, 0x76, 0x86, 0x74, 0xcb, 0x21, 0xaf, 0x40, 0x91, 0xfa, 0xbe, 0xeb, 0xab, 0x6d, 0x61, 0x56,
-	0x35, 0x28, 0x5e, 0xe7, 0x44, 0x94, 0x3c, 0x39, 0x42, 0x76, 0x9f, 0x5a, 0x02, 0xb6, 0x1c, 0x1f,
-	0x21, 0x4e, 0x45, 0xc5, 0x35, 0x1a, 0x30, 0xbd, 0xea, 0x0e, 0x9d, 0x80, 0xfa, 0x1c, 0xf7, 0x91,
-	0xd9, 0x1f, 0x86, 0xbe, 0x86, 0xc6, 0xbd, 0xcf, 0x89, 0x28, 0x79, 0xc6, 0x8f, 0x27, 0x60, 0x66,
-	0xd5, 0x77, 0x9d, 0x07, 0x6a, 0x86, 0x93, 0xdf, 0x82, 0x32, 0x7f, 0x40, 0xcb, 0x0c, 0x4c, 0x35,
-	0x09, 0x3f, 0x19, 0x9b, 0x21, 0x7a, 0x38, 0xa2, 0xb5, 0xc1, 0xa5, 0xf9, 0x9c, 0xd9, 0xda, 0x7d,
-	0x48, 0xdb, 0xc1, 0x5d, 0x1a, 0x98, 0xd1, 0xf6, 0x1d, 0xd1, 0x50, 0xa3, 0x92, 0x2e, 0x4c, 0x31,
-	0x8f, 0xb6, 0xd5, 0xfc, 0xcb, 0xe7, 0x71, 0xc4, 0xbb, 0xdc, 0xf2, 0x68, 0x3b, 0x1a, 0x66, 0xfe,
-	0x0f, 0x85, 0x02, 0xe2, 0xea, 0x17, 0x2d, 0x37, 0xbb, 0x1b, 0xe3, 0xab, 0x12, 0x70, 0xd1, 0xe0,
-	0x27, 0xdf, 0xbc, 0xf1, 0xd3, 0x02, 0xcc, 0xc7, 0xc5, 0xef, 0xd8, 0x2c, 0x20, 0xef, 0x8d, 0x0c,
-	0x68, 0xe3, 0x64, 0x03, 0xca, 0x5b, 0x8b, 0xe1, 0xd4, 0x2b, 0x27, 0xa4, 0xc4, 0x06, 0xb3, 0x03,
-	0x45, 0x3b, 0xa0, 0x83, 0xd0, 0x91, 0x5d, 0x19, 0xfb, 0x11, 0xa3, 0x79, 0xb2, 0xc1, 0x71, 0x51,
-	0xc2, 0x1b, 0xff, 0x53, 0x4c, 0x3e, 0x1a, 0x1f, 0x66, 0xee, 0x48, 0xce, 0x3c, 0x8e, 0x11, 0xd4,
-	0xf3, 0xe5, 0xeb, 0x44, 0xe2, 0x75, 0xfe, 0x3f, 0xd5, 0x89, 0x99, 0x38, 0xf5, 0x28, 0xf5, 0x1f,
-	0x13, 0xca, 0xb9, 0xc9, 0xe1, 0x51, 0x94, 0x35, 0xec, 0x87, 0x6b, 0x4f, 0x0f, 0x5c, 0x4b, 0xd1,
-	0x51, 0x4b, 0x90, 0xf7, 0xe0, 0x5c, 0xdb, 0x75, 0xda, 0x43, 0xdf, 0xa7, 0x4e, 0x7b, 0x7f, 0x5b,
-	0x44, 0x89, 0xca, 0xa0, 0x34, 0x54, 0xb3, 0x73, 0xab, 0x69, 0x81, 0xa3, 0x2c, 0x22, 0x8e, 0x02,
-	0x91, 0x8f, 0xc1, 0x34, 0x1b, 0x32, 0x8f, 0x3a, 0x96, 0x70, 0x85, 0xca, 0xcd, 0x39, 0x85, 0x39,
-	0xdd, 0x92, 0x64, 0x0c, 0xf9, 0xe4, 0x1e, 0x5c, 0x62, 0x01, 0xdf, 0x24, 0x9c, 0xee, 0x1a, 0x35,
-	0xad, 0xbe, 0xed, 0x70, 0x93, 0xed, 0x3a, 0x16, 0x13, 0xde, 0xcd, 0x64, 0xf3, 0x23, 0x87, 0x07,
-	0xf5, 0x4b, 0xad, 0x6c, 0x11, 0x3c, 0xae, 0x2d, 0xf9, 0x32, 0x2c, 0xb2, 0x61, 0xbb, 0x4d, 0x19,
-	0xeb, 0x0c, 0xfb, 0xb7, 0xdc, 0x5d, 0x76, 0xd3, 0x66, 0x7c, 0xbf, 0xb9, 0x63, 0x0f, 0xec, 0x40,
-	0x78, 0x30, 0xc5, 0xe6, 0xd2, 0xe1, 0x41, 0x7d, 0xb1, 0x75, 0xac, 0x14, 0x3e, 0x01, 0x81, 0x20,
-	0x5c, 0x94, 0x26, 0x67, 0x04, 0x7b, 0x5a, 0x60, 0x2f, 0x1e, 0x1e, 0xd4, 0x2f, 0xae, 0x67, 0x4a,
-	0xe0, 0x31, 0x2d, 0xf9, 0x1b, 0xe4, 0xc1, 0xf0, 0xd7, 0x78, 0x00, 0x5a, 0x4e, 0xbe, 0xc1, 0x1d,
-	0x45, 0x47, 0x2d, 0x41, 0x1e, 0x46, 0x93, 0x8f, 0x2f, 0x8a, 0x5a, 0x25, 0xa7, 0xb5, 0x5a, 0xe0,
-	0x81, 0xca, 0x83, 0x18, 0x12, 0x5f, 0x58, 0x98, 0xc0, 0x36, 0xfe, 0xa1, 0x00, 0x64, 0xd4, 0x10,
-	0x90, 0xdb, 0x50, 0x32, 0xdb, 0x01, 0x0f, 0x43, 0x64, 0xe8, 0xfa, 0x4a, 0xd6, 0x66, 0x2a, 0x55,
-	0x21, 0xed, 0x50, 0x3e, 0x43, 0x68, 0x64, 0x3d, 0x56, 0x44, 0x53, 0x54, 0x10, 0xc4, 0x85, 0x73,
-	0x7d, 0x93, 0x05, 0xe1, 0x5c, 0xb5, 0xf8, 0x23, 0x2b, 0x23, 0xf9, 0x2b, 0x27, 0x7b, 0x28, 0xde,
-	0xa2, 0x79, 0x81, 0xcf, 0xdc, 0x3b, 0x69, 0x20, 0x1c, 0xc5, 0x36, 0x7e, 0x58, 0x82, 0xe9, 0xb5,
-	0x95, 0x1b, 0x3b, 0x26, 0xdb, 0x3b, 0x41, 0x5c, 0xca, 0x5f, 0x0e, 0x1d, 0x78, 0x7d, 0x33, 0x18,
-	0x59, 0x5e, 0x3b, 0x8a, 0x8e, 0x5a, 0x82, 0xb8, 0x3c, 0xc8, 0x56, 0x51, 0xbe, 0x32, 0xbf, 0x6f,
-	0xe7, 0x74, 0xb4, 0x14, 0x4a, 0x3c, 0xca, 0x56, 0x24, 0x8c, 0x74, 0x10, 0x06, 0xd5, 0x50, 0x39,
-	0xd2, 0x8e, 0x0a, 0x40, 0x72, 0x66, 0x47, 0x22, 0x1c, 0x19, 0x10, 0xc4, 0x08, 0x18, 0xd7, 0x42,
-	0x3e, 0x05, 0x33, 0x16, 0xe5, 0xab, 0x98, 0x3a, 0x6d, 0x9b, 0xf2, 0x05, 0x3b, 0xc9, 0xc7, 0x85,
-	0x1b, 0xae, 0xb5, 0x18, 0x1d, 0x13, 0x52, 0xe4, 0x21, 0x54, 0x1e, 0xdb, 0x41, 0x4f, 0xd8, 0xd7,
-	0x5a, 0x49, 0x4c, 0x9c, 0xcf, 0xe4, 0xea, 0x28, 0x47, 0x88, 0x86, 0xe5, 0x41, 0x88, 0x89, 0x11,
-	0x3c, 0x77, 0xbf, 0xf9, 0x1f, 0x91, 0x0a, 0x11, 0x2b, 0xb3, 0x92, 0x6c, 0x20, 0x18, 0x18, 0xc9,
-	0x10, 0x06, 0x33, 0xfc, 0x4f, 0x8b, 0x7e, 0x75, 0xc8, 0x67, 0xab, 0x0a, 0x17, 0xf2, 0x25, 0x48,
-	0x42, 0x10, 0x39, 0x22, 0x0f, 0x62, 0xb0, 0x98, 0x50, 0xc2, 0x67, 0xdf, 0xe3, 0x1e, 0x75, 0xc4,
-	0x12, 0x8e, 0xcd, 0xbe, 0x07, 0x3d, 0xea, 0xa0, 0xe0, 0x10, 0x17, 0xa0, 0xad, 0x5d, 0xa6, 0x1a,
-	0x8c, 0x11, 0x16, 0x47, 0x9e, 0x57, 0xf3, 0x2c, 0xf7, 0x51, 0xa2, 0xff, 0x18, 0x53, 0xc1, 0x1d,
-	0x2e, 0xd7, 0xb9, 0xfe, 0xbe, 0x1d, 0xd4, 0xaa, 0xa2, 0x53, 0x7a, 0xd5, 0x6e, 0x09, 0x2a, 0x2a,
-	0xae, 0xf1, 0xc3, 0x02, 0x54, 0xf9, 0x22, 0x0a, 0x27, 0xfe, 0x6b, 0x50, 0x0a, 0x4c, 0xbf, 0xab,
-	0x5c, 0xf8, 0x58, 0xbb, 0x1d, 0x41, 0x45, 0xc5, 0x25, 0x26, 0x14, 0x03, 0x93, 0xed, 0x85, 0x1b,
-	0xf7, 0xe7, 0x73, 0x3d, 0x8b, 0x5a, 0xbd, 0xd1, 0x9e, 0xcd, 0xff, 0x31, 0x94, 0xc8, 0xe4, 0x2a,
-	0x94, 0xb9, 0xa1, 0x5d, 0x37, 0x99, 0x0c, 0xf7, 0xcb, 0xcd, 0x19, 0xbe, 0x5a, 0xd7, 0x15, 0x0d,
-	0x35, 0xd7, 0x78, 0x0f, 0xce, 0x5e, 0x7f, 0x9f, 0xb6, 0x87, 0x81, 0xeb, 0xcb, 0x98, 0x8c, 0xdc,
-	0x02, 0xc2, 0xa8, 0xff, 0xc8, 0x6e, 0xd3, 0x95, 0x76, 0x9b, 0x3b, 0x94, 0x9b, 0x91, 0x75, 0x58,
-	0x54, 0xda, 0x48, 0x6b, 0x44, 0x02, 0x33, 0x5a, 0x19, 0xf7, 0xa1, 0x78, 0xc3, 0x1c, 0x76, 0xe9,
-	0x89, 0x3c, 0x52, 0xde, 0x6b, 0x9f, 0x9a, 0xfd, 0x20, 0xb4, 0x7e, 0xaa, 0xd7, 0xa8, 0x68, 0xa8,
-	0xb9, 0xc6, 0x5f, 0x4f, 0x41, 0x35, 0x96, 0x8a, 0xe0, 0xb3, 0xc8, 0xa7, 0x9e, 0x9b, 0xb6, 0x61,
-	0x3c, 0x1e, 0x45, 0xc1, 0xe1, 0x36, 0xcc, 0xa7, 0x8f, 0x6c, 0xc6, 0x83, 0x87, 0x94, 0x0d, 0x43,
-	0x45, 0x47, 0x2d, 0x41, 0xea, 0x50, 0xb4, 0xa8, 0x17, 0xf4, 0xc4, 0xe0, 0x4d, 0x35, 0x2b, 0xbc,
-	0xab, 0x6b, 0x9c, 0x80, 0x92, 0xce, 0x05, 0x3a, 0x34, 0x68, 0xf7, 0x6a, 0x53, 0x62, 0xdd, 0x0b,
-	0x81, 0x75, 0x4e, 0x40, 0x49, 0xcf, 0x88, 0xeb, 0x8a, 0xcf, 0x3f, 0xae, 0x2b, 0x9d, 0x72, 0x5c,
-	0x47, 0x3c, 0x38, 0xcf, 0x58, 0x6f, 0xdb, 0xb7, 0x1f, 0x99, 0x01, 0x15, 0x8d, 0x85, 0x9e, 0xe9,
-	0x67, 0xd1, 0x73, 0xe9, 0xf0, 0xa0, 0x7e, 0xbe, 0xd5, 0xba, 0x99, 0x46, 0xc1, 0x2c, 0x68, 0xd2,
-	0x82, 0x0b, 0xb6, 0xc3, 0x68, 0x7b, 0xe8, 0xd3, 0x8d, 0xae, 0xe3, 0xfa, 0xf4, 0xa6, 0xcb, 0x38,
-	0x9c, 0xca, 0xbf, 0xbd, 0xac, 0x5e, 0xda, 0x85, 0x8d, 0x2c, 0x21, 0xcc, 0x6e, 0x6b, 0xfc, 0xb8,
-	0x00, 0x33, 0xf1, 0xec, 0x0b, 0x61, 0x00, 0xbd, 0xb5, 0xf5, 0x96, 0x9c, 0xf1, 0xca, 0x77, 0x7d,
-	0x27, 0x77, 0x52, 0x47, 0xc2, 0x44, 0xb1, 0x4f, 0x44, 0xc3, 0x98, 0x9a, 0x13, 0xa4, 0x77, 0x5f,
-	0x81, 0x62, 0xc7, 0xf5, 0xdb, 0x54, 0xad, 0x59, 0xbd, 0x4a, 0xd6, 0x39, 0x11, 0x25, 0xcf, 0xf8,
-	0xd7, 0x02, 0xc4, 0x34, 0x90, 0xdf, 0x85, 0x59, 0xae, 0xe3, 0xb6, 0xbf, 0x9b, 0x78, 0x9a, 0x66,
-	0xee, 0xa7, 0xd1, 0x48, 0xcd, 0x0b, 0x4a, 0xff, 0x6c, 0x82, 0x8c, 0x49, 0x7d, 0xe4, 0x57, 0xa1,
-	0x62, 0x5a, 0x96, 0x4f, 0x19, 0xa3, 0xd2, 0xa4, 0x55, 0x9a, 0xb3, 0x62, 0xaf, 0x0e, 0x89, 0x18,
-	0xf1, 0xf9, 0x32, 0xec, 0x59, 0x1d, 0xc6, 0x67, 0xb6, 0x72, 0xb9, 0xf5, 0x32, 0xe4, 0x4a, 0x38,
-	0x1d, 0xb5, 0x84, 0xf1, 0xcd, 0x29, 0x48, 0xea, 0x26, 0x16, 0xcc, 0xed, 0xf9, 0xbb, 0xab, 0xab,
-	0x66, 0xbb, 0x97, 0x2b, 0x5f, 0x72, 0xfe, 0xf0, 0xa0, 0x3e, 0x77, 0x3b, 0x89, 0x80, 0x69, 0x48,
-	0xa5, 0xe5, 0x36, 0xdd, 0x0f, 0xcc, 0xdd, 0x3c, 0x29, 0x93, 0x50, 0x4b, 0x1c, 0x01, 0xd3, 0x90,
-	0xe4, 0xd3, 0x50, 0xdd, 0xf3, 0x77, 0xc3, 0x45, 0x9e, 0x4e, 0x69, 0xdc, 0x8e, 0x58, 0x18, 0x97,
-	0xe3, 0x43, 0xb8, 0xe7, 0xef, 0x72, 0xa3, 0x18, 0x66, 0xfa, 0xf5, 0x10, 0xde, 0x56, 0x74, 0xd4,
-	0x12, 0xc4, 0x03, 0xb2, 0x17, 0x8e, 0x9e, 0x4e, 0xba, 0x29, 0x5b, 0x74, 0x35, 0xeb, 0x69, 0xb4,
-	0x50, 0xfc, 0x81, 0x2e, 0x72, 0x9b, 0x7f, 0x7b, 0x04, 0x07, 0x33, 0xb0, 0xc9, 0x97, 0xe0, 0xd2,
-	0x9e, 0xbf, 0xab, 0x36, 0x88, 0x6d, 0xdf, 0x76, 0xda, 0xb6, 0x97, 0x48, 0xf1, 0xd7, 0x55, 0x77,
-	0x2f, 0xdd, 0xce, 0x16, 0xc3, 0xe3, 0xda, 0x1b, 0x9f, 0x80, 0x99, 0x78, 0x8a, 0xf8, 0x29, 0x99,
-	0x3f, 0xe3, 0x01, 0x54, 0x44, 0x90, 0xd1, 0xe5, 0xde, 0x8d, 0xde, 0x81, 0x26, 0x9f, 0xb0, 0x03,
-	0xbd, 0x0a, 0xd3, 0xbb, 0xc3, 0xf6, 0x1e, 0x0d, 0x98, 0x30, 0xec, 0x05, 0x79, 0x2e, 0xd0, 0x94,
-	0x24, 0x0c, 0x79, 0xc6, 0xbf, 0x17, 0xa0, 0xb4, 0xe1, 0x78, 0xc3, 0x5f, 0x90, 0x63, 0xac, 0xef,
-	0x4d, 0xc1, 0x14, 0xf7, 0x29, 0xc9, 0x55, 0x95, 0xdf, 0x2a, 0x88, 0xe8, 0x74, 0x21, 0x9e, 0xdf,
-	0x3a, 0x4a, 0xe4, 0xb9, 0xc8, 0xdb, 0x50, 0x72, 0x86, 0x83, 0xfb, 0x66, 0x5f, 0x59, 0xbb, 0xd7,
-	0x42, 0x5f, 0x68, 0x53, 0x50, 0x8f, 0x0e, 0xea, 0x0b, 0xd4, 0x69, 0xbb, 0x96, 0xed, 0x74, 0x97,
-	0x1f, 0x32, 0xd7, 0x69, 0x6c, 0x0e, 0x07, 0xbb, 0xd4, 0x47, 0xd5, 0x8a, 0x47, 0xd1, 0xbb, 0xae,
-	0xdb, 0xe7, 0x00, 0x93, 0xc9, 0x28, 0xba, 0x29, 0xc9, 0x18, 0xf2, 0xb9, 0xdb, 0xc5, 0x02, 0x9f,
-	0x4b, 0x4e, 0x25, 0xdd, 0xae, 0x96, 0xa0, 0xa2, 0xe2, 0x92, 0x01, 0x94, 0x06, 0xa6, 0xc7, 0xe5,
-	0x8a, 0x62, 0xc8, 0xae, 0xe7, 0x76, 0xbc, 0x1b, 0x77, 0x05, 0xce, 0x75, 0x27, 0xf0, 0xf7, 0x23,
-	0x75, 0x92, 0x88, 0x4a, 0x09, 0xb1, 0x61, 0xba, 0x6f, 0xb3, 0x80, 0xeb, 0x2b, 0x8d, 0x31, 0x2b,
-	0xb8, 0x3e, 0x31, 0x45, 0xa3, 0x11, 0xb8, 0x23, 0x61, 0x31, 0xc4, 0x5f, 0xdc, 0x87, 0x6a, 0xac,
-	0x47, 0x64, 0x5e, 0xa6, 0xd1, 0xc5, 0xaa, 0x10, 0x99, 0x73, 0xb2, 0x13, 0xce, 0xfd, 0x89, 0x31,
-	0xc2, 0x31, 0xdd, 0x13, 0xb5, 0x58, 0x3e, 0x3b, 0xf1, 0x66, 0xe1, 0xb3, 0xe5, 0xef, 0xfc, 0x45,
-	0xfd, 0xcc, 0xd7, 0xff, 0xe9, 0xca, 0x19, 0xe3, 0xef, 0x26, 0xa1, 0xa2, 0x45, 0xfe, 0x6f, 0xcf,
-	0x14, 0x3f, 0x35, 0x53, 0x6e, 0x8d, 0x37, 0x5e, 0x27, 0x9a, 0x2e, 0x2b, 0xc9, 0xe9, 0x32, 0xd3,
-	0xfc, 0xff, 0xb1, 0x57, 0x7d, 0x74, 0x50, 0xaf, 0x25, 0x07, 0x01, 0xcd, 0xc7, 0x77, 0x29, 0x63,
-	0x66, 0x97, 0x46, 0xd3, 0xe0, 0x33, 0x4f, 0x9b, 0x06, 0x0b, 0xf1, 0x69, 0x50, 0xc9, 0x7e, 0x8d,
-	0x7d, 0x98, 0xba, 0x63, 0x3b, 0x27, 0xc9, 0x0a, 0xbc, 0x02, 0x45, 0xd6, 0x76, 0x75, 0xb6, 0x5b,
-	0x1b, 0xd4, 0x16, 0x27, 0xa2, 0xe4, 0x85, 0x16, 0x7a, 0xf2, 0x18, 0x0b, 0xfd, 0xf5, 0x49, 0x28,
-	0x87, 0x79, 0x17, 0xf2, 0x87, 0x05, 0xa8, 0x9a, 0x8e, 0xe3, 0x06, 0x22, 0x75, 0x1f, 0x1a, 0xd3,
-	0xcd, 0x5c, 0x83, 0x1f, 0x82, 0x36, 0x56, 0x22, 0x40, 0xf9, 0x02, 0xf4, 0x06, 0x1b, 0xe3, 0x60,
-	0x5c, 0x2f, 0xf9, 0x2a, 0x94, 0xfa, 0xe6, 0x2e, 0xed, 0x87, 0xb6, 0x75, 0x63, 0xbc, 0x1e, 0xdc,
-	0x11, 0x58, 0xa9, 0xb7, 0x2f, 0x89, 0xa8, 0x14, 0x2d, 0xbe, 0x0d, 0xf3, 0xe9, 0x8e, 0x3e, 0xcb,
-	0xfb, 0xe3, 0xaf, 0x3e, 0xa6, 0xe6, 0x59, 0x9a, 0x1a, 0x5f, 0x84, 0xea, 0x5d, 0x1a, 0xf8, 0x76,
-	0x5b, 0x00, 0x84, 0x67, 0x70, 0x85, 0xec, 0x33, 0xb8, 0x68, 0x17, 0x9d, 0x78, 0xc2, 0xc9, 0xc2,
-	0xd7, 0x60, 0x5a, 0x42, 0x32, 0x1e, 0xbc, 0x7b, 0xbe, 0x3b, 0xa0, 0x41, 0x8f, 0x0e, 0xc3, 0x37,
-	0x9a, 0xcf, 0xd1, 0xde, 0xd6, 0x30, 0x32, 0x78, 0x8f, 0xfe, 0x63, 0x4c, 0x85, 0xf1, 0xdf, 0x15,
-	0x80, 0x4d, 0xd7, 0xa2, 0x2a, 0x4d, 0xb7, 0x08, 0x13, 0xb6, 0xa5, 0x9e, 0x06, 0x54, 0x67, 0x27,
-	0x36, 0xd6, 0x70, 0xc2, 0xb6, 0xf4, 0x14, 0x9f, 0x38, 0x76, 0x8a, 0x7f, 0x1a, 0xaa, 0x96, 0xcd,
-	0xbc, 0xbe, 0xb9, 0xbf, 0x99, 0xe1, 0xa1, 0xad, 0x45, 0x2c, 0x8c, 0xcb, 0x91, 0x8f, 0x2b, 0xe3,
-	0x27, 0xad, 0x4c, 0x2d, 0x65, 0xfc, 0xca, 0xbc, 0x7b, 0x31, 0x03, 0xf8, 0x26, 0xcc, 0x84, 0x89,
-	0x25, 0xa1, 0xa5, 0x28, 0x5a, 0x85, 0x26, 0x73, 0x66, 0x27, 0xc6, 0xc3, 0x84, 0x64, 0x3a, 0xf1,
-	0x55, 0x7a, 0x21, 0x89, 0xaf, 0x35, 0x98, 0x67, 0x81, 0xeb, 0x53, 0x2b, 0x94, 0xd8, 0x58, 0xab,
-	0x91, 0xc4, 0x83, 0xce, 0xb7, 0x52, 0x7c, 0x1c, 0x69, 0x41, 0xb6, 0x61, 0x21, 0xec, 0x44, 0xfc,
-	0x01, 0x6b, 0xe7, 0x05, 0xd2, 0x65, 0x85, 0xb4, 0xf0, 0x20, 0x43, 0x06, 0x33, 0x5b, 0x92, 0xcf,
-	0xc1, 0x6c, 0xd8, 0x4d, 0x61, 0x81, 0x6a, 0x0b, 0x02, 0x4a, 0xc7, 0x30, 0x3b, 0x71, 0x26, 0x26,
-	0x65, 0xc9, 0x27, 0xa1, 0xe8, 0xf5, 0x4c, 0x46, 0x55, 0x9e, 0x2c, 0x4c, 0x73, 0x14, 0xb7, 0x39,
-	0xf1, 0xe8, 0xa0, 0x5e, 0xe1, 0xef, 0x4c, 0xfc, 0x41, 0x29, 0x48, 0xae, 0x01, 0xec, 0xba, 0x43,
-	0xc7, 0x32, 0xfd, 0xfd, 0x8d, 0x35, 0x95, 0xb2, 0xd6, 0x7e, 0x5b, 0x53, 0x73, 0x30, 0x26, 0xc5,
-	0xb7, 0xaa, 0x81, 0x34, 0xda, 0x2a, 0xdd, 0xa5, 0xb7, 0x2a, 0x6d, 0xcb, 0x15, 0x9f, 0xbc, 0x0b,
-	0x15, 0x91, 0xde, 0xa7, 0xd6, 0x4a, 0xa0, 0x72, 0x5e, 0xcf, 0x92, 0x09, 0xd6, 0xfe, 0x5c, 0x2b,
-	0x04, 0xc1, 0x08, 0x8f, 0x7c, 0x19, 0xa0, 0x63, 0x3b, 0x36, 0xeb, 0x09, 0xf4, 0xea, 0x33, 0xa3,
-	0xeb, 0xe7, 0x5c, 0xd7, 0x28, 0x18, 0x43, 0xe4, 0x46, 0xc2, 0x73, 0xad, 0x8d, 0xed, 0xda, 0x4c,
-	0xd2, 0x48, 0x6c, 0x73, 0x22, 0x4a, 0x1e, 0xb9, 0x0a, 0x65, 0xcb, 0xa4, 0x03, 0xd7, 0xa1, 0x56,
-	0x6d, 0x36, 0x4a, 0xf6, 0xac, 0x29, 0x1a, 0x6a, 0x2e, 0xf9, 0x0a, 0x94, 0x6c, 0xe1, 0x6c, 0xd7,
-	0xce, 0x8a, 0xae, 0x7e, 0x2e, 0xdf, 0x76, 0x2c, 0x20, 0x9a, 0xc0, 0xad, 0xaf, 0xfc, 0x8d, 0x0a,
-	0x96, 0xb4, 0x61, 0xda, 0x1d, 0x06, 0x42, 0xc3, 0x9c, 0xd0, 0x90, 0x2f, 0x25, 0xb7, 0x25, 0x31,
+	0x91, 0x4b, 0xe5, 0xb2, 0x42, 0x69, 0x9e, 0x57, 0x1a, 0x2b, 0x21, 0x85, 0x61, 0xa4, 0xc2, 0xf8,
+	0xd7, 0x49, 0x28, 0x87, 0x0c, 0x72, 0x15, 0xa6, 0x1c, 0x73, 0x40, 0xc5, 0xdb, 0xab, 0x34, 0x67,
+	0x54, 0xc3, 0xa9, 0x0d, 0x73, 0xc0, 0x07, 0xc8, 0x1c, 0x50, 0x2e, 0xe1, 0x99, 0x41, 0x4f, 0xbc,
+	0x81, 0x98, 0xc4, 0x96, 0x19, 0xf4, 0x50, 0x70, 0xc8, 0x15, 0x98, 0x1a, 0xb8, 0x16, 0xad, 0x4d,
+	0x5e, 0x2d, 0x5c, 0x2b, 0xca, 0x01, 0xbe, 0xe7, 0x5a, 0x14, 0x05, 0x95, 0xb7, 0xef, 0xf8, 0xee,
+	0xa0, 0x36, 0x95, 0x6c, 0xbf, 0xe6, 0xbb, 0x03, 0x14, 0x1c, 0xf2, 0x47, 0x05, 0x98, 0x0b, 0xbb,
+	0x77, 0xd7, 0x6d, 0x9b, 0x81, 0xed, 0x3a, 0xb5, 0xa2, 0x78, 0xe1, 0x37, 0xc6, 0x1a, 0x88, 0x10,
+	0xac, 0x59, 0x53, 0x5a, 0xe7, 0xd2, 0x1c, 0x1c, 0x51, 0x4c, 0xae, 0x03, 0x74, 0xfb, 0xee, 0x8e,
+	0xd9, 0xe7, 0x63, 0x50, 0x2b, 0x89, 0x5e, 0xeb, 0x57, 0x78, 0x53, 0x73, 0x30, 0x26, 0x45, 0x76,
+	0x61, 0xda, 0x94, 0xab, 0xa2, 0x36, 0x2d, 0xfa, 0xbd, 0x9a, 0xb3, 0xdf, 0x89, 0x95, 0xd5, 0xac,
+	0x1e, 0x1e, 0xd4, 0xa7, 0x15, 0x11, 0x43, 0x0d, 0xe4, 0x93, 0x50, 0x76, 0x3d, 0xde, 0x55, 0xb3,
+	0x5f, 0x2b, 0x5f, 0x2d, 0x5c, 0x2b, 0x37, 0xe7, 0x54, 0xf7, 0xca, 0x9b, 0x8a, 0x8e, 0x5a, 0xc2,
+	0xf8, 0x8f, 0x22, 0x8c, 0x3c, 0x35, 0x79, 0x15, 0xaa, 0x0a, 0xed, 0xae, 0xdb, 0x65, 0xe2, 0xe5,
+	0x97, 0x9b, 0xe7, 0x0e, 0x0f, 0xea, 0xd5, 0xe5, 0x88, 0x8c, 0x71, 0x19, 0xf2, 0x10, 0x26, 0xd8,
+	0x6b, 0x6a, 0x19, 0xbe, 0x95, 0xeb, 0xe9, 0x5a, 0xaf, 0xe9, 0x09, 0x5a, 0x3a, 0x3c, 0xa8, 0x4f,
+	0xb4, 0x5e, 0xc3, 0x09, 0xf6, 0x1a, 0x37, 0x1f, 0x5d, 0x3b, 0x10, 0x93, 0x27, 0xaf, 0xf9, 0xb8,
+	0x69, 0x07, 0x1a, 0x5a, 0x98, 0x8f, 0x9b, 0x76, 0x80, 0x1c, 0x95, 0x9b, 0x8f, 0x5e, 0x10, 0x78,
+	0x62, 0xf2, 0xe5, 0x35, 0x1f, 0xb7, 0xb6, 0xb7, 0xb7, 0x34, 0xbc, 0x98, 0xdd, 0x9c, 0x82, 0x02,
+	0x98, 0xbc, 0xcf, 0x47, 0x52, 0xf2, 0x5c, 0x7f, 0x5f, 0xcd, 0xda, 0x5b, 0x63, 0xcd, 0x5a, 0xd7,
+	0xdf, 0xd7, 0xea, 0xd4, 0x3b, 0xd1, 0x0c, 0x8c, 0x6b, 0x13, 0x4f, 0x67, 0x75, 0x98, 0x98, 0xa4,
+	0xb9, 0x9f, 0x6e, 0x75, 0xad, 0x95, 0x7a, 0xba, 0xd5, 0xb5, 0x16, 0x0a, 0x60, 0xfe, 0x6e, 0x7c,
+	0x73, 0x4f, 0xcd, 0xe9, 0x7c, 0xef, 0x06, 0xcd, 0xbd, 0xe4, 0xbb, 0x41, 0x73, 0x0f, 0x39, 0x2a,
+	0x07, 0x77, 0x19, 0x13, 0x53, 0x38, 0x2f, 0xf8, 0x66, 0xab, 0x95, 0x04, 0xdf, 0x6c, 0xb5, 0x90,
+	0xa3, 0x1a, 0x5d, 0xb8, 0x18, 0x72, 0x90, 0x7a, 0x2e, 0xb3, 0xc5, 0xe8, 0xd1, 0x0e, 0x59, 0x82,
+	0x4a, 0xdb, 0x75, 0x3a, 0x76, 0xf7, 0x9e, 0xe9, 0x29, 0xab, 0xa7, 0xcd, 0xe5, 0x4a, 0xc8, 0xc0,
+	0x48, 0x86, 0xbc, 0x08, 0x93, 0xbb, 0x74, 0x5f, 0x99, 0xbf, 0xaa, 0x12, 0x9d, 0xbc, 0x43, 0xf7,
+	0x91, 0xd3, 0x8d, 0x1f, 0x16, 0xe0, 0x42, 0xc6, 0x9b, 0xe3, 0xcd, 0x86, 0x7e, 0x5f, 0x69, 0xd0,
+	0xcd, 0xee, 0xe3, 0x5d, 0xe4, 0x74, 0xf2, 0xcd, 0x02, 0x9c, 0x8b, 0xbd, 0xca, 0xe5, 0xa1, 0xb2,
+	0xb0, 0xf9, 0x4d, 0x47, 0x02, 0xab, 0x79, 0x59, 0x69, 0x3c, 0x97, 0x62, 0x60, 0x5a, 0xab, 0xf1,
+	0xf7, 0x62, 0x4b, 0x4f, 0xd0, 0x88, 0x09, 0x67, 0x87, 0x8c, 0xfa, 0xdc, 0xfe, 0xb7, 0x68, 0xdb,
+	0xa7, 0x81, 0xda, 0xdd, 0x5f, 0x6e, 0x48, 0xbf, 0x81, 0xf7, 0xa2, 0xc1, 0xbd, 0x9d, 0xc6, 0xe3,
+	0x57, 0x1b, 0x52, 0xe2, 0x0e, 0xdd, 0x6f, 0xd1, 0x3e, 0xe5, 0x18, 0x4d, 0x72, 0x78, 0x50, 0x3f,
+	0x7b, 0x3f, 0x01, 0x80, 0x29, 0x40, 0xae, 0xc2, 0x33, 0x19, 0xdb, 0x73, 0x7d, 0x4b, 0xa9, 0x98,
+	0x78, 0x6a, 0x15, 0x5b, 0x09, 0x00, 0x4c, 0x01, 0x1a, 0xdf, 0x29, 0xc0, 0x74, 0xd3, 0x6c, 0xef,
+	0xba, 0x9d, 0x0e, 0x37, 0x9a, 0xd6, 0xd0, 0x97, 0x5b, 0x8b, 0x7c, 0x27, 0xda, 0x68, 0xae, 0x2a,
+	0x3a, 0x6a, 0x09, 0xf2, 0x0a, 0x94, 0xe4, 0x70, 0x88, 0x4e, 0x15, 0x9b, 0x67, 0x95, 0x6c, 0x69,
+	0x4d, 0x50, 0x51, 0x71, 0xc9, 0x67, 0xa1, 0x3a, 0x30, 0xdf, 0x0b, 0x01, 0x84, 0x0d, 0xab, 0x34,
+	0x2f, 0x28, 0xe1, 0xea, 0xbd, 0x88, 0x85, 0x71, 0x39, 0xe3, 0x5b, 0x05, 0xe0, 0x73, 0xcd, 0xb2,
+	0x85, 0xb2, 0xaf, 0x40, 0x89, 0x05, 0x66, 0x30, 0x64, 0xaa, 0x63, 0x6b, 0xa1, 0xb2, 0x96, 0xa0,
+	0x1e, 0x1d, 0xd4, 0x4f, 0xe4, 0x14, 0x36, 0x34, 0xa2, 0x6c, 0x87, 0x0a, 0x95, 0x6f, 0xc0, 0xc1,
+	0xbe, 0x47, 0xd3, 0x1b, 0xf8, 0xf6, 0xbe, 0x47, 0x51, 0x70, 0x8c, 0x2f, 0x03, 0xac, 0xb8, 0x4e,
+	0x60, 0x3b, 0x43, 0xba, 0xe9, 0x90, 0x97, 0xa0, 0x48, 0x7d, 0xdf, 0xf5, 0xd5, 0xb6, 0x30, 0xab,
+	0x1a, 0x14, 0x6f, 0x70, 0x22, 0x4a, 0x9e, 0x1c, 0x21, 0xbb, 0x4f, 0x2d, 0x01, 0x5b, 0x8e, 0x8f,
+	0x10, 0xa7, 0xa2, 0xe2, 0x1a, 0x0d, 0x98, 0x5e, 0x71, 0x87, 0x4e, 0x40, 0x7d, 0x8e, 0xfb, 0xd8,
+	0xec, 0x0f, 0x43, 0x5f, 0x43, 0xe3, 0x3e, 0xe0, 0x44, 0x94, 0x3c, 0xe3, 0x27, 0x13, 0x30, 0xb3,
+	0xe2, 0xbb, 0xce, 0x43, 0x35, 0xc3, 0xc9, 0x6f, 0x40, 0x99, 0x3f, 0xa0, 0x65, 0x06, 0xa6, 0x9a,
+	0x84, 0x9f, 0x8e, 0xcd, 0x10, 0x3d, 0x1c, 0xd1, 0xda, 0xe0, 0xd2, 0x7c, 0xce, 0x6c, 0xee, 0x3c,
+	0xa2, 0xed, 0xe0, 0x1e, 0x0d, 0xcc, 0x68, 0xfb, 0x8e, 0x68, 0xa8, 0x51, 0x49, 0x17, 0xa6, 0x98,
+	0x47, 0xdb, 0x6a, 0xfe, 0xe5, 0xf3, 0x38, 0xe2, 0x5d, 0x6e, 0x79, 0xb4, 0x1d, 0x0d, 0x33, 0xff,
+	0x87, 0x42, 0x01, 0x71, 0xf5, 0x8b, 0x96, 0x9b, 0xdd, 0xcd, 0xf1, 0x55, 0x09, 0xb8, 0x68, 0xf0,
+	0x93, 0x6f, 0xde, 0xf8, 0xa0, 0x00, 0x73, 0x71, 0xf1, 0xbb, 0x36, 0x0b, 0xc8, 0xbb, 0x23, 0x03,
+	0xda, 0x38, 0xd9, 0x80, 0xf2, 0xd6, 0x62, 0x38, 0xf5, 0xca, 0x09, 0x29, 0xb1, 0xc1, 0xec, 0x40,
+	0xd1, 0x0e, 0xe8, 0x20, 0x74, 0x64, 0x97, 0xc7, 0x7e, 0xc4, 0x68, 0x9e, 0xac, 0x73, 0x5c, 0x94,
+	0xf0, 0xc6, 0x7f, 0x17, 0x93, 0x8f, 0xc6, 0x87, 0x99, 0x3b, 0x92, 0x33, 0x7b, 0x31, 0x82, 0x7a,
+	0xbe, 0x7c, 0x9d, 0x48, 0xbc, 0xce, 0xff, 0xa7, 0x3a, 0x31, 0x13, 0xa7, 0x1e, 0xa5, 0xfe, 0x63,
+	0x42, 0x39, 0x37, 0x39, 0x3c, 0x8a, 0xb2, 0x86, 0xfd, 0x70, 0xed, 0xe9, 0x81, 0x6b, 0x29, 0x3a,
+	0x6a, 0x09, 0xf2, 0x2e, 0x9c, 0x6f, 0xbb, 0x4e, 0x7b, 0xe8, 0xfb, 0xd4, 0x69, 0xef, 0x6f, 0x89,
+	0x28, 0x51, 0x19, 0x94, 0x86, 0x6a, 0x76, 0x7e, 0x25, 0x2d, 0x70, 0x94, 0x45, 0xc4, 0x51, 0x20,
+	0xf2, 0x09, 0x98, 0x66, 0x43, 0xe6, 0x51, 0xc7, 0x12, 0xae, 0x50, 0xb9, 0x79, 0x4e, 0x61, 0x4e,
+	0xb7, 0x24, 0x19, 0x43, 0x3e, 0xb9, 0x0f, 0x97, 0x59, 0xc0, 0x37, 0x09, 0xa7, 0xbb, 0x4a, 0x4d,
+	0xab, 0x6f, 0x3b, 0xdc, 0x64, 0xbb, 0x8e, 0xc5, 0x84, 0x77, 0x33, 0xd9, 0xfc, 0xd8, 0xe1, 0x41,
+	0xfd, 0x72, 0x2b, 0x5b, 0x04, 0x8f, 0x6b, 0x4b, 0xbe, 0x02, 0x0b, 0x6c, 0xd8, 0x6e, 0x53, 0xc6,
+	0x3a, 0xc3, 0xfe, 0x6d, 0x77, 0x87, 0xdd, 0xb2, 0x19, 0xdf, 0x6f, 0xee, 0xda, 0x03, 0x3b, 0x10,
+	0x1e, 0x4c, 0xb1, 0xb9, 0x78, 0x78, 0x50, 0x5f, 0x68, 0x1d, 0x2b, 0x85, 0x4f, 0x40, 0x20, 0x08,
+	0x97, 0xa4, 0xc9, 0x19, 0xc1, 0x9e, 0x16, 0xd8, 0x0b, 0x87, 0x07, 0xf5, 0x4b, 0x6b, 0x99, 0x12,
+	0x78, 0x4c, 0x4b, 0xfe, 0x06, 0x79, 0x30, 0xfc, 0x75, 0x1e, 0x80, 0x96, 0x93, 0x6f, 0x70, 0x5b,
+	0xd1, 0x51, 0x4b, 0x90, 0x47, 0xd1, 0xe4, 0xe3, 0x8b, 0xa2, 0x56, 0xc9, 0x69, 0xad, 0xe6, 0x79,
+	0xa0, 0xf2, 0x30, 0x86, 0xc4, 0x17, 0x16, 0x26, 0xb0, 0x8d, 0xbf, 0x2b, 0x00, 0x19, 0x35, 0x04,
+	0xe4, 0x0e, 0x94, 0xcc, 0x76, 0xc0, 0xc3, 0x10, 0x19, 0xba, 0xbe, 0x94, 0xb5, 0x99, 0x4a, 0x55,
+	0x48, 0x3b, 0x94, 0xcf, 0x10, 0x1a, 0x59, 0x8f, 0x65, 0xd1, 0x14, 0x15, 0x04, 0x71, 0xe1, 0x7c,
+	0xdf, 0x64, 0x41, 0x38, 0x57, 0x2d, 0xfe, 0xc8, 0xca, 0x48, 0xfe, 0xd2, 0xc9, 0x1e, 0x8a, 0xb7,
+	0x68, 0x5e, 0xe4, 0x33, 0xf7, 0x6e, 0x1a, 0x08, 0x47, 0xb1, 0x8d, 0x1f, 0x95, 0x60, 0x7a, 0x75,
+	0xf9, 0xe6, 0xb6, 0xc9, 0x76, 0x4f, 0x10, 0x97, 0xf2, 0x97, 0x43, 0x07, 0x5e, 0xdf, 0x0c, 0x46,
+	0x96, 0xd7, 0xb6, 0xa2, 0xa3, 0x96, 0x20, 0x2e, 0x0f, 0xb2, 0x55, 0x94, 0xaf, 0xcc, 0xef, 0x9b,
+	0x39, 0x1d, 0x2d, 0x85, 0x12, 0x8f, 0xb2, 0x15, 0x09, 0x23, 0x1d, 0x84, 0x41, 0x35, 0x54, 0x8e,
+	0xb4, 0xa3, 0x02, 0x90, 0x9c, 0xd9, 0x91, 0x08, 0x47, 0x06, 0x04, 0x31, 0x02, 0xc6, 0xb5, 0x90,
+	0xcf, 0xc0, 0x8c, 0x45, 0xf9, 0x2a, 0xa6, 0x4e, 0xdb, 0xa6, 0x7c, 0xc1, 0x4e, 0xf2, 0x71, 0xe1,
+	0x86, 0x6b, 0x35, 0x46, 0xc7, 0x84, 0x14, 0x79, 0x04, 0x95, 0x3d, 0x3b, 0xe8, 0x09, 0xfb, 0x5a,
+	0x2b, 0x89, 0x89, 0xf3, 0xb9, 0x5c, 0x1d, 0xe5, 0x08, 0xd1, 0xb0, 0x3c, 0x0c, 0x31, 0x31, 0x82,
+	0xe7, 0xee, 0x37, 0xff, 0x23, 0x52, 0x21, 0x62, 0x65, 0x56, 0x92, 0x0d, 0x04, 0x03, 0x23, 0x19,
+	0xc2, 0x60, 0x86, 0xff, 0x69, 0xd1, 0xaf, 0x0d, 0xf9, 0x6c, 0x55, 0xe1, 0x42, 0xbe, 0x04, 0x49,
+	0x08, 0x22, 0x47, 0xe4, 0x61, 0x0c, 0x16, 0x13, 0x4a, 0xf8, 0xec, 0xdb, 0xeb, 0x51, 0x47, 0x2c,
+	0xe1, 0xd8, 0xec, 0x7b, 0xd8, 0xa3, 0x0e, 0x0a, 0x0e, 0x71, 0x01, 0xda, 0xda, 0x65, 0xaa, 0xc1,
+	0x18, 0x61, 0x71, 0xe4, 0x79, 0x35, 0xcf, 0x72, 0x1f, 0x25, 0xfa, 0x8f, 0x31, 0x15, 0xdc, 0xe1,
+	0x72, 0x9d, 0x1b, 0xef, 0xd9, 0x41, 0xad, 0x2a, 0x3a, 0xa5, 0x57, 0xed, 0xa6, 0xa0, 0xa2, 0xe2,
+	0x1a, 0x3f, 0x2a, 0x40, 0x95, 0x2f, 0xa2, 0x70, 0xe2, 0xbf, 0x02, 0xa5, 0xc0, 0xf4, 0xbb, 0xca,
+	0x85, 0x8f, 0xb5, 0xdb, 0x16, 0x54, 0x54, 0x5c, 0x62, 0x42, 0x31, 0x30, 0xd9, 0x6e, 0xb8, 0x71,
+	0x7f, 0x31, 0xd7, 0xb3, 0xa8, 0xd5, 0x1b, 0xed, 0xd9, 0xfc, 0x1f, 0x43, 0x89, 0x4c, 0xae, 0x41,
+	0x99, 0x1b, 0xda, 0x35, 0x93, 0xc9, 0x70, 0xbf, 0xdc, 0x9c, 0xe1, 0xab, 0x75, 0x4d, 0xd1, 0x50,
+	0x73, 0x8d, 0x77, 0xe1, 0xec, 0x8d, 0xf7, 0x68, 0x7b, 0x18, 0xb8, 0xbe, 0x8c, 0xc9, 0xc8, 0x6d,
+	0x20, 0x8c, 0xfa, 0x8f, 0xed, 0x36, 0x5d, 0x6e, 0xb7, 0xb9, 0x43, 0xb9, 0x11, 0x59, 0x87, 0x05,
+	0xa5, 0x8d, 0xb4, 0x46, 0x24, 0x30, 0xa3, 0x95, 0xf1, 0x00, 0x8a, 0x37, 0xcd, 0x61, 0x97, 0x9e,
+	0xc8, 0x23, 0xe5, 0xbd, 0xf6, 0xa9, 0xd9, 0x0f, 0x42, 0xeb, 0xa7, 0x7a, 0x8d, 0x8a, 0x86, 0x9a,
+	0x6b, 0xfc, 0xe5, 0x14, 0x54, 0x63, 0xa9, 0x08, 0x3e, 0x8b, 0x7c, 0xea, 0xb9, 0x69, 0x1b, 0xc6,
+	0xe3, 0x51, 0x14, 0x1c, 0x6e, 0xc3, 0x7c, 0xfa, 0xd8, 0x66, 0x3c, 0x78, 0x48, 0xd9, 0x30, 0x54,
+	0x74, 0xd4, 0x12, 0xa4, 0x0e, 0x45, 0x8b, 0x7a, 0x41, 0x4f, 0x0c, 0xde, 0x54, 0xb3, 0xc2, 0xbb,
+	0xba, 0xca, 0x09, 0x28, 0xe9, 0x5c, 0xa0, 0x43, 0x83, 0x76, 0xaf, 0x36, 0x25, 0xd6, 0xbd, 0x10,
+	0x58, 0xe3, 0x04, 0x94, 0xf4, 0x8c, 0xb8, 0xae, 0xf8, 0xec, 0xe3, 0xba, 0xd2, 0x29, 0xc7, 0x75,
+	0xc4, 0x83, 0x0b, 0x8c, 0xf5, 0xb6, 0x7c, 0xfb, 0xb1, 0x19, 0x50, 0xd1, 0x58, 0xe8, 0x99, 0x7e,
+	0x1a, 0x3d, 0x97, 0x0f, 0x0f, 0xea, 0x17, 0x5a, 0xad, 0x5b, 0x69, 0x14, 0xcc, 0x82, 0x26, 0x2d,
+	0xb8, 0x68, 0x3b, 0x8c, 0xb6, 0x87, 0x3e, 0x5d, 0xef, 0x3a, 0xae, 0x4f, 0x6f, 0xb9, 0x8c, 0xc3,
+	0xa9, 0xfc, 0xdb, 0x8b, 0xea, 0xa5, 0x5d, 0x5c, 0xcf, 0x12, 0xc2, 0xec, 0xb6, 0xc6, 0x4f, 0x0a,
+	0x30, 0x13, 0xcf, 0xbe, 0x10, 0x06, 0xd0, 0x5b, 0x5d, 0x6b, 0xc9, 0x19, 0xaf, 0x7c, 0xd7, 0xb7,
+	0x72, 0x27, 0x75, 0x24, 0x4c, 0x14, 0xfb, 0x44, 0x34, 0x8c, 0xa9, 0x39, 0x41, 0x7a, 0xf7, 0x25,
+	0x28, 0x76, 0x5c, 0xbf, 0x4d, 0xd5, 0x9a, 0xd5, 0xab, 0x64, 0x8d, 0x13, 0x51, 0xf2, 0x8c, 0x7f,
+	0x29, 0x40, 0x4c, 0x03, 0xf9, 0x6d, 0x98, 0xe5, 0x3a, 0xee, 0xf8, 0x3b, 0x89, 0xa7, 0x69, 0xe6,
+	0x7e, 0x1a, 0x8d, 0xd4, 0xbc, 0xa8, 0xf4, 0xcf, 0x26, 0xc8, 0x98, 0xd4, 0x47, 0x7e, 0x19, 0x2a,
+	0xa6, 0x65, 0xf9, 0x94, 0x31, 0x2a, 0x4d, 0x5a, 0xa5, 0x39, 0x2b, 0xf6, 0xea, 0x90, 0x88, 0x11,
+	0x9f, 0x2f, 0xc3, 0x9e, 0xd5, 0x61, 0x7c, 0x66, 0x2b, 0x97, 0x5b, 0x2f, 0x43, 0xae, 0x84, 0xd3,
+	0x51, 0x4b, 0x18, 0xdf, 0x9a, 0x82, 0xa4, 0x6e, 0x62, 0xc1, 0xb9, 0x5d, 0x7f, 0x67, 0x65, 0xc5,
+	0x6c, 0xf7, 0x72, 0xe5, 0x4b, 0x2e, 0x1c, 0x1e, 0xd4, 0xcf, 0xdd, 0x49, 0x22, 0x60, 0x1a, 0x52,
+	0x69, 0xb9, 0x43, 0xf7, 0x03, 0x73, 0x27, 0x4f, 0xca, 0x24, 0xd4, 0x12, 0x47, 0xc0, 0x34, 0x24,
+	0xf9, 0x2c, 0x54, 0x77, 0xfd, 0x9d, 0x70, 0x91, 0xa7, 0x53, 0x1a, 0x77, 0x22, 0x16, 0xc6, 0xe5,
+	0xf8, 0x10, 0xee, 0xfa, 0x3b, 0xdc, 0x28, 0x86, 0x99, 0x7e, 0x3d, 0x84, 0x77, 0x14, 0x1d, 0xb5,
+	0x04, 0xf1, 0x80, 0xec, 0x86, 0xa3, 0xa7, 0x93, 0x6e, 0xca, 0x16, 0x5d, 0xcb, 0x7a, 0x1a, 0x2d,
+	0x14, 0x7f, 0xa0, 0x4b, 0xdc, 0xe6, 0xdf, 0x19, 0xc1, 0xc1, 0x0c, 0x6c, 0xf2, 0x65, 0xb8, 0xbc,
+	0xeb, 0xef, 0xa8, 0x0d, 0x62, 0xcb, 0xb7, 0x9d, 0xb6, 0xed, 0x25, 0x52, 0xfc, 0x75, 0xd5, 0xdd,
+	0xcb, 0x77, 0xb2, 0xc5, 0xf0, 0xb8, 0xf6, 0xc6, 0xa7, 0x60, 0x26, 0x9e, 0x22, 0xfe, 0x88, 0xcc,
+	0x9f, 0xf1, 0x10, 0x2a, 0x22, 0xc8, 0xe8, 0x72, 0xef, 0x46, 0xef, 0x40, 0x93, 0x4f, 0xd8, 0x81,
+	0x5e, 0x86, 0xe9, 0x9d, 0x61, 0x7b, 0x97, 0x06, 0x4c, 0x18, 0xf6, 0x82, 0x3c, 0x17, 0x68, 0x4a,
+	0x12, 0x86, 0x3c, 0xe3, 0xdf, 0x0a, 0x50, 0x5a, 0x77, 0xbc, 0xe1, 0xcf, 0xc9, 0x31, 0xd6, 0xf7,
+	0xa7, 0x60, 0x8a, 0xfb, 0x94, 0xe4, 0x9a, 0xca, 0x6f, 0x15, 0x44, 0x74, 0x3a, 0x1f, 0xcf, 0x6f,
+	0x1d, 0x25, 0xf2, 0x5c, 0xe4, 0x4d, 0x28, 0x39, 0xc3, 0xc1, 0x03, 0xb3, 0xaf, 0xac, 0xdd, 0x2b,
+	0xa1, 0x2f, 0xb4, 0x21, 0xa8, 0x47, 0x07, 0xf5, 0x79, 0xea, 0xb4, 0x5d, 0xcb, 0x76, 0xba, 0x4b,
+	0x8f, 0x98, 0xeb, 0x34, 0x36, 0x86, 0x83, 0x1d, 0xea, 0xa3, 0x6a, 0xc5, 0xa3, 0xe8, 0x1d, 0xd7,
+	0xed, 0x73, 0x80, 0xc9, 0x64, 0x14, 0xdd, 0x94, 0x64, 0x0c, 0xf9, 0xdc, 0xed, 0x62, 0x81, 0xcf,
+	0x25, 0xa7, 0x92, 0x6e, 0x57, 0x4b, 0x50, 0x51, 0x71, 0xc9, 0x00, 0x4a, 0x03, 0xd3, 0xe3, 0x72,
+	0x45, 0x31, 0x64, 0x37, 0x72, 0x3b, 0xde, 0x8d, 0x7b, 0x02, 0xe7, 0x86, 0x13, 0xf8, 0xfb, 0x91,
+	0x3a, 0x49, 0x44, 0xa5, 0x84, 0xd8, 0x30, 0xdd, 0xb7, 0x59, 0xc0, 0xf5, 0x95, 0xc6, 0x98, 0x15,
+	0x5c, 0x9f, 0x98, 0xa2, 0xd1, 0x08, 0xdc, 0x95, 0xb0, 0x18, 0xe2, 0x2f, 0xec, 0x43, 0x35, 0xd6,
+	0x23, 0x32, 0x27, 0xd3, 0xe8, 0x62, 0x55, 0x88, 0xcc, 0x39, 0xd9, 0x0e, 0xe7, 0xfe, 0xc4, 0x18,
+	0xe1, 0x98, 0xee, 0x89, 0x5a, 0x2c, 0x9f, 0x9f, 0x78, 0xbd, 0xf0, 0xf9, 0xf2, 0x77, 0xff, 0xac,
+	0x7e, 0xe6, 0x1b, 0xff, 0x78, 0xf5, 0x8c, 0xf1, 0x37, 0x93, 0x50, 0xd1, 0x22, 0xff, 0xb7, 0x67,
+	0x8a, 0x9f, 0x9a, 0x29, 0xb7, 0xc7, 0x1b, 0xaf, 0x13, 0x4d, 0x97, 0xe5, 0xe4, 0x74, 0x99, 0x69,
+	0xfe, 0xff, 0xd8, 0xab, 0x3e, 0x3a, 0xa8, 0xd7, 0x92, 0x83, 0x80, 0xe6, 0xde, 0x3d, 0xca, 0x98,
+	0xd9, 0xa5, 0xd1, 0x34, 0xf8, 0xdc, 0x47, 0x4d, 0x83, 0xf9, 0xf8, 0x34, 0xa8, 0x64, 0xbf, 0xc6,
+	0x3e, 0x4c, 0xdd, 0xb5, 0x9d, 0x93, 0x64, 0x05, 0x5e, 0x82, 0x22, 0x6b, 0xbb, 0x3a, 0xdb, 0xad,
+	0x0d, 0x6a, 0x8b, 0x13, 0x51, 0xf2, 0x42, 0x0b, 0x3d, 0x79, 0x8c, 0x85, 0xfe, 0xc6, 0x24, 0x94,
+	0xc3, 0xbc, 0x0b, 0xf9, 0xfd, 0x02, 0x54, 0x4d, 0xc7, 0x71, 0x03, 0x91, 0xba, 0x0f, 0x8d, 0xe9,
+	0x46, 0xae, 0xc1, 0x0f, 0x41, 0x1b, 0xcb, 0x11, 0xa0, 0x7c, 0x01, 0x7a, 0x83, 0x8d, 0x71, 0x30,
+	0xae, 0x97, 0x7c, 0x0d, 0x4a, 0x7d, 0x73, 0x87, 0xf6, 0x43, 0xdb, 0xba, 0x3e, 0x5e, 0x0f, 0xee,
+	0x0a, 0xac, 0xd4, 0xdb, 0x97, 0x44, 0x54, 0x8a, 0x16, 0xde, 0x84, 0xb9, 0x74, 0x47, 0x9f, 0xe6,
+	0xfd, 0xf1, 0x57, 0x1f, 0x53, 0xf3, 0x34, 0x4d, 0x8d, 0x2f, 0x41, 0xf5, 0x1e, 0x0d, 0x7c, 0xbb,
+	0x2d, 0x00, 0xc2, 0x33, 0xb8, 0x42, 0xf6, 0x19, 0x5c, 0xb4, 0x8b, 0x4e, 0x3c, 0xe1, 0x64, 0xe1,
+	0xeb, 0x30, 0x2d, 0x21, 0x19, 0x0f, 0xde, 0x3d, 0xdf, 0x1d, 0xd0, 0xa0, 0x47, 0x87, 0xe1, 0x1b,
+	0xcd, 0xe7, 0x68, 0x6f, 0x69, 0x18, 0x19, 0xbc, 0x47, 0xff, 0x31, 0xa6, 0xc2, 0xf8, 0xaf, 0x0a,
+	0xc0, 0x86, 0x6b, 0x51, 0x95, 0xa6, 0x5b, 0x80, 0x09, 0xdb, 0x52, 0x4f, 0x03, 0xaa, 0xb3, 0x13,
+	0xeb, 0xab, 0x38, 0x61, 0x5b, 0x7a, 0x8a, 0x4f, 0x1c, 0x3b, 0xc5, 0x3f, 0x0b, 0x55, 0xcb, 0x66,
+	0x5e, 0xdf, 0xdc, 0xdf, 0xc8, 0xf0, 0xd0, 0x56, 0x23, 0x16, 0xc6, 0xe5, 0xc8, 0x27, 0x95, 0xf1,
+	0x93, 0x56, 0xa6, 0x96, 0x32, 0x7e, 0x65, 0xde, 0xbd, 0x98, 0x01, 0x7c, 0x1d, 0x66, 0xc2, 0xc4,
+	0x92, 0xd0, 0x52, 0x14, 0xad, 0x42, 0x93, 0x39, 0xb3, 0x1d, 0xe3, 0x61, 0x42, 0x32, 0x9d, 0xf8,
+	0x2a, 0x3d, 0x97, 0xc4, 0xd7, 0x2a, 0xcc, 0xb1, 0xc0, 0xf5, 0xa9, 0x15, 0x4a, 0xac, 0xaf, 0xd6,
+	0x48, 0xe2, 0x41, 0xe7, 0x5a, 0x29, 0x3e, 0x8e, 0xb4, 0x20, 0x5b, 0x30, 0x1f, 0x76, 0x22, 0xfe,
+	0x80, 0xb5, 0x0b, 0x02, 0xe9, 0x8a, 0x42, 0x9a, 0x7f, 0x98, 0x21, 0x83, 0x99, 0x2d, 0xc9, 0x17,
+	0x60, 0x36, 0xec, 0xa6, 0xb0, 0x40, 0xb5, 0x79, 0x01, 0xa5, 0x63, 0x98, 0xed, 0x38, 0x13, 0x93,
+	0xb2, 0xe4, 0xd3, 0x50, 0xf4, 0x7a, 0x26, 0xa3, 0x2a, 0x4f, 0x16, 0xa6, 0x39, 0x8a, 0x5b, 0x9c,
+	0x78, 0x74, 0x50, 0xaf, 0xf0, 0x77, 0x26, 0xfe, 0xa0, 0x14, 0x24, 0xd7, 0x01, 0x76, 0xdc, 0xa1,
+	0x63, 0x99, 0xfe, 0xfe, 0xfa, 0xaa, 0x4a, 0x59, 0x6b, 0xbf, 0xad, 0xa9, 0x39, 0x18, 0x93, 0xe2,
+	0x5b, 0xd5, 0x40, 0x1a, 0x6d, 0x95, 0xee, 0xd2, 0x5b, 0x95, 0xb6, 0xe5, 0x8a, 0x4f, 0xde, 0x81,
+	0x8a, 0x48, 0xef, 0x53, 0x6b, 0x39, 0x50, 0x39, 0xaf, 0xa7, 0xc9, 0x04, 0x6b, 0x7f, 0xae, 0x15,
+	0x82, 0x60, 0x84, 0x47, 0xbe, 0x02, 0xd0, 0xb1, 0x1d, 0x9b, 0xf5, 0x04, 0x7a, 0xf5, 0xa9, 0xd1,
+	0xf5, 0x73, 0xae, 0x69, 0x14, 0x8c, 0x21, 0x72, 0x23, 0xe1, 0xb9, 0xd6, 0xfa, 0x56, 0x6d, 0x26,
+	0x69, 0x24, 0xb6, 0x38, 0x11, 0x25, 0x8f, 0x5c, 0x83, 0xb2, 0x65, 0xd2, 0x81, 0xeb, 0x50, 0xab,
+	0x36, 0x1b, 0x25, 0x7b, 0x56, 0x15, 0x0d, 0x35, 0x97, 0x7c, 0x15, 0x4a, 0xb6, 0x70, 0xb6, 0x6b,
+	0x67, 0x45, 0x57, 0xbf, 0x90, 0x6f, 0x3b, 0x16, 0x10, 0x4d, 0xe0, 0xd6, 0x57, 0xfe, 0x46, 0x05,
+	0x4b, 0xda, 0x30, 0xed, 0x0e, 0x03, 0xa1, 0xe1, 0x9c, 0xd0, 0x90, 0x2f, 0x25, 0xb7, 0x29, 0x31,
 	0x64, 0xcc, 0xa0, 0xfe, 0x60, 0x88, 0xcc, 0x9f, 0xb7, 0xdd, 0xb3, 0xfb, 0x96, 0x4f, 0x9d, 0xda,
-	0xbc, 0x88, 0x92, 0xc5, 0xf3, 0xae, 0x2a, 0x1a, 0x6a, 0x2e, 0xf9, 0x75, 0x98, 0x75, 0x87, 0x81,
-	0x98, 0x37, 0x7c, 0xda, 0xb1, 0xda, 0x39, 0x21, 0x7e, 0x8e, 0xcf, 0xe2, 0xad, 0x38, 0x03, 0x93,
-	0x72, 0xc6, 0x59, 0x98, 0x89, 0x17, 0xe0, 0x19, 0x7f, 0x5e, 0x80, 0x6a, 0xac, 0x6e, 0x83, 0xb8,
-	0x50, 0x71, 0x5b, 0x2d, 0x19, 0xcd, 0xa8, 0xb0, 0xf9, 0xed, 0xbc, 0xc5, 0x20, 0x12, 0x25, 0x9a,
-	0x68, 0x9a, 0x84, 0x91, 0x8e, 0xa7, 0x15, 0x74, 0xfc, 0xcd, 0x04, 0x44, 0xed, 0x78, 0x5c, 0x4b,
-	0x1d, 0xcb, 0x73, 0x6d, 0x27, 0x48, 0xd7, 0x0d, 0x5c, 0x57, 0x74, 0xd4, 0x12, 0xdc, 0x97, 0x93,
-	0xd1, 0x98, 0x42, 0xd7, 0x3b, 0xab, 0xea, 0x85, 0xe2, 0x92, 0x1e, 0xcc, 0x99, 0xe2, 0x24, 0x2b,
-	0xca, 0x5e, 0x4d, 0x3e, 0x53, 0xf6, 0x4a, 0x57, 0x77, 0x24, 0x51, 0x30, 0x0d, 0xcb, 0x35, 0xb1,
-	0xa8, 0xb9, 0xd0, 0x34, 0x95, 0x4b, 0x53, 0x2b, 0x89, 0x82, 0x69, 0x58, 0xe3, 0x5b, 0x13, 0x10,
-	0xce, 0xaf, 0x5f, 0x84, 0xf8, 0x93, 0x18, 0x50, 0xf2, 0x29, 0x1b, 0xf6, 0x03, 0xb5, 0x03, 0x8b,
-	0x35, 0x8c, 0x82, 0x82, 0x8a, 0x63, 0x3c, 0x86, 0x59, 0xde, 0xdb, 0x7e, 0x9f, 0xf6, 0x5b, 0x01,
-	0xf5, 0x18, 0xe9, 0x40, 0x91, 0xf1, 0x1f, 0x6a, 0x4c, 0xc6, 0x3c, 0x99, 0x0e, 0xa8, 0x17, 0xf3,
-	0x70, 0x39, 0x2e, 0x4a, 0x78, 0xe3, 0xdb, 0x13, 0x50, 0xd1, 0xe3, 0x74, 0x02, 0xb7, 0xf9, 0x55,
-	0x98, 0xb6, 0x68, 0xc7, 0xe4, 0x4f, 0xa3, 0xd6, 0x05, 0x37, 0x17, 0x6b, 0x92, 0x84, 0x21, 0x8f,
-	0xd4, 0x93, 0xe9, 0x8a, 0xca, 0x48, 0xaa, 0x62, 0x0f, 0x2a, 0xe2, 0xc7, 0x7a, 0x58, 0xf1, 0x99,
-	0xf7, 0xbd, 0xdf, 0x0f, 0x51, 0x64, 0xda, 0x4e, 0xff, 0xc5, 0x08, 0x3f, 0x55, 0xa9, 0x59, 0x3c,
-	0x49, 0xa5, 0xa6, 0xb1, 0x0e, 0xdc, 0xe0, 0xdf, 0x58, 0x25, 0x6f, 0x41, 0x99, 0x29, 0x93, 0xa4,
-	0xc6, 0xe5, 0xa3, 0xfa, 0x74, 0x5e, 0xd1, 0x8f, 0x0e, 0xea, 0xb3, 0x42, 0x38, 0x24, 0xa0, 0x6e,
-	0x62, 0x7c, 0x63, 0x0a, 0x62, 0xce, 0xde, 0x09, 0x46, 0xd8, 0x4a, 0xf9, 0xef, 0x5f, 0xc8, 0xeb,
+	0x9c, 0x88, 0x92, 0xc5, 0xf3, 0xae, 0x28, 0x1a, 0x6a, 0x2e, 0xf9, 0x55, 0x98, 0x75, 0x87, 0x81,
+	0x98, 0x37, 0x7c, 0xda, 0xb1, 0xda, 0x79, 0x21, 0x7e, 0x9e, 0xcf, 0xe2, 0xcd, 0x38, 0x03, 0x93,
+	0x72, 0xc6, 0x59, 0x98, 0x89, 0x17, 0xe0, 0x19, 0x7f, 0x5a, 0x80, 0x6a, 0xac, 0x6e, 0x83, 0xb8,
+	0x50, 0x71, 0x5b, 0x2d, 0x19, 0xcd, 0xa8, 0xb0, 0xf9, 0xcd, 0xbc, 0xc5, 0x20, 0x12, 0x25, 0x9a,
+	0x68, 0x9a, 0x84, 0x91, 0x8e, 0x8f, 0x2a, 0xe8, 0xf8, 0xab, 0x09, 0x88, 0xda, 0xf1, 0xb8, 0x96,
+	0x3a, 0x96, 0xe7, 0xda, 0x4e, 0x90, 0xae, 0x1b, 0xb8, 0xa1, 0xe8, 0xa8, 0x25, 0xb8, 0x2f, 0x27,
+	0xa3, 0x31, 0x85, 0xae, 0x77, 0x56, 0xd5, 0x0b, 0xc5, 0x25, 0x3d, 0x38, 0x67, 0x8a, 0x93, 0xac,
+	0x28, 0x7b, 0x35, 0xf9, 0x54, 0xd9, 0x2b, 0x5d, 0xdd, 0x91, 0x44, 0xc1, 0x34, 0x2c, 0xd7, 0xc4,
+	0xa2, 0xe6, 0x42, 0xd3, 0x54, 0x2e, 0x4d, 0xad, 0x24, 0x0a, 0xa6, 0x61, 0x8d, 0x6f, 0x4f, 0x40,
+	0x38, 0xbf, 0x7e, 0x1e, 0xe2, 0x4f, 0x62, 0x40, 0xc9, 0xa7, 0x6c, 0xd8, 0x0f, 0xd4, 0x0e, 0x2c,
+	0xd6, 0x30, 0x0a, 0x0a, 0x2a, 0x8e, 0xb1, 0x07, 0xb3, 0xbc, 0xb7, 0xfd, 0x3e, 0xed, 0xb7, 0x02,
+	0xea, 0x31, 0xd2, 0x81, 0x22, 0xe3, 0x3f, 0xd4, 0x98, 0x8c, 0x79, 0x32, 0x1d, 0x50, 0x2f, 0xe6,
+	0xe1, 0x72, 0x5c, 0x94, 0xf0, 0xc6, 0x77, 0x26, 0xa0, 0xa2, 0xc7, 0xe9, 0x04, 0x6e, 0xf3, 0xcb,
+	0x30, 0x6d, 0xd1, 0x8e, 0xc9, 0x9f, 0x46, 0xad, 0x0b, 0x6e, 0x2e, 0x56, 0x25, 0x09, 0x43, 0x1e,
+	0xa9, 0x27, 0xd3, 0x15, 0x95, 0x91, 0x54, 0xc5, 0x2e, 0x54, 0xc4, 0x8f, 0xb5, 0xb0, 0xe2, 0x33,
+	0xef, 0x7b, 0x7f, 0x10, 0xa2, 0xc8, 0xb4, 0x9d, 0xfe, 0x8b, 0x11, 0x7e, 0xaa, 0x52, 0xb3, 0x78,
+	0x92, 0x4a, 0x4d, 0x63, 0x0d, 0xb8, 0xc1, 0xbf, 0xb9, 0x42, 0xde, 0x80, 0x32, 0x53, 0x26, 0x49,
+	0x8d, 0xcb, 0xc7, 0xf5, 0xe9, 0xbc, 0xa2, 0x1f, 0x1d, 0xd4, 0x67, 0x85, 0x70, 0x48, 0x40, 0xdd,
+	0xc4, 0xf8, 0xe6, 0x14, 0xc4, 0x9c, 0xbd, 0x13, 0x8c, 0xb0, 0x95, 0xf2, 0xdf, 0xdf, 0xce, 0xeb,
 	0xbf, 0x87, 0x4e, 0xb1, 0x9c, 0x70, 0x49, 0x97, 0x9d, 0xf7, 0xa3, 0x47, 0xfb, 0x9e, 0x7a, 0x3f,
-	0xba, 0x1f, 0x37, 0x69, 0xdf, 0x43, 0xc1, 0xd1, 0x47, 0x5b, 0x53, 0xc7, 0x1e, 0x6d, 0xbd, 0x0b,
-	0xc5, 0xae, 0x39, 0xec, 0x52, 0x95, 0x8f, 0xfb, 0x6c, 0xbe, 0x92, 0x4c, 0x8e, 0x20, 0x27, 0x88,
+	0xba, 0x1f, 0xb7, 0x68, 0xdf, 0x43, 0xc1, 0xd1, 0x47, 0x5b, 0x53, 0xc7, 0x1e, 0x6d, 0xbd, 0x03,
+	0xc5, 0xae, 0x39, 0xec, 0x52, 0x95, 0x8f, 0xfb, 0x7c, 0xbe, 0x92, 0x4c, 0x8e, 0x20, 0x27, 0x88,
 	0xf8, 0x89, 0x12, 0x93, 0x4f, 0x90, 0x5e, 0x98, 0xfd, 0x52, 0xbe, 0x61, 0xbe, 0x09, 0xa2, 0x73,
 	0x68, 0x72, 0x82, 0xe8, 0xbf, 0x18, 0xe1, 0xf3, 0x2d, 0xb4, 0x2d, 0x8b, 0x8f, 0xd4, 0xe1, 0xc0,
-	0xe7, 0x73, 0x9e, 0xd0, 0x09, 0x0c, 0xb9, 0x26, 0xd4, 0x1f, 0x0c, 0x91, 0x8d, 0x65, 0xa8, 0xc6,
-	0x6a, 0x1c, 0xf9, 0xf8, 0xea, 0xd2, 0x9a, 0xd8, 0xf8, 0xae, 0x99, 0x81, 0x89, 0x82, 0x63, 0x1c,
-	0x4d, 0xc0, 0x3c, 0x52, 0xe6, 0x0e, 0xfd, 0x36, 0x8d, 0x1f, 0xd3, 0x99, 0xed, 0x58, 0x75, 0x5a,
+	0x17, 0x73, 0x9e, 0xd0, 0x09, 0x0c, 0xb9, 0x26, 0xd4, 0x1f, 0x0c, 0x91, 0x8d, 0x25, 0xa8, 0xc6,
+	0x6a, 0x1c, 0xf9, 0xf8, 0xea, 0xd2, 0x9a, 0xd8, 0xf8, 0xae, 0x9a, 0x81, 0x89, 0x82, 0x63, 0x1c,
+	0x4d, 0xc0, 0x1c, 0x52, 0xe6, 0x0e, 0xfd, 0x36, 0x8d, 0x1f, 0xd3, 0x99, 0xed, 0x58, 0x75, 0x5a,
 	0xe2, 0x50, 0xde, 0x75, 0x50, 0x71, 0xb9, 0x43, 0x39, 0xa0, 0x7e, 0x57, 0x6f, 0xa7, 0x6a, 0xb9,
-	0x6a, 0x87, 0xf2, 0x6e, 0x9c, 0x89, 0x49, 0x59, 0xbe, 0x99, 0x0d, 0x4c, 0xc7, 0xee, 0x50, 0x16,
-	0xa4, 0xf3, 0xdc, 0x77, 0x15, 0x1d, 0xb5, 0x04, 0xb9, 0x01, 0xe7, 0x18, 0x0d, 0xb6, 0x1e, 0x3b,
-	0xd4, 0xd7, 0xc5, 0x02, 0xaa, 0x7a, 0xe4, 0xa5, 0xb0, 0x22, 0xa5, 0x95, 0x16, 0xc0, 0xd1, 0x36,
-	0xc2, 0x39, 0x97, 0x85, 0x1b, 0xba, 0x44, 0x4d, 0xad, 0xd6, 0xc8, 0x39, 0x4f, 0xf1, 0x71, 0xa4,
-	0x05, 0x47, 0xe9, 0x98, 0x76, 0x7f, 0xe8, 0xd3, 0x08, 0xa5, 0x94, 0x44, 0x59, 0x4f, 0xf1, 0x71,
-	0xa4, 0x85, 0xf1, 0x2f, 0x05, 0x98, 0x45, 0x1a, 0xf8, 0xfb, 0x7a, 0x50, 0xea, 0x50, 0xec, 0x8b,
-	0x3a, 0x91, 0x82, 0xa8, 0x13, 0x11, 0x53, 0x56, 0x96, 0x85, 0x48, 0x3a, 0x59, 0x83, 0xaa, 0xcf,
-	0x5b, 0xa8, 0x9a, 0x1c, 0x39, 0xe0, 0x46, 0x18, 0x6f, 0x61, 0xc4, 0x3a, 0x4a, 0xfe, 0xc5, 0x78,
-	0x33, 0xe2, 0xc0, 0xf4, 0xae, 0xac, 0x45, 0x54, 0x5b, 0x7d, 0xbe, 0xb9, 0xa8, 0xea, 0x19, 0x45,
-	0xee, 0x3b, 0x2c, 0x6e, 0x3c, 0x8a, 0x7e, 0x62, 0xa8, 0xc4, 0xf8, 0x4e, 0x01, 0x20, 0xaa, 0xb8,
-	0x26, 0x7b, 0x50, 0x66, 0x6f, 0x24, 0x9c, 0xac, 0x9c, 0x47, 0xe8, 0x0a, 0x24, 0x56, 0xcb, 0xa4,
-	0x28, 0xa8, 0x15, 0x3c, 0xcd, 0xc3, 0xfa, 0xfe, 0x24, 0xe8, 0x56, 0xcf, 0xc9, 0xc1, 0x7a, 0x8d,
+	0x6a, 0x87, 0xf2, 0x5e, 0x9c, 0x89, 0x49, 0x59, 0xbe, 0x99, 0x0d, 0x4c, 0xc7, 0xee, 0x50, 0x16,
+	0xa4, 0xf3, 0xdc, 0xf7, 0x14, 0x1d, 0xb5, 0x04, 0xb9, 0x09, 0xe7, 0x19, 0x0d, 0x36, 0xf7, 0x1c,
+	0xea, 0xeb, 0x62, 0x01, 0x55, 0x3d, 0xf2, 0x42, 0x58, 0x91, 0xd2, 0x4a, 0x0b, 0xe0, 0x68, 0x1b,
+	0xe1, 0x9c, 0xcb, 0xc2, 0x0d, 0x5d, 0xa2, 0xa6, 0x56, 0x6b, 0xe4, 0x9c, 0xa7, 0xf8, 0x38, 0xd2,
+	0x82, 0xa3, 0x74, 0x4c, 0xbb, 0x3f, 0xf4, 0x69, 0x84, 0x52, 0x4a, 0xa2, 0xac, 0xa5, 0xf8, 0x38,
+	0xd2, 0xc2, 0xf8, 0xe7, 0x02, 0xcc, 0x22, 0x0d, 0xfc, 0x7d, 0x3d, 0x28, 0x75, 0x28, 0xf6, 0x45,
+	0x9d, 0x48, 0x41, 0xd4, 0x89, 0x88, 0x29, 0x2b, 0xcb, 0x42, 0x24, 0x9d, 0xac, 0x42, 0xd5, 0xe7,
+	0x2d, 0x54, 0x4d, 0x8e, 0x1c, 0x70, 0x23, 0x8c, 0xb7, 0x30, 0x62, 0x1d, 0x25, 0xff, 0x62, 0xbc,
+	0x19, 0x71, 0x60, 0x7a, 0x47, 0xd6, 0x22, 0xaa, 0xad, 0x3e, 0xdf, 0x5c, 0x54, 0xf5, 0x8c, 0x22,
+	0xf7, 0x1d, 0x16, 0x37, 0x1e, 0x45, 0x3f, 0x31, 0x54, 0x62, 0x7c, 0xb7, 0x00, 0x10, 0x55, 0x5c,
+	0x93, 0x5d, 0x28, 0xb3, 0xd7, 0x12, 0x4e, 0x56, 0xce, 0x23, 0x74, 0x05, 0x12, 0xab, 0x65, 0x52,
+	0x14, 0xd4, 0x0a, 0x3e, 0xca, 0xc3, 0xfa, 0xc1, 0x24, 0xe8, 0x56, 0xcf, 0xc8, 0xc1, 0x7a, 0x85,
 	0x6f, 0xce, 0xdd, 0xa8, 0x26, 0x53, 0xcb, 0xa1, 0xa0, 0xa2, 0xe2, 0x72, 0xff, 0x37, 0x3c, 0x9c,
-	0x53, 0x53, 0x5b, 0xf8, 0xbf, 0xe1, 0x39, 0x1e, 0x6a, 0x6e, 0x96, 0xcb, 0x56, 0x7c, 0x61, 0x2e,
-	0x5b, 0xe9, 0xb9, 0xb8, 0x6c, 0x3c, 0xf4, 0xf3, 0xdd, 0x3e, 0x5d, 0xc1, 0x4d, 0x15, 0x62, 0xea,
-	0xd0, 0x0f, 0x25, 0x19, 0x43, 0xbe, 0xf1, 0x47, 0x05, 0x38, 0xdb, 0x6a, 0xfb, 0xb6, 0x17, 0x68,
-	0x93, 0xb5, 0x29, 0x2a, 0xa9, 0x03, 0x93, 0x07, 0x65, 0x6a, 0x4e, 0xbd, 0x7c, 0xcc, 0xd9, 0x8d,
+	0x53, 0x53, 0x5b, 0xf8, 0xbf, 0xe1, 0x39, 0x1e, 0x6a, 0x6e, 0x96, 0xcb, 0x56, 0x7c, 0x6e, 0x2e,
+	0x5b, 0xe9, 0x99, 0xb8, 0x6c, 0x3c, 0xf4, 0xf3, 0xdd, 0x3e, 0x5d, 0xc6, 0x0d, 0x15, 0x62, 0xea,
+	0xd0, 0x0f, 0x25, 0x19, 0x43, 0xbe, 0xf1, 0x07, 0x05, 0x38, 0xdb, 0x6a, 0xfb, 0xb6, 0x17, 0x68,
+	0x93, 0xb5, 0x21, 0x2a, 0xa9, 0x03, 0x93, 0x07, 0x65, 0x6a, 0x4e, 0xbd, 0x78, 0xcc, 0xd9, 0x8d,
 	0x14, 0x4a, 0x14, 0x5a, 0x4b, 0x12, 0x46, 0x10, 0x22, 0x11, 0x2a, 0x8c, 0x62, 0xfa, 0xdd, 0xb6,
-	0x04, 0x15, 0x15, 0xd7, 0xf8, 0x6e, 0x01, 0xca, 0xba, 0x52, 0xe3, 0x15, 0x28, 0x0a, 0x43, 0x9c,
+	0x04, 0x15, 0x15, 0xd7, 0xf8, 0x5e, 0x01, 0xca, 0xba, 0x52, 0xe3, 0x25, 0x28, 0x0a, 0x43, 0x9c,
 	0x3e, 0xc2, 0x17, 0x66, 0x1a, 0x25, 0x4f, 0x24, 0x05, 0x79, 0x9c, 0x39, 0x92, 0x14, 0xe4, 0x44,
-	0x94, 0x3c, 0x3e, 0x69, 0xa9, 0x63, 0xa5, 0x93, 0x82, 0xd7, 0x1d, 0x0b, 0x39, 0x5d, 0x14, 0xbc,
-	0xba, 0xfe, 0xc0, 0x0c, 0xd2, 0x69, 0xda, 0x75, 0x41, 0x45, 0xc5, 0x35, 0xde, 0x81, 0x39, 0x55,
-	0x52, 0xa7, 0x07, 0xea, 0x99, 0x6a, 0x8f, 0x8d, 0xff, 0x2a, 0x40, 0x75, 0x67, 0xe7, 0x8e, 0xb6,
-	0x4f, 0x08, 0x17, 0x99, 0xac, 0xa1, 0x5b, 0xe9, 0x04, 0xd4, 0x5f, 0x75, 0x07, 0x5e, 0x9f, 0x6a,
-	0x2c, 0x55, 0xd8, 0xd6, 0xca, 0x94, 0xc0, 0x63, 0x5a, 0x92, 0x0d, 0x38, 0x1f, 0xe7, 0x28, 0xeb,
-	0xab, 0x8a, 0x9d, 0xe5, 0xd1, 0xf8, 0x28, 0x1b, 0xb3, 0xda, 0xa4, 0xa1, 0x94, 0x09, 0x56, 0x77,
-	0x81, 0x46, 0xa0, 0x14, 0x1b, 0xb3, 0xda, 0x18, 0xb3, 0x50, 0x8d, 0x5d, 0x04, 0x33, 0xbe, 0xf7,
-	0x12, 0xe8, 0x4a, 0xae, 0x5f, 0xd6, 0x83, 0xe5, 0x4a, 0x8b, 0xb5, 0x75, 0x92, 0xa2, 0x38, 0x7e,
-	0x92, 0x42, 0xcf, 0xf8, 0x54, 0xa2, 0xa2, 0x1b, 0x25, 0x2a, 0x4a, 0xa7, 0x90, 0xa8, 0xd0, 0x36,
-	0x68, 0x24, 0x59, 0xf1, 0xc7, 0x05, 0x98, 0x71, 0x5c, 0x8b, 0x86, 0x96, 0xae, 0x36, 0x2d, 0x3c,
-	0xe9, 0xad, 0xb1, 0x06, 0xb1, 0xb1, 0x19, 0x43, 0x94, 0xf9, 0x70, 0x9d, 0xe5, 0x8c, 0xb3, 0x30,
-	0xa1, 0x9a, 0xac, 0x43, 0xd9, 0xec, 0x74, 0x6c, 0xc7, 0x0e, 0xf6, 0x55, 0x49, 0xda, 0xe5, 0x2c,
-	0xdb, 0xb7, 0xa2, 0x64, 0xe4, 0xb6, 0x12, 0xfe, 0x43, 0xdd, 0x96, 0xef, 0xcb, 0xba, 0x1a, 0xbb,
-	0x32, 0xc6, 0xbe, 0x1c, 0x26, 0xf6, 0x63, 0x1e, 0x5d, 0x58, 0x39, 0x1a, 0x15, 0x67, 0x1b, 0x50,
-	0x92, 0xf9, 0x2b, 0x91, 0xbc, 0x2b, 0xcb, 0x08, 0x42, 0xe6, 0xb6, 0x50, 0x71, 0x48, 0x37, 0x8c,
-	0x50, 0xab, 0x62, 0x70, 0x9b, 0xb9, 0xa3, 0x76, 0x1d, 0xf4, 0x66, 0x87, 0xa8, 0xe4, 0x56, 0x7c,
-	0xfb, 0x98, 0x39, 0xc9, 0xf6, 0x31, 0x7b, 0xec, 0xd6, 0xd1, 0x85, 0x12, 0x13, 0x9b, 0x93, 0x48,
-	0xda, 0x55, 0xaf, 0xad, 0xe6, 0xf3, 0x6d, 0x12, 0xfb, 0x9b, 0x1c, 0x1d, 0x49, 0x43, 0x05, 0x4f,
-	0x5c, 0x28, 0xfb, 0xca, 0x75, 0x57, 0x79, 0xbf, 0x7c, 0x07, 0xb6, 0x69, 0xff, 0x3f, 0xac, 0x29,
-	0x93, 0x54, 0xd4, 0x4a, 0xc8, 0xbb, 0x30, 0x69, 0x99, 0x5d, 0x95, 0x01, 0xfc, 0x42, 0xee, 0xa2,
-	0xbc, 0x50, 0x8d, 0xb8, 0x24, 0xb5, 0xb6, 0x72, 0x03, 0x39, 0x2a, 0xd9, 0x8b, 0xaa, 0xc2, 0xe7,
-	0xc7, 0xb8, 0x7b, 0x94, 0xda, 0xef, 0x64, 0x9c, 0x34, 0x52, 0x57, 0x7e, 0x1d, 0xa6, 0x1f, 0xb9,
-	0xfd, 0xe1, 0x40, 0xa5, 0x0e, 0xab, 0xd7, 0x16, 0xb3, 0xde, 0xf6, 0x7d, 0x21, 0x12, 0x19, 0x01,
-	0xf9, 0x9f, 0x61, 0xd8, 0x96, 0xfc, 0x7e, 0x01, 0xce, 0xf2, 0xa5, 0xa3, 0xe7, 0x01, 0xab, 0x91,
-	0x31, 0x66, 0xea, 0x3d, 0xc6, 0x37, 0xc6, 0x70, 0x86, 0x5d, 0x54, 0x6a, 0xcf, 0x6e, 0x24, 0x34,
-	0x60, 0x4a, 0x23, 0xf1, 0xa0, 0xcc, 0x6c, 0x8b, 0xb6, 0x4d, 0x9f, 0xd5, 0xce, 0x9f, 0x9a, 0xf6,
-	0xc8, 0xa5, 0x56, 0xd8, 0xa8, 0xb5, 0x90, 0x3f, 0x10, 0xf7, 0xc5, 0xd4, 0x75, 0x4c, 0x75, 0x45,
-	0x76, 0xe1, 0x34, 0xaf, 0xc8, 0x9e, 0x97, 0x97, 0xc5, 0x12, 0x1a, 0x30, 0xad, 0x92, 0x6c, 0xc1,
-	0x05, 0x59, 0x1d, 0x9e, 0xbe, 0x1a, 0x70, 0x41, 0x1c, 0xa9, 0xbf, 0x74, 0x78, 0x50, 0xbf, 0xb0,
-	0x92, 0x25, 0x80, 0xd9, 0xed, 0xc8, 0x07, 0x30, 0xeb, 0xc7, 0xc3, 0xb1, 0xda, 0xc5, 0x31, 0x0a,
-	0xc5, 0x12, 0x81, 0x9d, 0x4c, 0x4d, 0x27, 0x48, 0x98, 0xd4, 0x45, 0x5e, 0x87, 0xaa, 0xa7, 0x2c,
-	0x95, 0xcd, 0x06, 0xb5, 0x4b, 0xe2, 0x19, 0xc4, 0x8e, 0xba, 0x1d, 0x91, 0x31, 0x2e, 0x43, 0xee,
-	0x41, 0x35, 0x70, 0xfb, 0xd4, 0x57, 0xa7, 0xc1, 0x35, 0xf1, 0xf2, 0x97, 0xb2, 0x66, 0xf2, 0x8e,
+	0x94, 0x3c, 0x3e, 0x69, 0xa9, 0x63, 0xa5, 0x93, 0x82, 0x37, 0x1c, 0x0b, 0x39, 0x5d, 0x14, 0xbc,
+	0xba, 0xfe, 0xc0, 0x0c, 0xd2, 0x69, 0xda, 0x35, 0x41, 0x45, 0xc5, 0x35, 0xde, 0x82, 0x73, 0xaa,
+	0xa4, 0x4e, 0x0f, 0xd4, 0x53, 0xd5, 0x1e, 0x1b, 0xff, 0x59, 0x80, 0xea, 0xf6, 0xf6, 0x5d, 0x6d,
+	0x9f, 0x10, 0x2e, 0x31, 0x59, 0x43, 0xb7, 0xdc, 0x09, 0xa8, 0xbf, 0xe2, 0x0e, 0xbc, 0x3e, 0xd5,
+	0x58, 0xaa, 0xb0, 0xad, 0x95, 0x29, 0x81, 0xc7, 0xb4, 0x24, 0xeb, 0x70, 0x21, 0xce, 0x51, 0xd6,
+	0x57, 0x15, 0x3b, 0xcb, 0xa3, 0xf1, 0x51, 0x36, 0x66, 0xb5, 0x49, 0x43, 0x29, 0x13, 0xac, 0xee,
+	0x02, 0x8d, 0x40, 0x29, 0x36, 0x66, 0xb5, 0x31, 0x66, 0xa1, 0x1a, 0xbb, 0x08, 0x66, 0x7c, 0xff,
+	0x05, 0xd0, 0x95, 0x5c, 0xbf, 0xa8, 0x07, 0xcb, 0x95, 0x16, 0x6b, 0xeb, 0x24, 0x45, 0x71, 0xfc,
+	0x24, 0x85, 0x9e, 0xf1, 0xa9, 0x44, 0x45, 0x37, 0x4a, 0x54, 0x94, 0x4e, 0x21, 0x51, 0xa1, 0x6d,
+	0xd0, 0x48, 0xb2, 0xe2, 0x0f, 0x0b, 0x30, 0xe3, 0xb8, 0x16, 0x0d, 0x2d, 0x5d, 0x6d, 0x5a, 0x78,
+	0xd2, 0x9b, 0x63, 0x0d, 0x62, 0x63, 0x23, 0x86, 0x28, 0xf3, 0xe1, 0x3a, 0xcb, 0x19, 0x67, 0x61,
+	0x42, 0x35, 0x59, 0x83, 0xb2, 0xd9, 0xe9, 0xd8, 0x8e, 0x1d, 0xec, 0xab, 0x92, 0xb4, 0x2b, 0x59,
+	0xb6, 0x6f, 0x59, 0xc9, 0xc8, 0x6d, 0x25, 0xfc, 0x87, 0xba, 0x2d, 0xdf, 0x97, 0x75, 0x35, 0x76,
+	0x65, 0x8c, 0x7d, 0x39, 0x4c, 0xec, 0xc7, 0x3c, 0xba, 0xb0, 0x72, 0x34, 0x2a, 0xce, 0x36, 0xa0,
+	0x24, 0xf3, 0x57, 0x22, 0x79, 0x57, 0x96, 0x11, 0x84, 0xcc, 0x6d, 0xa1, 0xe2, 0x90, 0x6e, 0x18,
+	0xa1, 0x56, 0xc5, 0xe0, 0x36, 0x73, 0x47, 0xed, 0x3a, 0xe8, 0xcd, 0x0e, 0x51, 0xc9, 0xed, 0xf8,
+	0xf6, 0x31, 0x73, 0x92, 0xed, 0x63, 0xf6, 0xd8, 0xad, 0xa3, 0x0b, 0x25, 0x26, 0x36, 0x27, 0x91,
+	0xb4, 0xab, 0x5e, 0x5f, 0xc9, 0xe7, 0xdb, 0x24, 0xf6, 0x37, 0x39, 0x3a, 0x92, 0x86, 0x0a, 0x9e,
+	0xb8, 0x50, 0xf6, 0x95, 0xeb, 0xae, 0xf2, 0x7e, 0xf9, 0x0e, 0x6c, 0xd3, 0xfe, 0x7f, 0x58, 0x53,
+	0x26, 0xa9, 0xa8, 0x95, 0x90, 0x77, 0x60, 0xd2, 0x32, 0xbb, 0x2a, 0x03, 0xf8, 0x76, 0xee, 0xa2,
+	0xbc, 0x50, 0x8d, 0xb8, 0x24, 0xb5, 0xba, 0x7c, 0x13, 0x39, 0x2a, 0xd9, 0x8d, 0xaa, 0xc2, 0xe7,
+	0xc6, 0xb8, 0x7b, 0x94, 0xda, 0xef, 0x64, 0x9c, 0x34, 0x52, 0x57, 0x7e, 0x03, 0xa6, 0x1f, 0xbb,
+	0xfd, 0xe1, 0x40, 0xa5, 0x0e, 0xab, 0xd7, 0x17, 0xb2, 0xde, 0xf6, 0x03, 0x21, 0x12, 0x19, 0x01,
+	0xf9, 0x9f, 0x61, 0xd8, 0x96, 0xfc, 0x6e, 0x01, 0xce, 0xf2, 0xa5, 0xa3, 0xe7, 0x01, 0xab, 0x91,
+	0x31, 0x66, 0xea, 0x7d, 0xc6, 0x37, 0xc6, 0x70, 0x86, 0x5d, 0x52, 0x6a, 0xcf, 0xae, 0x27, 0x34,
+	0x60, 0x4a, 0x23, 0xf1, 0xa0, 0xcc, 0x6c, 0x8b, 0xb6, 0x4d, 0x9f, 0xd5, 0x2e, 0x9c, 0x9a, 0xf6,
+	0xc8, 0xa5, 0x56, 0xd8, 0xa8, 0xb5, 0x90, 0xdf, 0x13, 0xf7, 0xc5, 0xd4, 0x75, 0x4c, 0x75, 0x45,
+	0x76, 0xfe, 0x34, 0xaf, 0xc8, 0x5e, 0x90, 0x97, 0xc5, 0x12, 0x1a, 0x30, 0xad, 0x92, 0x6c, 0xc2,
+	0x45, 0x59, 0x1d, 0x9e, 0xbe, 0x1a, 0x70, 0x51, 0x1c, 0xa9, 0xbf, 0x70, 0x78, 0x50, 0xbf, 0xb8,
+	0x9c, 0x25, 0x80, 0xd9, 0xed, 0xc8, 0xfb, 0x30, 0xeb, 0xc7, 0xc3, 0xb1, 0xda, 0xa5, 0x31, 0x0a,
+	0xc5, 0x12, 0x81, 0x9d, 0x4c, 0x4d, 0x27, 0x48, 0x98, 0xd4, 0x45, 0x5e, 0x85, 0xaa, 0xa7, 0x2c,
+	0x95, 0xcd, 0x06, 0xb5, 0xcb, 0xe2, 0x19, 0xc4, 0x8e, 0xba, 0x15, 0x91, 0x31, 0x2e, 0x43, 0xee,
+	0x43, 0x35, 0x70, 0xfb, 0xd4, 0x57, 0xa7, 0xc1, 0x35, 0xf1, 0xf2, 0x17, 0xb3, 0x66, 0xf2, 0xb6,
 	0x16, 0x8b, 0x0e, 0xe7, 0x22, 0x1a, 0xc3, 0x38, 0x0e, 0x0f, 0xeb, 0xc3, 0x9b, 0x20, 0xbe, 0xc8,
-	0x66, 0xbd, 0x94, 0x0c, 0xeb, 0x5b, 0x71, 0x26, 0x26, 0x65, 0x79, 0xa0, 0xee, 0xf9, 0xb6, 0xeb,
-	0xdb, 0xc1, 0xfe, 0x6a, 0xdf, 0x64, 0x4c, 0x00, 0x2c, 0x0a, 0x00, 0x1d, 0xa8, 0x6f, 0xa7, 0x05,
-	0x70, 0xb4, 0x0d, 0x8f, 0x86, 0x42, 0x62, 0xed, 0x23, 0xc2, 0x81, 0x13, 0x66, 0x29, 0x6c, 0x8b,
-	0x9a, 0x7b, 0x4c, 0x39, 0xee, 0xe5, 0x3c, 0xe5, 0xb8, 0xc4, 0x82, 0xcb, 0xe6, 0x30, 0x70, 0x07,
-	0x9c, 0x90, 0x6c, 0xb2, 0xe3, 0xee, 0x51, 0xa7, 0x76, 0x45, 0xec, 0x55, 0x57, 0x0e, 0x0f, 0xea,
-	0x97, 0x57, 0x9e, 0x20, 0x87, 0x4f, 0x44, 0x21, 0x03, 0x28, 0x53, 0x55, 0x52, 0x5c, 0xfb, 0xe8,
-	0x18, 0x9b, 0x44, 0xb2, 0x2e, 0x59, 0x0e, 0x50, 0x48, 0x43, 0xad, 0x82, 0xec, 0x40, 0xb5, 0xe7,
-	0xb2, 0x60, 0xa5, 0x6f, 0x9b, 0x8c, 0xb2, 0xda, 0xcb, 0x62, 0x9e, 0x64, 0xee, 0x6f, 0x37, 0x43,
-	0xb1, 0x68, 0x9a, 0xdc, 0x8c, 0x5a, 0x62, 0x1c, 0x86, 0x50, 0x11, 0x1a, 0x0e, 0xc5, 0x5b, 0x73,
-	0x9d, 0x80, 0xbe, 0x1f, 0xd4, 0x96, 0xc4, 0xb3, 0xbc, 0x96, 0x85, 0xbc, 0xed, 0x5a, 0xad, 0xa4,
-	0xb4, 0x5c, 0xe5, 0x29, 0x22, 0xa6, 0x31, 0xc9, 0x9b, 0x30, 0xe3, 0xb9, 0x56, 0xcb, 0xa3, 0xed,
-	0x6d, 0x33, 0x68, 0xf7, 0x6a, 0xf5, 0xe4, 0xe1, 0xef, 0x76, 0x8c, 0x87, 0x09, 0x49, 0x1e, 0x0d,
-	0xf8, 0x94, 0x0d, 0x77, 0x07, 0x76, 0xb0, 0x4d, 0x1d, 0xcb, 0x76, 0xba, 0xdb, 0xae, 0xc5, 0x6a,
+	0x66, 0xbd, 0x90, 0x0c, 0xeb, 0x5b, 0x71, 0x26, 0x26, 0x65, 0x79, 0xa0, 0xee, 0xf9, 0xb6, 0xeb,
+	0xdb, 0xc1, 0xfe, 0x4a, 0xdf, 0x64, 0x4c, 0x00, 0x2c, 0x08, 0x00, 0x1d, 0xa8, 0x6f, 0xa5, 0x05,
+	0x70, 0xb4, 0x0d, 0x8f, 0x86, 0x42, 0x62, 0xed, 0x63, 0xc2, 0x81, 0x13, 0x66, 0x29, 0x6c, 0x8b,
+	0x9a, 0x7b, 0x4c, 0x39, 0xee, 0x95, 0x3c, 0xe5, 0xb8, 0xc4, 0x82, 0x2b, 0xe6, 0x30, 0x70, 0x07,
+	0x9c, 0x90, 0x6c, 0xb2, 0xed, 0xee, 0x52, 0xa7, 0x76, 0x55, 0xec, 0x55, 0x57, 0x0f, 0x0f, 0xea,
+	0x57, 0x96, 0x9f, 0x20, 0x87, 0x4f, 0x44, 0x21, 0x03, 0x28, 0x53, 0x55, 0x52, 0x5c, 0xfb, 0xf8,
+	0x18, 0x9b, 0x44, 0xb2, 0x2e, 0x59, 0x0e, 0x50, 0x48, 0x43, 0xad, 0x82, 0x6c, 0x43, 0xb5, 0xe7,
+	0xb2, 0x60, 0xb9, 0x6f, 0x9b, 0x8c, 0xb2, 0xda, 0x8b, 0x62, 0x9e, 0x64, 0xee, 0x6f, 0xb7, 0x42,
+	0xb1, 0x68, 0x9a, 0xdc, 0x8a, 0x5a, 0x62, 0x1c, 0x86, 0x50, 0x11, 0x1a, 0x0e, 0xc5, 0x5b, 0x73,
+	0x9d, 0x80, 0xbe, 0x17, 0xd4, 0x16, 0xc5, 0xb3, 0xbc, 0x92, 0x85, 0xbc, 0xe5, 0x5a, 0xad, 0xa4,
+	0xb4, 0x5c, 0xe5, 0x29, 0x22, 0xa6, 0x31, 0xc9, 0xeb, 0x30, 0xe3, 0xb9, 0x56, 0xcb, 0xa3, 0xed,
+	0x2d, 0x33, 0x68, 0xf7, 0x6a, 0xf5, 0xe4, 0xe1, 0xef, 0x56, 0x8c, 0x87, 0x09, 0x49, 0x1e, 0x0d,
+	0xf8, 0x94, 0x0d, 0x77, 0x06, 0x76, 0xb0, 0x45, 0x1d, 0xcb, 0x76, 0xba, 0x5b, 0xae, 0xc5, 0x6a,
 	0x86, 0x78, 0x85, 0x22, 0x1a, 0xc0, 0x51, 0x36, 0x66, 0xb5, 0x21, 0x6d, 0x98, 0x1e, 0xc8, 0xf3,
-	0xfa, 0xda, 0x2b, 0x63, 0xb8, 0x95, 0xea, 0xcc, 0x5f, 0x6e, 0x4a, 0xea, 0x0f, 0x86, 0xc8, 0x8b,
-	0xef, 0xc0, 0xb9, 0x11, 0xff, 0xef, 0x99, 0x0a, 0x15, 0xfe, 0x92, 0x47, 0x6b, 0x31, 0x8f, 0xfb,
-	0xb4, 0xe3, 0x94, 0x1b, 0x70, 0x4e, 0x7d, 0x92, 0x83, 0x3b, 0x07, 0xfd, 0xa1, 0xbe, 0x67, 0x1a,
-	0x4b, 0xc2, 0x61, 0x5a, 0x00, 0x47, 0xdb, 0x18, 0x7f, 0x55, 0x80, 0xd9, 0xc4, 0x76, 0x73, 0xea,
-	0xf1, 0xfb, 0x3a, 0x90, 0x81, 0xed, 0xfb, 0xae, 0x2f, 0xf7, 0xec, 0xbb, 0x7c, 0xed, 0x31, 0x55,
-	0x32, 0x2f, 0x4a, 0x35, 0xef, 0x8e, 0x70, 0x31, 0xa3, 0x85, 0xf1, 0xb7, 0x05, 0x88, 0xf2, 0xfd,
-	0xba, 0x3e, 0xb9, 0x70, 0x6c, 0x7d, 0xf2, 0xc7, 0xa1, 0xfc, 0x90, 0xb9, 0xce, 0x76, 0x54, 0xc5,
-	0xac, 0x07, 0xf4, 0x56, 0x6b, 0x6b, 0x53, 0x48, 0x6a, 0x09, 0x21, 0xfd, 0xd5, 0x75, 0xbb, 0x1f,
-	0x8c, 0xd6, 0xfa, 0xde, 0xfa, 0xa2, 0xa4, 0xa3, 0x96, 0x20, 0xcb, 0x50, 0xd1, 0x47, 0x4c, 0x2a,
-	0xf0, 0xd7, 0x83, 0xa0, 0xcf, 0x57, 0x30, 0x92, 0x31, 0x7e, 0x30, 0x01, 0xe5, 0x17, 0x78, 0x77,
-	0xb5, 0x9d, 0xb8, 0xbb, 0x7a, 0x0a, 0x17, 0x1d, 0xb3, 0xee, 0xad, 0xee, 0xa5, 0xee, 0xad, 0xae,
-	0x8e, 0x79, 0x6a, 0xf5, 0xc4, 0x3b, 0xab, 0x3f, 0x29, 0xc0, 0xcc, 0x0b, 0xbc, 0xaf, 0xba, 0x9b,
-	0xbc, 0xaf, 0xfa, 0xd6, 0x58, 0x8f, 0x76, 0xcc, 0x5d, 0xd5, 0xef, 0x5c, 0x84, 0xc4, 0x3d, 0x51,
-	0xe2, 0x40, 0x25, 0x5c, 0xe0, 0xe1, 0x49, 0xe0, 0x5b, 0x63, 0x05, 0xb1, 0xd1, 0xa4, 0x0c, 0x29,
-	0x0c, 0x23, 0x15, 0xe4, 0x1a, 0x00, 0xe5, 0x96, 0x4d, 0x66, 0x59, 0x27, 0x92, 0x07, 0x65, 0xd7,
-	0x35, 0x07, 0x63, 0x52, 0x2f, 0x3e, 0x41, 0x92, 0xed, 0x52, 0x4c, 0x3d, 0x17, 0x97, 0xe2, 0xf2,
-	0xa9, 0xbb, 0x14, 0x2f, 0x3f, 0x7f, 0x97, 0x22, 0x16, 0x40, 0x15, 0xc7, 0x08, 0xa0, 0x3e, 0x80,
-	0x05, 0xf9, 0x73, 0xb5, 0x6f, 0xda, 0x03, 0x3d, 0x5f, 0x54, 0x3d, 0xf0, 0xc7, 0x32, 0x1d, 0x09,
-	0xea, 0x33, 0x9b, 0x05, 0xd4, 0x09, 0xee, 0x47, 0x2d, 0xa3, 0x7a, 0xa8, 0xfb, 0x19, 0x70, 0x98,
-	0xa9, 0x24, 0xed, 0x71, 0x4f, 0x9f, 0xc0, 0xe3, 0xfe, 0x6e, 0x01, 0x2e, 0x98, 0x59, 0x9f, 0xf2,
-	0x50, 0x79, 0x97, 0x5b, 0x63, 0xc5, 0x3f, 0x09, 0x44, 0x15, 0xbf, 0x64, 0xb1, 0x30, 0xbb, 0x0f,
-	0xe4, 0xd5, 0x28, 0x84, 0xae, 0x88, 0x49, 0x95, 0x1d, 0xfc, 0x7e, 0x33, 0x9d, 0xba, 0x02, 0x31,
-	0xda, 0xad, 0xb1, 0x0d, 0xf6, 0x29, 0xa4, 0xaf, 0xaa, 0x63, 0xa4, 0xaf, 0x52, 0xe1, 0xd0, 0xcc,
-	0x29, 0x85, 0x43, 0x0e, 0xcc, 0xdb, 0x03, 0xb3, 0x4b, 0xb7, 0x87, 0xfd, 0xbe, 0x3c, 0xab, 0x60,
-	0xb5, 0x59, 0x81, 0x9d, 0x79, 0x3b, 0x84, 0x87, 0xa7, 0xfd, 0xf4, 0xb5, 0x66, 0x7d, 0x2a, 0xb8,
-	0x91, 0x42, 0xc2, 0x11, 0x6c, 0x3e, 0x2d, 0xb9, 0x9b, 0xbd, 0x49, 0x03, 0x3e, 0xda, 0x22, 0xb3,
-	0xa3, 0xbe, 0x87, 0x74, 0x33, 0x22, 0x63, 0x5c, 0x86, 0xdc, 0x86, 0x8a, 0xe5, 0x30, 0x75, 0x26,
-	0x38, 0x27, 0xac, 0xd4, 0x27, 0xb8, 0x6d, 0x5b, 0xdb, 0x6c, 0xe9, 0xd3, 0xc0, 0xcb, 0xa3, 0xdf,
-	0x86, 0x6b, 0x68, 0x3e, 0x46, 0xed, 0xc9, 0x5d, 0x01, 0xa6, 0xae, 0x4a, 0xc9, 0x54, 0xcc, 0x95,
-	0x63, 0x3c, 0xfa, 0xb5, 0xcd, 0xf0, 0x66, 0xd7, 0xac, 0x52, 0xa7, 0x2e, 0x40, 0x45, 0x08, 0xb1,
-	0xbb, 0xa2, 0xe7, 0x9e, 0x74, 0x57, 0x94, 0xdc, 0x83, 0x4b, 0x41, 0xd0, 0x4f, 0xe4, 0xe7, 0x55,
-	0xbd, 0x9c, 0x28, 0x9e, 0x2c, 0xca, 0xab, 0xfe, 0x3b, 0x3b, 0x77, 0xb2, 0x44, 0xf0, 0xb8, 0xb6,
-	0x22, 0xd5, 0x1d, 0xf4, 0x75, 0x44, 0xbf, 0x34, 0x4e, 0xaa, 0x3b, 0x3a, 0x08, 0x51, 0xa9, 0xee,
-	0x88, 0x80, 0x71, 0x2d, 0xc7, 0x67, 0x26, 0xce, 0xe7, 0xcc, 0x4c, 0xc4, 0x83, 0xe1, 0x85, 0x27,
-	0x06, 0xc3, 0x23, 0xc1, 0xfb, 0x85, 0x67, 0x08, 0xde, 0xdf, 0x15, 0x65, 0x89, 0x37, 0x56, 0x55,
-	0xe2, 0x23, 0x5f, 0xb5, 0x85, 0xa8, 0x52, 0x91, 0x47, 0xd7, 0xe2, 0x27, 0x4a, 0x4c, 0xb2, 0x0d,
-	0x0b, 0x9e, 0x6b, 0x8d, 0xc4, 0xfe, 0x22, 0xd3, 0x11, 0x2b, 0x68, 0xdd, 0xce, 0x90, 0xc1, 0xcc,
-	0x96, 0xc2, 0x80, 0x47, 0xf4, 0x5a, 0x4d, 0x0c, 0x8c, 0x34, 0xe0, 0x11, 0x19, 0xe3, 0x32, 0xe9,
-	0x50, 0xf8, 0xa5, 0xe7, 0x16, 0x0a, 0x2f, 0xbe, 0x80, 0x50, 0xf8, 0x23, 0x27, 0x0e, 0x85, 0x7f,
-	0x07, 0xce, 0x7b, 0xae, 0xb5, 0x66, 0x33, 0x7f, 0x28, 0xbe, 0xc5, 0xd6, 0x1c, 0x5a, 0x5d, 0x1a,
-	0x88, 0x58, 0xba, 0x7a, 0xed, 0x5a, 0xbc, 0x93, 0xf2, 0x93, 0x90, 0x0d, 0xf5, 0x49, 0x48, 0xb1,
-	0xc8, 0x53, 0xad, 0x84, 0x6b, 0x2e, 0xc2, 0xe7, 0x0c, 0x26, 0x66, 0xe9, 0x89, 0x87, 0xcf, 0x57,
-	0x7e, 0x7e, 0xc3, 0xe7, 0xef, 0x03, 0x9c, 0x4d, 0x7d, 0xc3, 0x42, 0x57, 0x3d, 0x17, 0x4e, 0x5a,
-	0xf5, 0x9c, 0x28, 0x4b, 0x9e, 0x78, 0xae, 0x65, 0xc9, 0x93, 0xa7, 0x5e, 0x96, 0x1c, 0x2b, 0xbf,
-	0x9e, 0x7a, 0x4a, 0xf9, 0xf5, 0x0a, 0xcc, 0xb5, 0xdd, 0x81, 0x27, 0x2e, 0xad, 0xaa, 0x22, 0x5c,
-	0x59, 0x46, 0xa3, 0x4f, 0xfc, 0x57, 0x93, 0x6c, 0x4c, 0xcb, 0x93, 0xdf, 0x86, 0xa2, 0x23, 0x1a,
-	0x96, 0xc6, 0xb8, 0xc6, 0x92, 0x7c, 0x61, 0xc2, 0x03, 0x51, 0x37, 0x49, 0xc2, 0xfc, 0x79, 0x51,
-	0xd0, 0x8e, 0xc2, 0x1f, 0x28, 0x95, 0x92, 0xf7, 0xa0, 0xe6, 0x76, 0x3a, 0x7d, 0xd7, 0xb4, 0xa2,
-	0xcb, 0x10, 0xf7, 0xb9, 0x6f, 0xa9, 0x4e, 0xa4, 0x2a, 0xcd, 0x2b, 0x0a, 0xa0, 0xb6, 0x75, 0x8c,
-	0x1c, 0x1e, 0x8b, 0xc0, 0x1d, 0xc5, 0xb9, 0x64, 0x49, 0x3f, 0xab, 0x55, 0xc4, 0x63, 0xfe, 0xc6,
-	0x69, 0x3c, 0x66, 0xf2, 0xfe, 0x80, 0x7a, 0xe0, 0xa8, 0xd6, 0x22, 0xc9, 0xc5, 0x74, 0x4f, 0x88,
-	0x0f, 0x17, 0xbd, 0x2c, 0x37, 0x9a, 0xa9, 0x53, 0xcc, 0x27, 0x39, 0xf3, 0x4b, 0x4a, 0xcb, 0xc5,
-	0x4c, 0x47, 0x9c, 0xe1, 0x31, 0xc8, 0xf1, 0x12, 0xf2, 0xf2, 0x73, 0x2b, 0x21, 0xf7, 0x44, 0x1a,
-	0x49, 0x15, 0x64, 0x55, 0xc7, 0x28, 0xf5, 0xd5, 0x45, 0x5a, 0xd1, 0x9a, 0xd1, 0x24, 0x86, 0x91,
-	0x92, 0xc5, 0x7d, 0x79, 0x99, 0xe6, 0xd8, 0x6b, 0x45, 0xf7, 0x92, 0x17, 0x0b, 0xdf, 0xc9, 0xf9,
-	0xd1, 0xd8, 0x70, 0x7e, 0xc5, 0xaf, 0x34, 0xfd, 0x5e, 0x01, 0x16, 0xb2, 0x26, 0x42, 0x46, 0x2f,
-	0x5a, 0xc9, 0x5e, 0x8c, 0x17, 0xe0, 0xc7, 0x6d, 0xe6, 0xb7, 0x4a, 0xb1, 0x74, 0x42, 0x40, 0xbd,
-	0x5f, 0xd6, 0x46, 0xe4, 0xaa, 0x8d, 0x48, 0x7c, 0xf5, 0xa6, 0xf8, 0x02, 0xbf, 0x7a, 0x53, 0xca,
-	0xf1, 0xd5, 0x9b, 0xe9, 0x17, 0xf9, 0xd5, 0x9b, 0xf2, 0x09, 0xbf, 0x7a, 0x53, 0xf9, 0xf9, 0xf9,
-	0xea, 0xcd, 0x87, 0x05, 0x98, 0x4f, 0x5f, 0xcb, 0x7a, 0x01, 0xe9, 0xd7, 0xbd, 0x44, 0xfa, 0x75,
-	0x63, 0xac, 0x6d, 0x46, 0x5f, 0x05, 0x3b, 0x26, 0x0d, 0x6b, 0xfc, 0xac, 0x00, 0x23, 0x57, 0xcf,
-	0x5e, 0x40, 0x86, 0xf4, 0x61, 0x32, 0x43, 0x7a, 0xfd, 0x54, 0x1e, 0xf2, 0x98, 0x4c, 0xe9, 0x9f,
-	0x65, 0x3c, 0xa2, 0xc8, 0x98, 0x7e, 0xf0, 0xbc, 0x3e, 0xec, 0xb7, 0x90, 0xf5, 0x61, 0xbf, 0xe4,
-	0x87, 0xfc, 0x9a, 0x8d, 0x1f, 0x7d, 0xb8, 0x74, 0xe6, 0x27, 0x1f, 0x2e, 0x9d, 0xf9, 0xe9, 0x87,
-	0x4b, 0x67, 0xbe, 0x7e, 0xb8, 0x54, 0xf8, 0xd1, 0xe1, 0x52, 0xe1, 0x27, 0x87, 0x4b, 0x85, 0x9f,
-	0x1e, 0x2e, 0x15, 0x7e, 0x76, 0xb8, 0x54, 0xf8, 0xd3, 0x7f, 0x5e, 0x3a, 0xf3, 0x9b, 0xe5, 0x50,
-	0xc1, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x95, 0x86, 0x07, 0xbc, 0x5e, 0x00, 0x00,
+	0xfa, 0xda, 0x4b, 0x63, 0xb8, 0x95, 0xea, 0xcc, 0x5f, 0x6e, 0x4a, 0xea, 0x0f, 0x86, 0xc8, 0x0b,
+	0x6f, 0xc1, 0xf9, 0x11, 0xff, 0xef, 0xa9, 0x0a, 0x15, 0xfe, 0x9c, 0x47, 0x6b, 0x31, 0x8f, 0xfb,
+	0xb4, 0xe3, 0x94, 0x9b, 0x70, 0x5e, 0x7d, 0x92, 0x83, 0x3b, 0x07, 0xfd, 0xa1, 0xbe, 0x67, 0x1a,
+	0x4b, 0xc2, 0x61, 0x5a, 0x00, 0x47, 0xdb, 0x18, 0x7f, 0x51, 0x80, 0xd9, 0xc4, 0x76, 0x73, 0xea,
+	0xf1, 0xfb, 0x1a, 0x90, 0x81, 0xed, 0xfb, 0xae, 0x2f, 0xf7, 0xec, 0x7b, 0x7c, 0xed, 0x31, 0x55,
+	0x32, 0x2f, 0x4a, 0x35, 0xef, 0x8d, 0x70, 0x31, 0xa3, 0x85, 0xf1, 0xd7, 0x05, 0x88, 0xf2, 0xfd,
+	0xba, 0x3e, 0xb9, 0x70, 0x6c, 0x7d, 0xf2, 0x27, 0xa1, 0xfc, 0x88, 0xb9, 0xce, 0x56, 0x54, 0xc5,
+	0xac, 0x07, 0xf4, 0x76, 0x6b, 0x73, 0x43, 0x48, 0x6a, 0x09, 0x21, 0xfd, 0xb5, 0x35, 0xbb, 0x1f,
+	0x8c, 0xd6, 0xfa, 0xde, 0xfe, 0x92, 0xa4, 0xa3, 0x96, 0x20, 0x4b, 0x50, 0xd1, 0x47, 0x4c, 0x2a,
+	0xf0, 0xd7, 0x83, 0xa0, 0xcf, 0x57, 0x30, 0x92, 0x31, 0x7e, 0x38, 0x01, 0xe5, 0xe7, 0x78, 0x77,
+	0xb5, 0x9d, 0xb8, 0xbb, 0x7a, 0x0a, 0x17, 0x1d, 0xb3, 0xee, 0xad, 0xee, 0xa6, 0xee, 0xad, 0xae,
+	0x8c, 0x79, 0x6a, 0xf5, 0xc4, 0x3b, 0xab, 0x3f, 0x2d, 0xc0, 0xcc, 0x73, 0xbc, 0xaf, 0xba, 0x93,
+	0xbc, 0xaf, 0xfa, 0xc6, 0x58, 0x8f, 0x76, 0xcc, 0x5d, 0xd5, 0x7f, 0xb8, 0x04, 0x89, 0x7b, 0xa2,
+	0xc4, 0x81, 0x4a, 0xb8, 0xc0, 0xc3, 0x93, 0xc0, 0x37, 0xc6, 0x0a, 0x62, 0xa3, 0x49, 0x19, 0x52,
+	0x18, 0x46, 0x2a, 0xc8, 0x75, 0x00, 0xca, 0x2d, 0x9b, 0xcc, 0xb2, 0x4e, 0x24, 0x0f, 0xca, 0x6e,
+	0x68, 0x0e, 0xc6, 0xa4, 0x9e, 0x7f, 0x82, 0x24, 0xdb, 0xa5, 0x98, 0x7a, 0x26, 0x2e, 0xc5, 0x95,
+	0x53, 0x77, 0x29, 0x5e, 0x7c, 0xf6, 0x2e, 0x45, 0x2c, 0x80, 0x2a, 0x8e, 0x11, 0x40, 0xbd, 0x0f,
+	0xf3, 0xf2, 0xe7, 0x4a, 0xdf, 0xb4, 0x07, 0x7a, 0xbe, 0xa8, 0x7a, 0xe0, 0x4f, 0x64, 0x3a, 0x12,
+	0xd4, 0x67, 0x36, 0x0b, 0xa8, 0x13, 0x3c, 0x88, 0x5a, 0x46, 0xf5, 0x50, 0x0f, 0x32, 0xe0, 0x30,
+	0x53, 0x49, 0xda, 0xe3, 0x9e, 0x3e, 0x81, 0xc7, 0xfd, 0xbd, 0x02, 0x5c, 0x34, 0xb3, 0x3e, 0xe5,
+	0xa1, 0xf2, 0x2e, 0xb7, 0xc7, 0x8a, 0x7f, 0x12, 0x88, 0x2a, 0x7e, 0xc9, 0x62, 0x61, 0x76, 0x1f,
+	0xc8, 0xcb, 0x51, 0x08, 0x5d, 0x11, 0x93, 0x2a, 0x3b, 0xf8, 0xfd, 0x56, 0x3a, 0x75, 0x05, 0x62,
+	0xb4, 0x5b, 0x63, 0x1b, 0xec, 0x53, 0x48, 0x5f, 0x55, 0xc7, 0x48, 0x5f, 0xa5, 0xc2, 0xa1, 0x99,
+	0x53, 0x0a, 0x87, 0x1c, 0x98, 0xb3, 0x07, 0x66, 0x97, 0x6e, 0x0d, 0xfb, 0x7d, 0x79, 0x56, 0xc1,
+	0x6a, 0xb3, 0x02, 0x3b, 0xf3, 0x76, 0x08, 0x0f, 0x4f, 0xfb, 0xe9, 0x6b, 0xcd, 0xfa, 0x54, 0x70,
+	0x3d, 0x85, 0x84, 0x23, 0xd8, 0x7c, 0x5a, 0x72, 0x37, 0x7b, 0x83, 0x06, 0x7c, 0xb4, 0x45, 0x66,
+	0x47, 0x7d, 0x0f, 0xe9, 0x56, 0x44, 0xc6, 0xb8, 0x0c, 0xb9, 0x03, 0x15, 0xcb, 0x61, 0xea, 0x4c,
+	0xf0, 0x9c, 0xb0, 0x52, 0x9f, 0xe2, 0xb6, 0x6d, 0x75, 0xa3, 0xa5, 0x4f, 0x03, 0xaf, 0x8c, 0x7e,
+	0x1b, 0xae, 0xa1, 0xf9, 0x18, 0xb5, 0x27, 0xf7, 0x04, 0x98, 0xba, 0x2a, 0x25, 0x53, 0x31, 0x57,
+	0x8f, 0xf1, 0xe8, 0x57, 0x37, 0xc2, 0x9b, 0x5d, 0xb3, 0x4a, 0x9d, 0xba, 0x00, 0x15, 0x21, 0xc4,
+	0xee, 0x8a, 0x9e, 0x7f, 0xd2, 0x5d, 0x51, 0x72, 0x1f, 0x2e, 0x07, 0x41, 0x3f, 0x91, 0x9f, 0x57,
+	0xf5, 0x72, 0xa2, 0x78, 0xb2, 0x28, 0xaf, 0xfa, 0x6f, 0x6f, 0xdf, 0xcd, 0x12, 0xc1, 0xe3, 0xda,
+	0x8a, 0x54, 0x77, 0xd0, 0xd7, 0x11, 0xfd, 0xe2, 0x38, 0xa9, 0xee, 0xe8, 0x20, 0x44, 0xa5, 0xba,
+	0x23, 0x02, 0xc6, 0xb5, 0x1c, 0x9f, 0x99, 0xb8, 0x90, 0x33, 0x33, 0x11, 0x0f, 0x86, 0xe7, 0x9f,
+	0x18, 0x0c, 0x8f, 0x04, 0xef, 0x17, 0x9f, 0x22, 0x78, 0x7f, 0x47, 0x94, 0x25, 0xde, 0x5c, 0x51,
+	0x89, 0x8f, 0x7c, 0xd5, 0x16, 0xa2, 0x4a, 0x45, 0x1e, 0x5d, 0x8b, 0x9f, 0x28, 0x31, 0xc9, 0x16,
+	0xcc, 0x7b, 0xae, 0x35, 0x12, 0xfb, 0x8b, 0x4c, 0x47, 0xac, 0xa0, 0x75, 0x2b, 0x43, 0x06, 0x33,
+	0x5b, 0x0a, 0x03, 0x1e, 0xd1, 0x6b, 0x35, 0x31, 0x30, 0xd2, 0x80, 0x47, 0x64, 0x8c, 0xcb, 0xa4,
+	0x43, 0xe1, 0x17, 0x9e, 0x59, 0x28, 0xbc, 0xf0, 0x1c, 0x42, 0xe1, 0x8f, 0x9d, 0x38, 0x14, 0xfe,
+	0x2d, 0xb8, 0xe0, 0xb9, 0xd6, 0xaa, 0xcd, 0xfc, 0xa1, 0xf8, 0x16, 0x5b, 0x73, 0x68, 0x75, 0x69,
+	0x20, 0x62, 0xe9, 0xea, 0xf5, 0xeb, 0xf1, 0x4e, 0xca, 0x4f, 0x42, 0x36, 0xd4, 0x27, 0x21, 0xc5,
+	0x22, 0x4f, 0xb5, 0x12, 0xae, 0xb9, 0x08, 0x9f, 0x33, 0x98, 0x98, 0xa5, 0x27, 0x1e, 0x3e, 0x5f,
+	0x7d, 0x56, 0xe1, 0x33, 0x79, 0x1b, 0xca, 0xac, 0x37, 0x0c, 0x2c, 0x77, 0xcf, 0x11, 0x49, 0x95,
+	0x8a, 0xfe, 0x50, 0x4a, 0xb9, 0xa5, 0xe8, 0x47, 0x07, 0xf5, 0xb9, 0xf0, 0x77, 0xac, 0x8e, 0x4a,
+	0x51, 0xc6, 0x0f, 0xc0, 0x7f, 0x00, 0x70, 0x36, 0xf5, 0x15, 0x0c, 0x5d, 0x37, 0x5d, 0x38, 0x69,
+	0xdd, 0x74, 0xa2, 0xb0, 0x79, 0xe2, 0x99, 0x16, 0x36, 0x4f, 0x9e, 0x7a, 0x61, 0x73, 0xac, 0x80,
+	0x7b, 0xea, 0x23, 0x0a, 0xb8, 0x97, 0xe1, 0x5c, 0xdb, 0x1d, 0x78, 0xe2, 0xda, 0xab, 0x2a, 0xe3,
+	0x95, 0x85, 0x38, 0xba, 0x66, 0x60, 0x25, 0xc9, 0xc6, 0xb4, 0x3c, 0xf9, 0x4d, 0x28, 0x3a, 0xa2,
+	0x61, 0x69, 0x8c, 0x8b, 0x30, 0xc9, 0x17, 0x26, 0x7c, 0x18, 0x75, 0x17, 0x25, 0xcc, 0xc0, 0x17,
+	0x05, 0xed, 0x28, 0xfc, 0x81, 0x52, 0x29, 0x79, 0x17, 0x6a, 0x6e, 0xa7, 0xd3, 0x77, 0x4d, 0x2b,
+	0xba, 0x4e, 0xf1, 0x80, 0x7b, 0xa7, 0xea, 0x4c, 0xab, 0xd2, 0xbc, 0xaa, 0x00, 0x6a, 0x9b, 0xc7,
+	0xc8, 0xe1, 0xb1, 0x08, 0xdc, 0xd5, 0x3c, 0x97, 0xbc, 0x14, 0xc0, 0x6a, 0x15, 0xf1, 0x98, 0xbf,
+	0x76, 0x1a, 0x8f, 0x99, 0xbc, 0x81, 0xa0, 0x1e, 0x38, 0xaa, 0xd6, 0x48, 0x72, 0x31, 0xdd, 0x13,
+	0xe2, 0xc3, 0x25, 0x2f, 0xcb, 0x11, 0x67, 0xea, 0x1c, 0xf4, 0x49, 0xe1, 0xc0, 0xa2, 0xd2, 0x72,
+	0x29, 0xd3, 0x95, 0x67, 0x78, 0x0c, 0x72, 0xbc, 0x08, 0xbd, 0xfc, 0xcc, 0x8a, 0xd0, 0x3d, 0x91,
+	0x88, 0x52, 0x25, 0x5d, 0xd5, 0x31, 0x8a, 0x85, 0x75, 0x99, 0x57, 0xb4, 0x66, 0x34, 0x89, 0x61,
+	0xa4, 0x64, 0x61, 0x5f, 0x5e, 0xc7, 0x39, 0xf6, 0x62, 0xd2, 0xfd, 0xe4, 0xd5, 0xc4, 0xb7, 0x72,
+	0x7e, 0x76, 0x36, 0x9c, 0x5f, 0xf1, 0x4b, 0x51, 0xbf, 0x53, 0x80, 0xf9, 0xac, 0x89, 0x90, 0xd1,
+	0x8b, 0x56, 0xb2, 0x17, 0xe3, 0xa5, 0x08, 0xe2, 0x36, 0xf3, 0xdb, 0xa5, 0x58, 0x42, 0x22, 0xa0,
+	0xde, 0x2f, 0xaa, 0x2b, 0x72, 0x55, 0x57, 0x24, 0xbe, 0x9b, 0x53, 0x7c, 0x8e, 0xdf, 0xcd, 0x29,
+	0xe5, 0xf8, 0x6e, 0xce, 0xf4, 0xf3, 0xfc, 0x6e, 0x4e, 0xf9, 0x84, 0xdf, 0xcd, 0xa9, 0xfc, 0xef,
+	0xf9, 0x6e, 0xce, 0x87, 0x05, 0x98, 0x4b, 0x5f, 0xec, 0x7a, 0x0e, 0x09, 0xdc, 0xdd, 0x44, 0x02,
+	0x77, 0x7d, 0xac, 0x6d, 0x46, 0x5f, 0x26, 0x3b, 0x26, 0x91, 0x6b, 0xfc, 0xac, 0x00, 0x23, 0x97,
+	0xd7, 0x9e, 0x43, 0x8e, 0xf5, 0x51, 0x32, 0xc7, 0x7a, 0xe3, 0x54, 0x1e, 0xf2, 0x98, 0x5c, 0xeb,
+	0x9f, 0x64, 0x3c, 0xa2, 0xc8, 0xb9, 0xbe, 0xff, 0xac, 0x3e, 0x0d, 0x38, 0x9f, 0xf5, 0x69, 0xc0,
+	0xe4, 0xa7, 0x00, 0x9b, 0x8d, 0x1f, 0x7f, 0xb8, 0x78, 0xe6, 0xa7, 0x1f, 0x2e, 0x9e, 0xf9, 0xe0,
+	0xc3, 0xc5, 0x33, 0xdf, 0x38, 0x5c, 0x2c, 0xfc, 0xf8, 0x70, 0xb1, 0xf0, 0xd3, 0xc3, 0xc5, 0xc2,
+	0x07, 0x87, 0x8b, 0x85, 0x9f, 0x1d, 0x2e, 0x16, 0xfe, 0xf8, 0x9f, 0x16, 0xcf, 0xfc, 0x7a, 0x39,
+	0x54, 0xf0, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x16, 0x44, 0xf6, 0x14, 0xfe, 0x5e, 0x00, 0x00,
 }
 
 func (m *ArchiveStrategy) Marshal() (dAtA []byte, err error) {
@@ -5618,6 +5620,13 @@ func (m *WorkflowSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	_ = i
 	var l int
 	_ = l
+	i -= len(m.Shutdown)
+	copy(dAtA[i:], m.Shutdown)
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Shutdown)))
+	i--
+	dAtA[i] = 0x2
+	i--
+	dAtA[i] = 0x8a
 	if m.Metrics != nil {
 		{
 			size, err := m.Metrics.MarshalToSizedBuffer(dAtA[:i])
@@ -7723,6 +7732,8 @@ func (m *WorkflowSpec) Size() (n int) {
 		l = m.Metrics.Size()
 		n += 2 + l + sovGenerated(uint64(l))
 	}
+	l = len(m.Shutdown)
+	n += 2 + l + sovGenerated(uint64(l))
 	return n
 }
 
@@ -8790,6 +8801,7 @@ func (this *WorkflowSpec) String() string {
 		`TTLStrategy:` + strings.Replace(this.TTLStrategy.String(), "TTLStrategy", "TTLStrategy", 1) + `,`,
 		`PodDisruptionBudget:` + strings.Replace(fmt.Sprintf("%v", this.PodDisruptionBudget), "PodDisruptionBudgetSpec", "v1beta1.PodDisruptionBudgetSpec", 1) + `,`,
 		`Metrics:` + strings.Replace(this.Metrics.String(), "Metrics", "Metrics", 1) + `,`,
+		`Shutdown:` + fmt.Sprintf("%v", this.Shutdown) + `,`,
 		`}`,
 	}, "")
 	return s
@@ -20837,6 +20849,38 @@ func (m *WorkflowSpec) Unmarshal(dAtA []byte) error {
 				return err
 			}
 			iNdEx = postIndex
+		case 33:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Shutdown", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Shutdown = ShutdownStrategy(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := skipGenerated(dAtA[iNdEx:])
diff --git a/pkg/apis/workflow/v1alpha1/generated.proto b/pkg/apis/workflow/v1alpha1/generated.proto
index a89f5ea04..3a900c1a6 100644
--- a/pkg/apis/workflow/v1alpha1/generated.proto
+++ b/pkg/apis/workflow/v1alpha1/generated.proto
@@ -1096,6 +1096,9 @@ message WorkflowSpec {
 
   // Metrics are a list of metrics emitted from this Workflow
   optional Metrics metrics = 32;
+
+  // Shutdown will shutdown the workflow according to its ShutdownStrategy
+  optional string shutdown = 33;
 }
 
 // WorkflowStatus contains overall status information about a workflow
diff --git a/pkg/apis/workflow/v1alpha1/workflow_types.go b/pkg/apis/workflow/v1alpha1/workflow_types.go
index f103bd828..bc67b3f09 100644
--- a/pkg/apis/workflow/v1alpha1/workflow_types.go
+++ b/pkg/apis/workflow/v1alpha1/workflow_types.go
@@ -286,8 +286,18 @@ type WorkflowSpec struct {
 
 	// Metrics are a list of metrics emitted from this Workflow
 	Metrics *Metrics `json:"metrics,omitempty" protobuf:"bytes,32,opt,name=metrics"`
+
+	// Shutdown will shutdown the workflow according to its ShutdownStrategy
+	Shutdown ShutdownStrategy `json:"shutdown,omitempty" protobuf:"bytes,33,opt,name=shutdown,casttype=ShutdownStrategy"`
 }
 
+type ShutdownStrategy string
+
+const (
+	ShutdownStrategyTerminate ShutdownStrategy = "Terminate"
+	ShutdownStrategyStop      ShutdownStrategy = "Stop"
+)
+
 type ParallelSteps struct {
 	Steps []WorkflowStep `protobuf:"bytes,1,rep,name=steps"`
 }
diff --git a/server/workflow/workflow_server.go b/server/workflow/workflow_server.go
index 574996824..08df3e3bc 100644
--- a/server/workflow/workflow_server.go
+++ b/server/workflow/workflow_server.go
@@ -311,6 +311,20 @@ func (s *workflowServer) TerminateWorkflow(ctx context.Context, req *workflowpkg
 	return wf, nil
 }
 
+func (s *workflowServer) StopWorkflow(ctx context.Context, req *workflowpkg.WorkflowStopRequest) (*v1alpha1.Workflow, error) {
+	wfClient := auth.GetWfClient(ctx)
+	err := util.StopWorkflow(wfClient.ArgoprojV1alpha1().Workflows(req.Namespace), req.Name)
+	if err != nil {
+		return nil, err
+	}
+
+	wf, err := wfClient.ArgoprojV1alpha1().Workflows(req.Namespace).Get(req.Name, metav1.GetOptions{})
+	if err != nil {
+		return nil, err
+	}
+	return wf, nil
+}
+
 func (s *workflowServer) LintWorkflow(ctx context.Context, req *workflowpkg.WorkflowLintRequest) (*v1alpha1.Workflow, error) {
 	wfClient := auth.GetWfClient(ctx)
 
diff --git a/ui/src/app/shared/services/workflows-service.ts b/ui/src/app/shared/services/workflows-service.ts
index bd96dbb65..34588df00 100644
--- a/ui/src/app/shared/services/workflows-service.ts
+++ b/ui/src/app/shared/services/workflows-service.ts
@@ -44,6 +44,10 @@ export class WorkflowsService {
         return requests.put(`api/v1/workflows/${namespace}/${name}/resume`).then(res => res.body as Workflow);
     }
 
+    public stop(name: string, namespace: string) {
+        return requests.put(`api/v1/workflows/${namespace}/${name}/stop`).then(res => res.body as Workflow);
+    }
+
     public terminate(name: string, namespace: string) {
         return requests.put(`api/v1/workflows/${namespace}/${name}/terminate`).then(res => res.body as Workflow);
     }
diff --git a/ui/src/app/workflows/components/workflow-details/workflow-details.tsx b/ui/src/app/workflows/components/workflow-details/workflow-details.tsx
index cb4b2ff97..b810f16dd 100644
--- a/ui/src/app/workflows/components/workflow-details/workflow-details.tsx
+++ b/ui/src/app/workflows/components/workflow-details/workflow-details.tsx
@@ -194,6 +194,12 @@ export class WorkflowDetails extends React.Component<RouteComponentProps<any>, {
                 disabled: !Utils.isWorkflowSuspended(this.state.workflow),
                 action: () => this.resumeWorkflow(ctx)
             },
+            {
+                title: 'Stop',
+                iconClassName: 'fa fa-stop-circle',
+                disabled: !Utils.isWorkflowRunning(this.state.workflow),
+                action: () => this.stopWorkflow(ctx)
+            },
             {
                 title: 'Terminate',
                 iconClassName: 'fa fa-times-circle',
@@ -235,6 +241,21 @@ export class WorkflowDetails extends React.Component<RouteComponentProps<any>, {
             });
     }
 
+    private stopWorkflow(ctx: ContextApis) {
+        if (!confirm('Are you sure you want to stop this workflow?')) {
+            return;
+        }
+        services.workflows
+            .stop(this.props.match.params.name, this.props.match.params.namespace)
+            .then(wf => ctx.navigation.goto(uiUrl(`workflows/${wf.metadata.namespace}/${wf.metadata.name}`)))
+            .catch(error => {
+                this.appContext.apis.notifications.show({
+                    content: 'Unable to terminate workflow',
+                    type: NotificationType.Error
+                });
+            });
+    }
+
     private terminateWorkflow(ctx: ContextApis) {
         if (!confirm('Are you sure you want to terminate this workflow?')) {
             return;
diff --git a/workflow/common/common.go b/workflow/common/common.go
index afdec38ce..46deb4ae9 100644
--- a/workflow/common/common.go
+++ b/workflow/common/common.go
@@ -61,6 +61,8 @@ const (
 	LabelKeyCronWorkflow = workflow.WorkflowFullName + "/cron-workflow"
 	// LabelKeyWorkflowTemplate is a label applied to Workflows that are submitted from Workflowtemplate
 	LabelKeyWorkflowTemplate = workflow.WorkflowFullName + "/workflow-template"
+	// LabelKeyOnExit is a label applied to Pods that are run from onExit nodes, so that they are not shut down when stopping a Workflow
+	LabelKeyOnExit = workflow.WorkflowFullName + "/on-exit"
 
 	// ExecutorArtifactBaseDir is the base directory in the init container in which artifacts will be copied to.
 	// Each artifact will be named according to its input name (e.g: /argo/inputs/artifacts/CODE)
diff --git a/workflow/controller/dag.go b/workflow/controller/dag.go
index 66fb17fc6..0c1751987 100644
--- a/workflow/controller/dag.go
+++ b/workflow/controller/dag.go
@@ -201,10 +201,10 @@ func (d *dagContext) hasMoreRetries(node *wfv1.NodeStatus) bool {
 	return true
 }
 
-func (woc *wfOperationCtx) executeDAG(nodeName string, tmplCtx *templateresolution.Context, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) {
+func (woc *wfOperationCtx) executeDAG(nodeName string, tmplCtx *templateresolution.Context, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, opts *executeTemplateOpts) (*wfv1.NodeStatus, error) {
 	node := woc.getNodeByName(nodeName)
 	if node == nil {
-		node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeDAG, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodeRunning)
+		node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeDAG, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodeRunning)
 	}
 
 	defer func() {
@@ -423,7 +423,7 @@ func (woc *wfOperationCtx) executeDAGTask(dagCtx *dagContext, taskName string) {
 		}
 
 		// Finally execute the template
-		_, _ = woc.executeTemplate(taskNodeName, &t, dagCtx.tmplCtx, t.Arguments, dagCtx.boundaryID)
+		_, _ = woc.executeTemplate(taskNodeName, &t, dagCtx.tmplCtx, t.Arguments, &executeTemplateOpts{boundaryID: dagCtx.boundaryID})
 	}
 
 	if taskGroupNode != nil {
diff --git a/workflow/controller/exec_control.go b/workflow/controller/exec_control.go
index c1b7ab1aa..9cf2225c8 100644
--- a/workflow/controller/exec_control.go
+++ b/workflow/controller/exec_control.go
@@ -25,6 +25,24 @@ func (woc *wfOperationCtx) applyExecutionControl(pod *apiv1.Pod, wfNodesLock *sy
 		// Skip any pod which are already completed
 		return nil
 	case apiv1.PodPending:
+		// Check if we are currently shutting down
+		if woc.wf.Spec.Shutdown != "" {
+			// Only delete pods that are not part of an onExit handler if we are "Stopping" or all pods if we are "Terminating"
+			_, onExitPod := pod.Labels[common.LabelKeyOnExit]
+			if woc.wf.Spec.Shutdown == wfv1.ShutdownStrategyTerminate || (woc.wf.Spec.Shutdown == wfv1.ShutdownStrategyStop && !onExitPod) {
+				woc.log.Infof("Deleting Pending pod %s/%s as part of workflow shutdown with strategy: %s", pod.Namespace, pod.Name, woc.wf.Spec.Shutdown)
+				err := woc.controller.kubeclientset.CoreV1().Pods(pod.Namespace).Delete(pod.Name, &metav1.DeleteOptions{})
+				if err == nil {
+					wfNodesLock.Lock()
+					defer wfNodesLock.Unlock()
+					node := woc.wf.Status.Nodes[pod.Name]
+					woc.markNodePhase(node.Name, wfv1.NodeFailed, fmt.Sprintf("workflow shutdown with strategy:  %s", woc.wf.Spec.Shutdown))
+					return nil
+				}
+				// If we fail to delete the pod, fall back to setting the annotation
+				woc.log.Warnf("Failed to delete %s/%s: %v", pod.Namespace, pod.Name, err)
+			}
+		}
 		// Check if we are past the workflow deadline. If we are, and the pod is still pending
 		// then we should simply delete it and mark the pod as Failed
 		if woc.workflowDeadline != nil && time.Now().UTC().After(*woc.workflowDeadline) {
@@ -34,13 +52,7 @@ func (woc *wfOperationCtx) applyExecutionControl(pod *apiv1.Pod, wfNodesLock *sy
 				wfNodesLock.Lock()
 				defer wfNodesLock.Unlock()
 				node := woc.wf.Status.Nodes[pod.Name]
-				var message string
-				if woc.workflowDeadline.IsZero() {
-					message = "terminated"
-				} else {
-					message = fmt.Sprintf("step exceeded workflow deadline %s", *woc.workflowDeadline)
-				}
-				woc.markNodePhase(node.Name, wfv1.NodeFailed, message)
+				woc.markNodePhase(node.Name, wfv1.NodeFailed, fmt.Sprintf("step exceeded workflow deadline %s", *woc.workflowDeadline))
 				return nil
 			}
 			// If we fail to delete the pod, fall back to setting the annotation
@@ -55,23 +67,26 @@ func (woc *wfOperationCtx) applyExecutionControl(pod *apiv1.Pod, wfNodesLock *sy
 			woc.log.Warnf("Failed to unmarshal execution control from pod %s", pod.Name)
 		}
 	}
-	if podExecCtl.Deadline == nil && woc.workflowDeadline == nil {
-		return nil
-	} else if podExecCtl.Deadline != nil && woc.workflowDeadline != nil {
-		if podExecCtl.Deadline.Equal(*woc.workflowDeadline) {
+
+	var newDeadline *time.Time
+	if woc.wf.Spec.Shutdown != "" {
+		// Signal termination by setting a Zero deadline
+		newDeadline = &time.Time{}
+	} else {
+		if podExecCtl.Deadline == nil && woc.workflowDeadline == nil {
+			return nil
+		} else if podExecCtl.Deadline != nil && woc.workflowDeadline != nil && podExecCtl.Deadline.Equal(*woc.workflowDeadline) {
+			return nil
+		} else if podExecCtl.Deadline != nil && podExecCtl.Deadline.IsZero() {
+			// If the pod has already been explicitly signaled to terminate, then do nothing.
+			// This can happen when daemon steps are terminated.
+			woc.log.Infof("Skipping sync of execution control of pod %s. pod has been signaled to terminate", pod.Name)
 			return nil
 		}
+		newDeadline = woc.workflowDeadline
 	}
-
-	if podExecCtl.Deadline != nil && podExecCtl.Deadline.IsZero() {
-		// If the pod has already been explicitly signaled to terminate, then do nothing.
-		// This can happen when daemon steps are terminated.
-		woc.log.Infof("Skipping sync of execution control of pod %s. pod has been signaled to terminate", pod.Name)
-		return nil
-	}
-
 	// Assign new deadline value to PodExeCtl
-	podExecCtl.Deadline = woc.workflowDeadline
+	podExecCtl.Deadline = newDeadline
 
 	woc.log.Infof("Execution control for pod %s out-of-sync desired: %v, actual: %v", pod.Name, woc.workflowDeadline, podExecCtl.Deadline)
 	return woc.updateExecutionControl(pod.Name, podExecCtl)
diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go
index 32ed8bc08..a14e748f8 100644
--- a/workflow/controller/operator.go
+++ b/workflow/controller/operator.go
@@ -40,7 +40,6 @@ import (
 	"github.com/argoproj/argo/workflow/metrics"
 	"github.com/argoproj/argo/workflow/packer"
 	"github.com/argoproj/argo/workflow/templateresolution"
-	"github.com/argoproj/argo/workflow/util"
 	"github.com/argoproj/argo/workflow/validate"
 
 	argokubeerr "github.com/argoproj/pkg/kube/errors"
@@ -272,9 +271,7 @@ func (woc *wfOperationCtx) operate() {
 		return
 	}
 
-	var workflowStatus wfv1.NodePhase
-	var workflowMessage string
-	node, err := woc.executeTemplate(woc.wf.ObjectMeta.Name, &wfv1.WorkflowStep{Template: woc.wf.Spec.Entrypoint}, tmplCtx, woc.wf.Spec.Arguments, "")
+	node, err := woc.executeTemplate(woc.wf.ObjectMeta.Name, &wfv1.WorkflowStep{Template: woc.wf.Spec.Entrypoint}, tmplCtx, woc.wf.Spec.Arguments, &executeTemplateOpts{})
 	if err != nil {
 		msg := fmt.Sprintf("%s error in entry template execution: %+v", woc.wf.Name, err)
 		// the error are handled in the callee so just log it.
@@ -294,15 +291,9 @@ func (woc *wfOperationCtx) operate() {
 		return
 	}
 
-	workflowStatus = node.Phase
-	if !node.Successful() && util.IsWorkflowTerminated(woc.wf) {
-		workflowMessage = "terminated"
-	} else {
-		workflowMessage = node.Message
-	}
-
+	workflowStatus := node.Phase
 	var onExitNode *wfv1.NodeStatus
-	if woc.wf.Spec.OnExit != "" {
+	if woc.wf.Spec.OnExit != "" && woc.wf.Spec.Shutdown != wfv1.ShutdownStrategyTerminate {
 		if workflowStatus == wfv1.NodeSkipped {
 			// treat skipped the same as Succeeded for workflow.status
 			woc.globalParams[common.GlobalVarWorkflowStatus] = string(wfv1.NodeSucceeded)
@@ -334,7 +325,7 @@ func (woc *wfOperationCtx) operate() {
 
 		woc.log.Infof("Running OnExit handler: %s", woc.wf.Spec.OnExit)
 		onExitNodeName := woc.wf.ObjectMeta.Name + ".onExit"
-		onExitNode, err = woc.executeTemplate(onExitNodeName, &wfv1.WorkflowStep{Template: woc.wf.Spec.OnExit}, tmplCtx, woc.wf.Spec.Arguments, "")
+		onExitNode, err = woc.executeTemplate(onExitNodeName, &wfv1.WorkflowStep{Template: woc.wf.Spec.OnExit}, tmplCtx, woc.wf.Spec.Arguments, &executeTemplateOpts{onExitTemplate: true})
 		if err != nil {
 			// the error are handled in the callee so just log it.
 			woc.log.Errorf("%s error in exit template execution: %+v", woc.wf.Name, err)
@@ -357,6 +348,13 @@ func (woc *wfOperationCtx) operate() {
 		return
 	}
 
+	var workflowMessage string
+	if !node.Successful() && woc.wf.Spec.Shutdown != "" {
+		workflowMessage = fmt.Sprintf("Stopped with strategy '%s'", woc.wf.Spec.Shutdown)
+	} else {
+		workflowMessage = node.Message
+	}
+
 	// If we get here, the workflow completed, all PVCs were deleted successfully, and
 	// exit handlers were executed. We now need to infer the workflow phase from the
 	// node phase.
@@ -399,11 +397,6 @@ func (woc *wfOperationCtx) getWorkflowDeadline() *time.Time {
 	if woc.wf.Status.StartedAt.IsZero() {
 		return nil
 	}
-	if *woc.wf.Spec.ActiveDeadlineSeconds == 0 {
-		// A zero value for ActiveDeadlineSeconds has special meaning (killed).
-		// Return a zero value time object
-		return &time.Time{}
-	}
 	startedAt := woc.wf.Status.StartedAt.Truncate(time.Second)
 	deadline := startedAt.Add(time.Duration(*woc.wf.Spec.ActiveDeadlineSeconds) * time.Second).UTC()
 	return &deadline
@@ -801,13 +794,7 @@ func (woc *wfOperationCtx) failSuspendedNodesAfterDeadline() error {
 	if woc.workflowDeadline != nil && time.Now().UTC().After(*woc.workflowDeadline) {
 		for _, node := range woc.wf.Status.Nodes {
 			if node.IsActiveSuspendNode() {
-				var message string
-				if woc.workflowDeadline.IsZero() {
-					message = "terminated"
-				} else {
-					message = fmt.Sprintf("step exceeded workflow deadline %s", *woc.workflowDeadline)
-				}
-				woc.markNodePhase(node.Name, wfv1.NodeFailed, message)
+				woc.markNodePhase(node.Name, wfv1.NodeFailed, fmt.Sprintf("step exceeded workflow deadline %s", *woc.workflowDeadline))
 			}
 		}
 	}
@@ -1295,12 +1282,20 @@ func isResubmitAllowed(tmpl *wfv1.Template) bool {
 	return *tmpl.ResubmitPendingPods
 }
 
+type executeTemplateOpts struct {
+	// boundaryID is an ID for node grouping
+	boundaryID string
+	// onExitTemplate signifies that executeTemplate was called as part of an onExit handler.
+	// Necessary for graceful shutdowns
+	onExitTemplate bool
+}
+
 // executeTemplate executes the template with the given arguments and returns the created NodeStatus
 // for the created node (if created). Nodes may not be created if parallelism or deadline exceeded.
 // nodeName is the name to be used as the name of the node, and boundaryID indicates which template
 // boundary this node belongs to.
-func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.TemplateHolder, tmplCtx *templateresolution.Context, args wfv1.Arguments, boundaryID string) (*wfv1.NodeStatus, error) {
-	woc.log.Debugf("Evaluating node %s: template: %s, boundaryID: %s", nodeName, common.GetTemplateHolderString(orgTmpl), boundaryID)
+func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.TemplateHolder, tmplCtx *templateresolution.Context, args wfv1.Arguments, opts *executeTemplateOpts) (*wfv1.NodeStatus, error) {
+	woc.log.Debugf("Evaluating node %s: template: %s, boundaryID: %s", nodeName, common.GetTemplateHolderString(orgTmpl), opts.boundaryID)
 
 	node := woc.getNodeByName(nodeName)
 
@@ -1308,7 +1303,7 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat
 	templateScope := tmplCtx.GetCurrentTemplateBase().GetTemplateScope()
 	newTmplCtx, resolvedTmpl, err := tmplCtx.ResolveTemplate(orgTmpl)
 	if err != nil {
-		return woc.initializeNodeOrMarkError(node, nodeName, wfv1.NodeTypeSkipped, templateScope, orgTmpl, boundaryID, err), err
+		return woc.initializeNodeOrMarkError(node, nodeName, wfv1.NodeTypeSkipped, templateScope, orgTmpl, opts.boundaryID, err), err
 	}
 
 	if node != nil {
@@ -1350,11 +1345,11 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat
 	// Inputs has been processed with arguments already, so pass empty arguments.
 	processedTmpl, err := common.ProcessArgs(resolvedTmpl, &args, woc.globalParams, localParams, false)
 	if err != nil {
-		return woc.initializeNodeOrMarkError(node, nodeName, wfv1.NodeTypeSkipped, templateScope, orgTmpl, boundaryID, err), err
+		return woc.initializeNodeOrMarkError(node, nodeName, wfv1.NodeTypeSkipped, templateScope, orgTmpl, opts.boundaryID, err), err
 	}
 
 	// Check if we exceeded template or workflow parallelism and immediately return if we did
-	if err := woc.checkParallelism(processedTmpl, node, boundaryID); err != nil {
+	if err := woc.checkParallelism(processedTmpl, node, opts.boundaryID); err != nil {
 		return node, err
 	}
 
@@ -1368,7 +1363,7 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat
 		retryParentNode := node
 		if retryParentNode == nil {
 			woc.log.Debugf("Inject a retry node for node %s", retryNodeName)
-			retryParentNode = woc.initializeExecutableNode(retryNodeName, wfv1.NodeTypeRetry, templateScope, processedTmpl, orgTmpl, boundaryID, wfv1.NodeRunning)
+			retryParentNode = woc.initializeExecutableNode(retryNodeName, wfv1.NodeTypeRetry, templateScope, processedTmpl, orgTmpl, opts.boundaryID, wfv1.NodeRunning)
 		}
 		processedRetryParentNode, continueExecution, err := woc.processNodeRetries(retryParentNode, *processedTmpl.RetryStrategy)
 		if err != nil {
@@ -1400,7 +1395,7 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat
 			if processedTmpl.IsPodType() {
 				processedTmpl, err = common.SubstituteParams(processedTmpl, map[string]string{}, map[string]string{common.LocalVarPodName: woc.wf.NodeID(nodeName)})
 				if err != nil {
-					return woc.initializeNodeOrMarkError(node, nodeName, wfv1.NodeTypeSkipped, templateScope, orgTmpl, boundaryID, err), err
+					return woc.initializeNodeOrMarkError(node, nodeName, wfv1.NodeTypeSkipped, templateScope, orgTmpl, opts.boundaryID, err), err
 				}
 			}
 		}
@@ -1408,20 +1403,20 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat
 
 	switch processedTmpl.GetType() {
 	case wfv1.TemplateTypeContainer:
-		node, err = woc.executeContainer(nodeName, templateScope, processedTmpl, orgTmpl, boundaryID)
+		node, err = woc.executeContainer(nodeName, templateScope, processedTmpl, orgTmpl, opts)
 	case wfv1.TemplateTypeSteps:
-		node, err = woc.executeSteps(nodeName, newTmplCtx, templateScope, processedTmpl, orgTmpl, boundaryID)
+		node, err = woc.executeSteps(nodeName, newTmplCtx, templateScope, processedTmpl, orgTmpl, opts)
 	case wfv1.TemplateTypeScript:
-		node, err = woc.executeScript(nodeName, templateScope, processedTmpl, orgTmpl, boundaryID)
+		node, err = woc.executeScript(nodeName, templateScope, processedTmpl, orgTmpl, opts)
 	case wfv1.TemplateTypeResource:
-		node, err = woc.executeResource(nodeName, templateScope, processedTmpl, orgTmpl, boundaryID)
+		node, err = woc.executeResource(nodeName, templateScope, processedTmpl, orgTmpl, opts)
 	case wfv1.TemplateTypeDAG:
-		node, err = woc.executeDAG(nodeName, newTmplCtx, templateScope, processedTmpl, orgTmpl, boundaryID)
+		node, err = woc.executeDAG(nodeName, newTmplCtx, templateScope, processedTmpl, orgTmpl, opts)
 	case wfv1.TemplateTypeSuspend:
-		node, err = woc.executeSuspend(nodeName, templateScope, processedTmpl, orgTmpl, boundaryID)
+		node, err = woc.executeSuspend(nodeName, templateScope, processedTmpl, orgTmpl, opts)
 	default:
 		err = errors.Errorf(errors.CodeBadRequest, "Template '%s' missing specification", processedTmpl.Name)
-		return woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, templateScope, orgTmpl, boundaryID, wfv1.NodeError, err.Error()), err
+		return woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, templateScope, orgTmpl, opts.boundaryID, wfv1.NodeError, err.Error()), err
 	}
 	if err != nil {
 		node = woc.markNodeError(node.Name, err)
@@ -1457,7 +1452,7 @@ func (woc *wfOperationCtx) executeTemplate(nodeName string, orgTmpl wfv1.Templat
 	if retryNodeName != "" {
 		retryNode := woc.getNodeByName(retryNodeName)
 		if !retryNode.Completed() && node.Completed() { //if the retry child has completed we need to update outself
-			node, err = woc.executeTemplate(retryNodeName, orgTmpl, tmplCtx, args, boundaryID)
+			node, err = woc.executeTemplate(retryNodeName, orgTmpl, tmplCtx, args, opts)
 			if err != nil {
 				return woc.markNodeError(node.Name, err), err
 			}
@@ -1717,10 +1712,10 @@ func (woc *wfOperationCtx) checkParallelism(tmpl *wfv1.Template, node *wfv1.Node
 	return nil
 }
 
-func (woc *wfOperationCtx) executeContainer(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) {
+func (woc *wfOperationCtx) executeContainer(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, opts *executeTemplateOpts) (*wfv1.NodeStatus, error) {
 	node := woc.getNodeByName(nodeName)
 	if node == nil {
-		node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodePending)
+		node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending)
 	} else if !isResubmitAllowed(tmpl) || !node.Pending() {
 		// This is not our first time executing this node.
 		// We will retry to resubmit the pod if it is allowed and if the node is pending. If either of these two are
@@ -1729,7 +1724,7 @@ func (woc *wfOperationCtx) executeContainer(nodeName string, templateScope strin
 	}
 
 	woc.log.Debugf("Executing node %s with container template: %v\n", nodeName, tmpl)
-	_, err := woc.createWorkflowPod(nodeName, *tmpl.Container, tmpl, false)
+	_, err := woc.createWorkflowPod(nodeName, *tmpl.Container, tmpl, &createWorkflowPodOpts{onExitPod: opts.onExitTemplate})
 
 	if apierr.IsForbidden(err) && isResubmitAllowed(tmpl) {
 		// Our error was most likely caused by a lack of resources. If pod resubmission is allowed, keep the node pending
@@ -1843,15 +1838,15 @@ func getStepOrDAGTaskName(nodeName string) string {
 	return nodeName
 }
 
-func (woc *wfOperationCtx) executeScript(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) {
+func (woc *wfOperationCtx) executeScript(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, opts *executeTemplateOpts) (*wfv1.NodeStatus, error) {
 	node := woc.getNodeByName(nodeName)
 	if node != nil {
 		return node, nil
 	}
-	node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodePending)
+	node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending)
 
 	includeScriptOutput := false
-	if boundaryNode, ok := woc.wf.Status.Nodes[boundaryID]; ok {
+	if boundaryNode, ok := woc.wf.Status.Nodes[opts.boundaryID]; ok {
 		tmplCtx, err := woc.createTemplateContext(boundaryNode.TemplateScope)
 		if err != nil {
 			return node, err
@@ -1866,7 +1861,10 @@ func (woc *wfOperationCtx) executeScript(nodeName string, templateScope string,
 
 	mainCtr := tmpl.Script.Container
 	mainCtr.Args = append(mainCtr.Args, common.ExecutorScriptSourcePath)
-	_, err := woc.createWorkflowPod(nodeName, mainCtr, tmpl, includeScriptOutput)
+	_, err := woc.createWorkflowPod(nodeName, mainCtr, tmpl, &createWorkflowPodOpts{
+		includeScriptOutput: includeScriptOutput,
+		onExitPod:           opts.onExitTemplate,
+	})
 	return node, err
 }
 
@@ -2078,12 +2076,12 @@ func (woc *wfOperationCtx) addChildNode(parent string, child string) {
 }
 
 // executeResource is runs a kubectl command against a manifest
-func (woc *wfOperationCtx) executeResource(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) {
+func (woc *wfOperationCtx) executeResource(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, opts *executeTemplateOpts) (*wfv1.NodeStatus, error) {
 	node := woc.getNodeByName(nodeName)
 	if node != nil {
 		return node, nil
 	}
-	node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodePending)
+	node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending)
 
 	tmpl = tmpl.DeepCopy()
 
@@ -2106,14 +2104,14 @@ func (woc *wfOperationCtx) executeResource(nodeName string, templateScope string
 
 	mainCtr := woc.newExecContainer(common.MainContainerName, tmpl)
 	mainCtr.Command = []string{"argoexec", "resource", tmpl.Resource.Action}
-	_, err = woc.createWorkflowPod(nodeName, *mainCtr, tmpl, false)
+	_, err = woc.createWorkflowPod(nodeName, *mainCtr, tmpl, &createWorkflowPodOpts{onExitPod: opts.onExitTemplate})
 	return node, err
 }
 
-func (woc *wfOperationCtx) executeSuspend(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) {
+func (woc *wfOperationCtx) executeSuspend(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, opts *executeTemplateOpts) (*wfv1.NodeStatus, error) {
 	node := woc.getNodeByName(nodeName)
 	if node == nil {
-		node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSuspend, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodePending)
+		node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSuspend, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending)
 	}
 	woc.log.Infof("node %s suspended", nodeName)
 
@@ -2310,10 +2308,13 @@ func (woc *wfOperationCtx) createTemplateContext(templateScope string) (*templat
 }
 
 func (woc *wfOperationCtx) runOnExitNode(parentName, templateRef, boundaryID string, tmplCtx *templateresolution.Context) (bool, *wfv1.NodeStatus, error) {
-	if templateRef != "" {
+	if templateRef != "" && woc.wf.Spec.Shutdown != wfv1.ShutdownStrategyTerminate {
 		woc.log.Infof("Running OnExit handler: %s", templateRef)
 		onExitNodeName := parentName + ".onExit"
-		onExitNode, err := woc.executeTemplate(onExitNodeName, &wfv1.WorkflowStep{Template: templateRef}, tmplCtx, woc.wf.Spec.Arguments, boundaryID)
+		onExitNode, err := woc.executeTemplate(onExitNodeName, &wfv1.WorkflowStep{Template: templateRef}, tmplCtx, woc.wf.Spec.Arguments, &executeTemplateOpts{
+			boundaryID:     boundaryID,
+			onExitTemplate: true,
+		})
 		return true, onExitNode, err
 	}
 	return false, nil, nil
diff --git a/workflow/controller/steps.go b/workflow/controller/steps.go
index b2cf62d2b..c6d8e0776 100644
--- a/workflow/controller/steps.go
+++ b/workflow/controller/steps.go
@@ -27,10 +27,10 @@ type stepsContext struct {
 	tmplCtx *templateresolution.Context
 }
 
-func (woc *wfOperationCtx) executeSteps(nodeName string, tmplCtx *templateresolution.Context, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, boundaryID string) (*wfv1.NodeStatus, error) {
+func (woc *wfOperationCtx) executeSteps(nodeName string, tmplCtx *templateresolution.Context, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateHolder, opts *executeTemplateOpts) (*wfv1.NodeStatus, error) {
 	node := woc.getNodeByName(nodeName)
 	if node == nil {
-		node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSteps, templateScope, tmpl, orgTmpl, boundaryID, wfv1.NodeRunning)
+		node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSteps, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodeRunning)
 	}
 
 	defer func() {
@@ -220,7 +220,7 @@ func (woc *wfOperationCtx) executeStepGroup(stepGroup []wfv1.WorkflowStep, sgNod
 			continue
 		}
 
-		childNode, err := woc.executeTemplate(childNodeName, &step, stepsCtx.tmplCtx, step.Arguments, stepsCtx.boundaryID)
+		childNode, err := woc.executeTemplate(childNodeName, &step, stepsCtx.tmplCtx, step.Arguments, &executeTemplateOpts{boundaryID: stepsCtx.boundaryID})
 		if err != nil {
 			switch err {
 			case ErrDeadlineExceeded:
diff --git a/workflow/controller/workflowpod.go b/workflow/controller/workflowpod.go
index 5e79eb7c9..4f70aa225 100644
--- a/workflow/controller/workflowpod.go
+++ b/workflow/controller/workflowpod.go
@@ -87,7 +87,12 @@ func (woc *wfOperationCtx) hasPodSpecPatch(tmpl *wfv1.Template) bool {
 	return woc.wf.Spec.HasPodSpecPatch() || tmpl.HasPodSpecPatch()
 }
 
-func (woc *wfOperationCtx) createWorkflowPod(nodeName string, mainCtr apiv1.Container, tmpl *wfv1.Template, includeScriptOutput bool) (*apiv1.Pod, error) {
+type createWorkflowPodOpts struct {
+	includeScriptOutput bool
+	onExitPod           bool
+}
+
+func (woc *wfOperationCtx) createWorkflowPod(nodeName string, mainCtr apiv1.Container, tmpl *wfv1.Template, opts *createWorkflowPodOpts) (*apiv1.Pod, error) {
 	nodeID := woc.wf.NodeID(nodeName)
 	woc.log.Debugf("Creating Pod: %s (%s)", nodeName, nodeID)
 	tmpl = tmpl.DeepCopy()
@@ -133,6 +138,11 @@ func (woc *wfOperationCtx) createWorkflowPod(nodeName string, mainCtr apiv1.Cont
 		},
 	}
 
+	if opts.onExitPod {
+		// This pod is part of an onExit handler, label it so
+		pod.ObjectMeta.Labels[common.LabelKeyOnExit] = "true"
+	}
+
 	if woc.wf.Spec.HostNetwork != nil {
 		pod.Spec.HostNetwork = *woc.wf.Spec.HostNetwork
 	}
@@ -186,7 +196,7 @@ func (woc *wfOperationCtx) createWorkflowPod(nodeName string, mainCtr apiv1.Cont
 	}
 
 	addSchedulingConstraints(pod, wfSpec, tmpl)
-	woc.addMetadata(pod, tmpl, includeScriptOutput)
+	woc.addMetadata(pod, tmpl, opts.includeScriptOutput)
 
 	err = addVolumeReferences(pod, woc.volumes, tmpl, woc.wf.Status.PersistentVolumeClaims)
 	if err != nil {
diff --git a/workflow/util/util.go b/workflow/util/util.go
index 9c8991760..77a96def2 100644
--- a/workflow/util/util.go
+++ b/workflow/util/util.go
@@ -422,6 +422,8 @@ func FormulateResubmitWorkflow(wf *wfv1.Workflow, memoized bool) (*wfv1.Workflow
 		newWF.Spec.ActiveDeadlineSeconds = nil
 	}
 
+	newWF.Spec.Shutdown = ""
+
 	// carry over user labels and annotations from previous workflow.
 	// skip any argoproj.io labels except for the controller instanceID label.
 	for key, val := range wf.ObjectMeta.Labels {
@@ -592,19 +594,36 @@ func IsWorkflowSuspended(wf *wfv1.Workflow) bool {
 	return false
 }
 
-// IsWorkflowTerminated returns whether or not a workflow is considered terminated
-func IsWorkflowTerminated(wf *wfv1.Workflow) bool {
-	if wf.Spec.ActiveDeadlineSeconds != nil && *wf.Spec.ActiveDeadlineSeconds == 0 {
-		return true
+// TerminateWorkflow terminates a workflow by setting its spec.shutdown to ShutdownStrategyTerminate
+func TerminateWorkflow(wfClient v1alpha1.WorkflowInterface, name string) error {
+	patchObj := map[string]interface{}{
+		"spec": map[string]interface{}{
+			"shutdown": wfv1.ShutdownStrategyTerminate,
+		},
 	}
-	return false
+	var err error
+	patch, err := json.Marshal(patchObj)
+	if err != nil {
+		return errors.InternalWrapError(err)
+	}
+	_ = wait.ExponentialBackoff(retry.DefaultRetry, func() (bool, error) {
+		_, err = wfClient.Patch(name, types.MergePatchType, patch)
+		if err != nil {
+			if !apierr.IsConflict(err) {
+				return false, err
+			}
+			return false, nil
+		}
+		return true, nil
+	})
+	return err
 }
 
-// TerminateWorkflow terminates a workflow by setting its activeDeadlineSeconds to 0
-func TerminateWorkflow(wfClient v1alpha1.WorkflowInterface, name string) error {
+// StopWorkflow terminates a workflow by setting its spec.shutdown to ShutdownStrategyStop
+func StopWorkflow(wfClient v1alpha1.WorkflowInterface, name string) error {
 	patchObj := map[string]interface{}{
 		"spec": map[string]interface{}{
-			"activeDeadlineSeconds": 0,
+			"shutdown": wfv1.ShutdownStrategyStop,
 		},
 	}
 	var err error


Test patch:
diff --git a/server/workflow/workflow_server_test.go b/server/workflow/workflow_server_test.go
index db9a2f124..b89c20f9b 100644
--- a/server/workflow/workflow_server_test.go
+++ b/server/workflow/workflow_server_test.go
@@ -537,7 +537,7 @@ func TestTerminateWorkflow(t *testing.T) {
 	}
 	wf, err = server.TerminateWorkflow(ctx, &rsmWfReq)
 	assert.NotNil(t, wf)
-	assert.Equal(t, int64(0), *wf.Spec.ActiveDeadlineSeconds)
+	assert.Equal(t, v1alpha1.ShutdownStrategyTerminate, wf.Spec.Shutdown)
 	assert.Nil(t, err)
 
 	rsmWfReq = workflowpkg.WorkflowTerminateRequest{
diff --git a/test/e2e/argo_server_test.go b/test/e2e/argo_server_test.go
index a17ef8969..1eec14012 100644
--- a/test/e2e/argo_server_test.go
+++ b/test/e2e/argo_server_test.go
@@ -554,7 +554,7 @@ func (s *ArgoServerSuite) TestWorkflowService() {
 			Status(200).
 			JSON().
 			Path("$.status.message").
-			Equal("terminated")
+			Equal("Stopped with strategy 'Terminate'")
 	})
 
 	s.Run("Delete", func() {
diff --git a/test/e2e/functional/stop-terminate.yaml b/test/e2e/functional/stop-terminate.yaml
new file mode 100644
index 000000000..a263488a8
--- /dev/null
+++ b/test/e2e/functional/stop-terminate.yaml
@@ -0,0 +1,31 @@
+apiVersion: argoproj.io/v1alpha1
+kind: Workflow
+metadata:
+  name: stop-terminate
+  labels:
+    argo-e2e: true
+spec:
+  entrypoint: diamond
+  onExit: exit
+  templates:
+    - name: diamond
+      dag:
+        tasks:
+          - name: A
+            template: echo
+            onExit: exit
+            arguments:
+              parameters: [{name: message, value: A}]
+
+    - name: echo
+      inputs:
+        parameters:
+          - name: message
+      container:
+        image: alpine:3.7
+        command: [sleep, "10"]
+
+    - name: exit
+      container:
+        image: alpine:3.7
+        command: [echo, "one exit"]
diff --git a/test/e2e/functional_test.go b/test/e2e/functional_test.go
index 95cc9bf6f..1557c7db4 100644
--- a/test/e2e/functional_test.go
+++ b/test/e2e/functional_test.go
@@ -297,6 +297,52 @@ func (s *FunctionalSuite) TestParameterAggregation() {
 		})
 }
 
+func (s *FunctionalSuite) TestStopBehavior() {
+	s.Given().
+		Workflow("@functional/stop-terminate.yaml").
+		When().
+		SubmitWorkflow().
+		WaitForWorkflowToStart(5*time.Second).
+		RunCli([]string{"stop", "stop-terminate"}, func(t *testing.T, output string, err error) {
+			assert.NoError(t, err)
+			assert.Contains(t, output, "workflow stop-terminate stopped")
+		}).
+		WaitForWorkflow(30 * time.Second).
+		Then().
+		ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) {
+			assert.Equal(t, wfv1.NodeFailed, status.Phase)
+			nodeStatus := status.Nodes.FindByDisplayName("A.onExit")
+			if assert.NotNil(t, nodeStatus) {
+				assert.Equal(t, wfv1.NodeSucceeded, nodeStatus.Phase)
+			}
+			nodeStatus = status.Nodes.FindByDisplayName("stop-terminate.onExit")
+			if assert.NotNil(t, nodeStatus) {
+				assert.Equal(t, wfv1.NodeSucceeded, nodeStatus.Phase)
+			}
+		})
+}
+
+func (s *FunctionalSuite) TestTerminateBehavior() {
+	s.Given().
+		Workflow("@functional/stop-terminate.yaml").
+		When().
+		SubmitWorkflow().
+		WaitForWorkflowToStart(5*time.Second).
+		RunCli([]string{"terminate", "stop-terminate"}, func(t *testing.T, output string, err error) {
+			assert.NoError(t, err)
+			assert.Contains(t, output, "workflow stop-terminate terminated")
+		}).
+		WaitForWorkflow(30 * time.Second).
+		Then().
+		ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) {
+			assert.Equal(t, wfv1.NodeFailed, status.Phase)
+			nodeStatus := status.Nodes.FindByDisplayName("A.onExit")
+			assert.Nil(t, nodeStatus)
+			nodeStatus = status.Nodes.FindByDisplayName("stop-terminate.onExit")
+			assert.Nil(t, nodeStatus)
+		})
+}
+
 func TestFunctionalSuite(t *testing.T) {
 	suite.Run(t, new(FunctionalSuite))
 }
diff --git a/workflow/controller/operator_test.go b/workflow/controller/operator_test.go
index 852ac07cf..6953a87f3 100644
--- a/workflow/controller/operator_test.go
+++ b/workflow/controller/operator_test.go
@@ -894,7 +894,7 @@ func TestSuspendWithDeadline(t *testing.T) {
 	for _, node := range updatedWf.Status.Nodes {
 		if node.Type == wfv1.NodeTypeSuspend {
 			assert.Equal(t, node.Phase, wfv1.NodeFailed)
-			assert.Equal(t, node.Message, "terminated")
+			assert.Contains(t, node.Message, "step exceeded workflow deadline")
 			found = true
 		}
 	}
diff --git a/workflow/controller/workflowpod_test.go b/workflow/controller/workflowpod_test.go
index 9912ca836..a78e8a074 100644
--- a/workflow/controller/workflowpod_test.go
+++ b/workflow/controller/workflowpod_test.go
@@ -63,7 +63,7 @@ script:
 func TestScriptTemplateWithVolume(t *testing.T) {
 	tmpl := unmarshalTemplate(scriptTemplateWithInputArtifact)
 	woc := newWoc()
-	_, err := woc.executeScript(tmpl.Name, "", tmpl, tmpl, "")
+	_, err := woc.executeScript(tmpl.Name, "", tmpl, tmpl, &executeTemplateOpts{})
 	assert.NoError(t, err)
 }
 
@@ -150,7 +150,7 @@ func TestScriptTemplateWithoutVolumeOptionalArtifact(t *testing.T) {
 	woc := newWoc()
 	mainCtr := tmpl.Script.Container
 	mainCtr.Args = append(mainCtr.Args, common.ExecutorScriptSourcePath)
-	pod, err := woc.createWorkflowPod(tmpl.Name, mainCtr, tmpl, true)
+	pod, err := woc.createWorkflowPod(tmpl.Name, mainCtr, tmpl, &createWorkflowPodOpts{})
 	assert.NoError(t, err)
 	// Note: pod.Spec.Containers[0] is wait
 	assert.Contains(t, pod.Spec.Containers[1].VolumeMounts, volumeMount)
@@ -165,7 +165,7 @@ func TestScriptTemplateWithoutVolumeOptionalArtifact(t *testing.T) {
 	woc = newWoc(*wf)
 	mainCtr = tmpl.Script.Container
 	mainCtr.Args = append(mainCtr.Args, common.ExecutorScriptSourcePath)
-	pod, err = woc.createWorkflowPod(tmpl.Name, mainCtr, tmpl, true)
+	pod, err = woc.createWorkflowPod(tmpl.Name, mainCtr, tmpl, &createWorkflowPodOpts{includeScriptOutput: true})
 	assert.NoError(t, err)
 	assert.NotContains(t, pod.Spec.Containers[1].VolumeMounts, volumeMount)
 	assert.Contains(t, pod.Spec.Containers[1].VolumeMounts, customVolumeMount)
@@ -176,7 +176,7 @@ func TestScriptTemplateWithoutVolumeOptionalArtifact(t *testing.T) {
 	woc = newWoc()
 	mainCtr = tmpl.Script.Container
 	mainCtr.Args = append(mainCtr.Args, common.ExecutorScriptSourcePath)
-	pod, err = woc.createWorkflowPod(tmpl.Name, mainCtr, tmpl, true)
+	pod, err = woc.createWorkflowPod(tmpl.Name, mainCtr, tmpl, &createWorkflowPodOpts{})
 	assert.NoError(t, err)
 	assert.NotContains(t, pod.Spec.Containers[1].VolumeMounts, volumeMount)
 }
@@ -188,7 +188,7 @@ func TestWFLevelServiceAccount(t *testing.T) {
 	woc.wf.Spec.ServiceAccountName = "foo"
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -205,7 +205,7 @@ func TestTmplServiceAccount(t *testing.T) {
 	woc.wf.Spec.Templates[0].ServiceAccountName = "tmpl"
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -225,7 +225,7 @@ func TestWFLevelAutomountServiceAccountToken(t *testing.T) {
 	woc.wf.Spec.Executor = &wfv1.ExecutorConfig{ServiceAccountName: "foo"}
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -247,7 +247,7 @@ func TestTmplLevelAutomountServiceAccountToken(t *testing.T) {
 	woc.wf.Spec.Templates[0].AutomountServiceAccountToken = &falseValue
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -275,7 +275,7 @@ func TestWFLevelExecutorServiceAccountName(t *testing.T) {
 	woc.wf.Spec.Executor = &wfv1.ExecutorConfig{ServiceAccountName: "foo"}
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -300,7 +300,7 @@ func TestTmplLevelExecutorServiceAccountName(t *testing.T) {
 	woc.wf.Spec.Templates[0].Executor = &wfv1.ExecutorConfig{ServiceAccountName: "tmpl"}
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -323,7 +323,7 @@ func TestImagePullSecrets(t *testing.T) {
 	}
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -357,7 +357,7 @@ func TestAffinity(t *testing.T) {
 	}
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -376,7 +376,7 @@ func TestTolerations(t *testing.T) {
 	}}
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -391,7 +391,7 @@ func TestMetadata(t *testing.T) {
 	woc := newWoc()
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -544,7 +544,7 @@ func TestVolumeAndVolumeMounts(t *testing.T) {
 
 		tmplCtx, err := woc.createTemplateContext("")
 		assert.NoError(t, err)
-		_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+		_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 		assert.NoError(t, err)
 		pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 		assert.NoError(t, err)
@@ -567,7 +567,7 @@ func TestVolumeAndVolumeMounts(t *testing.T) {
 
 		tmplCtx, err := woc.createTemplateContext("")
 		assert.NoError(t, err)
-		_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+		_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 		assert.NoError(t, err)
 		pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 		assert.NoError(t, err)
@@ -589,7 +589,7 @@ func TestVolumeAndVolumeMounts(t *testing.T) {
 
 		tmplCtx, err := woc.createTemplateContext("")
 		assert.NoError(t, err)
-		_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+		_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 		assert.NoError(t, err)
 		pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 		assert.NoError(t, err)
@@ -636,7 +636,7 @@ func TestVolumesPodSubstitution(t *testing.T) {
 
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -674,7 +674,7 @@ func TestOutOfCluster(t *testing.T) {
 
 		tmplCtx, err := woc.createTemplateContext("")
 		assert.NoError(t, err)
-		_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+		_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 		assert.NoError(t, err)
 		pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 		assert.NoError(t, err)
@@ -699,7 +699,7 @@ func TestOutOfCluster(t *testing.T) {
 
 		tmplCtx, err := woc.createTemplateContext("")
 		assert.NoError(t, err)
-		_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+		_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 		assert.NoError(t, err)
 		pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 		assert.NoError(t, err)
@@ -722,7 +722,7 @@ func TestPriority(t *testing.T) {
 	woc.wf.Spec.Templates[0].Priority = &priority
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -738,7 +738,7 @@ func TestSchedulerName(t *testing.T) {
 	woc.wf.Spec.Templates[0].SchedulerName = "foo"
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -792,7 +792,7 @@ func TestInitContainers(t *testing.T) {
 
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -853,7 +853,7 @@ func TestSidecars(t *testing.T) {
 
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -907,7 +907,7 @@ func TestTemplateLocalVolumes(t *testing.T) {
 
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -930,7 +930,7 @@ func TestWFLevelHostAliases(t *testing.T) {
 	}
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -949,7 +949,7 @@ func TestTmplLevelHostAliases(t *testing.T) {
 	}
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -968,7 +968,7 @@ func TestWFLevelSecurityContext(t *testing.T) {
 	}
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -987,7 +987,7 @@ func TestTmplLevelSecurityContext(t *testing.T) {
 	}
 	tmplCtx, err := woc.createTemplateContext("")
 	assert.NoError(t, err)
-	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], "")
+	_, err = woc.executeContainer(woc.wf.Spec.Entrypoint, tmplCtx.GetCurrentTemplateBase().GetTemplateScope(), &woc.wf.Spec.Templates[0], &woc.wf.Spec.Templates[0], &executeTemplateOpts{})
 	assert.NoError(t, err)
 	pods, err := woc.controller.kubeclientset.CoreV1().Pods("").List(metav1.ListOptions{})
 	assert.NoError(t, err)
@@ -1055,19 +1055,19 @@ func TestPodSpecPatch(t *testing.T) {
 	wf := unmarshalWF(helloWorldWfWithPatch)
 	woc := newWoc(*wf)
 	mainCtr := woc.wf.Spec.Templates[0].Container
-	pod, _ := woc.createWorkflowPod(wf.Name, *mainCtr, &wf.Spec.Templates[0], false)
+	pod, _ := woc.createWorkflowPod(wf.Name, *mainCtr, &wf.Spec.Templates[0], &createWorkflowPodOpts{})
 	assert.Equal(t, "0.800", pod.Spec.Containers[1].Resources.Limits.Cpu().AsDec().String())
 
 	wf = unmarshalWF(helloWorldWfWithWFPatch)
 	woc = newWoc(*wf)
 	mainCtr = woc.wf.Spec.Templates[0].Container
-	pod, _ = woc.createWorkflowPod(wf.Name, *mainCtr, &wf.Spec.Templates[0], false)
+	pod, _ = woc.createWorkflowPod(wf.Name, *mainCtr, &wf.Spec.Templates[0], &createWorkflowPodOpts{})
 	assert.Equal(t, "0.800", pod.Spec.Containers[1].Resources.Limits.Cpu().AsDec().String())
 
 	wf = unmarshalWF(helloWorldWfWithWFYAMLPatch)
 	woc = newWoc(*wf)
 	mainCtr = woc.wf.Spec.Templates[0].Container
-	pod, _ = woc.createWorkflowPod(wf.Name, *mainCtr, &wf.Spec.Templates[0], false)
+	pod, _ = woc.createWorkflowPod(wf.Name, *mainCtr, &wf.Spec.Templates[0], &createWorkflowPodOpts{})
 
 	assert.Equal(t, "0.800", pod.Spec.Containers[1].Resources.Limits.Cpu().AsDec().String())
 	assert.Equal(t, "104857600", pod.Spec.Containers[1].Resources.Limits.Memory().AsDec().String())