From af2515c2811fa9a343c6751e335b282fd42d5f1d Mon Sep 17 00:00:00 2001 From: Josephine Lee Date: Thu, 4 Nov 2021 14:09:51 -0400 Subject: [PATCH] ui/db-console: surface more job metrics around reverting and retrying in the DBConsole Jobs Overview page Fixes https://github.com/cockroachdb/cockroach/issues/68179 This commit surfaces the status `reverting`, annotates existing `running` and `reverting` statuses UI with "retrying" where applicable, and adds the "Last Execution Time (UTC)" and "Execution Count" columns to the jobs overview table in db console. "Retrying" is defined as `status IN ('running', 'reverting') AND next_run > now() AND num_runs > 1`. Hovering a retrying status shows the next execution time. The "Status" column was also moved left to the second column. Filtering using the dropdown by `Status: Running` or `Status: Reverting` will include those that are also "retrying". Users can also filter by `Status: Retrying`. The `/jobs` endpoint was modified to add the `last_run`, `next_run`, and `num_runs` fields required for the UI change. Jobs with status `running` or `reverting` and are also "retrying" have their statuses sent as `retry-running` and `retry-reverting` respectively. The endpoint was also modified to support the value `retrying` for the `status` query parameter. This commit also adds a storybook story for the jobs table, which showcases the different possible statuses in permutations of information that could be present for the `running` status. Release note (ui change): The jobs overview table in DBConsole now shows when jobs have the status "reverting", and shows the badge "retrying" when running or reverting jobs are also retrying. Hovering the status for a "retrying" job will show the "Next execution time" in UTC. Two new columns, "Last Execution Time (UTC)" and "Execution Count", were also added to the jobs overview table in DBConsole, and the "Status" column was moved left to the second column in the table. The `status` query parameter in the `/jobs` endpoint now supports the values `reverting` and `retrying`. --- docs/generated/http/full.md | 6 + pkg/server/admin.go | 23 +- pkg/server/admin_test.go | 140 +++- pkg/server/serverpb/admin.pb.go | 781 +++++++++++------- pkg/server/serverpb/admin.proto | 3 + pkg/ui/workspaces/db-console/package.json | 2 + .../db-console/src/test-utils/tooltip.ts | 14 + .../src/views/jobs/JobTable.stories.tsx | 19 + .../db-console/src/views/jobs/duration.tsx | 47 +- .../db-console/src/views/jobs/index.spec.tsx | 71 ++ .../db-console/src/views/jobs/index.styl | 9 +- .../db-console/src/views/jobs/index.tsx | 2 +- .../db-console/src/views/jobs/jobStatus.tsx | 41 +- .../src/views/jobs/jobStatusCell.tsx | 27 +- .../src/views/jobs/jobStatusOptions.ts | 37 +- .../src/views/jobs/jobTable.fixture.ts | 291 +++++++ .../db-console/src/views/jobs/jobTable.tsx | 61 +- .../db-console/src/views/jobs/progressBar.tsx | 36 +- pkg/ui/yarn-vendor | 2 +- pkg/ui/yarn.lock | 77 ++ 20 files changed, 1277 insertions(+), 412 deletions(-) create mode 100644 pkg/ui/workspaces/db-console/src/test-utils/tooltip.ts create mode 100644 pkg/ui/workspaces/db-console/src/views/jobs/JobTable.stories.tsx create mode 100644 pkg/ui/workspaces/db-console/src/views/jobs/jobTable.fixture.ts diff --git a/docs/generated/http/full.md b/docs/generated/http/full.md index 2419120f7e07..e025a6e53091 100644 --- a/docs/generated/http/full.md +++ b/docs/generated/http/full.md @@ -5075,6 +5075,9 @@ JobResponse contains the job record for a job. | highwater_timestamp | [google.protobuf.Timestamp](#cockroach.server.serverpb.JobsResponse-google.protobuf.Timestamp) | | highwater_timestamp is the highwater timestamp returned as normal timestamp. This is appropriate for display to humans. | [reserved](#support-status) | | highwater_decimal | [string](#cockroach.server.serverpb.JobsResponse-string) | | highwater_decimal is the highwater timestamp in the proprietary decimal form used by logical timestamps internally. This is appropriate to pass to a "AS OF SYSTEM TIME" SQL statement. | [reserved](#support-status) | | running_status | [string](#cockroach.server.serverpb.JobsResponse-string) | | | [reserved](#support-status) | +| last_run | [google.protobuf.Timestamp](#cockroach.server.serverpb.JobsResponse-google.protobuf.Timestamp) | | | [reserved](#support-status) | +| next_run | [google.protobuf.Timestamp](#cockroach.server.serverpb.JobsResponse-google.protobuf.Timestamp) | | | [reserved](#support-status) | +| num_runs | [int64](#cockroach.server.serverpb.JobsResponse-int64) | | | [reserved](#support-status) | @@ -5133,6 +5136,9 @@ JobResponse contains the job record for a job. | highwater_timestamp | [google.protobuf.Timestamp](#cockroach.server.serverpb.JobResponse-google.protobuf.Timestamp) | | highwater_timestamp is the highwater timestamp returned as normal timestamp. This is appropriate for display to humans. | [reserved](#support-status) | | highwater_decimal | [string](#cockroach.server.serverpb.JobResponse-string) | | highwater_decimal is the highwater timestamp in the proprietary decimal form used by logical timestamps internally. This is appropriate to pass to a "AS OF SYSTEM TIME" SQL statement. | [reserved](#support-status) | | running_status | [string](#cockroach.server.serverpb.JobResponse-string) | | | [reserved](#support-status) | +| last_run | [google.protobuf.Timestamp](#cockroach.server.serverpb.JobResponse-google.protobuf.Timestamp) | | | [reserved](#support-status) | +| next_run | [google.protobuf.Timestamp](#cockroach.server.serverpb.JobResponse-google.protobuf.Timestamp) | | | [reserved](#support-status) | +| num_runs | [int64](#cockroach.server.serverpb.JobResponse-int64) | | | [reserved](#support-status) | diff --git a/pkg/server/admin.go b/pkg/server/admin.go index 9a6af33206f9..43cc0b95f4e7 100644 --- a/pkg/server/admin.go +++ b/pkg/server/admin.go @@ -1844,15 +1844,24 @@ func (s *adminServer) Jobs( return nil, err } + retryRunningCondition := "status='running' AND next_run > now() AND num_runs > 1" + retryRevertingCondition := "status='reverting' AND next_run > now() AND num_runs > 1" + q := makeSQLQuery() q.Append(` - SELECT job_id, job_type, description, statement, user_name, descriptor_ids, status, - running_status, created, started, finished, modified, - fraction_completed, high_water_timestamp, error + SELECT job_id, job_type, description, statement, user_name, descriptor_ids, + case + when ` + retryRunningCondition + `then 'retry-running' + when ` + retryRevertingCondition + ` then 'retry-reverting' + else status + end as status, running_status, created, started, finished, modified, fraction_completed, + high_water_timestamp, error, last_run, next_run, num_runs FROM crdb_internal.jobs WHERE true `) - if req.Status != "" { + if req.Status == "retrying" { + q.Append(" AND ( ( " + retryRunningCondition + " ) OR ( " + retryRevertingCondition + " ) )") + } else if req.Status != "" { q.Append(" AND status = $", req.Status) } if req.Type != jobspb.TypeUnspecified { @@ -1926,6 +1935,9 @@ func scanRowIntoJob(scanner resultScanner, row tree.Datums, job *serverpb.JobRes &fractionCompletedOrNil, &highwaterOrNil, &job.Error, + &job.LastRun, + &job.NextRun, + &job.NumRuns, ); err != nil { return err } @@ -1969,7 +1981,8 @@ func (s *adminServer) Job( const query = ` SELECT job_id, job_type, description, statement, user_name, descriptor_ids, status, running_status, created, started, finished, modified, - fraction_completed, high_water_timestamp, error + fraction_completed, high_water_timestamp, error, last_run, + next_run, num_runs FROM crdb_internal.jobs WHERE job_id = $1` diff --git a/pkg/server/admin_test.go b/pkg/server/admin_test.go index fe964f04aa64..95a2ddfbfcab 100644 --- a/pkg/server/admin_test.go +++ b/pkg/server/admin_test.go @@ -1452,18 +1452,30 @@ func TestAdminAPIJobs(t *testing.T) { existingRunningIDs := getSystemJobIDs(t, sqlDB, jobs.StatusRunning) existingIDs := append(existingSucceededIDs, existingRunningIDs...) + runningOnlyIds := []int64{1, 2, 4} + revertingOnlyIds := []int64{7, 8, 9} + retryRunningIds := []int64{6} + retryRevertingIds := []int64{10} + testJobs := []struct { id int64 status jobs.Status details jobspb.Details progress jobspb.ProgressDetails username security.SQLUsername + numRuns int64 + lastRun time.Time }{ - {1, jobs.StatusRunning, jobspb.RestoreDetails{}, jobspb.RestoreProgress{}, security.RootUserName()}, - {2, jobs.StatusRunning, jobspb.BackupDetails{}, jobspb.BackupProgress{}, security.RootUserName()}, - {3, jobs.StatusSucceeded, jobspb.BackupDetails{}, jobspb.BackupProgress{}, security.RootUserName()}, - {4, jobs.StatusRunning, jobspb.ChangefeedDetails{}, jobspb.ChangefeedProgress{}, security.RootUserName()}, - {5, jobs.StatusSucceeded, jobspb.BackupDetails{}, jobspb.BackupProgress{}, authenticatedUserNameNoAdmin()}, + {1, jobs.StatusRunning, jobspb.RestoreDetails{}, jobspb.RestoreProgress{}, security.RootUserName(), 1, time.Time{}}, + {2, jobs.StatusRunning, jobspb.BackupDetails{}, jobspb.BackupProgress{}, security.RootUserName(), 1, timeutil.Now().Add(10 * time.Minute)}, + {3, jobs.StatusSucceeded, jobspb.BackupDetails{}, jobspb.BackupProgress{}, security.RootUserName(), 1, time.Time{}}, + {4, jobs.StatusRunning, jobspb.ChangefeedDetails{}, jobspb.ChangefeedProgress{}, security.RootUserName(), 2, time.Time{}}, + {5, jobs.StatusSucceeded, jobspb.BackupDetails{}, jobspb.BackupProgress{}, authenticatedUserNameNoAdmin(), 1, time.Time{}}, + {6, jobs.StatusRunning, jobspb.ImportDetails{}, jobspb.ImportProgress{}, security.RootUserName(), 2, timeutil.Now().Add(10 * time.Minute)}, + {7, jobs.StatusReverting, jobspb.ImportDetails{}, jobspb.ImportProgress{}, security.RootUserName(), 1, time.Time{}}, + {8, jobs.StatusReverting, jobspb.ImportDetails{}, jobspb.ImportProgress{}, security.RootUserName(), 1, timeutil.Now().Add(10 * time.Minute)}, + {9, jobs.StatusReverting, jobspb.ImportDetails{}, jobspb.ImportProgress{}, security.RootUserName(), 2, time.Time{}}, + {10, jobs.StatusReverting, jobspb.ImportDetails{}, jobspb.ImportProgress{}, security.RootUserName(), 2, timeutil.Now().Add(10 * time.Minute)}, } for _, job := range testJobs { payload := jobspb.Payload{UsernameProto: job.username.EncodeProto(), Details: jobspb.WrapPayloadDetails(job.details)} @@ -1490,8 +1502,8 @@ func TestAdminAPIJobs(t *testing.T) { t.Fatal(err) } sqlDB.Exec(t, - `INSERT INTO system.jobs (id, status, payload, progress) VALUES ($1, $2, $3, $4)`, - job.id, job.status, payloadBytes, progressBytes, + `INSERT INTO system.jobs (id, status, payload, progress, num_runs, last_run) VALUES ($1, $2, $3, $4, $5, $6)`, + job.id, job.status, payloadBytes, progressBytes, job.numRuns, job.lastRun, ) } @@ -1504,23 +1516,33 @@ func TestAdminAPIJobs(t *testing.T) { }{ { "jobs", - append([]int64{5, 4, 3, 2, 1}, existingIDs...), + append([]int64{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}, existingIDs...), []int64{5}, }, { "jobs?limit=1", + []int64{10}, []int64{5}, + }, + { + "jobs?status=succeeded", + append([]int64{5, 3}, existingSucceededIDs...), []int64{5}, }, { "jobs?status=running", - append([]int64{4, 2, 1}, existingRunningIDs...), + append(append(append([]int64{}, runningOnlyIds...), retryRunningIds...), existingRunningIDs...), []int64{}, }, { - "jobs?status=succeeded", - append([]int64{5, 3}, existingSucceededIDs...), - []int64{5}, + "jobs?status=reverting", + append(append([]int64{}, revertingOnlyIds...), retryRevertingIds...), + []int64{}, + }, + { + "jobs?status=retrying", + append(append([]int64{}, retryRunningIds...), retryRevertingIds...), + []int64{}, }, { "jobs?status=pending", @@ -1580,10 +1602,104 @@ func TestAdminAPIJobs(t *testing.T) { if e, a := expected, resIDs; !reflect.DeepEqual(e, a) { t.Errorf("%d: expected job IDs %v, but got %v", i, e, a) } + } }) } +func TestAdminAPIJobsDetails(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + + s, conn, _ := serverutils.StartServer(t, base.TestServerArgs{}) + defer s.Stopper().Stop(context.Background()) + sqlDB := sqlutils.MakeSQLRunner(conn) + + runningOnlyIds := []int64{1, 3, 5} + revertingOnlyIds := []int64{2, 4, 6} + retryRunningIds := []int64{7} + retryRevertingIds := []int64{8} + + testJobs := []struct { + id int64 + status jobs.Status + details jobspb.Details + progress jobspb.ProgressDetails + username security.SQLUsername + numRuns int64 + lastRun time.Time + }{ + {1, jobs.StatusRunning, jobspb.RestoreDetails{}, jobspb.RestoreProgress{}, security.RootUserName(), 1, time.Time{}}, + {2, jobs.StatusReverting, jobspb.BackupDetails{}, jobspb.BackupProgress{}, security.RootUserName(), 1, time.Time{}}, + {3, jobs.StatusRunning, jobspb.BackupDetails{}, jobspb.BackupProgress{}, security.RootUserName(), 1, timeutil.Now().Add(10 * time.Minute)}, + {4, jobs.StatusReverting, jobspb.ChangefeedDetails{}, jobspb.ChangefeedProgress{}, security.RootUserName(), 1, timeutil.Now().Add(10 * time.Minute)}, + {5, jobs.StatusRunning, jobspb.BackupDetails{}, jobspb.BackupProgress{}, security.RootUserName(), 2, time.Time{}}, + {6, jobs.StatusReverting, jobspb.ChangefeedDetails{}, jobspb.ChangefeedProgress{}, security.RootUserName(), 2, time.Time{}}, + {7, jobs.StatusRunning, jobspb.BackupDetails{}, jobspb.BackupProgress{}, security.RootUserName(), 2, timeutil.Now().Add(10 * time.Minute)}, + {8, jobs.StatusReverting, jobspb.ChangefeedDetails{}, jobspb.ChangefeedProgress{}, security.RootUserName(), 2, timeutil.Now().Add(10 * time.Minute)}, + } + for _, job := range testJobs { + payload := jobspb.Payload{UsernameProto: job.username.EncodeProto(), Details: jobspb.WrapPayloadDetails(job.details)} + payloadBytes, err := protoutil.Marshal(&payload) + if err != nil { + t.Fatal(err) + } + + progress := jobspb.Progress{Details: jobspb.WrapProgressDetails(job.progress)} + // Populate progress.Progress field with a specific progress type based on + // the job type. + if _, ok := job.progress.(jobspb.ChangefeedProgress); ok { + progress.Progress = &jobspb.Progress_HighWater{ + HighWater: &hlc.Timestamp{}, + } + } else { + progress.Progress = &jobspb.Progress_FractionCompleted{ + FractionCompleted: 1.0, + } + } + + progressBytes, err := protoutil.Marshal(&progress) + if err != nil { + t.Fatal(err) + } + sqlDB.Exec(t, + `INSERT INTO system.jobs (id, status, payload, progress, num_runs, last_run) VALUES ($1, $2, $3, $4, $5, $6)`, + job.id, job.status, payloadBytes, progressBytes, job.numRuns, job.lastRun, + ) + + } + + var res serverpb.JobsResponse + if err := getAdminJSONProto(s, "jobs", &res); err != nil { + t.Fatal(err) + } + + // test that the select statement correctly converts expected jobs to retry-____ statuses + expectedStatuses := []struct { + status string + ids []int64 + }{ + {"running", runningOnlyIds}, + {"reverting", revertingOnlyIds}, + {"retry-running", retryRunningIds}, + {"retry-reverting", retryRevertingIds}, + } + for _, expected := range expectedStatuses { + jobsWithStatus := []serverpb.JobResponse{} + for _, job := range res.Jobs { + for _, expectedID := range expected.ids { + if job.ID == expectedID { + jobsWithStatus = append(jobsWithStatus, job) + } + } + } + + for _, job := range jobsWithStatus { + assert.Equal(t, expected.status, job.Status) + } + } +} + func TestAdminAPILocations(t *testing.T) { defer leaktest.AfterTest(t)() defer log.Scope(t).Close(t) diff --git a/pkg/server/serverpb/admin.pb.go b/pkg/server/serverpb/admin.pb.go index 8d709ad73496..a9086bb1939a 100644 --- a/pkg/server/serverpb/admin.pb.go +++ b/pkg/server/serverpb/admin.pb.go @@ -1948,8 +1948,11 @@ type JobResponse struct { // highwater_decimal is the highwater timestamp in the proprietary decimal // form used by logical timestamps internally. This is appropriate to pass // to a "AS OF SYSTEM TIME" SQL statement. - HighwaterDecimal string `protobuf:"bytes,14,opt,name=highwater_decimal,json=highwaterDecimal,proto3" json:"highwater_decimal,omitempty"` - RunningStatus string `protobuf:"bytes,15,opt,name=running_status,json=runningStatus,proto3" json:"running_status,omitempty"` + HighwaterDecimal string `protobuf:"bytes,14,opt,name=highwater_decimal,json=highwaterDecimal,proto3" json:"highwater_decimal,omitempty"` + RunningStatus string `protobuf:"bytes,15,opt,name=running_status,json=runningStatus,proto3" json:"running_status,omitempty"` + LastRun *time.Time `protobuf:"bytes,17,opt,name=last_run,json=lastRun,proto3,stdtime" json:"last_run,omitempty"` + NextRun *time.Time `protobuf:"bytes,18,opt,name=next_run,json=nextRun,proto3,stdtime" json:"next_run,omitempty"` + NumRuns int64 `protobuf:"varint,19,opt,name=num_runs,json=numRuns,proto3" json:"num_runs,omitempty"` } func (m *JobResponse) Reset() { *m = JobResponse{} } @@ -2953,287 +2956,290 @@ func init() { func init() { proto.RegisterFile("server/serverpb/admin.proto", fileDescriptor_0b2ccb6a0551fa7e) } var fileDescriptor_0b2ccb6a0551fa7e = []byte{ - // 4479 bytes of a gzipped FileDescriptorProto + // 4527 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x3b, 0x4b, 0x70, 0x1b, 0x47, - 0x76, 0x1a, 0xfc, 0xf1, 0x08, 0x90, 0x60, 0x8b, 0xa2, 0x40, 0x48, 0x26, 0xe9, 0x91, 0x65, 0x73, - 0x65, 0x1b, 0x90, 0x28, 0xff, 0x22, 0xdb, 0xbb, 0x4b, 0x90, 0x2c, 0x2e, 0x64, 0x49, 0xb6, 0x86, - 0x92, 0x5c, 0x96, 0xe3, 0x9d, 0x1d, 0x60, 0x5a, 0xe0, 0x88, 0x83, 0x99, 0xe1, 0xcc, 0x80, 0x32, - 0xad, 0x78, 0x2b, 0xbb, 0x9b, 0xa4, 0x72, 0xda, 0x72, 0xb2, 0xa9, 0x5c, 0x7c, 0x4a, 0x0e, 0xc9, - 0x21, 0x97, 0x64, 0x8f, 0x39, 0x24, 0x57, 0x57, 0x2e, 0xbb, 0xa9, 0x5c, 0x36, 0x17, 0x6e, 0x42, - 0xe7, 0x94, 0x5c, 0x73, 0x48, 0xe5, 0x90, 0xa4, 0xfa, 0x37, 0xd3, 0x00, 0xa1, 0x11, 0x40, 0x79, - 0x73, 0x21, 0xa6, 0x5f, 0x77, 0xbf, 0x7e, 0xfd, 0xfa, 0xfd, 0xbb, 0x09, 0xe7, 0x02, 0xec, 0xef, - 0x63, 0xbf, 0xc1, 0x7e, 0xbc, 0x76, 0xc3, 0x30, 0x7b, 0x96, 0x53, 0xf7, 0x7c, 0x37, 0x74, 0xd1, - 0x42, 0xc7, 0xed, 0xec, 0xfa, 0xae, 0xd1, 0xd9, 0xa9, 0xb3, 0xfe, 0xba, 0x18, 0x56, 0xab, 0x76, - 0x5c, 0xe7, 0x81, 0xd5, 0x6d, 0x7c, 0xe6, 0x3a, 0xd8, 0x6b, 0xd3, 0x1f, 0x36, 0xa9, 0x36, 0xff, - 0xd0, 0x6d, 0x07, 0x0d, 0xf2, 0xc7, 0x6b, 0xd3, 0x1f, 0x0e, 0x3f, 0x3f, 0xbc, 0x52, 0x10, 0x1a, - 0x61, 0x5f, 0xf4, 0x9e, 0x0b, 0x42, 0xd7, 0x37, 0xba, 0xb8, 0x81, 0x9d, 0xae, 0x45, 0x51, 0xf6, - 0xf6, 0x3b, 0x1d, 0xde, 0x59, 0xdf, 0xdd, 0x6f, 0xec, 0xee, 0xf3, 0xf9, 0xb6, 0xb5, 0x8f, 0x1d, - 0x1c, 0x04, 0xd1, 0x87, 0xd7, 0x8e, 0x3e, 0xf9, 0xf8, 0x65, 0x79, 0xbc, 0xf8, 0x20, 0xc3, 0xdc, - 0x2e, 0x1f, 0xb1, 0x18, 0x06, 0x8d, 0x8e, 0x11, 0x1a, 0xb6, 0xdb, 0x6d, 0x74, 0x76, 0x0c, 0x3f, - 0xd4, 0x79, 0x8b, 0xf7, 0x57, 0xfb, 0xa1, 0x65, 0x37, 0x7a, 0x38, 0xf4, 0xad, 0x0e, 0xff, 0xe1, - 0x3d, 0x73, 0x5d, 0xb7, 0xeb, 0xd2, 0xcf, 0x06, 0xf9, 0x12, 0x9b, 0xeb, 0xba, 0x6e, 0xd7, 0xc6, - 0x0d, 0xc3, 0xb3, 0x1a, 0x86, 0xe3, 0xb8, 0xa1, 0x11, 0x5a, 0xae, 0x23, 0xe8, 0x59, 0xe2, 0xbd, - 0xb4, 0xd5, 0xee, 0x3f, 0x68, 0x84, 0x56, 0x0f, 0x07, 0xa1, 0xd1, 0xf3, 0xd8, 0x00, 0x15, 0x41, - 0x65, 0xc3, 0x08, 0x8d, 0xb6, 0x11, 0xe0, 0x40, 0xc3, 0x7b, 0x7d, 0x1c, 0x84, 0xea, 0x15, 0x98, - 0x95, 0x60, 0x81, 0xe7, 0x3a, 0x01, 0x46, 0xe7, 0xa1, 0x68, 0x0a, 0x60, 0x55, 0x59, 0x4e, 0xaf, - 0x14, 0xb5, 0x18, 0xa0, 0x7e, 0x04, 0xf3, 0x62, 0xca, 0x06, 0x0e, 0x0d, 0xcb, 0x16, 0xc8, 0x50, - 0x0d, 0x0a, 0x62, 0x58, 0x55, 0x59, 0x56, 0x56, 0x8a, 0x5a, 0xd4, 0x46, 0x17, 0xa0, 0x6c, 0x39, - 0x1d, 0xbb, 0x6f, 0x62, 0x9d, 0x1c, 0x49, 0x50, 0x4d, 0x2d, 0x2b, 0x2b, 0x05, 0xad, 0xc4, 0x81, - 0xdb, 0x04, 0xa6, 0xfe, 0x57, 0x0e, 0xce, 0x1e, 0xc3, 0xcd, 0x89, 0xba, 0x07, 0xb9, 0xae, 0x6f, - 0x38, 0x21, 0xa3, 0x68, 0x6a, 0xf5, 0xad, 0xfa, 0x13, 0xe5, 0xa6, 0xfe, 0x04, 0x1c, 0xf5, 0x2d, - 0x82, 0xa0, 0x99, 0xf9, 0xea, 0x70, 0xe9, 0x94, 0xc6, 0xb1, 0xa1, 0x25, 0x98, 0x0a, 0x8d, 0xb6, - 0x8d, 0x75, 0xc7, 0xe8, 0x61, 0x42, 0x16, 0xd9, 0x2e, 0x50, 0xd0, 0x2d, 0x02, 0x41, 0xaf, 0x43, - 0xd9, 0xc4, 0x41, 0xc7, 0xb7, 0xbc, 0xd0, 0xf5, 0x75, 0xcb, 0xac, 0xa6, 0x97, 0x95, 0x95, 0x74, - 0xb3, 0x72, 0x74, 0xb8, 0x54, 0xda, 0x88, 0x3a, 0x5a, 0x1b, 0x5a, 0x29, 0x1e, 0xd6, 0x32, 0xd1, - 0x75, 0x98, 0x22, 0xf2, 0xaa, 0x33, 0x11, 0xae, 0x66, 0x96, 0x95, 0x95, 0xa9, 0xd5, 0x0b, 0x12, - 0xd1, 0xac, 0xa3, 0xce, 0x64, 0xbb, 0x7e, 0xdf, 0x75, 0xf0, 0x3a, 0x85, 0x70, 0xfa, 0xe0, 0xb3, - 0x08, 0x82, 0x3e, 0x81, 0x59, 0x09, 0x97, 0x6e, 0xe3, 0x7d, 0x6c, 0x57, 0xb3, 0xcb, 0xca, 0xca, - 0xf4, 0xea, 0x95, 0x04, 0x36, 0xc4, 0x38, 0xfb, 0x3e, 0x15, 0x95, 0x1b, 0x64, 0xa2, 0x36, 0x13, - 0x63, 0xa6, 0x00, 0x74, 0x0b, 0xb2, 0xec, 0x4c, 0x72, 0x94, 0xc8, 0x93, 0x70, 0x96, 0x9e, 0x9f, - 0xc6, 0xd0, 0xd4, 0xde, 0x86, 0x2c, 0xe5, 0x34, 0x42, 0x90, 0xe9, 0x07, 0xd8, 0xe7, 0xc2, 0x40, - 0xbf, 0xd1, 0x22, 0x80, 0xe7, 0x5b, 0xfb, 0x96, 0x8d, 0xbb, 0x31, 0xbb, 0x63, 0x48, 0xed, 0x3f, - 0x53, 0x90, 0xa5, 0xd8, 0x90, 0x0d, 0xd3, 0x3d, 0x2b, 0x08, 0x2c, 0xa7, 0xab, 0xd3, 0xe3, 0x10, - 0x27, 0xbf, 0x79, 0x52, 0xfa, 0xea, 0x37, 0x19, 0xba, 0x3b, 0x04, 0x9b, 0x56, 0xee, 0x49, 0x2d, - 0x2a, 0x07, 0xbe, 0xe1, 0x74, 0x09, 0x93, 0xfb, 0x4e, 0x48, 0xc5, 0x33, 0xad, 0x01, 0x05, 0xad, - 0x13, 0x08, 0x7a, 0x0d, 0xe6, 0x0d, 0xcf, 0xf3, 0xdd, 0x4f, 0xad, 0x9e, 0x11, 0x62, 0xdd, 0xb4, - 0x82, 0x5d, 0xbd, 0x7d, 0x10, 0xe2, 0x80, 0x0a, 0x44, 0x46, 0x9b, 0x93, 0x7a, 0x37, 0xac, 0x60, - 0xb7, 0x49, 0xfa, 0xd0, 0x27, 0x50, 0x70, 0x5c, 0x13, 0xeb, 0x96, 0x19, 0x54, 0x33, 0xcb, 0xe9, - 0x95, 0x6c, 0xb3, 0x79, 0x74, 0xb8, 0x94, 0xbf, 0xe5, 0x9a, 0xb8, 0xb5, 0x11, 0xfc, 0xf7, 0xe1, - 0xd2, 0xd5, 0xae, 0x15, 0xee, 0xf4, 0xdb, 0xf5, 0x8e, 0xdb, 0x6b, 0x44, 0xfb, 0x32, 0xdb, 0xf1, - 0x77, 0xc3, 0xdb, 0xed, 0x36, 0xe8, 0x97, 0xd7, 0xae, 0xb3, 0x79, 0x5a, 0x9e, 0xe0, 0x6c, 0x99, - 0x41, 0x6d, 0x0b, 0x4a, 0xf2, 0xa6, 0x08, 0xc7, 0x89, 0x1c, 0x0b, 0x8e, 0x93, 0x6f, 0xa2, 0x7a, - 0xd8, 0xf7, 0x5d, 0x5f, 0xef, 0xe1, 0x20, 0x30, 0xba, 0x98, 0xee, 0xad, 0xa8, 0x95, 0x28, 0xf0, - 0x26, 0x83, 0xa9, 0x5b, 0x70, 0x9a, 0x62, 0x98, 0x40, 0xa5, 0xe7, 0x20, 0x4b, 0xcf, 0x85, 0xe3, - 0x63, 0x0d, 0xf5, 0xef, 0x0b, 0x30, 0x37, 0x88, 0x89, 0x2b, 0xf0, 0xf6, 0x90, 0x02, 0xbf, 0x9e, - 0x70, 0x8c, 0xa3, 0x10, 0x8c, 0xd4, 0xde, 0x7b, 0x90, 0xef, 0xb8, 0x76, 0xbf, 0xe7, 0x30, 0x51, - 0x9a, 0x5a, 0x7d, 0x63, 0x52, 0xac, 0xeb, 0x74, 0x3a, 0x47, 0x2b, 0x90, 0xa1, 0xbb, 0x90, 0xb7, - 0x1c, 0x13, 0x7f, 0x4a, 0x4f, 0xf7, 0x44, 0xd4, 0xb6, 0xc8, 0x74, 0x81, 0x96, 0xe3, 0x1a, 0x16, - 0xb2, 0xcc, 0x28, 0x21, 0xeb, 0xf8, 0x98, 0xc8, 0x17, 0x33, 0x4a, 0x44, 0xa1, 0x70, 0x0f, 0x3b, - 0x21, 0x55, 0xf7, 0xa2, 0x36, 0xc7, 0x7a, 0xe9, 0x8a, 0xdb, 0xa2, 0x6f, 0xd8, 0xd6, 0xe4, 0xbe, - 0x71, 0x5b, 0x93, 0xff, 0xc6, 0x6c, 0xcd, 0x31, 0x6b, 0x5a, 0x18, 0xcb, 0x9a, 0xbe, 0x05, 0x3c, - 0x16, 0xe8, 0xfb, 0x58, 0xa7, 0xf4, 0xc5, 0x9c, 0x29, 0x52, 0xce, 0xcc, 0x47, 0xfd, 0x84, 0x94, - 0x88, 0x37, 0xcf, 0x66, 0x8c, 0xfe, 0x4e, 0x81, 0x1c, 0x13, 0x90, 0x91, 0x9a, 0x85, 0x20, 0x13, - 0x1e, 0x78, 0x42, 0x01, 0xe8, 0x37, 0xd1, 0x18, 0xa7, 0x6f, 0xdb, 0x54, 0x31, 0xd2, 0xd4, 0xc7, - 0x45, 0x6d, 0xa2, 0x89, 0x26, 0x7e, 0x60, 0xf4, 0xed, 0x50, 0xdf, 0x37, 0xec, 0x3e, 0xa6, 0x02, - 0x50, 0x24, 0x5b, 0xa5, 0xc0, 0x7b, 0x04, 0x86, 0xae, 0xc2, 0x99, 0x2e, 0x76, 0x30, 0xe3, 0xa2, - 0x8e, 0x3f, 0xf5, 0x7c, 0x1c, 0x04, 0x96, 0xeb, 0x08, 0x09, 0x88, 0x3b, 0x37, 0xa3, 0x3e, 0x34, - 0x0f, 0xb9, 0x1d, 0xcb, 0x34, 0xb1, 0x43, 0x0f, 0xbf, 0xa0, 0xf1, 0x56, 0xed, 0x6f, 0x14, 0xc8, - 0x52, 0x49, 0x1c, 0x49, 0xff, 0x3c, 0xe4, 0xfa, 0x8e, 0xb5, 0xd7, 0xc7, 0xdc, 0x1b, 0xf3, 0x16, - 0xaa, 0x40, 0x3a, 0xc0, 0x7b, 0xcc, 0xd1, 0x69, 0xe4, 0x93, 0x8c, 0x64, 0xaa, 0xc1, 0x49, 0xe6, - 0x2d, 0x1a, 0x2a, 0x58, 0x3e, 0xee, 0x84, 0x31, 0x81, 0x31, 0x00, 0x55, 0x21, 0x4f, 0x22, 0x2e, - 0xcb, 0xe9, 0x72, 0xb2, 0x44, 0x93, 0x70, 0xc9, 0xea, 0x79, 0xb6, 0xd5, 0xb1, 0x42, 0x2a, 0x5c, - 0x05, 0x2d, 0x6a, 0xab, 0x9b, 0x30, 0x1b, 0xc9, 0xf7, 0x33, 0x18, 0xa2, 0x2f, 0x32, 0x80, 0x64, - 0x3c, 0xdc, 0x0c, 0x0d, 0xa9, 0xa0, 0x72, 0x4c, 0x05, 0x2f, 0x40, 0xd9, 0xc7, 0x84, 0x14, 0x63, - 0xc0, 0x15, 0x94, 0x38, 0x90, 0x0d, 0x7a, 0x0e, 0x80, 0x9a, 0x75, 0x36, 0x82, 0x31, 0xaa, 0x48, - 0x20, 0xac, 0x7b, 0x4d, 0x78, 0x54, 0xe6, 0xf6, 0x2f, 0xca, 0x8a, 0xc3, 0x42, 0xd0, 0xba, 0x08, - 0x41, 0xeb, 0x37, 0xef, 0xad, 0xaf, 0x53, 0x12, 0xb9, 0x32, 0xb2, 0x99, 0x09, 0xee, 0x26, 0x97, - 0xe0, 0x6e, 0x4c, 0x10, 0x6e, 0x4d, 0x27, 0xd4, 0x04, 0xd5, 0x2c, 0xb5, 0x5e, 0xbf, 0xf5, 0x34, - 0xeb, 0x35, 0xc0, 0x23, 0xe1, 0x27, 0x89, 0xb3, 0xe1, 0x44, 0x95, 0x7a, 0x31, 0x68, 0xd0, 0xa9, - 0xe5, 0xbf, 0x79, 0xa7, 0xf6, 0x21, 0x4c, 0x49, 0x14, 0xa0, 0x0b, 0x90, 0xe7, 0xab, 0xb1, 0x93, - 0x6f, 0xc2, 0xd1, 0xe1, 0x52, 0x8e, 0x4f, 0xca, 0xb1, 0x49, 0xe3, 0x39, 0xb9, 0x79, 0x98, 0xbb, - 0xe5, 0x3a, 0xc7, 0x84, 0x4b, 0xfd, 0x85, 0x02, 0x67, 0x86, 0x3a, 0xb8, 0xb4, 0x7c, 0x04, 0xb3, - 0x24, 0x8c, 0xd6, 0x03, 0xec, 0x5b, 0x38, 0xe0, 0xa1, 0xab, 0x42, 0x0f, 0xf5, 0xd5, 0x89, 0x78, - 0xaa, 0xcd, 0x10, 0x3c, 0xdb, 0x14, 0x0d, 0x0b, 0x6f, 0x3e, 0x06, 0x64, 0x39, 0x21, 0xf6, 0x1d, - 0xc3, 0xd6, 0xfb, 0x81, 0x1c, 0x16, 0x4f, 0x8c, 0xbb, 0x22, 0x10, 0xdd, 0x0d, 0x78, 0x24, 0x3d, - 0x0d, 0xa5, 0xbb, 0x01, 0xf6, 0xa3, 0x1d, 0xfe, 0x10, 0xca, 0xbc, 0xcd, 0x37, 0xd6, 0x82, 0x2c, - 0xb1, 0x80, 0xc2, 0x19, 0x27, 0x2d, 0x38, 0x30, 0x91, 0xb6, 0x84, 0xa4, 0x52, 0x0c, 0x35, 0x15, - 0x32, 0x04, 0x48, 0x54, 0x94, 0x00, 0x24, 0x2b, 0x13, 0xb5, 0xd5, 0x9f, 0x28, 0x50, 0xde, 0xdc, - 0xc7, 0x4e, 0xac, 0xd0, 0xc2, 0x76, 0x2a, 0x92, 0xed, 0x3c, 0x07, 0xc5, 0xd0, 0xf0, 0xbb, 0x38, - 0x24, 0x67, 0xcd, 0xd4, 0xae, 0xc0, 0x00, 0x2d, 0x93, 0x68, 0xb9, 0x6d, 0xf5, 0x2c, 0xa6, 0x6d, - 0x59, 0x8d, 0x35, 0xd0, 0xcb, 0x30, 0xdb, 0x77, 0x7c, 0x6c, 0x1a, 0x9d, 0x10, 0x9b, 0x3a, 0xa6, - 0x4b, 0x50, 0xad, 0x2b, 0x68, 0x95, 0xb8, 0x83, 0x2d, 0xad, 0xfe, 0x7b, 0x0a, 0xa6, 0x05, 0x15, - 0x9c, 0x0f, 0x37, 0x21, 0xc7, 0x27, 0x31, 0x46, 0x34, 0x12, 0x18, 0x31, 0x38, 0x95, 0x35, 0x45, - 0x3c, 0xc2, 0x90, 0xd4, 0xfe, 0x30, 0x05, 0x59, 0x0a, 0x47, 0x4d, 0x28, 0x46, 0x09, 0x18, 0x97, - 0x98, 0x5a, 0x9d, 0xa5, 0x68, 0x75, 0x91, 0xa2, 0xd5, 0xef, 0x88, 0x11, 0xcd, 0x02, 0x41, 0xf3, - 0xc5, 0xaf, 0x97, 0x14, 0x2d, 0x9e, 0x46, 0xac, 0x0c, 0xc5, 0xab, 0x4b, 0x5e, 0xa6, 0x48, 0x21, - 0x77, 0x08, 0xbb, 0xbe, 0x25, 0xb3, 0x8b, 0x65, 0x25, 0xa5, 0xa3, 0xc3, 0xa5, 0xc2, 0x1d, 0xc6, - 0xb2, 0x0d, 0x89, 0x79, 0xab, 0x40, 0xec, 0x97, 0xeb, 0x87, 0xc4, 0x32, 0x58, 0x26, 0x8b, 0x3c, - 0x9a, 0x33, 0x47, 0x87, 0x4b, 0x53, 0x9a, 0x80, 0xb7, 0x36, 0xb4, 0xa9, 0x68, 0x50, 0xcb, 0x24, - 0x27, 0x64, 0x39, 0x0f, 0x5c, 0x6e, 0xd6, 0xe9, 0x37, 0x59, 0x92, 0xf9, 0x08, 0x82, 0x84, 0x18, - 0xa2, 0x12, 0x5b, 0xf2, 0x2e, 0x05, 0x92, 0x25, 0x59, 0x77, 0xcb, 0x54, 0xff, 0x4a, 0x81, 0xca, - 0x36, 0x0e, 0xef, 0xb6, 0x48, 0x4c, 0x2e, 0x4e, 0xfd, 0x23, 0x80, 0x5d, 0x7c, 0xc0, 0xbc, 0x9f, - 0x60, 0xf9, 0xb5, 0x04, 0x96, 0x0f, 0x23, 0xa8, 0xbf, 0x87, 0x0f, 0xa8, 0x9b, 0x0c, 0x36, 0x9d, - 0xd0, 0x3f, 0xd0, 0x8a, 0xbb, 0xa2, 0x5d, 0x7b, 0x07, 0xa6, 0x07, 0x3b, 0x89, 0x1b, 0xdb, 0xc5, - 0x07, 0x5c, 0xc2, 0xc8, 0x27, 0x91, 0x21, 0xe6, 0x78, 0x09, 0x2f, 0x4b, 0x1a, 0x6b, 0x5c, 0x4b, - 0xbd, 0xa5, 0xa8, 0xa7, 0x61, 0x56, 0x5a, 0x8b, 0x9d, 0xb0, 0xfa, 0x22, 0x54, 0xb6, 0x86, 0x77, - 0x80, 0x20, 0xb3, 0x8b, 0x0f, 0x44, 0x5e, 0x4c, 0xbf, 0xd5, 0x5f, 0xa4, 0x60, 0x76, 0x6b, 0x78, - 0x36, 0xfa, 0xc1, 0x88, 0xbd, 0xbe, 0x9d, 0xb0, 0xd7, 0x63, 0x18, 0x86, 0x36, 0xcb, 0x45, 0x4d, - 0xda, 0xf2, 0x03, 0xc8, 0xb2, 0x98, 0x21, 0xda, 0x97, 0x22, 0xed, 0x0b, 0x6d, 0x41, 0xc9, 0x36, - 0x82, 0x50, 0xef, 0x7b, 0xa6, 0x11, 0x62, 0x93, 0xdb, 0x96, 0xf1, 0xa4, 0x70, 0x8a, 0xcc, 0xbc, - 0xcb, 0x26, 0xd6, 0xbc, 0x31, 0x58, 0xfb, 0x3d, 0x99, 0xb5, 0x53, 0xab, 0xab, 0x13, 0x6d, 0x94, - 0xa2, 0x96, 0x8f, 0xa3, 0x02, 0xd3, 0xeb, 0x76, 0x3f, 0x08, 0xb1, 0x2f, 0x2c, 0xd8, 0x97, 0x0a, - 0xcc, 0x44, 0x20, 0xce, 0xe1, 0x57, 0x00, 0x3a, 0x0c, 0x14, 0x3b, 0x87, 0xf2, 0xd1, 0xe1, 0x52, - 0x91, 0x0f, 0x6c, 0x6d, 0x68, 0x45, 0x3e, 0xa0, 0x65, 0x12, 0x53, 0x11, 0xeb, 0x00, 0x76, 0x88, - 0x19, 0x35, 0x79, 0xe0, 0x53, 0x89, 0x3a, 0x36, 0x19, 0x1c, 0xbd, 0x0a, 0x08, 0x13, 0xa3, 0xea, - 0xf9, 0x56, 0x80, 0xa3, 0xd1, 0x2c, 0xa0, 0x9b, 0x8d, 0x7b, 0xf8, 0x70, 0xd5, 0x83, 0xd2, 0x86, - 0x6f, 0x58, 0x8e, 0x90, 0x92, 0x0b, 0x50, 0xf6, 0x7c, 0xbc, 0x7a, 0xf9, 0x8a, 0xde, 0x33, 0xfc, - 0x5d, 0x1a, 0x75, 0xa6, 0x57, 0xb2, 0x5a, 0x89, 0x01, 0x6f, 0x52, 0x18, 0x31, 0x98, 0xc1, 0x4e, - 0x3f, 0x34, 0xdd, 0x47, 0x8e, 0x08, 0x15, 0x45, 0x1b, 0x2d, 0x40, 0xc1, 0x74, 0x75, 0x93, 0xe0, - 0xe4, 0xe6, 0x2c, 0x6f, 0xba, 0x74, 0x89, 0xeb, 0x99, 0x42, 0xaa, 0x92, 0x56, 0x7f, 0xae, 0x40, - 0x99, 0x2f, 0x19, 0x47, 0x36, 0x56, 0xc0, 0xa6, 0x90, 0x88, 0x8b, 0xed, 0x0c, 0xac, 0x60, 0x83, - 0x43, 0xd0, 0x35, 0x58, 0xa0, 0xbd, 0xba, 0x8f, 0x7b, 0x0c, 0xa4, 0x5b, 0x8e, 0x69, 0x75, 0x8c, - 0xd0, 0xf5, 0x79, 0x12, 0x7b, 0xd6, 0x64, 0x28, 0x79, 0x7f, 0x4b, 0x74, 0xa3, 0x6f, 0xc3, 0xb9, - 0xe1, 0xb9, 0x22, 0x40, 0x27, 0xa1, 0x1f, 0x8b, 0x0a, 0x17, 0x06, 0x67, 0x6f, 0xc4, 0x03, 0xae, - 0x67, 0x0a, 0x4a, 0x25, 0xa5, 0x7e, 0x06, 0x0b, 0x1b, 0xb8, 0xe3, 0xf6, 0x68, 0x34, 0xe1, 0x3a, - 0xdb, 0xb4, 0x38, 0x27, 0x78, 0x26, 0x47, 0x15, 0xca, 0x37, 0x1e, 0x55, 0xa8, 0x87, 0x0a, 0x9c, - 0x96, 0x17, 0xff, 0xff, 0x59, 0x16, 0xed, 0xc0, 0x2c, 0x37, 0xd2, 0x3d, 0xdc, 0x6b, 0x63, 0x3f, - 0xd8, 0xb1, 0x3c, 0x7a, 0x36, 0xd3, 0x03, 0xc6, 0x60, 0x77, 0xbf, 0x2e, 0x6a, 0x88, 0xf5, 0xa8, - 0xd0, 0x18, 0x17, 0x1f, 0xeb, 0x37, 0xa3, 0xc9, 0x9c, 0x69, 0x15, 0x86, 0x35, 0x86, 0xab, 0x7f, - 0x9a, 0x86, 0xda, 0x28, 0xee, 0x72, 0xf1, 0xb8, 0x0f, 0x39, 0x56, 0x0c, 0xe5, 0x99, 0xf2, 0x3b, - 0x49, 0x65, 0x94, 0x27, 0xa2, 0xa9, 0xb3, 0xa6, 0x70, 0x7b, 0x0c, 0x63, 0xed, 0xcb, 0x14, 0xe4, - 0x58, 0x07, 0xba, 0x3f, 0x18, 0xad, 0x65, 0x9b, 0x6b, 0x71, 0xb4, 0x76, 0x52, 0x66, 0x8a, 0x20, - 0xef, 0x2c, 0xe4, 0xad, 0x40, 0x27, 0x5c, 0x11, 0x09, 0x8b, 0x15, 0xdc, 0xb0, 0xf6, 0xf1, 0xf1, - 0x98, 0x3d, 0x3d, 0x22, 0x66, 0xff, 0x18, 0x40, 0x3a, 0x82, 0xcc, 0xb3, 0x1f, 0x81, 0x84, 0x8e, - 0xe6, 0x27, 0x42, 0xf3, 0xb2, 0x4c, 0x97, 0x45, 0x5b, 0xd5, 0x60, 0x66, 0x1b, 0x87, 0xc4, 0xba, - 0x04, 0x09, 0x5e, 0x64, 0x28, 0x94, 0xe1, 0x6e, 0x23, 0x35, 0x1c, 0xca, 0x30, 0x2b, 0xac, 0xfe, - 0x63, 0x8a, 0x7a, 0x57, 0x8e, 0x94, 0x1f, 0xb1, 0x3e, 0xb9, 0x77, 0x1d, 0x40, 0xf0, 0x54, 0x87, - 0xb3, 0x3b, 0xd2, 0xe1, 0x14, 0x85, 0xc3, 0x19, 0x95, 0x0f, 0x2f, 0xc3, 0x94, 0x6c, 0x28, 0xd2, - 0xb4, 0x4b, 0x06, 0x91, 0xdc, 0xd2, 0xeb, 0xb7, 0x6d, 0xab, 0xc3, 0x0d, 0x1d, 0x6f, 0xd5, 0xdc, - 0x31, 0xbc, 0xce, 0xd6, 0xa0, 0xd7, 0xb9, 0x32, 0xc9, 0x66, 0x8f, 0x39, 0x9d, 0x8b, 0x50, 0xfe, - 0x1e, 0x36, 0xec, 0x70, 0x47, 0x9c, 0xd2, 0x1c, 0x64, 0x7d, 0x6c, 0x98, 0x6c, 0xc5, 0x82, 0xc6, - 0x1a, 0xc4, 0x37, 0x89, 0x61, 0x3c, 0x4e, 0x98, 0x85, 0x99, 0x1b, 0x5c, 0x4e, 0x84, 0xbb, 0xfa, - 0x9f, 0x14, 0x54, 0x62, 0x58, 0x94, 0x4d, 0x80, 0x90, 0xa7, 0xe8, 0x7c, 0xae, 0x4e, 0x20, 0x81, - 0x02, 0xa1, 0x28, 0xdb, 0xc4, 0xc8, 0xd0, 0x1f, 0x2b, 0x50, 0x60, 0xca, 0x88, 0x85, 0x82, 0x27, - 0x25, 0x7d, 0xc3, 0xa4, 0x71, 0xb5, 0x16, 0x07, 0xff, 0x36, 0xc1, 0xff, 0xe3, 0x5f, 0x9f, 0x4c, - 0x5b, 0x23, 0x3a, 0x6a, 0x9f, 0x41, 0x79, 0x00, 0xaf, 0x7c, 0x80, 0x59, 0x76, 0x80, 0xdb, 0xf2, - 0x01, 0x4e, 0xaf, 0xbe, 0x3b, 0x01, 0x37, 0xc8, 0x72, 0x62, 0x1f, 0x5c, 0x23, 0xa5, 0xc3, 0xf4, - 0x60, 0xea, 0xba, 0xdb, 0x0e, 0xa4, 0xa3, 0x64, 0xd9, 0x83, 0x22, 0x67, 0x0f, 0xf3, 0x92, 0x4d, - 0xa4, 0x65, 0x0d, 0xd6, 0x42, 0x57, 0xb9, 0x20, 0xa7, 0x29, 0x51, 0x4b, 0x32, 0x23, 0xf7, 0xec, - 0x3a, 0xbd, 0x6f, 0x62, 0x77, 0x4f, 0x75, 0x12, 0x88, 0x33, 0x49, 0x57, 0x3f, 0x80, 0x12, 0x5b, - 0x91, 0x9f, 0xf6, 0x77, 0x21, 0x43, 0x06, 0xf1, 0x73, 0x7e, 0x31, 0xe1, 0x34, 0xae, 0xbb, 0x6d, - 0x31, 0x8b, 0x1f, 0x2d, 0x9d, 0xa9, 0x5e, 0x00, 0xa0, 0x5d, 0x6c, 0x0b, 0x67, 0x20, 0xf7, 0xd0, - 0x6d, 0x0b, 0xc3, 0x9a, 0xd6, 0xb2, 0x0f, 0xdd, 0x76, 0xcb, 0x54, 0x7f, 0x3f, 0x47, 0x77, 0x1a, - 0x2d, 0x3b, 0x0f, 0x29, 0x31, 0xa4, 0x99, 0x3b, 0x3a, 0x5c, 0x4a, 0xb5, 0x36, 0xb4, 0x94, 0x65, - 0x9e, 0x50, 0x39, 0xcf, 0x43, 0x31, 0xae, 0xb4, 0x55, 0x58, 0x06, 0x12, 0x01, 0x06, 0x52, 0xbe, - 0xcc, 0x60, 0xca, 0x87, 0xf6, 0x61, 0x7a, 0xa0, 0xd2, 0xc7, 0x6a, 0x11, 0xe5, 0xe6, 0xfb, 0x47, - 0x87, 0x4b, 0x65, 0xb9, 0xd4, 0x47, 0x7c, 0xec, 0xb5, 0xb1, 0x04, 0x2d, 0xd8, 0xb3, 0xa3, 0x0b, - 0x35, 0x82, 0xdb, 0x6b, 0xd7, 0x5b, 0x1b, 0x5a, 0x59, 0xae, 0x14, 0x06, 0xd2, 0x99, 0xe6, 0x06, - 0xce, 0xf4, 0x1a, 0xe4, 0x59, 0xf1, 0xd4, 0xa4, 0x15, 0xa7, 0xe4, 0x40, 0x38, 0x43, 0x83, 0x60, - 0x31, 0x81, 0xcc, 0x0d, 0x42, 0xc3, 0x27, 0x73, 0x0b, 0xe3, 0xce, 0xe5, 0x13, 0xd0, 0x3b, 0x50, - 0x78, 0x60, 0x39, 0x56, 0xb0, 0x83, 0x4d, 0x5a, 0xaa, 0x1c, 0x67, 0x72, 0x34, 0x83, 0xcc, 0xee, - 0xb9, 0xa6, 0xf5, 0xc0, 0xc2, 0x66, 0x15, 0xc6, 0x9d, 0x2d, 0x66, 0x90, 0x28, 0xf6, 0x81, 0x6f, - 0xd0, 0x62, 0x9c, 0xde, 0x71, 0x7b, 0x9e, 0x8d, 0xc9, 0x16, 0xa6, 0x96, 0x95, 0x95, 0x94, 0x36, - 0x2b, 0x7a, 0xd6, 0x45, 0x07, 0x51, 0x12, 0x5a, 0x2f, 0xa9, 0x96, 0x98, 0x55, 0xa7, 0x0d, 0x74, - 0x1b, 0x4e, 0xef, 0x58, 0xdd, 0x9d, 0x47, 0x06, 0x89, 0xb3, 0xe3, 0x9c, 0xb6, 0x3c, 0x26, 0x35, - 0x28, 0x9a, 0x1c, 0xf5, 0x10, 0x57, 0x17, 0xa3, 0x34, 0x71, 0xc7, 0xea, 0x19, 0x76, 0x75, 0x9a, - 0x2e, 0x5a, 0x89, 0x3a, 0x36, 0x18, 0x1c, 0x5d, 0x84, 0x69, 0xbf, 0xef, 0xd0, 0x90, 0x93, 0x1f, - 0xec, 0x0c, 0x1d, 0x59, 0xe6, 0x50, 0xa6, 0xfb, 0x2a, 0x82, 0xca, 0x0d, 0xb7, 0xc3, 0xae, 0x44, - 0x85, 0x15, 0xfe, 0x5f, 0x05, 0x66, 0x25, 0x60, 0x64, 0x86, 0x8b, 0xb6, 0x00, 0x8e, 0x71, 0x19, - 0x71, 0x0c, 0x41, 0x04, 0x11, 0x0e, 0x32, 0xc2, 0x56, 0xfb, 0xa9, 0x02, 0x05, 0xd1, 0x8b, 0x9e, - 0x87, 0x12, 0xe9, 0xb1, 0xad, 0xf0, 0x40, 0x8f, 0xfd, 0xd6, 0x94, 0x80, 0xbd, 0x87, 0x0f, 0xc8, - 0xde, 0xa2, 0x21, 0xb1, 0x1d, 0x2c, 0x6a, 0x65, 0x01, 0x65, 0xee, 0xb6, 0x06, 0x05, 0xdb, 0x08, - 0xad, 0xb0, 0x6f, 0x32, 0x9b, 0xa4, 0x68, 0x51, 0x9b, 0x68, 0xa8, 0xed, 0x3a, 0x5d, 0xd6, 0x99, - 0xa1, 0x9d, 0x31, 0x40, 0x6d, 0xc2, 0x8c, 0x66, 0x38, 0x5d, 0x7c, 0xc3, 0xed, 0x0a, 0x3b, 0xb2, - 0x00, 0x05, 0x56, 0x01, 0x8d, 0x2c, 0x49, 0x9e, 0xb6, 0xe5, 0x1a, 0x4b, 0x4a, 0xb2, 0x92, 0xea, - 0x7f, 0xa4, 0xa1, 0x12, 0x23, 0xe1, 0x4c, 0x7c, 0x3f, 0x2a, 0x9c, 0x30, 0x6f, 0x93, 0xe4, 0x7a, - 0x87, 0x27, 0x8f, 0x2c, 0x9d, 0xfc, 0x83, 0x02, 0xf0, 0x81, 0x8f, 0xc3, 0xf0, 0xa0, 0xe5, 0x3c, - 0x70, 0x09, 0xf3, 0x78, 0xde, 0x4a, 0x13, 0x0d, 0xc1, 0x3c, 0x0e, 0x23, 0xf6, 0x83, 0x6c, 0xc4, - 0xc1, 0x8f, 0x58, 0x37, 0x63, 0x5b, 0xde, 0xc1, 0x8f, 0x68, 0xd7, 0x05, 0x28, 0x1b, 0xa6, 0x89, - 0x4d, 0x9d, 0x47, 0x80, 0xdc, 0xb4, 0x95, 0x28, 0x50, 0x63, 0x30, 0xf4, 0x12, 0xcc, 0xf8, 0xb8, - 0xe7, 0xee, 0x4b, 0xc3, 0x98, 0x11, 0x9b, 0xe6, 0x60, 0x31, 0x70, 0x1e, 0x72, 0x3e, 0x36, 0x82, - 0xa8, 0xc4, 0xcd, 0x5b, 0xa8, 0x0a, 0x79, 0x93, 0x5d, 0xfb, 0x70, 0x5b, 0x23, 0x9a, 0xb5, 0x9f, - 0x2b, 0xa2, 0x0e, 0x74, 0x1d, 0xb2, 0x74, 0x83, 0xbc, 0x06, 0x54, 0x7f, 0x82, 0x83, 0xe3, 0x65, - 0x61, 0x89, 0x59, 0x32, 0x8f, 0x18, 0x0a, 0xf4, 0x09, 0x4c, 0x79, 0x94, 0x43, 0x3a, 0x2d, 0xcc, - 0xb0, 0x98, 0xe7, 0x8d, 0x49, 0x18, 0x1f, 0x33, 0x58, 0xc4, 0x10, 0x5e, 0x04, 0xe1, 0x39, 0xda, - 0x0a, 0x54, 0x6e, 0xf7, 0xb1, 0x7f, 0xf0, 0x81, 0x6d, 0x38, 0x92, 0xf7, 0xdc, 0x23, 0x30, 0x11, - 0xee, 0xd1, 0x86, 0xea, 0xc1, 0xac, 0x34, 0x92, 0xcb, 0xc5, 0xc7, 0x70, 0xce, 0xb4, 0x82, 0x30, - 0xd8, 0xb3, 0x75, 0x6f, 0xe7, 0x20, 0xb0, 0x3a, 0x86, 0xad, 0xd3, 0xe1, 0xba, 0x67, 0x1b, 0x0e, - 0x4f, 0xd2, 0xcf, 0x1f, 0x1d, 0x2e, 0x55, 0x37, 0xac, 0x20, 0xdc, 0xbe, 0x7d, 0xe3, 0x03, 0x3e, - 0x2a, 0x46, 0x55, 0xe5, 0x08, 0x8e, 0xf5, 0xa8, 0x0b, 0xec, 0x7d, 0x00, 0x99, 0xe9, 0x5b, 0xed, - 0x7e, 0x18, 0xa7, 0x71, 0xea, 0x5f, 0x03, 0x54, 0x8f, 0xf7, 0x71, 0xa2, 0x3c, 0x28, 0x8b, 0xdb, - 0x02, 0xc6, 0xba, 0xf1, 0x6e, 0x92, 0x47, 0xe1, 0x8a, 0xae, 0x98, 0x09, 0xcb, 0xe4, 0x30, 0xb9, - 0x64, 0x4a, 0x1d, 0xa8, 0x07, 0x25, 0xe9, 0x1a, 0x4d, 0xdc, 0x22, 0x6e, 0x9c, 0x64, 0xc1, 0xf8, - 0x6a, 0x6d, 0x20, 0x2c, 0x9f, 0x8a, 0xaf, 0xd6, 0x82, 0xda, 0x97, 0x0a, 0x40, 0x3c, 0x8e, 0x08, - 0x2c, 0x4b, 0x0f, 0xf9, 0x81, 0xf1, 0x16, 0x5a, 0x83, 0x1c, 0xbf, 0x23, 0x4c, 0x4d, 0x7a, 0x47, - 0xc8, 0x27, 0xd2, 0x9a, 0x0b, 0xbb, 0x1a, 0x0c, 0xf6, 0x6c, 0xa6, 0x2f, 0xbc, 0xe6, 0x42, 0xa1, - 0xdb, 0xb7, 0x6f, 0x68, 0x45, 0x36, 0x60, 0x7b, 0xcf, 0xbe, 0x9e, 0x29, 0xa4, 0x2b, 0x99, 0xda, - 0x1f, 0xa4, 0xa1, 0x48, 0xcb, 0xd6, 0x94, 0x35, 0x5f, 0x29, 0x50, 0x1d, 0xc8, 0xd6, 0xf4, 0xf6, - 0x81, 0x1e, 0xe7, 0x8c, 0x84, 0x4f, 0x1f, 0x9e, 0x84, 0x4f, 0xd1, 0x0a, 0x75, 0x4d, 0x4a, 0xfb, - 0x9a, 0x07, 0x34, 0x2c, 0x35, 0x19, 0xeb, 0xde, 0x3c, 0x69, 0x50, 0x3b, 0xe7, 0x8f, 0xc0, 0x89, - 0x5e, 0x80, 0x69, 0xf9, 0xb2, 0x34, 0xaa, 0x5a, 0x97, 0xe2, 0xb3, 0x69, 0x99, 0xe8, 0x3b, 0x00, - 0xa6, 0xef, 0x7a, 0x1e, 0x36, 0x75, 0x83, 0xa5, 0xa6, 0xe3, 0xf8, 0xcd, 0x22, 0x9f, 0xb3, 0x16, - 0xd6, 0xb6, 0x60, 0xe1, 0x89, 0x5b, 0x1a, 0x11, 0x53, 0x0f, 0x54, 0x39, 0xd3, 0x52, 0x50, 0x5c, - 0xfb, 0x51, 0x0a, 0x4a, 0xb2, 0xfc, 0xa2, 0x10, 0xd8, 0x53, 0x17, 0x59, 0x2b, 0xde, 0x7f, 0x56, - 0xad, 0x88, 0x4f, 0x62, 0x20, 0x8d, 0x0c, 0x05, 0xb4, 0xf6, 0x18, 0xa6, 0x07, 0x87, 0x8c, 0xc8, - 0xec, 0xb6, 0x07, 0x33, 0xbb, 0x77, 0x9f, 0x49, 0x22, 0x06, 0x78, 0xa0, 0xc4, 0x6f, 0x9e, 0x92, - 0x08, 0xb8, 0x37, 0x48, 0xc0, 0x77, 0x9f, 0x95, 0x2b, 0x32, 0x0d, 0x3f, 0x84, 0xca, 0xb0, 0x56, - 0x8f, 0xa0, 0xe0, 0xce, 0x20, 0x05, 0xdf, 0x7e, 0x36, 0xe3, 0x21, 0xad, 0xcf, 0x4b, 0x88, 0x67, - 0xe1, 0xcc, 0x4d, 0xfa, 0xea, 0xec, 0x26, 0x0e, 0x0d, 0x33, 0xae, 0x71, 0xab, 0xff, 0xac, 0xc0, - 0xfc, 0x70, 0x0f, 0xb7, 0xa4, 0x06, 0x14, 0x7a, 0x1c, 0xc6, 0xc5, 0xe5, 0x3b, 0x09, 0x64, 0x8d, - 0x46, 0x52, 0x17, 0x00, 0x59, 0x3c, 0x22, 0xb4, 0xb5, 0xdf, 0x86, 0xf2, 0xc0, 0x80, 0x11, 0x9c, - 0x79, 0x7d, 0x90, 0x33, 0x72, 0x82, 0xd6, 0x0f, 0x2d, 0xbb, 0xce, 0x1f, 0xd3, 0x45, 0x0b, 0x4b, - 0x79, 0xe1, 0xcf, 0x52, 0x70, 0x7a, 0xd3, 0xd9, 0xeb, 0xe3, 0x3e, 0xa6, 0xde, 0x51, 0xb8, 0xb8, - 0xdf, 0x64, 0xdd, 0x8a, 0xb9, 0xcf, 0x28, 0xb8, 0x63, 0x0d, 0xf4, 0x7d, 0x29, 0x0e, 0xa3, 0x77, - 0x5a, 0xcd, 0xf5, 0xa3, 0xc3, 0xa5, 0x3c, 0xa5, 0x8a, 0xae, 0xf9, 0xda, 0x44, 0x6b, 0xf2, 0x79, - 0x71, 0x30, 0x77, 0x09, 0x66, 0x83, 0x5d, 0xcb, 0xd3, 0x83, 0x1d, 0xb7, 0x6f, 0x9b, 0x3a, 0xa3, - 0x80, 0x95, 0x58, 0x66, 0x48, 0xc7, 0x36, 0x85, 0xdf, 0x26, 0x60, 0xf5, 0x2f, 0x52, 0x30, 0x37, - 0xc8, 0x15, 0x7e, 0xde, 0xb7, 0xe3, 0x10, 0x87, 0x1d, 0xf7, 0x9b, 0x49, 0x17, 0x64, 0x23, 0x30, - 0xd4, 0xc5, 0xc3, 0x98, 0x28, 0x36, 0xfa, 0x5b, 0x05, 0xf2, 0x1c, 0xf8, 0x1b, 0xe5, 0xfa, 0xbb, - 0x43, 0x11, 0xea, 0xc5, 0xa4, 0x4b, 0x55, 0xdf, 0xe8, 0x60, 0x1a, 0x71, 0x89, 0x78, 0x34, 0x4e, - 0x86, 0xd2, 0x52, 0x32, 0xa4, 0x9e, 0x81, 0xd3, 0xeb, 0x3b, 0x86, 0x1f, 0xae, 0xb3, 0x34, 0x54, - 0x68, 0xcc, 0x7d, 0x98, 0x1b, 0x04, 0x73, 0xf6, 0x35, 0x21, 0xcf, 0x13, 0x56, 0xce, 0x3e, 0x55, - 0x22, 0x22, 0x0c, 0xea, 0xe2, 0x41, 0x28, 0x9d, 0xbc, 0xcd, 0x9e, 0x4d, 0x44, 0x6f, 0x91, 0x58, - 0x9f, 0x3a, 0x05, 0xc5, 0xf5, 0x35, 0xb1, 0xd0, 0x45, 0x00, 0xd2, 0xe0, 0xe8, 0xcf, 0x12, 0xf4, - 0x7a, 0x07, 0xfb, 0x21, 0xbf, 0xf9, 0xc9, 0x75, 0x8c, 0x75, 0xec, 0x87, 0xea, 0x0f, 0x60, 0x96, - 0xfc, 0x36, 0xfb, 0x8e, 0x69, 0x47, 0x22, 0xfe, 0x22, 0x14, 0x42, 0x77, 0x17, 0x3b, 0xf1, 0x65, - 0xc9, 0x14, 0x11, 0xb8, 0x3b, 0x04, 0x46, 0x04, 0x87, 0x76, 0xb2, 0xbb, 0xf4, 0x60, 0xc7, 0xf0, - 0xb1, 0xa9, 0x07, 0xb8, 0xe3, 0xe3, 0x90, 0xdf, 0x96, 0x95, 0x18, 0x70, 0x9b, 0xc2, 0xd4, 0x57, - 0x00, 0xc9, 0x2b, 0x44, 0xc5, 0x87, 0x5c, 0x9b, 0x42, 0x04, 0x3d, 0xac, 0x75, 0xe9, 0x3d, 0x98, - 0x1f, 0xfd, 0x42, 0x08, 0x4d, 0x41, 0xfe, 0xee, 0xad, 0xf7, 0x6e, 0xbd, 0xff, 0xe1, 0xad, 0xca, - 0x29, 0xd2, 0x58, 0xbf, 0x71, 0x77, 0xfb, 0xce, 0xa6, 0x56, 0x51, 0x50, 0x09, 0x0a, 0x1b, 0x6b, - 0x77, 0xd6, 0x9a, 0x6b, 0xdb, 0x9b, 0x95, 0x14, 0x2a, 0x42, 0xf6, 0xce, 0x5a, 0xf3, 0xc6, 0x66, - 0x25, 0xbd, 0xfa, 0xd3, 0xe7, 0x20, 0xbb, 0x66, 0xf6, 0x2c, 0x07, 0x39, 0x50, 0xe4, 0x9b, 0x5b, - 0x5f, 0x43, 0x2f, 0x24, 0x9c, 0x6f, 0xc4, 0xc0, 0xda, 0xc5, 0xa7, 0x8c, 0xe2, 0x25, 0xbd, 0xb9, - 0x1f, 0xff, 0xd3, 0xbf, 0xfd, 0x2c, 0x35, 0x8d, 0x4a, 0x0d, 0xfd, 0xa1, 0x6b, 0x39, 0x8d, 0xfd, - 0x2b, 0x8d, 0x8e, 0x81, 0xfe, 0x48, 0x81, 0x59, 0xb1, 0x60, 0xb4, 0x79, 0xf4, 0x4a, 0x12, 0xca, - 0xe1, 0x53, 0xa8, 0xbd, 0x3a, 0xe6, 0x68, 0x4e, 0xc8, 0x12, 0x25, 0x64, 0x01, 0x9d, 0x8d, 0x09, - 0xf1, 0x19, 0x26, 0xc6, 0x5a, 0x14, 0x42, 0x96, 0xde, 0xd0, 0xa3, 0x97, 0x9e, 0x7e, 0x87, 0xcf, - 0x28, 0x58, 0x19, 0xf7, 0xb2, 0x5f, 0xad, 0xd2, 0xc5, 0x11, 0xaa, 0x34, 0x74, 0xfa, 0x64, 0x9b, - 0xac, 0x4e, 0x2f, 0xfd, 0xd1, 0xef, 0x29, 0x50, 0x8c, 0x5e, 0x0e, 0xa3, 0x97, 0xc7, 0x78, 0x92, - 0x19, 0x2d, 0xff, 0xca, 0x78, 0x83, 0x39, 0x09, 0xe7, 0x29, 0x09, 0xf3, 0x68, 0x4e, 0x22, 0x21, - 0x7a, 0x8c, 0x8c, 0xfe, 0x4c, 0x81, 0x99, 0xa1, 0x37, 0x9f, 0xe8, 0xca, 0x24, 0xef, 0x43, 0x19, - 0x49, 0xab, 0x93, 0x3f, 0x29, 0x55, 0x5f, 0xa2, 0x84, 0x3d, 0x8f, 0x96, 0x46, 0x11, 0xd6, 0x78, - 0x2c, 0x3e, 0x3f, 0x47, 0x7f, 0xa9, 0x40, 0x49, 0x7e, 0x22, 0x88, 0xea, 0x63, 0xbf, 0x25, 0x64, - 0xd4, 0x35, 0x26, 0x7c, 0x7b, 0xa8, 0xbe, 0x41, 0x49, 0xbb, 0x8c, 0xea, 0x4f, 0x21, 0xad, 0xc1, - 0xde, 0xd5, 0x36, 0x1e, 0xd3, 0x5f, 0x4a, 0x29, 0xc4, 0xcf, 0x4b, 0x12, 0xe5, 0xfa, 0xd8, 0x23, - 0x9a, 0xda, 0x64, 0x6f, 0x56, 0xd4, 0x77, 0x28, 0x8d, 0x6f, 0xa0, 0xd7, 0x26, 0xa3, 0xb1, 0xc1, - 0x5e, 0x47, 0xfd, 0x89, 0x02, 0xe5, 0x81, 0x17, 0x3b, 0x28, 0x89, 0x49, 0xa3, 0x1e, 0xfd, 0xd4, - 0x2e, 0x8f, 0x3f, 0x81, 0x93, 0xbc, 0x4c, 0x49, 0xae, 0xa1, 0xaa, 0x44, 0xb2, 0xe3, 0x3a, 0x8c, - 0x40, 0x4a, 0xc4, 0xa7, 0x90, 0x63, 0x8f, 0x44, 0xd0, 0xca, 0x18, 0xef, 0x48, 0x18, 0x1d, 0xdf, - 0x1a, 0xfb, 0xc5, 0x89, 0xba, 0x40, 0x09, 0x38, 0x8d, 0x66, 0x25, 0x02, 0xb8, 0xb7, 0x22, 0xfa, - 0x18, 0x3d, 0x60, 0x48, 0xd4, 0xc7, 0xe1, 0x27, 0x15, 0x89, 0xfa, 0x78, 0xfc, 0x4d, 0x04, 0xd7, - 0x47, 0x55, 0xa6, 0xa1, 0x6f, 0x91, 0xe3, 0xba, 0xa6, 0x5c, 0x42, 0x3f, 0x52, 0xa0, 0xb8, 0x35, - 0x16, 0x19, 0x5b, 0x93, 0x90, 0x71, 0xec, 0xc5, 0xc0, 0x48, 0x56, 0x30, 0x32, 0xd0, 0xef, 0x40, - 0x9e, 0xdf, 0xff, 0xa3, 0x24, 0xde, 0x0e, 0xbe, 0x2f, 0xa8, 0x5d, 0x1a, 0x67, 0x28, 0x5f, 0xbc, - 0x46, 0x17, 0x9f, 0x43, 0x48, 0x5a, 0x9c, 0xbf, 0x33, 0x40, 0xbf, 0xab, 0x40, 0x41, 0x5c, 0x35, - 0xa1, 0x4b, 0x63, 0xdd, 0x47, 0x31, 0x02, 0x5e, 0x9e, 0xe0, 0xee, 0x4a, 0x3d, 0x47, 0x29, 0x38, - 0x83, 0x4e, 0x4b, 0x14, 0x04, 0x62, 0xd5, 0x9f, 0x28, 0x90, 0x63, 0x37, 0x54, 0x89, 0x62, 0x38, - 0x70, 0xd7, 0x95, 0x28, 0x86, 0x43, 0xd7, 0x5d, 0x2f, 0xd0, 0xc5, 0x17, 0x07, 0x78, 0xbf, 0x43, - 0x87, 0xdc, 0x2f, 0xa2, 0x3c, 0xff, 0xa4, 0x8c, 0x10, 0xd7, 0x33, 0x89, 0x8c, 0x18, 0xba, 0x3a, - 0x4b, 0x64, 0xc4, 0xf0, 0xbd, 0xd5, 0x48, 0x46, 0x88, 0x3b, 0x22, 0xe4, 0x41, 0xe6, 0xba, 0xdb, - 0x0e, 0xd0, 0x53, 0xee, 0x5e, 0xa2, 0x95, 0x5f, 0x7a, 0xea, 0x38, 0xbe, 0xea, 0x59, 0xba, 0xea, - 0x2c, 0x9a, 0x91, 0x56, 0x7d, 0x48, 0x56, 0xda, 0x87, 0xf4, 0x75, 0xb7, 0x8d, 0x2e, 0x3e, 0xed, - 0xb2, 0x87, 0xad, 0x37, 0xe6, 0x9d, 0xd0, 0x48, 0xc3, 0x43, 0xff, 0x01, 0xea, 0x31, 0xbb, 0x10, - 0xfa, 0x9c, 0xaa, 0x7f, 0x54, 0xa7, 0x4e, 0xd4, 0xbb, 0xe1, 0x1a, 0x79, 0xa2, 0xde, 0x1d, 0x2b, - 0x7d, 0x8f, 0x74, 0xc7, 0x51, 0xf9, 0x9b, 0x92, 0x11, 0x55, 0xeb, 0x12, 0xc9, 0x18, 0x2e, 0x31, - 0x26, 0x92, 0x71, 0xac, 0xca, 0x38, 0x92, 0x0c, 0x5a, 0x65, 0xf4, 0xc8, 0xc2, 0xdf, 0x87, 0x2c, - 0x7d, 0xf4, 0x92, 0x18, 0x12, 0xc9, 0xef, 0x75, 0x12, 0x43, 0xa2, 0x81, 0x57, 0x36, 0xea, 0xa9, - 0xcb, 0x0a, 0x7a, 0x04, 0x25, 0xf9, 0x85, 0x44, 0xa2, 0x43, 0x1f, 0xf1, 0xe4, 0xa4, 0xf6, 0xfa, - 0x89, 0x9e, 0x5e, 0xa8, 0xa7, 0x88, 0x66, 0xa3, 0xe3, 0x03, 0xd0, 0x6b, 0x13, 0xe2, 0x7b, 0x46, - 0x2a, 0xfe, 0x5c, 0x81, 0x82, 0xa8, 0x2c, 0x27, 0x6a, 0xf6, 0xd0, 0xcd, 0x43, 0xa2, 0x66, 0x0f, - 0x97, 0xaa, 0xd5, 0x77, 0xe9, 0x11, 0xbf, 0x39, 0xa0, 0xd9, 0x34, 0xb5, 0xb5, 0xdd, 0xee, 0xfd, - 0x65, 0xb4, 0x38, 0x02, 0xdc, 0x78, 0x2c, 0x12, 0xea, 0xcf, 0x49, 0x64, 0x58, 0x19, 0xae, 0x8a, - 0xa0, 0xd5, 0x89, 0x4a, 0x28, 0x8c, 0xe8, 0xab, 0x27, 0x28, 0xbb, 0x44, 0x26, 0xf2, 0xfc, 0x50, - 0x74, 0xa3, 0x9b, 0x32, 0x39, 0x5f, 0x2a, 0x30, 0xbb, 0x66, 0xdb, 0x83, 0x55, 0x12, 0x74, 0x79, - 0x82, 0x82, 0x0a, 0x23, 0xf1, 0xca, 0xc4, 0x25, 0x18, 0xf5, 0x79, 0x4a, 0xe0, 0x39, 0xb4, 0x20, - 0x11, 0xc8, 0xaa, 0x26, 0xa2, 0x0e, 0x83, 0xbe, 0x50, 0xa0, 0x24, 0x27, 0xb5, 0x89, 0x62, 0x3e, - 0x22, 0x29, 0x4e, 0x8c, 0x5b, 0x47, 0x65, 0xcb, 0x72, 0xae, 0x13, 0xfb, 0x55, 0x32, 0x90, 0xa7, - 0xc2, 0x24, 0xec, 0x2b, 0xc9, 0x45, 0x86, 0x44, 0x92, 0x46, 0x54, 0x79, 0x12, 0x49, 0x1a, 0x55, - 0xbd, 0x50, 0x2f, 0x50, 0x92, 0x9e, 0x53, 0x65, 0xd3, 0x8b, 0xd9, 0x40, 0x9d, 0x0a, 0xdb, 0x35, - 0xe5, 0x52, 0xf3, 0xd2, 0x57, 0xff, 0xba, 0x78, 0xea, 0xab, 0xa3, 0x45, 0xe5, 0x97, 0x47, 0x8b, - 0xca, 0xaf, 0x8e, 0x16, 0x95, 0x7f, 0x39, 0x5a, 0x54, 0xbe, 0xf8, 0x7a, 0xf1, 0xd4, 0x2f, 0xbf, - 0x5e, 0x3c, 0xf5, 0xab, 0xaf, 0x17, 0x4f, 0xdd, 0x2f, 0x88, 0x55, 0xda, 0x39, 0x5a, 0xf0, 0xbd, - 0xfa, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x2f, 0x63, 0x3b, 0xee, 0x14, 0x3b, 0x00, 0x00, + 0x76, 0x1a, 0xfc, 0xf1, 0x08, 0x90, 0x40, 0x8b, 0xa2, 0x40, 0x48, 0x26, 0xe9, 0x91, 0x65, 0x73, + 0x65, 0x1b, 0xb0, 0x28, 0xff, 0x22, 0xdb, 0xbb, 0x4b, 0x90, 0x2c, 0x2e, 0x65, 0x49, 0xb6, 0x86, + 0x92, 0x5c, 0x96, 0xe3, 0x9d, 0x1d, 0x60, 0x5a, 0xe0, 0x88, 0x83, 0x99, 0xe1, 0xcc, 0x80, 0x12, + 0xad, 0x78, 0x2b, 0xbb, 0x9b, 0x4a, 0xe5, 0xb4, 0xe5, 0x64, 0x53, 0x39, 0xc4, 0xa7, 0xe4, 0x90, + 0x1c, 0x72, 0x49, 0xf6, 0x98, 0x43, 0x72, 0x75, 0xe5, 0xb2, 0x9b, 0xca, 0x65, 0x73, 0xe1, 0x26, + 0x74, 0x4e, 0xc9, 0x35, 0x87, 0x54, 0x0e, 0x49, 0xaa, 0x7f, 0x33, 0x0d, 0x10, 0x1a, 0x01, 0x94, + 0x37, 0x17, 0x62, 0xfa, 0x75, 0xbf, 0xd7, 0xaf, 0x5f, 0xbf, 0x5f, 0xbf, 0x6e, 0xc2, 0xb9, 0x00, + 0xfb, 0xfb, 0xd8, 0x6f, 0xb2, 0x1f, 0xaf, 0xdd, 0x34, 0xcc, 0x9e, 0xe5, 0x34, 0x3c, 0xdf, 0x0d, + 0x5d, 0x34, 0xdf, 0x71, 0x3b, 0xbb, 0xbe, 0x6b, 0x74, 0x76, 0x1a, 0xac, 0xbf, 0x21, 0x86, 0xd5, + 0x6b, 0x1d, 0xd7, 0xb9, 0x6f, 0x75, 0x9b, 0x9f, 0xb9, 0x0e, 0xf6, 0xda, 0xf4, 0x87, 0x21, 0xd5, + 0xe7, 0x1e, 0xb8, 0xed, 0xa0, 0x49, 0xfe, 0x78, 0x6d, 0xfa, 0xc3, 0xe1, 0xe7, 0x87, 0x67, 0x0a, + 0x42, 0x23, 0xec, 0x8b, 0xde, 0x73, 0x41, 0xe8, 0xfa, 0x46, 0x17, 0x37, 0xb1, 0xd3, 0xb5, 0x28, + 0xc9, 0xde, 0x7e, 0xa7, 0xc3, 0x3b, 0x1b, 0xbb, 0xfb, 0xcd, 0xdd, 0x7d, 0x8e, 0x6f, 0x5b, 0xfb, + 0xd8, 0xc1, 0x41, 0x10, 0x7d, 0x78, 0xed, 0xe8, 0x93, 0x8f, 0x5f, 0x92, 0xc7, 0x8b, 0x0f, 0x32, + 0xcc, 0xed, 0xf2, 0x11, 0x0b, 0x61, 0xd0, 0xec, 0x18, 0xa1, 0x61, 0xbb, 0xdd, 0x66, 0x67, 0xc7, + 0xf0, 0x43, 0x9d, 0xb7, 0x78, 0x7f, 0xad, 0x1f, 0x5a, 0x76, 0xb3, 0x87, 0x43, 0xdf, 0xea, 0xf0, + 0x1f, 0xde, 0x33, 0xdb, 0x75, 0xbb, 0x2e, 0xfd, 0x6c, 0x92, 0x2f, 0xb1, 0xb8, 0xae, 0xeb, 0x76, + 0x6d, 0xdc, 0x34, 0x3c, 0xab, 0x69, 0x38, 0x8e, 0x1b, 0x1a, 0xa1, 0xe5, 0x3a, 0x82, 0x9f, 0x45, + 0xde, 0x4b, 0x5b, 0xed, 0xfe, 0xfd, 0x66, 0x68, 0xf5, 0x70, 0x10, 0x1a, 0x3d, 0x8f, 0x0d, 0x50, + 0x11, 0x54, 0xd6, 0x8d, 0xd0, 0x68, 0x1b, 0x01, 0x0e, 0x34, 0xbc, 0xd7, 0xc7, 0x41, 0xa8, 0x5e, + 0x86, 0xaa, 0x04, 0x0b, 0x3c, 0xd7, 0x09, 0x30, 0x3a, 0x0f, 0x45, 0x53, 0x00, 0x6b, 0xca, 0x52, + 0x7a, 0xb9, 0xa8, 0xc5, 0x00, 0xf5, 0x63, 0x98, 0x13, 0x28, 0xeb, 0x38, 0x34, 0x2c, 0x5b, 0x10, + 0x43, 0x75, 0x28, 0x88, 0x61, 0x35, 0x65, 0x49, 0x59, 0x2e, 0x6a, 0x51, 0x1b, 0x5d, 0x80, 0xb2, + 0xe5, 0x74, 0xec, 0xbe, 0x89, 0x75, 0xb2, 0x25, 0x41, 0x2d, 0xb5, 0xa4, 0x2c, 0x17, 0xb4, 0x12, + 0x07, 0x6e, 0x13, 0x98, 0xfa, 0x5f, 0x39, 0x38, 0x7b, 0x8c, 0x36, 0x67, 0xea, 0x2e, 0xe4, 0xba, + 0xbe, 0xe1, 0x84, 0x8c, 0xa3, 0xa9, 0x95, 0xb7, 0x1b, 0x4f, 0xd4, 0x9b, 0xc6, 0x13, 0x68, 0x34, + 0x36, 0x09, 0x81, 0x56, 0xe6, 0xab, 0xc3, 0xc5, 0x53, 0x1a, 0xa7, 0x86, 0x16, 0x61, 0x2a, 0x34, + 0xda, 0x36, 0xd6, 0x1d, 0xa3, 0x87, 0x09, 0x5b, 0x64, 0xb9, 0x40, 0x41, 0x37, 0x09, 0x04, 0xbd, + 0x01, 0x65, 0x13, 0x07, 0x1d, 0xdf, 0xf2, 0x42, 0xd7, 0xd7, 0x2d, 0xb3, 0x96, 0x5e, 0x52, 0x96, + 0xd3, 0xad, 0xca, 0xd1, 0xe1, 0x62, 0x69, 0x3d, 0xea, 0xd8, 0x5a, 0xd7, 0x4a, 0xf1, 0xb0, 0x2d, + 0x13, 0x5d, 0x83, 0x29, 0xa2, 0xaf, 0x3a, 0x53, 0xe1, 0x5a, 0x66, 0x49, 0x59, 0x9e, 0x5a, 0xb9, + 0x20, 0x31, 0xcd, 0x3a, 0x1a, 0x4c, 0xb7, 0x1b, 0xf7, 0x5c, 0x07, 0xaf, 0x51, 0x08, 0xe7, 0x0f, + 0x3e, 0x8b, 0x20, 0xe8, 0x53, 0xa8, 0x4a, 0xb4, 0x74, 0x1b, 0xef, 0x63, 0xbb, 0x96, 0x5d, 0x52, + 0x96, 0xa7, 0x57, 0x2e, 0x27, 0x88, 0x21, 0xa6, 0xd9, 0xf7, 0xa9, 0xaa, 0x5c, 0x27, 0x88, 0xda, + 0x4c, 0x4c, 0x99, 0x02, 0xd0, 0x4d, 0xc8, 0xb2, 0x3d, 0xc9, 0x51, 0x26, 0x4f, 0x22, 0x59, 0xba, + 0x7f, 0x1a, 0x23, 0x53, 0x7f, 0x07, 0xb2, 0x54, 0xd2, 0x08, 0x41, 0xa6, 0x1f, 0x60, 0x9f, 0x2b, + 0x03, 0xfd, 0x46, 0x0b, 0x00, 0x9e, 0x6f, 0xed, 0x5b, 0x36, 0xee, 0xc6, 0xe2, 0x8e, 0x21, 0xf5, + 0xff, 0x4c, 0x41, 0x96, 0x52, 0x43, 0x36, 0x4c, 0xf7, 0xac, 0x20, 0xb0, 0x9c, 0xae, 0x4e, 0xb7, + 0x43, 0xec, 0xfc, 0xc6, 0x49, 0xf9, 0x6b, 0xdc, 0x60, 0xe4, 0x6e, 0x13, 0x6a, 0x5a, 0xb9, 0x27, + 0xb5, 0xa8, 0x1e, 0xf8, 0x86, 0xd3, 0x25, 0x42, 0xee, 0x3b, 0x21, 0x55, 0xcf, 0xb4, 0x06, 0x14, + 0xb4, 0x46, 0x20, 0xe8, 0x75, 0x98, 0x33, 0x3c, 0xcf, 0x77, 0x1f, 0x59, 0x3d, 0x23, 0xc4, 0xba, + 0x69, 0x05, 0xbb, 0x7a, 0xfb, 0x20, 0xc4, 0x01, 0x55, 0x88, 0x8c, 0x36, 0x2b, 0xf5, 0xae, 0x5b, + 0xc1, 0x6e, 0x8b, 0xf4, 0xa1, 0x4f, 0xa1, 0xe0, 0xb8, 0x26, 0xd6, 0x2d, 0x33, 0xa8, 0x65, 0x96, + 0xd2, 0xcb, 0xd9, 0x56, 0xeb, 0xe8, 0x70, 0x31, 0x7f, 0xd3, 0x35, 0xf1, 0xd6, 0x7a, 0xf0, 0xdf, + 0x87, 0x8b, 0x57, 0xba, 0x56, 0xb8, 0xd3, 0x6f, 0x37, 0x3a, 0x6e, 0xaf, 0x19, 0xad, 0xcb, 0x6c, + 0xc7, 0xdf, 0x4d, 0x6f, 0xb7, 0xdb, 0xa4, 0x5f, 0x5e, 0xbb, 0xc1, 0xf0, 0xb4, 0x3c, 0xa1, 0xb9, + 0x65, 0x06, 0xf5, 0x4d, 0x28, 0xc9, 0x8b, 0x22, 0x12, 0x27, 0x7a, 0x2c, 0x24, 0x4e, 0xbe, 0x89, + 0xe9, 0x61, 0xdf, 0x77, 0x7d, 0xbd, 0x87, 0x83, 0xc0, 0xe8, 0x62, 0xba, 0xb6, 0xa2, 0x56, 0xa2, + 0xc0, 0x1b, 0x0c, 0xa6, 0x6e, 0xc2, 0x69, 0x4a, 0x61, 0x02, 0x93, 0x9e, 0x85, 0x2c, 0xdd, 0x17, + 0x4e, 0x8f, 0x35, 0xd4, 0xbf, 0x2f, 0xc0, 0xec, 0x20, 0x25, 0x6e, 0xc0, 0xdb, 0x43, 0x06, 0xfc, + 0x46, 0xc2, 0x36, 0x8e, 0x22, 0x30, 0xd2, 0x7a, 0xef, 0x42, 0xbe, 0xe3, 0xda, 0xfd, 0x9e, 0xc3, + 0x54, 0x69, 0x6a, 0xe5, 0xcd, 0x49, 0xa9, 0xae, 0x51, 0x74, 0x4e, 0x56, 0x10, 0x43, 0x77, 0x20, + 0x6f, 0x39, 0x26, 0x7e, 0x44, 0x77, 0xf7, 0x44, 0xdc, 0x6e, 0x11, 0x74, 0x41, 0x96, 0xd3, 0x1a, + 0x56, 0xb2, 0xcc, 0x28, 0x25, 0xeb, 0xf8, 0x98, 0xe8, 0x17, 0x73, 0x4a, 0xc4, 0xa0, 0x70, 0x0f, + 0x3b, 0x21, 0x35, 0xf7, 0xa2, 0x36, 0xcb, 0x7a, 0xe9, 0x8c, 0xdb, 0xa2, 0x6f, 0xd8, 0xd7, 0xe4, + 0xbe, 0x71, 0x5f, 0x93, 0xff, 0xc6, 0x7c, 0xcd, 0x31, 0x6f, 0x5a, 0x18, 0xcb, 0x9b, 0xbe, 0x0d, + 0x3c, 0x17, 0xe8, 0xfb, 0x58, 0xa7, 0xfc, 0xc5, 0x92, 0x29, 0x52, 0xc9, 0xcc, 0x45, 0xfd, 0x84, + 0x95, 0x48, 0x36, 0xcf, 0xe6, 0x8c, 0xfe, 0x4e, 0x81, 0x1c, 0x53, 0x90, 0x91, 0x96, 0x85, 0x20, + 0x13, 0x1e, 0x78, 0xc2, 0x00, 0xe8, 0x37, 0xb1, 0x18, 0xa7, 0x6f, 0xdb, 0xd4, 0x30, 0xd2, 0x34, + 0xc6, 0x45, 0x6d, 0x62, 0x89, 0x26, 0xbe, 0x6f, 0xf4, 0xed, 0x50, 0xdf, 0x37, 0xec, 0x3e, 0xa6, + 0x0a, 0x50, 0x24, 0x4b, 0xa5, 0xc0, 0xbb, 0x04, 0x86, 0xae, 0xc0, 0x99, 0x2e, 0x76, 0x30, 0x93, + 0xa2, 0x8e, 0x1f, 0x79, 0x3e, 0x0e, 0x02, 0xcb, 0x75, 0x84, 0x06, 0xc4, 0x9d, 0x1b, 0x51, 0x1f, + 0x9a, 0x83, 0xdc, 0x8e, 0x65, 0x9a, 0xd8, 0xa1, 0x9b, 0x5f, 0xd0, 0x78, 0xab, 0xfe, 0x37, 0x0a, + 0x64, 0xa9, 0x26, 0x8e, 0xe4, 0x7f, 0x0e, 0x72, 0x7d, 0xc7, 0xda, 0xeb, 0x63, 0x1e, 0x8d, 0x79, + 0x0b, 0x55, 0x20, 0x1d, 0xe0, 0x3d, 0x16, 0xe8, 0x34, 0xf2, 0x49, 0x46, 0x32, 0xd3, 0xe0, 0x2c, + 0xf3, 0x16, 0x4d, 0x15, 0x2c, 0x1f, 0x77, 0xc2, 0x98, 0xc1, 0x18, 0x80, 0x6a, 0x90, 0x27, 0x19, + 0x97, 0xe5, 0x74, 0x39, 0x5b, 0xa2, 0x49, 0xa4, 0x64, 0xf5, 0x3c, 0xdb, 0xea, 0x58, 0x21, 0x55, + 0xae, 0x82, 0x16, 0xb5, 0xd5, 0x0d, 0xa8, 0x46, 0xfa, 0xfd, 0x0c, 0x8e, 0xe8, 0x8b, 0x0c, 0x20, + 0x99, 0x0e, 0x77, 0x43, 0x43, 0x26, 0xa8, 0x1c, 0x33, 0xc1, 0x0b, 0x50, 0xf6, 0x31, 0x61, 0xc5, + 0x18, 0x08, 0x05, 0x25, 0x0e, 0x64, 0x83, 0x9e, 0x03, 0xa0, 0x6e, 0x9d, 0x8d, 0x60, 0x82, 0x2a, + 0x12, 0x08, 0xeb, 0x5e, 0x15, 0x11, 0x95, 0x85, 0xfd, 0x8b, 0xb2, 0xe1, 0xb0, 0x14, 0xb4, 0x21, + 0x52, 0xd0, 0xc6, 0x8d, 0xbb, 0x6b, 0x6b, 0x94, 0x45, 0x6e, 0x8c, 0x0c, 0x33, 0x21, 0xdc, 0xe4, + 0x12, 0xc2, 0x8d, 0x09, 0x22, 0xac, 0xe9, 0x84, 0x9b, 0xa0, 0x96, 0xa5, 0xde, 0xeb, 0xb7, 0x9e, + 0xe6, 0xbd, 0x06, 0x64, 0x24, 0xe2, 0x24, 0x09, 0x36, 0x9c, 0xa9, 0x52, 0x2f, 0x06, 0x0d, 0x06, + 0xb5, 0xfc, 0x37, 0x1f, 0xd4, 0x3e, 0x82, 0x29, 0x89, 0x03, 0x74, 0x01, 0xf2, 0x7c, 0x36, 0xb6, + 0xf3, 0x2d, 0x38, 0x3a, 0x5c, 0xcc, 0x71, 0xa4, 0x1c, 0x43, 0x1a, 0x2f, 0xc8, 0xcd, 0xc1, 0xec, + 0x4d, 0xd7, 0x39, 0xa6, 0x5c, 0xea, 0x2f, 0x14, 0x38, 0x33, 0xd4, 0xc1, 0xb5, 0xe5, 0x63, 0xa8, + 0x92, 0x34, 0x5a, 0x0f, 0xb0, 0x6f, 0xe1, 0x80, 0xa7, 0xae, 0x0a, 0xdd, 0xd4, 0x57, 0x27, 0x92, + 0xa9, 0x36, 0x43, 0xe8, 0x6c, 0x53, 0x32, 0x2c, 0xbd, 0xf9, 0x04, 0x90, 0xe5, 0x84, 0xd8, 0x77, + 0x0c, 0x5b, 0xef, 0x07, 0x72, 0x5a, 0x3c, 0x31, 0xed, 0x8a, 0x20, 0x74, 0x27, 0xe0, 0x99, 0xf4, + 0x34, 0x94, 0xee, 0x04, 0xd8, 0x8f, 0x56, 0xf8, 0x43, 0x28, 0xf3, 0x36, 0x5f, 0xd8, 0x16, 0x64, + 0x89, 0x07, 0x14, 0xc1, 0x38, 0x69, 0xc2, 0x01, 0x44, 0xda, 0x12, 0x9a, 0x4a, 0x29, 0xd4, 0x55, + 0xc8, 0x10, 0x20, 0x31, 0x51, 0x02, 0x90, 0xbc, 0x4c, 0xd4, 0x56, 0x7f, 0xa2, 0x40, 0x79, 0x63, + 0x1f, 0x3b, 0xb1, 0x41, 0x0b, 0xdf, 0xa9, 0x48, 0xbe, 0xf3, 0x1c, 0x14, 0x43, 0xc3, 0xef, 0xe2, + 0x90, 0xec, 0x35, 0x33, 0xbb, 0x02, 0x03, 0x6c, 0x99, 0xc4, 0xca, 0x6d, 0xab, 0x67, 0x31, 0x6b, + 0xcb, 0x6a, 0xac, 0x81, 0x5e, 0x86, 0x6a, 0xdf, 0xf1, 0xb1, 0x69, 0x74, 0x42, 0x6c, 0xea, 0x98, + 0x4e, 0x41, 0xad, 0xae, 0xa0, 0x55, 0xe2, 0x0e, 0x36, 0xb5, 0xfa, 0xef, 0x29, 0x98, 0x16, 0x5c, + 0x70, 0x39, 0xdc, 0x80, 0x1c, 0x47, 0x62, 0x82, 0x68, 0x26, 0x08, 0x62, 0x10, 0x95, 0x35, 0x45, + 0x3e, 0xc2, 0x88, 0xd4, 0xff, 0x20, 0x05, 0x59, 0x0a, 0x47, 0x2d, 0x28, 0x46, 0x07, 0x30, 0xae, + 0x31, 0xf5, 0x06, 0x3b, 0xa2, 0x35, 0xc4, 0x11, 0xad, 0x71, 0x5b, 0x8c, 0x68, 0x15, 0x08, 0x99, + 0x2f, 0x7e, 0xbd, 0xa8, 0x68, 0x31, 0x1a, 0xf1, 0x32, 0x94, 0xae, 0x2e, 0x45, 0x99, 0x22, 0x85, + 0xdc, 0x26, 0xe2, 0xfa, 0x96, 0x2c, 0x2e, 0x76, 0x2a, 0x29, 0x1d, 0x1d, 0x2e, 0x16, 0x6e, 0x33, + 0x91, 0xad, 0x4b, 0xc2, 0x5b, 0x01, 0xe2, 0xbf, 0x5c, 0x3f, 0x24, 0x9e, 0xc1, 0x32, 0x59, 0xe6, + 0xd1, 0x9a, 0x39, 0x3a, 0x5c, 0x9c, 0xd2, 0x04, 0x7c, 0x6b, 0x5d, 0x9b, 0x8a, 0x06, 0x6d, 0x99, + 0x64, 0x87, 0x2c, 0xe7, 0xbe, 0xcb, 0xdd, 0x3a, 0xfd, 0x26, 0x53, 0xb2, 0x18, 0x41, 0x88, 0x10, + 0x47, 0x54, 0x62, 0x53, 0xde, 0xa1, 0x40, 0x32, 0x25, 0xeb, 0xde, 0x32, 0xd5, 0xbf, 0x52, 0xa0, + 0xb2, 0x8d, 0xc3, 0x3b, 0x5b, 0x24, 0x27, 0x17, 0xbb, 0xfe, 0x31, 0xc0, 0x2e, 0x3e, 0x60, 0xd1, + 0x4f, 0x88, 0xfc, 0x6a, 0x82, 0xc8, 0x87, 0x09, 0x34, 0xde, 0xc7, 0x07, 0x34, 0x4c, 0x06, 0x1b, + 0x4e, 0xe8, 0x1f, 0x68, 0xc5, 0x5d, 0xd1, 0xae, 0xbf, 0x0b, 0xd3, 0x83, 0x9d, 0x24, 0x8c, 0xed, + 0xe2, 0x03, 0xae, 0x61, 0xe4, 0x93, 0xe8, 0x10, 0x0b, 0xbc, 0x44, 0x96, 0x25, 0x8d, 0x35, 0xae, + 0xa6, 0xde, 0x56, 0xd4, 0xd3, 0x50, 0x95, 0xe6, 0x62, 0x3b, 0xac, 0xbe, 0x08, 0x95, 0xcd, 0xe1, + 0x15, 0x20, 0xc8, 0xec, 0xe2, 0x03, 0x71, 0x2e, 0xa6, 0xdf, 0xea, 0x2f, 0x52, 0x50, 0xdd, 0x1c, + 0xc6, 0x46, 0x3f, 0x18, 0xb1, 0xd6, 0x77, 0x12, 0xd6, 0x7a, 0x8c, 0xc2, 0xd0, 0x62, 0xb9, 0xaa, + 0x49, 0x4b, 0xbe, 0x0f, 0x59, 0x96, 0x33, 0x44, 0xeb, 0x52, 0xa4, 0x75, 0xa1, 0x4d, 0x28, 0xd9, + 0x46, 0x10, 0xea, 0x7d, 0xcf, 0x34, 0x42, 0x6c, 0x72, 0xdf, 0x32, 0x9e, 0x16, 0x4e, 0x11, 0xcc, + 0x3b, 0x0c, 0xb1, 0xee, 0x8d, 0x21, 0xda, 0xef, 0xc9, 0xa2, 0x9d, 0x5a, 0x59, 0x99, 0x68, 0xa1, + 0x94, 0xb4, 0xbc, 0x1d, 0x15, 0x98, 0x5e, 0xb3, 0xfb, 0x41, 0x88, 0x7d, 0xe1, 0xc1, 0xbe, 0x54, + 0x60, 0x26, 0x02, 0x71, 0x09, 0xbf, 0x02, 0xd0, 0x61, 0xa0, 0x38, 0x38, 0x94, 0x8f, 0x0e, 0x17, + 0x8b, 0x7c, 0xe0, 0xd6, 0xba, 0x56, 0xe4, 0x03, 0xb6, 0x4c, 0xe2, 0x2a, 0x62, 0x1b, 0xc0, 0x0e, + 0x71, 0xa3, 0x26, 0x4f, 0x7c, 0x2a, 0x51, 0xc7, 0x06, 0x83, 0xa3, 0x57, 0x01, 0x61, 0xe2, 0x54, + 0x3d, 0xdf, 0x0a, 0x70, 0x34, 0x9a, 0x25, 0x74, 0xd5, 0xb8, 0x87, 0x0f, 0x57, 0x3d, 0x28, 0xad, + 0xfb, 0x86, 0xe5, 0x08, 0x2d, 0xb9, 0x00, 0x65, 0xcf, 0xc7, 0x2b, 0xaf, 0x5d, 0xd6, 0x7b, 0x86, + 0xbf, 0x4b, 0xb3, 0xce, 0xf4, 0x72, 0x56, 0x2b, 0x31, 0xe0, 0x0d, 0x0a, 0x23, 0x0e, 0x33, 0xd8, + 0xe9, 0x87, 0xa6, 0xfb, 0xd0, 0x11, 0xa9, 0xa2, 0x68, 0xa3, 0x79, 0x28, 0x98, 0xae, 0x6e, 0x12, + 0x9a, 0xdc, 0x9d, 0xe5, 0x4d, 0x97, 0x4e, 0x71, 0x2d, 0x53, 0x48, 0x55, 0xd2, 0xea, 0xcf, 0x15, + 0x28, 0xf3, 0x29, 0xe3, 0xcc, 0xc6, 0x0a, 0x18, 0x0a, 0xc9, 0xb8, 0xd8, 0xca, 0xc0, 0x0a, 0xd6, + 0x39, 0x04, 0x5d, 0x85, 0x79, 0xda, 0xab, 0xfb, 0xb8, 0xc7, 0x40, 0xba, 0xe5, 0x98, 0x56, 0xc7, + 0x08, 0x5d, 0x9f, 0x1f, 0x62, 0xcf, 0x9a, 0x8c, 0x24, 0xef, 0xdf, 0x12, 0xdd, 0xe8, 0xdb, 0x70, + 0x6e, 0x18, 0x57, 0x24, 0xe8, 0x24, 0xf5, 0x63, 0x59, 0xe1, 0xfc, 0x20, 0xf6, 0x7a, 0x3c, 0xe0, + 0x5a, 0xa6, 0xa0, 0x54, 0x52, 0xea, 0x67, 0x30, 0xbf, 0x8e, 0x3b, 0x6e, 0x8f, 0x66, 0x13, 0xae, + 0xb3, 0x4d, 0x8b, 0x73, 0x42, 0x66, 0x72, 0x56, 0xa1, 0x7c, 0xe3, 0x59, 0x85, 0x7a, 0xa8, 0xc0, + 0x69, 0x79, 0xf2, 0xff, 0x9f, 0x69, 0xd1, 0x0e, 0x54, 0xb9, 0x93, 0xee, 0xe1, 0x5e, 0x1b, 0xfb, + 0xc1, 0x8e, 0xe5, 0xd1, 0xbd, 0x99, 0x1e, 0x70, 0x06, 0xbb, 0xfb, 0x0d, 0x51, 0x43, 0x6c, 0x44, + 0x85, 0xc6, 0xb8, 0xf8, 0xd8, 0xb8, 0x11, 0x21, 0x73, 0xa1, 0x55, 0x18, 0xd5, 0x18, 0xae, 0xfe, + 0x49, 0x1a, 0xea, 0xa3, 0xa4, 0xcb, 0xd5, 0xe3, 0x1e, 0xe4, 0x58, 0x31, 0x94, 0x9f, 0x94, 0xdf, + 0x4d, 0x2a, 0xa3, 0x3c, 0x91, 0x4c, 0x83, 0x35, 0x45, 0xd8, 0x63, 0x14, 0xeb, 0x5f, 0xa6, 0x20, + 0xc7, 0x3a, 0xd0, 0xbd, 0xc1, 0x6c, 0x2d, 0xdb, 0x5a, 0x8d, 0xb3, 0xb5, 0x93, 0x0a, 0x53, 0x24, + 0x79, 0x67, 0x21, 0x6f, 0x05, 0x3a, 0x91, 0x8a, 0x38, 0xb0, 0x58, 0xc1, 0x75, 0x6b, 0x1f, 0x1f, + 0xcf, 0xd9, 0xd3, 0x23, 0x72, 0xf6, 0x4f, 0x00, 0xa4, 0x2d, 0xc8, 0x3c, 0xfb, 0x16, 0x48, 0xe4, + 0xe8, 0xf9, 0x44, 0x58, 0x5e, 0x96, 0xd9, 0xb2, 0x68, 0xab, 0x1a, 0xcc, 0x6c, 0xe3, 0x90, 0x78, + 0x97, 0x20, 0x21, 0x8a, 0x0c, 0xa5, 0x32, 0x3c, 0x6c, 0xa4, 0x86, 0x53, 0x19, 0xe6, 0x85, 0xd5, + 0x7f, 0x4c, 0xd1, 0xe8, 0xca, 0x89, 0xf2, 0x2d, 0xd6, 0x27, 0x8f, 0xae, 0x03, 0x04, 0x9e, 0x1a, + 0x70, 0x76, 0x47, 0x06, 0x9c, 0xa2, 0x08, 0x38, 0xa3, 0xce, 0xc3, 0x4b, 0x30, 0x25, 0x3b, 0x8a, + 0x34, 0xed, 0x92, 0x41, 0xe4, 0x6c, 0xe9, 0xf5, 0xdb, 0xb6, 0xd5, 0xe1, 0x8e, 0x8e, 0xb7, 0xea, + 0xee, 0x18, 0x51, 0x67, 0x73, 0x30, 0xea, 0x5c, 0x9e, 0x64, 0xb1, 0xc7, 0x82, 0xce, 0x45, 0x28, + 0x7f, 0x0f, 0x1b, 0x76, 0xb8, 0x23, 0x76, 0x69, 0x16, 0xb2, 0x3e, 0x36, 0x4c, 0x36, 0x63, 0x41, + 0x63, 0x0d, 0x12, 0x9b, 0xc4, 0x30, 0x9e, 0x27, 0x54, 0x61, 0xe6, 0x3a, 0xd7, 0x13, 0x11, 0xae, + 0xfe, 0x27, 0x05, 0x95, 0x18, 0x16, 0x9d, 0x26, 0x40, 0xe8, 0x53, 0xb4, 0x3f, 0x57, 0x26, 0xd0, + 0x40, 0x41, 0x50, 0x94, 0x6d, 0x62, 0x62, 0xe8, 0x8f, 0x14, 0x28, 0x30, 0x63, 0xc4, 0xc2, 0xc0, + 0x93, 0x0e, 0x7d, 0xc3, 0xac, 0x71, 0xb3, 0x16, 0x1b, 0xff, 0x0e, 0xa1, 0xff, 0xe3, 0x5f, 0x9f, + 0xcc, 0x5a, 0x23, 0x3e, 0xea, 0x9f, 0x41, 0x79, 0x80, 0xae, 0xbc, 0x81, 0x59, 0xb6, 0x81, 0xdb, + 0xf2, 0x06, 0x4e, 0xaf, 0xbc, 0x37, 0x81, 0x34, 0xc8, 0x74, 0x62, 0x1d, 0xdc, 0x22, 0xa5, 0xcd, + 0xf4, 0x60, 0xea, 0x9a, 0xdb, 0x0e, 0xa4, 0xad, 0x64, 0xa7, 0x07, 0x45, 0x3e, 0x3d, 0xcc, 0x49, + 0x3e, 0x91, 0x96, 0x35, 0x58, 0x0b, 0x5d, 0xe1, 0x8a, 0x9c, 0xa6, 0x4c, 0x2d, 0xca, 0x82, 0xdc, + 0xb3, 0x1b, 0xf4, 0xbe, 0x89, 0xdd, 0x3d, 0x35, 0x48, 0x22, 0xce, 0x34, 0x5d, 0xfd, 0x10, 0x4a, + 0x6c, 0x46, 0xbe, 0xdb, 0xdf, 0x85, 0x0c, 0x19, 0xc4, 0xf7, 0xf9, 0xc5, 0x84, 0xdd, 0xb8, 0xe6, + 0xb6, 0x05, 0x16, 0xdf, 0x5a, 0x8a, 0xa9, 0x5e, 0x00, 0xa0, 0x5d, 0x6c, 0x09, 0x67, 0x20, 0xf7, + 0xc0, 0x6d, 0x0b, 0xc7, 0x9a, 0xd6, 0xb2, 0x0f, 0xdc, 0xf6, 0x96, 0xa9, 0xfe, 0x69, 0x9e, 0xae, + 0x34, 0x9a, 0x76, 0x0e, 0x52, 0x62, 0x48, 0x2b, 0x77, 0x74, 0xb8, 0x98, 0xda, 0x5a, 0xd7, 0x52, + 0x96, 0x79, 0x42, 0xe3, 0x3c, 0x0f, 0xc5, 0xb8, 0xd2, 0x56, 0x61, 0x27, 0x90, 0x08, 0x30, 0x70, + 0xe4, 0xcb, 0x0c, 0x1e, 0xf9, 0xd0, 0x3e, 0x4c, 0x0f, 0x54, 0xfa, 0x58, 0x2d, 0xa2, 0xdc, 0xfa, + 0xe0, 0xe8, 0x70, 0xb1, 0x2c, 0x97, 0xfa, 0x48, 0x8c, 0xbd, 0x3a, 0x96, 0xa2, 0x05, 0x7b, 0x76, + 0x74, 0xa1, 0x46, 0x68, 0x7b, 0xed, 0xc6, 0xd6, 0xba, 0x56, 0x96, 0x2b, 0x85, 0x81, 0xb4, 0xa7, + 0xb9, 0x81, 0x3d, 0xbd, 0x0a, 0x79, 0x56, 0x3c, 0x35, 0x69, 0xc5, 0x29, 0x39, 0x11, 0xce, 0xd0, + 0x24, 0x58, 0x20, 0x10, 0xdc, 0x20, 0x34, 0x7c, 0x82, 0x5b, 0x18, 0x17, 0x97, 0x23, 0xa0, 0x77, + 0xa1, 0x70, 0xdf, 0x72, 0xac, 0x60, 0x07, 0x9b, 0xb4, 0x54, 0x39, 0x0e, 0x72, 0x84, 0x41, 0xb0, + 0x7b, 0xae, 0x69, 0xdd, 0xb7, 0xb0, 0x59, 0x83, 0x71, 0xb1, 0x05, 0x06, 0xc9, 0x62, 0xef, 0xfb, + 0x06, 0x2d, 0xc6, 0xe9, 0x1d, 0xb7, 0xe7, 0xd9, 0x98, 0x2c, 0x61, 0x6a, 0x49, 0x59, 0x4e, 0x69, + 0x55, 0xd1, 0xb3, 0x26, 0x3a, 0x88, 0x91, 0xd0, 0x7a, 0x49, 0xad, 0xc4, 0xbc, 0x3a, 0x6d, 0xa0, + 0x5b, 0x70, 0x7a, 0xc7, 0xea, 0xee, 0x3c, 0x34, 0x48, 0x9e, 0x1d, 0x9f, 0x69, 0xcb, 0x63, 0x72, + 0x83, 0x22, 0xe4, 0xa8, 0x87, 0x84, 0xba, 0x98, 0xa4, 0x89, 0x3b, 0x56, 0xcf, 0xb0, 0x6b, 0xd3, + 0x74, 0xd2, 0x4a, 0xd4, 0xb1, 0xce, 0xe0, 0xe8, 0x22, 0x4c, 0xfb, 0x7d, 0x87, 0xa6, 0x9c, 0x7c, + 0x63, 0x67, 0xe8, 0xc8, 0x32, 0x87, 0xf2, 0xc4, 0xe3, 0x1d, 0x28, 0xd0, 0xd3, 0x8e, 0xdf, 0x77, + 0x6a, 0xd5, 0x71, 0x37, 0x89, 0x60, 0x68, 0x7d, 0x87, 0x20, 0x3b, 0xf8, 0x11, 0x43, 0x46, 0xe3, + 0x22, 0x13, 0x0c, 0x82, 0x3c, 0x0f, 0x05, 0xa7, 0xdf, 0x23, 0xb8, 0x41, 0xed, 0x34, 0x35, 0xcd, + 0xbc, 0xd3, 0xef, 0x69, 0x7d, 0x27, 0x50, 0x11, 0x54, 0xae, 0xbb, 0x1d, 0x76, 0x4f, 0x2b, 0x42, + 0xc3, 0xff, 0x2a, 0x50, 0x95, 0x80, 0x51, 0x6c, 0x28, 0xda, 0x02, 0x38, 0xc6, 0x0d, 0xc9, 0x31, + 0x02, 0x11, 0x44, 0x44, 0xed, 0x88, 0x5a, 0xfd, 0xa7, 0x0a, 0x14, 0x44, 0x2f, 0x7a, 0x1e, 0x4a, + 0xa4, 0xc7, 0xb6, 0xc2, 0x03, 0x3d, 0x0e, 0xa6, 0x53, 0x02, 0xf6, 0x3e, 0x3e, 0x20, 0x02, 0x8f, + 0x86, 0xc4, 0xce, 0xb9, 0xa8, 0x95, 0x05, 0x94, 0xe5, 0x00, 0x75, 0x22, 0xf0, 0xd0, 0x0a, 0xfb, + 0x26, 0x73, 0x94, 0x8a, 0x16, 0xb5, 0x89, 0xdb, 0xb0, 0x5d, 0xa7, 0xcb, 0x3a, 0x33, 0xb4, 0x33, + 0x06, 0xa8, 0x2d, 0x98, 0xd1, 0x0c, 0xa7, 0x8b, 0xaf, 0xbb, 0x5d, 0xe1, 0xdc, 0xe6, 0xa1, 0xc0, + 0xca, 0xb2, 0x91, 0x7b, 0xcb, 0xd3, 0xb6, 0x5c, 0xf8, 0x49, 0x49, 0xae, 0x5b, 0xfd, 0x8f, 0x34, + 0x54, 0x62, 0x22, 0x5c, 0x88, 0x1f, 0x44, 0xd5, 0x1c, 0x16, 0x02, 0x93, 0xf2, 0x81, 0x61, 0xe4, + 0x91, 0xf5, 0x9c, 0x7f, 0x50, 0x00, 0x3e, 0xf4, 0x71, 0x18, 0x1e, 0x6c, 0x39, 0xf7, 0x5d, 0x22, + 0x3c, 0x7e, 0x98, 0xa6, 0xa7, 0x1f, 0x21, 0x3c, 0x0e, 0x23, 0x4e, 0x8d, 0x2a, 0x03, 0x7e, 0xc8, + 0xba, 0x99, 0xd8, 0xf2, 0x0e, 0x7e, 0x48, 0xbb, 0x2e, 0x40, 0xd9, 0x30, 0x4d, 0x6c, 0xea, 0x3c, + 0x2d, 0xe5, 0xfe, 0xb6, 0x44, 0x81, 0x1a, 0x83, 0xa1, 0x97, 0x60, 0xc6, 0xc7, 0x3d, 0x77, 0x5f, + 0x1a, 0xc6, 0x3c, 0xeb, 0x34, 0x07, 0x8b, 0x81, 0x73, 0x90, 0xf3, 0xb1, 0x11, 0x44, 0x75, 0x77, + 0xde, 0x42, 0x35, 0xc8, 0x9b, 0xec, 0x2e, 0x8a, 0x3b, 0x40, 0xd1, 0xac, 0xff, 0x5c, 0x11, 0xc5, + 0xa9, 0x6b, 0x90, 0xa5, 0x0b, 0xe4, 0x85, 0xa9, 0xc6, 0x13, 0xa2, 0x2e, 0xaf, 0x55, 0x4b, 0xc2, + 0x92, 0x65, 0xc4, 0x48, 0xa0, 0x4f, 0x61, 0xca, 0xa3, 0x12, 0xd2, 0x69, 0xb5, 0x88, 0x25, 0x62, + 0x6f, 0x4e, 0x22, 0xf8, 0x58, 0xc0, 0x22, 0xb1, 0xf1, 0x22, 0x08, 0x3f, 0x38, 0x2e, 0x43, 0xe5, + 0x56, 0x1f, 0xfb, 0x07, 0x1f, 0xda, 0x86, 0x23, 0x85, 0xf4, 0x3d, 0x02, 0x13, 0x39, 0x28, 0x6d, + 0xa8, 0x1e, 0x54, 0xa5, 0x91, 0x5c, 0x2f, 0x3e, 0x81, 0x73, 0xa6, 0x15, 0x84, 0xc1, 0x9e, 0xad, + 0x7b, 0x3b, 0x07, 0x81, 0xd5, 0x31, 0x6c, 0x9d, 0x0e, 0xd7, 0x3d, 0xdb, 0x70, 0x78, 0xe5, 0xe0, + 0xfc, 0xd1, 0xe1, 0x62, 0x6d, 0xdd, 0x0a, 0xc2, 0xed, 0x5b, 0xd7, 0x3f, 0xe4, 0xa3, 0x62, 0x52, + 0x35, 0x4e, 0xe0, 0x58, 0x8f, 0x3a, 0xcf, 0x1e, 0x2d, 0x10, 0x4c, 0xdf, 0x6a, 0xf7, 0xc3, 0xf8, + 0x6c, 0xa9, 0xfe, 0x35, 0x40, 0xed, 0x78, 0x1f, 0x67, 0xca, 0x83, 0xb2, 0xb8, 0xc2, 0x60, 0xa2, + 0x1b, 0xef, 0x7a, 0x7b, 0x14, 0xad, 0xe8, 0xde, 0x9b, 0x88, 0x4c, 0xce, 0xdd, 0x4b, 0xa6, 0xd4, + 0x81, 0x7a, 0x50, 0x92, 0xee, 0xf6, 0xc4, 0xd5, 0xe6, 0xfa, 0x49, 0x26, 0x8c, 0xef, 0xfb, 0x06, + 0xce, 0x0a, 0x53, 0xf1, 0x7d, 0x5f, 0x50, 0xff, 0x52, 0x01, 0x88, 0xc7, 0x11, 0x85, 0x65, 0x67, + 0x56, 0xbe, 0x61, 0xbc, 0x85, 0x56, 0x21, 0xc7, 0x2f, 0x2e, 0x53, 0x93, 0x5e, 0x5c, 0x72, 0x44, + 0x5a, 0x08, 0x62, 0xf7, 0x95, 0xc1, 0x9e, 0xcd, 0xec, 0x85, 0x17, 0x82, 0x28, 0x74, 0xfb, 0xd6, + 0x75, 0xad, 0xc8, 0x06, 0x6c, 0xef, 0xd9, 0xd7, 0x32, 0x85, 0x74, 0x25, 0x53, 0xff, 0xfd, 0x34, + 0x14, 0x69, 0x2d, 0x9d, 0x8a, 0xe6, 0x2b, 0x05, 0x6a, 0x03, 0x47, 0x48, 0xbd, 0x7d, 0xa0, 0xc7, + 0x07, 0x59, 0x22, 0xa7, 0x8f, 0x4e, 0x22, 0xa7, 0x68, 0x86, 0x86, 0x26, 0x9d, 0x45, 0x5b, 0x07, + 0x34, 0x57, 0x36, 0x99, 0xe8, 0xde, 0x3a, 0x69, 0xa6, 0x3d, 0xeb, 0x8f, 0xa0, 0x89, 0x5e, 0x80, + 0x69, 0xf9, 0x06, 0x37, 0x2a, 0xa5, 0x97, 0xe2, 0xbd, 0xd9, 0x32, 0xd1, 0x77, 0x00, 0x4c, 0xdf, + 0xf5, 0x3c, 0x6c, 0xea, 0x06, 0x3b, 0x2f, 0x8f, 0x13, 0xf3, 0x8a, 0x1c, 0x67, 0x35, 0xac, 0x6f, + 0xc2, 0xfc, 0x13, 0x97, 0x34, 0x22, 0xd1, 0x1f, 0x28, 0xbd, 0xa6, 0xa5, 0x4c, 0xbd, 0xfe, 0xa3, + 0x14, 0x94, 0x64, 0xfd, 0x45, 0x21, 0xb0, 0xf7, 0x37, 0xb2, 0x55, 0x7c, 0xf0, 0xac, 0x56, 0x11, + 0xef, 0xc4, 0xc0, 0xd9, 0x36, 0x14, 0xd0, 0xfa, 0x63, 0x98, 0x1e, 0x1c, 0x32, 0xe2, 0xb8, 0xb9, + 0x3d, 0x78, 0xdc, 0x7c, 0xef, 0x99, 0x34, 0x62, 0x40, 0x06, 0x4a, 0xfc, 0x10, 0x2b, 0x89, 0x81, + 0xbb, 0x83, 0x0c, 0x7c, 0xf7, 0x59, 0xa5, 0x22, 0xf3, 0xf0, 0x43, 0xa8, 0x0c, 0x5b, 0xf5, 0x08, + 0x0e, 0x6e, 0x0f, 0x72, 0xf0, 0xed, 0x67, 0x73, 0x1e, 0xd2, 0xfc, 0xbc, 0xae, 0x79, 0x16, 0xce, + 0xdc, 0xa0, 0x4f, 0xe1, 0x6e, 0xe0, 0xd0, 0x30, 0xe3, 0xc2, 0xbb, 0xfa, 0xcf, 0x0a, 0xcc, 0x0d, + 0xf7, 0x70, 0x4f, 0x6a, 0x40, 0xa1, 0xc7, 0x61, 0x5c, 0x5d, 0xbe, 0x93, 0xc0, 0xd6, 0x68, 0x22, + 0x0d, 0x01, 0x90, 0xd5, 0x23, 0x22, 0x5b, 0xff, 0x6d, 0x28, 0x0f, 0x0c, 0x18, 0x21, 0x99, 0x37, + 0x06, 0x25, 0x23, 0x9f, 0x1a, 0xfb, 0xa1, 0x65, 0x37, 0xf8, 0x0b, 0xbf, 0x68, 0x62, 0xe9, 0xb0, + 0xfa, 0xb3, 0x14, 0x9c, 0xde, 0x70, 0xf6, 0xfa, 0xb8, 0x8f, 0x69, 0x74, 0x14, 0x21, 0xee, 0x37, + 0x59, 0x4c, 0x63, 0xe1, 0x33, 0x4a, 0xee, 0x58, 0x03, 0x7d, 0x5f, 0xca, 0xc3, 0xe8, 0x45, 0x5b, + 0x6b, 0xed, 0xe8, 0x70, 0x31, 0x4f, 0xb9, 0xa2, 0x73, 0xbe, 0x3e, 0xd1, 0x9c, 0x1c, 0x2f, 0x4e, + 0xe6, 0x2e, 0x41, 0x35, 0xd8, 0xb5, 0x3c, 0x3d, 0xd8, 0x71, 0xfb, 0xb6, 0xa9, 0x33, 0x0e, 0x58, + 0xdd, 0x67, 0x86, 0x74, 0x6c, 0x53, 0xf8, 0x2d, 0x02, 0x56, 0xff, 0x22, 0x05, 0xb3, 0x83, 0x52, + 0xe1, 0xfb, 0x7d, 0x2b, 0x4e, 0x71, 0xd8, 0x76, 0xbf, 0x95, 0x74, 0x6b, 0x37, 0x82, 0x42, 0x43, + 0xbc, 0xd6, 0x89, 0x72, 0xa3, 0xbf, 0x55, 0x20, 0xcf, 0x81, 0xbf, 0x51, 0xa9, 0xbf, 0x37, 0x94, + 0xa1, 0x5e, 0x4c, 0xba, 0xe9, 0xf5, 0x8d, 0x0e, 0xa6, 0x19, 0x97, 0xc8, 0x47, 0xe3, 0x13, 0x5a, + 0x5a, 0x3a, 0xa1, 0xa9, 0x67, 0xe0, 0xf4, 0xda, 0x8e, 0xe1, 0x87, 0x6b, 0xec, 0x6c, 0x2c, 0x2c, + 0xe6, 0x1e, 0xcc, 0x0e, 0x82, 0xb9, 0xf8, 0x5a, 0x90, 0xe7, 0xa7, 0x68, 0x2e, 0x3e, 0x55, 0x62, + 0x22, 0x0c, 0x1a, 0xe2, 0x95, 0x2a, 0x45, 0xde, 0x66, 0x6f, 0x39, 0xa2, 0x07, 0x52, 0xac, 0x4f, + 0x9d, 0x82, 0xe2, 0xda, 0xaa, 0x98, 0xe8, 0x22, 0x00, 0x69, 0x70, 0xf2, 0x67, 0x09, 0x79, 0xbd, + 0x83, 0xfd, 0x90, 0x5f, 0x47, 0xe5, 0x3a, 0xc6, 0x1a, 0xf6, 0x43, 0xf5, 0x07, 0x50, 0x25, 0xbf, + 0xad, 0xbe, 0x63, 0xda, 0x91, 0x8a, 0xbf, 0x08, 0x85, 0xd0, 0xdd, 0xc5, 0x4e, 0x7c, 0x83, 0x33, + 0x45, 0x14, 0xee, 0x36, 0x81, 0x11, 0xc5, 0xa1, 0x9d, 0xec, 0x82, 0x3f, 0xd8, 0x31, 0x7c, 0x6c, + 0xea, 0x01, 0xee, 0xf8, 0x38, 0xe4, 0x57, 0x78, 0x25, 0x06, 0xdc, 0xa6, 0x30, 0xf5, 0x15, 0x40, + 0xf2, 0x0c, 0x51, 0x45, 0x24, 0xd7, 0xa6, 0x10, 0xc1, 0x0f, 0x6b, 0x5d, 0x7a, 0x1f, 0xe6, 0x46, + 0x3f, 0x5b, 0x42, 0x53, 0x90, 0xbf, 0x73, 0xf3, 0xfd, 0x9b, 0x1f, 0x7c, 0x74, 0xb3, 0x72, 0x8a, + 0x34, 0xd6, 0xae, 0xdf, 0xd9, 0xbe, 0xbd, 0xa1, 0x55, 0x14, 0x54, 0x82, 0xc2, 0xfa, 0xea, 0xed, + 0xd5, 0xd6, 0xea, 0xf6, 0x46, 0x25, 0x85, 0x8a, 0x90, 0xbd, 0xbd, 0xda, 0xba, 0xbe, 0x51, 0x49, + 0xaf, 0xfc, 0xf4, 0x39, 0xc8, 0xae, 0x9a, 0x3d, 0xcb, 0x41, 0x0e, 0x14, 0xf9, 0xe2, 0xd6, 0x56, + 0xd1, 0x0b, 0x09, 0xfb, 0x1b, 0x09, 0xb0, 0x7e, 0xf1, 0x29, 0xa3, 0x78, 0x9d, 0x71, 0xf6, 0xc7, + 0xff, 0xf4, 0x6f, 0x3f, 0x4b, 0x4d, 0xa3, 0x52, 0x53, 0x7f, 0xe0, 0x5a, 0x4e, 0x73, 0xff, 0x72, + 0xb3, 0x63, 0xa0, 0x3f, 0x54, 0xa0, 0x2a, 0x26, 0x8c, 0x16, 0x8f, 0x5e, 0x49, 0x22, 0x39, 0xbc, + 0x0b, 0xf5, 0x57, 0xc7, 0x1c, 0xcd, 0x19, 0x59, 0xa4, 0x8c, 0xcc, 0xa3, 0xb3, 0x31, 0x23, 0x3e, + 0xa3, 0xc4, 0x44, 0x8b, 0x42, 0xc8, 0xd2, 0x67, 0x03, 0xe8, 0xa5, 0xa7, 0x3f, 0x2c, 0x60, 0x1c, + 0x2c, 0x8f, 0xfb, 0x02, 0x41, 0xad, 0xd1, 0xc9, 0x11, 0xaa, 0x34, 0x75, 0xfa, 0x8e, 0x9c, 0xcc, + 0x4e, 0x5f, 0x22, 0xa0, 0xdf, 0x53, 0xa0, 0x18, 0x3d, 0x67, 0x46, 0x2f, 0x8f, 0xf1, 0x4e, 0x34, + 0x9a, 0xfe, 0x95, 0xf1, 0x06, 0x73, 0x16, 0xce, 0x53, 0x16, 0xe6, 0xd0, 0xac, 0xc4, 0x42, 0xf4, + 0x42, 0x1a, 0xfd, 0x99, 0x02, 0x33, 0x43, 0x0f, 0x51, 0xd1, 0xe5, 0x49, 0x1e, 0xad, 0x32, 0x96, + 0x56, 0x26, 0x7f, 0xe7, 0xaa, 0xbe, 0x44, 0x19, 0x7b, 0x1e, 0x2d, 0x8e, 0x62, 0xac, 0xf9, 0x58, + 0x7c, 0x7e, 0x8e, 0xfe, 0x52, 0x81, 0x92, 0xfc, 0x6e, 0x11, 0x35, 0xc6, 0x7e, 0xe0, 0xc8, 0xb8, + 0x6b, 0x4e, 0xf8, 0x20, 0x52, 0x7d, 0x93, 0xb2, 0xf6, 0x1a, 0x6a, 0x3c, 0x85, 0xb5, 0x26, 0x7b, + 0xec, 0xdb, 0x7c, 0x4c, 0x7f, 0x29, 0xa7, 0x10, 0xbf, 0x79, 0x49, 0xd4, 0xeb, 0x63, 0x2f, 0x7b, + 0xea, 0x93, 0x3d, 0xa4, 0x51, 0xdf, 0xa5, 0x3c, 0xbe, 0x89, 0x5e, 0x9f, 0x8c, 0xc7, 0x26, 0x7b, + 0xb2, 0xf5, 0xc7, 0x0a, 0x94, 0x07, 0x9e, 0x11, 0xa1, 0x24, 0x21, 0x8d, 0x7a, 0x89, 0x54, 0x7f, + 0x6d, 0x7c, 0x04, 0xce, 0xf2, 0x12, 0x65, 0xb9, 0x8e, 0x6a, 0x12, 0xcb, 0x8e, 0xeb, 0x30, 0x06, + 0x29, 0x13, 0x8f, 0x20, 0xc7, 0x5e, 0xae, 0xa0, 0xe5, 0x31, 0x1e, 0xb7, 0x30, 0x3e, 0xbe, 0x35, + 0xf6, 0x33, 0x18, 0x75, 0x9e, 0x32, 0x70, 0x1a, 0x55, 0x25, 0x06, 0x78, 0xb4, 0x22, 0xf6, 0x18, + 0xbd, 0xaa, 0x48, 0xb4, 0xc7, 0xe1, 0x77, 0x1e, 0x89, 0xf6, 0x78, 0xfc, 0xa1, 0x06, 0xb7, 0x47, + 0x55, 0xe6, 0xa1, 0x6f, 0x91, 0xed, 0xba, 0xaa, 0x5c, 0x42, 0x3f, 0x52, 0xa0, 0xb8, 0x39, 0x16, + 0x1b, 0x9b, 0x93, 0xb0, 0x71, 0xec, 0x19, 0xc3, 0x48, 0x51, 0x30, 0x36, 0xd0, 0xef, 0x40, 0x9e, + 0x3f, 0x4a, 0x40, 0x49, 0xb2, 0x1d, 0x7c, 0xf4, 0x50, 0xbf, 0x34, 0xce, 0x50, 0x3e, 0x79, 0x9d, + 0x4e, 0x3e, 0x8b, 0x90, 0x34, 0x39, 0x7f, 0xfc, 0x80, 0x7e, 0x57, 0x81, 0x82, 0xb8, 0xff, 0x42, + 0x97, 0xc6, 0xba, 0x24, 0x63, 0x0c, 0xbc, 0x3c, 0xc1, 0x85, 0x9a, 0x7a, 0x8e, 0x72, 0x70, 0x06, + 0x9d, 0x96, 0x38, 0x08, 0xc4, 0xac, 0x3f, 0x51, 0x20, 0xc7, 0xae, 0xcd, 0x12, 0xd5, 0x70, 0xe0, + 0x02, 0x2e, 0x51, 0x0d, 0x87, 0xee, 0xe0, 0x5e, 0xa0, 0x93, 0x2f, 0x0c, 0xc8, 0x7e, 0x87, 0x0e, + 0xb9, 0x57, 0x44, 0x79, 0xfe, 0x49, 0x05, 0x21, 0xee, 0x8c, 0x12, 0x05, 0x31, 0x74, 0x9f, 0x97, + 0x28, 0x88, 0xe1, 0xcb, 0xb4, 0x91, 0x82, 0x10, 0x17, 0x57, 0xc8, 0x83, 0xcc, 0x35, 0xb7, 0x1d, + 0xa0, 0xa7, 0x5c, 0x08, 0x45, 0x33, 0xbf, 0xf4, 0xd4, 0x71, 0x7c, 0xd6, 0xb3, 0x74, 0xd6, 0x2a, + 0x9a, 0x91, 0x66, 0x7d, 0x40, 0x66, 0xda, 0x87, 0xf4, 0x35, 0xb7, 0x8d, 0x2e, 0x3e, 0xed, 0x06, + 0x8a, 0xcd, 0x37, 0xe6, 0x45, 0xd5, 0x48, 0xc7, 0x43, 0xff, 0x2b, 0xeb, 0x31, 0xbb, 0xa5, 0xfa, + 0x9c, 0x9a, 0x7f, 0x54, 0xa7, 0x4e, 0xb4, 0xbb, 0xe1, 0x1a, 0x79, 0xa2, 0xdd, 0x1d, 0x2b, 0x7d, + 0x8f, 0x0c, 0xc7, 0x51, 0xf9, 0x9b, 0xb2, 0x11, 0x55, 0xeb, 0x12, 0xd9, 0x18, 0x2e, 0x31, 0x26, + 0xb2, 0x71, 0xac, 0xca, 0x38, 0x92, 0x0d, 0x5a, 0x65, 0xf4, 0xc8, 0xc4, 0xdf, 0x87, 0x2c, 0x7d, + 0x89, 0x93, 0x98, 0x12, 0xc9, 0x8f, 0x88, 0x12, 0x53, 0xa2, 0x81, 0xa7, 0x3f, 0xea, 0xa9, 0xd7, + 0x14, 0xf4, 0x10, 0x4a, 0xf2, 0xb3, 0x8d, 0xc4, 0x80, 0x3e, 0xe2, 0x1d, 0x4c, 0xfd, 0x8d, 0x13, + 0xbd, 0x07, 0x51, 0x4f, 0x11, 0xcb, 0x46, 0xc7, 0x07, 0xa0, 0xd7, 0x27, 0xa4, 0xf7, 0x8c, 0x5c, + 0xfc, 0xb9, 0x02, 0x05, 0x51, 0x59, 0x4e, 0xb4, 0xec, 0xa1, 0x9b, 0x87, 0x44, 0xcb, 0x1e, 0x2e, + 0x55, 0xab, 0xef, 0xd1, 0x2d, 0x7e, 0x6b, 0xc0, 0xb2, 0xe9, 0xd1, 0xd6, 0x76, 0xbb, 0xf7, 0x96, + 0xd0, 0xc2, 0x08, 0x70, 0xf3, 0xb1, 0x38, 0x50, 0x7f, 0x4e, 0x32, 0xc3, 0xca, 0x70, 0x55, 0x04, + 0xad, 0x4c, 0x54, 0x42, 0x61, 0x4c, 0x5f, 0x39, 0x41, 0xd9, 0x25, 0x72, 0x91, 0xe7, 0x87, 0xb2, + 0x1b, 0xdd, 0x94, 0xd9, 0xf9, 0x52, 0x81, 0xea, 0xaa, 0x6d, 0x0f, 0x56, 0x49, 0xd0, 0x6b, 0x13, + 0x14, 0x54, 0x18, 0x8b, 0x97, 0x27, 0x2e, 0xc1, 0xa8, 0xcf, 0x53, 0x06, 0xcf, 0xa1, 0x79, 0x89, + 0x41, 0x56, 0x35, 0x11, 0x75, 0x18, 0xf4, 0x85, 0x02, 0x25, 0xf9, 0x50, 0x9b, 0xa8, 0xe6, 0x23, + 0x0e, 0xc5, 0x89, 0x79, 0xeb, 0xa8, 0xd3, 0xb2, 0x7c, 0xd6, 0x89, 0xe3, 0x2a, 0x19, 0xc8, 0x8f, + 0xc2, 0x24, 0xed, 0x2b, 0xc9, 0x45, 0x86, 0x44, 0x96, 0x46, 0x54, 0x79, 0x12, 0x59, 0x1a, 0x55, + 0xbd, 0x50, 0x2f, 0x50, 0x96, 0x9e, 0x53, 0x65, 0xd7, 0x8b, 0xd9, 0x40, 0x9d, 0x2a, 0xdb, 0x55, + 0xe5, 0x52, 0xeb, 0xd2, 0x57, 0xff, 0xba, 0x70, 0xea, 0xab, 0xa3, 0x05, 0xe5, 0x97, 0x47, 0x0b, + 0xca, 0xaf, 0x8e, 0x16, 0x94, 0x7f, 0x39, 0x5a, 0x50, 0xbe, 0xf8, 0x7a, 0xe1, 0xd4, 0x2f, 0xbf, + 0x5e, 0x38, 0xf5, 0xab, 0xaf, 0x17, 0x4e, 0xdd, 0x2b, 0x88, 0x59, 0xda, 0x39, 0x5a, 0xf0, 0xbd, + 0xf2, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x5c, 0x93, 0x5e, 0x71, 0xa9, 0x3b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -6505,6 +6511,37 @@ func (m *JobResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.NumRuns != 0 { + i = encodeVarintAdmin(dAtA, i, uint64(m.NumRuns)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x98 + } + if m.NextRun != nil { + n21, err21 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.NextRun, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.NextRun):]) + if err21 != nil { + return 0, err21 + } + i -= n21 + i = encodeVarintAdmin(dAtA, i, uint64(n21)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x92 + } + if m.LastRun != nil { + n22, err22 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastRun, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastRun):]) + if err22 != nil { + return 0, err22 + } + i -= n22 + i = encodeVarintAdmin(dAtA, i, uint64(n22)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x8a + } if len(m.Statement) > 0 { i -= len(m.Statement) copy(dAtA[i:], m.Statement) @@ -6529,12 +6566,12 @@ func (m *JobResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x72 } if m.HighwaterTimestamp != nil { - n21, err21 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.HighwaterTimestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.HighwaterTimestamp):]) - if err21 != nil { - return 0, err21 + n23, err23 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.HighwaterTimestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.HighwaterTimestamp):]) + if err23 != nil { + return 0, err23 } - i -= n21 - i = encodeVarintAdmin(dAtA, i, uint64(n21)) + i -= n23 + i = encodeVarintAdmin(dAtA, i, uint64(n23)) i-- dAtA[i] = 0x6a } @@ -6552,42 +6589,42 @@ func (m *JobResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x5d } if m.Modified != nil { - n22, err22 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Modified, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Modified):]) - if err22 != nil { - return 0, err22 + n24, err24 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Modified, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Modified):]) + if err24 != nil { + return 0, err24 } - i -= n22 - i = encodeVarintAdmin(dAtA, i, uint64(n22)) + i -= n24 + i = encodeVarintAdmin(dAtA, i, uint64(n24)) i-- dAtA[i] = 0x52 } if m.Finished != nil { - n23, err23 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Finished, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Finished):]) - if err23 != nil { - return 0, err23 + n25, err25 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Finished, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Finished):]) + if err25 != nil { + return 0, err25 } - i -= n23 - i = encodeVarintAdmin(dAtA, i, uint64(n23)) + i -= n25 + i = encodeVarintAdmin(dAtA, i, uint64(n25)) i-- dAtA[i] = 0x4a } if m.Started != nil { - n24, err24 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Started, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Started):]) - if err24 != nil { - return 0, err24 + n26, err26 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Started, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Started):]) + if err26 != nil { + return 0, err26 } - i -= n24 - i = encodeVarintAdmin(dAtA, i, uint64(n24)) + i -= n26 + i = encodeVarintAdmin(dAtA, i, uint64(n26)) i-- dAtA[i] = 0x42 } if m.Created != nil { - n25, err25 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Created):]) - if err25 != nil { - return 0, err25 + n27, err27 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Created):]) + if err27 != nil { + return 0, err27 } - i -= n25 - i = encodeVarintAdmin(dAtA, i, uint64(n25)) + i -= n27 + i = encodeVarintAdmin(dAtA, i, uint64(n27)) i-- dAtA[i] = 0x3a } @@ -6599,20 +6636,20 @@ func (m *JobResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x32 } if len(m.DescriptorIDs) > 0 { - dAtA27 := make([]byte, len(m.DescriptorIDs)*10) - var j26 int + dAtA29 := make([]byte, len(m.DescriptorIDs)*10) + var j28 int for _, num := range m.DescriptorIDs { for num >= 1<<7 { - dAtA27[j26] = uint8(uint64(num)&0x7f | 0x80) + dAtA29[j28] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j26++ + j28++ } - dAtA27[j26] = uint8(num) - j26++ + dAtA29[j28] = uint8(num) + j28++ } - i -= j26 - copy(dAtA[i:], dAtA27[:j26]) - i = encodeVarintAdmin(dAtA, i, uint64(j26)) + i -= j28 + copy(dAtA[i:], dAtA29[:j28]) + i = encodeVarintAdmin(dAtA, i, uint64(j28)) i-- dAtA[i] = 0x2a } @@ -7164,12 +7201,12 @@ func (m *DataDistributionResponse_TableInfo) MarshalToSizedBuffer(dAtA []byte) ( var l int _ = l if m.DroppedAt != nil { - n33, err33 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.DroppedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.DroppedAt):]) - if err33 != nil { - return 0, err33 + n35, err35 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.DroppedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.DroppedAt):]) + if err35 != nil { + return 0, err35 } - i -= n33 - i = encodeVarintAdmin(dAtA, i, uint64(n33)) + i -= n35 + i = encodeVarintAdmin(dAtA, i, uint64(n35)) i-- dAtA[i] = 0x1a } @@ -8588,6 +8625,17 @@ func (m *JobResponse) Size() (n int) { if l > 0 { n += 2 + l + sovAdmin(uint64(l)) } + if m.LastRun != nil { + l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastRun) + n += 2 + l + sovAdmin(uint64(l)) + } + if m.NextRun != nil { + l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.NextRun) + n += 2 + l + sovAdmin(uint64(l)) + } + if m.NumRuns != 0 { + n += 2 + sovAdmin(uint64(m.NumRuns)) + } return n } @@ -15404,6 +15452,97 @@ func (m *JobResponse) Unmarshal(dAtA []byte) error { } m.Statement = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 17: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastRun", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAdmin + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAdmin + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAdmin + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LastRun == nil { + m.LastRun = new(time.Time) + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.LastRun, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 18: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NextRun", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAdmin + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAdmin + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAdmin + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NextRun == nil { + m.NextRun = new(time.Time) + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.NextRun, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 19: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NumRuns", wireType) + } + m.NumRuns = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAdmin + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.NumRuns |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipAdmin(dAtA[iNdEx:]) diff --git a/pkg/server/serverpb/admin.proto b/pkg/server/serverpb/admin.proto index 5a01ae58c8b7..89a2c50cf6c3 100644 --- a/pkg/server/serverpb/admin.proto +++ b/pkg/server/serverpb/admin.proto @@ -606,6 +606,9 @@ message JobResponse { // to a "AS OF SYSTEM TIME" SQL statement. string highwater_decimal = 14; string running_status = 15; + google.protobuf.Timestamp last_run = 17 [(gogoproto.stdtime) = true]; + google.protobuf.Timestamp next_run = 18 [(gogoproto.stdtime) = true]; + int64 num_runs = 19; } // LocationsRequest requests system locality location information. diff --git a/pkg/ui/workspaces/db-console/package.json b/pkg/ui/workspaces/db-console/package.json index 05cdf446ec95..be81c7696c9a 100644 --- a/pkg/ui/workspaces/db-console/package.json +++ b/pkg/ui/workspaces/db-console/package.json @@ -59,6 +59,8 @@ "@babel/preset-react": "^7.7.4", "@cockroachlabs/eslint-config": "^0.1.11", "@storybook/react": "^6.1.21", + "@testing-library/react": "12.1.0", + "@testing-library/user-event": "13.2.1", "@types/analytics-node": "^0.0.32", "@types/assert": "^1.4.0", "@types/bytebuffer": "^5.0.33", diff --git a/pkg/ui/workspaces/db-console/src/test-utils/tooltip.ts b/pkg/ui/workspaces/db-console/src/test-utils/tooltip.ts new file mode 100644 index 000000000000..9783048934ea --- /dev/null +++ b/pkg/ui/workspaces/db-console/src/test-utils/tooltip.ts @@ -0,0 +1,14 @@ +// Copyright 2021 The Cockroach Authors. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0, included in the file +// licenses/APL.txt. + +import { expect } from "chai"; + +export const expectPopperTooltipActivated = () => + expect(document.querySelector("[data-popper-placement]")).to.exist; diff --git a/pkg/ui/workspaces/db-console/src/views/jobs/JobTable.stories.tsx b/pkg/ui/workspaces/db-console/src/views/jobs/JobTable.stories.tsx new file mode 100644 index 000000000000..f45e3e2a0b79 --- /dev/null +++ b/pkg/ui/workspaces/db-console/src/views/jobs/JobTable.stories.tsx @@ -0,0 +1,19 @@ +// Copyright 2021 The Cockroach Authors. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0, included in the file +// licenses/APL.txt. +import React from "react"; +import { storiesOf } from "@storybook/react"; +import { withRouterDecorator } from "src/util/decorators"; + +import { JobTable } from "./jobTable"; +import { jobTablePropsFixture } from "./jobTable.fixture"; + +storiesOf("JobTable", module) + .addDecorator(withRouterDecorator) + .add("with data", () => ); diff --git a/pkg/ui/workspaces/db-console/src/views/jobs/duration.tsx b/pkg/ui/workspaces/db-console/src/views/jobs/duration.tsx index bec531ff8ab7..0333e9e0b2ea 100644 --- a/pkg/ui/workspaces/db-console/src/views/jobs/duration.tsx +++ b/pkg/ui/workspaces/db-console/src/views/jobs/duration.tsx @@ -11,7 +11,7 @@ import React from "react"; import { TimestampToMoment } from "src/util/convert"; import { - JOB_STATUS_RUNNING, + isRunning, JOB_STATUS_SUCCEEDED, } from "src/views/jobs/jobStatusOptions"; import { formatDuration } from "src/views/jobs/index"; @@ -19,9 +19,12 @@ import moment from "moment"; import Job = cockroach.server.serverpb.IJobResponse; import { cockroach } from "src/js/protos"; -export class Duration extends React.PureComponent<{ job: Job }> { +export class Duration extends React.PureComponent<{ + job: Job; + className?: string; +}> { render() { - const { job } = this.props; + const { job, className } = this.props; // Parse timestamp to default value NULL instead of Date.now. // Conversion dates to Date.now causes trailing dates and constant // duration increase even when job is finished. @@ -29,27 +32,27 @@ export class Duration extends React.PureComponent<{ job: Job }> { const modifiedAt = TimestampToMoment(job.modified, null); const finishedAt = TimestampToMoment(job.finished, null); - switch (job.status) { - case JOB_STATUS_RUNNING: { - const fractionCompleted = job.fraction_completed; - if (fractionCompleted > 0) { - const duration = modifiedAt.diff(startedAt); - const remaining = duration / fractionCompleted - duration; - return ( - - {formatDuration(moment.duration(remaining)) + " remaining"} - - ); - } - return null; - } - case JOB_STATUS_SUCCEEDED: + if (isRunning(job.status)) { + const fractionCompleted = job.fraction_completed; + if (fractionCompleted > 0) { + const duration = modifiedAt.diff(startedAt); + const remaining = duration / fractionCompleted - duration; return ( - "Duration: " + - formatDuration(moment.duration(finishedAt.diff(startedAt))) + + {formatDuration(moment.duration(remaining)) + " remaining"} + ); - default: - return null; + } + return null; + } else if (job.status == JOB_STATUS_SUCCEEDED) { + return ( + + {"Duration: " + + formatDuration(moment.duration(finishedAt.diff(startedAt)))} + ) + + ); } + return null; } } diff --git a/pkg/ui/workspaces/db-console/src/views/jobs/index.spec.tsx b/pkg/ui/workspaces/db-console/src/views/jobs/index.spec.tsx index 1e3ff1699230..0869bf614712 100644 --- a/pkg/ui/workspaces/db-console/src/views/jobs/index.spec.tsx +++ b/pkg/ui/workspaces/db-console/src/views/jobs/index.spec.tsx @@ -10,7 +10,42 @@ import { assert } from "chai"; import moment from "moment"; +import { cockroach } from "src/js/protos"; import { formatDuration } from "."; +import { JobsTable, JobsTableProps } from "src/views/jobs/index"; +import { + allJobsFixture, + retryRunningJobFixture, +} from "src/views/jobs/jobTable.fixture"; +import { refreshJobs } from "src/redux/apiReducers"; +import { render, screen, waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import React from "react"; +import { MemoryRouter } from "react-router-dom"; + +import { expectPopperTooltipActivated } from "src/test-utils/tooltip"; + +import Job = cockroach.server.serverpb.IJobResponse; + +const getMockJobsTableProps = (jobs: Array): JobsTableProps => ({ + sort: { sortKey: null, ascending: true }, + status: "", + show: "50", + type: 0, + setSort: () => {}, + setStatus: () => {}, + setShow: () => {}, + setType: () => {}, + jobs: { + data: { + jobs: jobs, + toJSON: () => ({}), + }, + inFlight: false, + valid: true, + }, + refreshJobs, +}); describe("Jobs", () => { it("format duration", () => { @@ -23,4 +58,40 @@ describe("Jobs", () => { "12345:00:00", ); }); + + it("renders expected jobs table columns", () => { + const { getByText } = render( + + + , + ); + const expectedColumnTitles = [ + "Description", + "Status", + "Job ID", + "User", + "Creation Time (UTC)", + "Last Execution Time (UTC)", + "Execution Count", + ]; + + for (const columnTitle of expectedColumnTitles) { + getByText(columnTitle); + } + }); + + it("shows next execution time on hovering a retry status", async () => { + const { getByText } = render( + + + , + ); + + await waitFor(expectPopperTooltipActivated); + userEvent.hover(getByText("retrying")); + + await waitFor(() => + screen.getByText("Next Execution Time", { exact: false }), + ); + }); }); diff --git a/pkg/ui/workspaces/db-console/src/views/jobs/index.styl b/pkg/ui/workspaces/db-console/src/views/jobs/index.styl index 8d3585bc6d9a..0906a6cea482 100644 --- a/pkg/ui/workspaces/db-console/src/views/jobs/index.styl +++ b/pkg/ui/workspaces/db-console/src/views/jobs/index.styl @@ -38,14 +38,13 @@ padding-right .7em width 120px + &__running-status, &__duration font-family SourceSansPro-Regular font-size 12px line-height 1.67 letter-spacing 0.3px color $colors--neutral-8 - &--right - margin-left 48px &__status, &__running-status text-transform capitalize @@ -53,6 +52,10 @@ display flex align-items center justify-content flex-start + &__two-statuses + display flex + flex-wrap wrap + gap 5px &__status margin-bottom 8px font-family $font-family--semi-bold @@ -68,11 +71,9 @@ &--percentage font-family SourceSansPro-Regular font-size 12px - margin 0 6px 0 0 line-height 1.67 letter-spacing 0.3px width 40px - text-align right .job-detail white-space pre-wrap padding 5px diff --git a/pkg/ui/workspaces/db-console/src/views/jobs/index.tsx b/pkg/ui/workspaces/db-console/src/views/jobs/index.tsx index 96ba9ffbbfab..ee398bc30d9e 100644 --- a/pkg/ui/workspaces/db-console/src/views/jobs/index.tsx +++ b/pkg/ui/workspaces/db-console/src/views/jobs/index.tsx @@ -83,7 +83,7 @@ export const sortSetting = new LocalSetting( { sortKey: 3 /* creation time */, ascending: false }, ); -interface JobsTableProps { +export interface JobsTableProps { sort: SortSetting; status: string; show: string; diff --git a/pkg/ui/workspaces/db-console/src/views/jobs/jobStatus.tsx b/pkg/ui/workspaces/db-console/src/views/jobs/jobStatus.tsx index d5fe6fe77731..9894bd248e47 100644 --- a/pkg/ui/workspaces/db-console/src/views/jobs/jobStatus.tsx +++ b/pkg/ui/workspaces/db-console/src/views/jobs/jobStatus.tsx @@ -10,11 +10,19 @@ import React from "react"; import classNames from "classnames/bind"; -import { JobStatusBadge, ProgressBar } from "src/views/jobs/progressBar"; +import { + JobStatusBadge, + RetryingStatusBadge, + ProgressBar, +} from "src/views/jobs/progressBar"; import { Duration } from "src/views/jobs/duration"; import Job = cockroach.server.serverpb.IJobResponse; import { cockroach } from "src/js/protos"; -import { JobStatusVisual, jobToVisual } from "src/views/jobs/jobStatusOptions"; +import { + JobStatusVisual, + jobToVisual, + isRetrying, +} from "src/views/jobs/jobStatusOptions"; import { InlineAlert } from "src/components"; import styles from "./jobStatus.module.styl"; @@ -40,12 +48,11 @@ export const JobStatus: React.FC = ({ return (
- - - +
); - case JobStatusVisual.ProgressBarWithDuration: + case JobStatusVisual.ProgressBarWithDuration: { + const jobIsRetrying = isRetrying(job.status); return (
= ({ lineWidth={lineWidth || 11} showPercentage={true} /> - - - + + {jobIsRetrying && } + {job.running_status && ( +
+ {job.running_status} +
+ )}
); + } case JobStatusVisual.BadgeWithMessage: return (
- {job.running_status} + + {job.running_status} +
); case JobStatusVisual.BadgeWithErrorMessage: @@ -78,6 +92,13 @@ export const JobStatus: React.FC = ({ )} ); + case JobStatusVisual.BadgeWithRetrying: + return ( +
+ + +
+ ); default: return ; } diff --git a/pkg/ui/workspaces/db-console/src/views/jobs/jobStatusCell.tsx b/pkg/ui/workspaces/db-console/src/views/jobs/jobStatusCell.tsx index d3153f09fcc5..0cc12b9b3b90 100644 --- a/pkg/ui/workspaces/db-console/src/views/jobs/jobStatusCell.tsx +++ b/pkg/ui/workspaces/db-console/src/views/jobs/jobStatusCell.tsx @@ -12,6 +12,10 @@ import React from "react"; import { cockroach } from "src/js/protos"; import { HighwaterTimestamp } from "src/views/jobs/highwaterTimestamp"; import { JobStatus } from "./jobStatus"; +import { isRetrying } from "src/views/jobs/jobStatusOptions"; +import { TimestampToMoment } from "src/util/convert"; +import { DATE_FORMAT_24_UTC } from "src/util/format"; +import { Tooltip } from "@cockroachlabs/ui-components"; import Job = cockroach.server.serverpb.IJobResponse; export interface JobStatusCellProps { @@ -33,5 +37,26 @@ export const JobStatusCell: React.FC = ({ /> ); } - return ; + + const jobStatus = ( + + ); + if (isRetrying(job.status)) { + return ( + + Next Execution Time: +
+ {TimestampToMoment(job.next_run).format(DATE_FORMAT_24_UTC)} + + } + > + {jobStatus} +
+ ); + } + return jobStatus; }; diff --git a/pkg/ui/workspaces/db-console/src/views/jobs/jobStatusOptions.ts b/pkg/ui/workspaces/db-console/src/views/jobs/jobStatusOptions.ts index b4df84e73c7f..41a44b995fc7 100644 --- a/pkg/ui/workspaces/db-console/src/views/jobs/jobStatusOptions.ts +++ b/pkg/ui/workspaces/db-console/src/views/jobs/jobStatusOptions.ts @@ -18,6 +18,7 @@ export enum JobStatusVisual { ProgressBarWithDuration, BadgeWithMessage, BadgeWithErrorMessage, + BadgeWithRetrying, } export function jobToVisual(job: Job): JobStatusVisual { @@ -35,8 +36,12 @@ export function jobToVisual(job: Job): JobStatusVisual { return JobStatusVisual.BadgeOnly; case JOB_STATUS_RUNNING: return JobStatusVisual.ProgressBarWithDuration; + case JOB_STATUS_RETRY_RUNNING: + return JobStatusVisual.ProgressBarWithDuration; case JOB_STATUS_PENDING: return JobStatusVisual.BadgeWithMessage; + case JOB_STATUS_RETRY_REVERTING: + return JobStatusVisual.BadgeWithRetrying; default: return JobStatusVisual.BadgeOnly; } @@ -47,16 +52,30 @@ export const JOB_STATUS_FAILED = "failed"; export const JOB_STATUS_CANCELED = "canceled"; export const JOB_STATUS_PAUSED = "paused"; export const JOB_STATUS_RUNNING = "running"; +export const JOB_STATUS_RETRY_RUNNING = "retry-running"; export const JOB_STATUS_PENDING = "pending"; +export const JOB_STATUS_REVERTING = "reverting"; +export const JOB_STATUS_RETRY_REVERTING = "retry-reverting"; + +export function isRetrying(status: string): boolean { + return [JOB_STATUS_RETRY_RUNNING, JOB_STATUS_RETRY_REVERTING].includes( + status, + ); +} +export function isRunning(status: string): boolean { + return [JOB_STATUS_RUNNING, JOB_STATUS_RETRY_RUNNING].includes(status); +} export const statusOptions = [ { value: "", label: "All" }, { value: "succeeded", label: "Succeeded" }, { value: "failed", label: "Failed" }, + { value: "paused", label: "Paused" }, + { value: "canceled", label: "Canceled" }, { value: "running", label: "Running" }, { value: "pending", label: "Pending" }, - { value: "canceled", label: "Canceled" }, - { value: "paused", label: "Paused" }, + { value: "reverting", label: "Reverting" }, + { value: "retrying", label: "Retrying" }, ]; export function jobHasOneOfStatuses(job: Job, ...statuses: string[]) { @@ -73,6 +92,10 @@ export const jobStatusToBadgeStatus = (status: string): BadgeStatus => { return "default"; case JOB_STATUS_PAUSED: return "default"; + case JOB_STATUS_REVERTING: + return "default"; + case JOB_STATUS_RETRY_REVERTING: + return "default"; case JOB_STATUS_RUNNING: return "info"; case JOB_STATUS_PENDING: @@ -81,3 +104,13 @@ export const jobStatusToBadgeStatus = (status: string): BadgeStatus => { return "info"; } }; +export const jobStatusToBadgeText = (status: string): string => { + switch (status) { + case JOB_STATUS_RETRY_REVERTING: + return JOB_STATUS_REVERTING; + case JOB_STATUS_RETRY_RUNNING: + return JOB_STATUS_RUNNING; + default: + return status; + } +}; diff --git a/pkg/ui/workspaces/db-console/src/views/jobs/jobTable.fixture.ts b/pkg/ui/workspaces/db-console/src/views/jobs/jobTable.fixture.ts new file mode 100644 index 000000000000..b728610b3ab5 --- /dev/null +++ b/pkg/ui/workspaces/db-console/src/views/jobs/jobTable.fixture.ts @@ -0,0 +1,291 @@ +// Copyright 2021 The Cockroach Authors. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0, included in the file +// licenses/APL.txt. + +import { JobTableProps } from "./jobTable"; +import moment from "moment"; +import * as protos from "@cockroachlabs/crdb-protobuf-client"; +import { cockroach } from "src/js/protos"; +import JobsResponse = cockroach.server.serverpb.JobsResponse; +import Long from "long"; + +const defaultJobProperties = { + username: "root", + descriptor_ids: [] as number[], + created: new protos.google.protobuf.Timestamp({ + seconds: new Long(1634648118), + nanos: 200459000, + }), + started: new protos.google.protobuf.Timestamp({ + seconds: new Long(1634648118), + nanos: 215527000, + }), + finished: new protos.google.protobuf.Timestamp({ + seconds: new Long(1634648118), + nanos: 311522000, + }), + modified: new protos.google.protobuf.Timestamp({ + seconds: new Long(1634648118), + nanos: 310899000, + }), + fraction_completed: 1, + last_run: new protos.google.protobuf.Timestamp({ + seconds: new Long(1634648118), + nanos: 215527000, + }), + next_run: new protos.google.protobuf.Timestamp({ + seconds: new Long(1634648118), + nanos: 215527100, + }), + num_runs: new Long(1), +}; + +export const succeededJobFixture = { + ...defaultJobProperties, + id: new Long(8136728577, 70289336), + type: "AUTO SQL STATS COMPACTION", + description: "automatic SQL Stats compaction", + username: "node", + status: "succeeded", +}; + +const failedJobFixture = { + ...defaultJobProperties, + id: new Long(7003330561, 70312826), + type: "SCHEMA CHANGE", + description: + "ALTER TABLE movr.public.user_promo_codes ADD FOREIGN KEY (city, user_id) REFERENCES movr.public.users (city, id)", + status: "failed", + error: "mock failure message", +}; + +const canceledJobFixture = { + ...defaultJobProperties, + id: new Long(7002707969, 70312826), + type: "UNSPECIFIED", + description: "Unspecified", + status: "canceled", +}; + +const pausedJobFixture = { + ...defaultJobProperties, + id: new Long(6091954177, 70312826), + type: "BACKUP", + description: + "BACKUP DATABASE bank TO 'gs://acme-co-backup/database-bank-2017-03-29-nightly' AS OF SYSTEM TIME '-10s' INCREMENTAL FROM 'gs://acme-co-backup/database-bank-2017-03-27-weekly', 'gs://acme-co-backup/database-bank-2017-03-28-nightly' WITH revision_history\n", + status: "paused", +}; + +const runningJobFixture = { + ...defaultJobProperties, + id: new Long(3390625793, 70312826), + type: "AUTO SPAN CONFIG RECONCILIATION", + description: "GC for DROP TABLE havent_started_running", + status: "running", + fraction_completed: 0, +}; + +const runningWithMessageJobFixture = { + ...defaultJobProperties, + id: new Long(3390625793, 70312826), + type: "AUTO SPAN CONFIG RECONCILIATION", + description: "GC for DROP TABLE no_duration_has_running_status", + status: "running", + fraction_completed: 0, + running_status: "Waiting For GC TTL", +}; + +const runningWithRemainingJobFixture = { + ...defaultJobProperties, + id: new Long(6093756417, 70312826), + type: "RESTORE", + description: "RESTORE data.* FROM $1 WITH OPTIONS (into_db='data2')", + status: "running", + fraction_completed: 0.38, +}; + +const runningWithMessageRemainingJobFixture = { + ...defaultJobProperties, + id: new Long(3390625793, 70312826), + type: "AUTO SPAN CONFIG RECONCILIATION", + description: "automatic Span Config reconciliation", + status: "running", + fraction_completed: 0.66, + running_status: "performing garbage collection on index 2", +}; + +export const retryRunningJobFixture = { + ...defaultJobProperties, + id: new Long(3390625793, 70312826), + type: "STREAM INGESTION", + description: "GC for DROP TABLE havent_started_running_2", + status: "retry-running", + fraction_completed: 0, + next_run: new protos.google.protobuf.Timestamp({ + seconds: new Long(3034648417), // some long time in the future, because it needs to be in the future to show as retrying + nanos: 116912000, + }), + num_runs: new Long(3), +}; + +const retryRunningWithMessageJobFixture = { + ...defaultJobProperties, + id: new Long(3390625793, 70312826), + type: "AUTO SPAN CONFIG RECONCILIATION", + description: "GC for DROP TABLE no_duration_has_running_status", + status: "retry-running", + fraction_completed: 0, + running_status: "Waiting For GC TTL", + next_run: new protos.google.protobuf.Timestamp({ + seconds: new Long(3034648417), // some long time in the future, because it needs to be in the future to show as retrying + nanos: 116912000, + }), + num_runs: new Long(2), +}; + +const retryRunningWithRemainingJobFixture = { + ...defaultJobProperties, + id: new Long(3390625793, 70312826), + type: "STREAM INGESTION", + description: + "RESTORE DATABASE backup_database_name FROM 'your_backup_location';", + status: "retry-running", + fraction_completed: 0.11, + next_run: new protos.google.protobuf.Timestamp({ + seconds: new Long(3034648417), // some long time in the future, because it needs to be in the future to show as retrying + nanos: 116912000, + }), + num_runs: new Long(3), +}; + +const retryRunningWithMessageRemainingJobFixture = { + ...defaultJobProperties, + id: new Long(3390625793, 70312826), + type: "MIGRATION", + description: + "IMPORT MYSQLDUMP 'https://s3-us-west-1.amazonaws.com/cockroachdb-movr/datasets/employees-db/mysqldump/employees-full.sql.gz';", + status: "retry-running", + fraction_completed: 0.82, + running_status: "performing garbage collection on table crl.roachers", + next_run: new protos.google.protobuf.Timestamp({ + seconds: new Long(3034648417), // some long time in the future, because it needs to be in the future to show as retrying + nanos: 116912000, + }), + num_runs: new Long(2), +}; + +const pendingJobFixture = { + ...defaultJobProperties, + id: new Long(5247850497, 70312826), + type: "IMPORT", + description: + "IMPORT PGDUMP 'userfile://defaultdb.public.userfiles_root/db.sql' WITH max_row_size='524288'", + status: "pending", +}; + +const revertingJobFixture = { + ...defaultJobProperties, + id: new Long(5246539777, 70312826), + type: "CHANGEFEED", + description: "CREATE CHANGEFEED FOR foo WITH updated, resolved, diff", + status: "reverting", +}; + +const retryRevertingJobFixture = { + ...defaultJobProperties, + id: new Long(3390625793, 70312826), + type: "NEW SCHEMA CHANGE", + description: "ALTER TABLE db.t ADD COLUMN b INT DEFAULT 1", + status: "retry-reverting", + next_run: new protos.google.protobuf.Timestamp({ + seconds: new Long(3034648417), // some long time in the future, because it needs to be in the future to show as retrying + nanos: 116912000, + }), + num_runs: new Long(2), +}; + +const highwaterJobFixture = { + ...defaultJobProperties, + id: new Long(3390625793, 70312826), + type: "TYPEDESC SCHEMA CHANGE", + description: "ALTER TYPE status ADD VALUE 'pending';", + status: "running", + highwater_timestamp: new protos.google.protobuf.Timestamp({ + seconds: new Long(1634648117), + nanos: 98294000, + }), + highwater_decimal: "test highwater decimal", +}; + +const cancelRequestedJobFixture = { + ...defaultJobProperties, + id: new Long(4337653761, 70312826), + type: "CREATE STATS", + description: "SELECT job_id, job_type FROM [SHOW JOB 1]", + status: "cancel-requested", +}; + +const pauseRequestedJobFixture = { + ...defaultJobProperties, + id: new Long(4338669569, 70312826), + type: "AUTO CREATE STATS", + description: "SELECT job_id, job_type FROM [SHOW AUTOMATIC JOBS];", + status: "pause-requested", +}; + +const revertFailedJobFixture = { + ...defaultJobProperties, + id: new Long(3391379457, 70312826), + type: "SCHEMA CHANGE GC", + description: "GC for DROP DATABASE t CASCADE", + status: "revert-failed", +}; + +export const allJobsFixture = [ + succeededJobFixture, + failedJobFixture, + canceledJobFixture, + pausedJobFixture, + runningJobFixture, + runningWithMessageJobFixture, + runningWithRemainingJobFixture, + runningWithMessageRemainingJobFixture, + retryRunningJobFixture, + retryRunningWithMessageJobFixture, + retryRunningWithRemainingJobFixture, + retryRunningWithMessageRemainingJobFixture, + pendingJobFixture, + revertingJobFixture, + retryRevertingJobFixture, + highwaterJobFixture, + cancelRequestedJobFixture, + pauseRequestedJobFixture, + revertFailedJobFixture, +]; + +export const jobTablePropsFixture: JobTableProps = { + sort: { + sortKey: 3, + ascending: false, + }, + isUsedFilter: false, + setSort: (() => {}) as any, + jobs: { + inFlight: false, + valid: false, + requestedAt: moment( + "Mon Oct 18 2021 14:01:45 GMT-0400 (Eastern Daylight Time)", + ), + setAt: moment("Mon Oct 18 2021 14:01:50 GMT-0400 (Eastern Daylight Time)"), + lastError: null, + data: JobsResponse.create({ + jobs: allJobsFixture, + }), + }, +}; diff --git a/pkg/ui/workspaces/db-console/src/views/jobs/jobTable.tsx b/pkg/ui/workspaces/db-console/src/views/jobs/jobTable.tsx index 488952d98d1e..6320e6fbc2f4 100644 --- a/pkg/ui/workspaces/db-console/src/views/jobs/jobTable.tsx +++ b/pkg/ui/workspaces/db-console/src/views/jobs/jobTable.tsx @@ -46,7 +46,6 @@ const jobsTableColumns: ColumnDescriptor[] = [ title: ( The description of the job, if set, or the SQL statement if there is @@ -61,6 +60,30 @@ const jobsTableColumns: ColumnDescriptor[] = [ cell: job => , sort: job => job.statement || job.description || job.type, }, + { + name: "status", + title: ( + + {"Current "} + + job status + + { + " or completion progress, and the total time the job took to complete." + } +

+ } + > + {"Status"} +
+ ), + cell: job => , + sort: job => job.fraction_completed, + }, { name: "jobId", title: ( @@ -114,35 +137,39 @@ const jobsTableColumns: ColumnDescriptor[] = [ style="tableTitle" content={

Date and time the job was created.

} > - {"Creation Time"} + {"Creation Time (UTC)"}
), cell: job => TimestampToMoment(job?.created).format(DATE_FORMAT_24_UTC), sort: job => TimestampToMoment(job?.created).valueOf(), }, { - name: "status", + name: "lastExecutionTime", title: ( - {"Current "} - - job status - - { - " or completion progress, and the total time the job took to complete." - } -

- } + content={

Date and time the job was last executed.

} > - {"Status"} + {"Last Execution Time (UTC)"}
), - cell: job => , - sort: job => job.fraction_completed, + cell: job => TimestampToMoment(job?.last_run).format(DATE_FORMAT_24_UTC), + sort: job => TimestampToMoment(job?.last_run).valueOf(), + }, + { + name: "executionCount", + title: ( + Number of times the job was executed.

} + > + {"Execution Count"} +
+ ), + cell: job => String(job.num_runs), + sort: job => job.num_runs?.toNumber(), }, ]; diff --git a/pkg/ui/workspaces/db-console/src/views/jobs/progressBar.tsx b/pkg/ui/workspaces/db-console/src/views/jobs/progressBar.tsx index a14096a52c4c..4e14e37591c4 100644 --- a/pkg/ui/workspaces/db-console/src/views/jobs/progressBar.tsx +++ b/pkg/ui/workspaces/db-console/src/views/jobs/progressBar.tsx @@ -9,7 +9,10 @@ // licenses/APL.txt. import React from "react"; -import { jobStatusToBadgeStatus } from "src/views/jobs/jobStatusOptions"; +import { + jobStatusToBadgeStatus, + jobStatusToBadgeText, +} from "src/views/jobs/jobStatusOptions"; import Job = cockroach.server.serverpb.IJobResponse; import { cockroach } from "src/js/protos"; import { Badge } from "src/components"; @@ -19,7 +22,14 @@ export class JobStatusBadge extends React.PureComponent<{ jobStatus: string }> { render() { const jobStatus = this.props.jobStatus; const badgeStatus = jobStatusToBadgeStatus(jobStatus); - return ; + const badgeText = jobStatusToBadgeText(jobStatus); + return ; + } +} + +export class RetryingStatusBadge extends React.PureComponent { + render() { + return ; } } @@ -32,20 +42,6 @@ export class ProgressBar extends React.PureComponent<{ const percent = this.props.job.fraction_completed * 100; return (
- {this.props.job.running_status ? ( -
- {this.props.job.running_status} -
- ) : null} - - {this.props.showPercentage ? ( -
- {percent.toFixed(1) + "%"} -
- ) : null} + {this.props.showPercentage ? ( +
+ {percent.toFixed(1) + "%"} +
+ ) : null}
); } diff --git a/pkg/ui/yarn-vendor b/pkg/ui/yarn-vendor index 7a60011cc2ae..b253386e65c2 160000 --- a/pkg/ui/yarn-vendor +++ b/pkg/ui/yarn-vendor @@ -1 +1 @@ -Subproject commit 7a60011cc2ae52abdcbf36087a79e7e4464f690c +Subproject commit b253386e65c2d665f48965dbdbfeddf9d955a698 diff --git a/pkg/ui/yarn.lock b/pkg/ui/yarn.lock index 4eb20f64d4da..78249de5f4a7 100644 --- a/pkg/ui/yarn.lock +++ b/pkg/ui/yarn.lock @@ -1944,6 +1944,17 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jest/types@^27.2.5": + version "27.2.5" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.2.5.tgz#420765c052605e75686982d24b061b4cbba22132" + integrity sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + "@mdx-js/mdx@^1.6.22": version "1.6.22" resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" @@ -2839,6 +2850,35 @@ lz-string "^1.4.4" pretty-format "^26.6.2" +"@testing-library/dom@^8.0.0": + version "8.11.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.11.0.tgz#3679dfb4db58e0d2b95e4b0929eaf45237b60d94" + integrity sha512-8Ay4UDiMlB5YWy+ZvCeRyFFofs53ebxrWnOFvCoM1HpMAX4cHyuSrCuIM9l2lVuUWUt+Gr3loz/nCwdrnG6ShQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^4.2.0" + aria-query "^5.0.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.4.4" + pretty-format "^27.0.2" + +"@testing-library/react@12.1.0": + version "12.1.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.0.tgz#3e9a4002b0b8f986a738a2f88fc458b5af319f35" + integrity sha512-Ge3Ht3qXE82Yv9lyPpQ7ZWgzo/HgOcHu569Y4ZGWcZME38iOFiOg87qnu6hTEa8jTJVL7zYovnvD3GE2nsNIoQ== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.0.0" + +"@testing-library/user-event@13.2.1": + version "13.2.1" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-13.2.1.tgz#7a71a39e50b4a733afbe2916fa2b99966e941f98" + integrity sha512-cczlgVl+krjOb3j1625usarNEibI0IFRJrSWX9UsJ1HKYFgCQv9Nb7QAipUDXl3Xdz8NDTsiS78eAkPSxlzTlw== + dependencies: + "@babel/runtime" "^7.12.5" + "@types/analytics-node@^0.0.32": version "0.0.32" resolved "https://registry.yarnpkg.com/@types/analytics-node/-/analytics-node-0.0.32.tgz#4bd500d2b63f519d9e180e4d3c02d187b55bab6d" @@ -3516,6 +3556,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== + dependencies: + "@types/yargs-parser" "*" + "@typescript-eslint/eslint-plugin@^4.1.1", "@typescript-eslint/eslint-plugin@^4.22.0": version "4.29.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.1.tgz#808d206e2278e809292b5de752a91105da85860b" @@ -3973,6 +4020,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -3992,6 +4044,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + ansi-to-html@^0.6.11: version "0.6.15" resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.15.tgz#ac6ad4798a00f6aa045535d7f6a9cb9294eebea7" @@ -4133,6 +4190,11 @@ aria-query@^4.2.2: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" +aria-query@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c" + integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== + arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" @@ -6863,6 +6925,11 @@ dom-accessibility-api@^0.5.6: resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.6.tgz#3f5d43b52c7a3bd68b5fb63fa47b4e4c1fdf65a9" integrity sha512-DplGLZd8L1lN64jlT27N9TVSESFR5STaEJvX+thCby7fuCHonfPpAlodYc3vuUYbDuDec5w8AMP7oCM5TWFsqw== +dom-accessibility-api@^0.5.9: + version "0.5.10" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.10.tgz#caa6d08f60388d0bb4539dd75fe458a9a1d0014c" + integrity sha512-Xu9mD0UjrJisTmv7lmVSDMagQcU9R5hwAbxsaAE/35XPnPLJobbuREfV/rraiSaEj/UOvgrzQs66zyTWTlyd+g== + dom-align@^1.7.0: version "1.12.2" resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.2.tgz#0f8164ebd0c9c21b0c790310493cd855892acd4b" @@ -13659,6 +13726,16 @@ pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" +pretty-format@^27.0.2: + version "27.3.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.3.1.tgz#7e9486365ccdd4a502061fa761d3ab9ca1b78df5" + integrity sha512-DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA== + dependencies: + "@jest/types" "^27.2.5" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + pretty-hrtime@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"