From 957ef677cccf8d49a1049201c541a0574a31dbc8 Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Wed, 20 Jan 2021 17:49:06 -0800 Subject: [PATCH] chore: Introduce `WorkflowPhase` (#4856) Signed-off-by: Alex Collins --- cmd/argo/commands/get.go | 2 +- cmd/argo/commands/wait.go | 2 +- persist/sqldb/workflow_archive.go | 16 +- pkg/apis/workflow/v1alpha1/generated.pb.go | 949 +++++++++--------- pkg/apis/workflow/v1alpha1/workflow_phase.go | 22 + .../workflow/v1alpha1/workflow_phase_test.go | 16 + pkg/apis/workflow/v1alpha1/workflow_types.go | 14 +- server/workflow/workflow_server_test.go | 6 +- test/e2e/cli_test.go | 18 +- test/e2e/cluster_workflow_template_test.go | 4 +- test/e2e/estimated_duration_test.go | 6 +- test/e2e/functional_test.go | 58 +- test/e2e/malformed_resources_test.go | 12 +- test/e2e/progress_test.go | 2 +- test/e2e/smoke_test.go | 8 +- test/e2e/workflow_template_test.go | 6 +- .../app/shared/services/workflows-service.ts | 12 +- .../workflow-filters/workflow-filters.tsx | 13 +- .../workflows-list/workflows-list.tsx | 12 +- ui/src/models/workflows.ts | 6 +- util/fields/fields_test.go | 4 +- util/printer/workflow-printer.go | 15 +- util/printer/workflow-printer_test.go | 2 +- workflow/controller/controller_test.go | 2 +- workflow/controller/dag_test.go | 34 +- workflow/controller/operator.go | 69 +- .../controller/operator_concurrency_test.go | 2 +- workflow/controller/operator_persist_test.go | 8 +- workflow/controller/operator_test.go | 94 +- .../operator_workflow_template_ref_test.go | 2 +- workflow/controller/steps_test.go | 8 +- workflow/controller/workflowpod_test.go | 2 +- workflow/util/util.go | 8 +- workflow/util/util_test.go | 6 +- 34 files changed, 746 insertions(+), 694 deletions(-) create mode 100644 pkg/apis/workflow/v1alpha1/workflow_phase.go create mode 100644 pkg/apis/workflow/v1alpha1/workflow_phase_test.go diff --git a/cmd/argo/commands/get.go b/cmd/argo/commands/get.go index a38b037cb386..515a7a2e4775 100644 --- a/cmd/argo/commands/get.go +++ b/cmd/argo/commands/get.go @@ -142,7 +142,7 @@ func printWorkflowHelper(wf *wfv1.Workflow, getArgs getFlags) string { if !wf.Status.StartedAt.IsZero() { out += fmt.Sprintf(fmtStr, "Duration:", humanize.RelativeDuration(wf.Status.StartedAt.Time, wf.Status.FinishedAt.Time)) } - if wf.Status.Phase == wfv1.NodeRunning { + if wf.Status.Phase == wfv1.WorkflowRunning { if wf.Status.EstimatedDuration > 0 { out += fmt.Sprintf(fmtStr, "EstimatedDuration:", humanize.Duration(wf.Status.EstimatedDuration.ToDuration())) } diff --git a/cmd/argo/commands/wait.go b/cmd/argo/commands/wait.go index 8b3efee353c5..561a137e6e48 100644 --- a/cmd/argo/commands/wait.go +++ b/cmd/argo/commands/wait.go @@ -103,7 +103,7 @@ func waitOnOne(serviceClient workflowpkg.WorkflowServiceClient, ctx context.Cont if !quiet { fmt.Printf("%s %s at %v\n", wfName, wf.Status.Phase, wf.Status.FinishedAt) } - if wf.Status.Phase == wfv1.NodeFailed || wf.Status.Phase == wfv1.NodeError { + if wf.Status.Phase == wfv1.WorkflowFailed || wf.Status.Phase == wfv1.WorkflowError { return false } return true diff --git a/persist/sqldb/workflow_archive.go b/persist/sqldb/workflow_archive.go index 3cbfbec8b326..7c28600821f2 100644 --- a/persist/sqldb/workflow_archive.go +++ b/persist/sqldb/workflow_archive.go @@ -21,14 +21,14 @@ const archiveTableName = "argo_archived_workflows" const archiveLabelsTableName = archiveTableName + "_labels" type archivedWorkflowMetadata struct { - ClusterName string `db:"clustername"` - InstanceID string `db:"instanceid"` - UID string `db:"uid"` - Name string `db:"name"` - Namespace string `db:"namespace"` - Phase wfv1.NodePhase `db:"phase"` - StartedAt time.Time `db:"startedat"` - FinishedAt time.Time `db:"finishedat"` + ClusterName string `db:"clustername"` + InstanceID string `db:"instanceid"` + UID string `db:"uid"` + Name string `db:"name"` + Namespace string `db:"namespace"` + Phase wfv1.WorkflowPhase `db:"phase"` + StartedAt time.Time `db:"startedat"` + FinishedAt time.Time `db:"finishedat"` } type archivedWorkflowRecord struct { diff --git a/pkg/apis/workflow/v1alpha1/generated.pb.go b/pkg/apis/workflow/v1alpha1/generated.pb.go index 0d8157d208b4..584cd8456cd4 100644 --- a/pkg/apis/workflow/v1alpha1/generated.pb.go +++ b/pkg/apis/workflow/v1alpha1/generated.pb.go @@ -2807,479 +2807,480 @@ func init() { } var fileDescriptor_c23edafa7e7ea072 = []byte{ - // 7551 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x5b, 0x6c, 0x24, 0x59, - 0x96, 0x50, 0xa7, 0xed, 0xb4, 0x33, 0x4f, 0xda, 0x65, 0xfb, 0xd6, 0x2b, 0xdb, 0x55, 0x5d, 0xae, - 0x8d, 0xde, 0x6e, 0x75, 0x41, 0xaf, 0xbd, 0x5d, 0x35, 0x0d, 0xbd, 0xdb, 0xdb, 0x0f, 0xa7, 0x5f, - 0xe5, 0xae, 0xf2, 0xa3, 0x4f, 0xba, 0xaa, 0xd8, 0xae, 0x56, 0x37, 0xe1, 0xcc, 0xeb, 0xcc, 0x28, - 0x67, 0x46, 0x64, 0x47, 0x44, 0xda, 0xed, 0xee, 0x45, 0xcc, 0x8e, 0x58, 0x86, 0x65, 0x77, 0x25, - 0x10, 0x5a, 0x18, 0xb4, 0xe2, 0x25, 0xb1, 0xe2, 0x67, 0x57, 0x08, 0xf1, 0x89, 0xb4, 0x1f, 0x08, - 0xd0, 0x30, 0x12, 0x62, 0xf8, 0x62, 0x24, 0x46, 0x9e, 0x69, 0xf3, 0x33, 0x23, 0x18, 0x46, 0x7c, - 0x20, 0xa4, 0x12, 0x12, 0xe8, 0x3e, 0xe3, 0x46, 0x64, 0x64, 0x95, 0x1d, 0xe9, 0x2a, 0x8d, 0x98, - 0xf9, 0xcb, 0x38, 0xe7, 0xdc, 0x73, 0xee, 0xfb, 0x9e, 0xd7, 0xbd, 0x09, 0x8b, 0x0d, 0x27, 0x6c, - 0x76, 0x77, 0xe6, 0x6a, 0x5e, 0x7b, 0xde, 0xf6, 0x1b, 0x5e, 0xc7, 0xf7, 0x1e, 0xf1, 0x1f, 0xf3, - 0x9d, 0xbd, 0xc6, 0xbc, 0xdd, 0x71, 0x82, 0xf9, 0x03, 0xcf, 0xdf, 0xdb, 0x6d, 0x79, 0x07, 0xf3, - 0xfb, 0x6f, 0xd8, 0xad, 0x4e, 0xd3, 0x7e, 0x63, 0xbe, 0x41, 0x5d, 0xea, 0xdb, 0x21, 0xad, 0xcf, - 0x75, 0x7c, 0x2f, 0xf4, 0xc8, 0xad, 0x88, 0xc9, 0x9c, 0x62, 0xc2, 0x7f, 0xcc, 0x75, 0xf6, 0x1a, - 0x73, 0x8c, 0xc9, 0x9c, 0x62, 0x32, 0xa7, 0x98, 0xcc, 0xfc, 0x8a, 0x21, 0xb9, 0xe1, 0x31, 0x81, - 0x8c, 0xd7, 0x4e, 0x77, 0x97, 0x7f, 0xf1, 0x0f, 0xfe, 0x4b, 0xc8, 0x98, 0xb1, 0xf6, 0xde, 0x0a, - 0xe6, 0x1c, 0x8f, 0x55, 0x69, 0xbe, 0xe6, 0xf9, 0x74, 0x7e, 0xbf, 0xa7, 0x1e, 0x33, 0x37, 0x0c, - 0x9a, 0x8e, 0xd7, 0x72, 0x6a, 0x87, 0xf3, 0xfb, 0x6f, 0xec, 0xd0, 0xb0, 0xb7, 0xca, 0x33, 0x5f, - 0x8b, 0x48, 0xdb, 0x76, 0xad, 0xe9, 0xb8, 0xd4, 0x3f, 0x8c, 0x9a, 0xdc, 0xa6, 0xa1, 0x9d, 0x26, - 0x60, 0xbe, 0x5f, 0x29, 0xbf, 0xeb, 0x86, 0x4e, 0x9b, 0xf6, 0x14, 0xf8, 0x0b, 0x4f, 0x2b, 0x10, - 0xd4, 0x9a, 0xb4, 0x6d, 0xf7, 0x94, 0xbb, 0xd5, 0xaf, 0x5c, 0x37, 0x74, 0x5a, 0xf3, 0x8e, 0x1b, - 0x06, 0xa1, 0x9f, 0x2c, 0x64, 0x2d, 0xc3, 0xe8, 0x42, 0xdb, 0xeb, 0xba, 0x21, 0x79, 0x1b, 0xf2, - 0xfb, 0x76, 0xab, 0x4b, 0xcb, 0xb9, 0xeb, 0xb9, 0xd7, 0x8a, 0x95, 0x57, 0xbe, 0x7d, 0x34, 0xfb, - 0xc2, 0xf1, 0xd1, 0x6c, 0xfe, 0x3e, 0x03, 0x3e, 0x3e, 0x9a, 0xbd, 0x40, 0xdd, 0x9a, 0x57, 0x77, - 0xdc, 0xc6, 0xfc, 0xa3, 0xc0, 0x73, 0xe7, 0x36, 0xba, 0xed, 0x1d, 0xea, 0xa3, 0x28, 0x63, 0xfd, - 0xc9, 0x10, 0x4c, 0x2e, 0xf8, 0xb5, 0xa6, 0xb3, 0x4f, 0xab, 0x21, 0xe3, 0xdf, 0x38, 0x24, 0x0f, - 0x61, 0x38, 0xb4, 0x7d, 0xce, 0xae, 0x74, 0xf3, 0xfd, 0xb9, 0x0c, 0xe3, 0x3d, 0xb7, 0x6d, 0xfb, - 0x8a, 0x5d, 0x65, 0xec, 0xf8, 0x68, 0x76, 0x78, 0xdb, 0xf6, 0x91, 0x71, 0x25, 0x9f, 0xc2, 0x88, - 0xeb, 0xb9, 0xb4, 0x3c, 0xc4, 0xb9, 0x2f, 0x64, 0xe2, 0xbe, 0xe1, 0xb9, 0xba, 0xb6, 0x95, 0xc2, - 0xf1, 0xd1, 0xec, 0x08, 0x83, 0x20, 0x67, 0xcc, 0x6a, 0xff, 0x85, 0xd3, 0x29, 0x0f, 0x0f, 0x50, - 0xfb, 0x8f, 0x9c, 0x4e, 0xbc, 0xf6, 0x1f, 0x39, 0x1d, 0x64, 0x5c, 0xad, 0x9f, 0xe6, 0xa0, 0xb8, - 0xe0, 0x37, 0xba, 0x6d, 0xea, 0x86, 0x01, 0xf1, 0x01, 0x3a, 0xb6, 0x6f, 0xb7, 0x69, 0x48, 0xfd, - 0xa0, 0x9c, 0xbb, 0x3e, 0xfc, 0x5a, 0xe9, 0xe6, 0xbb, 0x99, 0x24, 0x6e, 0x29, 0x36, 0x15, 0x22, - 0x87, 0x0f, 0x34, 0x28, 0x40, 0x43, 0x0a, 0x71, 0xa1, 0x68, 0xfb, 0xa1, 0xb3, 0x6b, 0xd7, 0xc2, - 0xa0, 0x3c, 0xc4, 0x45, 0xbe, 0x93, 0x49, 0xe4, 0x82, 0xe4, 0x52, 0x99, 0x96, 0x12, 0x8b, 0x0a, - 0x12, 0x60, 0x24, 0xc2, 0xfa, 0x0f, 0x23, 0x50, 0x50, 0x08, 0x72, 0x1d, 0x46, 0x5c, 0xbb, 0xad, - 0x66, 0xda, 0xb8, 0x2c, 0x38, 0xb2, 0x61, 0xb7, 0x59, 0xef, 0xdb, 0x6d, 0xca, 0x28, 0x3a, 0x76, - 0xd8, 0xe4, 0xc3, 0x6b, 0x50, 0x6c, 0xd9, 0x61, 0x13, 0x39, 0x86, 0x5c, 0x85, 0x91, 0xb6, 0x57, - 0xa7, 0x7c, 0x80, 0xf2, 0x62, 0xf4, 0xd6, 0xbd, 0x3a, 0x45, 0x0e, 0x65, 0xe5, 0x77, 0x7d, 0xaf, - 0x5d, 0x1e, 0x89, 0x97, 0x5f, 0xf1, 0xbd, 0x36, 0x72, 0x0c, 0xf9, 0xbd, 0x1c, 0x4c, 0xa9, 0xea, - 0xdd, 0xf5, 0x6a, 0x76, 0xe8, 0x78, 0x6e, 0x39, 0xcf, 0x47, 0x7b, 0x79, 0xa0, 0x8e, 0x50, 0xcc, - 0x2a, 0x65, 0x29, 0x75, 0x2a, 0x89, 0xc1, 0x1e, 0xc1, 0xe4, 0x26, 0x40, 0xa3, 0xe5, 0xed, 0xd8, - 0x2d, 0xd6, 0x07, 0xe5, 0x51, 0x5e, 0x6b, 0x3d, 0x84, 0xab, 0x1a, 0x83, 0x06, 0x15, 0xd9, 0x83, - 0x31, 0x5b, 0x2c, 0xb9, 0xf2, 0x18, 0xaf, 0xf7, 0x52, 0xc6, 0x7a, 0xc7, 0x96, 0x6d, 0xa5, 0x74, - 0x7c, 0x34, 0x3b, 0x26, 0x81, 0xa8, 0x24, 0x90, 0xd7, 0xa1, 0xe0, 0x75, 0x58, 0x55, 0xed, 0x56, - 0xb9, 0x70, 0x3d, 0xf7, 0x5a, 0xa1, 0x32, 0x25, 0xab, 0x57, 0xd8, 0x94, 0x70, 0xd4, 0x14, 0xe4, - 0x06, 0x8c, 0x05, 0xdd, 0x1d, 0x36, 0x5a, 0xe5, 0x22, 0x6f, 0xcb, 0xa4, 0x24, 0x1e, 0xab, 0x0a, - 0x30, 0x2a, 0x3c, 0x79, 0x13, 0x4a, 0x3e, 0xad, 0x75, 0xfd, 0x80, 0xb2, 0xe1, 0x2b, 0x03, 0xe7, - 0x7d, 0x5e, 0x92, 0x97, 0x30, 0x42, 0xa1, 0x49, 0x67, 0xfd, 0xa7, 0x51, 0xe8, 0xe9, 0x57, 0xf2, - 0x06, 0x94, 0x64, 0x7d, 0xef, 0x7a, 0x8d, 0x80, 0x4f, 0xaf, 0x42, 0x65, 0x92, 0xf1, 0x59, 0x88, - 0xc0, 0x68, 0xd2, 0x90, 0x07, 0x30, 0x14, 0xdc, 0x92, 0xbb, 0xc8, 0x7b, 0x99, 0xfa, 0xaf, 0x7a, - 0x4b, 0x2f, 0x81, 0xd1, 0xe3, 0xa3, 0xd9, 0xa1, 0xea, 0x2d, 0x1c, 0x0a, 0x6e, 0xb1, 0xfd, 0xa3, - 0xe1, 0x84, 0x03, 0xed, 0x1f, 0xab, 0x4e, 0xa8, 0x59, 0xf3, 0xfd, 0x63, 0xd5, 0x09, 0x91, 0x71, - 0x65, 0xbb, 0x5f, 0x33, 0x0c, 0x3b, 0x7c, 0x7a, 0x67, 0xdd, 0xfd, 0x6e, 0x6f, 0x6f, 0x6f, 0x69, - 0xf6, 0x7c, 0xfd, 0x30, 0x08, 0x72, 0xc6, 0xe4, 0x4b, 0xd6, 0x93, 0x02, 0xe7, 0xf9, 0x87, 0x72, - 0x5d, 0xdc, 0x1e, 0x68, 0x5d, 0x78, 0xfe, 0xa1, 0x16, 0x27, 0xc7, 0x44, 0x23, 0xd0, 0x94, 0xc6, - 0x5b, 0x57, 0xdf, 0x0d, 0xf8, 0x32, 0xc8, 0xdc, 0xba, 0xa5, 0x95, 0x6a, 0xa2, 0x75, 0x4b, 0x2b, - 0x55, 0xe4, 0x8c, 0xd9, 0xd8, 0xf8, 0xf6, 0x81, 0x5c, 0x35, 0xd9, 0xc6, 0x06, 0xed, 0x83, 0xf8, - 0xd8, 0xa0, 0x7d, 0x80, 0x8c, 0x2b, 0x63, 0xee, 0x05, 0x01, 0x5f, 0x24, 0x59, 0x99, 0x6f, 0x56, - 0xab, 0x71, 0xe6, 0x9b, 0xd5, 0x2a, 0x32, 0xae, 0x7c, 0x56, 0xd5, 0x02, 0xbe, 0xa8, 0x32, 0xcf, - 0xaa, 0xc5, 0x04, 0xf3, 0xd5, 0xc5, 0x2a, 0x32, 0xae, 0xd6, 0x67, 0x70, 0x51, 0x61, 0x90, 0x76, - 0xbc, 0xc0, 0xe1, 0x43, 0x43, 0x77, 0xc9, 0x3c, 0x14, 0x6b, 0x9e, 0xbb, 0xeb, 0x34, 0xd6, 0xed, - 0x8e, 0xdc, 0xb4, 0xf5, 0x6e, 0xbf, 0xa8, 0x10, 0x18, 0xd1, 0x90, 0x97, 0x60, 0x78, 0x8f, 0x1e, - 0xca, 0xdd, 0xbb, 0x24, 0x49, 0x87, 0xef, 0xd0, 0x43, 0x64, 0xf0, 0x5f, 0x2f, 0x7c, 0xeb, 0x1f, - 0xcf, 0xbe, 0xf0, 0xf5, 0xef, 0x5f, 0x7f, 0xc1, 0xfa, 0xe3, 0x21, 0xb8, 0x92, 0x2a, 0xb3, 0x1a, - 0xda, 0x61, 0x37, 0x20, 0xff, 0x28, 0x07, 0x17, 0xed, 0x34, 0xbc, 0x54, 0x2b, 0x3e, 0x18, 0x68, - 0x4a, 0xc6, 0x38, 0x56, 0x5e, 0x92, 0xf5, 0x4c, 0xef, 0x04, 0x4c, 0xaf, 0x07, 0xeb, 0x1b, 0x76, - 0x62, 0x05, 0x1d, 0xbb, 0x46, 0x65, 0x83, 0x75, 0xdf, 0x6c, 0x28, 0x04, 0x46, 0x34, 0x6c, 0x6f, - 0xac, 0xd3, 0x5d, 0xbb, 0xdb, 0x12, 0x9b, 0x43, 0x21, 0xda, 0x1b, 0x97, 0x04, 0x18, 0x15, 0xde, - 0xe8, 0xa7, 0x3f, 0xcb, 0xc1, 0xf9, 0x94, 0x85, 0xc4, 0x3a, 0xba, 0xeb, 0xb7, 0xe4, 0x98, 0xe8, - 0x8e, 0xbe, 0x87, 0x77, 0x91, 0xc1, 0xc9, 0x37, 0x73, 0x30, 0x69, 0xac, 0xac, 0x85, 0xae, 0x3c, - 0x52, 0xb3, 0x9f, 0x15, 0x31, 0x5e, 0x95, 0xcb, 0x52, 0xe2, 0x64, 0x02, 0x81, 0x49, 0xa9, 0xd6, - 0x7f, 0xce, 0x41, 0x92, 0x88, 0xd8, 0x70, 0xae, 0x1b, 0x50, 0x9f, 0x75, 0x4d, 0x95, 0xd6, 0x7c, - 0x1a, 0xca, 0x41, 0x7d, 0x65, 0x4e, 0x68, 0xb2, 0xac, 0x16, 0x73, 0x4c, 0x6f, 0x9f, 0xdb, 0x7f, - 0x63, 0x4e, 0x50, 0xdc, 0xa1, 0x87, 0x55, 0xda, 0xa2, 0x8c, 0x47, 0x85, 0x1c, 0x1f, 0xcd, 0x9e, - 0xbb, 0x17, 0x63, 0x80, 0x09, 0x86, 0x4c, 0x44, 0xc7, 0x0e, 0x82, 0x03, 0xcf, 0xaf, 0x4b, 0x11, - 0x43, 0xa7, 0x16, 0xb1, 0x15, 0x63, 0x80, 0x09, 0x86, 0xd6, 0xbf, 0xc9, 0xc1, 0x58, 0xc5, 0xae, - 0xed, 0x79, 0xbb, 0xbb, 0xec, 0x94, 0xac, 0x77, 0x7d, 0xa1, 0x4b, 0x88, 0x31, 0xd1, 0xa7, 0xe4, - 0x92, 0x84, 0xa3, 0xa6, 0x20, 0xdb, 0x30, 0x2a, 0xba, 0x43, 0x56, 0xea, 0x57, 0x8d, 0x4a, 0x69, - 0x0d, 0x9e, 0x0f, 0x07, 0xd3, 0xe0, 0xe7, 0x84, 0x06, 0x3f, 0xb7, 0xe6, 0x86, 0x9b, 0x4c, 0x2b, - 0x76, 0xdc, 0x46, 0x05, 0x8e, 0x8f, 0x66, 0x47, 0x57, 0x38, 0x0f, 0x94, 0xbc, 0xd8, 0x81, 0xda, - 0xb6, 0x3f, 0x57, 0xe2, 0xf8, 0x1c, 0x2b, 0x46, 0x07, 0xea, 0x7a, 0x84, 0x42, 0x93, 0xce, 0xfa, - 0x04, 0xf2, 0x8b, 0x76, 0xad, 0x49, 0xc9, 0xbd, 0xe4, 0x62, 0x2f, 0xdd, 0x7c, 0x2d, 0xad, 0xb7, - 0xf4, 0xc2, 0x37, 0x3b, 0x6c, 0xa2, 0xdf, 0x96, 0x60, 0xfd, 0x28, 0x07, 0x97, 0x17, 0x5b, 0xdd, - 0x20, 0xa4, 0xfe, 0x03, 0x39, 0xaf, 0xb6, 0x69, 0xbb, 0xd3, 0xb2, 0x43, 0x4a, 0xfe, 0x32, 0x14, - 0x98, 0xf5, 0x54, 0xb7, 0x43, 0x5b, 0x4a, 0xec, 0xdf, 0x15, 0x7c, 0x66, 0x32, 0x6a, 0x56, 0x87, - 0xcd, 0x9d, 0x47, 0xb4, 0x16, 0xae, 0xd3, 0xd0, 0x8e, 0xb4, 0xa5, 0x08, 0x86, 0x9a, 0x2b, 0xd9, - 0x83, 0x91, 0xa0, 0x43, 0x6b, 0xb2, 0xa3, 0xd7, 0x32, 0x4d, 0xfe, 0x64, 0xb5, 0xab, 0x1d, 0x5a, - 0x8b, 0x54, 0x4b, 0xf6, 0x85, 0x5c, 0x88, 0xf5, 0x3f, 0x72, 0x70, 0xa5, 0x4f, 0x53, 0xef, 0x3a, - 0x41, 0x48, 0x3e, 0xee, 0x69, 0xee, 0xdc, 0xc9, 0x9a, 0xcb, 0x4a, 0xf3, 0xc6, 0xea, 0x59, 0xa5, - 0x20, 0x46, 0x53, 0x3f, 0x83, 0xbc, 0x13, 0xd2, 0xb6, 0xd2, 0xea, 0xef, 0x66, 0x6a, 0x6b, 0x9f, - 0xea, 0x57, 0x26, 0x94, 0x55, 0xb8, 0xc6, 0x44, 0xa0, 0x90, 0x64, 0xfd, 0xfb, 0x1c, 0xb0, 0x41, - 0xaf, 0x3b, 0x52, 0x0b, 0x1b, 0x09, 0x0f, 0x3b, 0x4a, 0xbb, 0x57, 0xbb, 0xea, 0xc8, 0xf6, 0x61, - 0x87, 0x99, 0x91, 0x13, 0x9a, 0x90, 0x01, 0x90, 0x93, 0x92, 0x4f, 0x60, 0x34, 0xe0, 0x1b, 0xbe, - 0xdc, 0x41, 0x57, 0x64, 0xa1, 0x51, 0x71, 0x0c, 0x3c, 0x3e, 0x9a, 0x3d, 0x91, 0xed, 0x3d, 0xa7, - 0x79, 0x8b, 0x72, 0x28, 0xb9, 0xb2, 0x3d, 0xb7, 0x4d, 0x83, 0xc0, 0x6e, 0x50, 0xb9, 0x1e, 0xf4, - 0x9e, 0xbb, 0x2e, 0xc0, 0xa8, 0xf0, 0xd6, 0x6f, 0x02, 0x2c, 0x7a, 0x6e, 0xe8, 0xb8, 0x5d, 0xba, - 0xe9, 0x92, 0x97, 0x21, 0x4f, 0x7d, 0xdf, 0xf3, 0xa5, 0x2e, 0xa9, 0x9b, 0xbf, 0xcc, 0x80, 0x28, - 0x70, 0xe4, 0x55, 0xb6, 0x8e, 0x9d, 0x16, 0xad, 0xf3, 0xda, 0x17, 0x2a, 0xe7, 0x54, 0xed, 0x57, - 0x38, 0x14, 0x25, 0xd6, 0x9a, 0x83, 0xb1, 0x45, 0x66, 0x6a, 0x53, 0x9f, 0xf1, 0x35, 0x8d, 0xed, - 0x89, 0x98, 0xb1, 0xad, 0x8c, 0xea, 0x6d, 0xb8, 0xb8, 0xe8, 0x53, 0x36, 0xd3, 0x6e, 0x55, 0xba, - 0xb5, 0x3d, 0x1a, 0x0a, 0x4d, 0x3b, 0x20, 0x6f, 0xc3, 0x84, 0xc7, 0x67, 0xf9, 0x5d, 0xaf, 0xb6, - 0xe7, 0xb8, 0x0d, 0x79, 0x90, 0x5c, 0x94, 0x5c, 0x26, 0x36, 0x4d, 0x24, 0xc6, 0x69, 0xad, 0xef, - 0x0c, 0xc1, 0xf8, 0xa2, 0xef, 0xb9, 0x6a, 0x6c, 0x9f, 0xc3, 0xea, 0x6b, 0xc4, 0x56, 0x5f, 0x36, - 0xf3, 0xca, 0xac, 0x72, 0xbf, 0x95, 0x47, 0x3c, 0x3d, 0x8f, 0x84, 0xde, 0xbd, 0x3a, 0xb8, 0x28, - 0xce, 0x2e, 0x1a, 0xd2, 0xf8, 0xc4, 0xb2, 0xbe, 0x97, 0x83, 0x29, 0x93, 0xfc, 0x39, 0xac, 0xef, - 0xdd, 0xf8, 0xfa, 0x5e, 0x18, 0xb8, 0x89, 0x7d, 0x16, 0xf5, 0xff, 0xc9, 0xc7, 0x9b, 0xc6, 0xba, - 0x99, 0x59, 0xcd, 0xe3, 0x07, 0x06, 0x40, 0xb6, 0x6f, 0x61, 0xa0, 0x0d, 0x95, 0x0f, 0xe7, 0x2f, - 0xcb, 0x4a, 0x8c, 0x9b, 0xd0, 0xc7, 0x89, 0x6f, 0x8c, 0x09, 0x67, 0xc7, 0x6d, 0x50, 0x6b, 0xd2, - 0x7a, 0xb7, 0xa5, 0x54, 0x2f, 0xdd, 0x71, 0x55, 0x09, 0x47, 0x4d, 0x41, 0x3e, 0x86, 0xe9, 0x9a, - 0xe7, 0xd6, 0xba, 0xbe, 0x4f, 0xdd, 0xda, 0xe1, 0x16, 0xf7, 0xf5, 0xc9, 0xed, 0x60, 0x4e, 0x16, - 0x9b, 0x5e, 0x4c, 0x12, 0x3c, 0x4e, 0x03, 0x62, 0x2f, 0x23, 0x61, 0xf2, 0x06, 0x1d, 0xea, 0xd6, - 0xb9, 0x55, 0x56, 0x30, 0x4d, 0x5e, 0x0e, 0x46, 0x85, 0x27, 0xf7, 0xe0, 0x72, 0x10, 0x32, 0x05, - 0xc9, 0x6d, 0x2c, 0x51, 0xbb, 0xde, 0x72, 0x5c, 0xa6, 0xae, 0x78, 0x6e, 0x3d, 0xe0, 0x86, 0xd6, - 0x70, 0xe5, 0xca, 0xf1, 0xd1, 0xec, 0xe5, 0x6a, 0x3a, 0x09, 0xf6, 0x2b, 0x4b, 0x3e, 0x81, 0x99, - 0xa0, 0x5b, 0xab, 0xd1, 0x20, 0xd8, 0xed, 0xb6, 0x3e, 0xf0, 0x76, 0x82, 0xdb, 0x4e, 0xc0, 0x74, - 0xad, 0xbb, 0x4e, 0xdb, 0x09, 0xb9, 0x31, 0x95, 0xaf, 0x5c, 0x3b, 0x3e, 0x9a, 0x9d, 0xa9, 0xf6, - 0xa5, 0xc2, 0x27, 0x70, 0x20, 0x08, 0x97, 0xc4, 0x46, 0xd6, 0xc3, 0x7b, 0x8c, 0xf3, 0x9e, 0x39, - 0x3e, 0x9a, 0xbd, 0xb4, 0x92, 0x4a, 0x81, 0x7d, 0x4a, 0xb2, 0x11, 0x0c, 0x9d, 0x36, 0xfd, 0xc2, - 0x73, 0x29, 0xb7, 0x98, 0x8c, 0x11, 0xdc, 0x96, 0x70, 0xd4, 0x14, 0xe4, 0x51, 0x34, 0xf9, 0xd8, - 0xa2, 0x90, 0x66, 0xd0, 0xe9, 0x77, 0xab, 0x0b, 0xc7, 0x47, 0xb3, 0x53, 0x0f, 0x0c, 0x4e, 0x6c, - 0x61, 0x61, 0x8c, 0xb7, 0xf5, 0xef, 0x86, 0x80, 0xf4, 0x6e, 0x04, 0xe4, 0x0e, 0x8c, 0xda, 0xb5, - 0xd0, 0xd9, 0xa7, 0xd2, 0x4f, 0xf7, 0x72, 0x9a, 0x6a, 0x24, 0x44, 0x21, 0xdd, 0xa5, 0x6c, 0x86, - 0xd0, 0x68, 0xf7, 0x58, 0xe0, 0x45, 0x51, 0xb2, 0x20, 0x1e, 0x4c, 0xb7, 0xec, 0x20, 0x54, 0x73, - 0xb5, 0xce, 0x9a, 0x2c, 0x37, 0xc9, 0x3f, 0x77, 0xb2, 0x46, 0xb1, 0x12, 0x95, 0x8b, 0x6c, 0xe6, - 0xde, 0x4d, 0x32, 0xc2, 0x5e, 0xde, 0xc4, 0x07, 0xa8, 0xa9, 0x23, 0x92, 0xed, 0x91, 0xd9, 0x3d, - 0x8d, 0xfa, 0xa4, 0x8d, 0xb6, 0x7e, 0x0d, 0x0a, 0xd0, 0x90, 0x62, 0xfd, 0x64, 0x14, 0xc6, 0x96, - 0x16, 0x56, 0xb7, 0xed, 0x60, 0xef, 0x04, 0x8e, 0x3f, 0x36, 0x21, 0xa4, 0xb2, 0x91, 0x5c, 0xd2, - 0x4a, 0x09, 0x41, 0x4d, 0x41, 0x3c, 0x28, 0xda, 0xca, 0x8d, 0x2a, 0xb7, 0xfc, 0x77, 0x33, 0x1a, - 0x36, 0x92, 0x8b, 0xe9, 0xc6, 0x94, 0x20, 0x8c, 0x64, 0x90, 0x00, 0x4a, 0x4a, 0x38, 0x33, 0x42, - 0x47, 0x06, 0xf1, 0x6d, 0x47, 0x7c, 0x84, 0x3f, 0xc4, 0x00, 0xa0, 0x29, 0x85, 0x7c, 0x0d, 0xc6, - 0xeb, 0x94, 0xed, 0x1c, 0xd4, 0xad, 0x39, 0x94, 0x6d, 0x12, 0xc3, 0xac, 0x5f, 0xd8, 0x66, 0xb9, - 0x64, 0xc0, 0x31, 0x46, 0x45, 0x1e, 0x41, 0xf1, 0xc0, 0x09, 0x9b, 0x7c, 0x4f, 0x2f, 0x8f, 0xf2, - 0xa1, 0xfe, 0xb5, 0x4c, 0x15, 0x65, 0x1c, 0xa2, 0x6e, 0x79, 0xa0, 0x78, 0x62, 0xc4, 0x9e, 0x19, - 0xc1, 0xec, 0x83, 0xfb, 0x9a, 0xf9, 0x6e, 0x50, 0x8c, 0x17, 0xe0, 0x08, 0x8c, 0x68, 0x48, 0x00, - 0xe3, 0xec, 0xa3, 0x4a, 0x3f, 0xeb, 0xb2, 0x15, 0x22, 0xbd, 0x25, 0xd9, 0x3c, 0xd0, 0x8a, 0x89, - 0xe8, 0x91, 0x07, 0x06, 0x5b, 0x8c, 0x09, 0x61, 0xb3, 0xef, 0xa0, 0x49, 0x5d, 0xe9, 0x92, 0xd4, - 0xb3, 0xef, 0x41, 0x93, 0xba, 0xc8, 0x31, 0xc4, 0xe3, 0xeb, 0x43, 0x2a, 0x7f, 0xdc, 0x17, 0x99, - 0xd5, 0x2b, 0x18, 0xe9, 0x90, 0x95, 0x73, 0x72, 0x71, 0xc8, 0x6f, 0x34, 0x44, 0x30, 0xd5, 0xd1, - 0x73, 0x97, 0x3f, 0x77, 0xc2, 0x72, 0x89, 0x57, 0x4a, 0xef, 0x14, 0x9b, 0x1c, 0x8a, 0x12, 0x2b, - 0x9c, 0x06, 0x6c, 0x70, 0x83, 0xf2, 0x78, 0x5c, 0x81, 0x15, 0x33, 0x20, 0x40, 0x85, 0xb7, 0xfe, - 0x75, 0x0e, 0x4a, 0x6c, 0xbd, 0xa9, 0x35, 0xf2, 0x2a, 0x8c, 0x86, 0xb6, 0xdf, 0x90, 0xd6, 0xb5, - 0x21, 0x62, 0x9b, 0x43, 0x51, 0x62, 0x89, 0x0d, 0xf9, 0xd0, 0x0e, 0xf6, 0x94, 0x5e, 0xf1, 0x1b, - 0x99, 0x9a, 0x2d, 0x17, 0x7a, 0xa4, 0x52, 0xb0, 0xaf, 0x00, 0x05, 0x67, 0xf2, 0x1a, 0x14, 0xd8, - 0x39, 0xb0, 0x62, 0x07, 0xca, 0xf7, 0x31, 0xce, 0x16, 0xf6, 0x8a, 0x84, 0xa1, 0xc6, 0x5a, 0x6f, - 0x42, 0x7e, 0x79, 0x9f, 0xba, 0xfc, 0x80, 0x08, 0xa4, 0x71, 0x99, 0xb4, 0xa8, 0x95, 0xd1, 0x89, - 0x9a, 0xc2, 0xfa, 0x18, 0xce, 0x2d, 0x7f, 0x4e, 0x6b, 0xdd, 0xd0, 0xf3, 0x85, 0x11, 0x4a, 0x3e, - 0x00, 0x12, 0x50, 0x7f, 0xdf, 0xa9, 0xd1, 0x85, 0x5a, 0x8d, 0x29, 0xdf, 0x1b, 0xd1, 0xfe, 0x33, - 0x23, 0x39, 0x91, 0x6a, 0x0f, 0x05, 0xa6, 0x94, 0xb2, 0xfe, 0x41, 0x0e, 0x4a, 0x86, 0xf7, 0x8c, - 0xed, 0x3e, 0x8d, 0xc5, 0xaa, 0x50, 0xcd, 0xa5, 0x22, 0xf4, 0x6e, 0x56, 0x97, 0x9c, 0xe0, 0x12, - 0xad, 0x1a, 0x0d, 0xc2, 0x48, 0xc6, 0x53, 0xdc, 0x6a, 0xd6, 0xbf, 0xc8, 0x41, 0x54, 0x8e, 0x8d, - 0xfb, 0x4e, 0x54, 0x35, 0x63, 0xdc, 0x25, 0x5f, 0x89, 0x25, 0xbf, 0x05, 0x97, 0xe3, 0x6d, 0xe5, - 0xf6, 0xfc, 0xe9, 0x7d, 0x25, 0x42, 0x69, 0x49, 0xe7, 0x84, 0xfd, 0x44, 0x58, 0xf7, 0x21, 0xbf, - 0x6a, 0x77, 0x1b, 0xf4, 0x44, 0x16, 0x11, 0x9b, 0x40, 0x3e, 0xb5, 0x5b, 0xa1, 0x3a, 0x27, 0xe5, - 0x04, 0x42, 0x09, 0x43, 0x8d, 0xb5, 0xfe, 0x64, 0x04, 0x4a, 0x86, 0xff, 0x9c, 0xad, 0x7d, 0x9f, - 0x76, 0xbc, 0xe4, 0xc9, 0x83, 0xb4, 0xe3, 0x21, 0xc7, 0xb0, 0x99, 0xe6, 0xd3, 0x7d, 0x27, 0x70, - 0x3c, 0x37, 0x79, 0xf2, 0xa0, 0x84, 0xa3, 0xa6, 0x20, 0xb3, 0x90, 0xaf, 0xd3, 0x4e, 0xd8, 0xe4, - 0xf3, 0x78, 0xa4, 0x52, 0x64, 0x55, 0x5d, 0x62, 0x00, 0x14, 0x70, 0x46, 0xb0, 0x4b, 0xc3, 0x5a, - 0xb3, 0x3c, 0xc2, 0x77, 0x6b, 0x4e, 0xb0, 0xc2, 0x00, 0x28, 0xe0, 0x29, 0xde, 0xaf, 0xfc, 0xb3, - 0xf7, 0x7e, 0x8d, 0x9e, 0xb1, 0xf7, 0x8b, 0x74, 0xe0, 0x7c, 0x10, 0x34, 0xb7, 0x7c, 0x67, 0xdf, - 0x0e, 0x69, 0x34, 0x73, 0xc6, 0x4e, 0x23, 0xe7, 0xf2, 0xf1, 0xd1, 0xec, 0xf9, 0x6a, 0xf5, 0x76, - 0x92, 0x0b, 0xa6, 0xb1, 0x26, 0x55, 0xb8, 0xe8, 0xb8, 0x01, 0xad, 0x75, 0x7d, 0xba, 0xd6, 0x70, - 0x3d, 0x9f, 0xde, 0xf6, 0x02, 0xc6, 0x4e, 0x86, 0xa5, 0xb4, 0x17, 0x77, 0x2d, 0x8d, 0x08, 0xd3, - 0xcb, 0x5a, 0xdf, 0xc9, 0xc1, 0xb8, 0x19, 0x32, 0x20, 0x01, 0x40, 0x73, 0x69, 0xa5, 0x2a, 0x76, - 0x11, 0xb9, 0xb8, 0xdf, 0xcb, 0x1c, 0x89, 0x10, 0x6c, 0x22, 0x55, 0x29, 0x82, 0xa1, 0x21, 0xe6, - 0x04, 0x51, 0xcf, 0x97, 0x21, 0xbf, 0xeb, 0xf9, 0x35, 0x2a, 0xb7, 0x4f, 0xbd, 0x4a, 0x56, 0x18, - 0x10, 0x05, 0xce, 0xfa, 0x51, 0x0e, 0x0c, 0x09, 0xe4, 0xaf, 0xc2, 0x04, 0x93, 0x71, 0xc7, 0xdf, - 0x89, 0xb5, 0xa6, 0x92, 0xb9, 0x35, 0x9a, 0x53, 0xe4, 0x71, 0x88, 0x81, 0x31, 0x2e, 0x8f, 0xfc, - 0x79, 0x28, 0xda, 0xf5, 0xba, 0x4f, 0x83, 0x80, 0x8a, 0xd3, 0xa5, 0x28, 0xfc, 0x84, 0x0b, 0x0a, - 0x88, 0x11, 0x9e, 0x2d, 0xc3, 0x66, 0x7d, 0x37, 0x60, 0x33, 0x5b, 0x1a, 0x67, 0x7a, 0x19, 0x32, - 0x21, 0x0c, 0x8e, 0x9a, 0xc2, 0xfa, 0x83, 0x11, 0x88, 0xcb, 0x26, 0x75, 0x98, 0xdc, 0xf3, 0x77, - 0x16, 0xb9, 0x2f, 0x33, 0x8b, 0x57, 0xf9, 0xfc, 0xf1, 0xd1, 0xec, 0xe4, 0x9d, 0x38, 0x07, 0x4c, - 0xb2, 0x94, 0x52, 0xee, 0xd0, 0xc3, 0xd0, 0xde, 0xc9, 0xb2, 0x59, 0x2a, 0x29, 0x26, 0x07, 0x4c, - 0xb2, 0x24, 0x6f, 0x42, 0x69, 0xcf, 0xdf, 0x51, 0x8b, 0x3c, 0xe9, 0xca, 0xbd, 0x13, 0xa1, 0xd0, - 0xa4, 0x63, 0x5d, 0xb8, 0xe7, 0xef, 0xb0, 0x4d, 0x51, 0x05, 0xc0, 0x75, 0x17, 0xde, 0x91, 0x70, - 0xd4, 0x14, 0xa4, 0x03, 0x64, 0x4f, 0xf5, 0x9e, 0xf6, 0xdc, 0xca, 0xbd, 0xe8, 0xe4, 0x8e, 0xdf, - 0x4b, 0xec, 0x1c, 0xbd, 0xd3, 0xc3, 0x07, 0x53, 0x78, 0x93, 0xdf, 0x84, 0xcb, 0x7b, 0xfe, 0x8e, - 0x3c, 0x2a, 0xb6, 0x7c, 0xc7, 0xad, 0x39, 0x9d, 0x58, 0xe4, 0x7b, 0x56, 0x56, 0xf7, 0xf2, 0x9d, - 0x74, 0x32, 0xec, 0x57, 0xde, 0xfa, 0x43, 0xb6, 0x8e, 0x8d, 0xc0, 0xe6, 0xd3, 0x02, 0x24, 0xbb, - 0x30, 0xd6, 0xa4, 0x76, 0x9d, 0xfa, 0x4a, 0xed, 0x79, 0x3b, 0xdb, 0xaa, 0xe0, 0x3c, 0x22, 0xa5, - 0x4c, 0x7c, 0x07, 0xa8, 0x98, 0x5b, 0x9b, 0x30, 0x2a, 0x60, 0x27, 0x30, 0x81, 0xf4, 0x49, 0x38, - 0xf4, 0x04, 0xdf, 0xe0, 0xb7, 0x72, 0x50, 0xe4, 0x96, 0x74, 0x83, 0xa9, 0xd3, 0xba, 0xc8, 0xf0, - 0x13, 0x0e, 0xcf, 0x5d, 0x18, 0x13, 0x47, 0x7e, 0xc0, 0xcf, 0xa4, 0xac, 0x6d, 0x15, 0xe9, 0x42, - 0x51, 0x5b, 0x85, 0x3a, 0x11, 0xa0, 0x62, 0x6e, 0xfd, 0xf7, 0x1c, 0x8c, 0xae, 0xb9, 0x9d, 0xee, - 0xcf, 0x49, 0x66, 0xcb, 0x3a, 0x8c, 0x30, 0x23, 0x28, 0x9e, 0x3f, 0x35, 0x5e, 0x79, 0xc5, 0xcc, - 0x9d, 0x2a, 0xc7, 0x73, 0xa7, 0xd0, 0x3e, 0x50, 0x7e, 0x67, 0x51, 0xc6, 0x88, 0xf4, 0xb5, 0x60, - 0xe4, 0xae, 0xe3, 0xee, 0x9d, 0x6c, 0x9e, 0x04, 0x35, 0xaf, 0xd3, 0x33, 0x4f, 0xaa, 0x0c, 0x88, - 0x02, 0xa7, 0xe6, 0xff, 0x70, 0xfa, 0xfc, 0xb7, 0xbe, 0x91, 0x83, 0xe9, 0x75, 0xda, 0xf6, 0x9c, - 0x2f, 0xec, 0xc8, 0x6d, 0xce, 0x0a, 0x35, 0x9d, 0x50, 0xfa, 0xbc, 0x75, 0xa1, 0xdb, 0x4e, 0x88, - 0x0c, 0xfe, 0x14, 0x35, 0x94, 0x47, 0x8b, 0xd9, 0x56, 0xb9, 0x11, 0xed, 0x59, 0x51, 0xb4, 0x58, - 0x21, 0x30, 0xa2, 0xb1, 0xfe, 0x34, 0x07, 0x63, 0xa2, 0x12, 0x54, 0xf1, 0xce, 0xf5, 0xe1, 0xfd, - 0x10, 0xf2, 0xbc, 0x9c, 0xdc, 0x6d, 0x7f, 0x3d, 0x9b, 0x6d, 0xc6, 0x38, 0x08, 0x8d, 0x8c, 0xff, - 0x44, 0xc1, 0x93, 0x69, 0xcc, 0x6d, 0xfb, 0xf3, 0x05, 0x1d, 0x24, 0xd0, 0x1a, 0xf3, 0x3a, 0x87, - 0xa2, 0xc4, 0x5a, 0x5f, 0x1f, 0x86, 0x82, 0xf2, 0x1a, 0x91, 0xdf, 0xc9, 0x41, 0xc9, 0x76, 0x5d, - 0x2f, 0xb4, 0x85, 0x53, 0x45, 0x4c, 0xf2, 0x8d, 0x4c, 0x15, 0x53, 0x4c, 0xe7, 0x16, 0x22, 0x86, - 0xcb, 0x6e, 0xe8, 0x1f, 0x46, 0x9b, 0xbe, 0x81, 0x41, 0x53, 0x2e, 0xf9, 0x0c, 0x46, 0x5b, 0xf6, - 0x0e, 0x6d, 0xa9, 0x39, 0xbf, 0x36, 0x58, 0x0d, 0xee, 0x72, 0x5e, 0x42, 0xb8, 0xee, 0x07, 0x01, - 0x44, 0x29, 0x68, 0xe6, 0x5d, 0x98, 0x4a, 0x56, 0x94, 0x4c, 0x19, 0xe3, 0x27, 0x86, 0xec, 0x42, - 0x6c, 0x3b, 0x53, 0x13, 0x7e, 0xe8, 0xad, 0xdc, 0xcc, 0xaf, 0x41, 0xc9, 0x10, 0x73, 0x9a, 0xa2, - 0xd6, 0x87, 0x50, 0x5a, 0xa7, 0xa1, 0xef, 0xd4, 0x38, 0x83, 0xa7, 0xcd, 0x9a, 0x13, 0xed, 0xa8, - 0x5f, 0xb0, 0x49, 0xc8, 0x58, 0x06, 0xc4, 0x03, 0xe8, 0xf8, 0x5e, 0x9b, 0x86, 0x4d, 0xda, 0x55, - 0x23, 0x9a, 0x4d, 0xf9, 0xdb, 0xd2, 0x6c, 0x84, 0x1b, 0x20, 0xfa, 0x46, 0x43, 0x84, 0x75, 0x03, - 0xf2, 0xeb, 0xdd, 0x90, 0x7e, 0xfe, 0xf4, 0x55, 0x6f, 0x3d, 0x84, 0x71, 0x4e, 0x7a, 0xdb, 0x6b, - 0xb1, 0x0d, 0x85, 0xb5, 0xad, 0xcd, 0xbe, 0x93, 0x76, 0x13, 0x27, 0x42, 0x81, 0x63, 0x33, 0xbb, - 0xe9, 0xb5, 0xea, 0xd4, 0x97, 0x3d, 0xa0, 0x47, 0xf4, 0x36, 0x87, 0xa2, 0xc4, 0x5a, 0x3f, 0xce, - 0x41, 0x89, 0x17, 0x94, 0x1b, 0x41, 0x0b, 0xc6, 0x9a, 0x42, 0x8e, 0xec, 0x85, 0x6c, 0x8e, 0x7e, - 0xb3, 0xc2, 0xc6, 0x21, 0x29, 0x00, 0xa8, 0x44, 0x30, 0x69, 0x07, 0xb6, 0x13, 0x32, 0x69, 0x43, - 0x67, 0x2e, 0xed, 0x81, 0xe0, 0x8c, 0x4a, 0x84, 0xf5, 0xcf, 0xa7, 0x00, 0x36, 0xbc, 0x3a, 0x95, - 0x4d, 0x9d, 0x81, 0x21, 0xa7, 0x2e, 0x3b, 0x11, 0x64, 0xa1, 0xa1, 0xb5, 0x25, 0x1c, 0x72, 0xea, - 0x7a, 0x54, 0x86, 0xfa, 0xee, 0xc5, 0x6f, 0x42, 0xa9, 0xee, 0x04, 0x9d, 0x96, 0x7d, 0xb8, 0x91, - 0xa2, 0xa9, 0x2d, 0x45, 0x28, 0x34, 0xe9, 0xc8, 0xeb, 0x32, 0x54, 0x2a, 0xb4, 0xb4, 0x72, 0x22, - 0x54, 0x5a, 0x60, 0xd5, 0x33, 0xa2, 0xa4, 0x6f, 0xc1, 0xb8, 0x72, 0x0b, 0x72, 0x29, 0x79, 0x5e, - 0xea, 0x82, 0x0a, 0x9c, 0x6c, 0x1b, 0x38, 0x8c, 0x51, 0x26, 0xdd, 0x96, 0xa3, 0xcf, 0xc5, 0x6d, - 0xb9, 0x04, 0x53, 0x41, 0xe8, 0xf9, 0xb4, 0xae, 0x28, 0xd6, 0x96, 0xca, 0x24, 0xd6, 0xd0, 0xa9, - 0x6a, 0x02, 0x8f, 0x3d, 0x25, 0xc8, 0x16, 0x5c, 0x38, 0x48, 0x44, 0xa1, 0x79, 0xe3, 0xcf, 0x73, - 0x4e, 0x57, 0x25, 0xa7, 0x0b, 0x0f, 0x52, 0x68, 0x30, 0xb5, 0x24, 0x79, 0x1b, 0x26, 0x54, 0x35, - 0xf9, 0x51, 0x59, 0xbe, 0xc0, 0x59, 0x69, 0x5b, 0x66, 0xdb, 0x44, 0x62, 0x9c, 0x96, 0xfc, 0x2a, - 0xe4, 0x3b, 0x4d, 0x3b, 0xa0, 0xd2, 0xcb, 0xa9, 0x5c, 0x48, 0xf9, 0x2d, 0x06, 0x7c, 0x7c, 0x34, - 0x5b, 0x64, 0x63, 0xc6, 0x3f, 0x50, 0x10, 0x92, 0x9b, 0x00, 0x3b, 0x5e, 0xd7, 0xad, 0xdb, 0xfe, - 0xe1, 0xda, 0x92, 0x0c, 0x72, 0x68, 0x1d, 0xa6, 0xa2, 0x31, 0x68, 0x50, 0x99, 0xf1, 0xea, 0xe2, - 0x93, 0xe3, 0xd5, 0xe4, 0x21, 0x14, 0x79, 0x40, 0x88, 0xd6, 0x17, 0x42, 0xe9, 0xb1, 0x3c, 0x4d, - 0xec, 0x40, 0x9f, 0xcc, 0x55, 0xc5, 0x04, 0x23, 0x7e, 0xe4, 0x13, 0x80, 0x5d, 0xc7, 0x75, 0x82, - 0x26, 0xe7, 0x5e, 0x3a, 0x35, 0x77, 0xdd, 0xce, 0x15, 0xcd, 0x05, 0x0d, 0x8e, 0xe4, 0x63, 0x98, - 0xa6, 0x41, 0xe8, 0xb4, 0xed, 0x90, 0xd6, 0x75, 0xc6, 0x4a, 0x99, 0xc7, 0xc0, 0x74, 0x48, 0x6e, - 0x39, 0x49, 0xf0, 0x38, 0x0d, 0x88, 0xbd, 0x8c, 0xc8, 0x5b, 0x50, 0xe8, 0xf8, 0x5e, 0x83, 0x19, - 0x96, 0xe5, 0x99, 0xd8, 0x74, 0x29, 0x6c, 0x49, 0xf8, 0x63, 0xe3, 0x37, 0x6a, 0x6a, 0xf2, 0xdf, - 0x72, 0x30, 0xed, 0xd3, 0xc0, 0xeb, 0xfa, 0x35, 0x1a, 0xe8, 0x8a, 0x5d, 0xe4, 0x9b, 0xd2, 0xfd, - 0x8c, 0xb9, 0xe6, 0x6a, 0xa7, 0x99, 0xc3, 0x24, 0x63, 0x71, 0xca, 0x52, 0xd5, 0xe0, 0x1e, 0xfc, - 0xe3, 0x34, 0xe0, 0x37, 0x7e, 0x30, 0x3b, 0xdb, 0x7b, 0xbd, 0x41, 0x33, 0x67, 0x33, 0xfd, 0x6f, - 0xfe, 0x60, 0x76, 0x4a, 0x7d, 0x47, 0xfd, 0xd4, 0xd3, 0x2e, 0x76, 0x84, 0x74, 0xbc, 0xfa, 0xda, - 0x96, 0x74, 0x2d, 0xeb, 0x23, 0x64, 0x8b, 0x01, 0x51, 0xe0, 0xc8, 0x6b, 0x50, 0xa8, 0xdb, 0xb4, - 0xed, 0xb9, 0xb4, 0x5e, 0x9e, 0x88, 0x5c, 0x6f, 0x4b, 0x12, 0x86, 0x1a, 0x4b, 0x3e, 0x85, 0x51, - 0x87, 0xab, 0xff, 0xe5, 0x73, 0x7c, 0xc2, 0x64, 0x33, 0x33, 0x84, 0x05, 0x21, 0x32, 0x9c, 0xc4, - 0x6f, 0x94, 0x6c, 0x49, 0x0d, 0xc6, 0xbc, 0x6e, 0xc8, 0x25, 0x4c, 0x72, 0x09, 0xd9, 0x7c, 0xd5, - 0x9b, 0x82, 0x87, 0x48, 0x78, 0x96, 0x1f, 0xa8, 0x38, 0xb3, 0xf6, 0xd6, 0x9a, 0x4e, 0xab, 0xee, - 0x53, 0xb7, 0x3c, 0xc5, 0x7d, 0x16, 0xbc, 0xbd, 0x8b, 0x12, 0x86, 0x1a, 0x4b, 0xfe, 0x22, 0x4c, - 0x78, 0xdd, 0x90, 0xaf, 0x5e, 0x36, 0xca, 0x41, 0x79, 0x9a, 0x93, 0x4f, 0xf3, 0x4c, 0x0c, 0x13, - 0x81, 0x71, 0x3a, 0xb6, 0x9f, 0x37, 0xbd, 0x20, 0x64, 0x1f, 0x7c, 0x4b, 0xbb, 0x14, 0xdf, 0xcf, - 0x6f, 0x1b, 0x38, 0x8c, 0x51, 0x92, 0xdf, 0xcb, 0xc1, 0x74, 0x3b, 0xa9, 0xb6, 0x97, 0x2f, 0xf3, - 0xce, 0x58, 0xc9, 0xa8, 0xf8, 0x25, 0xb8, 0x89, 0xa8, 0x62, 0x0f, 0x18, 0x7b, 0xe5, 0xf2, 0x24, - 0xcd, 0xe0, 0xd0, 0xad, 0x35, 0x7d, 0xcf, 0x8d, 0xd7, 0xe8, 0x45, 0x5e, 0xa3, 0x8d, 0xec, 0x2b, - 0x26, 0x8d, 0x6b, 0xe5, 0xc5, 0xe3, 0xa3, 0xd9, 0x8b, 0xa9, 0x28, 0x4c, 0xaf, 0xc7, 0xcc, 0x12, - 0x5c, 0x4a, 0x5f, 0x75, 0x4f, 0x53, 0x3a, 0x87, 0x4d, 0xa5, 0x73, 0x05, 0x5e, 0xec, 0x5b, 0x29, - 0xb6, 0x65, 0x2b, 0xe5, 0x25, 0x17, 0xdf, 0xb2, 0x7b, 0x34, 0x8f, 0x73, 0x30, 0x6e, 0x5e, 0x3d, - 0xe1, 0x71, 0x05, 0x23, 0xe5, 0x97, 0x78, 0x50, 0xf4, 0xaa, 0x67, 0x11, 0x57, 0xd8, 0xac, 0xf6, - 0xc4, 0x15, 0x34, 0x08, 0x23, 0x19, 0x4f, 0x8b, 0x2b, 0xfc, 0xe9, 0x10, 0x44, 0xe5, 0xc8, 0xeb, - 0x50, 0xa0, 0x6e, 0xbd, 0xe3, 0x39, 0x6e, 0x98, 0x8c, 0xc8, 0x2c, 0x4b, 0x38, 0x6a, 0x0a, 0x23, - 0x0a, 0x31, 0xf4, 0xc4, 0x28, 0x44, 0x1d, 0x26, 0x6d, 0x9e, 0x79, 0x10, 0xf9, 0x90, 0x87, 0x4f, - 0xed, 0x50, 0x5b, 0x88, 0x73, 0xc0, 0x24, 0x4b, 0x26, 0x25, 0x88, 0x8a, 0x72, 0x29, 0x23, 0xa7, - 0x96, 0x52, 0x8d, 0x73, 0xc0, 0x24, 0x4b, 0xeb, 0x5f, 0x0d, 0x81, 0xda, 0x4f, 0x7e, 0x1e, 0x3c, - 0x20, 0xc4, 0x82, 0x51, 0x9f, 0x06, 0x2a, 0xa1, 0xb9, 0x28, 0xf6, 0x6c, 0xe4, 0x10, 0x94, 0x18, - 0xb6, 0x9d, 0xd2, 0xcf, 0x9d, 0x70, 0xd1, 0xab, 0x2b, 0x6d, 0x97, 0x6f, 0xa7, 0xcb, 0x12, 0x86, - 0x1a, 0x6b, 0x1d, 0xc0, 0x04, 0x6b, 0x57, 0xab, 0x45, 0x5b, 0xd5, 0x90, 0x76, 0x02, 0xb2, 0x0b, - 0xf9, 0x80, 0xfd, 0x18, 0xc8, 0x04, 0x89, 0xd2, 0x38, 0x68, 0xc7, 0x70, 0x95, 0x30, 0xbe, 0x28, - 0xd8, 0x5b, 0xff, 0x65, 0x08, 0x8a, 0xba, 0x47, 0x4f, 0xe0, 0x7f, 0xb9, 0x19, 0x25, 0x72, 0x8b, - 0xb9, 0x5d, 0x36, 0x92, 0xb8, 0x99, 0x2a, 0xb8, 0xe0, 0x1e, 0x8a, 0x3c, 0x5d, 0x9d, 0xd1, 0x4d, - 0x5e, 0x8f, 0x3b, 0xea, 0x2e, 0x99, 0x4e, 0x22, 0x83, 0x5e, 0x7a, 0xec, 0xf6, 0xa0, 0xc8, 0x7f, - 0xac, 0xa8, 0xab, 0x4c, 0x59, 0xe7, 0xce, 0x7d, 0xc5, 0x45, 0x38, 0xde, 0xf5, 0x27, 0x46, 0xfc, - 0x13, 0x57, 0x90, 0xf2, 0x27, 0xba, 0x82, 0x74, 0x03, 0x46, 0xa8, 0xdb, 0x6d, 0xf3, 0xf4, 0x82, - 0x22, 0x3f, 0x31, 0x46, 0x96, 0xdd, 0x6e, 0x3b, 0xde, 0x18, 0x4e, 0x62, 0xad, 0x00, 0xd3, 0x27, - 0x56, 0x17, 0xc9, 0x3b, 0x50, 0x08, 0xe4, 0xce, 0x27, 0x3b, 0xf7, 0x97, 0x74, 0x44, 0x57, 0xc2, - 0x1f, 0x1f, 0xcd, 0x4e, 0x70, 0x62, 0x05, 0x40, 0x5d, 0xc4, 0xfa, 0xe6, 0x08, 0x18, 0x56, 0xf4, - 0x09, 0x86, 0xa9, 0x9e, 0x70, 0x8c, 0xbc, 0x9f, 0xd5, 0x31, 0xa2, 0xbc, 0x0d, 0x62, 0x7e, 0xc7, - 0x7d, 0x21, 0xac, 0x1e, 0x4d, 0xda, 0xea, 0xc8, 0x71, 0xd5, 0xf5, 0xb8, 0x4d, 0x5b, 0x1d, 0xe4, - 0x18, 0x9d, 0x7d, 0x30, 0xd2, 0x37, 0xfb, 0xe0, 0x21, 0xe4, 0x1b, 0x76, 0xb7, 0x41, 0xa5, 0xf3, - 0x3d, 0x9b, 0x73, 0x8b, 0x47, 0x53, 0x85, 0x73, 0x8b, 0xff, 0x44, 0xc1, 0x93, 0xcd, 0xa5, 0xa6, - 0xf2, 0x17, 0x4b, 0x03, 0x30, 0xdb, 0x5c, 0xd2, 0x5e, 0x67, 0x31, 0x97, 0xf4, 0x27, 0x46, 0xfc, - 0x99, 0x86, 0x56, 0x13, 0x99, 0xae, 0x32, 0x12, 0xf8, 0x1b, 0x19, 0x93, 0x28, 0x38, 0x0f, 0xa1, - 0xa1, 0xc9, 0x0f, 0x54, 0x9c, 0xad, 0x79, 0x28, 0x19, 0xb7, 0x70, 0x58, 0xff, 0xea, 0x8c, 0x4b, - 0xa3, 0x7f, 0x97, 0xec, 0xd0, 0x46, 0x8e, 0xb1, 0xfe, 0x68, 0x18, 0xb4, 0x3e, 0x6c, 0xa6, 0x47, - 0xd8, 0x35, 0x23, 0x61, 0x3f, 0x96, 0xab, 0xe5, 0xb9, 0x28, 0xb1, 0xcc, 0x6a, 0x6c, 0x53, 0xbf, - 0xa1, 0x4f, 0x6d, 0xb9, 0xe6, 0xb5, 0xd5, 0xb8, 0x6e, 0x22, 0x31, 0x4e, 0xcb, 0xce, 0xcc, 0xb6, - 0xed, 0x3a, 0xbb, 0x34, 0x08, 0x93, 0x41, 0xad, 0x75, 0x09, 0x47, 0x4d, 0x41, 0x56, 0x61, 0x3a, - 0xa0, 0xe1, 0xe6, 0x81, 0x4b, 0x7d, 0x9d, 0x43, 0x26, 0x93, 0x0a, 0x5f, 0x54, 0x46, 0x42, 0x35, - 0x49, 0x80, 0xbd, 0x65, 0xb8, 0x05, 0x2e, 0xf2, 0xf9, 0x74, 0x6e, 0x96, 0x5c, 0xd8, 0x91, 0x05, - 0x9e, 0xc0, 0x63, 0x4f, 0x09, 0xc6, 0x65, 0xd7, 0x76, 0x5a, 0x5d, 0x9f, 0x46, 0x5c, 0x46, 0xe3, - 0x5c, 0x56, 0x12, 0x78, 0xec, 0x29, 0xc1, 0xe3, 0xe1, 0x2d, 0xbb, 0x11, 0x94, 0xc7, 0x8c, 0x78, - 0x38, 0x03, 0xa0, 0x80, 0x5b, 0xff, 0x30, 0x07, 0x13, 0x48, 0x43, 0xff, 0x70, 0x61, 0x97, 0x59, - 0x88, 0xe1, 0x21, 0xf9, 0xfd, 0x1c, 0x4c, 0xb9, 0x5e, 0x9d, 0x2e, 0xb8, 0xa1, 0xa3, 0x80, 0x03, - 0xdd, 0xfb, 0xe1, 0xec, 0x37, 0x12, 0x1c, 0x45, 0x36, 0x60, 0x12, 0x8a, 0x3d, 0x92, 0xad, 0xcb, - 0x70, 0x31, 0x95, 0x81, 0xf5, 0xd7, 0x87, 0x65, 0xcd, 0xf5, 0x78, 0x7f, 0x08, 0xf9, 0x16, 0xcf, - 0x8c, 0xcc, 0x65, 0xbc, 0xd8, 0xc1, 0xbb, 0x47, 0xa4, 0x4e, 0x0a, 0x4e, 0x64, 0x09, 0x4a, 0x3e, - 0x93, 0x21, 0xf3, 0x56, 0xc5, 0xec, 0xb3, 0xa2, 0x7b, 0x92, 0x1a, 0xf5, 0x38, 0xfe, 0x89, 0x66, - 0x31, 0xe2, 0xc2, 0xd8, 0x8e, 0xb8, 0xab, 0x22, 0xd5, 0xab, 0x6c, 0x0b, 0x53, 0xde, 0x77, 0xe1, - 0xe7, 0x97, 0xba, 0xfc, 0xf2, 0x38, 0xfa, 0x89, 0x4a, 0x08, 0x69, 0x41, 0xc1, 0x56, 0x23, 0x37, - 0x32, 0x40, 0xd8, 0x39, 0x36, 0x31, 0x84, 0xea, 0xa0, 0x47, 0x4a, 0x4b, 0xb0, 0xbe, 0x95, 0x03, - 0x88, 0xae, 0x63, 0x92, 0x3d, 0x28, 0x04, 0xb7, 0x62, 0x6a, 0x74, 0xc6, 0x04, 0x33, 0xc9, 0xc4, - 0x48, 0x3d, 0x92, 0x10, 0xd4, 0x02, 0x9e, 0xa6, 0x43, 0x7f, 0x33, 0x0f, 0xba, 0xd4, 0x33, 0x52, - 0xa1, 0x5f, 0x65, 0x6a, 0x58, 0x23, 0xba, 0xf3, 0xa3, 0xe9, 0x90, 0x43, 0x51, 0x62, 0x99, 0x2a, - 0xa6, 0x92, 0x20, 0xe4, 0xae, 0xc2, 0xfb, 0x53, 0xe5, 0x4b, 0xa0, 0xc6, 0xa6, 0x29, 0xe5, 0xf9, - 0xe7, 0xa2, 0x94, 0x8f, 0x9e, 0xb9, 0x52, 0xce, 0xec, 0x33, 0xdf, 0x6b, 0xd1, 0x05, 0xdc, 0x90, - 0xae, 0x3b, 0x6d, 0x9f, 0xa1, 0x00, 0xa3, 0xc2, 0x93, 0x37, 0xa1, 0xd4, 0x0d, 0x68, 0x75, 0xe9, - 0xce, 0xa2, 0x4f, 0xeb, 0x81, 0xcc, 0x2b, 0xd1, 0xce, 0xdc, 0x7b, 0x11, 0x0a, 0x4d, 0x3a, 0xf2, - 0x4f, 0x73, 0x50, 0xae, 0xf1, 0xfb, 0x1a, 0x62, 0x60, 0xd6, 0x76, 0x37, 0xbc, 0x70, 0xcb, 0xa7, - 0x01, 0x75, 0x43, 0x99, 0xaa, 0xfc, 0x41, 0xc6, 0x64, 0xfd, 0x94, 0x4b, 0x20, 0x95, 0xab, 0xc7, - 0x47, 0xb3, 0xe5, 0xc5, 0x3e, 0xf2, 0xb0, 0x6f, 0x4d, 0xac, 0xbf, 0x91, 0x83, 0x73, 0xd5, 0x9a, - 0xef, 0x74, 0x42, 0x7d, 0x06, 0x6e, 0xf0, 0x2b, 0x5f, 0xa1, 0xcd, 0xf6, 0x25, 0xb9, 0x52, 0x5e, - 0xea, 0x13, 0xf9, 0x17, 0x44, 0xb1, 0xeb, 0x9f, 0x02, 0x84, 0x11, 0x0b, 0x36, 0x13, 0xc5, 0x29, - 0x9b, 0x9c, 0xb1, 0x55, 0x0e, 0x45, 0x89, 0xb5, 0x1e, 0xc1, 0x54, 0x95, 0xb6, 0xed, 0x4e, 0x93, - 0x67, 0xe2, 0x88, 0x20, 0xc0, 0x3c, 0x14, 0x03, 0x05, 0x4b, 0xde, 0x35, 0xd5, 0xc4, 0x18, 0xd1, - 0x90, 0x57, 0x44, 0x8c, 0x42, 0x85, 0xf0, 0x8b, 0x42, 0x5b, 0x10, 0x81, 0x8d, 0x00, 0x15, 0xce, - 0x3a, 0x80, 0xf1, 0xa8, 0x38, 0xdd, 0x25, 0x0d, 0x98, 0xac, 0x19, 0x89, 0x0c, 0xd1, 0x95, 0xd2, - 0x93, 0xe7, 0x3c, 0xf0, 0x89, 0xb7, 0x18, 0x67, 0x82, 0x49, 0xae, 0xd6, 0xff, 0xca, 0xc1, 0xa4, - 0x96, 0x2c, 0x9d, 0x05, 0x9d, 0x64, 0x5c, 0x65, 0x39, 0x63, 0xe6, 0x6b, 0xbc, 0xf3, 0x9e, 0x10, - 0x5b, 0xe9, 0x24, 0x63, 0x2b, 0x67, 0x2d, 0xb1, 0xc7, 0xcb, 0xf1, 0xc7, 0x43, 0x50, 0xd0, 0xa9, - 0xb7, 0x1f, 0x42, 0x9e, 0xab, 0x6d, 0x83, 0x1d, 0x88, 0x5c, 0x05, 0x44, 0xc1, 0x89, 0xb1, 0xe4, - 0x8e, 0xea, 0xcc, 0x97, 0x27, 0x8b, 0xc2, 0x02, 0xb4, 0xfd, 0x10, 0x05, 0x27, 0x72, 0x07, 0x86, - 0xa9, 0x5b, 0x97, 0x27, 0xe3, 0xe9, 0x19, 0xf2, 0xdb, 0xd4, 0xcb, 0x6e, 0x1d, 0x19, 0x17, 0x7e, - 0x2b, 0xcc, 0xf3, 0xdb, 0x76, 0x28, 0x35, 0xfe, 0xe8, 0x56, 0x18, 0x87, 0xa2, 0xc4, 0x5a, 0xff, - 0x73, 0x08, 0x46, 0xab, 0xdd, 0x1d, 0x76, 0xc6, 0xff, 0xbd, 0x1c, 0x9c, 0x4f, 0x86, 0x2c, 0xa2, - 0x89, 0x79, 0xfb, 0x4c, 0x6e, 0x2d, 0x22, 0xdd, 0xad, 0x5c, 0x91, 0x55, 0x39, 0x9f, 0x82, 0xc4, - 0xb4, 0x1a, 0xc4, 0xee, 0x88, 0x0d, 0x3f, 0xa3, 0x1b, 0x9a, 0x46, 0x2a, 0xff, 0xd0, 0x99, 0xa4, - 0xf2, 0x4f, 0xf4, 0x4b, 0xe3, 0xb7, 0xfe, 0xed, 0x08, 0x80, 0xe8, 0xf3, 0xcd, 0x4e, 0x78, 0x12, - 0x23, 0xf2, 0x2d, 0x18, 0x57, 0x2f, 0xe7, 0x6c, 0x44, 0x91, 0x40, 0xed, 0xaa, 0x5d, 0x35, 0x70, - 0x18, 0xa3, 0x64, 0x66, 0x35, 0x75, 0x43, 0xff, 0x50, 0x9c, 0xf6, 0x23, 0x71, 0xb3, 0x7a, 0x59, - 0x63, 0xd0, 0xa0, 0x22, 0x73, 0x31, 0xa7, 0x91, 0x48, 0xf7, 0x3f, 0xf7, 0x04, 0x87, 0xcf, 0xdb, - 0x30, 0xa1, 0xbf, 0x56, 0x9c, 0x96, 0x4a, 0xa3, 0xd2, 0xb6, 0xc9, 0x96, 0x89, 0xc4, 0x38, 0x2d, - 0x79, 0x17, 0xce, 0xc5, 0x93, 0x73, 0xe5, 0xf9, 0x78, 0x49, 0x96, 0x3e, 0x17, 0xcf, 0xe9, 0xc5, - 0x04, 0x35, 0x9b, 0xe7, 0x75, 0xff, 0x10, 0xbb, 0xae, 0x3c, 0x28, 0xf5, 0x3c, 0x5f, 0xe2, 0x50, - 0x94, 0x58, 0xd6, 0x85, 0xac, 0x24, 0xf5, 0x05, 0x9c, 0x9f, 0x88, 0x85, 0xa8, 0x0b, 0xab, 0x06, - 0x0e, 0x63, 0x94, 0x4c, 0x82, 0xb4, 0xe0, 0x21, 0xbe, 0x92, 0x12, 0x36, 0x78, 0x07, 0xce, 0x79, - 0x71, 0xa3, 0x49, 0x44, 0xac, 0xbe, 0x76, 0xc2, 0xa9, 0x1a, 0x2b, 0x2b, 0xb2, 0x5f, 0x13, 0x36, - 0x56, 0x82, 0xbf, 0x75, 0x1e, 0xa6, 0xab, 0xdd, 0x4e, 0xa7, 0xe5, 0xd0, 0xba, 0xf6, 0xa9, 0x58, - 0xef, 0xc1, 0xa4, 0xbc, 0xf2, 0xa5, 0x0f, 0xd8, 0x53, 0xdd, 0x0b, 0xb7, 0x8e, 0xd8, 0x89, 0x11, - 0x77, 0x32, 0x13, 0x37, 0x79, 0x2c, 0x66, 0x75, 0x84, 0x99, 0x87, 0xa0, 0x58, 0x21, 0xa9, 0xa7, - 0xea, 0x43, 0x95, 0x56, 0x30, 0x48, 0xa2, 0x0d, 0x8f, 0xc4, 0x8b, 0x7d, 0xd6, 0x4c, 0x47, 0xb0, - 0x7e, 0x92, 0x83, 0x74, 0xff, 0x3d, 0xf9, 0xac, 0xb7, 0x99, 0x4b, 0x83, 0x35, 0x53, 0xc6, 0x0c, - 0xfa, 0xb7, 0xd4, 0x8e, 0xb7, 0xf4, 0xfd, 0xec, 0x2d, 0x95, 0xa2, 0x7a, 0xdb, 0xfb, 0xbf, 0x73, - 0x50, 0xda, 0xde, 0xbe, 0xab, 0xcd, 0x43, 0x84, 0x4b, 0x81, 0xb8, 0xb4, 0xb7, 0xb0, 0x1b, 0x52, - 0x7f, 0xd1, 0x6b, 0x77, 0x5a, 0x54, 0x4f, 0x0e, 0x79, 0x93, 0xae, 0x9a, 0x4a, 0x81, 0x7d, 0x4a, - 0x92, 0x35, 0x38, 0x6f, 0x62, 0xa4, 0x5d, 0xcf, 0x1b, 0x95, 0x97, 0x19, 0xd6, 0xbd, 0x68, 0x4c, - 0x2b, 0x93, 0x64, 0x25, 0x8d, 0x7b, 0xf9, 0xd2, 0x52, 0x0f, 0x2b, 0x89, 0xc6, 0xb4, 0x32, 0xd6, - 0x26, 0x94, 0x8c, 0x37, 0xbc, 0xc8, 0xfb, 0x30, 0x55, 0xf3, 0xda, 0x1d, 0x9f, 0x06, 0x81, 0xe3, - 0xb9, 0x77, 0xe9, 0x3e, 0x6d, 0xc9, 0x26, 0x73, 0x23, 0x7c, 0x31, 0x81, 0xc3, 0x1e, 0x6a, 0xeb, - 0x5f, 0x5e, 0x01, 0x7d, 0x11, 0xec, 0x17, 0xd7, 0xc9, 0x32, 0xe5, 0x65, 0xd4, 0x74, 0x7c, 0x36, - 0x3f, 0x78, 0x7c, 0x56, 0xef, 0xc5, 0x89, 0x18, 0x6d, 0x23, 0x8a, 0xd1, 0x8e, 0x9e, 0x41, 0x8c, - 0x56, 0xab, 0x99, 0x3d, 0x71, 0xda, 0xdf, 0xcd, 0xc1, 0xb8, 0xeb, 0xd5, 0xa9, 0xd2, 0xca, 0xb9, - 0x7f, 0xa9, 0x74, 0x73, 0x73, 0xa0, 0x4e, 0x14, 0xc1, 0x47, 0xc9, 0x51, 0x84, 0xe7, 0xf5, 0x41, - 0x65, 0xa2, 0x30, 0x26, 0x9a, 0xac, 0x18, 0xde, 0x0e, 0x71, 0xa3, 0xed, 0x6a, 0x9a, 0x31, 0xf1, - 0x34, 0x3f, 0x06, 0xd9, 0x33, 0xb4, 0xad, 0xe2, 0x00, 0x8e, 0x0b, 0x95, 0xcd, 0x67, 0x78, 0x1b, - 0xd5, 0x65, 0xd7, 0x48, 0xf1, 0xb2, 0x60, 0x54, 0x84, 0xee, 0xe5, 0xdb, 0x5b, 0xdc, 0xbb, 0x2d, - 0xc2, 0xfa, 0x28, 0x31, 0xa4, 0xa1, 0x42, 0x30, 0x25, 0xde, 0xb9, 0x95, 0xcc, 0x01, 0x2c, 0x1d, - 0xd5, 0x49, 0x8f, 0xc1, 0x90, 0x0f, 0x4c, 0x4b, 0x74, 0xfc, 0x24, 0x96, 0xe8, 0x44, 0x5f, 0x2b, - 0xb4, 0x01, 0xa3, 0x01, 0xb7, 0x73, 0x79, 0xbe, 0x42, 0xe9, 0xe6, 0x62, 0xb6, 0x83, 0x24, 0x66, - 0x2a, 0x8b, 0xde, 0x11, 0x30, 0x94, 0xec, 0x89, 0x07, 0x05, 0x95, 0x54, 0x21, 0x53, 0x1e, 0x96, - 0x33, 0x3a, 0xb9, 0xe2, 0xbe, 0x69, 0x75, 0xb9, 0x49, 0x40, 0x51, 0x0b, 0x21, 0x0f, 0x61, 0xb8, - 0x6e, 0x37, 0x64, 0xf2, 0xc3, 0xfb, 0x99, 0x2f, 0xea, 0x29, 0x31, 0xdc, 0x6e, 0x59, 0x5a, 0x58, - 0x45, 0xc6, 0x95, 0xec, 0x45, 0x17, 0xd9, 0xa7, 0x06, 0x39, 0x80, 0xe3, 0x2a, 0x90, 0xb0, 0xca, - 0x7b, 0xae, 0xc2, 0x2f, 0xc3, 0xd8, 0xbe, 0xd7, 0xea, 0xb6, 0x65, 0xd6, 0x44, 0xe9, 0xe6, 0x4c, - 0xda, 0x68, 0xdf, 0xe7, 0x24, 0xd1, 0x26, 0x20, 0xbe, 0x03, 0x54, 0x65, 0xc9, 0x37, 0x72, 0x70, - 0x8e, 0x2d, 0x1d, 0x3d, 0x0f, 0x82, 0x32, 0x19, 0x60, 0xa6, 0xde, 0x0b, 0xd8, 0xd1, 0xaa, 0x66, - 0x98, 0x56, 0x84, 0xd7, 0x62, 0x12, 0x30, 0x21, 0x91, 0x74, 0xa0, 0x10, 0x38, 0x75, 0x5a, 0xb3, - 0xfd, 0xa0, 0x7c, 0xfe, 0xcc, 0xa4, 0x47, 0x3e, 0x47, 0xc9, 0x1b, 0xb5, 0x14, 0xf2, 0xd7, 0xf8, - 0xf3, 0x4e, 0xf2, 0x31, 0x3b, 0xf9, 0x84, 0xe1, 0x85, 0xb3, 0x7c, 0xc2, 0x50, 0x38, 0xf0, 0xe2, - 0x12, 0x30, 0x29, 0x92, 0xfc, 0x76, 0x0e, 0x2e, 0x8a, 0x1b, 0xed, 0xc9, 0xe7, 0x0c, 0x2e, 0x66, - 0xb4, 0xa4, 0x79, 0x86, 0xc7, 0x42, 0x1a, 0x4b, 0x4c, 0x97, 0x44, 0xbe, 0x84, 0x09, 0xdf, 0x74, - 0xc1, 0xf3, 0x64, 0x9a, 0x81, 0xbc, 0xcd, 0xfa, 0x41, 0x44, 0x9e, 0xc8, 0x13, 0x03, 0x61, 0x5c, - 0x16, 0x79, 0x03, 0x4a, 0x1d, 0xb9, 0xb9, 0x39, 0x41, 0x9b, 0xe7, 0xe1, 0x0c, 0x8b, 0x43, 0x78, - 0x2b, 0x02, 0xa3, 0x49, 0x43, 0xee, 0x41, 0x29, 0xf4, 0x5a, 0xd4, 0x97, 0x59, 0xe3, 0x65, 0x3e, - 0x5f, 0xae, 0xa5, 0x4d, 0xfe, 0x6d, 0x4d, 0x16, 0xf9, 0x20, 0x23, 0x58, 0x80, 0x26, 0x1f, 0x66, - 0x09, 0xaa, 0xf7, 0x2e, 0x7c, 0x6e, 0xa8, 0xbe, 0x18, 0xb7, 0x04, 0xab, 0x26, 0x12, 0xe3, 0xb4, - 0x64, 0x15, 0xa6, 0x3b, 0xbe, 0xe3, 0xf9, 0x4e, 0x78, 0xb8, 0xd8, 0xb2, 0x83, 0x80, 0x33, 0x10, - 0x89, 0x73, 0x3a, 0xee, 0xb4, 0x95, 0x24, 0xc0, 0xde, 0x32, 0xe4, 0x35, 0x28, 0x28, 0x60, 0xf9, - 0x0a, 0x57, 0xef, 0xc6, 0x45, 0xd2, 0x9d, 0x80, 0xa1, 0xc6, 0xf6, 0xb9, 0x9e, 0x7b, 0x35, 0xcb, - 0xf5, 0x5c, 0x52, 0x87, 0xab, 0x76, 0x37, 0xf4, 0xf8, 0xf5, 0x94, 0x78, 0x91, 0x6d, 0x6f, 0x8f, - 0xba, 0xe5, 0xeb, 0xfc, 0x78, 0xbb, 0x7e, 0x7c, 0x34, 0x7b, 0x75, 0xe1, 0x09, 0x74, 0xf8, 0x44, - 0x2e, 0xa4, 0x0d, 0x05, 0x2a, 0xaf, 0x18, 0x97, 0x7f, 0x69, 0x80, 0x73, 0x25, 0x7e, 0x4f, 0x59, - 0x65, 0x43, 0x08, 0x18, 0x6a, 0x11, 0x64, 0x1b, 0x4a, 0x4d, 0x2f, 0x08, 0x17, 0x5a, 0x8e, 0x1d, - 0xd0, 0xa0, 0xfc, 0x12, 0x9f, 0x27, 0xa9, 0x47, 0xe2, 0x6d, 0x45, 0x16, 0x4d, 0x93, 0xdb, 0x51, - 0x49, 0x34, 0xd9, 0x10, 0xca, 0x5d, 0xee, 0x5d, 0x3e, 0x6a, 0x9e, 0x1b, 0xd2, 0xcf, 0xc3, 0xf2, - 0x35, 0xde, 0x96, 0x57, 0xd3, 0x38, 0x6f, 0x79, 0xf5, 0x6a, 0x9c, 0x5a, 0xfb, 0xdc, 0x4d, 0x20, - 0x26, 0x79, 0x32, 0x93, 0xbf, 0xe3, 0xd5, 0xab, 0x1d, 0x5a, 0xdb, 0xb2, 0xc3, 0x5a, 0xb3, 0x3c, - 0x1b, 0xf7, 0x9a, 0x6c, 0x19, 0x38, 0x8c, 0x51, 0x92, 0x1a, 0x8c, 0xb5, 0x45, 0x32, 0x7e, 0xf9, - 0xe5, 0x01, 0xd4, 0x47, 0x99, 0xd0, 0x2f, 0x0e, 0x1f, 0xf9, 0x81, 0x8a, 0x33, 0xf9, 0xbb, 0x39, - 0x98, 0x4c, 0xe4, 0x8b, 0x95, 0x7f, 0x79, 0x90, 0x23, 0x2f, 0xce, 0xab, 0xf2, 0x2a, 0xef, 0xa4, - 0x38, 0xf0, 0x71, 0x2f, 0x08, 0x93, 0x95, 0x10, 0xad, 0xe7, 0xf7, 0x61, 0xca, 0xaf, 0x0c, 0xd4, - 0x7a, 0xce, 0x43, 0xb5, 0x9e, 0x7f, 0xa0, 0xe2, 0x4c, 0x6e, 0xc0, 0x58, 0xe8, 0xb4, 0xa9, 0xd7, - 0x0d, 0xcb, 0xaf, 0xc6, 0x03, 0x22, 0xdb, 0x02, 0x8c, 0x0a, 0x3f, 0xf3, 0x1e, 0x4c, 0xf7, 0x28, - 0xc4, 0xa7, 0xba, 0xae, 0xf1, 0x43, 0x66, 0x00, 0x1b, 0x26, 0xc8, 0x59, 0x1b, 0x6e, 0xab, 0x30, - 0x2d, 0x1f, 0xc7, 0x66, 0xda, 0x52, 0xab, 0xab, 0x5f, 0xbe, 0x33, 0x22, 0xe6, 0x98, 0x24, 0xc0, - 0xde, 0x32, 0x6c, 0xc6, 0xd6, 0xc4, 0xd3, 0x67, 0x22, 0x35, 0x7c, 0x24, 0xee, 0xa4, 0x5a, 0x34, - 0x70, 0x18, 0xa3, 0xb4, 0xfe, 0x59, 0x0e, 0x26, 0x62, 0x27, 0xf7, 0x99, 0x47, 0x55, 0x56, 0x80, - 0xb4, 0x1d, 0xdf, 0xf7, 0x7c, 0xa1, 0xfe, 0xac, 0xb3, 0x3d, 0x29, 0x90, 0xd7, 0xe0, 0xf9, 0xf5, - 0xcb, 0xf5, 0x1e, 0x2c, 0xa6, 0x94, 0xb0, 0x7e, 0x67, 0x18, 0xa2, 0x0c, 0x20, 0x7d, 0xe7, 0x38, - 0xd7, 0xf7, 0xce, 0xf1, 0xeb, 0x50, 0x78, 0x14, 0x78, 0xee, 0x56, 0x74, 0x33, 0x59, 0x0f, 0xc5, - 0x07, 0xd5, 0xcd, 0x0d, 0x4e, 0xa9, 0x29, 0x38, 0xf5, 0x67, 0x2b, 0x4e, 0x2b, 0xec, 0xbd, 0xbf, - 0xfb, 0xc1, 0x87, 0x02, 0x8e, 0x9a, 0x82, 0xbf, 0xaf, 0xb6, 0x4f, 0xb5, 0xcf, 0x31, 0x7a, 0x5f, - 0x8d, 0x01, 0x51, 0xe0, 0xc8, 0x3c, 0x14, 0xb5, 0xcb, 0x52, 0x7a, 0x50, 0x75, 0x4f, 0x69, 0xd7, - 0x26, 0x46, 0x34, 0x5c, 0x13, 0x93, 0x6e, 0x39, 0x69, 0x7d, 0xae, 0x64, 0xd4, 0x61, 0x13, 0xbe, - 0x3d, 0xb1, 0x4d, 0x2b, 0x30, 0x6a, 0x29, 0x66, 0x2e, 0x58, 0xfe, 0x84, 0xb9, 0x60, 0x6c, 0x1c, - 0xc6, 0xee, 0x53, 0x9f, 0x3f, 0x27, 0x70, 0x03, 0xc6, 0xf6, 0xc5, 0xcf, 0x64, 0xf6, 0xa8, 0xa4, - 0x40, 0x85, 0x67, 0xbd, 0xb1, 0xd3, 0x75, 0x5a, 0xf5, 0xa5, 0x68, 0x69, 0xe8, 0xde, 0xa8, 0x28, - 0x04, 0x46, 0x34, 0xac, 0x40, 0x83, 0x29, 0xaa, 0xed, 0xb6, 0x13, 0x26, 0xef, 0xe3, 0xad, 0x2a, - 0x04, 0x46, 0x34, 0xe4, 0x55, 0x18, 0x6d, 0x38, 0xe1, 0xb6, 0xdd, 0x48, 0x46, 0x2e, 0x56, 0x39, - 0x14, 0x25, 0x96, 0x3b, 0xc5, 0x9d, 0x70, 0xdb, 0xa7, 0xdc, 0xc9, 0xd6, 0x73, 0x1f, 0x65, 0xd5, - 0xc0, 0x61, 0x8c, 0x92, 0x57, 0xc9, 0x93, 0x2d, 0x93, 0xce, 0xea, 0xa8, 0x4a, 0x0a, 0x81, 0x11, - 0x0d, 0x9b, 0x55, 0x35, 0xaf, 0xdd, 0x71, 0x5a, 0x32, 0xa3, 0xc8, 0x98, 0x55, 0x8b, 0x12, 0x8e, - 0x9a, 0x82, 0x51, 0xb3, 0x7d, 0x61, 0xd7, 0xf3, 0xdb, 0xc9, 0x57, 0xa5, 0xb6, 0x24, 0x1c, 0x35, - 0x85, 0x75, 0x1f, 0x26, 0xc4, 0xfa, 0x58, 0x6c, 0xd9, 0x4e, 0x7b, 0x75, 0x91, 0x2c, 0xf7, 0x64, - 0xa8, 0xdd, 0x48, 0xc9, 0x50, 0xbb, 0x18, 0x2b, 0x94, 0x92, 0xa9, 0xf6, 0x67, 0x43, 0x50, 0x78, - 0x8e, 0x8f, 0xec, 0xd5, 0x62, 0x8f, 0xec, 0x9d, 0xc1, 0x8b, 0x6c, 0x69, 0x0f, 0xec, 0xed, 0x25, - 0x1e, 0xd8, 0x5b, 0x1c, 0x30, 0x19, 0xf3, 0x89, 0x8f, 0xeb, 0xfd, 0x38, 0x07, 0xfa, 0x5e, 0x0f, - 0xdf, 0x10, 0x2a, 0x8e, 0xcb, 0x83, 0x99, 0xcf, 0xbe, 0x33, 0xbd, 0x58, 0x67, 0xae, 0x0f, 0xd4, - 0x4a, 0xb3, 0xea, 0x7d, 0xdf, 0x0c, 0xfd, 0x51, 0x0e, 0xca, 0x69, 0x05, 0x9e, 0xc3, 0x83, 0x82, - 0x6e, 0xfc, 0x41, 0xc1, 0xb5, 0x33, 0x6b, 0x6c, 0x9f, 0x87, 0x05, 0xbf, 0xdf, 0xa7, 0xa9, 0xfc, - 0x49, 0xbf, 0x4f, 0xd5, 0x81, 0x90, 0x1b, 0x20, 0xee, 0x20, 0xb8, 0xa6, 0x1f, 0x26, 0x9f, 0xc2, - 0x68, 0xc0, 0x23, 0x7f, 0x72, 0x6c, 0xdf, 0xce, 0x78, 0x32, 0x30, 0x16, 0xd2, 0x1b, 0xc4, 0x7f, - 0xa3, 0x64, 0x6b, 0x7d, 0x37, 0x07, 0xe3, 0xcf, 0xf1, 0x39, 0xc8, 0x9d, 0xf8, 0xe8, 0xbd, 0x33, - 0xd0, 0xe8, 0xf5, 0x19, 0xb1, 0x3f, 0xbc, 0x02, 0xb1, 0x67, 0x18, 0x89, 0x0b, 0x45, 0xa5, 0x7b, - 0xa9, 0xb4, 0xec, 0x77, 0x06, 0x72, 0xb8, 0x46, 0xdb, 0xbf, 0x82, 0x04, 0x18, 0x89, 0x48, 0x04, - 0x51, 0x87, 0x4e, 0x14, 0x44, 0x7d, 0xee, 0xce, 0xfc, 0x74, 0x5b, 0x76, 0xe4, 0x99, 0xd8, 0xb2, - 0x57, 0xcf, 0xdc, 0x96, 0x7d, 0xe9, 0xd9, 0xdb, 0xb2, 0x86, 0xb3, 0x2f, 0x3f, 0x80, 0xb3, 0xef, - 0x4b, 0xb8, 0xb0, 0x1f, 0x1d, 0xbd, 0x7a, 0xbe, 0xc8, 0x37, 0xee, 0x6e, 0xa4, 0x5a, 0xb0, 0x4c, - 0x8d, 0x08, 0x42, 0xea, 0x86, 0xc6, 0xa1, 0x1d, 0x5d, 0x1e, 0xbd, 0x9f, 0xc2, 0x0e, 0x53, 0x85, - 0x24, 0x5d, 0x3d, 0x63, 0x27, 0x70, 0xf5, 0xfc, 0x51, 0xdf, 0x37, 0xec, 0x0b, 0x67, 0xfe, 0x86, - 0xfd, 0x8b, 0xa7, 0x7e, 0xbf, 0xfe, 0x95, 0xc8, 0xdd, 0x2b, 0x22, 0xf2, 0xe9, 0x8e, 0xda, 0x3f, - 0x48, 0x86, 0x59, 0x80, 0xf7, 0x76, 0x75, 0x60, 0x35, 0xe3, 0x0c, 0x42, 0x2d, 0xa5, 0x01, 0x42, - 0x2d, 0x09, 0x3f, 0xdc, 0xf8, 0x19, 0xf9, 0xe1, 0x5c, 0x98, 0x72, 0xda, 0x76, 0x83, 0x6e, 0x75, - 0x5b, 0x2d, 0x91, 0x80, 0x18, 0x94, 0x27, 0x38, 0xef, 0xd4, 0xf4, 0xb2, 0xbb, 0x5e, 0xcd, 0x6e, - 0x25, 0x5f, 0x0d, 0xd5, 0xd9, 0xd5, 0x6b, 0x09, 0x4e, 0xd8, 0xc3, 0x9b, 0x4d, 0x4b, 0x7e, 0x41, - 0x90, 0x86, 0xac, 0xb7, 0x79, 0x14, 0x42, 0xfe, 0xf3, 0xc9, 0xed, 0x08, 0x8c, 0x26, 0x0d, 0xb9, - 0x03, 0xc5, 0xba, 0x1b, 0xc8, 0x74, 0xe2, 0x49, 0xbe, 0x4b, 0xfd, 0x0a, 0xdb, 0xdb, 0x96, 0x36, - 0xaa, 0x3a, 0x91, 0xf8, 0x6a, 0xca, 0x0d, 0x53, 0x8d, 0xc7, 0xa8, 0x3c, 0x59, 0xe7, 0xcc, 0xe4, - 0xfb, 0x52, 0x22, 0x6c, 0x70, 0xbd, 0x8f, 0x2b, 0x69, 0x69, 0x43, 0x3d, 0x87, 0x35, 0x21, 0xc5, - 0xc9, 0x57, 0xa3, 0x22, 0x0e, 0xc6, 0xb3, 0x88, 0xd3, 0x4f, 0x7c, 0x16, 0xf1, 0x1e, 0x5c, 0x0e, - 0xc3, 0x56, 0x2c, 0x1a, 0x2d, 0x2f, 0x17, 0xf3, 0x9b, 0xe6, 0x79, 0xf1, 0x28, 0xdd, 0xf6, 0xf6, - 0xdd, 0x34, 0x12, 0xec, 0x57, 0x96, 0x87, 0x65, 0xc3, 0x96, 0x76, 0x25, 0x5f, 0x1b, 0x24, 0x2c, - 0x1b, 0x85, 0xfd, 0x65, 0x58, 0x36, 0x02, 0xa0, 0x29, 0x85, 0x6c, 0xf6, 0x73, 0xa2, 0x9f, 0xe7, - 0x7b, 0xcc, 0xe9, 0x5d, 0xe2, 0xa6, 0x17, 0xf6, 0xc2, 0x13, 0xbd, 0xb0, 0x3d, 0x5e, 0xe3, 0x8b, - 0xa7, 0xf0, 0x1a, 0x3f, 0xe4, 0xb7, 0x87, 0x57, 0x17, 0xa5, 0xc7, 0x3d, 0x9b, 0xc6, 0xc6, 0x6f, - 0xfb, 0x88, 0xcc, 0x09, 0xfe, 0x13, 0x05, 0x4f, 0xb2, 0x05, 0x17, 0x3a, 0x5e, 0xbd, 0xc7, 0xe9, - 0xcc, 0x5d, 0xec, 0xc6, 0xed, 0xff, 0xad, 0x14, 0x1a, 0x4c, 0x2d, 0xc9, 0x37, 0xf0, 0x08, 0xce, - 0x2f, 0x9b, 0xe7, 0xe5, 0x06, 0x1e, 0x81, 0xd1, 0xa4, 0x49, 0xfa, 0x60, 0x5f, 0x7c, 0x66, 0x3e, - 0xd8, 0x99, 0xe7, 0xe0, 0x83, 0xbd, 0x72, 0x62, 0x1f, 0xec, 0x5f, 0x81, 0xf3, 0x1d, 0xaf, 0xbe, - 0xe4, 0x04, 0x7e, 0x97, 0xa7, 0x1c, 0x57, 0xba, 0xf5, 0x06, 0x0d, 0xb9, 0x13, 0xb7, 0x74, 0xf3, - 0xa6, 0x59, 0x49, 0xf1, 0xbf, 0x79, 0x73, 0xf2, 0x7f, 0xf3, 0xf8, 0x22, 0x4f, 0x94, 0xe2, 0x76, - 0x0f, 0x4f, 0x1d, 0x49, 0x41, 0x62, 0x9a, 0x1c, 0xd3, 0x05, 0x7c, 0xfd, 0x99, 0xb9, 0x80, 0xdf, - 0x87, 0x42, 0xd0, 0xec, 0x86, 0x75, 0xef, 0xc0, 0xe5, 0xde, 0xfc, 0xa2, 0x7e, 0x87, 0xbc, 0x50, - 0x95, 0xf0, 0xc7, 0x47, 0xb3, 0x53, 0xea, 0xb7, 0x61, 0xe5, 0x4b, 0x08, 0xf9, 0x3b, 0x7d, 0x72, - 0x36, 0xad, 0x33, 0xce, 0xd9, 0xbc, 0x7c, 0xaa, 0x7c, 0xcd, 0x34, 0xd7, 0xf6, 0xcb, 0x3f, 0x0b, - 0xae, 0xed, 0xdf, 0xcf, 0xc1, 0xc4, 0xbe, 0xe9, 0x38, 0x91, 0x1e, 0xf7, 0x6c, 0x81, 0xba, 0x98, - 0x0b, 0xa6, 0x62, 0xb1, 0xbd, 0x2a, 0x06, 0x7a, 0x9c, 0x04, 0x60, 0x5c, 0x78, 0x6f, 0xd8, 0xf0, - 0x95, 0xe7, 0x17, 0x36, 0x1c, 0xdc, 0xad, 0xfe, 0x1f, 0xa7, 0xe1, 0x5c, 0xe2, 0x7d, 0x72, 0xfd, - 0x3e, 0x49, 0xee, 0xa4, 0xef, 0x93, 0xc4, 0x1e, 0x10, 0x19, 0x7a, 0xa6, 0x0f, 0x88, 0x0c, 0x3f, - 0x9f, 0x07, 0x44, 0xa6, 0x9e, 0xc5, 0x03, 0x22, 0xd3, 0xa7, 0x7a, 0x40, 0xc4, 0x78, 0xc0, 0x65, - 0xe4, 0x29, 0x0f, 0xb8, 0x2c, 0xc0, 0xa4, 0xca, 0x72, 0xa3, 0xf2, 0x01, 0x09, 0xe1, 0x48, 0xd5, - 0x7f, 0xae, 0xb4, 0x18, 0x47, 0x63, 0x92, 0x9e, 0xfc, 0x16, 0xe4, 0x5d, 0x5e, 0x70, 0x74, 0x80, - 0xc7, 0xc7, 0xe2, 0x13, 0x89, 0xab, 0xe5, 0xf2, 0xfd, 0x2f, 0x95, 0x00, 0x91, 0xe7, 0xb0, 0xc7, - 0xea, 0x07, 0x0a, 0xa1, 0xe4, 0x63, 0x28, 0x7b, 0xbb, 0xbb, 0x2d, 0xcf, 0xae, 0x47, 0x8f, 0x9c, - 0x28, 0xdf, 0xae, 0x48, 0xd8, 0xbd, 0x2e, 0x19, 0x94, 0x37, 0xfb, 0xd0, 0x61, 0x5f, 0x0e, 0xcc, - 0x7a, 0x9a, 0x8c, 0x3f, 0x0a, 0x14, 0x94, 0x8b, 0xbc, 0x99, 0x7f, 0xe9, 0x2c, 0x9a, 0x19, 0x7f, - 0x81, 0x48, 0x36, 0x58, 0xf7, 0x7c, 0x02, 0x8b, 0xc9, 0x9a, 0x10, 0x1f, 0x2e, 0x75, 0xd2, 0x6c, - 0xcb, 0x40, 0xa6, 0xa1, 0x3d, 0xc9, 0xc2, 0xbd, 0x26, 0xa5, 0x5c, 0x4a, 0xb5, 0x4e, 0x03, 0xec, - 0xc3, 0xd9, 0x7c, 0xfe, 0xa4, 0xf0, 0xcc, 0x9e, 0x3f, 0x89, 0xff, 0x53, 0xc0, 0xc4, 0xf3, 0xf8, - 0xa7, 0x00, 0xf2, 0xd3, 0xd4, 0x57, 0x77, 0x84, 0x49, 0xf6, 0xd1, 0x59, 0x0c, 0xf6, 0xcf, 0xdc, - 0xcb, 0x3b, 0x7f, 0x3f, 0x07, 0x33, 0x62, 0x4a, 0xa5, 0xfd, 0xb9, 0x94, 0x4c, 0x26, 0x3b, 0x03, - 0x57, 0x3e, 0x0f, 0x0f, 0x56, 0x63, 0x82, 0xb8, 0xef, 0xf9, 0x09, 0xc2, 0xc9, 0xef, 0xa6, 0xa8, - 0x10, 0x93, 0x03, 0x38, 0x2c, 0xd2, 0xdf, 0x72, 0x39, 0x7f, 0x7c, 0x12, 0xad, 0xe1, 0x9f, 0xf4, - 0x75, 0xa1, 0x10, 0x5e, 0xa3, 0xad, 0xb3, 0x73, 0xa1, 0x98, 0x6f, 0xcc, 0x9c, 0xc6, 0x91, 0x32, - 0x73, 0x28, 0x9e, 0x93, 0xeb, 0xfb, 0x98, 0xe1, 0x3d, 0xf3, 0x18, 0xcf, 0xfa, 0x9e, 0x60, 0xb4, - 0x3f, 0x9a, 0x0f, 0x29, 0xfe, 0x76, 0x0e, 0x2e, 0xa4, 0x6d, 0x64, 0x29, 0xb5, 0xa8, 0xc6, 0x6b, - 0x31, 0x98, 0xd7, 0xd6, 0xac, 0xc3, 0xd9, 0x3c, 0xb1, 0xf3, 0xb7, 0x47, 0x0d, 0x4f, 0x73, 0x48, - 0x3b, 0xbf, 0x48, 0xf1, 0xce, 0x94, 0xe2, 0x1d, 0xfb, 0xef, 0x8f, 0xfc, 0x73, 0xfc, 0xef, 0x8f, - 0xd1, 0x0c, 0xff, 0xfd, 0x31, 0xf6, 0x3c, 0xff, 0xfb, 0xa3, 0x70, 0xc2, 0xff, 0xfe, 0x28, 0xfe, - 0xcc, 0xfc, 0xf7, 0x87, 0xf5, 0x55, 0x0e, 0xa6, 0xfe, 0x7f, 0xff, 0xcb, 0xc4, 0x1f, 0x1a, 0xa1, - 0xde, 0xe7, 0xf8, 0x5f, 0x89, 0x8f, 0xe2, 0xc1, 0xb3, 0xe5, 0x33, 0x69, 0x64, 0x9f, 0x20, 0xda, - 0x67, 0x90, 0x66, 0xbe, 0x9f, 0xec, 0xee, 0x61, 0x2c, 0x27, 0x69, 0xe8, 0xc4, 0x39, 0x49, 0xff, - 0x37, 0xa5, 0x57, 0xf9, 0xd9, 0xfe, 0xe5, 0xb3, 0xfa, 0x17, 0xb7, 0x0b, 0x69, 0xff, 0xe2, 0x96, - 0xf8, 0xd7, 0xb6, 0xe4, 0xbf, 0x78, 0x0d, 0x3d, 0xc3, 0x7f, 0xf1, 0x9a, 0x80, 0x92, 0xf9, 0x2f, - 0xfc, 0x73, 0xdf, 0xfe, 0xea, 0xda, 0x0b, 0xdf, 0xfd, 0xea, 0xda, 0x0b, 0xdf, 0xfb, 0xea, 0xda, - 0x0b, 0x5f, 0x3f, 0xbe, 0x96, 0xfb, 0xf6, 0xf1, 0xb5, 0xdc, 0x77, 0x8f, 0xaf, 0xe5, 0xbe, 0x77, - 0x7c, 0x2d, 0xf7, 0xc3, 0xe3, 0x6b, 0xb9, 0xbf, 0xf5, 0x5f, 0xaf, 0xbd, 0xf0, 0x51, 0x41, 0xb5, - 0xed, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x6e, 0x7b, 0xca, 0x8e, 0xea, 0x82, 0x00, 0x00, + // 7560 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x5b, 0x6c, 0x24, 0x57, + 0x76, 0x98, 0x9a, 0x64, 0x93, 0xdd, 0xa7, 0xc9, 0x21, 0x79, 0xe7, 0xd5, 0xe2, 0x8c, 0x86, 0xe3, + 0x92, 0x25, 0x68, 0x12, 0x99, 0xb4, 0x66, 0xa4, 0x44, 0xb6, 0xac, 0x07, 0x9b, 0xaf, 0xa1, 0x66, + 0xf8, 0xd0, 0x69, 0xce, 0x4c, 0xac, 0x11, 0xa4, 0x14, 0xbb, 0x2f, 0xbb, 0x6b, 0xd8, 0x5d, 0xd5, + 0xaa, 0xaa, 0x26, 0x45, 0xc9, 0x41, 0xd6, 0x8b, 0x38, 0x1b, 0xc7, 0x36, 0x90, 0x20, 0x70, 0xb2, + 0x81, 0x91, 0x17, 0x10, 0x23, 0x3f, 0x36, 0x82, 0x20, 0x9f, 0x01, 0xfc, 0x11, 0x24, 0xc1, 0xc6, + 0x40, 0x80, 0x0d, 0xf2, 0x91, 0x05, 0x62, 0x70, 0x57, 0xcc, 0xcf, 0x2e, 0x92, 0xcd, 0x22, 0x1f, + 0x41, 0x80, 0x41, 0x80, 0x04, 0xf7, 0x59, 0xb7, 0xaa, 0xab, 0x67, 0xc8, 0x6a, 0xce, 0x60, 0x91, + 0xdd, 0xbf, 0xae, 0x73, 0xce, 0x3d, 0xe7, 0xbe, 0xef, 0x79, 0xdd, 0xdb, 0xb0, 0xd8, 0x70, 0xc2, + 0x66, 0x77, 0x67, 0xae, 0xe6, 0xb5, 0xe7, 0x6d, 0xbf, 0xe1, 0x75, 0x7c, 0xef, 0x11, 0xff, 0x31, + 0xdf, 0xd9, 0x6b, 0xcc, 0xdb, 0x1d, 0x27, 0x98, 0x3f, 0xf0, 0xfc, 0xbd, 0xdd, 0x96, 0x77, 0x30, + 0xbf, 0xff, 0x86, 0xdd, 0xea, 0x34, 0xed, 0x37, 0xe6, 0x1b, 0xd4, 0xa5, 0xbe, 0x1d, 0xd2, 0xfa, + 0x5c, 0xc7, 0xf7, 0x42, 0x8f, 0xdc, 0x8a, 0x98, 0xcc, 0x29, 0x26, 0xfc, 0xc7, 0x5c, 0x67, 0xaf, + 0x31, 0xc7, 0x98, 0xcc, 0x29, 0x26, 0x73, 0x8a, 0xc9, 0xcc, 0x2f, 0x19, 0x92, 0x1b, 0x1e, 0x13, + 0xc8, 0x78, 0xed, 0x74, 0x77, 0xf9, 0x17, 0xff, 0xe0, 0xbf, 0x84, 0x8c, 0x19, 0x6b, 0xef, 0xed, + 0x60, 0xce, 0xf1, 0x58, 0x95, 0xe6, 0x6b, 0x9e, 0x4f, 0xe7, 0xf7, 0x7b, 0xea, 0x31, 0x73, 0xc3, + 0xa0, 0xe9, 0x78, 0x2d, 0xa7, 0x76, 0x38, 0xbf, 0xff, 0xc6, 0x0e, 0x0d, 0x7b, 0xab, 0x3c, 0xf3, + 0x66, 0x44, 0xda, 0xb6, 0x6b, 0x4d, 0xc7, 0xa5, 0xfe, 0x61, 0xd4, 0xe4, 0x36, 0x0d, 0xed, 0x34, + 0x01, 0xf3, 0xfd, 0x4a, 0xf9, 0x5d, 0x37, 0x74, 0xda, 0xb4, 0xa7, 0xc0, 0x5f, 0x78, 0x5a, 0x81, + 0xa0, 0xd6, 0xa4, 0x6d, 0xbb, 0xa7, 0xdc, 0xad, 0x7e, 0xe5, 0xba, 0xa1, 0xd3, 0x9a, 0x77, 0xdc, + 0x30, 0x08, 0xfd, 0x64, 0x21, 0x6b, 0x19, 0x46, 0x17, 0xda, 0x5e, 0xd7, 0x0d, 0xc9, 0x3b, 0x90, + 0xdf, 0xb7, 0x5b, 0x5d, 0x5a, 0xce, 0x5d, 0xcf, 0xbd, 0x56, 0xac, 0xbc, 0xf2, 0x9d, 0xa3, 0xd9, + 0x17, 0x8e, 0x8f, 0x66, 0xf3, 0xf7, 0x19, 0xf0, 0xf1, 0xd1, 0xec, 0x05, 0xea, 0xd6, 0xbc, 0xba, + 0xe3, 0x36, 0xe6, 0x1f, 0x05, 0x9e, 0x3b, 0xb7, 0xd1, 0x6d, 0xef, 0x50, 0x1f, 0x45, 0x19, 0xeb, + 0x8f, 0x86, 0x60, 0x72, 0xc1, 0xaf, 0x35, 0x9d, 0x7d, 0x5a, 0x0d, 0x19, 0xff, 0xc6, 0x21, 0x79, + 0x08, 0xc3, 0xa1, 0xed, 0x73, 0x76, 0xa5, 0x9b, 0x1f, 0xcc, 0x65, 0x18, 0xef, 0xb9, 0x6d, 0xdb, + 0x57, 0xec, 0x2a, 0x63, 0xc7, 0x47, 0xb3, 0xc3, 0xdb, 0xb6, 0x8f, 0x8c, 0x2b, 0xf9, 0x0c, 0x46, + 0x5c, 0xcf, 0xa5, 0xe5, 0x21, 0xce, 0x7d, 0x21, 0x13, 0xf7, 0x0d, 0xcf, 0xd5, 0xb5, 0xad, 0x14, + 0x8e, 0x8f, 0x66, 0x47, 0x18, 0x04, 0x39, 0x63, 0x56, 0xfb, 0x2f, 0x9d, 0x4e, 0x79, 0x78, 0x80, + 0xda, 0x7f, 0xec, 0x74, 0xe2, 0xb5, 0xff, 0xd8, 0xe9, 0x20, 0xe3, 0x6a, 0xfd, 0x24, 0x07, 0xc5, + 0x05, 0xbf, 0xd1, 0x6d, 0x53, 0x37, 0x0c, 0x88, 0x0f, 0xd0, 0xb1, 0x7d, 0xbb, 0x4d, 0x43, 0xea, + 0x07, 0xe5, 0xdc, 0xf5, 0xe1, 0xd7, 0x4a, 0x37, 0xdf, 0xcb, 0x24, 0x71, 0x4b, 0xb1, 0xa9, 0x10, + 0x39, 0x7c, 0xa0, 0x41, 0x01, 0x1a, 0x52, 0x88, 0x0b, 0x45, 0xdb, 0x0f, 0x9d, 0x5d, 0xbb, 0x16, + 0x06, 0xe5, 0x21, 0x2e, 0xf2, 0xdd, 0x4c, 0x22, 0x17, 0x24, 0x97, 0xca, 0xb4, 0x94, 0x58, 0x54, + 0x90, 0x00, 0x23, 0x11, 0xd6, 0x7f, 0x18, 0x81, 0x82, 0x42, 0x90, 0xeb, 0x30, 0xe2, 0xda, 0x6d, + 0x35, 0xd3, 0xc6, 0x65, 0xc1, 0x91, 0x0d, 0xbb, 0xcd, 0x7a, 0xdf, 0x6e, 0x53, 0x46, 0xd1, 0xb1, + 0xc3, 0x26, 0x1f, 0x5e, 0x83, 0x62, 0xcb, 0x0e, 0x9b, 0xc8, 0x31, 0xe4, 0x2a, 0x8c, 0xb4, 0xbd, + 0x3a, 0xe5, 0x03, 0x94, 0x17, 0xa3, 0xb7, 0xee, 0xd5, 0x29, 0x72, 0x28, 0x2b, 0xbf, 0xeb, 0x7b, + 0xed, 0xf2, 0x48, 0xbc, 0xfc, 0x8a, 0xef, 0xb5, 0x91, 0x63, 0xc8, 0xef, 0xe4, 0x60, 0x4a, 0x55, + 0xef, 0xae, 0x57, 0xb3, 0x43, 0xc7, 0x73, 0xcb, 0x79, 0x3e, 0xda, 0xcb, 0x03, 0x75, 0x84, 0x62, + 0x56, 0x29, 0x4b, 0xa9, 0x53, 0x49, 0x0c, 0xf6, 0x08, 0x26, 0x37, 0x01, 0x1a, 0x2d, 0x6f, 0xc7, + 0x6e, 0xb1, 0x3e, 0x28, 0x8f, 0xf2, 0x5a, 0xeb, 0x21, 0x5c, 0xd5, 0x18, 0x34, 0xa8, 0xc8, 0x1e, + 0x8c, 0xd9, 0x62, 0xc9, 0x95, 0xc7, 0x78, 0xbd, 0x97, 0x32, 0xd6, 0x3b, 0xb6, 0x6c, 0x2b, 0xa5, + 0xe3, 0xa3, 0xd9, 0x31, 0x09, 0x44, 0x25, 0x81, 0xbc, 0x0e, 0x05, 0xaf, 0xc3, 0xaa, 0x6a, 0xb7, + 0xca, 0x85, 0xeb, 0xb9, 0xd7, 0x0a, 0x95, 0x29, 0x59, 0xbd, 0xc2, 0xa6, 0x84, 0xa3, 0xa6, 0x20, + 0x37, 0x60, 0x2c, 0xe8, 0xee, 0xb0, 0xd1, 0x2a, 0x17, 0x79, 0x5b, 0x26, 0x25, 0xf1, 0x58, 0x55, + 0x80, 0x51, 0xe1, 0xc9, 0x5b, 0x50, 0xf2, 0x69, 0xad, 0xeb, 0x07, 0x94, 0x0d, 0x5f, 0x19, 0x38, + 0xef, 0xf3, 0x92, 0xbc, 0x84, 0x11, 0x0a, 0x4d, 0x3a, 0xeb, 0x3f, 0x8e, 0x42, 0x4f, 0xbf, 0x92, + 0x37, 0xa0, 0x24, 0xeb, 0x7b, 0xd7, 0x6b, 0x04, 0x7c, 0x7a, 0x15, 0x2a, 0x93, 0x8c, 0xcf, 0x42, + 0x04, 0x46, 0x93, 0x86, 0x3c, 0x80, 0xa1, 0xe0, 0x96, 0xdc, 0x45, 0xde, 0xcf, 0xd4, 0x7f, 0xd5, + 0x5b, 0x7a, 0x09, 0x8c, 0x1e, 0x1f, 0xcd, 0x0e, 0x55, 0x6f, 0xe1, 0x50, 0x70, 0x8b, 0xed, 0x1f, + 0x0d, 0x27, 0x1c, 0x68, 0xff, 0x58, 0x75, 0x42, 0xcd, 0x9a, 0xef, 0x1f, 0xab, 0x4e, 0x88, 0x8c, + 0x2b, 0xdb, 0xfd, 0x9a, 0x61, 0xd8, 0xe1, 0xd3, 0x3b, 0xeb, 0xee, 0x77, 0x7b, 0x7b, 0x7b, 0x4b, + 0xb3, 0xe7, 0xeb, 0x87, 0x41, 0x90, 0x33, 0x26, 0x5f, 0xb1, 0x9e, 0x14, 0x38, 0xcf, 0x3f, 0x94, + 0xeb, 0xe2, 0xf6, 0x40, 0xeb, 0xc2, 0xf3, 0x0f, 0xb5, 0x38, 0x39, 0x26, 0x1a, 0x81, 0xa6, 0x34, + 0xde, 0xba, 0xfa, 0x6e, 0xc0, 0x97, 0x41, 0xe6, 0xd6, 0x2d, 0xad, 0x54, 0x13, 0xad, 0x5b, 0x5a, + 0xa9, 0x22, 0x67, 0xcc, 0xc6, 0xc6, 0xb7, 0x0f, 0xe4, 0xaa, 0xc9, 0x36, 0x36, 0x68, 0x1f, 0xc4, + 0xc7, 0x06, 0xed, 0x03, 0x64, 0x5c, 0x19, 0x73, 0x2f, 0x08, 0xf8, 0x22, 0xc9, 0xca, 0x7c, 0xb3, + 0x5a, 0x8d, 0x33, 0xdf, 0xac, 0x56, 0x91, 0x71, 0xe5, 0xb3, 0xaa, 0x16, 0xf0, 0x45, 0x95, 0x79, + 0x56, 0x2d, 0x26, 0x98, 0xaf, 0x2e, 0x56, 0x91, 0x71, 0xb5, 0x3e, 0x87, 0x8b, 0x0a, 0x83, 0xb4, + 0xe3, 0x05, 0x0e, 0x1f, 0x1a, 0xba, 0x4b, 0xe6, 0xa1, 0x58, 0xf3, 0xdc, 0x5d, 0xa7, 0xb1, 0x6e, + 0x77, 0xe4, 0xa6, 0xad, 0x77, 0xfb, 0x45, 0x85, 0xc0, 0x88, 0x86, 0xbc, 0x04, 0xc3, 0x7b, 0xf4, + 0x50, 0xee, 0xde, 0x25, 0x49, 0x3a, 0x7c, 0x87, 0x1e, 0x22, 0x83, 0xff, 0x6a, 0xe1, 0xdb, 0xff, + 0x78, 0xf6, 0x85, 0x6f, 0xfc, 0xd9, 0xf5, 0x17, 0xac, 0x3f, 0x1c, 0x82, 0x2b, 0xa9, 0x32, 0xab, + 0xa1, 0x1d, 0x76, 0x03, 0xf2, 0x8f, 0x72, 0x70, 0xd1, 0x4e, 0xc3, 0x4b, 0xb5, 0xe2, 0xc3, 0x81, + 0xa6, 0x64, 0x8c, 0x63, 0xe5, 0x25, 0x59, 0xcf, 0xf4, 0x4e, 0xc0, 0xf4, 0x7a, 0xb0, 0xbe, 0x61, + 0x27, 0x56, 0xd0, 0xb1, 0x6b, 0x54, 0x36, 0x58, 0xf7, 0xcd, 0x86, 0x42, 0x60, 0x44, 0xc3, 0xf6, + 0xc6, 0x3a, 0xdd, 0xb5, 0xbb, 0x2d, 0xb1, 0x39, 0x14, 0xa2, 0xbd, 0x71, 0x49, 0x80, 0x51, 0xe1, + 0x8d, 0x7e, 0xfa, 0x93, 0x1c, 0x9c, 0x4f, 0x59, 0x48, 0xac, 0xa3, 0xbb, 0x7e, 0x4b, 0x8e, 0x89, + 0xee, 0xe8, 0x7b, 0x78, 0x17, 0x19, 0x9c, 0x7c, 0x2b, 0x07, 0x93, 0xc6, 0xca, 0x5a, 0xe8, 0xca, + 0x23, 0x35, 0xfb, 0x59, 0x11, 0xe3, 0x55, 0xb9, 0x2c, 0x25, 0x4e, 0x26, 0x10, 0x98, 0x94, 0x6a, + 0xfd, 0xe7, 0x1c, 0x24, 0x89, 0x88, 0x0d, 0xe7, 0xba, 0x01, 0xf5, 0x59, 0xd7, 0x54, 0x69, 0xcd, + 0xa7, 0xa1, 0x1c, 0xd4, 0x57, 0xe6, 0x84, 0x26, 0xcb, 0x6a, 0x31, 0xc7, 0xf4, 0xf6, 0xb9, 0xfd, + 0x37, 0xe6, 0x04, 0xc5, 0x1d, 0x7a, 0x58, 0xa5, 0x2d, 0xca, 0x78, 0x54, 0xc8, 0xf1, 0xd1, 0xec, + 0xb9, 0x7b, 0x31, 0x06, 0x98, 0x60, 0xc8, 0x44, 0x74, 0xec, 0x20, 0x38, 0xf0, 0xfc, 0xba, 0x14, + 0x31, 0x74, 0x6a, 0x11, 0x5b, 0x31, 0x06, 0x98, 0x60, 0x68, 0xfd, 0x9b, 0x1c, 0x8c, 0x55, 0xec, + 0xda, 0x9e, 0xb7, 0xbb, 0xcb, 0x4e, 0xc9, 0x7a, 0xd7, 0x17, 0xba, 0x84, 0x18, 0x13, 0x7d, 0x4a, + 0x2e, 0x49, 0x38, 0x6a, 0x0a, 0xb2, 0x0d, 0xa3, 0xa2, 0x3b, 0x64, 0xa5, 0x7e, 0xd9, 0xa8, 0x94, + 0xd6, 0xe0, 0xf9, 0x70, 0x30, 0x0d, 0x7e, 0x4e, 0x68, 0xf0, 0x73, 0x6b, 0x6e, 0xb8, 0xc9, 0xb4, + 0x62, 0xc7, 0x6d, 0x54, 0xe0, 0xf8, 0x68, 0x76, 0x74, 0x85, 0xf3, 0x40, 0xc9, 0x8b, 0x1d, 0xa8, + 0x6d, 0xfb, 0x0b, 0x25, 0x8e, 0xcf, 0xb1, 0x62, 0x74, 0xa0, 0xae, 0x47, 0x28, 0x34, 0xe9, 0xac, + 0x4f, 0x21, 0xbf, 0x68, 0xd7, 0x9a, 0x94, 0xdc, 0x4b, 0x2e, 0xf6, 0xd2, 0xcd, 0xd7, 0xd2, 0x7a, + 0x4b, 0x2f, 0x7c, 0xb3, 0xc3, 0x26, 0xfa, 0x6d, 0x09, 0xd6, 0x0f, 0x73, 0x70, 0x79, 0xb1, 0xd5, + 0x0d, 0x42, 0xea, 0x3f, 0x90, 0xf3, 0x6a, 0x9b, 0xb6, 0x3b, 0x2d, 0x3b, 0xa4, 0xe4, 0x2f, 0x43, + 0x81, 0x59, 0x4f, 0x75, 0x3b, 0xb4, 0xa5, 0xc4, 0xfe, 0x5d, 0xc1, 0x67, 0x26, 0xa3, 0x66, 0x75, + 0xd8, 0xdc, 0x79, 0x44, 0x6b, 0xe1, 0x3a, 0x0d, 0xed, 0x48, 0x5b, 0x8a, 0x60, 0xa8, 0xb9, 0x92, + 0x3d, 0x18, 0x09, 0x3a, 0xb4, 0x26, 0x3b, 0x7a, 0x2d, 0xd3, 0xe4, 0x4f, 0x56, 0xbb, 0xda, 0xa1, + 0xb5, 0x48, 0xb5, 0x64, 0x5f, 0xc8, 0x85, 0x58, 0xff, 0x23, 0x07, 0x57, 0xfa, 0x34, 0xf5, 0xae, + 0x13, 0x84, 0xe4, 0x93, 0x9e, 0xe6, 0xce, 0x9d, 0xac, 0xb9, 0xac, 0x34, 0x6f, 0xac, 0x9e, 0x55, + 0x0a, 0x62, 0x34, 0xf5, 0x73, 0xc8, 0x3b, 0x21, 0x6d, 0x2b, 0xad, 0xfe, 0x6e, 0xa6, 0xb6, 0xf6, + 0xa9, 0x7e, 0x65, 0x42, 0x59, 0x85, 0x6b, 0x4c, 0x04, 0x0a, 0x49, 0xd6, 0xbf, 0xcf, 0x01, 0x1b, + 0xf4, 0xba, 0x23, 0xb5, 0xb0, 0x91, 0xf0, 0xb0, 0xa3, 0xb4, 0x7b, 0xb5, 0xab, 0x8e, 0x6c, 0x1f, + 0x76, 0x98, 0x19, 0x39, 0xa1, 0x09, 0x19, 0x00, 0x39, 0x29, 0xf9, 0x14, 0x46, 0x03, 0xbe, 0xe1, + 0xcb, 0x1d, 0x74, 0x45, 0x16, 0x1a, 0x15, 0xc7, 0xc0, 0xe3, 0xa3, 0xd9, 0x13, 0xd9, 0xde, 0x73, + 0x9a, 0xb7, 0x28, 0x87, 0x92, 0x2b, 0xdb, 0x73, 0xdb, 0x34, 0x08, 0xec, 0x06, 0x95, 0xeb, 0x41, + 0xef, 0xb9, 0xeb, 0x02, 0x8c, 0x0a, 0x6f, 0xfd, 0x3a, 0xc0, 0xa2, 0xe7, 0x86, 0x8e, 0xdb, 0xa5, + 0x9b, 0x2e, 0x79, 0x19, 0xf2, 0xd4, 0xf7, 0x3d, 0x5f, 0xea, 0x92, 0xba, 0xf9, 0xcb, 0x0c, 0x88, + 0x02, 0x47, 0x5e, 0x65, 0xeb, 0xd8, 0x69, 0xd1, 0x3a, 0xaf, 0x7d, 0xa1, 0x72, 0x4e, 0xd5, 0x7e, + 0x85, 0x43, 0x51, 0x62, 0xad, 0x39, 0x18, 0x5b, 0x64, 0xa6, 0x36, 0xf5, 0x19, 0x5f, 0xd3, 0xd8, + 0x9e, 0x88, 0x19, 0xdb, 0xca, 0xa8, 0xde, 0x86, 0x8b, 0x8b, 0x3e, 0x65, 0x33, 0xed, 0x56, 0xa5, + 0x5b, 0xdb, 0xa3, 0xa1, 0xd0, 0xb4, 0x03, 0xf2, 0x0e, 0x4c, 0x78, 0x7c, 0x96, 0xdf, 0xf5, 0x6a, + 0x7b, 0x8e, 0xdb, 0x90, 0x07, 0xc9, 0x45, 0xc9, 0x65, 0x62, 0xd3, 0x44, 0x62, 0x9c, 0xd6, 0xfa, + 0xd3, 0x21, 0x18, 0x5f, 0xf4, 0x3d, 0x57, 0x8d, 0xed, 0x73, 0x58, 0x7d, 0x8d, 0xd8, 0xea, 0xcb, + 0x66, 0x5e, 0x99, 0x55, 0xee, 0xb7, 0xf2, 0x88, 0xa7, 0xe7, 0x91, 0xd0, 0xbb, 0x57, 0x07, 0x17, + 0xc5, 0xd9, 0x45, 0x43, 0x1a, 0x9f, 0x58, 0xd6, 0xf7, 0x72, 0x30, 0x65, 0x92, 0x3f, 0x87, 0xf5, + 0xbd, 0x1b, 0x5f, 0xdf, 0x0b, 0x03, 0x37, 0xb1, 0xcf, 0xa2, 0xfe, 0x3f, 0xf9, 0x78, 0xd3, 0x58, + 0x37, 0x33, 0xab, 0x79, 0xfc, 0xc0, 0x00, 0xc8, 0xf6, 0x2d, 0x0c, 0xb4, 0xa1, 0xf2, 0xe1, 0xfc, + 0x45, 0x59, 0x89, 0x71, 0x13, 0xfa, 0x38, 0xf1, 0x8d, 0x31, 0xe1, 0xec, 0xb8, 0x0d, 0x6a, 0x4d, + 0x5a, 0xef, 0xb6, 0x94, 0xea, 0xa5, 0x3b, 0xae, 0x2a, 0xe1, 0xa8, 0x29, 0xc8, 0x27, 0x30, 0x5d, + 0xf3, 0xdc, 0x5a, 0xd7, 0xf7, 0xa9, 0x5b, 0x3b, 0xdc, 0xe2, 0xbe, 0x3e, 0xb9, 0x1d, 0xcc, 0xc9, + 0x62, 0xd3, 0x8b, 0x49, 0x82, 0xc7, 0x69, 0x40, 0xec, 0x65, 0x24, 0x4c, 0xde, 0xa0, 0x43, 0xdd, + 0x3a, 0xb7, 0xca, 0x0a, 0xa6, 0xc9, 0xcb, 0xc1, 0xa8, 0xf0, 0xe4, 0x1e, 0x5c, 0x0e, 0x42, 0xa6, + 0x20, 0xb9, 0x8d, 0x25, 0x6a, 0xd7, 0x5b, 0x8e, 0xcb, 0xd4, 0x15, 0xcf, 0xad, 0x07, 0xdc, 0xd0, + 0x1a, 0xae, 0x5c, 0x39, 0x3e, 0x9a, 0xbd, 0x5c, 0x4d, 0x27, 0xc1, 0x7e, 0x65, 0xc9, 0xa7, 0x30, + 0x13, 0x74, 0x6b, 0x35, 0x1a, 0x04, 0xbb, 0xdd, 0xd6, 0x87, 0xde, 0x4e, 0x70, 0xdb, 0x09, 0x98, + 0xae, 0x75, 0xd7, 0x69, 0x3b, 0x21, 0x37, 0xa6, 0xf2, 0x95, 0x6b, 0xc7, 0x47, 0xb3, 0x33, 0xd5, + 0xbe, 0x54, 0xf8, 0x04, 0x0e, 0x04, 0xe1, 0x92, 0xd8, 0xc8, 0x7a, 0x78, 0x8f, 0x71, 0xde, 0x33, + 0xc7, 0x47, 0xb3, 0x97, 0x56, 0x52, 0x29, 0xb0, 0x4f, 0x49, 0x36, 0x82, 0xa1, 0xd3, 0xa6, 0x5f, + 0x7a, 0x2e, 0xe5, 0x16, 0x93, 0x31, 0x82, 0xdb, 0x12, 0x8e, 0x9a, 0x82, 0x3c, 0x8a, 0x26, 0x1f, + 0x5b, 0x14, 0xd2, 0x0c, 0x3a, 0xfd, 0x6e, 0x75, 0xe1, 0xf8, 0x68, 0x76, 0xea, 0x81, 0xc1, 0x89, + 0x2d, 0x2c, 0x8c, 0xf1, 0xb6, 0xfe, 0xdd, 0x10, 0x90, 0xde, 0x8d, 0x80, 0xdc, 0x81, 0x51, 0xbb, + 0x16, 0x3a, 0xfb, 0x54, 0xfa, 0xe9, 0x5e, 0x4e, 0x53, 0x8d, 0x84, 0x28, 0xa4, 0xbb, 0x94, 0xcd, + 0x10, 0x1a, 0xed, 0x1e, 0x0b, 0xbc, 0x28, 0x4a, 0x16, 0xc4, 0x83, 0xe9, 0x96, 0x1d, 0x84, 0x6a, + 0xae, 0xd6, 0x59, 0x93, 0xe5, 0x26, 0xf9, 0xe7, 0x4e, 0xd6, 0x28, 0x56, 0xa2, 0x72, 0x91, 0xcd, + 0xdc, 0xbb, 0x49, 0x46, 0xd8, 0xcb, 0x9b, 0xf8, 0x00, 0x35, 0x75, 0x44, 0xb2, 0x3d, 0x32, 0xbb, + 0xa7, 0x51, 0x9f, 0xb4, 0xd1, 0xd6, 0xaf, 0x41, 0x01, 0x1a, 0x52, 0xac, 0x1f, 0x8f, 0xc2, 0xd8, + 0xd2, 0xc2, 0xea, 0xb6, 0x1d, 0xec, 0x9d, 0xc0, 0xf1, 0xc7, 0x26, 0x84, 0x54, 0x36, 0x92, 0x4b, + 0x5a, 0x29, 0x21, 0xa8, 0x29, 0x88, 0x07, 0x45, 0x5b, 0xb9, 0x51, 0xe5, 0x96, 0xff, 0x5e, 0x46, + 0xc3, 0x46, 0x72, 0x31, 0xdd, 0x98, 0x12, 0x84, 0x91, 0x0c, 0x12, 0x40, 0x49, 0x09, 0x67, 0x46, + 0xe8, 0xc8, 0x20, 0xbe, 0xed, 0x88, 0x8f, 0xf0, 0x87, 0x18, 0x00, 0x34, 0xa5, 0x90, 0x37, 0x61, + 0xbc, 0x4e, 0xd9, 0xce, 0x41, 0xdd, 0x9a, 0x43, 0xd9, 0x26, 0x31, 0xcc, 0xfa, 0x85, 0x6d, 0x96, + 0x4b, 0x06, 0x1c, 0x63, 0x54, 0xe4, 0x11, 0x14, 0x0f, 0x9c, 0xb0, 0xc9, 0xf7, 0xf4, 0xf2, 0x28, + 0x1f, 0xea, 0x5f, 0xc9, 0x54, 0x51, 0xc6, 0x21, 0xea, 0x96, 0x07, 0x8a, 0x27, 0x46, 0xec, 0x99, + 0x11, 0xcc, 0x3e, 0xb8, 0xaf, 0x99, 0xef, 0x06, 0xc5, 0x78, 0x01, 0x8e, 0xc0, 0x88, 0x86, 0x04, + 0x30, 0xce, 0x3e, 0xaa, 0xf4, 0xf3, 0x2e, 0x5b, 0x21, 0xd2, 0x5b, 0x92, 0xcd, 0x03, 0xad, 0x98, + 0x88, 0x1e, 0x79, 0x60, 0xb0, 0xc5, 0x98, 0x10, 0x36, 0xfb, 0x0e, 0x9a, 0xd4, 0x95, 0x2e, 0x49, + 0x3d, 0xfb, 0x1e, 0x34, 0xa9, 0x8b, 0x1c, 0x43, 0x3c, 0xbe, 0x3e, 0xa4, 0xf2, 0xc7, 0x7d, 0x91, + 0x59, 0xbd, 0x82, 0x91, 0x0e, 0x59, 0x39, 0x27, 0x17, 0x87, 0xfc, 0x46, 0x43, 0x04, 0x53, 0x1d, + 0x3d, 0x77, 0xf9, 0x0b, 0x27, 0x2c, 0x97, 0x78, 0xa5, 0xf4, 0x4e, 0xb1, 0xc9, 0xa1, 0x28, 0xb1, + 0xc2, 0x69, 0xc0, 0x06, 0x37, 0x28, 0x8f, 0xc7, 0x15, 0x58, 0x31, 0x03, 0x02, 0x54, 0x78, 0xeb, + 0x5f, 0xe7, 0xa0, 0xc4, 0xd6, 0x9b, 0x5a, 0x23, 0xaf, 0xc2, 0x68, 0x68, 0xfb, 0x0d, 0x69, 0x5d, + 0x1b, 0x22, 0xb6, 0x39, 0x14, 0x25, 0x96, 0xd8, 0x90, 0x0f, 0xed, 0x60, 0x4f, 0xe9, 0x15, 0xbf, + 0x96, 0xa9, 0xd9, 0x72, 0xa1, 0x47, 0x2a, 0x05, 0xfb, 0x0a, 0x50, 0x70, 0x26, 0xaf, 0x41, 0x81, + 0x9d, 0x03, 0x2b, 0x76, 0xa0, 0x7c, 0x1f, 0xe3, 0x6c, 0x61, 0xaf, 0x48, 0x18, 0x6a, 0xac, 0xf5, + 0x16, 0xe4, 0x97, 0xf7, 0xa9, 0xcb, 0x0f, 0x88, 0x40, 0x1a, 0x97, 0x49, 0x8b, 0x5a, 0x19, 0x9d, + 0xa8, 0x29, 0xac, 0x4f, 0xe0, 0xdc, 0xf2, 0x17, 0xb4, 0xd6, 0x0d, 0x3d, 0x5f, 0x18, 0xa1, 0xe4, + 0x43, 0x20, 0x01, 0xf5, 0xf7, 0x9d, 0x1a, 0x5d, 0xa8, 0xd5, 0x98, 0xf2, 0xbd, 0x11, 0xed, 0x3f, + 0x33, 0x92, 0x13, 0xa9, 0xf6, 0x50, 0x60, 0x4a, 0x29, 0xeb, 0x1f, 0xe4, 0xa0, 0x64, 0x78, 0xcf, + 0xd8, 0xee, 0xd3, 0x58, 0xac, 0x0a, 0xd5, 0x5c, 0x2a, 0x42, 0xef, 0x65, 0x75, 0xc9, 0x09, 0x2e, + 0xd1, 0xaa, 0xd1, 0x20, 0x8c, 0x64, 0x3c, 0xc5, 0xad, 0x66, 0xfd, 0x8b, 0x1c, 0x44, 0xe5, 0xd8, + 0xb8, 0xef, 0x44, 0x55, 0x33, 0xc6, 0x5d, 0xf2, 0x95, 0x58, 0xf2, 0x1b, 0x70, 0x39, 0xde, 0x56, + 0x6e, 0xcf, 0x9f, 0xde, 0x57, 0x22, 0x94, 0x96, 0x74, 0x4e, 0xd8, 0x4f, 0x84, 0x75, 0x1f, 0xf2, + 0xab, 0x76, 0xb7, 0x41, 0x4f, 0x64, 0x11, 0xb1, 0x09, 0xe4, 0x53, 0xbb, 0x15, 0xaa, 0x73, 0x52, + 0x4e, 0x20, 0x94, 0x30, 0xd4, 0x58, 0xeb, 0x8f, 0x46, 0xa0, 0x64, 0xf8, 0xcf, 0xd9, 0xda, 0xf7, + 0x69, 0xc7, 0x4b, 0x9e, 0x3c, 0x48, 0x3b, 0x1e, 0x72, 0x0c, 0x9b, 0x69, 0x3e, 0xdd, 0x77, 0x02, + 0xc7, 0x73, 0x93, 0x27, 0x0f, 0x4a, 0x38, 0x6a, 0x0a, 0x32, 0x0b, 0xf9, 0x3a, 0xed, 0x84, 0x4d, + 0x3e, 0x8f, 0x47, 0x2a, 0x45, 0x56, 0xd5, 0x25, 0x06, 0x40, 0x01, 0x67, 0x04, 0xbb, 0x34, 0xac, + 0x35, 0xcb, 0x23, 0x7c, 0xb7, 0xe6, 0x04, 0x2b, 0x0c, 0x80, 0x02, 0x9e, 0xe2, 0xfd, 0xca, 0x3f, + 0x7b, 0xef, 0xd7, 0xe8, 0x19, 0x7b, 0xbf, 0x48, 0x07, 0xce, 0x07, 0x41, 0x73, 0xcb, 0x77, 0xf6, + 0xed, 0x90, 0x46, 0x33, 0x67, 0xec, 0x34, 0x72, 0x2e, 0x1f, 0x1f, 0xcd, 0x9e, 0xaf, 0x56, 0x6f, + 0x27, 0xb9, 0x60, 0x1a, 0x6b, 0x52, 0x85, 0x8b, 0x8e, 0x1b, 0xd0, 0x5a, 0xd7, 0xa7, 0x6b, 0x0d, + 0xd7, 0xf3, 0xe9, 0x6d, 0x2f, 0x60, 0xec, 0x64, 0x58, 0x4a, 0x7b, 0x71, 0xd7, 0xd2, 0x88, 0x30, + 0xbd, 0xac, 0xf5, 0xa7, 0x39, 0x18, 0x37, 0x43, 0x06, 0x24, 0x00, 0x68, 0x2e, 0xad, 0x54, 0xc5, + 0x2e, 0x22, 0x17, 0xf7, 0xfb, 0x99, 0x23, 0x11, 0x82, 0x4d, 0xa4, 0x2a, 0x45, 0x30, 0x34, 0xc4, + 0x9c, 0x20, 0xea, 0xf9, 0x32, 0xe4, 0x77, 0x3d, 0xbf, 0x46, 0xe5, 0xf6, 0xa9, 0x57, 0xc9, 0x0a, + 0x03, 0xa2, 0xc0, 0x59, 0x3f, 0xcc, 0x81, 0x21, 0x81, 0xfc, 0x55, 0x98, 0x60, 0x32, 0xee, 0xf8, + 0x3b, 0xb1, 0xd6, 0x54, 0x32, 0xb7, 0x46, 0x73, 0x8a, 0x3c, 0x0e, 0x31, 0x30, 0xc6, 0xe5, 0x91, + 0x3f, 0x0f, 0x45, 0xbb, 0x5e, 0xf7, 0x69, 0x10, 0x50, 0x71, 0xba, 0x14, 0x85, 0x9f, 0x70, 0x41, + 0x01, 0x31, 0xc2, 0xb3, 0x65, 0xd8, 0xac, 0xef, 0x06, 0x6c, 0x66, 0x4b, 0xe3, 0x4c, 0x2f, 0x43, + 0x26, 0x84, 0xc1, 0x51, 0x53, 0x58, 0xbf, 0x37, 0x02, 0x71, 0xd9, 0xa4, 0x0e, 0x93, 0x7b, 0xfe, + 0xce, 0x22, 0xf7, 0x65, 0x66, 0xf1, 0x2a, 0x9f, 0x3f, 0x3e, 0x9a, 0x9d, 0xbc, 0x13, 0xe7, 0x80, + 0x49, 0x96, 0x52, 0xca, 0x1d, 0x7a, 0x18, 0xda, 0x3b, 0x59, 0x36, 0x4b, 0x25, 0xc5, 0xe4, 0x80, + 0x49, 0x96, 0xe4, 0x2d, 0x28, 0xed, 0xf9, 0x3b, 0x6a, 0x91, 0x27, 0x5d, 0xb9, 0x77, 0x22, 0x14, + 0x9a, 0x74, 0xac, 0x0b, 0xf7, 0xfc, 0x1d, 0xb6, 0x29, 0xaa, 0x00, 0xb8, 0xee, 0xc2, 0x3b, 0x12, + 0x8e, 0x9a, 0x82, 0x74, 0x80, 0xec, 0xa9, 0xde, 0xd3, 0x9e, 0x5b, 0xb9, 0x17, 0x9d, 0xdc, 0xf1, + 0x7b, 0x89, 0x9d, 0xa3, 0x77, 0x7a, 0xf8, 0x60, 0x0a, 0x6f, 0xf2, 0xeb, 0x70, 0x79, 0xcf, 0xdf, + 0x91, 0x47, 0xc5, 0x96, 0xef, 0xb8, 0x35, 0xa7, 0x13, 0x8b, 0x7c, 0xcf, 0xca, 0xea, 0x5e, 0xbe, + 0x93, 0x4e, 0x86, 0xfd, 0xca, 0x5b, 0xbf, 0xcf, 0xd6, 0xb1, 0x11, 0xd8, 0x7c, 0x5a, 0x80, 0x64, + 0x17, 0xc6, 0x9a, 0xd4, 0xae, 0x53, 0x5f, 0xa9, 0x3d, 0xef, 0x64, 0x5b, 0x15, 0x9c, 0x47, 0xa4, + 0x94, 0x89, 0xef, 0x00, 0x15, 0x73, 0x6b, 0x13, 0x46, 0x05, 0xec, 0x04, 0x26, 0x90, 0x3e, 0x09, + 0x87, 0x9e, 0xe0, 0x1b, 0xfc, 0x76, 0x0e, 0x8a, 0xdc, 0x92, 0x6e, 0x30, 0x75, 0x5a, 0x17, 0x19, + 0x7e, 0xc2, 0xe1, 0xb9, 0x0b, 0x63, 0xe2, 0xc8, 0x0f, 0xf8, 0x99, 0x94, 0xb5, 0xad, 0x22, 0x5d, + 0x28, 0x6a, 0xab, 0x50, 0x27, 0x02, 0x54, 0xcc, 0xad, 0xff, 0x9e, 0x83, 0xd1, 0x35, 0xb7, 0xd3, + 0xfd, 0x19, 0xc9, 0x6c, 0x59, 0x87, 0x11, 0x66, 0x04, 0xc5, 0xf3, 0xa7, 0xc6, 0x2b, 0xaf, 0x98, + 0xb9, 0x53, 0xe5, 0x78, 0xee, 0x14, 0xda, 0x07, 0xca, 0xef, 0x2c, 0xca, 0x18, 0x91, 0xbe, 0x16, + 0x8c, 0xdc, 0x75, 0xdc, 0xbd, 0x93, 0xcd, 0x93, 0xa0, 0xe6, 0x75, 0x7a, 0xe6, 0x49, 0x95, 0x01, + 0x51, 0xe0, 0xd4, 0xfc, 0x1f, 0x4e, 0x9f, 0xff, 0xd6, 0x37, 0x73, 0x30, 0xbd, 0x4e, 0xdb, 0x9e, + 0xf3, 0xa5, 0x1d, 0xb9, 0xcd, 0x59, 0xa1, 0xa6, 0x13, 0x4a, 0x9f, 0xb7, 0x2e, 0x74, 0xdb, 0x09, + 0x91, 0xc1, 0x9f, 0xa2, 0x86, 0xf2, 0x68, 0x31, 0xdb, 0x2a, 0x37, 0xa2, 0x3d, 0x2b, 0x8a, 0x16, + 0x2b, 0x04, 0x46, 0x34, 0xd6, 0x1f, 0xe7, 0x60, 0x4c, 0x54, 0x82, 0x2a, 0xde, 0xb9, 0x3e, 0xbc, + 0x1f, 0x42, 0x9e, 0x97, 0x93, 0xbb, 0xed, 0xaf, 0x66, 0xb3, 0xcd, 0x18, 0x07, 0xa1, 0x91, 0xf1, + 0x9f, 0x28, 0x78, 0x32, 0x8d, 0xb9, 0x6d, 0x7f, 0xb1, 0xa0, 0x83, 0x04, 0x5a, 0x63, 0x5e, 0xe7, + 0x50, 0x94, 0x58, 0xeb, 0x1b, 0xc3, 0x50, 0x50, 0x5e, 0x23, 0xf2, 0x5b, 0x39, 0x28, 0xd9, 0xae, + 0xeb, 0x85, 0xb6, 0x70, 0xaa, 0x88, 0x49, 0xbe, 0x91, 0xa9, 0x62, 0x8a, 0xe9, 0xdc, 0x42, 0xc4, + 0x70, 0xd9, 0x0d, 0xfd, 0xc3, 0x68, 0xd3, 0x37, 0x30, 0x68, 0xca, 0x25, 0x9f, 0xc3, 0x68, 0xcb, + 0xde, 0xa1, 0x2d, 0x35, 0xe7, 0xd7, 0x06, 0xab, 0xc1, 0x5d, 0xce, 0x4b, 0x08, 0xd7, 0xfd, 0x20, + 0x80, 0x28, 0x05, 0xcd, 0xbc, 0x07, 0x53, 0xc9, 0x8a, 0x92, 0x29, 0x63, 0xfc, 0xc4, 0x90, 0x5d, + 0x88, 0x6d, 0x67, 0x6a, 0xc2, 0x0f, 0xbd, 0x9d, 0x9b, 0xf9, 0x15, 0x28, 0x19, 0x62, 0x4e, 0x53, + 0xd4, 0xfa, 0x08, 0x4a, 0xeb, 0x34, 0xf4, 0x9d, 0x1a, 0x67, 0xf0, 0xb4, 0x59, 0x73, 0xa2, 0x1d, + 0xf5, 0x4b, 0x36, 0x09, 0x19, 0xcb, 0x80, 0x78, 0x00, 0x1d, 0xdf, 0x6b, 0xd3, 0xb0, 0x49, 0xbb, + 0x6a, 0x44, 0xb3, 0x29, 0x7f, 0x5b, 0x9a, 0x8d, 0x70, 0x03, 0x44, 0xdf, 0x68, 0x88, 0xb0, 0x6e, + 0x40, 0x7e, 0xbd, 0x1b, 0xd2, 0x2f, 0x9e, 0xbe, 0xea, 0xad, 0x87, 0x30, 0xce, 0x49, 0x6f, 0x7b, + 0x2d, 0xb6, 0xa1, 0xb0, 0xb6, 0xb5, 0xd9, 0x77, 0xd2, 0x6e, 0xe2, 0x44, 0x28, 0x70, 0x6c, 0x66, + 0x37, 0xbd, 0x56, 0x9d, 0xfa, 0xb2, 0x07, 0xf4, 0x88, 0xde, 0xe6, 0x50, 0x94, 0x58, 0xeb, 0x47, + 0x39, 0x28, 0xf1, 0x82, 0x72, 0x23, 0x68, 0xc1, 0x58, 0x53, 0xc8, 0x91, 0xbd, 0x90, 0xcd, 0xd1, + 0x6f, 0x56, 0xd8, 0x38, 0x24, 0x05, 0x00, 0x95, 0x08, 0x26, 0xed, 0xc0, 0x76, 0x42, 0x26, 0x6d, + 0xe8, 0xcc, 0xa5, 0x3d, 0x10, 0x9c, 0x51, 0x89, 0xb0, 0xfe, 0xf9, 0x14, 0xc0, 0x86, 0x57, 0xa7, + 0xb2, 0xa9, 0x33, 0x30, 0xe4, 0xd4, 0x65, 0x27, 0x82, 0x2c, 0x34, 0xb4, 0xb6, 0x84, 0x43, 0x4e, + 0x5d, 0x8f, 0xca, 0x50, 0xdf, 0xbd, 0xf8, 0x2d, 0x28, 0xd5, 0x9d, 0xa0, 0xd3, 0xb2, 0x0f, 0x37, + 0x52, 0x34, 0xb5, 0xa5, 0x08, 0x85, 0x26, 0x1d, 0x79, 0x5d, 0x86, 0x4a, 0x85, 0x96, 0x56, 0x4e, + 0x84, 0x4a, 0x0b, 0xac, 0x7a, 0x46, 0x94, 0xf4, 0x6d, 0x18, 0x57, 0x6e, 0x41, 0x2e, 0x25, 0xcf, + 0x4b, 0x5d, 0x50, 0x81, 0x93, 0x6d, 0x03, 0x87, 0x31, 0xca, 0xa4, 0xdb, 0x72, 0xf4, 0xb9, 0xb8, + 0x2d, 0x97, 0x60, 0x2a, 0x08, 0x3d, 0x9f, 0xd6, 0x15, 0xc5, 0xda, 0x52, 0x99, 0xc4, 0x1a, 0x3a, + 0x55, 0x4d, 0xe0, 0xb1, 0xa7, 0x04, 0xd9, 0x82, 0x0b, 0x07, 0x89, 0x28, 0x34, 0x6f, 0xfc, 0x79, + 0xce, 0xe9, 0xaa, 0xe4, 0x74, 0xe1, 0x41, 0x0a, 0x0d, 0xa6, 0x96, 0x24, 0xef, 0xc0, 0x84, 0xaa, + 0x26, 0x3f, 0x2a, 0xcb, 0x17, 0x38, 0x2b, 0x6d, 0xcb, 0x6c, 0x9b, 0x48, 0x8c, 0xd3, 0x92, 0x5f, + 0x86, 0x7c, 0xa7, 0x69, 0x07, 0x54, 0x7a, 0x39, 0x95, 0x0b, 0x29, 0xbf, 0xc5, 0x80, 0x8f, 0x8f, + 0x66, 0x8b, 0x6c, 0xcc, 0xf8, 0x07, 0x0a, 0x42, 0x72, 0x13, 0x60, 0xc7, 0xeb, 0xba, 0x75, 0xdb, + 0x3f, 0x5c, 0x5b, 0x92, 0x41, 0x0e, 0xad, 0xc3, 0x54, 0x34, 0x06, 0x0d, 0x2a, 0x33, 0x5e, 0x5d, + 0x7c, 0x72, 0xbc, 0x9a, 0x3c, 0x84, 0x22, 0x0f, 0x08, 0xd1, 0xfa, 0x42, 0x28, 0x3d, 0x96, 0xa7, + 0x89, 0x1d, 0xe8, 0x93, 0xb9, 0xaa, 0x98, 0x60, 0xc4, 0x8f, 0x7c, 0x0a, 0xb0, 0xeb, 0xb8, 0x4e, + 0xd0, 0xe4, 0xdc, 0x4b, 0xa7, 0xe6, 0xae, 0xdb, 0xb9, 0xa2, 0xb9, 0xa0, 0xc1, 0x91, 0x7c, 0x02, + 0xd3, 0x34, 0x08, 0x9d, 0xb6, 0x1d, 0xd2, 0xba, 0xce, 0x58, 0x29, 0xf3, 0x18, 0x98, 0x0e, 0xc9, + 0x2d, 0x27, 0x09, 0x1e, 0xa7, 0x01, 0xb1, 0x97, 0x11, 0x79, 0x1b, 0x0a, 0x1d, 0xdf, 0x6b, 0x30, + 0xc3, 0xb2, 0x3c, 0x13, 0x9b, 0x2e, 0x85, 0x2d, 0x09, 0x7f, 0x6c, 0xfc, 0x46, 0x4d, 0x4d, 0xfe, + 0x5b, 0x0e, 0xa6, 0x7d, 0x1a, 0x78, 0x5d, 0xbf, 0x46, 0x03, 0x5d, 0xb1, 0x8b, 0x7c, 0x53, 0xba, + 0x9f, 0x31, 0xd7, 0x5c, 0xed, 0x34, 0x73, 0x98, 0x64, 0x2c, 0x4e, 0x59, 0xaa, 0x1a, 0xdc, 0x83, + 0x7f, 0x9c, 0x06, 0xfc, 0xe6, 0xf7, 0x67, 0x67, 0x7b, 0xaf, 0x37, 0x68, 0xe6, 0x6c, 0xa6, 0xff, + 0xcd, 0xef, 0xcf, 0x4e, 0xa9, 0xef, 0xa8, 0x9f, 0x7a, 0xda, 0xc5, 0x8e, 0x90, 0x8e, 0x57, 0x5f, + 0xdb, 0x92, 0xae, 0x65, 0x7d, 0x84, 0x6c, 0x31, 0x20, 0x0a, 0x1c, 0x79, 0x0d, 0x0a, 0x75, 0x9b, + 0xb6, 0x3d, 0x97, 0xd6, 0xcb, 0x13, 0x91, 0xeb, 0x6d, 0x49, 0xc2, 0x50, 0x63, 0xc9, 0x67, 0x30, + 0xea, 0x70, 0xf5, 0xbf, 0x7c, 0x8e, 0x4f, 0x98, 0x6c, 0x66, 0x86, 0xb0, 0x20, 0x44, 0x86, 0x93, + 0xf8, 0x8d, 0x92, 0x2d, 0xa9, 0xc1, 0x98, 0xd7, 0x0d, 0xb9, 0x84, 0x49, 0x2e, 0x21, 0x9b, 0xaf, + 0x7a, 0x53, 0xf0, 0x10, 0x09, 0xcf, 0xf2, 0x03, 0x15, 0x67, 0xd6, 0xde, 0x5a, 0xd3, 0x69, 0xd5, + 0x7d, 0xea, 0x96, 0xa7, 0xb8, 0xcf, 0x82, 0xb7, 0x77, 0x51, 0xc2, 0x50, 0x63, 0xc9, 0x5f, 0x84, + 0x09, 0xaf, 0x1b, 0xf2, 0xd5, 0xcb, 0x46, 0x39, 0x28, 0x4f, 0x73, 0xf2, 0x69, 0x9e, 0x89, 0x61, + 0x22, 0x30, 0x4e, 0xc7, 0xf6, 0xf3, 0xa6, 0x17, 0x84, 0xec, 0x83, 0x6f, 0x69, 0x97, 0xe2, 0xfb, + 0xf9, 0x6d, 0x03, 0x87, 0x31, 0x4a, 0xf2, 0x3b, 0x39, 0x98, 0x6e, 0x27, 0xd5, 0xf6, 0xf2, 0x65, + 0xde, 0x19, 0x2b, 0x19, 0x15, 0xbf, 0x04, 0x37, 0x11, 0x55, 0xec, 0x01, 0x63, 0xaf, 0x5c, 0x9e, + 0xa4, 0x19, 0x1c, 0xba, 0xb5, 0xa6, 0xef, 0xb9, 0xf1, 0x1a, 0xbd, 0xc8, 0x6b, 0xb4, 0x91, 0x7d, + 0xc5, 0xa4, 0x71, 0xad, 0xbc, 0x78, 0x7c, 0x34, 0x7b, 0x31, 0x15, 0x85, 0xe9, 0xf5, 0x98, 0x59, + 0x82, 0x4b, 0xe9, 0xab, 0xee, 0x69, 0x4a, 0xe7, 0xb0, 0xa9, 0x74, 0xae, 0xc0, 0x8b, 0x7d, 0x2b, + 0xc5, 0xb6, 0x6c, 0xa5, 0xbc, 0xe4, 0xe2, 0x5b, 0x76, 0x8f, 0xe6, 0x71, 0x0e, 0xc6, 0xcd, 0xab, + 0x27, 0x3c, 0xae, 0x60, 0xa4, 0xfc, 0x12, 0x0f, 0x8a, 0x5e, 0xf5, 0x2c, 0xe2, 0x0a, 0x9b, 0xd5, + 0x9e, 0xb8, 0x82, 0x06, 0x61, 0x24, 0xe3, 0x69, 0x71, 0x85, 0x3f, 0x1e, 0x82, 0xa8, 0x1c, 0x79, + 0x1d, 0x0a, 0xd4, 0xad, 0x77, 0x3c, 0xc7, 0x0d, 0x93, 0x11, 0x99, 0x65, 0x09, 0x47, 0x4d, 0x61, + 0x44, 0x21, 0x86, 0x9e, 0x18, 0x85, 0xa8, 0xc3, 0xa4, 0xcd, 0x33, 0x0f, 0x22, 0x1f, 0xf2, 0xf0, + 0xa9, 0x1d, 0x6a, 0x0b, 0x71, 0x0e, 0x98, 0x64, 0xc9, 0xa4, 0x04, 0x51, 0x51, 0x2e, 0x65, 0xe4, + 0xd4, 0x52, 0xaa, 0x71, 0x0e, 0x98, 0x64, 0x69, 0xfd, 0xab, 0x21, 0x50, 0xfb, 0xc9, 0xcf, 0x82, + 0x07, 0x84, 0x58, 0x30, 0xea, 0xd3, 0x40, 0x25, 0x34, 0x17, 0xc5, 0x9e, 0x8d, 0x1c, 0x82, 0x12, + 0xc3, 0xb6, 0x53, 0xfa, 0x85, 0x13, 0x2e, 0x7a, 0x75, 0xa5, 0xed, 0xf2, 0xed, 0x74, 0x59, 0xc2, + 0x50, 0x63, 0xad, 0x03, 0x98, 0x60, 0xed, 0x6a, 0xb5, 0x68, 0xab, 0x1a, 0xd2, 0x4e, 0x40, 0x76, + 0x21, 0x1f, 0xb0, 0x1f, 0x03, 0x99, 0x20, 0x51, 0x1a, 0x07, 0xed, 0x18, 0xae, 0x12, 0xc6, 0x17, + 0x05, 0x7b, 0xeb, 0xbf, 0x0c, 0x41, 0x51, 0xf7, 0xe8, 0x09, 0xfc, 0x2f, 0x37, 0xa3, 0x44, 0x6e, + 0x31, 0xb7, 0xcb, 0x46, 0x12, 0x37, 0x53, 0x05, 0x17, 0xdc, 0x43, 0x91, 0xa7, 0xab, 0x33, 0xba, + 0xc9, 0xeb, 0x71, 0x47, 0xdd, 0x25, 0xd3, 0x49, 0x64, 0xd0, 0x4b, 0x8f, 0xdd, 0x1e, 0x14, 0xf9, + 0x8f, 0x15, 0x75, 0x95, 0x29, 0xeb, 0xdc, 0xb9, 0xaf, 0xb8, 0x08, 0xc7, 0xbb, 0xfe, 0xc4, 0x88, + 0x7f, 0xe2, 0x0a, 0x52, 0xfe, 0x44, 0x57, 0x90, 0x6e, 0xc0, 0x08, 0x75, 0xbb, 0x6d, 0x9e, 0x5e, + 0x50, 0xe4, 0x27, 0xc6, 0xc8, 0xb2, 0xdb, 0x6d, 0xc7, 0x1b, 0xc3, 0x49, 0xac, 0x15, 0x60, 0xfa, + 0xc4, 0xea, 0x22, 0x79, 0x17, 0x0a, 0x81, 0xdc, 0xf9, 0x64, 0xe7, 0xfe, 0x82, 0x8e, 0xe8, 0x4a, + 0xf8, 0xe3, 0xa3, 0xd9, 0x09, 0x4e, 0xac, 0x00, 0xa8, 0x8b, 0x58, 0xdf, 0x1a, 0x01, 0xc3, 0x8a, + 0x3e, 0xc1, 0x30, 0xd5, 0x13, 0x8e, 0x91, 0x0f, 0xb2, 0x3a, 0x46, 0x94, 0xb7, 0x41, 0xcc, 0xef, + 0xb8, 0x2f, 0x84, 0xd5, 0xa3, 0x49, 0x5b, 0x1d, 0x39, 0xae, 0xba, 0x1e, 0xb7, 0x69, 0xab, 0x83, + 0x1c, 0xa3, 0xb3, 0x0f, 0x46, 0xfa, 0x66, 0x1f, 0x3c, 0x84, 0x7c, 0xc3, 0xee, 0x36, 0xa8, 0x74, + 0xbe, 0x67, 0x73, 0x6e, 0xf1, 0x68, 0xaa, 0x70, 0x6e, 0xf1, 0x9f, 0x28, 0x78, 0xb2, 0xb9, 0xd4, + 0x54, 0xfe, 0x62, 0x69, 0x00, 0x66, 0x9b, 0x4b, 0xda, 0xeb, 0x2c, 0xe6, 0x92, 0xfe, 0xc4, 0x88, + 0x3f, 0xd3, 0xd0, 0x6a, 0x22, 0xd3, 0x55, 0x46, 0x02, 0x7f, 0x2d, 0x63, 0x12, 0x05, 0xe7, 0x21, + 0x34, 0x34, 0xf9, 0x81, 0x8a, 0xb3, 0x35, 0x0f, 0x25, 0xe3, 0x16, 0x0e, 0xeb, 0x5f, 0x9d, 0x71, + 0x69, 0xf4, 0xef, 0x92, 0x1d, 0xda, 0xc8, 0x31, 0xd6, 0x1f, 0x0c, 0x83, 0xd6, 0x87, 0xcd, 0xf4, + 0x08, 0xbb, 0x66, 0x24, 0xec, 0xc7, 0x72, 0xb5, 0x3c, 0x17, 0x25, 0x96, 0x59, 0x8d, 0x6d, 0xea, + 0x37, 0xf4, 0xa9, 0x2d, 0xd7, 0xbc, 0xb6, 0x1a, 0xd7, 0x4d, 0x24, 0xc6, 0x69, 0xd9, 0x99, 0xd9, + 0xb6, 0x5d, 0x67, 0x97, 0x06, 0x61, 0x32, 0xa8, 0xb5, 0x2e, 0xe1, 0xa8, 0x29, 0xc8, 0x2a, 0x4c, + 0x07, 0x34, 0xdc, 0x3c, 0x70, 0xa9, 0xaf, 0x73, 0xc8, 0x64, 0x52, 0xe1, 0x8b, 0xca, 0x48, 0xa8, + 0x26, 0x09, 0xb0, 0xb7, 0x0c, 0xb7, 0xc0, 0x45, 0x3e, 0x9f, 0xce, 0xcd, 0x92, 0x0b, 0x3b, 0xb2, + 0xc0, 0x13, 0x78, 0xec, 0x29, 0xc1, 0xb8, 0xec, 0xda, 0x4e, 0xab, 0xeb, 0xd3, 0x88, 0xcb, 0x68, + 0x9c, 0xcb, 0x4a, 0x02, 0x8f, 0x3d, 0x25, 0x78, 0x3c, 0xbc, 0x65, 0x37, 0x82, 0xf2, 0x98, 0x11, + 0x0f, 0x67, 0x00, 0x14, 0x70, 0xeb, 0x1f, 0xe6, 0x60, 0x02, 0x69, 0xe8, 0x1f, 0x2e, 0xec, 0x32, + 0x0b, 0x31, 0x3c, 0x24, 0xbf, 0x9b, 0x83, 0x29, 0xd7, 0xab, 0xd3, 0x05, 0x37, 0x74, 0x14, 0x70, + 0xa0, 0x7b, 0x3f, 0x9c, 0xfd, 0x46, 0x82, 0xa3, 0xc8, 0x06, 0x4c, 0x42, 0xb1, 0x47, 0xb2, 0x75, + 0x19, 0x2e, 0xa6, 0x32, 0xb0, 0xfe, 0xfa, 0xb0, 0xac, 0xb9, 0x1e, 0xef, 0x8f, 0x20, 0xdf, 0xe2, + 0x99, 0x91, 0xb9, 0x8c, 0x17, 0x3b, 0x78, 0xf7, 0x88, 0xd4, 0x49, 0xc1, 0x89, 0x2c, 0x41, 0xc9, + 0x67, 0x32, 0x64, 0xde, 0xaa, 0x98, 0x7d, 0x56, 0x74, 0x4f, 0x52, 0xa3, 0x1e, 0xc7, 0x3f, 0xd1, + 0x2c, 0x46, 0x5c, 0x18, 0xdb, 0x11, 0x77, 0x55, 0xa4, 0x7a, 0x95, 0x6d, 0x61, 0xca, 0xfb, 0x2e, + 0xfc, 0xfc, 0x52, 0x97, 0x5f, 0x1e, 0x47, 0x3f, 0x51, 0x09, 0x21, 0x2d, 0x28, 0xd8, 0x6a, 0xe4, + 0x46, 0x06, 0x08, 0x3b, 0xc7, 0x26, 0x86, 0x50, 0x1d, 0xf4, 0x48, 0x69, 0x09, 0xd6, 0xb7, 0x73, + 0x00, 0xd1, 0x75, 0x4c, 0xb2, 0x07, 0x85, 0xe0, 0x56, 0x4c, 0x8d, 0xce, 0x98, 0x60, 0x26, 0x99, + 0x18, 0xa9, 0x47, 0x12, 0x82, 0x5a, 0xc0, 0xd3, 0x74, 0xe8, 0x6f, 0xe5, 0x41, 0x97, 0x7a, 0x46, + 0x2a, 0xf4, 0xab, 0x4c, 0x0d, 0x6b, 0x44, 0x77, 0x7e, 0x34, 0x1d, 0x72, 0x28, 0x4a, 0x2c, 0x53, + 0xc5, 0x54, 0x12, 0x84, 0xdc, 0x55, 0x78, 0x7f, 0xaa, 0x7c, 0x09, 0xd4, 0xd8, 0x34, 0xa5, 0x3c, + 0xff, 0x5c, 0x94, 0xf2, 0xd1, 0x33, 0x57, 0xca, 0x99, 0x7d, 0xe6, 0x7b, 0x2d, 0xba, 0x80, 0x1b, + 0xd2, 0x75, 0xa7, 0xed, 0x33, 0x14, 0x60, 0x54, 0x78, 0xf2, 0x16, 0x94, 0xba, 0x01, 0xad, 0x2e, + 0xdd, 0x59, 0xf4, 0x69, 0x3d, 0x90, 0x79, 0x25, 0xda, 0x99, 0x7b, 0x2f, 0x42, 0xa1, 0x49, 0x47, + 0xfe, 0x69, 0x0e, 0xca, 0x35, 0x7e, 0x5f, 0x43, 0x0c, 0xcc, 0xda, 0xee, 0x86, 0x17, 0x6e, 0xf9, + 0x34, 0xa0, 0x6e, 0x28, 0x53, 0x95, 0x3f, 0xcc, 0x98, 0xac, 0x9f, 0x72, 0x09, 0xa4, 0x72, 0xf5, + 0xf8, 0x68, 0xb6, 0xbc, 0xd8, 0x47, 0x1e, 0xf6, 0xad, 0x89, 0xf5, 0x37, 0x72, 0x70, 0xae, 0x5a, + 0xf3, 0x9d, 0x4e, 0xa8, 0xcf, 0xc0, 0x0d, 0x7e, 0xe5, 0x2b, 0xb4, 0xd9, 0xbe, 0x24, 0x57, 0xca, + 0x4b, 0x7d, 0x22, 0xff, 0x82, 0x28, 0x76, 0xfd, 0x53, 0x80, 0x30, 0x62, 0xc1, 0x66, 0xa2, 0x38, + 0x65, 0x93, 0x33, 0xb6, 0xca, 0xa1, 0x28, 0xb1, 0xd6, 0x23, 0x98, 0xaa, 0xd2, 0xb6, 0xdd, 0x69, + 0xf2, 0x4c, 0x1c, 0x11, 0x04, 0x98, 0x87, 0x62, 0xa0, 0x60, 0xc9, 0xbb, 0xa6, 0x9a, 0x18, 0x23, + 0x1a, 0xf2, 0x8a, 0x88, 0x51, 0xa8, 0x10, 0x7e, 0x51, 0x68, 0x0b, 0x22, 0xb0, 0x11, 0xa0, 0xc2, + 0x59, 0x07, 0x30, 0x1e, 0x15, 0xa7, 0xbb, 0xa4, 0x01, 0x93, 0x35, 0x23, 0x91, 0x21, 0xba, 0x52, + 0x7a, 0xf2, 0x9c, 0x07, 0x3e, 0xf1, 0x16, 0xe3, 0x4c, 0x30, 0xc9, 0xd5, 0xfa, 0x5f, 0x39, 0x98, + 0xd4, 0x92, 0xa5, 0xb3, 0xa0, 0x93, 0x8c, 0xab, 0x2c, 0x67, 0xcc, 0x7c, 0x8d, 0x77, 0xde, 0x13, + 0x62, 0x2b, 0x9d, 0x64, 0x6c, 0xe5, 0xac, 0x25, 0xf6, 0x78, 0x39, 0xfe, 0x70, 0x08, 0x0a, 0x3a, + 0xf5, 0xf6, 0x23, 0xc8, 0x73, 0xb5, 0x6d, 0xb0, 0x03, 0x91, 0xab, 0x80, 0x28, 0x38, 0x31, 0x96, + 0xdc, 0x51, 0x9d, 0xf9, 0xf2, 0x64, 0x51, 0x58, 0x80, 0xb6, 0x1f, 0xa2, 0xe0, 0x44, 0xee, 0xc0, + 0x30, 0x75, 0xeb, 0xf2, 0x64, 0x3c, 0x3d, 0x43, 0x7e, 0x9b, 0x7a, 0xd9, 0xad, 0x23, 0xe3, 0xc2, + 0x6f, 0x85, 0x79, 0x7e, 0xdb, 0x0e, 0xa5, 0xc6, 0x1f, 0xdd, 0x0a, 0xe3, 0x50, 0x94, 0x58, 0xeb, + 0x7f, 0x0e, 0xc1, 0x68, 0xb5, 0xbb, 0xc3, 0xce, 0xf8, 0xbf, 0x97, 0x83, 0xf3, 0xc9, 0x90, 0x45, + 0x34, 0x31, 0x6f, 0x9f, 0xc9, 0xad, 0x45, 0xa4, 0xbb, 0x95, 0x2b, 0xb2, 0x2a, 0xe7, 0x53, 0x90, + 0x98, 0x56, 0x83, 0xd8, 0x1d, 0xb1, 0xe1, 0x67, 0x74, 0x43, 0xd3, 0x48, 0xe5, 0x1f, 0x3a, 0x93, + 0x54, 0xfe, 0x89, 0x7e, 0x69, 0xfc, 0xd6, 0xbf, 0x1d, 0x01, 0x10, 0x7d, 0xbe, 0xd9, 0x09, 0x4f, + 0x62, 0x44, 0xbe, 0x0d, 0xe3, 0xea, 0xe5, 0x9c, 0x8d, 0x28, 0x12, 0xa8, 0x5d, 0xb5, 0xab, 0x06, + 0x0e, 0x63, 0x94, 0xcc, 0xac, 0xa6, 0x6e, 0xe8, 0x1f, 0x8a, 0xd3, 0x7e, 0x24, 0x6e, 0x56, 0x2f, + 0x6b, 0x0c, 0x1a, 0x54, 0x64, 0x2e, 0xe6, 0x34, 0x12, 0xe9, 0xfe, 0xe7, 0x9e, 0xe0, 0xf0, 0x79, + 0x07, 0x26, 0xf4, 0xd7, 0x8a, 0xd3, 0x52, 0x69, 0x54, 0xda, 0x36, 0xd9, 0x32, 0x91, 0x18, 0xa7, + 0x25, 0xef, 0xc1, 0xb9, 0x78, 0x72, 0xae, 0x3c, 0x1f, 0x2f, 0xc9, 0xd2, 0xe7, 0xe2, 0x39, 0xbd, + 0x98, 0xa0, 0x66, 0xf3, 0xbc, 0xee, 0x1f, 0x62, 0xd7, 0x95, 0x07, 0xa5, 0x9e, 0xe7, 0x4b, 0x1c, + 0x8a, 0x12, 0xcb, 0xba, 0x90, 0x95, 0xa4, 0xbe, 0x80, 0xf3, 0x13, 0xb1, 0x10, 0x75, 0x61, 0xd5, + 0xc0, 0x61, 0x8c, 0x92, 0x49, 0x90, 0x16, 0x3c, 0xc4, 0x57, 0x52, 0xc2, 0x06, 0xef, 0xc0, 0x39, + 0x2f, 0x6e, 0x34, 0x89, 0x88, 0xd5, 0x9b, 0x27, 0x9c, 0xaa, 0xb1, 0xb2, 0x22, 0xfb, 0x35, 0x61, + 0x63, 0x25, 0xf8, 0x5b, 0xe7, 0x61, 0xba, 0xda, 0xed, 0x74, 0x5a, 0x0e, 0xad, 0x6b, 0x9f, 0x8a, + 0xf5, 0x3e, 0x4c, 0xca, 0x2b, 0x5f, 0xfa, 0x80, 0x3d, 0xd5, 0xbd, 0x70, 0xeb, 0x88, 0x9d, 0x18, + 0x71, 0x27, 0x33, 0x71, 0x93, 0xc7, 0x62, 0x56, 0x47, 0x98, 0x79, 0x08, 0x8a, 0x15, 0x92, 0x7a, + 0xaa, 0x3e, 0x54, 0x69, 0x05, 0x83, 0x24, 0xda, 0xf0, 0x48, 0xbc, 0xd8, 0x67, 0xcd, 0x74, 0x04, + 0xeb, 0xc7, 0x39, 0x48, 0xf7, 0xdf, 0x93, 0xcf, 0x7b, 0x9b, 0xb9, 0x34, 0x58, 0x33, 0x65, 0xcc, + 0xa0, 0x7f, 0x4b, 0xed, 0x78, 0x4b, 0x3f, 0xc8, 0xde, 0x52, 0x29, 0xaa, 0xb7, 0xbd, 0xff, 0x3b, + 0x07, 0xa5, 0xed, 0xed, 0xbb, 0xda, 0x3c, 0x44, 0xb8, 0x14, 0x88, 0x4b, 0x7b, 0x0b, 0xbb, 0x21, + 0xf5, 0x17, 0xbd, 0x76, 0xa7, 0x45, 0xf5, 0xe4, 0x90, 0x37, 0xe9, 0xaa, 0xa9, 0x14, 0xd8, 0xa7, + 0x24, 0x59, 0x83, 0xf3, 0x26, 0x46, 0xda, 0xf5, 0xbc, 0x51, 0x79, 0x99, 0x61, 0xdd, 0x8b, 0xc6, + 0xb4, 0x32, 0x49, 0x56, 0xd2, 0xb8, 0x97, 0x2f, 0x2d, 0xf5, 0xb0, 0x92, 0x68, 0x4c, 0x2b, 0x63, + 0x6d, 0x42, 0xc9, 0x78, 0xc3, 0x8b, 0x7c, 0x00, 0x53, 0x35, 0xaf, 0xdd, 0xf1, 0x69, 0x10, 0x38, + 0x9e, 0x7b, 0x97, 0xee, 0xd3, 0x96, 0x6c, 0x32, 0x37, 0xc2, 0x17, 0x13, 0x38, 0xec, 0xa1, 0xb6, + 0xfe, 0xe5, 0x15, 0xd0, 0x17, 0xc1, 0x7e, 0x7e, 0x9d, 0x2c, 0x53, 0x5e, 0x46, 0x4d, 0xc7, 0x67, + 0xf3, 0x83, 0xc7, 0x67, 0xf5, 0x5e, 0x9c, 0x88, 0xd1, 0x36, 0xa2, 0x18, 0xed, 0xe8, 0x19, 0xc4, + 0x68, 0xb5, 0x9a, 0xd9, 0x13, 0xa7, 0xfd, 0xed, 0x1c, 0x8c, 0xbb, 0x5e, 0x9d, 0x2a, 0xad, 0x9c, + 0xfb, 0x97, 0x4a, 0x37, 0x37, 0x07, 0xea, 0x44, 0x11, 0x7c, 0x94, 0x1c, 0x45, 0x78, 0x5e, 0x1f, + 0x54, 0x26, 0x0a, 0x63, 0xa2, 0xc9, 0x8a, 0xe1, 0xed, 0x10, 0x37, 0xda, 0xae, 0xa6, 0x19, 0x13, + 0x4f, 0xf3, 0x63, 0x90, 0x3d, 0x43, 0xdb, 0x2a, 0x0e, 0xe0, 0xb8, 0x50, 0xd9, 0x7c, 0x86, 0xb7, + 0x51, 0x5d, 0x76, 0x8d, 0x14, 0x2f, 0x0b, 0x46, 0x45, 0xe8, 0x5e, 0xbe, 0xbd, 0xc5, 0xbd, 0xdb, + 0x22, 0xac, 0x8f, 0x12, 0x43, 0x1a, 0x2a, 0x04, 0x53, 0xe2, 0x9d, 0x5b, 0xc9, 0x1c, 0xc0, 0xd2, + 0x51, 0x9d, 0xf4, 0x18, 0x0c, 0xf9, 0xd0, 0xb4, 0x44, 0xc7, 0x4f, 0x62, 0x89, 0x4e, 0xf4, 0xb5, + 0x42, 0x1b, 0x30, 0x1a, 0x70, 0x3b, 0x97, 0xe7, 0x2b, 0x94, 0x6e, 0x2e, 0x66, 0x3b, 0x48, 0x62, + 0xa6, 0xb2, 0xe8, 0x1d, 0x01, 0x43, 0xc9, 0x9e, 0x78, 0x50, 0x50, 0x49, 0x15, 0x32, 0xe5, 0x61, + 0x39, 0xa3, 0x93, 0x2b, 0xee, 0x9b, 0x56, 0x97, 0x9b, 0x04, 0x14, 0xb5, 0x10, 0xf2, 0x10, 0x86, + 0xeb, 0x76, 0x43, 0x26, 0x3f, 0x7c, 0x90, 0xf9, 0xa2, 0x9e, 0x12, 0xc3, 0xed, 0x96, 0xa5, 0x85, + 0x55, 0x64, 0x5c, 0xc9, 0x5e, 0x74, 0x91, 0x7d, 0x6a, 0x90, 0x03, 0x38, 0xae, 0x02, 0x09, 0xab, + 0xbc, 0xe7, 0x2a, 0xfc, 0x32, 0x8c, 0xed, 0x7b, 0xad, 0x6e, 0x5b, 0x66, 0x4d, 0x94, 0x6e, 0xce, + 0xa4, 0x8d, 0xf6, 0x7d, 0x4e, 0x12, 0x6d, 0x02, 0xe2, 0x3b, 0x40, 0x55, 0x96, 0x7c, 0x33, 0x07, + 0xe7, 0xd8, 0xd2, 0xd1, 0xf3, 0x20, 0x28, 0x93, 0x01, 0x66, 0xea, 0xbd, 0x80, 0x1d, 0xad, 0x6a, + 0x86, 0x69, 0x45, 0x78, 0x2d, 0x26, 0x01, 0x13, 0x12, 0x49, 0x07, 0x0a, 0x81, 0x53, 0xa7, 0x35, + 0xdb, 0x0f, 0xca, 0xe7, 0xcf, 0x4c, 0x7a, 0xe4, 0x73, 0x94, 0xbc, 0x51, 0x4b, 0x21, 0x7f, 0x8d, + 0x3f, 0xef, 0x24, 0x1f, 0xb3, 0x93, 0x4f, 0x18, 0x5e, 0x38, 0xcb, 0x27, 0x0c, 0x85, 0x03, 0x2f, + 0x2e, 0x01, 0x93, 0x22, 0xc9, 0x6f, 0xe6, 0xe0, 0xa2, 0xb8, 0xd1, 0x9e, 0x7c, 0xce, 0xe0, 0x62, + 0x46, 0x4b, 0x9a, 0x67, 0x78, 0x2c, 0xa4, 0xb1, 0xc4, 0x74, 0x49, 0xe4, 0x2b, 0x98, 0xf0, 0x4d, + 0x17, 0x3c, 0x4f, 0xa6, 0x19, 0xc8, 0xdb, 0xac, 0x1f, 0x44, 0xe4, 0x89, 0x3c, 0x31, 0x10, 0xc6, + 0x65, 0x91, 0x37, 0xa0, 0xd4, 0x91, 0x9b, 0x9b, 0x13, 0xb4, 0x79, 0x1e, 0xce, 0xb0, 0x38, 0x84, + 0xb7, 0x22, 0x30, 0x9a, 0x34, 0xe4, 0x1e, 0x94, 0x42, 0xaf, 0x45, 0x7d, 0x99, 0x35, 0x5e, 0xe6, + 0xf3, 0xe5, 0x5a, 0xda, 0xe4, 0xdf, 0xd6, 0x64, 0x91, 0x0f, 0x32, 0x82, 0x05, 0x68, 0xf2, 0x61, + 0x96, 0xa0, 0x7a, 0xef, 0xc2, 0xe7, 0x86, 0xea, 0x8b, 0x71, 0x4b, 0xb0, 0x6a, 0x22, 0x31, 0x4e, + 0x4b, 0x56, 0x61, 0xba, 0xe3, 0x3b, 0x9e, 0xef, 0x84, 0x87, 0x8b, 0x2d, 0x3b, 0x08, 0x38, 0x03, + 0x91, 0x38, 0xa7, 0xe3, 0x4e, 0x5b, 0x49, 0x02, 0xec, 0x2d, 0x43, 0x5e, 0x83, 0x82, 0x02, 0x96, + 0xaf, 0x70, 0xf5, 0x6e, 0x5c, 0x24, 0xdd, 0x09, 0x18, 0x6a, 0x6c, 0x9f, 0xeb, 0xb9, 0x57, 0xb3, + 0x5c, 0xcf, 0x25, 0x75, 0xb8, 0x6a, 0x77, 0x43, 0x8f, 0x5f, 0x4f, 0x89, 0x17, 0xd9, 0xf6, 0xf6, + 0xa8, 0x5b, 0xbe, 0xce, 0x8f, 0xb7, 0xeb, 0xc7, 0x47, 0xb3, 0x57, 0x17, 0x9e, 0x40, 0x87, 0x4f, + 0xe4, 0x42, 0xda, 0x50, 0xa0, 0xf2, 0x8a, 0x71, 0xf9, 0x17, 0x06, 0x38, 0x57, 0xe2, 0xf7, 0x94, + 0x55, 0x36, 0x84, 0x80, 0xa1, 0x16, 0x41, 0xb6, 0xa1, 0xd4, 0xf4, 0x82, 0x70, 0xa1, 0xe5, 0xd8, + 0x01, 0x0d, 0xca, 0x2f, 0xf1, 0x79, 0x92, 0x7a, 0x24, 0xde, 0x56, 0x64, 0xd1, 0x34, 0xb9, 0x1d, + 0x95, 0x44, 0x93, 0x0d, 0xa1, 0xdc, 0xe5, 0xde, 0xe5, 0xa3, 0xe6, 0xb9, 0x21, 0xfd, 0x22, 0x2c, + 0x5f, 0xe3, 0x6d, 0x79, 0x35, 0x8d, 0xf3, 0x96, 0x57, 0xaf, 0xc6, 0xa9, 0xb5, 0xcf, 0xdd, 0x04, + 0x62, 0x92, 0x27, 0x33, 0xf9, 0x3b, 0x5e, 0xbd, 0xda, 0xa1, 0xb5, 0x2d, 0x3b, 0xac, 0x35, 0xcb, + 0xb3, 0x71, 0xaf, 0xc9, 0x96, 0x81, 0xc3, 0x18, 0x25, 0xa9, 0xc1, 0x58, 0x5b, 0x24, 0xe3, 0x97, + 0x5f, 0x1e, 0x40, 0x7d, 0x94, 0x09, 0xfd, 0xe2, 0xf0, 0x91, 0x1f, 0xa8, 0x38, 0x93, 0xbf, 0x9b, + 0x83, 0xc9, 0x44, 0xbe, 0x58, 0xf9, 0x17, 0x07, 0x39, 0xf2, 0xe2, 0xbc, 0x2a, 0xaf, 0xf2, 0x4e, + 0x8a, 0x03, 0x1f, 0xf7, 0x82, 0x30, 0x59, 0x09, 0xd1, 0x7a, 0x7e, 0x1f, 0xa6, 0xfc, 0xca, 0x40, + 0xad, 0xe7, 0x3c, 0x54, 0xeb, 0xf9, 0x07, 0x2a, 0xce, 0xe4, 0x06, 0x8c, 0x85, 0x4e, 0x9b, 0x7a, + 0xdd, 0xb0, 0xfc, 0x6a, 0x3c, 0x20, 0xb2, 0x2d, 0xc0, 0xa8, 0xf0, 0x33, 0xef, 0xc3, 0x74, 0x8f, + 0x42, 0x7c, 0xaa, 0xeb, 0x1a, 0x3f, 0x60, 0x06, 0xb0, 0x61, 0x82, 0x9c, 0xb5, 0xe1, 0xb6, 0x0a, + 0xd3, 0xf2, 0x71, 0x6c, 0xa6, 0x2d, 0xb5, 0xba, 0xfa, 0xe5, 0x3b, 0x23, 0x62, 0x8e, 0x49, 0x02, + 0xec, 0x2d, 0xc3, 0x66, 0x6c, 0x4d, 0x3c, 0x7d, 0x26, 0x52, 0xc3, 0x47, 0xe2, 0x4e, 0xaa, 0x45, + 0x03, 0x87, 0x31, 0x4a, 0xeb, 0x9f, 0xe5, 0x60, 0x22, 0x76, 0x72, 0x9f, 0x79, 0x54, 0x65, 0x05, + 0x48, 0xdb, 0xf1, 0x7d, 0xcf, 0x17, 0xea, 0xcf, 0x3a, 0xdb, 0x93, 0x02, 0x79, 0x0d, 0x9e, 0x5f, + 0xbf, 0x5c, 0xef, 0xc1, 0x62, 0x4a, 0x09, 0xeb, 0xb7, 0x86, 0x21, 0xca, 0x00, 0xd2, 0x77, 0x8e, + 0x73, 0x7d, 0xef, 0x1c, 0xbf, 0x0e, 0x85, 0x47, 0x81, 0xe7, 0x6e, 0x45, 0x37, 0x93, 0xf5, 0x50, + 0x7c, 0x58, 0xdd, 0xdc, 0xe0, 0x94, 0x9a, 0x82, 0x53, 0x7f, 0xbe, 0xe2, 0xb4, 0xc2, 0xde, 0xfb, + 0xbb, 0x1f, 0x7e, 0x24, 0xe0, 0xa8, 0x29, 0xf8, 0xfb, 0x6a, 0xfb, 0x54, 0xfb, 0x1c, 0xa3, 0xf7, + 0xd5, 0x18, 0x10, 0x05, 0x8e, 0xcc, 0x43, 0x51, 0xbb, 0x2c, 0xa5, 0x07, 0x55, 0xf7, 0x94, 0x76, + 0x6d, 0x62, 0x44, 0xc3, 0x35, 0x31, 0xe9, 0x96, 0x93, 0xd6, 0xe7, 0x4a, 0x46, 0x1d, 0x36, 0xe1, + 0xdb, 0x13, 0xdb, 0xb4, 0x02, 0xa3, 0x96, 0x62, 0xe6, 0x82, 0xe5, 0x4f, 0x98, 0x0b, 0xc6, 0xc6, + 0x61, 0xec, 0x3e, 0xf5, 0xf9, 0x73, 0x02, 0x37, 0x60, 0x6c, 0x5f, 0xfc, 0x4c, 0x66, 0x8f, 0x4a, + 0x0a, 0x54, 0x78, 0xd6, 0x1b, 0x3b, 0x5d, 0xa7, 0x55, 0x5f, 0x8a, 0x96, 0x86, 0xee, 0x8d, 0x8a, + 0x42, 0x60, 0x44, 0xc3, 0x0a, 0x34, 0x98, 0xa2, 0xda, 0x6e, 0x3b, 0x61, 0xf2, 0x3e, 0xde, 0xaa, + 0x42, 0x60, 0x44, 0x43, 0x5e, 0x85, 0xd1, 0x86, 0x13, 0x6e, 0xdb, 0x8d, 0x64, 0xe4, 0x62, 0x95, + 0x43, 0x51, 0x62, 0xb9, 0x53, 0xdc, 0x09, 0xb7, 0x7d, 0xca, 0x9d, 0x6c, 0x3d, 0xf7, 0x51, 0x56, + 0x0d, 0x1c, 0xc6, 0x28, 0x79, 0x95, 0x3c, 0xd9, 0x32, 0xe9, 0xac, 0x8e, 0xaa, 0xa4, 0x10, 0x18, + 0xd1, 0xb0, 0x59, 0x55, 0xf3, 0xda, 0x1d, 0xa7, 0x25, 0x33, 0x8a, 0x8c, 0x59, 0xb5, 0x28, 0xe1, + 0xa8, 0x29, 0x18, 0x35, 0xdb, 0x17, 0x76, 0x3d, 0xbf, 0x9d, 0x7c, 0x55, 0x6a, 0x4b, 0xc2, 0x51, + 0x53, 0x58, 0xf7, 0x61, 0x42, 0xac, 0x8f, 0xc5, 0x96, 0xed, 0xb4, 0x57, 0x17, 0xc9, 0x72, 0x4f, + 0x86, 0xda, 0x8d, 0x94, 0x0c, 0xb5, 0x8b, 0xb1, 0x42, 0x29, 0x99, 0x6a, 0x7f, 0x32, 0x04, 0x85, + 0xe7, 0xf8, 0xc8, 0x5e, 0x2d, 0xf6, 0xc8, 0xde, 0x19, 0xbc, 0xc8, 0x96, 0xf6, 0xc0, 0xde, 0x5e, + 0xe2, 0x81, 0xbd, 0xc5, 0x01, 0x93, 0x31, 0x9f, 0xf8, 0xb8, 0xde, 0x8f, 0x72, 0xa0, 0xef, 0xf5, + 0xf0, 0x0d, 0xa1, 0xe2, 0xb8, 0x3c, 0x98, 0xf9, 0xec, 0x3b, 0xd3, 0x8b, 0x75, 0xe6, 0xfa, 0x40, + 0xad, 0x34, 0xab, 0xde, 0xf7, 0xcd, 0xd0, 0x1f, 0xe6, 0xa0, 0x9c, 0x56, 0xe0, 0x39, 0x3c, 0x28, + 0xe8, 0xc6, 0x1f, 0x14, 0x5c, 0x3b, 0xb3, 0xc6, 0xf6, 0x79, 0x58, 0xf0, 0xcf, 0xfa, 0x34, 0x95, + 0x3f, 0xe9, 0xf7, 0x99, 0x3a, 0x10, 0x72, 0x03, 0xc4, 0x1d, 0x04, 0xd7, 0xf4, 0xc3, 0xe4, 0x33, + 0x18, 0x0d, 0x78, 0xe4, 0x4f, 0x8e, 0xed, 0x3b, 0x19, 0x4f, 0x06, 0xc6, 0x42, 0x7a, 0x83, 0xf8, + 0x6f, 0x94, 0x6c, 0xad, 0xef, 0xe6, 0x60, 0xfc, 0x39, 0x3e, 0x07, 0xb9, 0x13, 0x1f, 0xbd, 0x77, + 0x07, 0x1a, 0xbd, 0x3e, 0x23, 0xf6, 0xfb, 0x57, 0x20, 0xf6, 0x0c, 0x23, 0x71, 0xa1, 0xa8, 0x74, + 0x2f, 0x95, 0x96, 0xfd, 0xee, 0x40, 0x0e, 0xd7, 0x68, 0xfb, 0x57, 0x90, 0x00, 0x23, 0x11, 0x89, + 0x20, 0xea, 0xd0, 0x89, 0x82, 0xa8, 0xcf, 0xdd, 0x99, 0x9f, 0x6e, 0xcb, 0x8e, 0x3c, 0x13, 0x5b, + 0xf6, 0xea, 0x99, 0xdb, 0xb2, 0x2f, 0x3d, 0x7b, 0x5b, 0xd6, 0x70, 0xf6, 0xe5, 0x07, 0x70, 0xf6, + 0x7d, 0x05, 0x17, 0xf6, 0xa3, 0xa3, 0x57, 0xcf, 0x17, 0xf9, 0xc6, 0xdd, 0x8d, 0x54, 0x0b, 0x96, + 0xa9, 0x11, 0x41, 0x48, 0xdd, 0xd0, 0x38, 0xb4, 0xa3, 0xcb, 0xa3, 0xf7, 0x53, 0xd8, 0x61, 0xaa, + 0x90, 0xa4, 0xab, 0x67, 0xec, 0x04, 0xae, 0x9e, 0x3f, 0xe8, 0xfb, 0x86, 0x7d, 0xe1, 0xcc, 0xdf, + 0xb0, 0x7f, 0xf1, 0xd4, 0xef, 0xd7, 0xbf, 0x12, 0xb9, 0x7b, 0x45, 0x44, 0x3e, 0xdd, 0x51, 0xfb, + 0x7b, 0xc9, 0x30, 0x0b, 0xf0, 0xde, 0xae, 0x0e, 0xac, 0x66, 0x9c, 0x41, 0xa8, 0xa5, 0x34, 0x40, + 0xa8, 0x25, 0xe1, 0x87, 0x1b, 0x3f, 0x23, 0x3f, 0x9c, 0x0b, 0x53, 0x4e, 0xdb, 0x6e, 0xd0, 0xad, + 0x6e, 0xab, 0x25, 0x12, 0x10, 0x83, 0xf2, 0x04, 0xe7, 0x9d, 0x9a, 0x5e, 0x76, 0xd7, 0xab, 0xd9, + 0xad, 0xe4, 0xab, 0xa1, 0x3a, 0xbb, 0x7a, 0x2d, 0xc1, 0x09, 0x7b, 0x78, 0xb3, 0x69, 0xc9, 0x2f, + 0x08, 0xd2, 0x90, 0xf5, 0x36, 0x8f, 0x42, 0xc8, 0x7f, 0x3e, 0xb9, 0x1d, 0x81, 0xd1, 0xa4, 0x21, + 0x77, 0xa0, 0x58, 0x77, 0x03, 0x99, 0x4e, 0x3c, 0xc9, 0x77, 0xa9, 0x5f, 0x62, 0x7b, 0xdb, 0xd2, + 0x46, 0x55, 0x27, 0x12, 0x5f, 0x4d, 0xb9, 0x61, 0xaa, 0xf1, 0x18, 0x95, 0x27, 0xeb, 0x9c, 0x99, + 0x7c, 0x5f, 0x4a, 0x84, 0x0d, 0xae, 0xf7, 0x71, 0x25, 0x2d, 0x6d, 0xa8, 0xe7, 0xb0, 0x26, 0xa4, + 0x38, 0xf9, 0x6a, 0x54, 0xc4, 0xc1, 0x78, 0x16, 0x71, 0xfa, 0x89, 0xcf, 0x22, 0xde, 0x83, 0xcb, + 0x61, 0xd8, 0x8a, 0x45, 0xa3, 0xe5, 0xe5, 0x62, 0x7e, 0xd3, 0x3c, 0x2f, 0x1e, 0xa5, 0xdb, 0xde, + 0xbe, 0x9b, 0x46, 0x82, 0xfd, 0xca, 0xf2, 0xb0, 0x6c, 0xd8, 0xd2, 0xae, 0xe4, 0x6b, 0x83, 0x84, + 0x65, 0xa3, 0xb0, 0xbf, 0x0c, 0xcb, 0x46, 0x00, 0x34, 0xa5, 0x90, 0xcd, 0x7e, 0x4e, 0xf4, 0xf3, + 0x7c, 0x8f, 0x39, 0xbd, 0x4b, 0xdc, 0xf4, 0xc2, 0x5e, 0x78, 0xa2, 0x17, 0xb6, 0xc7, 0x6b, 0x7c, + 0xf1, 0x14, 0x5e, 0xe3, 0x87, 0xfc, 0xf6, 0xf0, 0xea, 0xa2, 0xf4, 0xb8, 0x67, 0xd3, 0xd8, 0xf8, + 0x6d, 0x1f, 0x91, 0x39, 0xc1, 0x7f, 0xa2, 0xe0, 0x49, 0xb6, 0xe0, 0x42, 0xc7, 0xab, 0xf7, 0x38, + 0x9d, 0xb9, 0x8b, 0xdd, 0xb8, 0xfd, 0xbf, 0x95, 0x42, 0x83, 0xa9, 0x25, 0xf9, 0x06, 0x1e, 0xc1, + 0xf9, 0x65, 0xf3, 0xbc, 0xdc, 0xc0, 0x23, 0x30, 0x9a, 0x34, 0x49, 0x1f, 0xec, 0x8b, 0xcf, 0xcc, + 0x07, 0x3b, 0xf3, 0x1c, 0x7c, 0xb0, 0x57, 0x4e, 0xec, 0x83, 0xfd, 0x2b, 0x70, 0xbe, 0xe3, 0xd5, + 0x97, 0x9c, 0xc0, 0xef, 0xf2, 0x94, 0xe3, 0x4a, 0xb7, 0xde, 0xa0, 0x21, 0x77, 0xe2, 0x96, 0x6e, + 0xde, 0x34, 0x2b, 0x29, 0xfe, 0x37, 0x6f, 0x4e, 0xfe, 0x6f, 0x1e, 0x5f, 0xe4, 0x89, 0x52, 0xdc, + 0xee, 0xe1, 0xa9, 0x23, 0x29, 0x48, 0x4c, 0x93, 0x63, 0xba, 0x80, 0xaf, 0x3f, 0x33, 0x17, 0xf0, + 0x07, 0x50, 0x08, 0x9a, 0xdd, 0xb0, 0xee, 0x1d, 0xb8, 0xdc, 0x9b, 0x5f, 0xd4, 0xef, 0x90, 0x17, + 0xaa, 0x12, 0xfe, 0xf8, 0x68, 0x76, 0x4a, 0xfd, 0x36, 0xac, 0x7c, 0x09, 0x21, 0x7f, 0xa7, 0x4f, + 0xce, 0xa6, 0x75, 0xc6, 0x39, 0x9b, 0x97, 0x4f, 0x95, 0xaf, 0x99, 0xe6, 0xda, 0x7e, 0xf9, 0xa7, + 0xc1, 0xb5, 0xfd, 0xbb, 0x39, 0x98, 0xd8, 0x37, 0x1d, 0x27, 0xd2, 0xe3, 0x9e, 0x2d, 0x50, 0x17, + 0x73, 0xc1, 0x54, 0x2c, 0xb6, 0x57, 0xc5, 0x40, 0x8f, 0x93, 0x00, 0x8c, 0x0b, 0xef, 0x0d, 0x1b, + 0xbe, 0xf2, 0xfc, 0xc2, 0x86, 0x83, 0xbb, 0xd5, 0xff, 0xd3, 0x34, 0x9c, 0x4b, 0xbc, 0x4f, 0xfe, + 0xa6, 0x7a, 0x9f, 0x44, 0x38, 0xae, 0xae, 0x25, 0xdf, 0x27, 0x99, 0x50, 0xf4, 0xb1, 0x37, 0x4a, + 0x62, 0x8f, 0x88, 0x0c, 0x3d, 0xd3, 0x47, 0x44, 0x86, 0x9f, 0xcf, 0x23, 0x22, 0x53, 0xcf, 0xe2, + 0x11, 0x91, 0xe9, 0x53, 0x3d, 0x22, 0x62, 0x3c, 0xe2, 0x32, 0xf2, 0x94, 0x47, 0x5c, 0x16, 0x60, + 0x52, 0x65, 0xba, 0x51, 0xf9, 0x88, 0x84, 0x70, 0xa6, 0xea, 0x3f, 0x58, 0x5a, 0x8c, 0xa3, 0x31, + 0x49, 0x4f, 0x7e, 0x03, 0xf2, 0x2e, 0x2f, 0x38, 0x3a, 0xc0, 0x03, 0x64, 0xf1, 0xc9, 0xc4, 0x55, + 0x73, 0xf9, 0x06, 0x98, 0x4a, 0x82, 0xc8, 0x73, 0xd8, 0x63, 0xf5, 0x03, 0x85, 0x50, 0xf2, 0x09, + 0x94, 0xbd, 0xdd, 0xdd, 0x96, 0x67, 0xd7, 0xa3, 0x87, 0x4e, 0x94, 0x7f, 0x57, 0x24, 0xed, 0x5e, + 0x97, 0x0c, 0xca, 0x9b, 0x7d, 0xe8, 0xb0, 0x2f, 0x07, 0x66, 0x41, 0x4d, 0xc6, 0x1f, 0x06, 0x0a, + 0xca, 0x45, 0xde, 0xcc, 0xbf, 0x74, 0x16, 0xcd, 0x8c, 0xbf, 0x42, 0x24, 0x1b, 0xac, 0x7b, 0x3e, + 0x81, 0xc5, 0x64, 0x4d, 0x88, 0x0f, 0x97, 0x3a, 0x69, 0xf6, 0x65, 0x20, 0x53, 0xd1, 0x9e, 0x64, + 0xe5, 0xaa, 0xf5, 0x79, 0x29, 0xd5, 0x42, 0x0d, 0xb0, 0x0f, 0x67, 0xf3, 0x09, 0x94, 0xc2, 0x33, + 0x7b, 0x02, 0x25, 0xfe, 0x6f, 0x01, 0x13, 0xcf, 0xe3, 0xdf, 0x02, 0xc8, 0x4f, 0x52, 0x5f, 0xde, + 0x11, 0x66, 0xd9, 0xc7, 0x67, 0x31, 0xd8, 0x3f, 0x75, 0xaf, 0xef, 0xfc, 0xfd, 0x1c, 0xcc, 0x88, + 0x29, 0x95, 0xf6, 0x07, 0x53, 0x32, 0xa1, 0xec, 0x0c, 0xdc, 0xf9, 0x3c, 0x44, 0x58, 0x8d, 0x09, + 0xe2, 0xfe, 0xe7, 0x27, 0x08, 0x27, 0xbf, 0x9d, 0xa2, 0x46, 0x4c, 0x0e, 0xe0, 0xb4, 0x48, 0x7f, + 0xcf, 0xe5, 0xfc, 0xf1, 0x49, 0x34, 0x87, 0x7f, 0xd2, 0xd7, 0x8d, 0x42, 0x78, 0x8d, 0xb6, 0xce, + 0xce, 0x8d, 0x62, 0xbe, 0x33, 0x73, 0x1a, 0x67, 0xca, 0xcc, 0xa1, 0x78, 0x52, 0xae, 0xef, 0x83, + 0x86, 0xf7, 0xcc, 0xa3, 0x3c, 0xeb, 0x9b, 0x82, 0xd1, 0xfe, 0x68, 0x3e, 0xa6, 0xf8, 0x9b, 0x39, + 0xb8, 0x90, 0xb6, 0x91, 0xa5, 0xd4, 0xa2, 0x1a, 0xaf, 0xc5, 0x60, 0x9e, 0x5b, 0xb3, 0x0e, 0x67, + 0xf3, 0xcc, 0xce, 0xdf, 0x1e, 0x35, 0xbc, 0xcd, 0x21, 0xed, 0xfc, 0x3c, 0xcd, 0x3b, 0x53, 0x9a, + 0x77, 0xec, 0xff, 0x3f, 0xf2, 0xcf, 0xf1, 0xff, 0x3f, 0x46, 0x33, 0xfc, 0xff, 0xc7, 0xd8, 0xf3, + 0xfc, 0xff, 0x8f, 0xc2, 0x09, 0xff, 0xff, 0xa3, 0xf8, 0x53, 0xf3, 0xff, 0x1f, 0xd6, 0xd7, 0x39, + 0x98, 0xfa, 0xff, 0xfd, 0x6f, 0x13, 0x7f, 0x60, 0x84, 0x7b, 0x9f, 0xe3, 0xff, 0x25, 0x3e, 0x8a, + 0x07, 0xd0, 0x96, 0xcf, 0xa4, 0x91, 0x7d, 0x02, 0x69, 0x9f, 0x43, 0x9a, 0x09, 0x7f, 0xb2, 0xfb, + 0x87, 0xb1, 0xbc, 0xa4, 0xa1, 0x13, 0xe7, 0x25, 0xfd, 0xdf, 0x94, 0x5e, 0xe5, 0x67, 0xfb, 0x57, + 0xcf, 0xea, 0x9f, 0xdc, 0x2e, 0xa4, 0xfd, 0x93, 0x5b, 0xe2, 0x9f, 0xdb, 0x92, 0xff, 0xe4, 0x35, + 0xf4, 0x0c, 0xff, 0xc9, 0x6b, 0x02, 0x4a, 0xe6, 0x3f, 0xf1, 0xcf, 0x7d, 0xe7, 0xeb, 0x6b, 0x2f, + 0x7c, 0xf7, 0xeb, 0x6b, 0x2f, 0x7c, 0xef, 0xeb, 0x6b, 0x2f, 0x7c, 0xe3, 0xf8, 0x5a, 0xee, 0x3b, + 0xc7, 0xd7, 0x72, 0xdf, 0x3d, 0xbe, 0x96, 0xfb, 0xde, 0xf1, 0xb5, 0xdc, 0x0f, 0x8e, 0xaf, 0xe5, + 0xfe, 0xd6, 0x7f, 0xbd, 0xf6, 0xc2, 0xc7, 0x05, 0xd5, 0xb6, 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, + 0x98, 0x23, 0xb1, 0x1c, 0xee, 0x82, 0x00, 0x00, } func (m *Amount) Marshal() (dAtA []byte, err error) { @@ -29083,7 +29084,7 @@ func (m *WorkflowStatus) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Phase = NodePhase(dAtA[iNdEx:postIndex]) + m.Phase = WorkflowPhase(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { diff --git a/pkg/apis/workflow/v1alpha1/workflow_phase.go b/pkg/apis/workflow/v1alpha1/workflow_phase.go new file mode 100644 index 000000000000..cb2e62b39d7c --- /dev/null +++ b/pkg/apis/workflow/v1alpha1/workflow_phase.go @@ -0,0 +1,22 @@ +package v1alpha1 + +// the workflow's phase +type WorkflowPhase string + +const ( + WorkflowUnknown WorkflowPhase = "" + WorkflowPending WorkflowPhase = "Pending" // pending some set-up - rarely used + WorkflowRunning WorkflowPhase = "Running" // any node has started; pods might not be running yet, the workflow maybe suspended too + WorkflowSucceeded WorkflowPhase = "Succeeded" + WorkflowFailed WorkflowPhase = "Failed" // it maybe that the the workflow was terminated + WorkflowError WorkflowPhase = "Error" +) + +func (p WorkflowPhase) Completed() bool { + switch p { + case WorkflowSucceeded, WorkflowFailed, WorkflowError: + return true + default: + return false + } +} diff --git a/pkg/apis/workflow/v1alpha1/workflow_phase_test.go b/pkg/apis/workflow/v1alpha1/workflow_phase_test.go new file mode 100644 index 000000000000..23113108cc03 --- /dev/null +++ b/pkg/apis/workflow/v1alpha1/workflow_phase_test.go @@ -0,0 +1,16 @@ +package v1alpha1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestWorkflowPhase_Completed(t *testing.T) { + assert.False(t, WorkflowUnknown.Completed()) + assert.False(t, WorkflowPending.Completed()) + assert.False(t, WorkflowRunning.Completed()) + assert.True(t, WorkflowSucceeded.Completed()) + assert.True(t, WorkflowFailed.Completed()) + assert.True(t, WorkflowError.Completed()) +} diff --git a/pkg/apis/workflow/v1alpha1/workflow_types.go b/pkg/apis/workflow/v1alpha1/workflow_types.go index c8b914581d90..350876f23dfb 100644 --- a/pkg/apis/workflow/v1alpha1/workflow_types.go +++ b/pkg/apis/workflow/v1alpha1/workflow_types.go @@ -11,13 +11,13 @@ import ( "strings" "time" - "github.com/argoproj/argo/util/slice" - apiv1 "k8s.io/api/core/v1" policyv1beta "k8s.io/api/policy/v1beta1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" + + "github.com/argoproj/argo/util/slice" ) // TemplateType is the type of a template @@ -1291,7 +1291,7 @@ type UserContainer struct { // WorkflowStatus contains overall status information about a workflow type WorkflowStatus struct { // Phase a simple, high-level summary of where the workflow is in its lifecycle. - Phase NodePhase `json:"phase,omitempty" protobuf:"bytes,1,opt,name=phase,casttype=NodePhase"` + Phase WorkflowPhase `json:"phase,omitempty" protobuf:"bytes,1,opt,name=phase,casttype=WorkflowPhase"` // Time at which this workflow started StartedAt metav1.Time `json:"startedAt,omitempty" protobuf:"bytes,2,opt,name=startedAt"` @@ -1646,19 +1646,19 @@ func (phase NodePhase) FailedOrError() bool { return phase == NodeFailed || phase == NodeError } -// Fulfilled returns whether or not the workflow has fulfilled its execution, i.e. it completed execution or was skipped +// Fulfilled returns whether or not the workflow has fulfilled its execution func (ws WorkflowStatus) Fulfilled() bool { - return ws.Phase.Fulfilled() + return ws.Phase.Completed() } // Successful return whether or not the workflow has succeeded func (ws WorkflowStatus) Successful() bool { - return ws.Phase == NodeSucceeded + return ws.Phase == WorkflowSucceeded } // Failed return whether or not the workflow has failed func (ws WorkflowStatus) Failed() bool { - return ws.Phase == NodeFailed + return ws.Phase == WorkflowFailed } func (ws WorkflowStatus) StartTime() *metav1.Time { diff --git a/server/workflow/workflow_server_test.go b/server/workflow/workflow_server_test.go index 4c36af4e6c46..8287c6944cfc 100644 --- a/server/workflow/workflow_server_test.go +++ b/server/workflow/workflow_server_test.go @@ -631,7 +631,7 @@ func (t testWatchWorkflowServer) Send(*workflowpkg.WorkflowWatchEvent) error { func TestWatchWorkflows(t *testing.T) { server, ctx := getWorkflowServer() wf := &v1alpha1.Workflow{ - Status: v1alpha1.WorkflowStatus{Phase: v1alpha1.NodeSucceeded}, + Status: v1alpha1.WorkflowStatus{Phase: v1alpha1.WorkflowSucceeded}, } assert.NoError(t, json.Unmarshal([]byte(wf1), &wf)) ctx, cancel := context.WithCancel(ctx) @@ -645,7 +645,7 @@ func TestWatchWorkflows(t *testing.T) { func TestWatchLatestWorkflow(t *testing.T) { server, ctx := getWorkflowServer() wf := &v1alpha1.Workflow{ - Status: v1alpha1.WorkflowStatus{Phase: v1alpha1.NodeSucceeded}, + Status: v1alpha1.WorkflowStatus{Phase: v1alpha1.WorkflowSucceeded}, } assert.NoError(t, json.Unmarshal([]byte(wf1), &wf)) ctx, cancel := context.WithCancel(ctx) @@ -818,7 +818,7 @@ func TestStopWorkflow(t *testing.T) { wf, err = server.StopWorkflow(ctx, &rsmWfReq) if assert.NoError(t, err) { assert.NotNil(t, wf) - assert.Equal(t, v1alpha1.NodeRunning, wf.Status.Phase) + assert.Equal(t, v1alpha1.WorkflowRunning, wf.Status.Phase) } } diff --git a/test/e2e/cli_test.go b/test/e2e/cli_test.go index 74bf279f576c..129cfd49128b 100644 --- a/test/e2e/cli_test.go +++ b/test/e2e/cli_test.go @@ -424,7 +424,7 @@ func (s *CLISuite) TestRoot() { WaitForWorkflow(createdWorkflowName). Then(). ExpectWorkflowName(createdWorkflowName, func(t *testing.T, metadata *corev1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }) }) } @@ -449,7 +449,7 @@ func (s *CLISuite) TestWorkflowSuspendResume() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *corev1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }) } @@ -476,11 +476,11 @@ func (s *CLISuite) TestNodeSuspendResume() { } }). WaitForWorkflow(fixtures.Condition(func(wf *wfv1.Workflow) bool { - return wf.Status.Phase == wfv1.NodeFailed + return wf.Status.Phase == wfv1.WorkflowFailed }), "suspended node"). Then(). ExpectWorkflow(func(t *testing.T, _ *corev1.ObjectMeta, status *wfv1.WorkflowStatus) { - if assert.Equal(t, wfv1.NodeFailed, status.Phase) { + if assert.Equal(t, wfv1.WorkflowFailed, status.Phase) { r := regexp.MustCompile(`child '(node-suspend-[0-9]+)' failed`) res := r.FindStringSubmatch(status.Message) assert.Equal(t, len(res), 2) @@ -762,7 +762,7 @@ func (s *CLISuite) TestWorkflowRetry() { }). WaitForWorkflow(fixtures.Condition(func(wf *wfv1.Workflow) bool { retryTime = wf.Status.FinishedAt - return wf.Status.Phase == wfv1.NodeFailed + return wf.Status.Phase == wfv1.WorkflowFailed }), "is terminated", 20*time.Second). Wait(3*time.Second). RunCli([]string{"retry", "retry-test", "--restart-successful", "--node-field-selector", "templateName==steps-inner"}, func(t *testing.T, output string, err error) { @@ -1184,13 +1184,13 @@ func (s *CLISuite) TestWorkflowLevelSemaphore() { }). SubmitWorkflow(). WaitForWorkflow(fixtures.Condition(func(wf *wfv1.Workflow) bool { - return wf.Status.Phase == "" + return wf.Status.Phase == wfv1.WorkflowUnknown }), "Workflow is waiting for lock"). WaitForWorkflow(). DeleteConfigMap("my-config"). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }) } @@ -1206,7 +1206,7 @@ func (s *CLISuite) TestTemplateLevelSemaphore() { CreateConfigMap("my-config", semaphoreData). SubmitWorkflow(). WaitForWorkflow(fixtures.Condition(func(wf *wfv1.Workflow) bool { - return wf.Status.Phase == wfv1.NodeRunning + return wf.Status.Phase == wfv1.WorkflowRunning }), "waiting for Workflow to run", 10*time.Second). RunCli([]string{"get", "semaphore-tmpl-level"}, func(t *testing.T, output string, err error) { assert.Contains(t, output, "Waiting for") @@ -1446,7 +1446,7 @@ spec: WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) nodeStatus := status.Nodes.FindByDisplayName("release") if assert.NotNil(t, nodeStatus) { assert.Equal(t, "Hello, World!", nodeStatus.Inputs.Parameters[0].Value.String()) diff --git a/test/e2e/cluster_workflow_template_test.go b/test/e2e/cluster_workflow_template_test.go index 584ee99efc3d..602bd424c73f 100644 --- a/test/e2e/cluster_workflow_template_test.go +++ b/test/e2e/cluster_workflow_template_test.go @@ -29,7 +29,7 @@ func (s *ClusterWorkflowTemplateSuite) TestSubmitClusterWorkflowTemplate() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, metadata *v1.ObjectMeta, status *v1alpha1.WorkflowStatus) { - assert.Equal(t, status.Phase, v1alpha1.NodeSucceeded) + assert.Equal(t, status.Phase, v1alpha1.WorkflowSucceeded) }) } @@ -68,7 +68,7 @@ spec: WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, metadata *v1.ObjectMeta, status *v1alpha1.WorkflowStatus) { - assert.Equal(t, v1alpha1.NodeSucceeded, status.Phase) + assert.Equal(t, v1alpha1.WorkflowSucceeded, status.Phase) }) } diff --git a/test/e2e/estimated_duration_test.go b/test/e2e/estimated_duration_test.go index 273b3d926303..31ba2a92b09c 100644 --- a/test/e2e/estimated_duration_test.go +++ b/test/e2e/estimated_duration_test.go @@ -28,7 +28,7 @@ func (s *EstimatedDurationSuite) TestWorkflowTemplate() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, metadata *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) assert.NotEmpty(t, status.EstimatedDuration) assert.NotEmpty(t, status.Nodes[metadata.Name].EstimatedDuration) }) @@ -45,7 +45,7 @@ func (s *EstimatedDurationSuite) TestClusterWorkflowTemplate() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, metadata *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) assert.NotEmpty(t, status.EstimatedDuration) assert.NotEmpty(t, status.Nodes[metadata.Name].EstimatedDuration) }) @@ -62,7 +62,7 @@ func (s *EstimatedDurationSuite) TestCronWorkflow() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, metadata *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) assert.NotEmpty(t, status.EstimatedDuration) assert.NotEmpty(t, status.Nodes[metadata.Name].EstimatedDuration) }) diff --git a/test/e2e/functional_test.go b/test/e2e/functional_test.go index 8c7791cdc327..80a811d0af63 100644 --- a/test/e2e/functional_test.go +++ b/test/e2e/functional_test.go @@ -30,7 +30,7 @@ func (s *FunctionalSuite) TestArchiveStrategies() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }) } @@ -46,7 +46,7 @@ func (s *FunctionalSuite) TestDeletingPendingPod() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, metadata *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) assert.Len(t, status.Nodes, 1) }) } @@ -66,9 +66,9 @@ func (s *FunctionalSuite) TestDeletingRunningPod() { // the outcome could be either of these, depending on time // this is due to the grace period recently deleted pods get switch status.Phase { - case wfv1.NodeError: + case wfv1.WorkflowError: assert.Equal(t, "pod deleted during operation", status.Nodes[metadata.Name].Message) - case wfv1.NodeFailed: + case wfv1.WorkflowFailed: assert.Contains(t, status.Nodes[metadata.Name].Message, "failed with exit code") default: assert.Fail(t, "expected error of failed") @@ -88,7 +88,7 @@ func (s *FunctionalSuite) TestDeletingRunningPodWithOrErrorRetryPolicy() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, metadata *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) assert.Len(t, status.Nodes, 2) }) } @@ -106,7 +106,7 @@ func (s *FunctionalSuite) TestSynchronizationWfLevelMutex() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }) } @@ -119,7 +119,7 @@ func (s *FunctionalSuite) TestTemplateLevelMutex() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }) } @@ -158,7 +158,7 @@ func (s *FunctionalSuite) TestResourceQuota() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }) } @@ -208,7 +208,7 @@ spec: WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) assert.Len(t, status.Nodes, 7) nodeStatus := status.Nodes.FindByDisplayName("B") if assert.NotNil(t, nodeStatus) { @@ -276,7 +276,7 @@ spec: WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) assert.Len(t, status.Nodes, 6) bStatus := status.Nodes.FindByDisplayName("B") @@ -302,7 +302,7 @@ func (s *FunctionalSuite) TestFastFailOnPodTermination() { WaitForWorkflow(120 * time.Second). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeError, status.Phase) + assert.Equal(t, wfv1.WorkflowError, status.Phase) assert.Len(t, status.Nodes, 4) nodeStatus := status.Nodes.FindByDisplayName("sleep") assert.Equal(t, wfv1.NodeError, nodeStatus.Phase) @@ -408,7 +408,7 @@ func (s *FunctionalSuite) TestArtifactRepositoryRef() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, metadata *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) if assert.NotEmpty(t, status.ArtifactRepositoryRef) { assert.Equal(t, "argo", status.ArtifactRepositoryRef.Namespace) assert.Equal(t, "artifact-repositories", status.ArtifactRepositoryRef.ConfigMap) @@ -433,7 +433,7 @@ func (s *FunctionalSuite) TestLoopEmptyParam() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) if assert.Len(t, status.Nodes, 5) { nodeStatus := status.Nodes.FindByDisplayName("sleep") assert.Equal(t, wfv1.NodeSkipped, nodeStatus.Phase) @@ -542,7 +542,7 @@ func (s *FunctionalSuite) TestParameterAggregation() { WaitForWorkflow(60 * time.Second). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) nodeStatus := status.Nodes.FindByDisplayName("print(0:res:1)") if assert.NotNil(t, nodeStatus) { assert.Equal(t, wfv1.NodeSucceeded, nodeStatus.Phase) @@ -558,7 +558,7 @@ func (s *FunctionalSuite) TestGlobalScope() { WaitForWorkflow(60 * time.Second). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) nodeStatus := status.Nodes.FindByDisplayName("consume-global-parameter-1") if assert.NotNil(t, nodeStatus) { assert.Equal(t, wfv1.NodeSucceeded, nodeStatus.Phase) @@ -595,7 +595,7 @@ func (s *FunctionalSuite) TestStopBehavior() { WaitForWorkflow(45 * time.Second). Then(). ExpectWorkflow(func(t *testing.T, m *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeFailed, status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, status.Phase) nodeStatus := status.Nodes.FindByDisplayName("A.onExit") if assert.NotNil(t, nodeStatus) { assert.Equal(t, wfv1.NodeSucceeded, nodeStatus.Phase) @@ -620,7 +620,7 @@ func (s *FunctionalSuite) TestTerminateBehavior() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, m *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeFailed, status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, status.Phase) nodeStatus := status.Nodes.FindByDisplayName("A.onExit") assert.Nil(t, nodeStatus) nodeStatus = status.Nodes.FindByDisplayName(m.Name + ".onExit") @@ -636,7 +636,7 @@ func (s *FunctionalSuite) TestDAGDepends() { WaitForWorkflow(45 * time.Second). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) nodeStatus := status.Nodes.FindByDisplayName("A") assert.NotNil(t, nodeStatus) assert.Equal(t, wfv1.NodeSucceeded, nodeStatus.Phase) @@ -702,7 +702,7 @@ spec: WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) assert.True(t, status.Nodes.Any(func(node wfv1.NodeStatus) bool { if node.Outputs != nil { for _, param := range node.Outputs.Parameters { @@ -724,7 +724,7 @@ func (s *FunctionalSuite) TestSameInputOutputPathOptionalArtifact() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }) } @@ -736,7 +736,7 @@ func (s *FunctionalSuite) TestOptionalInputArtifacts() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }) } @@ -748,7 +748,7 @@ func (s *FunctionalSuite) TestOutputArtifactS3BucketCreationEnabled() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }) } @@ -763,7 +763,7 @@ func (s *FunctionalSuite) TestWorkflowTemplateRefWithExitHandler() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) assert.Empty(t, status.Message) }) } @@ -798,7 +798,7 @@ spec: WaitForWorkflow(45 * time.Second). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeFailed, status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, status.Phase) assert.Len(t, status.Nodes, 3) node := status.Nodes.FindByDisplayName("retry-backoff-2(1)") if assert.NotNil(t, node) { @@ -837,7 +837,7 @@ spec: WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeFailed, status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, status.Phase) if node := status.Nodes.FindByDisplayName("param-ads"); assert.NotNil(t, node) { assert.Contains(t, node.Message, "Pod was active on the node longer than the specified deadline") } @@ -875,7 +875,7 @@ spec: WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeFailed, status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, status.Phase) if node := status.Nodes.FindByDisplayName("param-limit"); assert.NotNil(t, node) { assert.Contains(t, node.Message, "No more retries left") } @@ -901,7 +901,7 @@ func (s *FunctionalSuite) TestStorageQuotaLimit() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }) } @@ -944,7 +944,7 @@ spec: When(). SubmitWorkflow(). WaitForWorkflow(fixtures.Condition(func(wf *wfv1.Workflow) bool { - return wf.Status.Phase == wfv1.NodeFailed + return wf.Status.Phase == wfv1.WorkflowFailed }), "Waiting for timeout", 30*time.Second) } @@ -991,7 +991,7 @@ spec: MemoryQuota("130M"). SubmitWorkflow(). WaitForWorkflow(fixtures.Condition(func(wf *wfv1.Workflow) bool { - return wf.Status.Phase == wfv1.NodeFailed + return wf.Status.Phase == wfv1.WorkflowFailed }), "Waiting for timeout", 30*time.Second). DeleteMemoryQuota() } diff --git a/test/e2e/malformed_resources_test.go b/test/e2e/malformed_resources_test.go index 61d9dfee308e..6060711a1710 100644 --- a/test/e2e/malformed_resources_test.go +++ b/test/e2e/malformed_resources_test.go @@ -31,7 +31,7 @@ func (s *MalformedResourcesSuite) TestMalformedWorkflow() { Then(). ExpectWorkflow(func(t *testing.T, metadata *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { assert.Equal(t, "malformed", metadata.Name) - assert.Equal(t, wfv1.NodeFailed, status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, status.Phase) }) } @@ -44,7 +44,7 @@ func (s *MalformedResourcesSuite) TestMalformedCronWorkflow() { Then(). ExpectWorkflow(func(t *testing.T, metadata *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { assert.Equal(t, "wellformed", metadata.Labels[common.LabelKeyCronWorkflow]) - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }). ExpectAuditEvents( fixtures.HasInvolvedObjectWithName(workflow.CronWorkflowKind, "malformed"), @@ -67,7 +67,7 @@ func (s *MalformedResourcesSuite) TestMalformedWorkflowTemplate() { Then(). ExpectWorkflow(func(t *testing.T, metadata *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { assert.Equal(t, "wellformed", metadata.Name) - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }) } @@ -80,7 +80,7 @@ func (s *MalformedResourcesSuite) TestMalformedWorkflowTemplateRef() { Then(). ExpectWorkflow(func(t *testing.T, metadata *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { assert.Equal(t, "wellformed", metadata.Name) - assert.Equal(t, wfv1.NodeError, status.Phase) + assert.Equal(t, wfv1.WorkflowError, status.Phase) assert.Contains(t, status.Message, "malformed workflow template") }) } @@ -95,7 +95,7 @@ func (s *MalformedResourcesSuite) TestMalformedClusterWorkflowTemplate() { Then(). ExpectWorkflow(func(t *testing.T, metadata *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { assert.Equal(t, "wellformed", metadata.Name) - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }) } @@ -108,7 +108,7 @@ func (s *MalformedResourcesSuite) TestMalformedClusterWorkflowTemplateRef() { Then(). ExpectWorkflow(func(t *testing.T, metadata *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { assert.Equal(t, "wellformed", metadata.Name) - assert.Equal(t, wfv1.NodeError, status.Phase) + assert.Equal(t, wfv1.WorkflowError, status.Phase) assert.Contains(t, status.Message, "malformed cluster workflow template") }) } diff --git a/test/e2e/progress_test.go b/test/e2e/progress_test.go index 621ddb5a174f..7c7abc3d991a 100644 --- a/test/e2e/progress_test.go +++ b/test/e2e/progress_test.go @@ -25,7 +25,7 @@ func (s *ProgressSuite) TestDefaultProgress() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, metadata *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) assert.Equal(t, wfv1.Progress("1/1"), status.Progress) assert.Equal(t, wfv1.Progress("1/1"), status.Nodes[metadata.Name].Progress) }) diff --git a/test/e2e/smoke_test.go b/test/e2e/smoke_test.go index 0b47c1b66eec..104fdce62fb1 100644 --- a/test/e2e/smoke_test.go +++ b/test/e2e/smoke_test.go @@ -28,7 +28,7 @@ func (s *SmokeSuite) TestBasicWorkflow() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) assert.NotEmpty(t, status.Nodes) assert.NotEmpty(t, status.ResourcesDuration) }) @@ -45,7 +45,7 @@ func (s *SmokeSuite) TestRunAsNonRootWorkflow() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }) } @@ -67,7 +67,7 @@ func (s *SmokeSuite) TestArtifactPassing() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }) } @@ -81,7 +81,7 @@ func (s *SmokeSuite) TestWorkflowTemplateBasic() { WaitForWorkflow(60 * time.Second). Then(). ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { - assert.Equal(t, wfv1.NodeSucceeded, status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, status.Phase) }) } diff --git a/test/e2e/workflow_template_test.go b/test/e2e/workflow_template_test.go index d530efa20c82..6b62bf71e178 100644 --- a/test/e2e/workflow_template_test.go +++ b/test/e2e/workflow_template_test.go @@ -29,7 +29,7 @@ func (s *WorkflowTemplateSuite) TestSubmitWorkflowTemplate() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, metadata *v1.ObjectMeta, status *v1alpha1.WorkflowStatus) { - assert.Equal(t, status.Phase, v1alpha1.NodeSucceeded) + assert.Equal(t, status.Phase, v1alpha1.WorkflowSucceeded) }) } @@ -65,7 +65,7 @@ spec: WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, metadata *v1.ObjectMeta, status *v1alpha1.WorkflowStatus) { - assert.Equal(t, status.Phase, v1alpha1.NodeSucceeded) + assert.Equal(t, status.Phase, v1alpha1.WorkflowSucceeded) }) } @@ -82,7 +82,7 @@ func (s *WorkflowTemplateSuite) TestSubmitWorkflowTemplateWithEnum() { WaitForWorkflow(). Then(). ExpectWorkflow(func(t *testing.T, metadata *v1.ObjectMeta, status *v1alpha1.WorkflowStatus) { - assert.Equal(t, status.Phase, v1alpha1.NodeSucceeded) + assert.Equal(t, status.Phase, v1alpha1.WorkflowSucceeded) }) } diff --git a/ui/src/app/shared/services/workflows-service.ts b/ui/src/app/shared/services/workflows-service.ts index 4542abed464a..fba2211aa73d 100644 --- a/ui/src/app/shared/services/workflows-service.ts +++ b/ui/src/app/shared/services/workflows-service.ts @@ -1,6 +1,6 @@ import {Observable} from 'rxjs'; import * as models from '../../../models'; -import {Event, LogEntry, NodeStatus, Workflow, WorkflowList} from '../../../models'; +import {Event, LogEntry, NodeStatus, Workflow, WorkflowList, WorkflowPhase} from '../../../models'; import {SubmitOpts} from '../../../models/submit-opts'; import {Pagination} from '../pagination'; import requests from './requests'; @@ -20,7 +20,7 @@ export class WorkflowsService { public list( namespace: string, - phases: string[], + phases: WorkflowPhase[], labels: string[], pagination: Pagination, fields = [ @@ -58,7 +58,7 @@ export class WorkflowsService { public watch(filter: { namespace?: string; name?: string; - phases?: Array; + phases?: Array; labels?: Array; resourceVersion?: string; }): Observable> { @@ -73,7 +73,7 @@ export class WorkflowsService { public watchFields(filter: { namespace?: string; name?: string; - phases?: Array; + phases?: Array; labels?: Array; resourceVersion?: string; }): Observable> { @@ -219,7 +219,7 @@ export class WorkflowsService { return node.outputs.artifacts.findIndex(a => a.name === `${container}-logs`) !== -1; } - private queryParams(filter: {namespace?: string; name?: string; phases?: Array; labels?: Array; resourceVersion?: string}) { + private queryParams(filter: {namespace?: string; name?: string; phases?: Array; labels?: Array; resourceVersion?: string}) { const queryParams: string[] = []; if (filter.name) { queryParams.push(`listOptions.fieldSelector=metadata.name=${filter.name}`); @@ -234,7 +234,7 @@ export class WorkflowsService { return queryParams; } - private labelSelectorParams(phases?: Array, labels?: Array) { + private labelSelectorParams(phases?: Array, labels?: Array) { let labelSelector = ''; if (phases && phases.length > 0) { labelSelector = `workflows.argoproj.io/phase in (${phases.join(',')})`; diff --git a/ui/src/app/workflows/components/workflow-filters/workflow-filters.tsx b/ui/src/app/workflows/components/workflow-filters/workflow-filters.tsx index 59828654a900..0bc706ecf0b0 100644 --- a/ui/src/app/workflows/components/workflow-filters/workflow-filters.tsx +++ b/ui/src/app/workflows/components/workflow-filters/workflow-filters.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; import * as models from '../../../../models'; +import {WorkflowPhase} from '../../../../models'; import {CheckboxFilter} from '../../../shared/components/checkbox-filter/checkbox-filter'; import {DataLoaderDropdown} from '../../../shared/components/data-loader-dropdown'; import {NamespaceFilter} from '../../../shared/components/namespace-filter'; @@ -11,10 +12,10 @@ require('./workflow-filters.scss'); interface WorkflowFilterProps { workflows: models.Workflow[]; namespace: string; - phaseItems: string[]; - selectedPhases: string[]; + phaseItems: WorkflowPhase[]; + selectedPhases: WorkflowPhase[]; selectedLabels: string[]; - onChange: (namespace: string, selectedPhases: string[], labels: string[]) => void; + onChange: (namespace: string, selectedPhases: WorkflowPhase[], labels: string[]) => void; } export class WorkflowFilters extends React.Component { @@ -73,7 +74,11 @@ export class WorkflowFilters extends React.Component { { - this.props.onChange(this.props.namespace, selected, this.props.selectedLabels); + this.props.onChange( + this.props.namespace, + selected.map(x => x as WorkflowPhase), + this.props.selectedLabels + ); }} items={this.getPhaseItems(this.props.workflows)} type='phase' diff --git a/ui/src/app/workflows/components/workflows-list/workflows-list.tsx b/ui/src/app/workflows/components/workflows-list/workflows-list.tsx index ac1f54c306a6..0fdab12bb94f 100644 --- a/ui/src/app/workflows/components/workflows-list/workflows-list.tsx +++ b/ui/src/app/workflows/components/workflows-list/workflows-list.tsx @@ -2,7 +2,7 @@ import {Autocomplete, Page, SlidingPanel} from 'argo-ui'; import * as React from 'react'; import {RouteComponentProps} from 'react-router-dom'; import * as models from '../../../../models'; -import {labels, Workflow, WorkflowPhases} from '../../../../models'; +import {labels, Workflow, WorkflowPhase, WorkflowPhases} from '../../../../models'; import {uiUrl} from '../../../shared/base'; import {BasePage} from '../../../shared/components/base-page'; @@ -30,7 +30,7 @@ require('./workflows-list.scss'); interface State { namespace: string; pagination: Pagination; - selectedPhases: string[]; + selectedPhases: WorkflowPhase[]; selectedLabels: string[]; selectedWorkflows: Map; workflows?: Workflow[]; @@ -41,7 +41,7 @@ interface State { interface WorkflowListRenderOptions { paginationLimit: number; - selectedPhases: string[]; + selectedPhases: WorkflowPhase[]; } const allBatchActionsEnabled: Actions.OperationDisabled = { @@ -112,7 +112,7 @@ export class WorkflowsList extends BasePage, State> { limit: parseLimit(this.queryParam('limit')) || savedOptions.paginationLimit || 500 }, namespace: this.props.match.params.namespace || '', - selectedPhases: this.queryParams('phase').length > 0 ? this.queryParams('phase') : savedOptions.selectedPhases, + selectedPhases: this.queryParams('phase').length > 0 ? (this.queryParams('phase') as WorkflowPhase[]) : savedOptions.selectedPhases, selectedLabels: this.queryParams('label'), selectedWorkflows: new Map(), batchActionDisabled: {...allBatchActionsEnabled} @@ -194,7 +194,7 @@ export class WorkflowsList extends BasePage, State> { ); } - private fetchWorkflows(namespace: string, selectedPhases: string[], selectedLabels: string[], pagination: Pagination): void { + private fetchWorkflows(namespace: string, selectedPhases: WorkflowPhase[], selectedLabels: string[], pagination: Pagination): void { if (this.listWatch) { this.listWatch.stop(); } @@ -221,7 +221,7 @@ export class WorkflowsList extends BasePage, State> { this.listWatch.start(); } - private changeFilters(namespace: string, selectedPhases: string[], selectedLabels: string[], pagination: Pagination) { + private changeFilters(namespace: string, selectedPhases: WorkflowPhase[], selectedLabels: string[], pagination: Pagination) { this.fetchWorkflows(namespace, selectedPhases, selectedLabels, pagination); } diff --git a/ui/src/models/workflows.ts b/ui/src/models/workflows.ts index ab422703af72..a941932ef85d 100644 --- a/ui/src/models/workflows.ts +++ b/ui/src/models/workflows.ts @@ -848,9 +848,11 @@ export interface MemoizationStatus { cacheName: string; } -export type NodePhase = '' | 'Pending' | 'Running' | 'Succeeded' | 'Skipped' | 'Failed' | 'Error' | 'Omitted'; +export type WorkflowPhase = 'Pending' | 'Running' | 'Succeeded' | 'Failed' | 'Error'; + +export const WorkflowPhases: WorkflowPhase[] = ['Pending', 'Running', 'Succeeded', 'Failed', 'Error']; -export const WorkflowPhases: NodePhase[] = ['Pending', 'Running', 'Succeeded', 'Failed', 'Error']; +export type NodePhase = '' | 'Pending' | 'Running' | 'Succeeded' | 'Skipped' | 'Failed' | 'Error' | 'Omitted'; export const NODE_PHASE = { PENDING: 'Pending', diff --git a/util/fields/fields_test.go b/util/fields/fields_test.go index d10d2834e1cc..970722d052f9 100644 --- a/util/fields/fields_test.go +++ b/util/fields/fields_test.go @@ -67,7 +67,7 @@ func TestCleanFields(t *testing.T) { err = json.Unmarshal(cleanJsonWf, &cleanWf) assert.NoError(t, err) - assert.Equal(t, "Succeeded", string(cleanWf.Status.Phase)) + assert.Equal(t, v1alpha1.WorkflowSucceeded, cleanWf.Status.Phase) assert.Equal(t, "whalesay", cleanWf.Spec.Entrypoint) assert.Equal(t, "hello-world-qgpxz", cleanWf.Name) @@ -89,7 +89,7 @@ func TestCleanFieldsExclude(t *testing.T) { err = json.Unmarshal(cleanJsonWf, &cleanWf) assert.NoError(t, err) - assert.Empty(t, string(cleanWf.Status.Phase)) + assert.Empty(t, cleanWf.Status.Phase) assert.Empty(t, cleanWf.Spec.Entrypoint) assert.Empty(t, cleanWf.Name) diff --git a/util/printer/workflow-printer.go b/util/printer/workflow-printer.go index 3ca6ddb5aace..9eaebb932fdb 100644 --- a/util/printer/workflow-printer.go +++ b/util/printer/workflow-printer.go @@ -129,24 +129,21 @@ func parameterString(params []wfv1.Parameter) string { } // WorkflowStatus returns a human readable inferred workflow status based on workflow phase and conditions -func WorkflowStatus(wf *wfv1.Workflow) wfv1.NodePhase { +func WorkflowStatus(wf *wfv1.Workflow) string { switch wf.Status.Phase { - case wfv1.NodeRunning: + case wfv1.WorkflowRunning: if util.IsWorkflowSuspended(wf) { return "Running (Suspended)" } - return wf.Status.Phase - case wfv1.NodeFailed: + case wfv1.WorkflowFailed: if wf.Spec.Shutdown != "" { return "Failed (Terminated)" } - return wf.Status.Phase - case "", wfv1.NodePending: + case wfv1.WorkflowUnknown, wfv1.WorkflowPending: if !wf.ObjectMeta.CreationTimestamp.IsZero() { - return wfv1.NodePending + return "Pending" } return "Unknown" - default: - return wf.Status.Phase } + return string(wf.Status.Phase) } diff --git a/util/printer/workflow-printer_test.go b/util/printer/workflow-printer_test.go index 80dc806b01d5..b3242a125eae 100644 --- a/util/printer/workflow-printer_test.go +++ b/util/printer/workflow-printer_test.go @@ -28,7 +28,7 @@ func TestPrintWorkflows(t *testing.T) { }, }, Status: wfv1.WorkflowStatus{ - Phase: wfv1.NodeRunning, + Phase: wfv1.WorkflowRunning, StartedAt: metav1.Time{Time: now}, FinishedAt: metav1.Time{Time: now.Add(3 * time.Second)}, Nodes: wfv1.Nodes{ diff --git a/workflow/controller/controller_test.go b/workflow/controller/controller_test.go index 2f51258e641c..6ac2558b5780 100644 --- a/workflow/controller/controller_test.go +++ b/workflow/controller/controller_test.go @@ -447,7 +447,7 @@ spec: expectWorkflow(ctx, controller, "my-wf-0", func(wf *wfv1.Workflow) { if assert.NotNil(t, wf) { - assert.Equal(t, wfv1.NodeRunning, wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, wf.Status.Phase) } }) expectWorkflow(ctx, controller, "my-wf-1", func(wf *wfv1.Workflow) { diff --git a/workflow/controller/dag_test.go b/workflow/controller/dag_test.go index 350e36b4c7bd..56888869e9d3 100644 --- a/workflow/controller/dag_test.go +++ b/workflow/controller/dag_test.go @@ -22,7 +22,7 @@ func TestDagXfail(t *testing.T) { woc := newWoc(*wf) ctx := context.Background() woc.operate(ctx) - assert.Equal(t, string(wfv1.NodeFailed), string(woc.wf.Status.Phase)) + assert.Equal(t, wfv1.WorkflowFailed, woc.wf.Status.Phase) } // TestDagRetrySucceeded verifies a DAG will be marked Succeeded if retry was successful @@ -31,7 +31,7 @@ func TestDagRetrySucceeded(t *testing.T) { woc := newWoc(*wf) ctx := context.Background() woc.operate(ctx) - assert.Equal(t, string(wfv1.NodeSucceeded), string(woc.wf.Status.Phase)) + assert.Equal(t, wfv1.WorkflowSucceeded, woc.wf.Status.Phase) } // TestDagRetryExhaustedXfail verifies we fail properly when we exhaust our retries @@ -40,7 +40,7 @@ func TestDagRetryExhaustedXfail(t *testing.T) { woc := newWoc(*wf) ctx := context.Background() woc.operate(ctx) - assert.Equal(t, string(wfv1.NodeFailed), string(woc.wf.Status.Phase)) + assert.Equal(t, wfv1.WorkflowFailed, woc.wf.Status.Phase) } // TestDagDisableFailFast test disable fail fast function @@ -49,7 +49,7 @@ func TestDagDisableFailFast(t *testing.T) { woc := newWoc(*wf) ctx := context.Background() woc.operate(ctx) - assert.Equal(t, string(wfv1.NodeFailed), string(woc.wf.Status.Phase)) + assert.Equal(t, wfv1.WorkflowFailed, woc.wf.Status.Phase) } var dynamicSingleDag = ` @@ -197,7 +197,7 @@ func TestArtifactResolutionWhenSkippedDAG(t *testing.T) { woc = newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeSucceeded, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, woc.wf.Status.Phase) } func TestEvaluateDependsLogic(t *testing.T) { @@ -779,7 +779,7 @@ func TestDagAssessPhaseContinueOnExpandedTaskVariables(t *testing.T) { woc.operate(ctx) woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeSucceeded, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, woc.wf.Status.Phase) } var dagAssessPhaseContinueOnExpandedTask = ` @@ -1002,7 +1002,7 @@ func TestDagAssessPhaseContinueOnExpandedTask(t *testing.T) { woc.operate(ctx) woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeSucceeded, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, woc.wf.Status.Phase) } var dagWithParamAndGlobalParam = ` @@ -1049,7 +1049,7 @@ func TestDAGWithParamAndGlobalParam(t *testing.T) { woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) } var terminatingDAGWithRetryStrategyNodes = ` @@ -1287,7 +1287,7 @@ func TestTerminatingDAGWithRetryStrategyNodes(t *testing.T) { woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeFailed, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, woc.wf.Status.Phase) } var terminateDAGWithMaxDurationLimitExpiredAndMoreAttempts = ` @@ -1456,7 +1456,7 @@ func TestTerminateDAGWithMaxDurationLimitExpiredAndMoreAttempts(t *testing.T) { woc.operate(ctx) // This is the crucial part of the test - assert.Equal(t, wfv1.NodeFailed, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, woc.wf.Status.Phase) } var testRetryStrategyNodes = ` @@ -1644,7 +1644,7 @@ func TestRetryStrategyNodes(t *testing.T) { assert.Equal(t, wfv1.NodePending, onExitNode.Phase) } - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) } var testOnExitNodeDAGPhase = ` @@ -1809,7 +1809,7 @@ func TestOnExitDAGPhase(t *testing.T) { assert.Equal(t, wfv1.NodePending, retryNode.Phase) } - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) } var testOnExitNonLeaf = ` @@ -1944,7 +1944,7 @@ func TestOnExitNonLeaf(t *testing.T) { if assert.NotNil(t, retryNode) { assert.Equal(t, wfv1.NodePending, retryNode.Phase) } - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) } var testDagOptionalInputArtifacts = ` @@ -2040,7 +2040,7 @@ func TestDagOptionalInputArtifacts(t *testing.T) { woc := newWorkflowOperationCtx(wf, controller) ctx := context.Background() woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) optionalInputArtifactsNode := woc.wf.GetNodeByName("dag-optional-inputartifacts.B") if assert.NotNil(t, optionalInputArtifactsNode) { assert.Equal(t, wfv1.NodePending, optionalInputArtifactsNode.Phase) @@ -2349,7 +2349,7 @@ func TestEmptyWithParamDAG(t *testing.T) { woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeSucceeded, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, woc.wf.Status.Phase) } var testFailsWithParamDAG = ` @@ -3026,7 +3026,7 @@ func TestFailsWithParamDAG(t *testing.T) { woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeFailed, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, woc.wf.Status.Phase) } var testLeafContinueOn = ` @@ -3151,5 +3151,5 @@ func TestLeafContinueOn(t *testing.T) { ctx := context.Background() woc.operate(ctx) - assert.Equal(t, wfv1.NodeSucceeded, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, woc.wf.Status.Phase) } diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index b4047276e9f5..b9ca2dbdc126 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -186,7 +186,7 @@ func (woc *wfOperationCtx) operate(ctx context.Context) { if rerr, ok := r.(error); ok { woc.markWorkflowError(ctx, rerr) } else { - woc.markWorkflowPhase(ctx, wfv1.NodeError, fmt.Sprintf("%v", r)) + woc.markWorkflowError(ctx, fmt.Errorf("%v", r)) } woc.controller.metrics.OperationPanic() } @@ -247,7 +247,7 @@ func (woc *wfOperationCtx) operate(ctx context.Context) { woc.setGlobalParameters(woc.execWf.Spec.Arguments) // Perform one-time workflow validation - if woc.wf.Status.Phase == "" { + if woc.wf.Status.Phase == wfv1.WorkflowUnknown { woc.markWorkflowRunning(ctx) err := woc.createPDBResource(ctx) if err != nil { @@ -330,7 +330,7 @@ func (woc *wfOperationCtx) operate(ctx context.Context) { if errorsutil.IsTransientErr(err) { // Error was most likely caused by a lack of resources. // In this case, Workflow will be in pending state and requeue. - woc.markWorkflowPhase(ctx, wfv1.NodePending, fmt.Sprintf("Waiting for a PVC to be created. %v", err)) + woc.markWorkflowPhase(ctx, wfv1.WorkflowPending, fmt.Sprintf("Waiting for a PVC to be created. %v", err)) woc.requeue() return } @@ -338,7 +338,7 @@ func (woc *wfOperationCtx) operate(ctx context.Context) { woc.log.WithError(err).Error("pvc create error") woc.markWorkflowError(ctx, err) return - } else if woc.wf.Status.Phase == wfv1.NodePending { + } else if woc.wf.Status.Phase == wfv1.WorkflowPending { // Workflow might be in pending state if previous PVC creation is forbidden woc.markWorkflowRunning(ctx) } @@ -365,15 +365,19 @@ func (woc *wfOperationCtx) operate(ctx context.Context) { return } - workflowStatus := node.Phase + workflowStatus := map[wfv1.NodePhase]wfv1.WorkflowPhase{ + wfv1.NodePending: wfv1.WorkflowPending, + wfv1.NodeRunning: wfv1.WorkflowRunning, + wfv1.NodeSucceeded: wfv1.WorkflowSucceeded, + wfv1.NodeSkipped: wfv1.WorkflowSucceeded, + wfv1.NodeFailed: wfv1.WorkflowFailed, + wfv1.NodeError: wfv1.WorkflowError, + wfv1.NodeOmitted: wfv1.WorkflowSucceeded, + }[node.Phase] + var onExitNode *wfv1.NodeStatus if woc.execWf.Spec.OnExit != "" && woc.wf.Spec.Shutdown.ShouldExecute(true) { - if workflowStatus == wfv1.NodeSkipped { - // treat skipped the same as Succeeded for workflow.status - woc.globalParams[common.GlobalVarWorkflowStatus] = string(wfv1.NodeSucceeded) - } else { - woc.globalParams[common.GlobalVarWorkflowStatus] = string(workflowStatus) - } + woc.globalParams[common.GlobalVarWorkflowStatus] = string(workflowStatus) var failures []failedNodeStatus for _, node := range woc.wf.Status.Nodes { @@ -421,18 +425,23 @@ func (woc *wfOperationCtx) operate(ctx context.Context) { // exit handlers were executed. We now need to infer the workflow phase from the // node phase. switch workflowStatus { - case wfv1.NodeSucceeded, wfv1.NodeSkipped: + case wfv1.WorkflowSucceeded: if onExitNode != nil && onExitNode.FailedOrError() { // if main workflow succeeded, but the exit node was unsuccessful // the workflow is now considered unsuccessful. - woc.markWorkflowPhase(ctx, onExitNode.Phase, onExitNode.Message) + switch onExitNode.Phase { + case wfv1.NodeFailed: + woc.markWorkflowFailed(ctx, onExitNode.Message) + default: + woc.markWorkflowError(ctx, fmt.Errorf(onExitNode.Message)) + } } else { woc.markWorkflowSuccess(ctx) } - case wfv1.NodeFailed: + case wfv1.WorkflowFailed: woc.markWorkflowFailed(ctx, workflowMessage) - case wfv1.NodeError: - woc.markWorkflowPhase(ctx, wfv1.NodeError, workflowMessage) + case wfv1.WorkflowError: + woc.markWorkflowPhase(ctx, wfv1.WorkflowError, workflowMessage) default: // NOTE: we should never make it here because if the node was 'Running' we should have // returned earlier. @@ -1378,7 +1387,7 @@ func inferFailedReason(pod *apiv1.Pod) (wfv1.NodePhase, string) { } func (woc *wfOperationCtx) createPVCs(ctx context.Context) error { - if !(woc.wf.Status.Phase == wfv1.NodePending || woc.wf.Status.Phase == wfv1.NodeRunning) { + if !(woc.wf.Status.Phase == wfv1.WorkflowPending || woc.wf.Status.Phase == wfv1.WorkflowRunning) { // Only attempt to create PVCs if workflow is in Pending or Running state // (e.g. passed validation, or didn't already complete) return nil @@ -1450,7 +1459,7 @@ func (woc *wfOperationCtx) deletePVCs(ctx context.Context) error { switch gcStrategy { case wfv1.VolumeClaimGCOnSuccess: - if woc.wf.Status.Phase == wfv1.NodeError || woc.wf.Status.Phase == wfv1.NodeFailed { + if woc.wf.Status.Phase == wfv1.WorkflowError || woc.wf.Status.Phase == wfv1.WorkflowFailed { // Skip deleting PVCs to reuse them for retried failed/error workflows. // PVCs are automatically deleted when corresponded owner workflows get deleted. return nil @@ -1843,10 +1852,10 @@ func (woc *wfOperationCtx) checkTemplateTimeout(tmpl *wfv1.Template, node *wfv1. // markWorkflowPhase is a convenience method to set the phase of the workflow with optional message // optionally marks the workflow completed, which sets the finishedAt timestamp and completed label -func (woc *wfOperationCtx) markWorkflowPhase(ctx context.Context, phase wfv1.NodePhase, message string) { +func (woc *wfOperationCtx) markWorkflowPhase(ctx context.Context, phase wfv1.WorkflowPhase, message string) { markCompleted := false if woc.wf.Status.Phase != phase { - if woc.wf.Status.Phase.Fulfilled() { + if woc.wf.Status.Fulfilled() { woc.log.WithFields(log.Fields{"fromPhase": woc.wf.Status.Phase, "toPhase": phase}). Panic("workflow is already fulfilled") } @@ -1858,11 +1867,11 @@ func (woc *wfOperationCtx) markWorkflowPhase(ctx context.Context, phase wfv1.Nod } woc.wf.ObjectMeta.Labels[common.LabelKeyPhase] = string(phase) switch phase { - case wfv1.NodeRunning: + case wfv1.WorkflowRunning: woc.eventRecorder.Event(woc.wf, apiv1.EventTypeNormal, "WorkflowRunning", "Workflow Running") - case wfv1.NodeSucceeded: + case wfv1.WorkflowSucceeded: woc.eventRecorder.Event(woc.wf, apiv1.EventTypeNormal, "WorkflowSucceeded", "Workflow completed") - case wfv1.NodeFailed, wfv1.NodeError: + case wfv1.WorkflowFailed, wfv1.WorkflowError: woc.eventRecorder.Event(woc.wf, apiv1.EventTypeWarning, "WorkflowFailed", message) } markCompleted = phase.Completed() @@ -1878,7 +1887,7 @@ func (woc *wfOperationCtx) markWorkflowPhase(ctx context.Context, phase wfv1.Nod woc.wf.Status.Message = message } - if phase == wfv1.NodeError { + if phase == wfv1.WorkflowError { entryNode, ok := woc.wf.Status.Nodes[woc.wf.ObjectMeta.Name] if ok && entryNode.Phase == wfv1.NodeRunning { entryNode.Phase = wfv1.NodeError @@ -1889,7 +1898,7 @@ func (woc *wfOperationCtx) markWorkflowPhase(ctx context.Context, phase wfv1.Nod } switch phase { - case wfv1.NodeSucceeded, wfv1.NodeFailed, wfv1.NodeError: + case wfv1.WorkflowSucceeded, wfv1.WorkflowFailed, wfv1.WorkflowError: // wait for all daemon nodes to get terminated before marking workflow completed if markCompleted && !woc.hasDaemonNodes() { woc.log.Infof("Marking workflow completed") @@ -1902,7 +1911,7 @@ func (woc *wfOperationCtx) markWorkflowPhase(ctx context.Context, phase wfv1.Nod woc.wf.Status.Conditions.UpsertCondition(wfv1.Condition{Status: metav1.ConditionTrue, Type: wfv1.ConditionTypeCompleted}) err := woc.deletePDBResource(ctx) if err != nil { - woc.wf.Status.Phase = wfv1.NodeError + woc.wf.Status.Phase = wfv1.WorkflowError woc.wf.ObjectMeta.Labels[common.LabelKeyPhase] = string(wfv1.NodeError) woc.updated = true woc.wf.Status.Message = err.Error() @@ -1946,19 +1955,19 @@ func (woc *wfOperationCtx) hasDaemonNodes() bool { } func (woc *wfOperationCtx) markWorkflowRunning(ctx context.Context) { - woc.markWorkflowPhase(ctx, wfv1.NodeRunning, "") + woc.markWorkflowPhase(ctx, wfv1.WorkflowRunning, "") } func (woc *wfOperationCtx) markWorkflowSuccess(ctx context.Context) { - woc.markWorkflowPhase(ctx, wfv1.NodeSucceeded, "") + woc.markWorkflowPhase(ctx, wfv1.WorkflowSucceeded, "") } func (woc *wfOperationCtx) markWorkflowFailed(ctx context.Context, message string) { - woc.markWorkflowPhase(ctx, wfv1.NodeFailed, message) + woc.markWorkflowPhase(ctx, wfv1.WorkflowFailed, message) } func (woc *wfOperationCtx) markWorkflowError(ctx context.Context, err error) { - woc.markWorkflowPhase(ctx, wfv1.NodeError, err.Error()) + woc.markWorkflowPhase(ctx, wfv1.WorkflowError, err.Error()) } // stepsOrDagSeparator identifies if a node name starts with our naming convention separator from diff --git a/workflow/controller/operator_concurrency_test.go b/workflow/controller/operator_concurrency_test.go index 6d4e16e62712..1366ddfe25be 100644 --- a/workflow/controller/operator_concurrency_test.go +++ b/workflow/controller/operator_concurrency_test.go @@ -385,7 +385,7 @@ func TestMutexInDAG(t *testing.T) { assert.Equal(wfv1.NodePending, node.Phase) } } - assert.Equal(wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(wfv1.WorkflowRunning, woc.wf.Status.Phase) makePodsPhase(ctx, woc, v1.PodSucceeded) woc1 := newWorkflowOperationCtx(woc.wf, controller) diff --git a/workflow/controller/operator_persist_test.go b/workflow/controller/operator_persist_test.go index 88b65ff3aadc..bf64c33481f2 100644 --- a/workflow/controller/operator_persist_test.go +++ b/workflow/controller/operator_persist_test.go @@ -64,7 +64,7 @@ func TestPersistWithoutLargeWfSupport(t *testing.T) { wf, err = wfcset.Get(ctx, wf.Name, metav1.GetOptions{}) assert.NoError(t, err) assert.False(t, wf.Status.IsOffloadNodeStatus()) - assert.Equal(t, wfv1.NodeError, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowError, woc.wf.Status.Phase) } // TestPersistWithoutLargeWfSupport verifies persistence error with no largeWFsuppport @@ -84,7 +84,7 @@ func TestPersistErrorWithoutLargeWfSupport(t *testing.T) { woc.operate(ctx) wf, err = wfcset.Get(ctx, wf.Name, metav1.GetOptions{}) assert.NoError(t, err) - assert.Equal(t, wfv1.NodeError, wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowError, wf.Status.Phase) } // TestPersistWithoutLargeWfSupport verifies persistence with largeWFsuppport @@ -104,7 +104,7 @@ func TestPersistWithLargeWfSupport(t *testing.T) { woc.operate(ctx) wf, err = wfcset.Get(ctx, wf.Name, metav1.GetOptions{}) assert.NoError(t, err) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) // check the saved version has been offloaded assert.True(t, wf.Status.IsOffloadNodeStatus()) assert.Empty(t, wf.Status.Nodes) @@ -132,7 +132,7 @@ func TestPersistErrorWithLargeWfSupport(t *testing.T) { woc.operate(ctx) wf, err = wfcset.Get(ctx, wf.Name, metav1.GetOptions{}) assert.NoError(t, err) - assert.Equal(t, wfv1.NodeError, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowError, woc.wf.Status.Phase) // check the saved version has not been offloaded assert.False(t, wf.Status.IsOffloadNodeStatus()) assert.NotEmpty(t, woc.wf.Status.Nodes) diff --git a/workflow/controller/operator_test.go b/workflow/controller/operator_test.go index f867d6f94f29..dcdd4761dc01 100644 --- a/workflow/controller/operator_test.go +++ b/workflow/controller/operator_test.go @@ -89,10 +89,10 @@ func Test_wfOperationCtx_reapplyUpdate(t *testing.T) { t.Run("ErrUpdatingCompletedWorkflow", func(t *testing.T) { wf := &wfv1.Workflow{ ObjectMeta: metav1.ObjectMeta{Name: "my-wf"}, - Status: wfv1.WorkflowStatus{Phase: wfv1.NodeError}, + Status: wfv1.WorkflowStatus{Phase: wfv1.WorkflowError}, } currWf := wf.DeepCopy() - currWf.Status.Phase = wfv1.NodeSucceeded + currWf.Status.Phase = wfv1.WorkflowSucceeded cancel, controller := newController(currWf) defer cancel() woc := newWorkflowOperationCtx(wf, controller) @@ -189,7 +189,7 @@ status: woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeSucceeded, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, woc.wf.Status.Phase) assert.Equal(t, wfv1.EstimatedDuration(1), woc.wf.Status.EstimatedDuration) assert.Equal(t, wfv1.EstimatedDuration(1), woc.wf.Status.Nodes[woc.wf.Name].EstimatedDuration) assert.Equal(t, wfv1.EstimatedDuration(1), woc.wf.Status.Nodes.FindByDisplayName("pod").EstimatedDuration) @@ -223,7 +223,7 @@ spec: woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeSucceeded, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, woc.wf.Status.Phase) assert.Equal(t, wfv1.Progress("1/1"), woc.wf.Status.Progress) assert.Equal(t, wfv1.Progress("1/1"), woc.wf.Status.Nodes[woc.wf.Name].Progress) assert.Equal(t, wfv1.Progress("1/1"), woc.wf.Status.Nodes.FindByDisplayName("pod").Progress) @@ -310,7 +310,7 @@ func TestSidecarWithVolume(t *testing.T) { assert.NoError(t, err) woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) pods, err := listPods(woc) assert.NoError(t, err) assert.True(t, len(pods.Items) > 0, "pod was not created successfully") @@ -1924,7 +1924,7 @@ func TestSuspendTemplateWithFailedResume(t *testing.T) { // operate the workflow. it should be failed and not reach the second step woc = newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeFailed, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, woc.wf.Status.Phase) pods, err = listPods(woc) assert.NoError(t, err) assert.Equal(t, 0, len(pods.Items)) @@ -2219,7 +2219,7 @@ func TestParamSubstitutionWithArtifact(t *testing.T) { woc.operate(ctx) wf, err := woc.controller.wfclientset.ArgoprojV1alpha1().Workflows("").Get(ctx, wf.ObjectMeta.Name, metav1.GetOptions{}) assert.NoError(t, err) - assert.Equal(t, wf.Status.Phase, wfv1.NodeRunning) + assert.Equal(t, wf.Status.Phase, wfv1.WorkflowRunning) pods, err := listPods(woc) assert.NoError(t, err) assert.Equal(t, len(pods.Items), 1) @@ -2232,7 +2232,7 @@ func TestGlobalParamSubstitutionWithArtifact(t *testing.T) { woc.operate(ctx) wf, err := woc.controller.wfclientset.ArgoprojV1alpha1().Workflows("").Get(ctx, wf.ObjectMeta.Name, metav1.GetOptions{}) assert.NoError(t, err) - assert.Equal(t, wf.Status.Phase, wfv1.NodeRunning) + assert.Equal(t, wf.Status.Phase, wfv1.WorkflowRunning) pods, err := listPods(woc) assert.NoError(t, err) assert.Equal(t, len(pods.Items), 1) @@ -2347,7 +2347,7 @@ func TestMetadataPassing(t *testing.T) { assert.NoError(t, err) woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) pods, err := listPods(woc) assert.NoError(t, err) assert.True(t, len(pods.Items) > 0, "pod was not created successfully") @@ -2419,7 +2419,7 @@ func TestResolveIOPathPlaceholders(t *testing.T) { wf := unmarshalWF(ioPathPlaceholders) woc := newWoc(*wf) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) pods, err := listPods(woc) assert.NoError(t, err) assert.True(t, len(pods.Items) > 0, "pod was not created successfully") @@ -2449,7 +2449,7 @@ func TestResolvePlaceholdersInOutputValues(t *testing.T) { wf := unmarshalWF(outputValuePlaceholders) woc := newWoc(*wf) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) pods, err := listPods(woc) assert.NoError(t, err) assert.True(t, len(pods.Items) > 0, "pod was not created successfully") @@ -2487,7 +2487,7 @@ func TestResolvePodNameInRetries(t *testing.T) { wf := unmarshalWF(podNameInRetries) woc := newWoc(*wf) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) pods, err := woc.controller.kubeclientset.CoreV1().Pods(wf.ObjectMeta.Namespace).List(ctx, metav1.ListOptions{}) assert.NoError(t, err) assert.True(t, len(pods.Items) > 0, "pod was not created successfully") @@ -2589,7 +2589,7 @@ func TestResourceTemplate(t *testing.T) { woc.operate(ctx) wf, err = wfcset.Get(ctx, wf.ObjectMeta.Name, metav1.GetOptions{}) assert.NoError(t, err) - assert.Equal(t, wfv1.NodeRunning, wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, wf.Status.Phase) pod, err := getPod(woc, "resource-template") if !assert.NoError(t, err) { @@ -2680,7 +2680,7 @@ func TestResourceWithOwnerReferenceTemplate(t *testing.T) { woc.operate(ctx) wf, err = wfcset.Get(ctx, wf.ObjectMeta.Name, metav1.GetOptions{}) assert.NoError(t, err) - assert.Equal(t, wfv1.NodeRunning, wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, wf.Status.Phase) pods, err := listPods(woc) if !assert.NoError(t, err) { @@ -3148,7 +3148,7 @@ func TestPDBCreationRaceDelete(t *testing.T) { assert.NoError(t, err) woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeSucceeded, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, woc.wf.Status.Phase) } func TestStatusConditions(t *testing.T) { @@ -3223,7 +3223,7 @@ func TestNestedOptionalOutputArtifacts(t *testing.T) { woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeSucceeded, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, woc.wf.Status.Phase) } // TestPodSpecLogForFailedPods tests PodSpec logging configuration @@ -3698,7 +3698,7 @@ func TestResolvePlaceholdersInGlobalVariables(t *testing.T) { wf := unmarshalWF(globalVariablePlaceholders) woc := newWoc(*wf) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) pods, err := listPods(woc) assert.NoError(t, err) assert.True(t, len(pods.Items) > 0, "pod was not created successfully") @@ -3797,7 +3797,7 @@ func TestMaxDurationOnErroredFirstNode(t *testing.T) { ctx := context.Background() woc := newWoc(*wf) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) } var backoffExceedsMaxDuration = ` @@ -3893,7 +3893,7 @@ func TestBackoffExceedsMaxDuration(t *testing.T) { ctx := context.Background() woc := newWoc(*wf) woc.operate(ctx) - assert.Equal(t, wfv1.NodeFailed, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, woc.wf.Status.Phase) assert.Equal(t, "Backoff would exceed max duration limit", woc.wf.Status.Nodes["echo-r6v49"].Message) assert.Equal(t, "Backoff would exceed max duration limit", woc.wf.Status.Message) } @@ -4120,19 +4120,19 @@ func TestControllerReferenceMode(t *testing.T) { controller.Config.WorkflowRestrictions.TemplateReferencing = config.TemplateReferencingStrict woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeError, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowError, woc.wf.Status.Phase) assert.Equal(t, "workflows must use workflowTemplateRef to be executed when the controller is in reference mode", woc.wf.Status.Message) controller.Config.WorkflowRestrictions.TemplateReferencing = config.TemplateReferencingSecure woc = newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeError, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowError, woc.wf.Status.Phase) assert.Equal(t, "workflows must use workflowTemplateRef to be executed when the controller is in reference mode", woc.wf.Status.Message) controller.Config.WorkflowRestrictions = nil woc = newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) } func TestValidReferenceMode(t *testing.T) { @@ -4146,25 +4146,25 @@ func TestValidReferenceMode(t *testing.T) { controller.Config.WorkflowRestrictions.TemplateReferencing = config.TemplateReferencingSecure woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) // Change stored Workflow Spec woc.wf.Status.StoredWorkflowSpec.Entrypoint = "different" woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeError, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowError, woc.wf.Status.Phase) assert.Equal(t, "workflowTemplateRef reference may not change during execution when the controller is in reference mode", woc.wf.Status.Message) controller.Config.WorkflowRestrictions.TemplateReferencing = config.TemplateReferencingStrict woc = newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) // Change stored Workflow Spec woc.wf.Status.StoredWorkflowSpec.Entrypoint = "different" woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeError, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowError, woc.wf.Status.Phase) } var workflowStatusMetric = ` @@ -4295,27 +4295,27 @@ spec: woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) assert.Nil(t, woc.wf.Status.Conditions, "zero conditions on first reconciliation") makePodsPhase(ctx, woc, apiv1.PodPending) woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) assert.Equal(t, wfv1.Conditions{{Type: wfv1.ConditionTypePodRunning, Status: metav1.ConditionFalse}}, woc.wf.Status.Conditions) makePodsPhase(ctx, woc, apiv1.PodRunning) woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) assert.Equal(t, wfv1.Conditions{{Type: wfv1.ConditionTypePodRunning, Status: metav1.ConditionTrue}}, woc.wf.Status.Conditions) makePodsPhase(ctx, woc, apiv1.PodSucceeded) woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeSucceeded, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, woc.wf.Status.Phase) assert.Equal(t, wfv1.Conditions{ {Type: wfv1.ConditionTypePodRunning, Status: metav1.ConditionFalse}, {Type: wfv1.ConditionTypeCompleted, Status: metav1.ConditionTrue}, @@ -4704,7 +4704,7 @@ status: ctx := context.Background() woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) for _, node := range woc.wf.Status.Nodes { switch node.TemplateName { case "main": @@ -4752,7 +4752,7 @@ spec: // reconcille ctx := context.Background() woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) // make all created pods as successful makePodsPhase(ctx, woc, apiv1.PodSucceeded, withOutputs(`{"parameters": [{"name": "my-param"}]}`)) @@ -4760,7 +4760,7 @@ spec: // reconcille woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeSucceeded, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, woc.wf.Status.Phase) } var globalVarsOnExit = ` @@ -4998,13 +4998,13 @@ func TestFailSuspendedAndPendingNodesAfterDeadline(t *testing.T) { woc := newWorkflowOperationCtx(wf, controller) t.Run("Before Deadline", func(t *testing.T) { woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) }) time.Sleep(3 * time.Second) t.Run("After Deadline", func(t *testing.T) { woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeFailed, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, woc.wf.Status.Phase) for _, node := range woc.wf.Status.Nodes { assert.Equal(t, wfv1.NodeFailed, node.Phase) } @@ -5021,7 +5021,7 @@ func TestFailSuspendedAndPendingNodesAfterShutdown(t *testing.T) { woc := newWorkflowOperationCtx(wf, controller) t.Run("After Shutdown", func(t *testing.T) { woc.operate(ctx) - assert.Equal(t, wfv1.NodeFailed, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, woc.wf.Status.Phase) for _, node := range woc.wf.Status.Nodes { assert.Equal(t, wfv1.NodeFailed, node.Phase) } @@ -5113,11 +5113,11 @@ func TestTemplateTimeoutDuration(t *testing.T) { ctx := context.Background() woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) time.Sleep(6 * time.Second) makePodsPhase(ctx, woc, apiv1.PodPending) woc.operate(ctx) - assert.Equal(t, wfv1.NodeFailed, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, woc.wf.Status.Phase) assert.Equal(t, wfv1.NodeFailed, woc.wf.Status.Nodes.FindByDisplayName("step1").Phase) }) t.Run("DAG Template Deadline", func(t *testing.T) { @@ -5128,13 +5128,13 @@ func TestTemplateTimeoutDuration(t *testing.T) { ctx := context.Background() woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) time.Sleep(6 * time.Second) makePodsPhase(ctx, woc, apiv1.PodPending) woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeFailed, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, woc.wf.Status.Phase) assert.Equal(t, wfv1.NodeFailed, woc.wf.Status.Nodes.FindByDisplayName("hello-world-dag").Phase) }) t.Run("Invalid timeout format", func(t *testing.T) { @@ -5148,7 +5148,7 @@ func TestTemplateTimeoutDuration(t *testing.T) { ctx := context.Background() woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeFailed, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, woc.wf.Status.Phase) jsonByte, err := json.Marshal(woc.wf) assert.NoError(t, err) assert.Contains(t, string(jsonByte), "has invalid duration format in timeout") @@ -5165,7 +5165,7 @@ func TestTemplateTimeoutDuration(t *testing.T) { ctx := context.Background() woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeFailed, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowFailed, woc.wf.Status.Phase) jsonByte, err := json.Marshal(woc.wf) assert.NoError(t, err) assert.Contains(t, string(jsonByte), "doesn't support timeout field") @@ -5207,7 +5207,7 @@ func TestStorageQuota(t *testing.T) { ctx := context.Background() woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodePending, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowPending, woc.wf.Status.Phase) assert.Contains(t, woc.wf.Status.Message, "Waiting for a PVC to be created.") controller.kubeclientset.(*fake.Clientset).BatchV1().(*batchfake.FakeBatchV1).Fake.PrependReactor("create", "persistentvolumeclaims", func(action k8stesting.Action) (bool, runtime.Object, error) { @@ -5215,7 +5215,7 @@ func TestStorageQuota(t *testing.T) { }) woc.operate(ctx) - assert.Equal(t, wfv1.NodeError, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowError, woc.wf.Status.Phase) assert.Contains(t, woc.wf.Status.Message, "BadRequest") } @@ -5373,7 +5373,7 @@ spec: woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) assert.True(t, woc.wf.Status.Nodes.Any(func(node wfv1.NodeStatus) bool { return node.Phase == wfv1.NodePending })) @@ -5383,7 +5383,7 @@ spec: woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) assert.True(t, woc.wf.Status.Nodes.Any(func(node wfv1.NodeStatus) bool { return node.Phase == wfv1.NodePending })) @@ -5393,7 +5393,7 @@ spec: woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeSucceeded, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, woc.wf.Status.Phase) } var wfRetryWithParam = ` diff --git a/workflow/controller/operator_workflow_template_ref_test.go b/workflow/controller/operator_workflow_template_ref_test.go index 07c260c837f6..f34167410531 100644 --- a/workflow/controller/operator_workflow_template_ref_test.go +++ b/workflow/controller/operator_workflow_template_ref_test.go @@ -125,7 +125,7 @@ func TestWorkflowTemplateRefInvalidWF(t *testing.T) { ctx := context.Background() woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeError, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowError, woc.wf.Status.Phase) }) } diff --git a/workflow/controller/steps_test.go b/workflow/controller/steps_test.go index 7b83edbc8d96..288b347653e7 100644 --- a/workflow/controller/steps_test.go +++ b/workflow/controller/steps_test.go @@ -19,7 +19,7 @@ func TestStepsFailedRetries(t *testing.T) { wf := test.LoadTestWorkflow("testdata/steps-failed-retries.yaml") woc := newWoc(*wf) woc.operate(ctx) - assert.Equal(t, string(wfv1.NodeFailed), string(woc.wf.Status.Phase)) + assert.Equal(t, wfv1.WorkflowFailed, woc.wf.Status.Phase) } var artifactResolutionWhenSkipped = ` @@ -78,7 +78,7 @@ func TestArtifactResolutionWhenSkipped(t *testing.T) { woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeSucceeded, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowSucceeded, woc.wf.Status.Phase) } var stepsWithParamAndGlobalParam = ` @@ -124,7 +124,7 @@ func TestStepsWithParamAndGlobalParam(t *testing.T) { woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) } func TestResourceDurationMetric(t *testing.T) { @@ -297,5 +297,5 @@ func TestOptionalArgumentAndParameter(t *testing.T) { woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) } diff --git a/workflow/controller/workflowpod_test.go b/workflow/controller/workflowpod_test.go index ac2b1aab3444..f31118454fa2 100644 --- a/workflow/controller/workflowpod_test.go +++ b/workflow/controller/workflowpod_test.go @@ -557,7 +557,7 @@ func TestConditionalAddArchiveLocationArchiveLogs(t *testing.T) { ArchiveLogs: pointer.BoolPtr(true), }) woc.operate(ctx) - assert.Equal(t, wfv1.NodeRunning, woc.wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) pods, err := listPods(woc) assert.NoError(t, err) assert.Len(t, pods.Items, 1) diff --git a/workflow/util/util.go b/workflow/util/util.go index 8b27a1a373c0..5ea7077cacc1 100644 --- a/workflow/util/util.go +++ b/workflow/util/util.go @@ -555,7 +555,7 @@ func FormulateResubmitWorkflow(wf *wfv1.Workflow, memoized bool) (*wfv1.Workflow // The following simulates the behavior of generateName if memoized { switch wf.Status.Phase { - case wfv1.NodeFailed, wfv1.NodeError: + case wfv1.WorkflowFailed, wfv1.WorkflowError: default: return nil, errors.Errorf(errors.CodeBadRequest, "workflow must be Failed/Error to resubmit in memoized mode") } @@ -654,7 +654,7 @@ func FormulateResubmitWorkflow(wf *wfv1.Workflow, memoized bool) (*wfv1.Workflow } newWF.Status.Conditions = wfv1.Conditions{{Status: metav1.ConditionFalse, Type: wfv1.ConditionTypeCompleted}} - newWF.Status.Phase = "" + newWF.Status.Phase = wfv1.WorkflowUnknown return &newWF, nil } @@ -686,7 +686,7 @@ func retryWorkflow(ctx context.Context, kubeClient kubernetes.Interface, hydrato return nil, err } switch wf.Status.Phase { - case wfv1.NodeFailed, wfv1.NodeError: + case wfv1.WorkflowFailed, wfv1.WorkflowError: default: return nil, errors.Errorf(errors.CodeBadRequest, "workflow must be Failed/Error to retry") } @@ -703,7 +703,7 @@ func retryWorkflow(ctx context.Context, kubeClient kubernetes.Interface, hydrato delete(newWF.Labels, common.LabelKeyWorkflowArchivingStatus) newWF.Status.Conditions.UpsertCondition(wfv1.Condition{Status: metav1.ConditionFalse, Type: wfv1.ConditionTypeCompleted}) newWF.ObjectMeta.Labels[common.LabelKeyPhase] = string(wfv1.NodeRunning) - newWF.Status.Phase = wfv1.NodeRunning + newWF.Status.Phase = wfv1.WorkflowRunning newWF.Status.Nodes = make(wfv1.Nodes) newWF.Status.Message = "" newWF.Status.FinishedAt = metav1.Time{} diff --git a/workflow/util/util_test.go b/workflow/util/util_test.go index 08e3f6c301ff..e220005e7e53 100644 --- a/workflow/util/util_test.go +++ b/workflow/util/util_test.go @@ -59,7 +59,7 @@ func TestResubmitWorkflowWithOnExit(t *testing.T) { Name: wfName, }, Status: wfv1.WorkflowStatus{ - Phase: wfv1.NodeFailed, + Phase: wfv1.WorkflowFailed, Nodes: map[string]wfv1.NodeStatus{}, }, } @@ -753,7 +753,7 @@ func TestRetryWorkflow(t *testing.T) { common.LabelKeyCompleted: "true", common.LabelKeyWorkflowArchivingStatus: "Pending", }}, - Status: wfv1.WorkflowStatus{Phase: wfv1.NodeFailed}, + Status: wfv1.WorkflowStatus{Phase: wfv1.WorkflowFailed}, } ctx := context.Background() @@ -761,7 +761,7 @@ func TestRetryWorkflow(t *testing.T) { assert.NoError(t, err) wf, err = RetryWorkflow(ctx, kubeClient, hydratorfake.Always, wfClient, wf.Name, false, "") if assert.NoError(t, err) { - assert.Equal(t, wfv1.NodeRunning, wf.Status.Phase) + assert.Equal(t, wfv1.WorkflowRunning, wf.Status.Phase) assert.NotContains(t, wf.Labels, common.LabelKeyCompleted) assert.NotContains(t, wf.Labels, common.LabelKeyWorkflowArchivingStatus) }