diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9c95a2e8..793da500 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -174,9 +174,9 @@ jobs: # rm integrationtest-linux # zip -q importtest/importtest-linux-${{ needs.version.outputs.version }}.zip importtest-linux test-data/000000001-21-10-2022-15-37-00.zip # rm importtest-linux - mv job-runner job-runner-${{ needs.version.outputs.version }} - mkdir -p job-runner - cp job-runner-${{ needs.version.outputs.version }} ./job-runner + # mv job-runner job-runner-${{ needs.version.outputs.version }} + # mkdir -p job-runner + # cp job-runner-${{ needs.version.outputs.version }} ./job-runner aws s3 cp . s3://corestack-buildartifactsf774a77d-105on4pno9pjm/ --recursive --region us-east-1 build-api-docker: diff --git a/Makefile b/Makefile index 5fe08da0..ae58ef35 100644 --- a/Makefile +++ b/Makefile @@ -49,7 +49,6 @@ build-linux-aux: echo "sha: ${GITHUB_SHA}" GOOS=linux GOARCH=amd64 go run ./data-formats/codegen/main.go -protoPath ./data-formats/api-messages/ -goOutPath ./api/ws/ GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags "-X 'github.com/pixlise/core/v4/api/services.ApiVersion=${BUILD_VERSION}' -X 'github.com/pixlise/core/v4/api/services.GitHash=${GITHUB_SHA}'" -o ./_out/bootstrap ./internal/lambdas/data-import - GOOS=linux GOARCH=amd64 go build -o ./_out/job-runner ./internal/cmd-line-tools/job-runner # GOOS=linux GOARCH=amd64 go build -v -o ./_out/importtest-linux ./internal/cmdline-tools/import-integration-test # GOOS=linux GOARCH=amd64 go build -v -o ./_out/integrationtest-linux ./internal/cmdline-tools/api-integration-test diff --git a/api/coreg/coreg.go b/api/coreg/coreg.go deleted file mode 100644 index 240bdfc1..00000000 --- a/api/coreg/coreg.go +++ /dev/null @@ -1,26 +0,0 @@ -package coreg - -type CoregJobRequest struct { - JobID string `json:"jobId"` - Environment string `json:"environment"` - TriggerUrl string `json:"triggerUrl"` -} - -type CoregFile struct { - OriginalUri string - NewUri string - Completed bool -} - -type CoregJobResult struct { - JobID string `json:"jobId" bson:"_id"` - Environment string `json:"environment"` - - MarsViewerExportUrl string `json:"marsViewerExportUrl"` - - ContextImageUrls []CoregFile `json:"contextImageUrls"` - MappedImageUrls []CoregFile `json:"mappedImageUrls"` - WarpedImageUrls []CoregFile `json:"warpedImageUrls"` - BaseImageUrl CoregFile `json:"baseImageUrl"` - AllCompleted bool `json:"allCompleted"` -} diff --git a/api/coreg/import.go b/api/coreg/import.go deleted file mode 100644 index 8c50b1bb..00000000 --- a/api/coreg/import.go +++ /dev/null @@ -1,731 +0,0 @@ -package coreg - -import ( - "bytes" - "context" - "encoding/json" - "errors" - "fmt" - "image" - "image/png" - "path" - "strconv" - "strings" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/sqs" - dataImportHelpers "github.com/pixlise/core/v4/api/dataimport/dataimportHelpers" - "github.com/pixlise/core/v4/api/dbCollections" - "github.com/pixlise/core/v4/api/filepaths" - "github.com/pixlise/core/v4/api/job" - "github.com/pixlise/core/v4/api/ws/wsHelpers" - "github.com/pixlise/core/v4/core/errorwithstatus" - "github.com/pixlise/core/v4/core/fileaccess" - "github.com/pixlise/core/v4/core/gdsfilename" - "github.com/pixlise/core/v4/core/imageedit" - "github.com/pixlise/core/v4/core/imgFormat" - "github.com/pixlise/core/v4/core/utils" - protos "github.com/pixlise/core/v4/generated-protos" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" -) - -func StartCoregImport(triggerUrl string, hctx wsHelpers.HandlerContext) (string, error) { - if len(triggerUrl) <= 0 { - return "", errorwithstatus.MakeBadRequestError(errors.New("MarsViewerExport trigger Url is empty")) - } - - i := coregUpdater{hctx} - - // Start an image coreg import job (this is a Lambda function) - // Once it completes, we have the data we need, so we can treat it as a "normal" image importing task - jobStatus, err := job.AddJob("coreg", hctx.SessUser.User.Id, protos.JobStatus_JT_IMPORT_IMAGE, triggerUrl, fmt.Sprintf("Import: %v", path.Base(triggerUrl)), []string{}, uint32(hctx.Svcs.Config.ImportJobMaxTimeSec), hctx.Svcs.MongoDB, hctx.Svcs.IDGen, hctx.Svcs.TimeStamper, hctx.Svcs.Log, i.sendUpdate) - jobId := "" - if jobStatus != nil { - jobId = jobStatus.JobId - } - - if err != nil || len(jobId) < 0 { - returnErr := fmt.Errorf("Failed to add job watcher for coreg import Job ID: %v. Error was: %v", jobId, err) - hctx.Svcs.Log.Errorf("%v", returnErr) - return "", returnErr - } - - // completeMarsViewerImportJob("coreg-9un1y0fv2gszftw3", hctx) - // completeMarsViewerImportJob("coreg-bjy6epclzutur900", hctx) - // completeMarsViewerImportJob("coreg-dy6kmc5r9rg5t2l7", hctx) - // completeMarsViewerImportJob("coreg-282g38pxwybbboqk", hctx) - // return "", nil - - // We can now trigger the lambda - // NOTE: here we build the same structure that triggered us, but we exclude the points data so we don't exceed - // the SQS 256kb limit. The lambda doesn't care about the points anyway, only we do once the lambda has completed! - coregReq := CoregJobRequest{jobId, hctx.Svcs.Config.EnvironmentName, triggerUrl} - msg, err := json.Marshal(coregReq) - if err != nil { - returnErr := fmt.Errorf("Failed to create coreg job trigger message for job ID: %v", jobId) - job.CompleteJob(jobId, false, returnErr.Error(), "", []string{}, hctx.Svcs.MongoDB, hctx.Svcs.TimeStamper, hctx.Svcs.Log) - return "", returnErr - } - - _, err = hctx.Svcs.SQS.SendMessage(&sqs.SendMessageInput{ - MessageBody: aws.String(string(msg)), - QueueUrl: aws.String(hctx.Svcs.Config.CoregSqsQueueUrl), - }) - - if err != nil { - returnErr := fmt.Errorf("Failed to trigger coreg job. ID: %v. Error: %v", jobId, err) - job.CompleteJob(jobId, false, returnErr.Error(), "", []string{}, hctx.Svcs.MongoDB, hctx.Svcs.TimeStamper, hctx.Svcs.Log) - return "", returnErr - } - - return jobId, nil -} - -type coregUpdater struct { - hctx wsHelpers.HandlerContext -} - -func (i *coregUpdater) sendUpdate(status *protos.JobStatus) { - // NOTE: The coreg image import job sets state GATHERING_RESULTS when it has downloaded everything - // so here we trigger off that to do our part, after which we can mark the job as COMPLETE or ERROR - if status.Status == protos.JobStatus_GATHERING_RESULTS { - // NOTE: If this fails, it will set the job status to ERROR and we'll - // get another call to update... - completeMarsViewerImportJob(status.JobId, i.hctx) - return - } - - wsUpd := protos.WSMessage{ - Contents: &protos.WSMessage_ImportMarsViewerImageUpd{ - ImportMarsViewerImageUpd: &protos.ImportMarsViewerImageUpd{ - Status: status, - }, - }, - } - - wsHelpers.SendForSession(i.hctx.Session, &wsUpd) -} - -// Should be called after Coreg Import Lambda has completed successfully -func completeMarsViewerImportJob(jobId string, hctx wsHelpers.HandlerContext) { - // Read the job completion entry from DB - ctx := context.TODO() - coll := hctx.Svcs.MongoDB.Collection(dbCollections.CoregJobCollection) - dbResult := coll.FindOne(ctx, bson.M{"_id": jobId}, options.FindOne()) - if dbResult.Err() != nil { - failJob(fmt.Sprintf("Failed to find Coreg Job completion record for: %v. Error: %v", jobId, dbResult.Err()), jobId, hctx) - return - } - - coregResult := CoregJobResult{} - err := dbResult.Decode(&coregResult) - if err != nil { - failJob(fmt.Sprintf("Failed to decode Coreg Job completion record for: %v. Error: %v", jobId, err), jobId, hctx) - return - } - - hctx.Svcs.Log.Infof("marsViewer import job %v importing from %v", jobId, coregResult.MarsViewerExportUrl) - - // At this point we should have everything ready to go - our own bucket should contain all images - // and we have the mars viewer export msg containing any points we require so lets import the warped images we received! - // Firstly, read the export from MV - marsViewerExport := &protos.MarsViewerExport{} - mvBucket, err := fileaccess.GetBucketFromS3Url(coregResult.MarsViewerExportUrl) - if err != nil { - failJob(fmt.Sprintf("Failed to read Coreg Job files for: %v. Error: %v", jobId, err), jobId, hctx) - return - } - - mvPath, err := fileaccess.GetPathFromS3Url(coregResult.MarsViewerExportUrl) - if err != nil { - failJob(fmt.Sprintf("Failed to read Coreg Job files for: %v. Error: %v", jobId, err), jobId, hctx) - return - } - - err = hctx.Svcs.FS.ReadJSON(mvBucket, mvPath, marsViewerExport, false) - if err != nil { - failJob(fmt.Sprintf("Failed to read MarsViewer export json for: %v. Error: %v", jobId, err), jobId, hctx) - return - } - - // How MV data is structured: - // "baseImageUrl" represents the image that everything was warped TO. - // Observations contain arrays of points (and CSV file references) for coordinates that were warped to the base image. It seems that if - // a set of coordinates were already relative to that image, we don't get the "translatedPoints" list, which makes sense... - // Therefore, if we find an observation with "translatedPoints", we can look at what image that applies to and store those beam locations - // for the RTT identified by the observation's own "contextImageUrl" - // - // Warped images are also supplied, which take another image and warp it to match the base image. These are able to be rendered relative - // the base image, much like our "matched" images, and so should probably be imported as such. - - // First, lets check that we have this base image stored. NOTE: It may not be the same file name as the one in PIXLISE! There are many - // versions and file formats of images that get generated by the pipeline, someone may have picked another version as the base image, so - // we have to search/match it unfortunately :( - // For example: - // PCW_0920_0748651385_000RCM_N04500003226342450005075J01.png <-- PIXLISE contains this - // PCW_0920_0748651385_000FDR_N04500003226342450005075J01.IMG <-- Base image for warping in MV - // - // All matches except the product type AND the extension! - - // Get the meta associated with base image - baseRTT, _, err := getRTTAndMeta(marsViewerExport.BaseImageUrl) - if err != nil { - failJob(fmt.Sprintf("Failed to parse baseImageUrl: %v for job %v. Error: %v", marsViewerExport.BaseImageUrl, jobId, err), jobId, hctx) - return - } - - // Now we can try to find the corresponding image - ourBaseImage, ourBaseImageItem, err := findImage(marsViewerExport.BaseImageUrl, baseRTT, hctx) - baseImageLocs := &protos.ImageLocations{} - - if err != nil { - if err == mongo.ErrNoDocuments { - // We don't have this image. This means we're importing a new image with the observations transformed to it - if len(coregResult.BaseImageUrl.NewUri) <= 0 { - // We don't have the "new" base image to import, so fail here - failJob(fmt.Sprintf("Coreg import job %v failed, base image not available. Original: %v", jobId, coregResult.BaseImageUrl.OriginalUri), jobId, hctx) - } - ourBaseImage, ourBaseImageItem, baseImageLocs, err = importNewImage(jobId, coregResult.BaseImageUrl.NewUri, baseRTT, marsViewerExport, hctx) - } - } else { - // Read the locations - baseImageLocs, err = readExistingLocationsForImage(jobId, ourBaseImage, hctx) - } - - if err == nil { - // We are importing images/observations warped TO the base image in question - err = importWarpedToBase(jobId, ourBaseImage, ourBaseImageItem, baseImageLocs, baseRTT, &coregResult, marsViewerExport, hctx) - } - - if err != nil { - failJob(fmt.Sprintf("Coreg import job %v failed. Error: %v", jobId, err), jobId, hctx) - return - } - - job.CompleteJob(jobId, true, "Coreg import complete", "", []string{}, hctx.Svcs.MongoDB, hctx.Svcs.TimeStamper, hctx.Svcs.Log) -} - -func importNewImage(jobId string, imageUrl string, baseRTT string, marsViewerExport *protos.MarsViewerExport, hctx wsHelpers.HandlerContext) (string, *protos.ScanImage, *protos.ImageLocations, error) { - // We're importing an image we haven't heard about before. Once this has been imported, we should be able to import the rest as normal - hctx.Svcs.Log.Infof("importNewImage: %v for RTT %v, job: %v...", imageUrl, baseRTT, jobId) - - // Gather all "associated images" - any translated points that we'll be importing. We need to be associated with them - // so we can be shown on their context images - associatedScanIds := []string{baseRTT} - for _, obs := range marsViewerExport.Observations { - if len(obs.TranslatedPoints) > 0 { - contextMeta, err := gdsfilename.ParseFileName(path.Base(obs.ContextImageUrl)) - if err != nil { - hctx.Svcs.Log.Errorf("importNewImage: Failed to read RTT from translated points context image file name: %v. Error: %v", obs.ContextImageUrl, err) - } else { - rtt, err := contextMeta.RTT() - if err != nil { - hctx.Svcs.Log.Errorf("importNewImage: Failed to decode RTT from translated points context image file name: %v. Error: %v", obs.ContextImageUrl, err) - } else { - associatedScanIds = append(associatedScanIds, rtt) - } - } - } - } - - // We need to: - // Add an item to DB for this image - // Add file to S3 - imageFileName := path.Base(imageUrl) - - // Expecting file name like this: - // SC3_0614_0721480213_394RAS_N0301172SRLC10600_0000LMJ03.IMG - // Firstly, check that the image type is one that we support - imageExt := strings.ToUpper(path.Ext(imageUrl)) - if imageExt != ".PNG" && imageExt != ".JPG" && imageExt != ".IMG" { - return "", nil, nil, fmt.Errorf("Image file type not supported: %v", imageUrl) - } - - // Read the bytes - imgBucket, err := fileaccess.GetBucketFromS3Url(imageUrl) - if err != nil { - return "", nil, nil, err - } - imgPath, err := fileaccess.GetPathFromS3Url(imageUrl) - if err != nil { - return "", nil, nil, err - } - - imgData, err := hctx.Svcs.FS.ReadObject(imgBucket, imgPath) - if err != nil { - return "", nil, nil, err - } - - imgWidth := uint32(0) - imgHeight := uint32(0) - - var img image.Image - - if imageExt == ".IMG" { - w, h, d, err := imgFormat.ReadIMGFile(imgData) - imgWidth = uint32(w) - imgHeight = uint32(h) - if err != nil { - return "", nil, nil, fmt.Errorf("Failed to read IMG file: %v. Error: %v", imageUrl, err) - } - - img = imageedit.MakeImageFromRGBA(w, h, d) - - // Change the file name! We're saving as PNG - imageFileName = imageFileName[0:len(imageFileName)-3] + "png" - - // Meanwhile, create the PNG image so the data we write is the actual PNG - var buf bytes.Buffer - - err = png.Encode(&buf, img) - if err != nil { - return "", nil, nil, fmt.Errorf("Failed to write PNG file for IMG file: %v. Error: %v", imageUrl, err) - } - - imgData = buf.Bytes() - } else { - imgWidth, imgHeight, err = utils.ReadImageDimensions(path.Base(imgPath), imgData) - if err != nil { - return "", nil, nil, fmt.Errorf("Failed to read image file: %v. Error: %v", imageUrl, err) - } - } - - savePath := path.Join(baseRTT, imageFileName) - scanImage := utils.MakeScanImage( - savePath, - uint64(len(imgData)), - protos.ScanImageSource_SI_UPLOAD, - protos.ScanImagePurpose_SIP_VIEWING, - associatedScanIds, - "", //baseRTT, - "", - nil, - "", - "", - imgWidth, - imgHeight, - ) - - ctx := context.TODO() - coll := hctx.Svcs.MongoDB.Collection(dbCollections.ImagesName) - opt := options.Update().SetUpsert(true) - - result, err := coll.UpdateByID(ctx, scanImage.ImagePath, bson.D{{Key: "$set", Value: scanImage}}, opt) - if err != nil { - return "", nil, nil, err - } - - if result.MatchedCount != 1 { - hctx.Svcs.Log.Errorf("importNewImage failed to upsert DB image: %v. Result: %+v", scanImage.ImagePath, result) - } - - // Save the image to S3 - s3Path := filepaths.GetImageFilePath(savePath) - err = hctx.Svcs.FS.WriteObject(hctx.Svcs.Config.DatasetsBucket, s3Path, imgData) - if err != nil { - // Failed to upload image data, so no point in having a DB entry now either... - coll = hctx.Svcs.MongoDB.Collection(dbCollections.ImagesName) - filter := bson.D{{Key: "_id", Value: scanImage.ImagePath}} - delOpt := options.Delete() - _ /*delImgResult*/, err = coll.DeleteOne(ctx, filter, delOpt) - return "", nil, nil, err - } - - // Also insert a blank entry for beam locations for this image, as we're expecting to import scans for it - coll = hctx.Svcs.MongoDB.Collection(dbCollections.ImageBeamLocationsName) - beamImageName := dataImportHelpers.GetImageNameSansVersion(scanImage.ImagePath) - beamLocs := &protos.ImageLocations{ - ImageName: beamImageName, - LocationPerScan: []*protos.ImageLocationsForScan{}, - } - - beamResult, err := coll.UpdateByID(ctx, beamImageName, bson.D{{Key: "$set", Value: beamLocs}}, opt) - if err != nil { - return "", nil, nil, err - } - - if beamResult.MatchedCount != 1 { - hctx.Svcs.Log.Errorf("importNewImage failed to upsert initial DB image beam locations: %v. Result: %+v", scanImage.ImagePath, beamResult) - } - - return scanImage.ImagePath, scanImage, beamLocs, err -} - -func readExistingLocationsForImage(jobId string, image string, hctx wsHelpers.HandlerContext) (*protos.ImageLocations, error) { - ctx := context.TODO() - coll := hctx.Svcs.MongoDB.Collection(dbCollections.ImageBeamLocationsName) - - // We're adding to the beam locations for the base image! First, read the base image beam locations structure as there should - // already be one! - filter := bson.M{"_id": dataImportHelpers.GetImageNameSansVersion(image)} - baseImageBeamsResult := coll.FindOne(ctx, filter) - - if baseImageBeamsResult.Err() != nil { - return nil, fmt.Errorf("Coreg import job %v failed to read beams for base image %v. Error: %v", jobId, image, baseImageBeamsResult.Err()) - } - - baseImageBeams := &protos.ImageLocations{} - err := baseImageBeamsResult.Decode(baseImageBeams) - - if err != nil { - return nil, fmt.Errorf("Coreg import job %v failed to decode beams for base image %v. Error: %v", jobId, image, err) - } - - return baseImageBeams, nil -} - -// WARNING: This may have broken since image beam locations are now stored without version info. Because JPL has put the brakes on their side of -// -// the coreg feature, there's no real way to test this out now -func importWarpedToBase(jobId string, baseImage string, ourBaseImageItem *protos.ScanImage, baseImageBeams *protos.ImageLocations, baseRtt string, coregResult *CoregJobResult, marsViewerExport *protos.MarsViewerExport, hctx wsHelpers.HandlerContext) error { - ctx := context.TODO() - coll := hctx.Svcs.MongoDB.Collection(dbCollections.ImageBeamLocationsName) - - locationsPerScan := map[string][]*protos.Coordinate2D{} - for _, locForScan := range baseImageBeams.LocationPerScan { - locationsPerScan[locForScan.ScanId] = locForScan.Locations - } - - beamsChanged := false - associatedScanIds := ourBaseImageItem.AssociatedScanIds - - for _, obs := range marsViewerExport.Observations { - if len(obs.TranslatedPoints) > 0 { - hctx.Svcs.Log.Infof("marsViewer import job %v importing observation for %v with %v points", jobId, obs.ContextImageUrl, len(obs.TranslatedPoints)) - - // We have new beam locations, find out which RTT this is for - rtt, _, err := getRTTAndMeta(obs.ContextImageUrl) - if err != nil { - return fmt.Errorf("Failed to parse contextImageUrl: %v for job %v. Error: %v", obs.ContextImageUrl, jobId, err) - } - - // Ensure rtt differs from our base image one - if rtt == baseRtt { - return fmt.Errorf("Coreg import job %v expected observation RTT %v to differ from base RTT %v", jobId, rtt, baseRtt) - } - - // Ensure we don't have any points already stored for this RTT - for _, locStored := range baseImageBeams.LocationPerScan { - if locStored.ScanId == rtt { - // Print out the fact that we'll be replacing it... - hctx.Svcs.Log.Infof("Coreg is replacing beam locations for scan %v, image %v in job %v", rtt, baseImage, jobId) - //return fmt.Errorf("Coreg import job %v detected beam locations already stored for image %v and scan %v", jobId, baseImage, rtt) - } - } - - // Save the points! We get PMCs, but need to store an array with all PMCs, so we need to fill the gaps with nil if needed - // so we maintain "location index" ability. To do this we'll need to read the dataset file! - exprPB, err := wsHelpers.ReadDatasetFile(rtt, hctx.Svcs) - if err != nil { - // NOTE: if we FAIL TO READ IT, this isn't the end of the world. It may be for a dataset we don't yet support - // so just skip it here and continue, while logging an error. - hctx.Svcs.Log.Errorf("Coreg import job %v skipping dataset %v due to failure to load error: %v", jobId, rtt, err) - continue - } - - translatedPointsLookup := map[int]*protos.Coordinate2D{} - for _, txPoint := range obs.TranslatedPoints { - if _, ok := translatedPointsLookup[int(txPoint.SpectrumNumber)]; ok { - return fmt.Errorf("Coreg import job %v encounted duplicate SpectrumNumber in translated points for contextImageUrl: %v", jobId, obs.ContextImageUrl) - } - - translatedPointsLookup[int(txPoint.SpectrumNumber)] = &protos.Coordinate2D{I: txPoint.Sample, J: txPoint.Line} - } - - coords := []*protos.Coordinate2D{} - for _, loc := range exprPB.Locations { - // If our dataset contains a beam, we look up the translated beam location, otherwise store nil - if loc.Beam != nil { - pmc, err := strconv.Atoi(loc.Id) - if err != nil { - return fmt.Errorf("Coreg import job %v failed to read PMC %v from scan: %v", jobId, loc.Id, rtt) - } - // Find it - if coord, ok := translatedPointsLookup[pmc]; ok { - coords = append(coords, coord) - continue - } - } - - // Nothing to put here, so put a nil so array matches - coords = append(coords, nil) - } - - // Store for this RTT - locationsPerScan[rtt] = coords - beamsChanged = true - - // Also store an associated scan id - if !utils.ItemInSlice(rtt, associatedScanIds) { - associatedScanIds = append(associatedScanIds, rtt) - } - } - } - - // If we have added beams, save - if beamsChanged { - baseImageBeams.LocationPerScan = []*protos.ImageLocationsForScan{} - for rtt, coords := range locationsPerScan { - baseImageBeams.LocationPerScan = append(baseImageBeams.LocationPerScan, &protos.ImageLocationsForScan{ScanId: rtt, Locations: coords}) - } - - // TODO: Transaction for these 2? - filter := bson.M{"_id": dataImportHelpers.GetImageNameSansVersion(baseImage)} // See WARNING at top of function - result, err := coll.ReplaceOne(ctx, filter, &baseImageBeams, options.Replace()) - if err != nil { - return fmt.Errorf("Coreg import job %v failed to save new beam locations: %v", jobId, err) - } - - if result.MatchedCount != 1 { - hctx.Svcs.Log.Errorf("Coreg import job %v didn't insert new beam locations: %+v", jobId, result) - } - - // We also need to modify the image to add to its list of associated images - coll = hctx.Svcs.MongoDB.Collection(dbCollections.ImagesName) - update := bson.D{bson.E{Key: "associatedscanids", Value: associatedScanIds}} - - updImgResult, err := coll.UpdateByID(ctx, baseImage, bson.D{{Key: "$set", Value: update}}) - if err != nil { - return fmt.Errorf("Coreg import job %v failed to update image associated scans list: %v", jobId, baseImage) - } - - if updImgResult.MatchedCount != 1 { - hctx.Svcs.Log.Errorf("Coreg import job %v didn't update image associated scans list: %+v", jobId, updImgResult) - } - } - - // Loop through each warped image, read it, along with beam locations (in observation for it) - for _, item := range coregResult.WarpedImageUrls { - if item.Completed { - if err := importWarpedImage(item.NewUri, baseRtt, baseImage, hctx); err != nil { - return err - } - } - } - - return nil -} - -// NOTE: we expect URLs like this: -// s3://m20-sstage-ids-crisp-imgcoregi/crisp_data/ICM-PCW_0920_0748651385_000RAS_N045000032263424500050-SC3_0921_0748732957_027RAS_N0450000SRLC11373_0000-0-C02-J01.VIC/67e92f8ba7cd38d07d969f910db5d1d3/crisp_data/ods/surface/sol/00921/ids/rdr/shrlc/warped-zoom_4.478153138946561-win_519_40_1232_1183-SN100D0-SC3_0921_0748732957_027RAS_N0450000SRLC11373_0000LMJ01-A.png - -func importWarpedImage(warpedImageUrl string, rttWarpedTo string, baseImage string, hctx wsHelpers.HandlerContext) error { - hctx.Svcs.Log.Infof("importWarpedImage: %v for RTT %v, image: %v...", warpedImageUrl, rttWarpedTo, baseImage) - - // We need to: - // Add an item to DB for this image - // Add file to S3 - warpedFileName := path.Base(warpedImageUrl) - - // Expecting file name like this: - // warped-zoom_4.478153138946561-win_519_40_1232_1183-SN100D0-SC3_0921_0748732957_027RAS_N0450000SRLC11373_0000LMJ01-A.png - - // Read the bytes - warpedSrcBucket, err := fileaccess.GetBucketFromS3Url(warpedImageUrl) - if err != nil { - return err - } - warpedSrcPath, err := fileaccess.GetPathFromS3Url(warpedImageUrl) - if err != nil { - return err - } - - imgData, err := hctx.Svcs.FS.ReadObject(warpedSrcBucket, warpedSrcPath) - if err != nil { - return err - } - - imgWidth, imgHeight, err := utils.ReadImageDimensions(path.Base(warpedSrcPath), imgData) - if err != nil { - return err - } - - matchInfo, nicerSaveName, err := readWarpedImageTransform(warpedFileName) - if err != nil { - return err - } - - matchInfo.BeamImageFileName = baseImage - - savePath := path.Join(rttWarpedTo, nicerSaveName) - scanImage := utils.MakeScanImage( - savePath, - uint64(len(imgData)), - protos.ScanImageSource_SI_UPLOAD, - protos.ScanImagePurpose_SIP_VIEWING, - []string{rttWarpedTo}, - rttWarpedTo, - "", - matchInfo, - "", - "", - imgWidth, - imgHeight, - ) - - ctx := context.TODO() - coll := hctx.Svcs.MongoDB.Collection(dbCollections.ImagesName) - - opt := options.Update().SetUpsert(true) - result, err := coll.UpdateByID(ctx, scanImage.ImagePath, bson.D{{Key: "$set", Value: scanImage}}, opt) - if err != nil { - if mongo.IsDuplicateKeyError(err) { - return errorwithstatus.MakeBadRequestError(fmt.Errorf("%v already exists", scanImage.ImagePath)) - } - return err - } - - if result.MatchedCount != 1 { - hctx.Svcs.Log.Errorf("importWarpedImage failed to upsert DB image: %v. Result: %+v", scanImage.ImagePath, result) - } - - // Save the image to S3 - s3Path := filepaths.GetImageFilePath(savePath) - err = hctx.Svcs.FS.WriteObject(hctx.Svcs.Config.DatasetsBucket, s3Path, imgData) - if err != nil { - // Failed to upload image data, so no point in having a DB entry now either... - coll = hctx.Svcs.MongoDB.Collection(dbCollections.ImagesName) - filter := bson.D{{Key: "_id", Value: scanImage.ImagePath}} - delOpt := options.Delete() - _ /*delImgResult*/, err = coll.DeleteOne(ctx, filter, delOpt) - return err - } - - return nil -} - -func failJob(errMsg string, jobId string, hctx wsHelpers.HandlerContext) { - job.CompleteJob(jobId, false, errMsg, "", []string{}, hctx.Svcs.MongoDB, hctx.Svcs.TimeStamper, hctx.Svcs.Log) -} - -func getRTTAndMeta(imageUrl string) (string, gdsfilename.FileNameMeta, error) { - srcMeta, err := gdsfilename.ParseFileName(path.Base(imageUrl)) - if err != nil { - return "", srcMeta, err - } - - rtt, err := srcMeta.RTT() - return rtt, srcMeta, err -} - -func findImage(imageName string, imageRTT string, hctx wsHelpers.HandlerContext) (string, *protos.ScanImage, error) { - ctx := context.TODO() - coll := hctx.Svcs.MongoDB.Collection(dbCollections.ImagesName) - - foundItems, err := coll.Find(ctx, bson.M{"originscanid": imageRTT}, options.Find()) - if err != nil { - return "", nil, err - } - - items := []*protos.ScanImage{} - err = foundItems.All(context.TODO(), &items) - if err != nil { - return "", nil, err - } - - // Find it within what we've got - comparableBaseName := gdsfilename.MakeComparableName(path.Base(imageName)) - - for _, item := range items { - comparableName := gdsfilename.MakeComparableName(path.Base(item.ImagePath)) - - if comparableName == comparableBaseName { - return item.ImagePath, item, nil - } - } - - return "", nil, mongo.ErrNoDocuments // fmt.Errorf("Failed to find image: %v for scan %v", imageName, imageRTT) -} - -// NOTE: make sure to only pass the file name, not a path like scanid/file.png -func readWarpedImageTransform(fileName string) (*protos.ImageMatchTransform, string, error) { - ext := path.Ext(fileName) - if len(ext) > 0 { - fileName = fileName[0 : len(fileName)-len(ext)] - } - - parts := strings.Split(fileName, "-") - - // Expecting: - // "warped" - // "zoom_" - // "win_" - // Don't know what SN100D0 is? - // And the original image file name - // Don't know what -A is though? - if len(parts) < 4 { - // We expect warped, zoom_, win_ and the file name at a bare minimum - return nil, "", fmt.Errorf("Warped image name does not have expected components") - } - - // Check each bit - if parts[0] != "warped" { - return nil, "", fmt.Errorf("Expected warped image name to start with warped-") - } - - zoomPrefix := "zoom_" - if !strings.HasPrefix(parts[1], zoomPrefix) { - return nil, "", fmt.Errorf("Expected warped image name second part to contain zoom") - } - - winPrefix := "win_" - if !strings.HasPrefix(parts[2], winPrefix) { - return nil, "", fmt.Errorf("Expected warped image name second part to contain window") - } - - // Ensure we have the gds-formatted file name, and check if we have the optional -A or whatever at the end - endPiece := "" - if len(parts[len(parts)-1]) == 1 { // Just looking for A, eg ends in -A.png... - endPiece = "-" + parts[len(parts)-1] - } - - gdsFileName := parts[len(parts)-1] - if len(endPiece) > 0 { - gdsFileName = parts[len(parts)-2] - } - - // Verify that we got it - _, err := gdsfilename.ParseFileName(gdsFileName + ext) - if err != nil { - return nil, "", fmt.Errorf("Failed to find GDS file name section in image name: %v. Error: %v", gdsFileName, err) - } - - // Read the zoom and window - zoomStr := parts[1][len(zoomPrefix):] // Snipping number out of: zoom_4.478153138946561 - zoom, err := strconv.ParseFloat(zoomStr, 64) - if err != nil { - return nil, "", fmt.Errorf("Expected warped image zoom to contain a float, found: %v", zoomStr) - } - - winPartsStr := strings.Split(parts[2][len(winPrefix):], "_") // Snipping numbers out of: win_519_40_1232_1183 - winParts := []int{} - for c, n := range winPartsStr { - winNum, err := strconv.Atoi(n) - if err != nil { - return nil, "", fmt.Errorf("Expected warped image window value %v to contain a number, found: %v", c+1, n) - } - - winParts = append(winParts, winNum) - } - - // win_... - this is stored as lines & samples, then width/height of the image - // so line = y, samples = x in our world - // Example: warped-zoom_4.478153138946561-win_519_40_1232_1183-SN100D0-SC3_0921_0748732957_027RAS_N0450000SRLC11373_0000LMJ01-A.png - // Has zoom factor 4.478153138946561 and x, y: (40, 519) - - // At this point we should have enough to reconstruct the transform as we interpret it - return &protos.ImageMatchTransform{ - XOffset: float64(winParts[1]), - YOffset: float64(winParts[0]), - XScale: float64(zoom), - YScale: float64(zoom), - }, - // Provide a nicer file name to save as - // If this image is coregistered in other ways we don't want it to clash, but we also don't want to generate random chars - // for its name so it doesn't just proliferate (and a re-import can overwrite it). So lets try preserve what's likely to be - // unique in the file name - the x,y! - fmt.Sprintf("coreg-%v_%v-%v%v%v", winParts[1], winParts[0], gdsFileName, endPiece, ext), - nil -} diff --git a/api/coreg/import_test.go b/api/coreg/import_test.go deleted file mode 100644 index af4207dc..00000000 --- a/api/coreg/import_test.go +++ /dev/null @@ -1,69 +0,0 @@ -package coreg - -import ( - "fmt" - "log" - - "github.com/pixlise/core/v4/core/utils" - protos "github.com/pixlise/core/v4/generated-protos" - "google.golang.org/protobuf/encoding/protojson" -) - -func printWarpXform(xform *protos.ImageMatchTransform, name string, err error) { - fmt.Printf("%v|%v\n", name, err) - - if b, err := protojson.Marshal(xform); err != nil { - log.Fatalln(err) - } else { - // Proto isn't deterministic, so we read as JSON and write it back out again - fmt.Printf("%v\n", utils.MakeDeterministicJSON(b, false)) - } -} - -func Example_readWarpedImageTransform() { - printWarpXform(readWarpedImageTransform("warped-zoom_4.478153138946561-win_519_40_1232_1183-SN100D0-SC3_0921_0748732957_027RAS_N0450000SRLC11373_0000LMJ01-A.png")) - - printWarpXform(readWarpedImageTransform("warped-zoom_1.1359177671479777-win_216_186_167_183-PCB_0921_0748739251_000RAS_N045000032302746300020LUJ01-A.png")) - - printWarpXform(readWarpedImageTransform("warped-zoom_4.478153138946561-win_519_40_1232_1183-SN100D0-SC3_0921_0748732957_027RAS_N0450000SRLC11373_0000LMJ01.png")) - - printWarpXform(readWarpedImageTransform("warped-zoom_1.1359177671479777-win_216_186_167_183-PCB_0921_0748739251_000RAS_N045000032302746300020LUJ01.png")) - - printWarpXform(readWarpedImageTransform("warped-win_216_186_167_183-PCB_0921_0748739251_000RAS_N045000032302746300020LUJ01.png")) - - printWarpXform(readWarpedImageTransform("warped-zoom_4.478153138946561-win_519_40_1232_1183-SN100D0-SC3_0921_0748732957_027RASS_N0450000SRLC11373_0000LMJ01.png")) - - // Output: - // coreg-40_519-SC3_0921_0748732957_027RAS_N0450000SRLC11373_0000LMJ01-A.png| - // { - // "xOffset": 40, - // "xScale": 4.478153138946561, - // "yOffset": 519, - // "yScale": 4.478153138946561 - // } - // coreg-186_216-PCB_0921_0748739251_000RAS_N045000032302746300020LUJ01-A.png| - // { - // "xOffset": 186, - // "xScale": 1.1359177671479777, - // "yOffset": 216, - // "yScale": 1.1359177671479777 - // } - // coreg-40_519-SC3_0921_0748732957_027RAS_N0450000SRLC11373_0000LMJ01.png| - // { - // "xOffset": 40, - // "xScale": 4.478153138946561, - // "yOffset": 519, - // "yScale": 4.478153138946561 - // } - // coreg-186_216-PCB_0921_0748739251_000RAS_N045000032302746300020LUJ01.png| - // { - // "xOffset": 186, - // "xScale": 1.1359177671479777, - // "yOffset": 216, - // "yScale": 1.1359177671479777 - // } - // |Warped image name does not have expected components - // {} - // |Failed to find GDS file name section in image name: SC3_0921_0748732957_027RASS_N0450000SRLC11373_0000LMJ01. Error: Failed to parse meta from file name - // {} -} diff --git a/api/coreg/test-data/Marsviewer_PIXLISE_export_2023-05-24_d1df5b76-d4d9-4756-b3eb-33889f7fae58.json b/api/coreg/test-data/Marsviewer_PIXLISE_export_2023-05-24_d1df5b76-d4d9-4756-b3eb-33889f7fae58.json deleted file mode 100644 index b7d3631e..00000000 --- a/api/coreg/test-data/Marsviewer_PIXLISE_export_2023-05-24_d1df5b76-d4d9-4756-b3eb-33889f7fae58.json +++ /dev/null @@ -1,324 +0,0 @@ -{ - "observations": [ - { - "interpolated": false, - "observationCSVFilename": "SS__0614_0721474508_785RRS__0301172SRLC11360W108CGNJ01.CSV", - "contextImageUrl": "s3://m20-ids-g-data-g66bt/ods/dev/sol/00614/ids/rdr/shrlc/SC3_0614_0721474493_226RAS_N0301172SRLC11360_0000LMJ03.IMG", - "site": 30, - "drive": 1172, - "originalPoints": [ - { "line": 324.367, "sample": 465.182, "spectrum_number": 0 }, - { "line": 324.601, "sample": 540.645, "spectrum_number": 1 }, - { "line": 323.629, "sample": 615.429, "spectrum_number": 2 }, - { "line": 322.961, "sample": 690.462, "spectrum_number": 3 }, - { "line": 322.643, "sample": 765.627, "spectrum_number": 4 }, - { "line": 322.629, "sample": 841.042, "spectrum_number": 5 }, - { "line": 321.293, "sample": 915.733, "spectrum_number": 6 }, - { "line": 321.002, "sample": 991.177, "spectrum_number": 7 }, - { "line": 320.438, "sample": 1065.936, "spectrum_number": 8 }, - { "line": 320.206, "sample": 1141.224, "spectrum_number": 9 }, - { "line": 395.942, "sample": 1142.406, "spectrum_number": 10 }, - { "line": 396.333, "sample": 1067.223, "spectrum_number": 11 }, - { "line": 397.35, "sample": 992.322, "spectrum_number": 12 }, - { "line": 397.901, "sample": 917.245, "spectrum_number": 13 }, - { "line": 398.058, "sample": 842.332, "spectrum_number": 14 }, - { "line": 398.654, "sample": 767.137, "spectrum_number": 15 }, - { "line": 398.828, "sample": 691.649, "spectrum_number": 16 }, - { "line": 399.627, "sample": 616.621, "spectrum_number": 17 }, - { "line": 400.323, "sample": 541.687, "spectrum_number": 18 }, - { "line": 400.626, "sample": 466.74, "spectrum_number": 19 }, - { "line": 476.391, "sample": 467.844, "spectrum_number": 20 }, - { "line": 476.132, "sample": 542.852, "spectrum_number": 21 }, - { "line": 475.421, "sample": 617.825, "spectrum_number": 22 }, - { "line": 474.884, "sample": 692.863, "spectrum_number": 23 }, - { "line": 474.318, "sample": 768.158, "spectrum_number": 24 }, - { "line": 474.407, "sample": 843.298, "spectrum_number": 25 }, - { "line": 473.272, "sample": 918.513, "spectrum_number": 26 }, - { "line": 473.101, "sample": 993.465, "spectrum_number": 27 }, - { "line": 472.608, "sample": 1068.564, "spectrum_number": 28 }, - { "line": 472.464, "sample": 1143.795, "spectrum_number": 29 }, - { "line": 548.477, "sample": 1144.948, "spectrum_number": 30 }, - { "line": 548.59, "sample": 1069.973, "spectrum_number": 31 }, - { "line": 548.822, "sample": 994.686, "spectrum_number": 32 }, - { "line": 549.824, "sample": 919.824, "spectrum_number": 33 }, - { "line": 550.229, "sample": 844.781, "spectrum_number": 34 }, - { "line": 550.796, "sample": 769.486, "spectrum_number": 35 }, - { "line": 551.39, "sample": 694.648, "spectrum_number": 36 }, - { "line": 551.549, "sample": 619.378, "spectrum_number": 37 }, - { "line": 552.072, "sample": 544.022, "spectrum_number": 38 }, - { "line": 552.463, "sample": 468.84, "spectrum_number": 39 }, - { "line": 628.679, "sample": 470.337, "spectrum_number": 40 }, - { "line": 628.375, "sample": 545.463, "spectrum_number": 41 }, - { "line": 627.882, "sample": 620.562, "spectrum_number": 42 }, - { "line": 627.112, "sample": 695.691, "spectrum_number": 43 }, - { "line": 626.503, "sample": 770.568, "spectrum_number": 44 }, - { "line": 626.388, "sample": 845.899, "spectrum_number": 45 }, - { "line": 625.981, "sample": 921.299, "spectrum_number": 46 }, - { "line": 624.98, "sample": 995.983, "spectrum_number": 47 }, - { "line": 624.34, "sample": 1071.295, "spectrum_number": 48 }, - { "line": 623.731, "sample": 1146.172, "spectrum_number": 49 } - ], - "translatedPoints": [ - { - "line": 314.56435187249485, - "sample": 481.59458872022174, - "spectrum_number": 0 - }, - { - "line": 315.108292461814, - "sample": 556.8091544098625, - "spectrum_number": 1 - }, - { - "line": 313.49789796685644, - "sample": 631.6060845068151, - "spectrum_number": 2 - }, - { - "line": 312.7262591068983, - "sample": 707.2533632644393, - "spectrum_number": 3 - }, - { - "line": 312.89121225384747, - "sample": 782.4894726722425, - "spectrum_number": 4 - }, - { - "line": 312.0753773842007, - "sample": 857.5096383935143, - "spectrum_number": 5 - }, - { - "line": 311.7736718686589, - "sample": 932.1851128366753, - "spectrum_number": 6 - }, - { - "line": 311.6733527686406, - "sample": 1008.481698936107, - "spectrum_number": 7 - }, - { - "line": 310.58762044994364, - "sample": 1083.0842246671964, - "spectrum_number": 8 - }, - { - "line": 311.14446612040547, - "sample": 1158.812115403839, - "spectrum_number": 9 - }, - { - "line": 385.83906998801376, - "sample": 1159.8463054492413, - "spectrum_number": 10 - }, - { - "line": 386.41685008269997, - "sample": 1084.213731605283, - "spectrum_number": 11 - }, - { - "line": 387.54949410766903, - "sample": 1009.3625494967373, - "spectrum_number": 12 - }, - { - "line": 387.7551320843877, - "sample": 933.927922204567, - "spectrum_number": 13 - }, - { - "line": 388.1100768003391, - "sample": 858.4544912039772, - "spectrum_number": 14 - }, - { - "line": 388.2232044327543, - "sample": 783.4470451214661, - "spectrum_number": 15 - }, - { - "line": 388.3869594285801, - "sample": 708.5392620681824, - "spectrum_number": 16 - }, - { - "line": 390.3977657701248, - "sample": 633.3838364212083, - "spectrum_number": 17 - }, - { - "line": 390.41215543322687, - "sample": 559.0776534971883, - "spectrum_number": 18 - }, - { - "line": 390.42861677420547, - "sample": 483.6133974931902, - "spectrum_number": 19 - }, - { - "line": 466.9086881058647, - "sample": 483.9885263260321, - "spectrum_number": 20 - }, - { - "line": 466.5959691180945, - "sample": 559.5433891203477, - "spectrum_number": 21 - }, - { - "line": 466.2966035717873, - "sample": 634.8900437116183, - "spectrum_number": 22 - }, - { - "line": 464.66977328863743, - "sample": 709.470808831024, - "spectrum_number": 23 - }, - { - "line": 464.38842890788214, - "sample": 784.7976344776548, - "spectrum_number": 24 - }, - { - "line": 465.20223876200396, - "sample": 860.3830129622988, - "spectrum_number": 25 - }, - { - "line": 463.70699217139924, - "sample": 935.4298586428395, - "spectrum_number": 26 - }, - { - "line": 462.7102570410366, - "sample": 1010.8183836708613, - "spectrum_number": 27 - }, - { - "line": 462.69555663074516, - "sample": 1085.1136482800794, - "spectrum_number": 28 - }, - { - "line": 463.11837303750553, - "sample": 1161.5687732474635, - "spectrum_number": 29 - }, - { - "line": 538.6607137423489, - "sample": 1162.4730282576165, - "spectrum_number": 30 - }, - { - "line": 538.9316084977495, - "sample": 1087.8638487804637, - "spectrum_number": 31 - }, - { - "line": 539.1365816275647, - "sample": 1012.2431922610804, - "spectrum_number": 32 - }, - { - "line": 538.6032554705671, - "sample": 936.1152539237482, - "spectrum_number": 33 - }, - { - "line": 539.7664038484436, - "sample": 861.6053583054236, - "spectrum_number": 34 - }, - { - "line": 540.7789959035795, - "sample": 785.8403884164636, - "spectrum_number": 35 - }, - { - "line": 541.849800997878, - "sample": 711.2682548481766, - "spectrum_number": 36 - }, - { - "line": 541.6265338040836, - "sample": 636.5195137402843, - "spectrum_number": 37 - }, - { - "line": 541.7324467751969, - "sample": 560.5036130670924, - "spectrum_number": 38 - }, - { - "line": 542.9733445393042, - "sample": 486.0590456215923, - "spectrum_number": 39 - }, - { - "line": 619.2028968750182, - "sample": 487.0941898126099, - "spectrum_number": 40 - }, - { - "line": 618.0911691710353, - "sample": 561.6782747153193, - "spectrum_number": 41 - }, - { - "line": 618.4497132691122, - "sample": 637.1843749755444, - "spectrum_number": 42 - }, - { - "line": 616.7537194053725, - "sample": 713.2210908259513, - "spectrum_number": 43 - }, - { - "line": 616.2189111391185, - "sample": 787.2403134112783, - "spectrum_number": 44 - }, - { - "line": 616.8405545802193, - "sample": 863.0781648284521, - "spectrum_number": 45 - }, - { - "line": 616.3067193650238, - "sample": 938.1854883532226, - "spectrum_number": 46 - }, - { - "line": 615.1256945469868, - "sample": 1013.0888848185205, - "spectrum_number": 47 - }, - { - "line": 614.2847515492613, - "sample": 1087.7032221958298, - "spectrum_number": 48 - }, - { - "line": 613.3813073059509, - "sample": 1162.9433534151294, - "spectrum_number": 49 - } - ] - } - ], - "baseImageUrl": "s3://m20-ids-g-data-g66bt/ods/dev/sol/00614/ids/rdr/shrlc/SC3_0614_0721480213_394RAS_N0301172SRLC10600_0000LMJ03.IMG", - "warpedOverlayImages": [ - { - "interpolated": true, - "mappedImageUrl": "s3://m20-ids-g-data-g66bt/ods/dev/sol/00614/ids/rdr/shrlc/SIF_0614_0721455441_734RAS_N0301172SRLC00643_0000LMJ03.IMG", - "warpedImageUrl": "s3://m20-dev-ids-crisp-imgcoregi/crisp_data/ICM-SC3_0614_0721480213_394RAS_N0301172SRLC10600_0000-SIF_0614_0721455441_734RAS_N0301172SRLC00643_0000-J01.VIC/09cd570f0963157fbf39575de1da4e73/crisp_data/ods/dev/sol/00614/ids/rdr/shrlc/warped-zoom_1-SN100D0-SIF_0614_0721455441_734RAS_N0301172SRLC00643_0000LMJ03.VIC" - } - ], - "marsviewerLink": "https://localhost.dev.m20.jpl.nasa.gov:8443/?B_ocs_type_name=m20-edr-rdr-m20-mosaic&EDR=s3%3A%2F%2Fm20-ids-g-data-g66bt%2Fods%2Fdev%2Fsol%2F00614%2Fids%2Frdr%2Fshrlc%2FSC3_0614_0721480213_394RAS_N0301172SRLC10600_0000LMJ03.IMG&FS_ocs_type_name=m20-edr-rdr-m20-mosaic&FS_vicar_label.VICAR_PROCESSING.COREG_ELIGIBLE=true¢er=824.00000%2C600.00000&iti=9&overlays=SC3_0614_0721480213_394RAS_N0301172SRLC10600_0000LMJ03.IMG%2CSS__0614_0721474508_785RRS__0301172SRLC11360W108CGNJ01.CSV%28spec%3Dtrue%7Cspec_int%3Dfalse%7Cspec_col%3D1100FF%29%2CICM-SC3_0614_0721480213_394RAS_N0301172SRLC10600_0000-SIF_0614_0721455441_734RAS_N0301172SRLC00643_0000-J01.VIC%28coreg%3Dtrue%7Ccoreg_int%3Dtrue%29&package=m20-ids-g-data-g66bt&sti=0&zoom=0.52050" -} diff --git a/api/dbCollections/collections.go b/api/dbCollections/collections.go index 178cbe52..b50cc6c2 100644 --- a/api/dbCollections/collections.go +++ b/api/dbCollections/collections.go @@ -4,7 +4,6 @@ package dbCollections // NOTE DON'T FORGET TO UPDATE GetAllCollections() BELOW!!! -const CoregJobCollection = "coregJobs" const DetectorConfigsName = "detectorConfigs" const DiffractionDetectedPeakStatusesName = "diffractionDetectedPeakStatuses" const DiffractionManualPeaksName = "diffractionManualPeaks" @@ -16,8 +15,6 @@ const ImageBeamLocationsName = "imageBeamLocations" const ImagePyramidsName = "imagePyramids" const Image3DPointsName = "image3DPoints" const ImagesName = "images" -const JobStatusName = "jobStatuses" -const JobHandlersName = "jobHandlers" const MemoisedItemsName = "memoisedItems" const MistROIsName = "mistROIs" const ModulesName = "modules" @@ -45,10 +42,11 @@ const ViewStatesName = "viewStates" const WidgetDataName = "widgetData" const ConnectTempTokensName = "connectTempTokens" const JobsName = "jobs" +const JobStatusName = "jobStatuses" +const JobHandlersName = "jobHandlers" func GetAllCollections() []string { return []string{ - CoregJobCollection, DetectorConfigsName, DiffractionDetectedPeakStatusesName, DiffractionManualPeaksName, diff --git a/api/job/definition.go b/api/job/definition.go new file mode 100644 index 00000000..38a1d1c1 --- /dev/null +++ b/api/job/definition.go @@ -0,0 +1,59 @@ +package job + +type JobFilePath struct { + // The remote file info + RemoteBucket string + RemotePath string + + // Local copy + LocalPath string +} + +type JobConfig struct { + // The job id + JobId string + + // Logging method - If these are empty, we just log to stdout + // LogCloudwatchGroup string + // LogCloudwatchStream string + + // What files are required to be present when running the job? + RequiredFiles []JobFilePath + + // What command to execute + Command string + Args []string + + // What to upload on completion (if file doesn't exist, it can be ignored with a warning) + OutputFiles []JobFilePath +} + +func (c JobConfig) Copy() JobConfig { + newCfg := JobConfig{ + JobId: c.JobId, + RequiredFiles: []JobFilePath{}, + Command: c.Command, + Args: c.Args, + OutputFiles: []JobFilePath{}, + } + + for _, f := range c.RequiredFiles { + newCfg.RequiredFiles = append(newCfg.RequiredFiles, JobFilePath{ + RemoteBucket: f.RemoteBucket, + RemotePath: f.RemotePath, + LocalPath: f.LocalPath, + }) + } + + for _, f := range c.OutputFiles { + newCfg.OutputFiles = append(newCfg.OutputFiles, JobFilePath{ + RemoteBucket: f.RemoteBucket, + RemotePath: f.RemotePath, + LocalPath: f.LocalPath, + }) + } + + return newCfg +} + +var JobConfigEnvVar = "JOB_CONFIG" diff --git a/api/job/executor/docker.go b/api/job/executor/docker.go new file mode 100644 index 00000000..b4bec82c --- /dev/null +++ b/api/job/executor/docker.go @@ -0,0 +1,153 @@ +// Licensed to NASA JPL under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. NASA JPL licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package jobexecutor + +import ( + "encoding/json" + "errors" + "fmt" + "os" + "os/exec" + "sync" + + "github.com/pixlise/core/v4/api/config" + "github.com/pixlise/core/v4/api/job" + "github.com/pixlise/core/v4/core/awsutil" + "github.com/pixlise/core/v4/core/logger" +) + +/////////////////////////////////////////////////////////////////////////////////////////// +// Runs job locally in Docker + +type dockerJobExecutor struct { +} + +func (r *dockerJobExecutor) StartJob(jobConfig JobGroupConfig, apiCfg config.APIConfig, requestorUserId string, log logger.ILogger) error { + // Here we start multiple instances of docker and wait for them all to finish using the WaitGroup + var wg sync.WaitGroup + + // Make sure AWS env vars are available, because that's what we'll be passing to job docker container + awsKey := os.Getenv("AWS_ACCESS_KEY_ID") + awsSecret := os.Getenv("AWS_SECRET_ACCESS_KEY") + awsRegion := os.Getenv("AWS_DEFAULT_REGION") + + sess, err := awsutil.GetSession() + if err != nil { + return err + } + v, err := sess.Config.Credentials.Get() + if err != nil { + return err + } + awsKey = v.AccessKeyID + awsSecret = v.SecretAccessKey + if len(awsKey) > 0 && len(awsSecret) > 0 && len(awsRegion) <= 0 { + awsRegion = "us-east-1" + } + + /* + // If we don't have the AWS var stuff, try using the default profile + if len(awsKey) <= 0 || len(awsSecret) <= 0 || len(awsRegion) <= 0 { + foundDefault := false + f, err := os.ReadFile("~/.aws/credentials") + if err == nil { + lines := strings.Split(string(f), "\n") + cutset := " \t\r\n" + for c, line := range lines { + if strings.Trim(line, cutset) == "[default]" { + // Next 2 lines should have what we're after + for i := range []int{c + 1, c + 2} { + v := strings.Trim(lines[i], cutset) + if strings.HasPrefix(v, "aws_access_key_id") { + pos := strings.Index(v, "=") + if pos > -1 { + awsKey = strings.Trim(v[pos+1:], cutset) + } + } + if strings.HasPrefix(v, "aws_secret_access_key") { + pos := strings.Index(v, "=") + if pos > -1 { + awsSecret = strings.Trim(v[pos+1:], cutset) + } + } + } + + foundDefault = len(awsKey) > 0 && len(awsSecret) > 0 + break + } + } + } + + if foundDefault && len(awsRegion) <= 0 { + awsRegion = "us-east-1" + } + } + */ + + if len(awsKey) <= 0 || len(awsSecret) <= 0 || len(awsRegion) <= 0 { + txt := "Failed to define AWS variables" + log.Errorf(txt) + return errors.New(txt) + } + + for nodeIdx := 0; nodeIdx < jobConfig.NodeCount; nodeIdx++ { + wg.Add(1) + go runDockerInstance(&wg, jobConfig.GetNodeConfig(nodeIdx), jobConfig.DockerImage, awsKey, awsSecret, awsRegion, log) + } + + // Wait for all nodes to finish + wg.Wait() + + return nil +} + +func runDockerInstance(wg *sync.WaitGroup, config job.JobConfig, dockerImage string, awsKey string, awsSecret string, awsRegion string, log logger.ILogger) { + defer wg.Done() + + // Make a JSON string out of params so it can be passed in + configJSON, err := json.Marshal(config) + if err != nil { + log.Errorf("Error serialising config for docker instance: %v", err) + return + } + configStr := string(configJSON) + + // Start up docker, give it env vars for AWS access + // and our JSON param blob too + cmd := exec.Command( + "docker", + "run", + "--rm", + "-e", "AWS_ACCESS_KEY_ID="+awsKey, + "-e", "AWS_SECRET_ACCESS_KEY="+awsSecret, + "-e", "AWS_DEFAULT_REGION="+awsRegion, + "-e", fmt.Sprintf("%v=%v", job.JobConfigEnvVar, configStr), + dockerImage, + // <-- Assumed that the runner is the default command and it will pick up what to do from the config env var + ) + + out, err := cmd.CombinedOutput() + if err != nil { + log.Infof("Running job %v in docker failed: %v\n", config.JobId, err) + log.Infof(string(out)) + return + } + + log.Infof("Job %v ran successfully:\n", config.JobId) + log.Infof(string(out)) +} diff --git a/api/job/jobstarter/jobStarter.go b/api/job/executor/executor.go similarity index 65% rename from api/job/jobstarter/jobStarter.go rename to api/job/executor/executor.go index 301bfea7..d75fde2d 100644 --- a/api/job/jobstarter/jobStarter.go +++ b/api/job/executor/executor.go @@ -17,13 +17,13 @@ // Exposes interfaces and structures required to run PIQUANT in the Kubernetes cluster along with functions // to access quantification files, logs, results and summaries of quant jobs. -package jobstarter +package jobexecutor import ( "fmt" "github.com/pixlise/core/v4/api/config" - jobrunner "github.com/pixlise/core/v4/api/job/runner" + "github.com/pixlise/core/v4/api/job" "github.com/pixlise/core/v4/core/logger" ) @@ -32,26 +32,32 @@ type JobGroupConfig struct { DockerImage string FastStart bool NodeCount int - NodeConfig jobrunner.JobConfig + NodeConfig job.JobConfig } -func (jg JobGroupConfig) GetNodeConfig(nodeIdx int) jobrunner.JobConfig { +func (jg JobGroupConfig) GetNodeConfig(nodeIdx int) job.JobConfig { nodeCfg := jg.NodeConfig.Copy() nodeCfg.JobId = fmt.Sprintf("%v-%v", jg.JobGroupId, nodeIdx) return nodeCfg } -type JobStarter interface { - StartJob(dockerImage string, jobConfig JobGroupConfig, apiConfig config.APIConfig, requestorUserId string, log logger.ILogger) error +type JobExecutor interface { + StartJob(jobConfig JobGroupConfig, apiConfig config.APIConfig, requestorUserId string, log logger.ILogger) error + // TODO: + // CancelJob + // GetJobStatus + // RegisterForJobStatusChange + // GetJobLogs } -func GetJobStarter(name string) (JobStarter, error) { - if name == "docker" { - return &dockerJobStarter{}, nil - } else if name == "kubernetes" { - return &kubernetesJobStarter{}, nil - } else if name == "null" { - return &nullJobStarter{}, nil +func GetJobExecutor(name string) (JobExecutor, error) { + switch name { + case "docker": + return &dockerJobExecutor{}, nil + case "kubernetes": + return &kubernetesJobExecutor{}, nil + case "null": + return &nullJobExecutor{}, nil } - return nil, fmt.Errorf("Unknown job starter: %v", name) + return nil, fmt.Errorf("Unknown job executor: %v", name) } diff --git a/api/job/executor/executor_test.go b/api/job/executor/executor_test.go new file mode 100644 index 00000000..766679b9 --- /dev/null +++ b/api/job/executor/executor_test.go @@ -0,0 +1,263 @@ +package jobexecutor + +import ( + "fmt" + "strings" + + "github.com/pixlise/core/v4/api/config" + "github.com/pixlise/core/v4/api/job" + "github.com/pixlise/core/v4/api/specialUserIds" + "github.com/pixlise/core/v4/core/awsutil" + "github.com/pixlise/core/v4/core/fileaccess" + "github.com/pixlise/core/v4/core/logger" +) + +var dockerImage = "ghcr.io/pixlise/job-runner:latest" + +// var dockerImage = "pixlise-job-runner" + +func Example_jobexecutor_Run_docker_Python() { + nodeCfg := job.JobConfig{ + JobId: "Job003", + Command: "python", + Args: []string{"test.py", "Input/input.csv"}, + RequiredFiles: []job.JobFilePath{ + {LocalPath: "test.py", RemoteBucket: "test-piquant", RemotePath: "Example_jobexecutor_Run_docker_Python/test.py"}, + {LocalPath: "requirements.txt", RemoteBucket: "test-piquant", RemotePath: "Example_jobexecutor_Run_docker_Python/requirements.txt"}, + {LocalPath: "Input/input.csv", RemoteBucket: "test-piquant", RemotePath: "Example_jobexecutor_Run_docker_Python/Input/input.csv"}, + }, + OutputFiles: []job.JobFilePath{ + {LocalPath: "stdout", RemoteBucket: "test-piquant", RemotePath: "Example_jobexecutor_Run_docker_Python/Output/stdout"}, + {LocalPath: "py-output.txt", RemoteBucket: "test-piquant", RemotePath: "Example_jobexecutor_Run_docker_Python/Output/py-output.txt"}, + }, + } + + jobGroup := JobGroupConfig{ + JobGroupId: "JG001", + DockerImage: dockerImage, + NodeCount: 1, + NodeConfig: nodeCfg, + } + + r, err := GetJobExecutor("docker") + fmt.Printf("GetJobStarter: %v\n", err) + + l := &logger.StdOutLoggerForTest{} + + apiCfg := config.APIConfig{} + + sess, err := awsutil.GetSession() + fmt.Printf("GetSession: %v\n", err) + s3, err := awsutil.GetS3(sess) + fmt.Printf("GetS3: %v\n", err) + remoteFS := fileaccess.MakeS3Access(s3) + + err = fileaccess.CopyToBucket(remoteFS, "test-files/python", "test-piquant", "Example_jobexecutor_Run_docker_Python", true, l) + fmt.Printf("CopyToBucket: %v\n", err) + + err = r.StartJob(jobGroup, apiCfg, specialUserIds.PIXLISESystemUserId, l) + fmt.Printf("StartJob: %v\n", err) + + // When it's done, we download the output file and print it + fmt.Println("==========") + d, err := remoteFS.ReadObject("test-piquant", "Example_jobexecutor_Run_docker_Python/Output/stdout") + fmt.Printf("stdout (%v):\n----------\n", err) + if err == nil { + fmt.Println(string(d)) + } + fmt.Println("==========") + + d, err = remoteFS.ReadObject("test-piquant", "Example_jobexecutor_Run_docker_Python/Output/py-output.txt") + fmt.Printf("py-output.txt (%v):\n----------\n", err) + if err == nil { + fmt.Println(string(d)) + } + fmt.Println("==========") + + // Output: + // GetJobStarter: + // GetSession: + // GetS3: + // CopyToBucket: + // StartJob: + // ========== + // stdout (): + // ---------- + // Starting test.py + // Contents of /run/Input + // input.csv + // Writing output... + // Finishing test.py + // + // ========== + // py-output.txt (): + // ---------- + // Example output from python + // 2, 7.3 + // The end. + // ========== +} + +func Example_jobexecutor_Run_docker_Lua() { + nodeCfg := job.JobConfig{ + JobId: "Job004", + Command: "lua5.3", + Args: []string{"test.lua", "input.csv"}, + RequiredFiles: []job.JobFilePath{ + {LocalPath: "test.lua", RemoteBucket: "test-piquant", RemotePath: "Example_jobexecutor_Run_docker_Lua/test.lua"}, + {LocalPath: "lua-requirements.txt", RemoteBucket: "test-piquant", RemotePath: "Example_jobexecutor_Run_docker_Lua/lua-requirements.txt"}, + {LocalPath: "Input/input.csv", RemoteBucket: "test-piquant", RemotePath: "Example_jobexecutor_Run_docker_Lua/Input/input.csv"}, + }, + OutputFiles: []job.JobFilePath{ + {LocalPath: "stdout", RemoteBucket: "test-piquant", RemotePath: "Example_jobexecutor_Run_docker_Lua/Output/stdout"}, + {LocalPath: "lua-output.txt", RemoteBucket: "test-piquant", RemotePath: "Example_jobexecutor_Run_docker_Lua/Output/lua-output.txt"}, + }, + } + + jobGroup := JobGroupConfig{ + JobGroupId: "JG001", + DockerImage: dockerImage, + NodeCount: 1, + NodeConfig: nodeCfg, + } + + // cfgJSON, err := json.Marshal(cfg) + // fmt.Printf("cfgErr: %v\n", err) + + r, err := GetJobExecutor("docker") + fmt.Printf("GetJobStarter: %v\n", err) + + l := &logger.StdOutLoggerForTest{} + + apiCfg := config.APIConfig{} + + sess, err := awsutil.GetSession() + fmt.Printf("GetSession: %v\n", err) + s3, err := awsutil.GetS3(sess) + fmt.Printf("GetS3: %v\n", err) + remoteFS := fileaccess.MakeS3Access(s3) + + err = fileaccess.CopyToBucket(remoteFS, "test-files/lua", "test-piquant", "Example_jobexecutor_Run_docker_Lua", true, l) + fmt.Printf("CopyToBucket: %v\n", err) + + err = r.StartJob(jobGroup, apiCfg, specialUserIds.PIXLISESystemUserId, l) + fmt.Printf("StartJob: %v\n", err) + + // When it's done, we download the output file and print it + fmt.Println("==========") + d, err := remoteFS.ReadObject("test-piquant", "Example_jobexecutor_Run_docker_Lua/Output/stdout") + fmt.Printf("stdout (%v):\n----------\n", err) + if err == nil { + fmt.Println(string(d)) + } + fmt.Println("==========") + + d, err = remoteFS.ReadObject("test-piquant", "Example_jobexecutor_Run_docker_Lua/Output/lua-output.txt") + fmt.Printf("lua-output.txt (%v):\n----------\n", err) + if err == nil { + fmt.Println(string(d)) + } + fmt.Println("==========") + + // Output: + // GetJobStarter: + // GetSession: + // GetS3: + // CopyToBucket: + // StartJob: + // ========== + // stdout (): + // ---------- + // Starting test.lua + // Contents of /run/Input + // input.csv + // Writing output... + // Finishing test.lua + // + // ========== + // lua-output.txt (): + // ---------- + // Example output from lua + // 1, 1.6 + // The end. + // ========== +} + +func Example_jobexecutor_Run_docker_Piquant() { + nodeCfg := job.JobConfig{ + JobId: "Job005", + Command: "./Piquant", + Args: []string{"quant", "Config_PIXL_FM_SurfaceOps_Rev1_Jul2021.msa", "Calibrate_Master_ECF_new_BB_01_08_2020.csv", "BulkA.msa", "Fe_K Ca_K Ti_K", "quant.csv"}, + RequiredFiles: []job.JobFilePath{ + {LocalPath: "BulkA.msa", RemoteBucket: "test-piquant", RemotePath: "Example_jobexecutor_Run_docker_Piquant/Input/BulkA.msa"}, + {LocalPath: "Calibrate_Master_ECF_new_BB_01_08_2020.csv", RemoteBucket: "test-piquant", RemotePath: "Example_jobexecutor_Run_docker_Piquant/Input/Calibrate_Master_ECF_new_BB_01_08_2020.csv"}, + {LocalPath: "Config_PIXL_FM_SurfaceOps_Rev1_Jul2021.msa", RemoteBucket: "test-piquant", RemotePath: "Example_jobexecutor_Run_docker_Piquant/Input/Config_PIXL_FM_SurfaceOps_Rev1_Jul2021.msa"}, + }, + OutputFiles: []job.JobFilePath{ + {LocalPath: "stdout", RemoteBucket: "test-piquant", RemotePath: "Example_jobexecutor_Run_docker_Piquant/Output/stdout"}, + {LocalPath: "quant.csv", RemoteBucket: "test-piquant", RemotePath: "Example_jobexecutor_Run_docker_Piquant/Output/quant.csv"}, + }, + } + + jobGroup := JobGroupConfig{ + JobGroupId: "JG001", + DockerImage: dockerImage, + NodeCount: 1, + NodeConfig: nodeCfg, + } + + r, err := GetJobExecutor("docker") + fmt.Printf("GetJobStarter: %v\n", err) + + l := &logger.StdOutLoggerForTest{} + + apiCfg := config.APIConfig{} + + sess, err := awsutil.GetSession() + fmt.Printf("GetSession: %v\n", err) + s3, err := awsutil.GetS3(sess) + fmt.Printf("GetS3: %v\n", err) + remoteFS := fileaccess.MakeS3Access(s3) + + err = fileaccess.CopyToBucket(remoteFS, "test-files/piquant", "test-piquant", "Example_jobexecutor_Run_docker_Piquant", true, l) + fmt.Printf("CopyToBucket: %v\n", err) + + err = r.StartJob(jobGroup, apiCfg, specialUserIds.PIXLISESystemUserId, l) + fmt.Printf("StartJob: %v\n", err) + + // When it's done, we download the output file and print it + fmt.Println("==========") + d, err := remoteFS.ReadObject("test-piquant", "Example_jobexecutor_Run_docker_Piquant/Output/stdout") + fmt.Printf("stdout (%v):\n----------\n", err) + if err == nil { + fmt.Printf("Found element sum: %v\n", strings.Contains(string(d), "Element sum 28.73 %")) + } + fmt.Println("==========") + + d, err = remoteFS.ReadObject("test-piquant", "Example_jobexecutor_Run_docker_Piquant/Output/quant.csv") + fmt.Printf("quant.csv (%v):\n----------\n", err) + if err == nil { + lines := strings.Split(string(d), "\n") + fmt.Printf("%v\n%v\nline 45:\n%v\n", lines[0], lines[1], lines[45]) + } + fmt.Println("==========") + + // Output: + // GetJobStarter: + // GetSession: + // GetS3: + // CopyToBucket: + // StartJob: + // ========== + // stdout (): + // ---------- + // Found element sum: true + // ========== + // quant.csv (): + // ---------- + // PIQUANT 3.2.17-master BulkA.msa + // Energy (keV), meas, calc, bkg, sigma, residual, DetCE, Fe_K, Ti_K, Ca_K, Rh_K_coh, Rh_L_coh, Rh_K_inc, Pileup, Rh_L_coh_Lb1 + // line 45: + // 0.328962, 0, 1.50022e-08, 7.38965e-39, 1.41421, -1.50022e-08, 0, 7.38965e-39, 7.38965e-39, 7.38965e-39, 7.38965e-39, 1.50022e-08, 7.38965e-39, 7.38965e-39, 7.38965e-39 + // ========== +} diff --git a/api/job/jobstarter/jobStarterKubernetes.go b/api/job/executor/kubernetes.go similarity index 88% rename from api/job/jobstarter/jobStarterKubernetes.go rename to api/job/executor/kubernetes.go index eff866f6..86d0604c 100644 --- a/api/job/jobstarter/jobStarterKubernetes.go +++ b/api/job/executor/kubernetes.go @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package jobstarter +package jobexecutor import ( "context" @@ -26,7 +26,7 @@ import ( "time" "github.com/pixlise/core/v4/api/config" - jobrunner "github.com/pixlise/core/v4/api/job/runner" + "github.com/pixlise/core/v4/api/job" "github.com/pixlise/core/v4/core/kubernetes" "github.com/pixlise/core/v4/core/logger" "github.com/pixlise/core/v4/core/utils" @@ -39,14 +39,14 @@ import ( /////////////////////////////////////////////////////////////////////////////////////////// // Runs job in Kubernetes -type kubernetesJobStarter struct { +type kubernetesJobExecutor struct { fatalErrors chan error kubeHelper kubernetes.KubeHelper } // StartJob executes the job in a Kubernetes cluster, creating and monitoring a Kubernetes // Job resource as the parallel job node workers progress -func (r *kubernetesJobStarter) StartJob(jobDockerImage string, jobConfig JobGroupConfig, apiCfg config.APIConfig, requestorUserId string, log logger.ILogger) error { +func (r *kubernetesJobExecutor) StartJob(jobConfig JobGroupConfig, apiCfg config.APIConfig, requestorUserId string, log logger.ILogger) error { jobId := fmt.Sprintf("job-%v", jobConfig.JobGroupId) // Make sure that the kubernetes client is set up @@ -74,7 +74,7 @@ func (r *kubernetesJobStarter) StartJob(jobDockerImage string, jobConfig JobGrou status := make(chan string) // Dispatch as a Kubernetes Job - go r.runJob(jobConfig, jobId, kubeNamespace, svcAcctName, jobDockerImage, requestorUserId, cpu, apiCfg.EnvironmentName, jobConfig.NodeCount, status, apiCfg.QuantNodeMaxRuntimeSec) + go r.runJob(jobConfig, jobId, kubeNamespace, svcAcctName, requestorUserId, cpu, apiCfg.EnvironmentName, jobConfig.NodeCount, status, apiCfg.QuantNodeMaxRuntimeSec) // Wait for all instances to finish log.Infof("Waiting for %v pods...", jobConfig.NodeCount) @@ -109,7 +109,7 @@ func (r *kubernetesJobStarter) StartJob(jobDockerImage string, jobConfig JobGrou // - namespace: a string specifying the namespace in which the job should be created // - requestorUserId: a string specifying the user ID of the requestor // - numPods: an integer specifying the number of pods to create for the job -func makeJobObject(config jobrunner.JobConfig, configStr, dockerImage, jobId, namespace, svcAcctName, requestorUserId, cpuResource, runtimeEnv string, numPods int, jobTTLSec int64) *batchv1.Job { +func makeJobObject(config job.JobConfig, configStr, dockerImage, jobId, namespace, svcAcctName, requestorUserId, cpuResource, runtimeEnv string, numPods int, jobTTLSec int64) *batchv1.Job { imagePullSecret := apiv1.LocalObjectReference{Name: "api-auth"} application := "job-runner" // Used to be piquant-runner name := config.JobId // Used to be piquant-map or piquant-fit (maybe piquant-quant?) @@ -169,7 +169,7 @@ func makeJobObject(config jobrunner.JobConfig, configStr, dockerImage, jobId, na }, Env: []apiv1.EnvVar{ - {Name: jobrunner.JobConfigEnvVar, Value: configStr}, + {Name: job.JobConfigEnvVar, Value: configStr}, {Name: "PYTHONUNBUFFERED", Value: "TRUE"}, /*{Name: "NODE_INDEX", ValueFrom: &apiv1.EnvVarSource{ FieldRef: &apiv1.ObjectFieldSelector{ @@ -185,12 +185,12 @@ func makeJobObject(config jobrunner.JobConfig, configStr, dockerImage, jobId, na } } -func (r *kubernetesJobStarter) getJobStatus(namespace, jobId string) (jobStatus batchv1.JobStatus, err error) { +func (r *kubernetesJobExecutor) getJobStatus(namespace, jobId string) (jobStatus batchv1.JobStatus, err error) { job, err := r.kubeHelper.Clientset.BatchV1().Jobs(namespace).Get(context.Background(), jobId, metav1.GetOptions{}) return job.Status, err } -func (r *kubernetesJobStarter) runJob(jobConfig JobGroupConfig, jobId, namespace, svcAcctName, dockerImage, requestorUserId, cpuResource, runtimeEnv string, count int, status chan string, quantNodeMaxRuntimeSec int32) { +func (r *kubernetesJobExecutor) runJob(jobConfig JobGroupConfig, jobId, namespace, svcAcctName, requestorUserId, cpuResource, runtimeEnv string, count int, status chan string, quantNodeMaxRuntimeSec int32) { defer close(status) // At this point, we're creating a job which will fan out and create multiple nodes (as needed, see count param), so we make sure the job has the same id as @@ -207,7 +207,7 @@ func (r *kubernetesJobStarter) runJob(jobConfig JobGroupConfig, jobId, namespace // Max time job can run for jobTTLSec := int64(quantNodeMaxRuntimeSec) - jobSpec := makeJobObject(jobConfig.NodeConfig, configStr, dockerImage, jobId, namespace, svcAcctName, requestorUserId, cpuResource, runtimeEnv, count, jobTTLSec) + jobSpec := makeJobObject(jobConfig.NodeConfig, configStr, jobConfig.DockerImage, jobId, namespace, svcAcctName, requestorUserId, cpuResource, runtimeEnv, count, jobTTLSec) jobSpecJSON := "" if jobSpecJSONBytes, err := json.MarshalIndent(jobSpec, "", utils.PrettyPrintIndentForJSON); err != nil { diff --git a/api/job/jobstarter/jobStarterNull.go b/api/job/executor/no-op.go similarity index 75% rename from api/job/jobstarter/jobStarterNull.go rename to api/job/executor/no-op.go index 24cd7d6a..c154e328 100644 --- a/api/job/jobstarter/jobStarterNull.go +++ b/api/job/executor/no-op.go @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package jobstarter +package jobexecutor import ( "fmt" @@ -25,16 +25,13 @@ import ( "github.com/pixlise/core/v4/core/logger" "github.com/pixlise/core/v4/api/config" - jobrunner "github.com/pixlise/core/v4/api/job/runner" + "github.com/pixlise/core/v4/api/job" ) -/////////////////////////////////////////////////////////////////////////////////////////// -// nullJobStarter for testing - -type nullJobStarter struct { +type nullJobExecutor struct { } -func (r *nullJobStarter) StartJob(dockerImage string, jobConfig JobGroupConfig, apiConfig config.APIConfig, requestorUserId string, log logger.ILogger) error { +func (r *nullJobExecutor) StartJob(jobConfig JobGroupConfig, apiConfig config.APIConfig, requestorUserId string, log logger.ILogger) error { namespace := fmt.Sprintf("job-%v", jobConfig.NodeConfig.JobId) // Start each container in the namespace @@ -42,7 +39,7 @@ func (r *nullJobStarter) StartJob(dockerImage string, jobConfig JobGroupConfig, for nodeIdx := 0; nodeIdx < jobConfig.NodeCount; nodeIdx++ { wg.Add(1) - go runNullJob(&wg, jobConfig.GetNodeConfig(nodeIdx), namespace, dockerImage, log) + go runNullJob(&wg, jobConfig.GetNodeConfig(nodeIdx), namespace, log) } // Wait for all job instances to finish @@ -53,7 +50,7 @@ func (r *nullJobStarter) StartJob(dockerImage string, jobConfig JobGroupConfig, // This is currently very dumb, we should extend it like the mock s3 backend to mock different failures // to allow us to test failure modes. -func runNullJob(wg *sync.WaitGroup, jobConfig jobrunner.JobConfig, namespace string, dockerImage string, log logger.ILogger) { +func runNullJob(wg *sync.WaitGroup, jobConfig job.JobConfig, namespace string, log logger.ILogger) { defer wg.Done() fmt.Println("Creating pod...") @@ -62,8 +59,6 @@ func runNullJob(wg *sync.WaitGroup, jobConfig jobrunner.JobConfig, namespace str startUnix := time.Now().Unix() maxEndUnix := startUnix + config.KubernetesMaxTimeoutSec for currUnix := time.Now().Unix(); currUnix < maxEndUnix; currUnix = time.Now().Unix() { - // Check kubernetes pod status - for i := 1; i < 5; i++ { log.Infof("NullJob Loop: " + string(rune(i))) } diff --git a/api/job/executor/test-files/lua/Input/input.csv b/api/job/executor/test-files/lua/Input/input.csv new file mode 100644 index 00000000..4f62a1f0 --- /dev/null +++ b/api/job/executor/test-files/lua/Input/input.csv @@ -0,0 +1,5 @@ +pmc, value +1, 1.6 +2, 7.3 +3, 33.1 +6, 12.8 \ No newline at end of file diff --git a/api/job/executor/test-files/lua/lua-requirements.txt b/api/job/executor/test-files/lua/lua-requirements.txt new file mode 100644 index 00000000..46ee1843 --- /dev/null +++ b/api/job/executor/test-files/lua/lua-requirements.txt @@ -0,0 +1 @@ +luafilesystem \ No newline at end of file diff --git a/api/job/executor/test-files/lua/test.lua b/api/job/executor/test-files/lua/test.lua new file mode 100644 index 00000000..1741ab0d --- /dev/null +++ b/api/job/executor/test-files/lua/test.lua @@ -0,0 +1,44 @@ +print("Starting test.lua") + +local lfs = require("lfs") + +-- Get current directory +local current_dir = lfs.currentdir() .. "/Input" + +print("Contents of " .. current_dir) + +-- List all files and directories +for item in lfs.dir(current_dir) do + if item ~= "." and item ~= ".." then + print(item) + end +end + +-- Read from input.csv +local x = "" +local input_path = current_dir .. "/input.csv" +local file = io.open(input_path, "r") + +if file then + file:read("*l") -- skip first line + x = file:read("*l") or "" + file:close() +else + error("Could not open file: " .. input_path) +end + +print("Writing output...") + +-- Write to lua-output.txt +local output = io.open("lua-output.txt", "w") + +if output then + output:write("Example output from lua\n") + output:write(x .. "\n") + output:write("The end.") + output:close() +else + error("Could not open output file") +end + +print("Finishing test.lua") \ No newline at end of file diff --git a/api/job/executor/test-files/piquant/Input/BulkA.msa b/api/job/executor/test-files/piquant/Input/BulkA.msa new file mode 100644 index 00000000..5f9cd058 --- /dev/null +++ b/api/job/executor/test-files/piquant/Input/BulkA.msa @@ -0,0 +1,4125 @@ +#FORMAT : EMSA/MAS spectral data file +#VERSION : TC202v2.0 PIXL +#COMMENT : Generated by SDF_Peek; Git version: V8.1-10-g13832270 +#TITLE : BulkSum_A 2026-063T20:15:57 +##RTT : 0x000001C5 +##PMC : 46 +##DETECTOR_ID: A +#DATE : 04-Mar-2026 +#TIME : 20:15:57 +#OWNER : +#NPOINTS : 4096 +#NCOLUMNS : 1 +#XUNITS : eV +#YUNITS : COUNTS +#DATATYPE : Y +#SIGNALTYPE : XRF +#LIVETIME : 2563.11791992 +#REALTIME : 2580.00000000 +##EVENTS : 12163307 +##TRIGGERS : 17077813 +##OVERFLOWS : 0 +##UNDERFLOWS : 0 +##BASE_EVENTS: 192067356 +##RESETS : 217944 +##OVER_ADCMAX: 73 +#SPECTRUM +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +1 +2 +1 +6 +4 +10 +10 +16 +16 +24 +21 +34 +41 +49 +60 +64 +68 +80 +102 +132 +130 +143 +142 +174 +221 +246 +239 +310 +380 +474 +563 +723 +930 +1197 +1504 +1867 +2448 +2915 +3601 +4276 +5213 +6084 +6919 +7784 +9043 +9803 +10945 +11806 +12580 +13234 +13883 +13711 +13821 +13819 +13502 +12855 +12140 +11151 +10337 +9498 +8549 +7681 +6755 +5881 +5162 +4344 +3756 +3276 +2980 +2655 +2347 +2146 +2056 +1851 +1842 +1740 +1731 +1603 +1563 +1555 +1507 +1468 +1351 +1268 +1206 +1159 +1107 +1020 +908 +831 +770 +708 +672 +640 +582 +535 +516 +507 +481 +482 +499 +509 +501 +488 +566 +523 +536 +598 +563 +609 +642 +644 +631 +706 +724 +721 +704 +834 +891 +898 +897 +913 +978 +944 +1020 +1056 +1075 +1030 +1123 +1131 +1064 +1169 +1175 +1148 +1166 +1206 +1171 +1185 +1168 +1292 +1245 +1211 +1265 +1422 +1422 +1551 +1645 +1854 +2060 +2315 +2633 +3018 +3524 +3945 +4762 +5348 +6515 +7355 +8214 +9920 +11036 +12406 +13764 +15116 +16310 +17689 +18991 +20263 +21171 +21834 +22527 +22793 +22794 +22869 +22675 +22078 +21764 +20902 +20277 +19868 +19384 +18889 +18284 +18085 +17784 +17991 +17879 +17967 +18365 +18460 +18889 +19531 +19872 +20546 +20887 +21385 +22106 +22596 +22766 +23370 +23526 +23316 +23539 +23146 +22482 +22216 +21348 +20353 +18746 +17502 +15988 +15015 +13633 +12220 +10757 +9712 +8513 +7532 +6813 +5956 +5410 +4934 +4699 +4315 +4210 +4063 +3981 +3951 +4071 +3927 +3983 +4189 +4239 +4402 +4475 +4503 +4732 +4641 +4896 +4819 +5085 +5230 +5296 +5291 +5343 +5410 +5431 +5552 +5319 +5329 +4967 +5080 +4725 +4482 +4371 +4042 +3864 +3385 +3334 +2991 +2809 +2617 +2407 +2415 +2352 +2363 +2513 +2584 +3020 +3413 +3916 +4653 +5817 +7076 +8509 +10659 +12790 +15822 +18936 +22716 +26931 +32059 +37495 +43564 +49649 +56234 +63440 +70382 +76905 +83730 +89160 +93943 +98281 +100752 +102924 +102943 +102352 +99823 +96567 +92465 +86916 +80631 +74679 +67796 +59929 +53391 +46698 +39986 +34361 +29241 +24491 +20510 +17103 +14167 +11773 +10276 +8876 +7964 +7426 +7214 +7586 +7674 +8197 +8763 +9482 +10270 +11260 +12179 +12788 +13971 +14923 +15308 +16142 +16327 +16797 +16638 +16725 +16417 +16010 +15394 +14651 +13648 +12866 +11838 +10761 +9795 +8758 +7671 +6810 +5893 +5351 +4684 +4021 +3494 +3117 +2833 +2598 +2331 +2104 +2095 +1962 +1844 +1866 +1786 +1809 +1811 +1846 +1899 +1905 +2059 +2165 +2400 +2530 +2912 +3231 +3681 +4161 +4746 +5505 +6365 +7186 +8347 +9588 +10921 +12750 +14201 +15884 +17905 +19581 +21361 +23127 +24869 +26143 +27582 +28827 +29677 +30219 +29808 +29740 +29544 +28612 +27410 +25948 +24564 +22708 +21050 +19347 +17147 +15442 +13923 +12466 +10715 +9432 +8426 +7307 +6488 +5670 +5078 +4521 +4240 +3761 +3525 +3316 +3128 +3056 +2930 +2953 +2941 +2865 +2969 +3079 +3121 +3376 +3380 +3657 +3919 +4092 +4374 +4755 +4894 +5315 +5582 +5871 +6107 +6400 +6695 +6835 +7093 +7177 +7230 +7193 +7224 +7118 +6880 +6702 +6403 +6133 +5920 +5706 +5144 +4897 +4590 +4313 +4014 +3676 +3455 +3289 +3198 +2892 +2701 +2645 +2491 +2417 +2357 +2396 +2304 +2247 +2247 +2300 +2183 +2206 +2273 +2233 +2253 +2209 +2156 +2333 +2260 +2372 +2289 +2235 +2369 +2422 +2388 +2456 +2425 +2523 +2587 +2570 +2616 +2664 +2665 +2782 +2763 +2890 +2897 +2949 +2968 +3063 +3048 +3047 +2953 +2913 +2879 +2862 +2842 +2804 +2723 +2798 +2659 +2588 +2559 +2428 +2503 +2399 +2328 +2320 +2314 +2232 +2229 +2205 +2203 +2148 +2177 +2149 +2217 +2163 +2111 +2153 +2140 +2211 +2098 +2169 +2208 +2272 +2312 +2285 +2308 +2494 +2441 +2542 +2568 +2679 +2805 +2973 +3089 +3239 +3380 +3690 +3852 +3955 +4114 +4337 +4532 +4632 +4795 +4986 +5031 +5062 +5278 +5314 +5249 +5047 +5046 +5005 +4823 +4690 +4665 +4456 +4135 +4071 +3927 +3674 +3596 +3538 +3253 +3135 +3097 +2983 +2958 +2895 +2874 +2803 +2734 +2897 +3024 +2934 +3135 +3171 +3285 +3554 +4043 +4467 +4971 +5714 +6850 +8073 +9385 +11240 +13414 +16189 +19457 +23182 +27777 +32777 +39020 +45907 +53198 +61792 +70746 +79963 +90558 +101026 +112133 +123132 +133342 +143856 +153600 +161490 +169485 +175977 +179831 +182926 +183248 +182485 +180281 +175261 +170118 +161390 +153367 +144043 +133195 +121928 +110998 +100112 +89272 +78250 +68360 +59047 +51005 +43529 +37206 +30802 +25830 +21467 +17505 +14272 +11724 +9829 +8197 +6645 +5843 +4992 +4358 +3911 +3424 +3287 +3046 +2921 +2745 +2738 +2774 +2601 +2585 +2671 +2583 +2737 +2677 +2712 +2750 +2787 +2875 +2881 +2981 +3229 +3223 +3401 +3689 +3795 +4131 +4470 +4843 +5340 +5812 +6547 +7295 +8189 +9232 +10300 +11273 +12648 +13819 +15399 +16708 +18112 +19904 +21501 +22769 +24671 +25494 +26877 +27782 +28664 +29215 +29568 +29574 +29406 +28518 +27903 +27507 +26246 +24787 +23331 +21819 +20103 +18568 +17039 +15278 +13862 +12231 +10675 +9525 +8478 +7130 +6199 +5518 +4842 +4122 +3699 +3198 +2759 +2562 +2229 +2117 +1988 +1933 +1858 +1713 +1716 +1681 +1697 +1666 +1605 +1594 +1631 +1600 +1656 +1705 +1689 +1648 +1718 +1745 +1676 +1725 +1605 +1719 +1750 +1717 +1645 +1771 +1693 +1739 +1697 +1723 +1648 +1633 +1661 +1742 +1600 +1641 +1633 +1626 +1565 +1596 +1576 +1542 +1498 +1530 +1554 +1541 +1522 +1567 +1523 +1549 +1490 +1552 +1494 +1496 +1485 +1501 +1493 +1494 +1431 +1491 +1515 +1449 +1521 +1493 +1477 +1524 +1447 +1545 +1491 +1539 +1456 +1462 +1519 +1471 +1499 +1543 +1537 +1548 +1477 +1664 +1595 +1580 +1490 +1596 +1517 +1571 +1594 +1591 +1651 +1657 +1628 +1629 +1623 +1650 +1699 +1639 +1573 +1642 +1680 +1585 +1617 +1593 +1649 +1616 +1582 +1556 +1479 +1567 +1563 +1581 +1558 +1488 +1516 +1493 +1531 +1499 +1475 +1493 +1416 +1450 +1501 +1456 +1472 +1353 +1385 +1466 +1457 +1419 +1462 +1416 +1470 +1433 +1395 +1461 +1378 +1443 +1405 +1368 +1427 +1303 +1397 +1348 +1342 +1410 +1374 +1362 +1399 +1424 +1353 +1373 +1406 +1371 +1416 +1449 +1396 +1398 +1383 +1415 +1409 +1448 +1371 +1396 +1455 +1425 +1460 +1454 +1438 +1513 +1438 +1444 +1463 +1386 +1422 +1431 +1403 +1423 +1389 +1342 +1322 +1343 +1387 +1307 +1293 +1289 +1338 +1241 +1286 +1291 +1317 +1283 +1240 +1278 +1262 +1197 +1325 +1198 +1283 +1305 +1258 +1222 +1268 +1204 +1233 +1194 +1229 +1285 +1331 +1193 +1234 +1204 +1180 +1248 +1233 +1258 +1230 +1239 +1203 +1240 +1193 +1141 +1134 +1104 +1152 +1167 +1184 +1192 +1134 +1181 +1169 +1190 +1161 +1101 +1169 +1139 +1162 +1208 +1117 +1156 +1129 +1081 +1118 +1130 +1165 +1152 +1029 +1147 +1078 +1103 +1121 +1084 +1083 +1056 +1080 +1085 +1124 +1158 +1150 +1079 +1084 +1064 +1014 +1054 +1055 +1078 +1007 +1046 +1039 +1043 +991 +1055 +1033 +1056 +1009 +1001 +1015 +998 +1036 +977 +999 +1025 +967 +985 +1002 +987 +1024 +981 +1003 +1057 +960 +988 +943 +1067 +1039 +1049 +1003 +961 +965 +909 +995 +951 +972 +985 +932 +952 +968 +929 +979 +948 +932 +936 +950 +940 +887 +948 +930 +924 +958 +890 +894 +888 +916 +952 +866 +890 +905 +982 +881 +911 +862 +951 +922 +865 +978 +893 +928 +901 +898 +891 +950 +915 +905 +944 +919 +906 +978 +916 +879 +889 +921 +873 +900 +923 +897 +881 +861 +920 +830 +817 +878 +848 +865 +871 +882 +838 +824 +820 +849 +831 +811 +815 +837 +821 +818 +790 +844 +847 +725 +860 +790 +785 +785 +792 +755 +793 +780 +760 +782 +774 +736 +791 +764 +755 +748 +787 +718 +739 +754 +769 +725 +778 +715 +777 +805 +770 +749 +725 +725 +721 +751 +731 +722 +751 +781 +713 +681 +737 +739 +691 +675 +711 +698 +697 +712 +734 +724 +729 +721 +696 +745 +698 +702 +741 +641 +761 +652 +704 +710 +718 +684 +690 +685 +707 +716 +641 +642 +683 +668 +737 +661 +671 +611 +702 +680 +695 +717 +661 +691 +643 +662 +638 +654 +708 +655 +676 +645 +626 +586 +650 +646 +655 +599 +623 +632 +631 +598 +617 +596 +585 +622 +593 +608 +654 +598 +596 +612 +599 +637 +583 +604 +565 +568 +591 +587 +591 +562 +575 +541 +563 +512 +551 +579 +595 +560 +557 +588 +540 +536 +528 +532 +550 +541 +549 +579 +537 +542 +532 +530 +533 +505 +566 +536 +552 +519 +484 +503 +507 +508 +514 +532 +528 +521 +531 +502 +496 +509 +527 +513 +488 +517 +507 +529 +474 +473 +576 +504 +502 +489 +500 +496 +492 +519 +487 +497 +476 +473 +502 +481 +458 +475 +453 +518 +484 +480 +486 +473 +472 +516 +462 +487 +472 +471 +436 +496 +477 +438 +454 +451 +466 +451 +458 +459 +433 +447 +480 +499 +470 +470 +435 +432 +440 +452 +464 +417 +438 +432 +433 +447 +414 +426 +452 +452 +403 +428 +449 +422 +461 +442 +417 +408 +441 +423 +420 +416 +392 +395 +394 +420 +386 +394 +414 +400 +422 +386 +381 +390 +396 +382 +433 +385 +376 +426 +409 +376 +386 +369 +386 +408 +387 +388 +402 +393 +388 +375 +397 +372 +390 +381 +377 +378 +383 +402 +390 +369 +391 +382 +345 +364 +350 +374 +388 +375 +370 +397 +382 +414 +358 +388 +362 +383 +407 +380 +377 +365 +368 +380 +371 +388 +388 +390 +362 +374 +430 +401 +375 +387 +398 +347 +363 +378 +378 +395 +370 +361 +328 +349 +369 +346 +379 +366 +350 +318 +319 +352 +305 +293 +337 +333 +328 +312 +303 +313 +298 +297 +299 +330 +304 +291 +264 +284 +305 +289 +298 +312 +290 +280 +265 +282 +301 +320 +292 +261 +265 +280 +276 +251 +260 +265 +297 +266 +277 +243 +302 +259 +286 +297 +285 +245 +279 +272 +265 +280 +272 +267 +281 +283 +273 +260 +256 +285 +276 +255 +278 +267 +236 +265 +260 +262 +255 +269 +253 +243 +279 +225 +224 +230 +218 +252 +245 +252 +218 +245 +257 +229 +219 +232 +235 +219 +217 +241 +273 +253 +214 +248 +224 +256 +224 +226 +250 +208 +209 +231 +216 +242 +217 +226 +222 +196 +201 +236 +204 +216 +198 +184 +195 +193 +208 +182 +207 +205 +193 +214 +206 +218 +215 +210 +225 +195 +198 +189 +200 +215 +172 +193 +204 +216 +199 +212 +203 +210 +200 +177 +207 +211 +184 +199 +204 +240 +218 +228 +212 +238 +231 +204 +211 +213 +217 +210 +219 +198 +212 +196 +203 +160 +196 +214 +193 +168 +188 +168 +193 +200 +162 +159 +146 +176 +179 +179 +138 +162 +143 +164 +158 +181 +163 +176 +151 +147 +149 +133 +158 +135 +144 +158 +150 +148 +160 +171 +138 +173 +131 +155 +142 +144 +152 +162 +138 +143 +142 +149 +149 +130 +141 +141 +144 +131 +122 +133 +147 +118 +133 +141 +143 +131 +114 +124 +131 +129 +132 +132 +120 +140 +129 +134 +125 +133 +136 +125 +130 +149 +131 +120 +123 +124 +113 +115 +128 +101 +124 +116 +109 +123 +105 +124 +118 +118 +136 +116 +104 +115 +125 +101 +122 +115 +92 +117 +115 +113 +86 +115 +119 +109 +101 +112 +99 +107 +90 +96 +121 +108 +107 +104 +101 +96 +93 +107 +107 +103 +97 +94 +105 +104 +96 +112 +91 +94 +98 +119 +107 +101 +121 +104 +105 +95 +108 +123 +99 +98 +96 +94 +82 +77 +93 +77 +82 +84 +86 +83 +87 +82 +85 +91 +100 +95 +80 +90 +78 +84 +75 +83 +90 +74 +91 +90 +91 +99 +104 +82 +82 +92 +74 +93 +94 +84 +81 +84 +94 +84 +87 +77 +85 +88 +89 +81 +87 +73 +79 +80 +75 +73 +89 +82 +79 +82 +79 +85 +73 +83 +74 +64 +90 +78 +88 +82 +68 +72 +84 +67 +64 +69 +80 +79 +65 +71 +69 +78 +63 +77 +70 +69 +52 +58 +69 +69 +74 +65 +53 +72 +79 +64 +53 +80 +67 +85 +48 +65 +59 +72 +69 +63 +66 +56 +58 +64 +49 +47 +52 +64 +62 +52 +68 +51 +75 +51 +41 +53 +55 +61 +42 +65 +45 +52 +50 +49 +46 +54 +46 +53 +56 +52 +61 +54 +53 +49 +53 +60 +55 +56 +54 +45 +59 +53 +49 +61 +42 +60 +40 +52 +45 +33 +53 +51 +44 +55 +39 +49 +47 +46 +48 +42 +54 +42 +55 +40 +33 +45 +39 +54 +53 +41 +45 +55 +45 +37 +35 +40 +36 +54 +42 +32 +32 +36 +42 +35 +42 +34 +38 +34 +36 +38 +40 +48 +34 +40 +40 +37 +35 +40 +34 +28 +32 +33 +33 +33 +31 +29 +25 +34 +42 +47 +27 +39 +39 +31 +41 +26 +29 +32 +44 +31 +27 +27 +35 +25 +30 +25 +33 +37 +25 +27 +40 +33 +39 +27 +35 +29 +25 +26 +24 +29 +27 +28 +30 +34 +23 +28 +25 +25 +40 +33 +29 +17 +29 +21 +27 +29 +29 +26 +22 +23 +32 +23 +21 +27 +25 +29 +18 +24 +21 +28 +26 +21 +18 +24 +21 +20 +16 +27 +23 +19 +32 +12 +18 +18 +23 +26 +32 +18 +14 +25 +22 +25 +13 +13 +24 +20 +16 +26 +20 +18 +21 +14 +19 +23 +19 +17 +22 +13 +20 +12 +15 +13 +16 +19 +13 +17 +17 +14 +19 +23 +15 +12 +11 +9 +16 +13 +16 +13 +13 +14 +7 +12 +18 +12 +13 +14 +14 +8 +16 +12 +17 +8 +12 +14 +12 +6 +12 +14 +13 +13 +13 +15 +7 +11 +10 +9 +12 +8 +8 +15 +10 +9 +11 +10 +14 +5 +12 +12 +9 +6 +13 +17 +9 +9 +8 +13 +14 +11 +10 +7 +7 +10 +7 +8 +8 +9 +13 +7 +7 +12 +8 +4 +2 +6 +5 +6 +11 +9 +3 +1 +7 +9 +5 +5 +7 +5 +5 +5 +10 +5 +1 +2 +6 +8 +2 +2 +2 +6 +2 +7 +2 +8 +6 +5 +7 +4 +4 +8 +4 +7 +4 +7 +6 +5 +5 +6 +5 +2 +5 +6 +2 +5 +6 +3 +2 +1 +9 +1 +3 +5 +5 +4 +4 +2 +5 +4 +1 +3 +1 +3 +6 +3 +3 +6 +4 +2 +1 +2 +2 +3 +7 +2 +1 +4 +8 +1 +0 +2 +1 +3 +3 +3 +3 +1 +3 +4 +2 +1 +3 +6 +3 +2 +1 +4 +4 +1 +3 +4 +2 +2 +1 +2 +3 +1 +3 +7 +1 +1 +1 +3 +3 +0 +3 +2 +2 +0 +0 +5 +2 +3 +1 +1 +0 +2 +1 +2 +3 +3 +2 +4 +1 +0 +1 +2 +1 +2 +3 +2 +1 +2 +1 +0 +4 +0 +0 +2 +1 +1 +1 +1 +1 +1 +0 +0 +1 +2 +0 +1 +2 +1 +1 +0 +1 +1 +1 +1 +0 +2 +0 +3 +0 +0 +2 +0 +1 +0 +0 +0 +0 +0 +1 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +1 +0 +0 +0 +0 +2 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +1 +2 +1 +0 +1 +0 +2 +0 +1 +2 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +1 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +1 +0 +1 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +0 +0 +1 +0 +1 +1 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +1 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +1 +0 +1 +0 +0 +0 +1 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +#ENDOFDATA end of spectrum data + + diff --git a/api/job/executor/test-files/piquant/Input/Calibrate_Master_ECF_new_BB_01_08_2020.csv b/api/job/executor/test-files/piquant/Input/Calibrate_Master_ECF_new_BB_01_08_2020.csv new file mode 100755 index 00000000..e265a6c5 --- /dev/null +++ b/api/job/executor/test-files/piquant/Input/Calibrate_Master_ECF_new_BB_01_08_2020.csv @@ -0,0 +1,142 @@ +PIQUANT, Calibration File, written, 2020-04-17 15:52:59 +Element, Emission line, Fit qualifier, Type, Percent, Uncertainty, Oxide ratio, Weight, ECF, ECF Sigma, Intensity, Atomic number +COMMENT, Standards Input File for PIQUANT +STANDARD, BHVO-2, Basalt Hawaiian Volcanic Observatory, , , , , +Al, , , el, 7.1700%, 0.2%, 1.5, 1.00, 0.7399, 0.1%, 901642.9, 13 +Ca, , , el, 8.1800%, 0.2%, 1.0, 1.00, 0.9195, 0.0%, 25583526.0, 20 +Fe, , , el, 8.3700%, 0.6%, 1.5, 1.00, 1.0058, 0.0%, 56115944.0, 26 +K, , , el, 0.4300%, 0.0%, 0.5, 1.00, 0.8431, 0.1%, 832953.9, 19 +Mg, , , el, 4.3600%, 0.2%, 1.0, 1.00, 0.5113, 0.3%, 122743.5, 12 +Na, , , el, 1.6200%, 0.1%, 0.5, 1.00, 0.0000, 0.0%, -719.2, 11 +P, , , el, 0.1200%, 0.0%, 2.5, 1.00, 0.5425, 1.2%, 35373.7, 15 +Si, , , el, 23.3000%, 0.4%, 2.0, 1.00, 0.8032, 0.0%, 7555943.5, 14 +Ti, , , el, 1.6500%, 0.1%, 2.0, 1.00, 0.9445, 0.0%, 7232161.5, 22 +Ba, , , el, 0.0100%, 0.0%, 0.0, 1.00, 3.1357, 3.0%, 76636.5, 56 +Ce, , M, el, 0.0000%, 0.0%, 0.0 +Cr, , , el, 0.0300%, 0.0%, 0.0, 1.00, 1.1634, 0.4%, 220707.1, 24 +Dy, , M, el, 0.0000%, 0.0%, 0.0 +Er, , M, el, 0.0000%, 0.0%, 0.0 +Eu, , M, el, 0.0000%, 0.0%, 0.0 +Ga, , M, el, 0.0000%, 0.0%, 0.0 +Gd, , M, el, 0.0000%, 0.0%, 0.0 +La, , M, el, 0.0000%, 0.0%, 0.0 +Lu, , M, el, 0.0000%, 0.0%, 0.0 +Nb, , M, el, 0.0000%, 0.0%, 0.0 +Nd, , M, el, 0.0000%, 0.0%, 0.0 +Ni, , , el, 0.0100%, 0.0%, 0.0, 1.00, 1.6859, 0.9%, 87257.9, 28 +Rb, , M, el, 0.0000%, 0.0%, 0.0 +Sc, , M, el, 0.0000%, 0.0%, 0.0 +Sm, , M, el, 0.0000%, 0.0%, 0.0 +Sr, , , el, 0.0400%, 0.0%, 0.0, 1.00, 1.1898, 1.6%, 25618.8, 38 +Th, , M, el, 0.0000%, 0.0%, 0.0 +Tm, , M, el, 0.0000%, 0.0%, 0.0 +U, , M, el, 0.0000%, 0.0%, 0.0 +V, , , el, 0.0300%, 0.0%, 0.0, 1.00, 0.7396, 1.3%, 117503.6, 23 +Y, , M, el, 0.0000%, 0.0%, 0.0 +Yb, , M, el, 0.0000%, 0.0%, 0.0 +Zn, , , el, 0.0100%, 0.0%, 0.0, 1.00, 0.7958, 2.2%, 33306.5, 30 +Be, , M, el, 0.0000%, 0.0%, 0.0 +Co, , M, el, 0.0000%, 0.0%, 0.0 +Ge, , M, el, 0.0000%, 0.0%, 0.0 +Ho, , M, el, 0.0000%, 0.0%, 0.0 +Li, , M, el, 0.0000%, 0.0%, 0.0 +Mn, , , el, 0.1300%, 0.0%, 0.0, 1.00, 0.9132, 0.2%, 774575.3, 25 +Mo, , M, el, 0.0000%, 0.0%, 0.0 +Pb, , M, el, 0.0000%, 0.0%, 0.0 +Sb, , M, el, 0.0000%, 0.0%, 0.0 +Tb, , M, el, 0.0000%, 0.0%, 0.0 +Zr, , , el, 0.0200%, 0.0%, 0.0, 1.00, 0.7740, 7.2%, 4128.2, 40 +Ar, , I, +SPECTRUM, C:/PIQUANT_GUI/PIQUANT_V243_Win_Jul2019/New_BB_calibration_2019/2019_breadboard_files_for_PIXLISE_04_16_2020/Calibration_box_BHVO-2G_28kV_230uA_03_28_2019_bulk_sum.msa + +STANDARD, BCR-2, Basalt, Columbia River, , , , , +Al, , , el, 7.1400%, 1.4%, 1.5, 1.00, 1.0021, 0.1%, 1237437.8, 13 +Ca, , , el, 5.0900%, 1.6%, 1.0, 1.00, 0.9408, 0.0%, 15831578.0, 20 +Fe, , , el, 9.6500%, 1.6%, 1.5, 1.00, 0.9855, 0.0%, 65405456.0, 26 +K, , , el, 1.4900%, 2.7%, 0.5, 1.00, 0.9435, 0.1%, 3155778.0, 19 +Mg, , , el, 2.1600%, 1.4%, 1.0, 1.00, 0.7146, 0.4%, 82808.0, 12 +Na, , , el, 2.3400%, 3.4%, 0.5, 1.00, 0.2518, 4.7%, 5779.1, 11 +P, , , el, 0.1500%, 6.7%, 2.5, 1.00, 0.7672, 0.7%, 61037.4, 15 +Si, , , el, 25.3000%, 1.6%, 2.0, 1.00, 1.0202, 0.0%, 10528604.0, 14 +Ti, , , el, 1.3500%, 2.2%, 2.0, 1.00, 0.9754, 0.0%, 6441560.5, 22 +Ba, , , el, 0.0683%, 4.1%, 0.0, 1.00, 0.9136, 1.5%, 159422.7, 56 +Ce, , X, el, 0.0053%, 3.8%, 0.0 +Co, , X, el, 0.0037%, 8.1%, 0.0 +Cr, , X, el, 0.0018%, 11.1%, 0.0 +Eu, , X, el, 0.0002%, 5.0%, 0.0 +Ga, , X, el, 0.0023%, 8.7%, 0.0 +Gd, , X, el, 0.0007%, 4.4%, 0.0 +La, , X, el, 0.0025%, 4.0%, 0.0 +Mn, , , el, 0.1520%, 3.9%, 0.0, 1.00, 0.9440, 0.1%, 976772.9, 25 +Mo, , , el, 0.0248%, 6.9%, 0.0, 1.00, 1.4227, 4.9%, 4442.2, 42 +Nd, , X, el, 0.0028%, 7.1%, 0.0 +Rb, , , el, 0.0048%, 4.2%, 0.0, 1.00, 3.8158, 3.1%, 13652.7, 37 +Sc, , X, el, 0.0033%, 6.1%, 0.0 +Sr, , , el, 0.0346%, 4.0%, 0.0, 1.00, 1.2738, 1.7%, 23374.8, 38 +Th, , X, el, 0.0006%, 11.3%, 0.0 +U, , X, el, 0.0002%, 11.2%, 0.0 +V, , , el, 0.0416%, 3.4%, 0.0, 1.00, 0.8733, 0.7%, 201421.7, 23 +Y, , X, el, 0.0037%, 5.4%, 0.0 +Yb, , X, el, 0.0003%, 5.7%, 0.0 +Zn, , , el, 0.0127%, 7.1%, 0.0, 1.00, 0.9803, 1.4%, 51513.4, 30 +Zr, , , el, 0.0188%, 8.5%, 0.0, 1.00, 1.1318, 5.3%, 5584.4, 40 +Cs, , X, el, 0.0001%, 9.1%, 0.0 +Cu, , X, el, 0.0019%, 10.5%, 0.0 +F, , X, el, 0.0440%, 0.0%, 0.0 +Hf, , X, el, 0.0005%, 4.2%, 0.0 +Ho, , X, el, 0.0001%, 4.5%, 0.0 +Li, , X, el, 0.0009%, 22.2%, 0.0 +Lu, , X, el, 0.0001%, 3.9%, 0.0 +Pb, , X, el, 0.0011%, 18.2%, 0.0 +Pr, , X, el, 0.0007%, 4.4%, 0.0 +Sm, , X, el, 0.0007%, 4.5%, 0.0 +Tb, , X, el, 0.0001%, 3.7%, 0.0 +Tm, , X, el, 0.0001%, 0.0%, 0.0 +Ar, , I, +SPECTRUM, C:/PIQUANT_GUI/PIQUANT_V243_Win_Jul2019/New_BB_calibration_2019/2019_breadboard_files_for_PIXLISE_04_16_2020/Calibration_box_BCR-2G_28kV_230uA_03_28_2019_bulk_sum.msa + +STANDARD, BIR1-G, Basalt, , , , , +Si, , , el, 22.4200%, 0.8%, 2.0, 1.00, 1.0517, 0.0%, 9272510.0, 14 +Al, , , el, 8.2000%, 1.8%, 1.5, 1.00, 1.0217, 0.1%, 1404914.0, 13 +Ca, , , el, 9.5100%, 1.3%, 1.0, 1.00, 0.9694, 0.0%, 31497420.0, 20 +Mg, , , el, 5.8500%, 1.4%, 1.0, 1.00, 0.7883, 0.2%, 258586.0, 12 +Fe, , , el, 7.9000%, 1.5%, 1.5, 1.00, 0.9968, 0.0%, 53395732.0, 26 +Na, , , el, 1.3500%, 3.3%, 0.5, 1.00, 0.0344, 84.1%, 468.8, 11 +K, , , el, 0.0300%, 10.0%, 0.5, 1.00, 0.0095, 77.8%, 614.6, 19 +Mn, , , el, 0.1400%, 2.1%, 1.0, 1.00, 0.8932, 0.2%, 828102.3, 25 +P, , , el, 0.0100%, 10.0%, 2.5, 1.00, 0.0000, 0.0%, -4181.5, 15 +Ti, , , el, 0.5800%, 1.7%, 2.0, 1.00, 0.9875, 0.1%, 2614033.2, 22 +Cu, , , el, 0.0125%, 3.2%, 0.0, 1.00, 0.9735, 1.3%, 57885.5, 29 +Dy, , X, el, 0.0004%, 25.0%, 0.0 +Ce, , X, el, 0.0002%, 21.1%, 0.0 +Co, , X, el, 0.0052%, 3.8%, 0.0 +Cr, , , el, 0.0370%, 2.2%, 0.0, 1.00, 1.2370, 0.3%, 293562.8, 24 +Eu, , X, el, 0.0000%, 10.0%, 0.0 +Gd, , X, el, 0.0002%, 22.2%, 0.0 +Hf, , X, el, 0.0001%, 13.3%, 0.0 +Nd, , X, el, 0.0002%, 28.0%, 0.0 +Ni, , , el, 0.0170%, 3.5%, 0.0, 1.00, 1.3288, 0.7%, 120189.8, 28 +La, , X, el, 0.0001%, 11.1%, 0.0 +Li, , X, el, 0.0004%, 5.6%, 0.0 +Sc, , X, el, 0.0044%, 2.3%, 0.0 +Sr, , , el, 0.0110%, 1.8%, 0.0, 1.00, 0.8011, 7.6%, 4893.0, 38 +V, , , el, 0.0310%, 3.5%, 0.0, 1.00, 0.9418, 0.7%, 152931.0, 23 +Y, , , el, 0.0016%, 6.2%, 0.0, 0.00, 0.0000, 0.0%, -2318.6, 39 +Yb, , X, el, 0.0002%, 5.9%, 0.0 +Zn, , , el, 0.0070%, 12.9%, 0.0, 1.00, 0.8102, 3.0%, 24414.9, 30 +Zr, , , el, 0.0018%, 5.6%, 0.0, 1.00, 0.0000, 0.0%, -2276.5, 40 +As, , X, el, 0.0000%, 0.0%, 0.0 +B, , X, el, 0.0000%, 0.0%, 0.0 +Ba, , X, el, 0.0007%, 0.0%, 0.0 +Be, , X, el, 0.0001%, 0.0%, 0.0 +Cl, , , el, 0.0026%, 0.0%, 0.0, 1.00, 32.9674, 1.1%, 116408.8, 17 +F, , X, el, 0.0044%, 0.0%, 0.0 +Ga, , X, el, 0.0016%, 0.0%, 0.0 +Lu, , X, el, 0.0000%, 0.0%, 0.0 +Nb, , X, el, 0.0001%, 0.0%, 0.0 +Pb, , X, el, 0.0003%, 0.0%, 0.0 +Sb, , X, el, 0.0001%, 0.0%, 0.0 +Sm, , X, el, 0.0001%, 0.0%, 0.0 +Ar, , I, +SPECTRUM, C:/PIQUANT_GUI/PIQUANT_V243_Win_Jul2019/New_BB_calibration_2019/2019_breadboard_files_for_PIXLISE_04_16_2020/Calibration_box_BIR-1G_28kV_230uA_03_28_2019_bulk_sum.msa + diff --git a/api/job/executor/test-files/piquant/Input/Config_PIXL_FM_SurfaceOps_Rev1_Jul2021.msa b/api/job/executor/test-files/piquant/Input/Config_PIXL_FM_SurfaceOps_Rev1_Jul2021.msa new file mode 100644 index 00000000..261bee9a --- /dev/null +++ b/api/job/executor/test-files/piquant/Input/Config_PIXL_FM_SurfaceOps_Rev1_Jul2021.msa @@ -0,0 +1,60 @@ +#FORMAT : EMSA/MAS spectral data file +#VERSION : TC202v2.0 PIXL + +#TITLE : Configuration file for PIXl FM Elemantal Calibration with PIQUANT June 11, 2021 +#COMMENT : For use with calibration file Calibration_PIXL_FM_SurfaceOps_5minECFs_Jun2021.csv +#COMMENT : Copied from configuration file dated Apr. 8, 2021 File name Config_PIXL_FM_UnityECFs_Apr2021.csv +#COMMENT : Using Teflon spectra from DiodeRework_FM_Thermal_data_Jan2020 +#COMMENT : Taken with PIXL FM at various HVMM temperatures on Teflon puck in Thermal Vac target (or cal target?) +#COMMENT : Based on configuration file for Elemental Calibration of PIXL Flight Model Sensor Assembly May2019 +#COMMENT : Changed electron inc angle to 60 deg and takeoff angle to 30 deg, +#COMMENT : per Moxtek drawing "TSP141119-03 Target Assembly Machined REV B.PDF", from Douglas just now +#COMMENT : Changed X-ray tube Be window thickness to 152.4 um per info from Douglas Dawson via Chris Heirwegh +#COMMENT : Changed ##MINIMUM_EN from 900 to 810 to match lower end of measured spectrum +#DATE : 10-JUL-2021 Date and time this file was last updated +#TIME : 13:11 +#OWNER : PIXL FM +#NPOINTS : 0 This should be zero for configuration only files +#NCOLUMNS : 1 This must match the number of values in XPERCHAN, OFFSET, LIVETIME, and data columns +#XUNITS : eV +#YUNITS : COUNTS +#DATATYPE : YY (This would be YY for two +#COMMENT : Energy calibration is a compromise between Det A and Det B, from BHVO in el cal (not cal target puck) +#XPERCHAN : 7.97442 eV per channel, will be used if the spectrum file is not calibrated +#OFFSET : -17.7161 eV of first channel, will be used if the spectrum file is not calibrated +##MINIMUM_EN : 810 minimum energy in eV to begin fitting +#SIGNALTYPE : XRF +##ANODE : 45 Atomic number of anode in X-ray tube +#BEAMKV : 28.00 X-ray tube voltage in kilovolts +##TUBEINCANG : 60.00 X-ray tube electron incident angle in degrees +##TUBETAKEOF : 30.0 X-ray tube takeoff angle in degrees (negative for transmission anode) +#COMMENT : 127 um (5 mil) on the tube and 25.4 um (1 mil) at the end of the optic. So, 152.4 um total. +#COMMENT : From: Dawson, Douglas E (386D) Sent: Thursday, May 31, 2018 11:59 AM To: Heirwegh, Christopher M (3225); Wade, Lawrence A (382A) +##TUBEWINDOW : 0.1524 X-ray tube Be window thickness in mm +#EMISSION : 20 X-ray tube emission current in microamps +##FILTERZ : 1 Primary beam filter material - atomic number of metal foil +##FILTERTH : 0 Primary beam filter thickness +#COMMENT : Optic 8 is new value for PIXL FM from Elemental Calibration data, Apr. 2021 (with unity ECFs and corrected Be window thickness) +##OPTICFILE : 8 +#COMMENT : INCSR adjusted to make ECF average unity during calibration Cal_4glassesScapolite_ChrisHstds_1kppm_Optic7_Nov2020 +##INCSR : 0.1095 Solid angle from source in steradians (can include normalization for optic file) +##INCANGLE : 90.00 Incident angle of primary X-ray beam in degrees (90 is normal incidence) +#ELEVANGLE : 70.00 Elevation angle of detector, in degrees (90 is normal to surface) +#AZIMANGLE : 180.0 Azimuth angle between incident beam plane and detected beam plane +#COMMENT : Geometry is calculated in Beam Geometry Tool to correct for target distance difference from nominal standoff +##GEOMETRY : 1.0 Geometric correction factor - must be unity for nominal standoff +#COMMENT : Detector solid angle estimated from drawing 20181002 Coord Frames 10464005_A1_PIXL_LYT_20181002_851.pdf +#SOLIDANGLE : 0.027283 Solid angle collected by the detector in steradians +#COMMENT : SDBEW = Silicon Drift Detector with beryllium window +#EDSDET : SDBEW Type of XRF detector (SDBEW, SIBEW, CDBEW, or GEBEW, for SDD, Si_PIN, CdTe, or Ge) +#TBEWIND : 0.0017 Thickness of Be window on detector in cm +#TACTLYR : 0.05 Thickness of active layer of detector in cm +#COMMENT : Detector energy resolution from above energy calibration file +##DETRES : 155 Detector energy resolution in eV (at 5.9 keV, Mn Ka emission line) +##ATMOSPHERE : Mars Atmosphere in X-ray beam path, can be Vac, He, Mars, Earth, Air +#COMMENT : Incident beam path includes optic +##PATHINCLEN : 10.3 Length of incident beam path in cm +##PATHEMGLEN : 3.316 Length of emerging beam path in cm +##WINDOWTYPE : None Type of window between instrument and specimen (None, B4C, Plastic, Zr, Al, Nylon, or Al2O3) +##WINDOWTH : 0.00 Thickness of above window in cm (0 = No window) +#LIVETIME : 1 true live time (corrected for count throughput) - only used for calculations diff --git a/api/job/executor/test-files/python/Input/input.csv b/api/job/executor/test-files/python/Input/input.csv new file mode 100644 index 00000000..4f62a1f0 --- /dev/null +++ b/api/job/executor/test-files/python/Input/input.csv @@ -0,0 +1,5 @@ +pmc, value +1, 1.6 +2, 7.3 +3, 33.1 +6, 12.8 \ No newline at end of file diff --git a/api/job/executor/test-files/python/requirements.txt b/api/job/executor/test-files/python/requirements.txt new file mode 100644 index 00000000..24ce15ab --- /dev/null +++ b/api/job/executor/test-files/python/requirements.txt @@ -0,0 +1 @@ +numpy diff --git a/api/job/executor/test-files/python/test.py b/api/job/executor/test-files/python/test.py new file mode 100644 index 00000000..702dd24f --- /dev/null +++ b/api/job/executor/test-files/python/test.py @@ -0,0 +1,33 @@ +print("Starting test.py") + +import os +import numpy as np + +# Get current directory +current_dir = os.getcwd()+"/Input" + +# List all files and directories +items = os.listdir(current_dir) + +print("Contents of", current_dir) +for item in items: + print(item) + +# x = "" +# with open(current_dir+"/input.csv", "r", encoding="utf-8") as f: +# f.readline() +# x = f.readline() + +arr = np.loadtxt(current_dir+"/input.csv", delimiter=",", dtype=str) +x = arr[2,1] + +print("Writing output...") + +with open("py-output.txt", "w", encoding="utf-8") as f: + f.write("Example output from python\n") + f.write(arr[2,0]) + f.write(", ") + f.write(arr[2,1]) + f.write("\nThe end.") + +print("Finishing test.py") diff --git a/api/job/jobstarter/jobStarterDocker.go b/api/job/jobstarter/jobStarterDocker.go deleted file mode 100644 index 67bd91a3..00000000 --- a/api/job/jobstarter/jobStarterDocker.go +++ /dev/null @@ -1,94 +0,0 @@ -// Licensed to NASA JPL under one or more contributor -// license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright -// ownership. NASA JPL licenses this file to you under -// the Apache License, Version 2.0 (the "License"); you may -// not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -package jobstarter - -import ( - "encoding/json" - "errors" - "fmt" - "os" - "os/exec" - "sync" - - "github.com/pixlise/core/v4/api/config" - jobrunner "github.com/pixlise/core/v4/api/job/runner" - "github.com/pixlise/core/v4/core/logger" -) - -/////////////////////////////////////////////////////////////////////////////////////////// -// Runs job locally in Docker - -type dockerJobStarter struct { -} - -func runDockerInstance(wg *sync.WaitGroup, config jobrunner.JobConfig, dockerImage string, log logger.ILogger) { - defer wg.Done() - - // Make a JSON string out of params so it can be passed in - configJSON, err := json.Marshal(config) - if err != nil { - log.Errorf("Error serialising config for docker instance: %v", err) - return - } - configStr := string(configJSON) - - // Start up docker, give it env vars for AWS access - // and our JSON param blob too - cmd := exec.Command(dockerCommand, - "run", - "--rm", - "-e", "AWS_ACCESS_KEY_ID="+os.Getenv("AWS_ACCESS_KEY_ID"), - "-e", "AWS_SECRET_ACCESS_KEY="+os.Getenv("AWS_SECRET_ACCESS_KEY"), - "-e", "AWS_DEFAULT_REGION="+os.Getenv("AWS_DEFAULT_REGION"), - "-e", fmt.Sprintf("%v=%v", jobrunner.JobConfigEnvVar, configStr), - dockerImage, - // <-- Assumed that the runner is the default command and it will pick up what to do from the config env var - ) - - out, err := cmd.CombinedOutput() - if err != nil { - log.Infof("Running job %v in docker failed: %v\n", config.JobId, err) - log.Infof(string(out)) - return - } - - log.Infof("Job %v ran successfully:\n", config.JobId) - log.Infof(string(out)) -} - -func (r *dockerJobStarter) StartJob(jobDockerImage string, jobConfig JobGroupConfig, apiCfg config.APIConfig, requestorUserId string, log logger.ILogger) error { - // Here we start multiple instances of docker and wait for them all to finish using the WaitGroup - var wg sync.WaitGroup - - // Make sure AWS env vars are available, because that's what we'll be passing to job docker container - if len(os.Getenv("AWS_ACCESS_KEY_ID")) <= 0 || len(os.Getenv("AWS_SECRET_ACCESS_KEY")) <= 0 || len(os.Getenv("AWS_DEFAULT_REGION")) <= 0 { - txt := "No AWS environment variables defined" - log.Errorf(txt) - return errors.New(txt) - } - - for nodeIdx := 0; nodeIdx < jobConfig.NodeCount; nodeIdx++ { - wg.Add(1) - go runDockerInstance(&wg, jobConfig.GetNodeConfig(nodeIdx), jobDockerImage, log) - } - - // Wait for all nodes to finish - wg.Wait() - - return nil -} diff --git a/api/job/jobstarter/localDockerCmd_other.go b/api/job/jobstarter/localDockerCmd_other.go deleted file mode 100644 index 389a65a5..00000000 --- a/api/job/jobstarter/localDockerCmd_other.go +++ /dev/null @@ -1,5 +0,0 @@ -//go:build !windows - -package jobstarter - -var dockerCommand = "/usr/local/bin/docker" diff --git a/api/job/jobstarter/localDockerCmd_windows.go b/api/job/jobstarter/localDockerCmd_windows.go deleted file mode 100644 index 4da6ffcd..00000000 --- a/api/job/jobstarter/localDockerCmd_windows.go +++ /dev/null @@ -1,3 +0,0 @@ -package jobstarter - -var dockerCommand = "docker" diff --git a/api/job/runner/runner.go b/api/job/runner/runner.go deleted file mode 100644 index 06304f37..00000000 --- a/api/job/runner/runner.go +++ /dev/null @@ -1,621 +0,0 @@ -package jobrunner - -import ( - "encoding/json" - "fmt" - "os" - "os/exec" - "path/filepath" - "strings" - "time" - - "github.com/pixlise/core/v4/core/awsutil" - "github.com/pixlise/core/v4/core/fileaccess" - "github.com/pixlise/core/v4/core/logger" -) - -// This just sits in the "job" package, but maybe should be it's own thing. The rest of "job" is for API-side monitoring of job completion, but this is the actual -// job runner wrapper. -// Jobs are data processing tasks executed by a Docker node. They have input files, output files and a command to run. This code manages the job run and expects -// to be run in docker outside of the API. We don't assume access to Mongo either! The container should have access to S3, cloudwatch and of course env variables! - -type JobFilePath struct { - // The remote file info - RemoteBucket string - RemotePath string - - // Local copy - LocalPath string -} - -type JobConfig struct { - // The job id - JobId string - - // Logging method - If these are empty, we just log to stdout - // LogCloudwatchGroup string - // LogCloudwatchStream string - - // What files are required to be present when running the job? - RequiredFiles []JobFilePath - - // What command to execute - Command string - Args []string - - // What to upload on completion (if file doesn't exist, it can be ignored with a warning) - OutputFiles []JobFilePath -} - -func (c JobConfig) Copy() JobConfig { - newCfg := JobConfig{ - JobId: c.JobId, - RequiredFiles: []JobFilePath{}, - Command: c.Command, - Args: c.Args, - OutputFiles: c.OutputFiles, - } - - copy(newCfg.RequiredFiles, c.RequiredFiles) - copy(newCfg.OutputFiles, c.OutputFiles) - return newCfg -} - -func logJobPrep(cfgStr string, cfg JobConfig, jobLog logger.ILogger) { - jobLog.Infof("Preparing job: %v\nConfig: %+v", cfg.JobId, cfgStr) - jobLog.Infof("Job config struct: %#v", cfg) -} - -var NoOpCommand = "noop" -var JobConfigEnvVar = "JOB_CONFIG" - -// Downloads files required for job to run. These are read from an env var -// Parameters: -// - logWD should be false for testing - we don't want to log the working dir if we're running -// as a test because it may differ on different machines and fail the test... -func RunJob(logWD bool) error { - // Get the config from env var - cfgStr := os.Getenv(JobConfigEnvVar) - - if len(cfgStr) <= 0 { - return fmt.Errorf("%v env var not set", JobConfigEnvVar) - } - - var cfg JobConfig - err := json.Unmarshal([]byte(cfgStr), &cfg) - if err != nil { - return fmt.Errorf("Failed to parse env var %v: %v", JobConfigEnvVar, err) - } - - sess, err := awsutil.GetSession() - if err != nil { - return fmt.Errorf("Failed to create AWS session. Error: %v", err) - } - - // Init logger - this used to be local=stdout, cloud env=cloudwatch, but we now write all logs to stdout - var jobLog logger.ILogger - - // if len(cfg.LogCloudwatchGroup) > 0 && len(cfg.LogCloudwatchStream) > 0 { - // cwlog, err := logger.InitCloudWatchLogger( - // sess, - // cfg.LogCloudwatchGroup, - // cfg.LogCloudwatchStream, - // logger.LogDebug, - // 30, - // 5, - // ) - - // if err == nil { - // jobLog = cwlog - // } else { - // jobLog = logger.StdOutLogger{} - // jobLog.Errorf("Failed to create cloudwatch logger, logging to stdout") - // } - // } else { - jobLog = &logger.StdOutLogger{} - //} - - logJobPrep(cfgStr, cfg, jobLog) - - // Validate - if len(cfg.Command) <= 0 { - return fmt.Errorf("No command specified") - } - - // Init AWS stuff - jobLog.Infof("AWS S3 setup...") - - s3svc, err := awsutil.GetS3(sess) - if err != nil { - return fmt.Errorf("Failed to create AWS S3 service. Error: %v", err) - } - - remoteFS := fileaccess.MakeS3Access(s3svc) - - // Download required files - jobLog.Infof("Downloading files...") - for _, reqFile := range cfg.RequiredFiles { - err := downloadFile(jobLog, remoteFS, reqFile.RemoteBucket, reqFile.RemotePath, reqFile.LocalPath, logWD) - if err != nil { - return err - } - } - - // Run the actual job - jobLog.Debugf("exec.Command starting \"%v\", args: [%v]", cfg.Command, strings.Join(cfg.Args, ",")) - - // We support the concept of a "no-op" command only for testing - because tests can run on different platforms - // we want to be able to write tests that don't actually run a command, this area is very OS specific... - // This way we can just test the file download and upload capabilities separately - startUnixSec := time.Now().Unix() - - var cmdStdOut []byte - if cfg.Command != NoOpCommand { - cmd := exec.Command(cfg.Command, cfg.Args...) - - // Save output text - cmdStdOut, err = cmd.CombinedOutput() - if err != nil { - outErr := fmt.Errorf("Job %v failed: %v", cfg.JobId, err) - jobLog.Errorf("%v", outErr) - jobLog.Infof(string(cmdStdOut)) - - return outErr - } - } - - runTimeUnixSec := time.Now().Unix() - startUnixSec - jobLog.Infof("Job %v runtime was %v sec", cfg.JobId, runTimeUnixSec) - - // Upload output files required, error if not found - failedOutputFiles := []string{} - for _, outputFile := range cfg.OutputFiles { - if outputFile.LocalPath == "stdout" { - // "Special" file, we just output the stdout of running the command - err = remoteFS.WriteObject(outputFile.RemoteBucket, outputFile.RemotePath, []byte(cmdStdOut)) - if err != nil { - jobLog.Errorf("Failed to upload stdout log to s3://%v/%v: %v", outputFile.RemoteBucket, outputFile.RemotePath, err) - } else { - jobLog.Infof("Uploaded stdout log to: s3://%v/%v", outputFile.RemoteBucket, outputFile.RemotePath) - } - } else { - _, err := os.Stat(outputFile.LocalPath) - if err != nil { - jobLog.Errorf("Job %v did not generate expected output file: %v", cfg.JobId, outputFile.LocalPath) - failedOutputFiles = append(failedOutputFiles, outputFile.LocalPath) - } else { - err := uploadFile(jobLog, remoteFS, outputFile.LocalPath, outputFile.RemoteBucket, outputFile.RemotePath) - if err != nil { - jobLog.Errorf("Job %v failed to upload file: %v. Error: %v", cfg.JobId, outputFile.LocalPath, err) - failedOutputFiles = append(failedOutputFiles, outputFile.LocalPath) - } - } - } - } - - if len(failedOutputFiles) > 0 { - return fmt.Errorf("Job %v failed to generate/upload output files: %v", cfg.JobId, strings.Join(failedOutputFiles, ", ")) - } - - return nil -} - -const dirperm = 0777 - -func downloadFile(jobLog logger.ILogger, remoteFS fileaccess.FileAccess, bucket string, remotePathAndFile string, localPath string, logWD bool) error { - jobLog.Infof("Download \"s3://%v/%v\" -> \"%v\":", bucket, remotePathAndFile, localPath) - - if len(bucket) <= 0 { - return fmt.Errorf("No bucket specified") - } - if len(remotePathAndFile) <= 0 { - return fmt.Errorf("No remotePathAndFile specified") - } - if len(localPath) <= 0 { - return fmt.Errorf("No localPath specified") - } - - // Ensure local path exists - localPathOnly := filepath.Dir(localPath) - localPathForLog := "" - if len(localPathOnly) > 0 && localPathOnly != "." { - err := os.MkdirAll(localPathOnly, dirperm) - if err != nil { - return fmt.Errorf("Failed to create local path: \"%v\". Error: %v", localPathOnly, err) - } else { - jobLog.Infof(" Path created: \"%v\"", localPathOnly) - } - } else { - // Write where we'll put the local file... - wd, err := os.Getwd() - if err != nil { - return fmt.Errorf("Failed to get working directory: %v", err) - } - - localPathForLog = localPath - localPath = filepath.Join(wd, localPath) - if logWD { - jobLog.Infof(" Local path is working dir: %v", localPath) - localPathForLog = localPath // Use the new one - } else { - jobLog.Infof(" Local file will be written to working dir") - } - } - - data, err := remoteFS.ReadObject(bucket, remotePathAndFile) - if err != nil { - if remoteFS.IsNotFoundError(err) { - return fmt.Errorf("Failed to download s3://%v/%v: Not found", bucket, remotePathAndFile) - } - return fmt.Errorf("Failed to download s3://%v/%v: %v", bucket, remotePathAndFile, err) - } else { - jobLog.Infof(" Downloaded %v bytes", len(data)) - } - - // Save to the file - err = os.WriteFile(localPath, data, dirperm) - if err != nil { - return fmt.Errorf("Failed to write %v byte local file: %v. Error: %v", len(data), localPath, err) - } else { - jobLog.Infof(" Wrote file: %v", localPathForLog) - } - return nil -} - -func uploadFile(jobLog logger.ILogger, remoteFS fileaccess.FileAccess, localPath string, bucket string, remotePath string) error { - jobLog.Infof("Upload %v -> s3://%v/%v", localPath, bucket, remotePath) - bytes, err := os.ReadFile(localPath) - if err != nil { - return err - } - - return remoteFS.WriteObject(bucket, remotePath, bytes) -} - -// const configIdxFileName = "config.json" - -// var pmcListName string - -// func init() { -// flag.StringVar(&pmcListName, "pmclistname", "", "Override the PMCListName") -// } - -// func getDatasetFileFromPMCList(pmcListPath string) (string, error) { -// datasetFileName := "" - -// file, err := os.Open(pmcListPath) -// if err != nil { -// return datasetFileName, err -// } -// defer file.Close() - -// scanner := bufio.NewScanner(file) - -// // Read 1 line -// if !scanner.Scan() { -// return datasetFileName, fmt.Errorf("Failed to read dataset file name from PMC list file: %v", pmcListPath) -// } - -// return scanner.Text(), nil -// } -/* -type configFileIndex struct { - Description string `json:"description"` - Config string `json:"config-file"` - OpticEfficiency string `json:"optic-efficiency"` - Calibration string `json:"calibration-file"` - Standards string `json:"standards-file"` -} - -type configPaths struct { - dataset string - pmcList string - config string - calibration string - jobsPath string - remoteJobPath string -} - -func prepConfigsForPiquant( - params quantModel.PiquantParams, - cwlog logger.ILogger, - remoteFS fileaccess.FileAccess, -) (configPaths, error) { - - var result configPaths - localTmpPath := os.TempDir() - - localFS := fileaccess.FSAccess{} - - result.remoteJobPath = path.Join(params.JobsPath, params.JobID) - - result.jobsPath = path.Join(localTmpPath, params.JobID) - localConfigPath := path.Join(result.jobsPath, "config") - - // Delete any temp files from a previous run - os.RemoveAll(result.jobsPath) - - // Make sure they all exist - tmppaths := []string{localTmpPath, result.jobsPath, localConfigPath} - - for _, tmppath := range tmppaths { - err := os.MkdirAll(tmppath, dirperm) - if err != nil { - cwlog.Errorf("Failed to create local path \"%v\": %v", tmppath, err) - return result, err - } - } - - // List the config files - configPaths, err := remoteFS.ListObjects(params.ConfigBucket, params.DetectorConfig) - if err != nil { - cwlog.Errorf("Failed to list config files in: \"s3://%v/%v\"", params.ConfigBucket, params.DetectorConfig) - return result, err - } - - // Download each config file - localConfigIdxPath := "" - for _, path := range configPaths { - cwlog.Infof("Downloading config file: %v", path) - savedPath, err := downloadFile(remoteFS, params.ConfigBucket, path, localConfigPath) - - if err != nil { - cwlog.Errorf("Failed to download config file \"s3://%v/%v\": %v", params.ConfigBucket, path, err) - return result, err - } - - // Check if it's the config path, we'll need it later - fileName := filepath.Base(path) - if fileName == configIdxFileName { - localConfigIdxPath = savedPath - } - } - - // If config.json was not found, error! - if len(localConfigIdxPath) <= 0 { - cwlog.Errorf("No %v found in detector config %v", configIdxFileName, params.DetectorConfig) - return result, err - } - - // Download PMC list file - remotePMCListPath := path.Join(result.remoteJobPath, params.PMCListName) - cwlog.Infof("Downloading PMC list file: %v", remotePMCListPath) - - result.pmcList, err = downloadFile(remoteFS, params.PiquantJobsBucket, remotePMCListPath, result.jobsPath) - - if err != nil { - cwlog.Errorf("Failed to download PMC list file \"s3://%v/%v\": %v", params.PiquantJobsBucket, remotePMCListPath, err) - return result, err - } - - // Get dataset file name (first line in PMC list) - datasetFileName, err := getDatasetFileFromPMCList(result.pmcList) - if err != nil { - cwlog.Errorf("%v", err) - return result, err - } - - // Download dataset file - remoteDatasetFilePath := path.Join(params.DatasetPath, datasetFileName) - cwlog.Infof("Downloading dataset file: %v", remoteDatasetFilePath) - - result.dataset, err = downloadFile(remoteFS, params.DatasetsBucket, remoteDatasetFilePath, result.jobsPath) - - if err != nil { - cwlog.Errorf("Failed to download dataset file \"%v\": %v", remoteDatasetFilePath, err) - return result, err - } - - // Set up optics file configuration - cwlog.Infof("Preparing config files for PIQUANT...") - - // Read the config file - var configIdx configFileIndex - err = localFS.ReadJSON(localConfigIdxPath, "", &configIdx, false) - if err != nil { - cwlog.Errorf("Failed to read config index \"%v\": %v", localConfigIdxPath, err) - return result, err - } - - // Need to add an OPTICFILE entry to config, with the right path for the optic file (so Piquant can access the path directly) - result.config = path.Join(localConfigPath, configIdx.Config) - - if len(configIdx.OpticEfficiency) > 0 { - localOpticEfficiencyPath := path.Join(localConfigPath, configIdx.OpticEfficiency) - - cwlog.Debugf("Amending config file \"%v\" with optic file path: \"%v\"", result.config, localOpticEfficiencyPath) - - cfgFile, err := os.OpenFile(result.config, os.O_APPEND|os.O_WRONLY, dirperm) - - if err != nil { - cwlog.Errorf("Failed to open config index \"%v\" for amending: %v", result.config, err) - return result, err - } else { - defer cfgFile.Close() - - if _, err = cfgFile.WriteString(fmt.Sprintf("\n##OPTICFILE : %v", localOpticEfficiencyPath)); err != nil { - cwlog.Errorf("Failed to write amended OPTICFILE to config index \"%v\": %v", result.config, err) - return result, err - } - } - } else { - cwlog.Debugf("Config file \"%v\" NOT amended with optic file path, as no file specified...", result.config) - } - - // Set the resulting paths - result.calibration = path.Join(localConfigPath, configIdx.Calibration) - - return result, nil -} -*/ -/* -func saveOutputs(jobBucket string, - remoteJobPath string, - pmcListName string, - outputPath string, - logPath string, - piquantStdOut string, - cwlog logger.ILogger, - remoteFS fileaccess.FileAccess) { - - // Check if output file was generated - _, err := os.Stat(outputPath) - if err != nil { - cwlog.Errorf("PIQUANT did not generate an output file: %v", err) - } else { - // Save the output in S3 - remoteJobOutputPath := path.Join(remoteJobPath, "output", pmcListName+"_result.csv") - - err = uploadFile(remoteFS, jobBucket, remoteJobOutputPath, outputPath) - if err != nil { - cwlog.Errorf("Failed to upload PIQUANT output file %v to %v: %v", outputPath, remoteJobOutputPath, err) - } else { - cwlog.Infof("Uploaded %v", remoteJobOutputPath) - } - } - - // If output log (from map threads) was generated, upload that too - _, err = os.Stat(logPath) - if err != nil { - cwlog.Errorf("PIQUANT did not generate a job log file: %v", err) - } else { - // Save the log in S3 - remoteJobLogPath := path.Join(remoteJobPath, "piquant-logs", pmcListName+"_piquant.log") - - err = uploadFile(remoteFS, jobBucket, remoteJobLogPath, logPath) - if err != nil { - cwlog.Errorf("Failed to upload PIQUANT job log file %v to %v: %v", logPath, remoteJobLogPath, err) - } else { - cwlog.Infof("Uploaded job log %v", remoteJobLogPath) - } - } - - // Save stdout as a log file to S3 - remoteJobStdOutLogPath := path.Join(remoteJobPath, "piquant-logs", pmcListName+"_stdout.log") - err = remoteFS.WriteObject(jobBucket, remoteJobStdOutLogPath, []byte(piquantStdOut)) - - if err != nil { - cwlog.Errorf("Failed to upload PIQUANT stdout log to %v: %v", remoteJobStdOutLogPath, err) - } else { - cwlog.Infof("Uploaded stdout log %v", remoteJobStdOutLogPath) - } -} -*/ -// func loadParams() quantModel.PiquantParams { -// // Parameters need to be in an env var -// paramStr := os.Getenv("QUANT_PARAMS") - -// var params quantModel.PiquantParams -// err := json.Unmarshal([]byte(paramStr), ¶ms) -// if err != nil { -// log.Fatalf("Failed to parse QUANT_PARAMS: %v", err) -// } - -// // Allow user to override the PMCListName via another environment variable; this allows a single k8s -// // Job to run many parallel pods where we use JOB_COMPLETION_INDEX (that k8s sets on indexed job types) -// if pmcListName != "" { -// params.PMCListName = pmcListName -// } else { -// if nodeIndex, set := os.LookupEnv("JOB_COMPLETION_INDEX"); set { -// log.Printf("JOB_COMPLETION_INDEX: %v", nodeIndex) -// nodeIndexInt, _ := strconv.Atoi(nodeIndex) -// // TODO: Use a shared function from the quantModel package to keep pmcListFile name consistent; e.g. -// // params.PMCListName = quantRunner.MakePMCFileName(nodeIndexInt) -// params.PMCListName = fmt.Sprintf("node%05d.pmcs", nodeIndexInt+1) -// } else { -// log.Println("JOB_COMPLETION_INDEX not set") -// if params.PMCListName == "" { -// log.Fatalln("PMC list name is empty, and no JOB_COMPLETION_INDEX found") -// } -// } -// } - -// return params -// } - -//func main() { -// flag.Parse() -// params := loadParams() -// // Init AWS SDK -// sess, err := awsutil.GetSession() -// if err != nil { -// log.Fatalf("Failed to create AWS session: %v", err) -// } - -// s3svc, err := awsutil.GetS3(sess) -// if err != nil { -// log.Fatalf("Failed to create AWS S3 session: %v", err) -// } - -// fs := fileaccess.MakeS3Access(s3svc) - -// Create a logger for this job -// nodeName := params.PMCListName -// pmcsSuffix := ".pmcs" -// nodeName = strings.TrimSuffix(nodeName, pmcsSuffix) - -// logGroup := fmt.Sprintf("/run-piquant/%v", params.RunTimeEnv) -// logStream := fmt.Sprintf("job-%v-node-%v", params.JobID, nodeName) - -// cwlog, err := logger.InitCloudWatchLogger( -// sess, -// logGroup, -// logStream, -// logger.LogDebug, -// 30, -// 5, -// ) - -// if err != nil { -// log.Printf("Failed to create logger, will just log to stdout. Error was: %v", err) -// cwlog = &logger.StdOutLogger{} -// } - -// cwlog.Infof("RunPiquant called with params: %v", os.Getenv("QUANT_PARAMS")) -// cwlog.Infof("RunPiquant params struct: %#v", params) - -// paths, err := prepConfigsForPiquant(params, cwlog, fs) -// if err != nil { -// // Assume error logging happend already -// os.Exit(1) -// } - -// outPath := path.Join(paths.jobsPath, "output.csv") - -// NOTE: we can't just provide params.Parameters here, as it itself is a space-separated command line arg string -// so we need to split it into its components, and pass them as individual args -// elementListStr := strings.Join(params.Elements, ",") -// paramList := strings.Split(params.Parameters, " ") - -// // Form a single list of arguments -// args := []string{ -// params.Command, -// paths.config, -// paths.calibration, -// paths.pmcList, -// elementListStr, -// outPath, -// } -// args = append(args, paramList...) -// cwlog.Debugf("exec.Command args: %v", args) - -// cmd := exec.Command("./Piquant", args...) - -// startUnixSec := time.Now().Unix() - -// // Run it, save output text -// out, err := cmd.CombinedOutput() -// if err != nil { -// cwlog.Errorf("Running piquant %v in docker failed: %v\n", params.PMCListName, err) -// cwlog.Infof(string(out)) -// os.Exit(1) -// } - -// runTimeUnixSec := time.Now().Unix() - startUnixSec -// cwlog.Infof("Running piquant took %v sec\n", runTimeUnixSec) - -// Work out what the log path may be -// localLogPath := path.Join(filepath.Dir(outPath), "output.csv_log.txt") - -// saveOutputs(params.PiquantJobsBucket, paths.remoteJobPath, params.PMCListName, outPath, localLogPath, string(out), cwlog, fs) -// } diff --git a/api/job/runner/runner_test.go b/api/job/runner/runner_test.go deleted file mode 100644 index a8e2e94f..00000000 --- a/api/job/runner/runner_test.go +++ /dev/null @@ -1,409 +0,0 @@ -package jobrunner - -import ( - "encoding/json" - "fmt" - "os" - - "github.com/pixlise/core/v4/core/awsutil" - "github.com/pixlise/core/v4/core/fileaccess" -) - -func Example_jobrunner_RunJob_NoConfig() { - os.Setenv(JobConfigEnvVar, "") - fmt.Printf("%v\n", RunJob(false)) - - // Output: - // JOB_CONFIG env var not set -} - -func Example_jobrunner_RunJob_BadConfig() { - os.Setenv(JobConfigEnvVar, "{ \"Some\": \"unfinished JSON }") - fmt.Printf("%v\n", RunJob(false)) - - // Output: - // Failed to parse env var JOB_CONFIG: unexpected end of JSON input -} - -func Example_jobrunner_RunJob_NoCommand() { - cfg := JobConfig{ - JobId: "Job001", - } - - cfgJSON, err := json.Marshal(cfg) - fmt.Printf("cfgErr: %v\n", err) - - os.Setenv(JobConfigEnvVar, string(cfgJSON)) - fmt.Printf("Job: %v\n", RunJob(false)) - - // Output: - // cfgErr: - // INFO: Preparing job: Job001 - // Config: {"JobId":"Job001","RequiredFiles":null,"Command":"","Args":null,"OutputFiles":null} - // INFO: Job config struct: jobrunner.JobConfig{JobId:"Job001", RequiredFiles:[]jobrunner.JobFilePath(nil), Command:"", Args:[]string(nil), OutputFiles:[]jobrunner.JobFilePath(nil)} - // Job: No command specified -} - -func Example_jobrunner_RunJob_BadInputLocalPath() { - cfg := JobConfig{ - JobId: "Job001", - RequiredFiles: []JobFilePath{{LocalPath: "", RemoteBucket: "test-piquant", RemotePath: "jobs/Job001/input.csv"}}, - Command: "ls", - } - - cfgJSON, err := json.Marshal(cfg) - fmt.Printf("cfgErr: %v\n", err) - - os.Setenv(JobConfigEnvVar, string(cfgJSON)) - fmt.Printf("Job: %v\n", RunJob(false)) - - // Output: - // cfgErr: - // INFO: Preparing job: Job001 - // Config: {"JobId":"Job001","RequiredFiles":[{"RemoteBucket":"test-piquant","RemotePath":"jobs/Job001/input.csv","LocalPath":""}],"Command":"ls","Args":null,"OutputFiles":null} - // INFO: Job config struct: jobrunner.JobConfig{JobId:"Job001", RequiredFiles:[]jobrunner.JobFilePath{jobrunner.JobFilePath{RemoteBucket:"test-piquant", RemotePath:"jobs/Job001/input.csv", LocalPath:""}}, Command:"ls", Args:[]string(nil), OutputFiles:[]jobrunner.JobFilePath(nil)} - // INFO: AWS S3 setup... - // INFO: Downloading files... - // INFO: Download "s3://test-piquant/jobs/Job001/input.csv" -> "": - // Job: No localPath specified -} - -func Example_jobrunner_RunJob_BadInputRemotePath() { - cfg := JobConfig{ - JobId: "Job001", - RequiredFiles: []JobFilePath{{LocalPath: "input.csv", RemoteBucket: "test-piquant", RemotePath: "jobs/Job001/input.csv"}}, - Command: "ls", - } - - cfgJSON, err := json.Marshal(cfg) - fmt.Printf("cfgErr: %v\n", err) - - os.Setenv(JobConfigEnvVar, string(cfgJSON)) - fmt.Printf("Job: %v\n", RunJob(false)) - - // Output: - // cfgErr: - // INFO: Preparing job: Job001 - // Config: {"JobId":"Job001","RequiredFiles":[{"RemoteBucket":"test-piquant","RemotePath":"jobs/Job001/input.csv","LocalPath":"input.csv"}],"Command":"ls","Args":null,"OutputFiles":null} - // INFO: Job config struct: jobrunner.JobConfig{JobId:"Job001", RequiredFiles:[]jobrunner.JobFilePath{jobrunner.JobFilePath{RemoteBucket:"test-piquant", RemotePath:"jobs/Job001/input.csv", LocalPath:"input.csv"}}, Command:"ls", Args:[]string(nil), OutputFiles:[]jobrunner.JobFilePath(nil)} - // INFO: AWS S3 setup... - // INFO: Downloading files... - // INFO: Download "s3://test-piquant/jobs/Job001/input.csv" -> "input.csv": - // INFO: Local file will be written to working dir - // Job: Failed to download s3://test-piquant/jobs/Job001/input.csv: Not found -} - -func Example_jobrunner_RunJob_UploadNotThere() { - cfg := JobConfig{ - JobId: "Job001", - Command: NoOpCommand, - OutputFiles: []JobFilePath{ - {LocalPath: "nofile.txt", RemoteBucket: "test-piquant", RemotePath: "RunnerTest/Output/file.csv"}, - }, - } - - cfgJSON, err := json.Marshal(cfg) - fmt.Printf("cfgErr: %v\n", err) - - os.Setenv(JobConfigEnvVar, string(cfgJSON)) - fmt.Printf("Job: %v\n", RunJob(false)) - - // Output: - // cfgErr: - // INFO: Preparing job: Job001 - // Config: {"JobId":"Job001","RequiredFiles":null,"Command":"noop","Args":null,"OutputFiles":[{"RemoteBucket":"test-piquant","RemotePath":"RunnerTest/Output/file.csv","LocalPath":"nofile.txt"}]} - // INFO: Job config struct: jobrunner.JobConfig{JobId:"Job001", RequiredFiles:[]jobrunner.JobFilePath(nil), Command:"noop", Args:[]string(nil), OutputFiles:[]jobrunner.JobFilePath{jobrunner.JobFilePath{RemoteBucket:"test-piquant", RemotePath:"RunnerTest/Output/file.csv", LocalPath:"nofile.txt"}}} - // INFO: AWS S3 setup... - // INFO: Downloading files... - // DEBUG: exec.Command starting "noop", args: [] - // INFO: Job Job001 runtime was 0 sec - // ERROR: Job Job001 did not generate expected output file: nofile.txt - // Job: Job Job001 failed to generate/upload output files: nofile.txt -} - -func Example_jobrunner_RunJob_DownloadUploadOK() { - // Before we do anything, ensure the file is in S3 - sess, err := awsutil.GetSession() - fmt.Printf("GetSession: %v\n", err) - s3, err := awsutil.GetS3(sess) - fmt.Printf("GetS3: %v\n", err) - remoteFS := fileaccess.MakeS3Access(s3) - - fmt.Printf("Write S3 input.csv: %v\n", remoteFS.WriteObject("test-piquant", "RunnerTest/input.csv", []byte("hello"))) - fmt.Printf("Write S3 input2.csv: %v\n", remoteFS.WriteObject("test-piquant", "RunnerTest/input2.csv", []byte("hello2"))) - fmt.Printf("Write local data.txt: %v\n", os.WriteFile("data.txt", []byte("hello"), dirperm)) - - cfg := JobConfig{ - JobId: "Job001", - RequiredFiles: []JobFilePath{ - {LocalPath: "inputfile.csv", RemoteBucket: "test-piquant", RemotePath: "RunnerTest/input.csv"}, - {LocalPath: "second.csv", RemoteBucket: "test-piquant", RemotePath: "RunnerTest/input2.csv"}, - }, - Command: NoOpCommand, - OutputFiles: []JobFilePath{ - {LocalPath: "stdout", RemoteBucket: "test-piquant", RemotePath: "RunnerTest/Output/stdout"}, - {LocalPath: "data.txt", RemoteBucket: "test-piquant", RemotePath: "RunnerTest/Output/file.csv"}, - }, - } - - cfgJSON, err := json.Marshal(cfg) - fmt.Printf("cfgErr: %v\n", err) - - os.Setenv("JOB_CONFIG", string(cfgJSON)) - fmt.Printf("Job: %v\n", RunJob(false)) - - // Clean up files - os.Remove("inputfile.csv") - os.Remove("second.csv") - os.Remove("data.txt") - - // Output: - // GetSession: - // GetS3: - // Write S3 input.csv: - // Write S3 input2.csv: - // Write local data.txt: - // cfgErr: - // INFO: Preparing job: Job001 - // Config: {"JobId":"Job001","RequiredFiles":[{"RemoteBucket":"test-piquant","RemotePath":"RunnerTest/input.csv","LocalPath":"inputfile.csv"},{"RemoteBucket":"test-piquant","RemotePath":"RunnerTest/input2.csv","LocalPath":"second.csv"}],"Command":"noop","Args":null,"OutputFiles":[{"RemoteBucket":"test-piquant","RemotePath":"RunnerTest/Output/stdout","LocalPath":"stdout"},{"RemoteBucket":"test-piquant","RemotePath":"RunnerTest/Output/file.csv","LocalPath":"data.txt"}]} - // INFO: Job config struct: jobrunner.JobConfig{JobId:"Job001", RequiredFiles:[]jobrunner.JobFilePath{jobrunner.JobFilePath{RemoteBucket:"test-piquant", RemotePath:"RunnerTest/input.csv", LocalPath:"inputfile.csv"}, jobrunner.JobFilePath{RemoteBucket:"test-piquant", RemotePath:"RunnerTest/input2.csv", LocalPath:"second.csv"}}, Command:"noop", Args:[]string(nil), OutputFiles:[]jobrunner.JobFilePath{jobrunner.JobFilePath{RemoteBucket:"test-piquant", RemotePath:"RunnerTest/Output/stdout", LocalPath:"stdout"}, jobrunner.JobFilePath{RemoteBucket:"test-piquant", RemotePath:"RunnerTest/Output/file.csv", LocalPath:"data.txt"}}} - // INFO: AWS S3 setup... - // INFO: Downloading files... - // INFO: Download "s3://test-piquant/RunnerTest/input.csv" -> "inputfile.csv": - // INFO: Local file will be written to working dir - // INFO: Downloaded 5 bytes - // INFO: Wrote file: inputfile.csv - // INFO: Download "s3://test-piquant/RunnerTest/input2.csv" -> "second.csv": - // INFO: Local file will be written to working dir - // INFO: Downloaded 6 bytes - // INFO: Wrote file: second.csv - // DEBUG: exec.Command starting "noop", args: [] - // INFO: Job Job001 runtime was 0 sec - // INFO: Uploaded stdout log to: s3://test-piquant/RunnerTest/Output/stdout - // INFO: Upload data.txt -> s3://test-piquant/RunnerTest/Output/file.csv - // Job: -} - -/* -func Example_getDatasetFileFromPMCList() { - fmt.Println(getDatasetFileFromPMCList("../test/data/pixlise-datasets/list.pmcs")) - - // Output: - // 5x11dataset.bin -} - -func Example_prepConfigsForPiquant() { - params := quantModel.PiquantParams{ - RunTimeEnv: "test", - JobID: "job-123", - JobsPath: "Jobs", - DatasetPath: "Downloads/SOL-00001/Experiment-00002", - DetectorConfig: "PiquantConfig/PIXL", - Elements: []string{ - "Al", - "Ti", - "Ca", - "Fe", - }, - Parameters: "-q,pPIETXCFsr -b,0,12,60,910,280,16 -t,6", - DatasetsBucket: "dataset-bucket", - PiquantJobsBucket: "job-bucket", - ConfigBucket: "config-bucket", - QuantName: "config test", - PMCListName: "file1.pmcs", - } - - var mockS3 awsutil.MockS3Client - l := &logger.StdOutLogger{} - - // Listing returns 1 item, get status returns error, check that it still requests 2nd item, 2nd item will fail to parse - // but the func should still upload a blank jobs.json - mockS3.ExpListObjectsV2Input = []s3.ListObjectsV2Input{ - { - Bucket: aws.String(params.ConfigBucket), Prefix: aws.String(params.DetectorConfig), - }, - } - mockS3.QueuedListObjectsV2Output = []*s3.ListObjectsV2Output{ - { - Contents: []*s3.Object{ - {Key: aws.String("PiquantConfig/PIXL/AP04_LVCMFM01_Teflon_1800s_011919_0602_28kV_20uA_10C_Efficiency.txt")}, - {Key: aws.String("PiquantConfig/PIXL/Config_PIXL_FM_ElemCal_CMH_May2019.msa")}, - {Key: aws.String("PiquantConfig/PIXL/FM_3_glasses_ECF_06_19_2019.txt")}, - {Key: aws.String("PiquantConfig/PIXL/FM_Efficiency_profile_Teflon_05_26_2019.txt")}, - {Key: aws.String("PiquantConfig/PIXL/config.json")}, - }, - }, - } - - mockS3.ExpGetObjectInput = []s3.GetObjectInput{ - { - Bucket: aws.String(params.ConfigBucket), Key: aws.String("PiquantConfig/PIXL/AP04_LVCMFM01_Teflon_1800s_011919_0602_28kV_20uA_10C_Efficiency.txt"), - }, - { - Bucket: aws.String(params.ConfigBucket), Key: aws.String("PiquantConfig/PIXL/Config_PIXL_FM_ElemCal_CMH_May2019.msa"), - }, - { - Bucket: aws.String(params.ConfigBucket), Key: aws.String("PiquantConfig/PIXL/FM_3_glasses_ECF_06_19_2019.txt"), - }, - { - Bucket: aws.String(params.ConfigBucket), Key: aws.String("PiquantConfig/PIXL/FM_Efficiency_profile_Teflon_05_26_2019.txt"), - }, - { - Bucket: aws.String(params.ConfigBucket), Key: aws.String("PiquantConfig/PIXL/config.json"), - }, - { - Bucket: aws.String(params.PiquantJobsBucket), Key: aws.String("Jobs/job-123/file1.pmcs"), - }, - { - Bucket: aws.String(params.DatasetsBucket), Key: aws.String("Downloads/SOL-00001/Experiment-00002/TheDataset.bin"), - }, - } - mockS3.QueuedGetObjectOutput = []*s3.GetObjectOutput{ - { - Body: ioutil.NopCloser(bytes.NewReader([]byte(`Contents of AP04_LVCMFM01_Teflon_1800s_011919_0602_28kV_20uA_10C_Efficiency.txt`))), - }, - { - Body: ioutil.NopCloser(bytes.NewReader([]byte(`Contents of Config_PIXL_FM_ElemCal_CMH_May2019.msa`))), - }, - { - Body: ioutil.NopCloser(bytes.NewReader([]byte(`Contents of FM_3_glasses_ECF_06_19_2019.txt`))), - }, - { - Body: ioutil.NopCloser(bytes.NewReader([]byte(`Contents of FM_Efficiency_profile_Teflon_05_26_2019.txt`))), - }, - { - Body: ioutil.NopCloser(bytes.NewReader([]byte(`{ - "description": "PIXL configuration", - "config-file": "Config_PIXL_FM_ElemCal_CMH_May2019.msa", - "optic-efficiency": "AP04_LVCMFM01_Teflon_1800s_011919_0602_28kV_20uA_10C_Efficiency.txt", - "calibration-file": "FM_3_glasses_ECF_06_19_2019.txt", - "standards-file": "" -}`))), - }, - { - Body: ioutil.NopCloser(bytes.NewReader([]byte(`TheDataset.bin -1 -2 -3 -4`))), - }, - { - Body: ioutil.NopCloser(bytes.NewReader([]byte(`Contents of TheDataset.bin`))), - }, - } - - fs := fileaccess.MakeS3Access(&mockS3) - paths, err := prepConfigsForPiquant(params, l, &fs) - fmt.Println(err) - - fmt.Println(filepath.Base(paths.config)) - fmt.Println(filepath.Base(paths.calibration)) - fmt.Println(filepath.Base(paths.dataset)) - fmt.Println(filepath.Base(paths.pmcList)) - - // Check the optic file setup worked - data, err := ioutil.ReadFile(paths.config) - fmt.Println(err) - datastr := string(data) - fmt.Printf("%v\n", strings.Contains(datastr, fmt.Sprintf("\n##OPTICFILE : %v", filepath.Dir(paths.config)))) - - fmt.Println(err) - fmt.Println(mockS3.FinishTest()) - - // Output: - // - // Config_PIXL_FM_ElemCal_CMH_May2019.msa - // FM_3_glasses_ECF_06_19_2019.txt - // TheDataset.bin - // file1.pmcs - // - // true - // - // -} - -func Example_saveOutputs() { - const jobBucket = "job-bucket" - const jobPath = "jobs/some-job-123" - - var mockS3 awsutil.MockS3Client - l := &logger.StdOutLogger{} - - // Set up expected S3 calls - mockS3.ExpPutObjectInput = []s3.PutObjectInput{ - { - Bucket: aws.String(jobBucket), Key: aws.String(path.Join(jobPath, "output", "files_001.pmcs_result.csv")), Body: bytes.NewReader([]byte(`csv file contents`)), - }, - { - Bucket: aws.String(jobBucket), Key: aws.String(path.Join(jobPath, "piquant-logs", "files_001.pmcs_piquant.log")), Body: bytes.NewReader([]byte(`log file contents`)), - }, - { - Bucket: aws.String(jobBucket), Key: aws.String(path.Join(jobPath, "piquant-logs", "files_001.pmcs_stdout.log")), Body: bytes.NewReader([]byte(`piquant stdout`)), - }, - } - - mockS3.QueuedPutObjectOutput = []*s3.PutObjectOutput{ - {}, - {}, - {}, - } - - // Create some "output" files - tmpPath := os.TempDir() - csvFile, err := ioutil.TempFile(tmpPath, "output.csv") - fmt.Printf("%v\n", err) - _, err = csvFile.WriteString("csv file contents") - fmt.Printf("%v\n", err) - csvFile.Close() - - logFile, err := ioutil.TempFile(tmpPath, "threads.log") - fmt.Printf("%v\n", err) - _, err = logFile.WriteString("log file contents") - fmt.Printf("%v\n", err) - logFile.Close() - - fs := fileaccess.MakeS3Access(&mockS3) - saveOutputs(jobBucket, jobPath, "files_001.pmcs", csvFile.Name(), logFile.Name(), "piquant stdout", l, fs) - - fmt.Println(mockS3.FinishTest()) - - // Cleanup - os.RemoveAll(tmpPath) - - // Output: - // - // - // - // - // -} - -func Test_loadParams(t *testing.T) { - // Set default QuantParams - want := "new-pmc" - var defaultParams quantModel.PiquantParams - defaultParams.PMCListName = want - paramsJson, _ := json.Marshal(defaultParams) - os.Setenv("QUANT_PARAMS", string(paramsJson)) - - // Test that default params are loaded - t.Run("Default", func(t *testing.T) { - if got := loadParams(); got.PMCListName != want { - t.Errorf("loadParams.PMCListName = %v, want %v", got, want) - } - }) - - // Override PMCListName via JOB_COMPLETION_INDEX env var - os.Setenv("JOB_COMPLETION_INDEX", "41") - want = "node00042.pmcs" - t.Run("NodeIndexOverride", func(t *testing.T) { - if got := loadParams(); got.PMCListName != want { - t.Errorf("loadParams.PMCListName = %v, want %v", got, want) - } - }) - - // Cleanup - os.Unsetenv("JOB_COMPLETION_INDEX") - os.Unsetenv("QUANT_PARAMS") -} -*/ diff --git a/api/ws/handlers/expression-calculate.go b/api/ws/handlers/expression-calculate.go new file mode 100644 index 00000000..f1f4e338 --- /dev/null +++ b/api/ws/handlers/expression-calculate.go @@ -0,0 +1,151 @@ +package wsHandler + +import ( + "context" + "errors" + "fmt" + + "github.com/pixlise/core/v4/api/dbCollections" + "github.com/pixlise/core/v4/api/ws/wsHelpers" + "github.com/pixlise/core/v4/core/errorwithstatus" + protos "github.com/pixlise/core/v4/generated-protos" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "google.golang.org/protobuf/proto" +) + +func HandleExpressionCalculateReq(req *protos.ExpressionCalculateReq, hctx wsHelpers.HandlerContext) (*protos.ExpressionCalculateResp, error) { + if len(req.Requests) <= 0 { + return nil, errorwithstatus.MakeBadRequestError(errors.New("Expected at least one request item")) + } + + if hctx.SessUser.User.Id == "" { + return nil, errorwithstatus.MakeBadRequestError(errors.New("User must be logged in")) + } + + resultItems := []*protos.RegionDataResultItem{} + + for c, reqItem := range req.Requests { + if len(reqItem.ScanId) <= 0 { + return nil, errorwithstatus.MakeBadRequestError(fmt.Errorf("Request item %v must have a scan ID", c)) + } + if len(reqItem.QuantId) <= 0 { + return nil, errorwithstatus.MakeBadRequestError(fmt.Errorf("Request item %v must have a quant ID", c)) + } + if len(reqItem.ExpressionId) <= 0 { + return nil, errorwithstatus.MakeBadRequestError(fmt.Errorf("Request item %v must have an expression ID", c)) + } + if len(reqItem.RoiId) <= 0 { + return nil, errorwithstatus.MakeBadRequestError(fmt.Errorf("Request item %v must have a region of interest ID", c)) + } + + // For now, we just find the memoised key of the latest expression version and looking it up. If it's not pre-computed we return an error + // Keys are of the form: + // {"scanId":"602735105","exprId":"q2ns80oc4452eldt","quantId":"quant-aqpxxfk6i05gcsy3","roiId":"AllPoints-602735105","units":0},Resp:false,exprMod:1772129285,spectra:3298,90,0 + // So we need scan summary details and the expression last modified time + scanItem, _, err := wsHelpers.GetUserObjectById[protos.ScanItem](true, reqItem.ScanId, protos.ObjectType_OT_SCAN, dbCollections.ScansName, hctx) + if err != nil { + return nil, fmt.Errorf("Failed to read scan item for reqItem %v (%v): %v", c, reqItem.ScanId, err) + } + + exprItem, _, err := wsHelpers.GetUserObjectById[protos.DataExpression](false, reqItem.ExpressionId, protos.ObjectType_OT_EXPRESSION, dbCollections.ExpressionsName, hctx) + if err != nil { + return nil, fmt.Errorf("Failed to read expression for reqItem %v (%v): %v", c, reqItem.ExpressionId, err) + } + + normalSpectraCount := scanItem.ContentCounts["NormalSpectra"] + dwellSpectraCount := scanItem.ContentCounts["DwellSpectra"] + + spectrumTimeStamp := 0 // Comes from SpectrumResp.timeStampUnixSec, seems to always be 0 for now?? + + memCacheKey := fmt.Sprintf( + `{"scanId":"%v","exprId":"%v","quantId":"%v","roiId":"%v","units":%v},Resp:false,exprMod:%v,spectra:%v,%v,%v`, + reqItem.ScanId, + reqItem.ExpressionId, + reqItem.QuantId, + reqItem.RoiId, + reqItem.Units.Number(), + exprItem.ModifiedUnixSec, + normalSpectraCount, + dwellSpectraCount, + spectrumTimeStamp, + ) + + // Read the item from memoisation cache + found := true + filter := bson.M{"_id": memCacheKey} + opts := options.FindOne() + result := hctx.Svcs.MongoDB.Collection(dbCollections.MemoisedItemsName).FindOne(context.TODO(), filter, opts) + if result.Err() != nil { + if result.Err() == mongo.ErrNoDocuments { + // Don't just quit here, we can return an individual error for this one item + found = false + //return nil, errorwithstatus.MakeNotFoundError(memCacheKey) + } else { + return nil, result.Err() + } + } + + var resultItem *protos.RegionDataResultItem + if found { + // Decode the item + memItem := &protos.MemoisedItem{} + err = result.Decode(memItem) + + if err != nil { + return nil, fmt.Errorf("Failed to read memoised item for reqItem %v (%v): %v", c, memCacheKey, err) + } + + // Decode its embedded data + memResult, err := fromMemoised(memItem.Data) + if err != nil { + return nil, fmt.Errorf("Failed to read memoised data for reqItem %v (%v): %v", c, memCacheKey, err) + } + + // Now form an item we can put in the response + resultItem = &protos.RegionDataResultItem{ + ExprResult: memResult, + Expression: memResult.Expression, + // Error + // Warning + // RegionSettings + // Query + IsPMCTable: memResult.IsPMCTable, + } + } else { + // Send back an error for this item + resultItem = &protos.RegionDataResultItem{ + // ExprResult + Expression: exprItem, + Error: fmt.Sprintf("Failed to read cached expression result with key: %v", memCacheKey), + // Warning + // RegionSettings + // Query + IsPMCTable: false, + } + } + + resultItems = append(resultItems, resultItem) + } + + return &protos.ExpressionCalculateResp{ + Result: &protos.RegionDataResults{ + QueryResults: resultItems, + Error: "", + }, + }, nil +} + +// Written to match fromMemoised() in client code +func fromMemoised(data []byte) (*protos.MemDataQueryResult, error) { + memResult := &protos.MemDataQueryResult{} + err := proto.Unmarshal(data, memResult) + + if err != nil { + return nil, err + } + + // NOTE: we read the same MemDataQueryResult structure as we return + return memResult, nil +} diff --git a/api/ws/handlers/image-coreg.go b/api/ws/handlers/image-coreg.go index 597a9737..a283d00e 100644 --- a/api/ws/handlers/image-coreg.go +++ b/api/ws/handlers/image-coreg.go @@ -1,21 +1,12 @@ package wsHandler import ( - "github.com/pixlise/core/v4/api/coreg" + "fmt" + "github.com/pixlise/core/v4/api/ws/wsHelpers" protos "github.com/pixlise/core/v4/generated-protos" ) func HandleImportMarsViewerImageReq(req *protos.ImportMarsViewerImageReq, hctx wsHelpers.HandlerContext) (*protos.ImportMarsViewerImageResp, error) { - jobId := "" - var err error - - jobId, err = coreg.StartCoregImport(req.TriggerUrl, hctx) - if err != nil { - return nil, err - } - - return &protos.ImportMarsViewerImageResp{ - JobId: jobId, - }, nil + return nil, fmt.Errorf("No longer implemented, coreg service was discontinued on MarsViewer side") } diff --git a/api/ws/handlers/scan-entry-polygon.go b/api/ws/handlers/scan-entry-polygon.go index 0b328e3c..b20ffe0f 100644 --- a/api/ws/handlers/scan-entry-polygon.go +++ b/api/ws/handlers/scan-entry-polygon.go @@ -42,9 +42,23 @@ func HandleImageScanEntryDisplayElementsGetReq(req *protos.ImageScanEntryDisplay return nil, fmt.Errorf("Failed to decode scan: %v. Error: %v", req.ScanId, err) } - locs, err := wsHelpers.GetImageBeamLocations(hctx, req.ImageName, map[string]uint32{req.ScanId: req.BeamVersion}) - if err != nil { - return nil, err + var locs *protos.ImageLocations + if len(req.ImageName) <= 0 && len(req.ScanId) > 0 { + // We have no image, so we generate coordinates + // NOTE: empty image name implies this won't write to DB + locs, err = wsHelpers.GenerateIJs("", req.ScanId, scanItem.Instrument, hctx.Svcs) + if err != nil { + return nil, err + } + } else { + locs, err = wsHelpers.GetImageBeamLocations(hctx, req.ImageName, map[string]uint32{req.ScanId: req.BeamVersion}) + if err != nil { + return nil, err + } + } + + if len(locs.LocationPerScan) <= 0 { + return nil, fmt.Errorf("Image %v associated with scan: %v has no beam locations", req.ImageName, req.ScanId) } cfg, err := piquant.GetDetectorConfig(scanItem.InstrumentConfig, hctx.Svcs.MongoDB) diff --git a/build_client.sh b/build_client.sh old mode 100644 new mode 100755 index 4663cb5a..060216a7 --- a/build_client.sh +++ b/build_client.sh @@ -9,7 +9,7 @@ docker run -it --rm \ -v $PWD:/usr/src/app \ -w /usr/src/app \ -e CGO_ENABLED=1 \ - docker.elastic.co/beats-dev/golang-crossbuild:1.24.2-main \ + docker.elastic.co/beats-dev/golang-crossbuild:1.24.13-main \ --build-cmd "go build -buildmode=c-shared -o ./_out/client/pixlise-linux-amd64.so ./core/client/lib" \ -p "linux/amd64" @@ -18,7 +18,7 @@ docker run -it --rm \ -v $PWD:/usr/src/app \ -w /usr/src/app \ -e CGO_ENABLED=1 \ - docker.elastic.co/beats-dev/golang-crossbuild:1.24.2-arm \ + docker.elastic.co/beats-dev/golang-crossbuild:1.24.13-arm \ --build-cmd "go build -buildmode=c-shared -o ./_out/client/pixlise-linux-arm64.so ./core/client/lib" \ -p "linux/arm64" @@ -31,7 +31,7 @@ docker run -it --rm \ -v $PWD:/usr/src/app \ -w /usr/src/app \ -e CGO_ENABLED=1 \ - docker.elastic.co/beats-dev/golang-crossbuild:1.24.2-main \ + docker.elastic.co/beats-dev/golang-crossbuild:1.24.13-main \ --build-cmd "go build -buildmode=c-shared -o ./_out/client/pixlise-windows-amd64.dll ./core/client/lib" \ -p "windows/amd64" @@ -49,7 +49,7 @@ docker run -it \ -e CC=o64-clang \ -e GOOS=darwin \ -e GOARCH=amd64 \ - docker.elastic.co/beats-dev/golang-crossbuild:1.24.2-darwin \ + docker.elastic.co/beats-dev/golang-crossbuild:1.24.13-darwin \ --build-cmd "go build -work -buildmode=c-shared -o ./_out/client/pixlise-darwin-amd64.so ./core/client/lib" \ -p "darwin/amd64" @@ -62,6 +62,6 @@ docker run -it \ # -e CC=o64-clang \ # -e GOOS=darwin \ # -e GOARCH=arm64 \ -# docker.elastic.co/beats-dev/golang-crossbuild:1.24.2-darwin \ +# docker.elastic.co/beats-dev/golang-crossbuild:1.24.13-darwin \ # --build-cmd "go build -buildmode=c-shared -o ./_out/client/pixlise-darwin-arm64.so ./core/client/lib" \ # -p "darwin/arm64" diff --git a/core/client/client.go b/core/client/client.go index b0e9a507..587afc81 100644 --- a/core/client/client.go +++ b/core/client/client.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "net/http" + "net/url" "os" "path/filepath" "sort" @@ -1206,8 +1207,9 @@ func (c *APIClient) SaveMapData(key string, data *protos.ClientMap) error { return fmt.Errorf("Failed to SaveMapData %v: %v", key, err) } + saveKey := ClientMapKeyPrefix + key memoItem := &protos.MemoisedItem{ - Key: ClientMapKeyPrefix + key, + Key: saveKey, Data: dataBytes, // ScanId: reqItem.ScanId, // QuantId: reqItem.QuantId, @@ -1227,7 +1229,7 @@ func (c *APIClient) SaveMapData(key string, data *protos.ClientMap) error { } // Set the key as a query param - url.RawQuery = "key=" + ClientMapKeyPrefix + key + url.RawQuery = "key=" + saveKey client := &http.Client{} urlString := url.String() @@ -1259,38 +1261,62 @@ func (c *APIClient) SaveMapData(key string, data *protos.ClientMap) error { return nil } -func (c *APIClient) LoadMapData(key string) (*protos.ClientMap, error) { - // We send this via HTTP endpoints - url, err := c.socket.GetHost("/memoise") - if err != nil { - return nil, fmt.Errorf("LoadMapData %v failed to get url: %v", key, err) - } - - // Set the key as a query param - url.RawQuery = "key=" + ClientMapKeyPrefix + key - +func (c *APIClient) sendRequest(key string, url *url.URL) (*http.Response, []byte, error) { client := &http.Client{} urlString := url.String() req, err := http.NewRequest("GET", urlString, nil) if err != nil { - return nil, fmt.Errorf("LoadMapData %v failed to create request: %v", key, err) + return nil, nil, fmt.Errorf("LoadMapData %v failed to create request: %v", key, err) } req.Header.Set("Authorization", "Bearer "+c.socket.JWT) resp, err := client.Do(req) if err != nil { - return nil, fmt.Errorf("LoadMapData %v request failed: %v", key, err) + return nil, nil, fmt.Errorf("LoadMapData %v request failed: %v", key, err) } defer resp.Body.Close() b, err := io.ReadAll(resp.Body) if err != nil { - return nil, fmt.Errorf("LoadMapData %v failed to read response: %v", key, err) + return nil, nil, fmt.Errorf("LoadMapData %v failed to read response: %v", key, err) + } + + return resp, b, err +} + +func (c *APIClient) LoadMapData(key string) (*protos.ClientMap, error) { + // We send this via HTTP endpoints + url, err := c.socket.GetHost("/memoise") + if err != nil { + return nil, fmt.Errorf("LoadMapData %v failed to get url: %v", key, err) + } + + // Set the key as a query param + // NOTE: We first try it with the client prefix, and if it fails to load, we try it with just + // the raw key. This is so we can load expression-generated map data, added as a later + // feature - at first it seemed like we'll only want to load client-saved maps. + url.RawQuery = "key=" + ClientMapKeyPrefix + key + + resp, b, err := c.sendRequest(key, url) + if err != nil { + return nil, err } if resp.StatusCode != 200 { - return nil, fmt.Errorf("LoadMapData got status %v: %v", resp.StatusCode, string(b)) + // If we got a 404, try again but with the key prefix removed + if resp.StatusCode == 404 { + url.RawQuery = "key=" + key + + resp, b, err = c.sendRequest(key, url) + if err != nil { + return nil, err + } + } + + if resp.StatusCode != 200 { + return nil, fmt.Errorf("LoadMapData got status %v: %v", resp.StatusCode, string(b)) + } } respBody := &protos.MemoisedItem{} @@ -1309,6 +1335,52 @@ func (c *APIClient) LoadMapData(key string) (*protos.ClientMap, error) { return mapResult, nil } +func (c *APIClient) CalculateExpression(scanId, quantId, expressionId, roiId string, units protos.DataUnit) (*protos.ClientMap, error) { + req := &protos.ExpressionCalculateReq{Requests: []*protos.DataSourceParams{{ + ScanId: scanId, + QuantId: quantId, + ExpressionId: expressionId, + RoiId: roiId, + Units: units, + }}} + + msg := &protos.WSMessage{Contents: &protos.WSMessage_ExpressionCalculateReq{ + ExpressionCalculateReq: req, + }} + + resps, err := c.sendMessageWaitResponse(msg) + if err != nil { + return nil, err + } + + resp := resps[0].GetExpressionCalculateResp() + + if len(resp.Result.Error) > 0 { + return nil, fmt.Errorf("Error calculating expression: %v", resp.Result.Error) + } + + if len(resp.Result.QueryResults) != 1 { + return nil, fmt.Errorf("Expected 1 expression calculation result, got %v", len(resp.Result.QueryResults)) + } + + if len(resp.Result.QueryResults[0].Error) > 0 { + return nil, fmt.Errorf("Error calculating expression (%v): %v", expressionId, resp.Result.QueryResults[0].Error) + } + + // Convert the result to a map + result := &protos.ClientMap{ + EntryPMCs: []int32{}, + FloatValues: []float64{}, + } + + for _, item := range resp.Result.QueryResults[0].ExprResult.ResultValues.Values { + result.EntryPMCs = append(result.EntryPMCs, int32(item.Pmc)) + result.FloatValues = append(result.FloatValues, float64(item.Value)) + } + + return result, nil +} + func (c *APIClient) DeleteImage(imageName string) error { req := &protos.ImageDeleteReq{Name: imageName} diff --git a/core/client/internal/cmdline/main.go b/core/client/internal/cmdline/main.go index 9a12c1fe..3bbb1303 100644 --- a/core/client/internal/cmdline/main.go +++ b/core/client/internal/cmdline/main.go @@ -17,6 +17,22 @@ func main() { return } + m, err := apiClient.CalculateExpression("669909507", "quant-tl2mrnxroian1acm", "9b4h4zjuynpshf7c", "AllPoints-669909507", 0) + if err != nil { + return + } + fmt.Printf("%+v\n", m) + + k := "my-mapX" + //k = `{"scanId":"602735105","exprId":"h43yqjza1m23mmr0","quantId":"quant-aqpxxfk6i05gcsy3","roiId":"AllPoints-602735105","units":0},Resp:false,exprMod:1744785719,spectra:3298,90,0` + k = `{"scanId":"669909507","exprId":"9b4h4zjuynpshf7c","quantId":"quant-tl2mrnxroian1acm","roiId":"AllPoints-669909507","units":0},Resp:false,exprMod:1772072860,spectra:2754,6,0` + + m, err = apiClient.LoadMapData(k) + if err != nil { + return + } + fmt.Printf("%+v\n", m) + // roi, err := apiClient.GetROI("k0adnljtrszqv1e9", false) // fmt.Printf("getRGetROIOI: %v|%v", err, roi.RegionOfInterest.ScanEntryIndexesEncoded) diff --git a/core/client/internal/config.json b/core/client/internal/config.json deleted file mode 100644 index f66e86c2..00000000 --- a/core/client/internal/config.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "host": "https://dev-api.pixlise.org", - "user": "snowcrazed@gmail.com", - "pass": "Ali3nzzz?", - "clientId": "tGl1V31QRm2TCjkHIx7L4mOk19CIQ1X0", - "domain": "pixlise.au.auth0.com", - "audience": "pixlise-backend" -} \ No newline at end of file diff --git a/core/client/lib/main.go b/core/client/lib/main.go index e83d9b3b..c5d2aced 100644 --- a/core/client/lib/main.go +++ b/core/client/lib/main.go @@ -299,6 +299,13 @@ func loadMapData(key string) *C.char { return processRequest("loadMapData", func() (proto.Message, error) { return apiClient.LoadMapData(key) }) } +//export calculateExpression +func calculateExpression(scanId, quantId, expressionId, roiId string, units int) *C.char { + return processRequest("calculateExpression", func() (proto.Message, error) { + return apiClient.CalculateExpression(scanId, quantId, expressionId, roiId, protos.DataUnit(units)) + }) +} + //export uploadImage func uploadImage(imageUpload string) *C.char { // Here we can read the data string as a protobuf message and create the right structure diff --git a/core/fileaccess/s3.go b/core/fileaccess/s3.go index 48ae5362..a55ac8a1 100644 --- a/core/fileaccess/s3.go +++ b/core/fileaccess/s3.go @@ -326,7 +326,7 @@ func CopyToBucket(remoteFS FileAccess, sourcePath string, destBucket string, des } err := filepath.Walk(sourcePath, func(currentPath string, info os.FileInfo, err error) error { - if !info.IsDir() { + if err == nil && !info.IsDir() { var uploadPath string if preserveStructure { diff --git a/data-formats b/data-formats index 6c467f77..685624b2 160000 --- a/data-formats +++ b/data-formats @@ -1 +1 @@ -Subproject commit 6c467f773db42dd8b417793c336fac6fba04d151 +Subproject commit 685624b26b0e425e74e4a3127215fdc3d6ece43b diff --git a/generated-protos/expression-calculate-msgs.pb.go b/generated-protos/expression-calculate-msgs.pb.go new file mode 100644 index 00000000..caceb832 --- /dev/null +++ b/generated-protos/expression-calculate-msgs.pb.go @@ -0,0 +1,217 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0-devel +// protoc v3.14.0 +// source: expression-calculate-msgs.proto + +package protos + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// requires(NONE) +type ExpressionCalculateReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Requests []*DataSourceParams `protobuf:"bytes,1,rep,name=requests,proto3" json:"requests,omitempty"` +} + +func (x *ExpressionCalculateReq) Reset() { + *x = ExpressionCalculateReq{} + if protoimpl.UnsafeEnabled { + mi := &file_expression_calculate_msgs_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExpressionCalculateReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExpressionCalculateReq) ProtoMessage() {} + +func (x *ExpressionCalculateReq) ProtoReflect() protoreflect.Message { + mi := &file_expression_calculate_msgs_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExpressionCalculateReq.ProtoReflect.Descriptor instead. +func (*ExpressionCalculateReq) Descriptor() ([]byte, []int) { + return file_expression_calculate_msgs_proto_rawDescGZIP(), []int{0} +} + +func (x *ExpressionCalculateReq) GetRequests() []*DataSourceParams { + if x != nil { + return x.Requests + } + return nil +} + +type ExpressionCalculateResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Result *RegionDataResults `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` +} + +func (x *ExpressionCalculateResp) Reset() { + *x = ExpressionCalculateResp{} + if protoimpl.UnsafeEnabled { + mi := &file_expression_calculate_msgs_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExpressionCalculateResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExpressionCalculateResp) ProtoMessage() {} + +func (x *ExpressionCalculateResp) ProtoReflect() protoreflect.Message { + mi := &file_expression_calculate_msgs_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExpressionCalculateResp.ProtoReflect.Descriptor instead. +func (*ExpressionCalculateResp) Descriptor() ([]byte, []int) { + return file_expression_calculate_msgs_proto_rawDescGZIP(), []int{1} +} + +func (x *ExpressionCalculateResp) GetResult() *RegionDataResults { + if x != nil { + return x.Result + } + return nil +} + +var File_expression_calculate_msgs_proto protoreflect.FileDescriptor + +var file_expression_calculate_msgs_proto_rawDesc = []byte{ + 0x0a, 0x1f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6c, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x61, + 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x47, 0x0a, + 0x16, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x63, 0x75, + 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2d, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x08, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0x45, 0x0a, 0x17, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x0a, 0x5a, + 0x08, 0x2e, 0x3b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_expression_calculate_msgs_proto_rawDescOnce sync.Once + file_expression_calculate_msgs_proto_rawDescData = file_expression_calculate_msgs_proto_rawDesc +) + +func file_expression_calculate_msgs_proto_rawDescGZIP() []byte { + file_expression_calculate_msgs_proto_rawDescOnce.Do(func() { + file_expression_calculate_msgs_proto_rawDescData = protoimpl.X.CompressGZIP(file_expression_calculate_msgs_proto_rawDescData) + }) + return file_expression_calculate_msgs_proto_rawDescData +} + +var file_expression_calculate_msgs_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_expression_calculate_msgs_proto_goTypes = []interface{}{ + (*ExpressionCalculateReq)(nil), // 0: ExpressionCalculateReq + (*ExpressionCalculateResp)(nil), // 1: ExpressionCalculateResp + (*DataSourceParams)(nil), // 2: DataSourceParams + (*RegionDataResults)(nil), // 3: RegionDataResults +} +var file_expression_calculate_msgs_proto_depIdxs = []int32{ + 2, // 0: ExpressionCalculateReq.requests:type_name -> DataSourceParams + 3, // 1: ExpressionCalculateResp.result:type_name -> RegionDataResults + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_expression_calculate_msgs_proto_init() } +func file_expression_calculate_msgs_proto_init() { + if File_expression_calculate_msgs_proto != nil { + return + } + file_expression_calculate_proto_init() + if !protoimpl.UnsafeEnabled { + file_expression_calculate_msgs_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExpressionCalculateReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_expression_calculate_msgs_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExpressionCalculateResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_expression_calculate_msgs_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_expression_calculate_msgs_proto_goTypes, + DependencyIndexes: file_expression_calculate_msgs_proto_depIdxs, + MessageInfos: file_expression_calculate_msgs_proto_msgTypes, + }.Build() + File_expression_calculate_msgs_proto = out.File + file_expression_calculate_msgs_proto_rawDesc = nil + file_expression_calculate_msgs_proto_goTypes = nil + file_expression_calculate_msgs_proto_depIdxs = nil +} diff --git a/generated-protos/expression-calculate.pb.go b/generated-protos/expression-calculate.pb.go new file mode 100644 index 00000000..0e3012fe --- /dev/null +++ b/generated-protos/expression-calculate.pb.go @@ -0,0 +1,444 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0-devel +// protoc v3.14.0 +// source: expression-calculate.proto + +package protos + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type DataUnit int32 + +const ( + DataUnit_UNIT_DEFAULT DataUnit = 0 // Doubles as unknown, see https://protobuf.dev/programming-guides/dos-donts/ + DataUnit_UNIT_MMOL DataUnit = 1 + DataUnit_UNIT_PPM DataUnit = 2 +) + +// Enum value maps for DataUnit. +var ( + DataUnit_name = map[int32]string{ + 0: "UNIT_DEFAULT", + 1: "UNIT_MMOL", + 2: "UNIT_PPM", + } + DataUnit_value = map[string]int32{ + "UNIT_DEFAULT": 0, + "UNIT_MMOL": 1, + "UNIT_PPM": 2, + } +) + +func (x DataUnit) Enum() *DataUnit { + p := new(DataUnit) + *p = x + return p +} + +func (x DataUnit) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DataUnit) Descriptor() protoreflect.EnumDescriptor { + return file_expression_calculate_proto_enumTypes[0].Descriptor() +} + +func (DataUnit) Type() protoreflect.EnumType { + return &file_expression_calculate_proto_enumTypes[0] +} + +func (x DataUnit) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DataUnit.Descriptor instead. +func (DataUnit) EnumDescriptor() ([]byte, []int) { + return file_expression_calculate_proto_rawDescGZIP(), []int{0} +} + +// Requesting a single expression to be run +type DataSourceParams struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ScanId string `protobuf:"bytes,1,opt,name=scanId,proto3" json:"scanId,omitempty"` + QuantId string `protobuf:"bytes,2,opt,name=quantId,proto3" json:"quantId,omitempty"` + ExpressionId string `protobuf:"bytes,3,opt,name=expressionId,proto3" json:"expressionId,omitempty"` + RoiId string `protobuf:"bytes,4,opt,name=roiId,proto3" json:"roiId,omitempty"` + Units DataUnit `protobuf:"varint,5,opt,name=units,proto3,enum=DataUnit" json:"units,omitempty"` +} + +func (x *DataSourceParams) Reset() { + *x = DataSourceParams{} + if protoimpl.UnsafeEnabled { + mi := &file_expression_calculate_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DataSourceParams) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DataSourceParams) ProtoMessage() {} + +func (x *DataSourceParams) ProtoReflect() protoreflect.Message { + mi := &file_expression_calculate_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DataSourceParams.ProtoReflect.Descriptor instead. +func (*DataSourceParams) Descriptor() ([]byte, []int) { + return file_expression_calculate_proto_rawDescGZIP(), []int{0} +} + +func (x *DataSourceParams) GetScanId() string { + if x != nil { + return x.ScanId + } + return "" +} + +func (x *DataSourceParams) GetQuantId() string { + if x != nil { + return x.QuantId + } + return "" +} + +func (x *DataSourceParams) GetExpressionId() string { + if x != nil { + return x.ExpressionId + } + return "" +} + +func (x *DataSourceParams) GetRoiId() string { + if x != nil { + return x.RoiId + } + return "" +} + +func (x *DataSourceParams) GetUnits() DataUnit { + if x != nil { + return x.Units + } + return DataUnit_UNIT_DEFAULT +} + +// Grouped results of expressions having run +type RegionDataResults struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + QueryResults []*RegionDataResultItem `protobuf:"bytes,1,rep,name=queryResults,proto3" json:"queryResults,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *RegionDataResults) Reset() { + *x = RegionDataResults{} + if protoimpl.UnsafeEnabled { + mi := &file_expression_calculate_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegionDataResults) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegionDataResults) ProtoMessage() {} + +func (x *RegionDataResults) ProtoReflect() protoreflect.Message { + mi := &file_expression_calculate_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegionDataResults.ProtoReflect.Descriptor instead. +func (*RegionDataResults) Descriptor() ([]byte, []int) { + return file_expression_calculate_proto_rawDescGZIP(), []int{1} +} + +func (x *RegionDataResults) GetQueryResults() []*RegionDataResultItem { + if x != nil { + return x.QueryResults + } + return nil +} + +func (x *RegionDataResults) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +// Complete result of running an individual expression, output is in exprResult but we also receive some meta-data +// for free because it was queried/used in the expression run, and we get the query structure back too. +type RegionDataResultItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExprResult *MemDataQueryResult `protobuf:"bytes,1,opt,name=exprResult,proto3" json:"exprResult,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` + Warning string `protobuf:"bytes,3,opt,name=warning,proto3" json:"warning,omitempty"` + Expression *DataExpression `protobuf:"bytes,4,opt,name=expression,proto3" json:"expression,omitempty"` // NOTE: Is this redundant??? There's also the same field in DataQueryResult + //RegionSettings region = 5; // NOTE: Is this redundant??? There's also the same field in DataQueryResult + Query *DataSourceParams `protobuf:"bytes,6,opt,name=query,proto3" json:"query,omitempty"` + IsPMCTable bool `protobuf:"varint,7,opt,name=isPMCTable,proto3" json:"isPMCTable,omitempty"` // NOTE: Is this redundant??? There's also the same field in DataQueryResult +} + +func (x *RegionDataResultItem) Reset() { + *x = RegionDataResultItem{} + if protoimpl.UnsafeEnabled { + mi := &file_expression_calculate_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegionDataResultItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegionDataResultItem) ProtoMessage() {} + +func (x *RegionDataResultItem) ProtoReflect() protoreflect.Message { + mi := &file_expression_calculate_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegionDataResultItem.ProtoReflect.Descriptor instead. +func (*RegionDataResultItem) Descriptor() ([]byte, []int) { + return file_expression_calculate_proto_rawDescGZIP(), []int{2} +} + +func (x *RegionDataResultItem) GetExprResult() *MemDataQueryResult { + if x != nil { + return x.ExprResult + } + return nil +} + +func (x *RegionDataResultItem) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *RegionDataResultItem) GetWarning() string { + if x != nil { + return x.Warning + } + return "" +} + +func (x *RegionDataResultItem) GetExpression() *DataExpression { + if x != nil { + return x.Expression + } + return nil +} + +func (x *RegionDataResultItem) GetQuery() *DataSourceParams { + if x != nil { + return x.Query + } + return nil +} + +func (x *RegionDataResultItem) GetIsPMCTable() bool { + if x != nil { + return x.IsPMCTable + } + return false +} + +var File_expression_calculate_proto protoreflect.FileDescriptor + +var file_expression_calculate_proto_rawDesc = []byte{ + 0x0a, 0x1a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6c, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, 0x65, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0x9f, 0x01, 0x0a, 0x10, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x61, 0x6e, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x61, 0x6e, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x65, 0x78, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x72, 0x6f, 0x69, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, + 0x69, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x05, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x09, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x55, 0x6e, 0x69, 0x74, 0x52, 0x05, 0x75, + 0x6e, 0x69, 0x74, 0x73, 0x22, 0x64, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x0c, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xf5, 0x01, 0x0a, 0x14, 0x52, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x49, + 0x74, 0x65, 0x6d, 0x12, 0x33, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x4d, 0x65, 0x6d, 0x44, 0x61, 0x74, + 0x61, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x65, 0x78, + 0x70, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, + 0x0a, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, + 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x50, 0x4d, 0x43, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x50, 0x4d, 0x43, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x2a, 0x39, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x55, 0x6e, 0x69, 0x74, 0x12, 0x10, + 0x0a, 0x0c, 0x55, 0x4e, 0x49, 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, + 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, 0x49, 0x54, 0x5f, 0x4d, 0x4d, 0x4f, 0x4c, 0x10, 0x01, 0x12, + 0x0c, 0x0a, 0x08, 0x55, 0x4e, 0x49, 0x54, 0x5f, 0x50, 0x50, 0x4d, 0x10, 0x02, 0x42, 0x0a, 0x5a, + 0x08, 0x2e, 0x3b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_expression_calculate_proto_rawDescOnce sync.Once + file_expression_calculate_proto_rawDescData = file_expression_calculate_proto_rawDesc +) + +func file_expression_calculate_proto_rawDescGZIP() []byte { + file_expression_calculate_proto_rawDescOnce.Do(func() { + file_expression_calculate_proto_rawDescData = protoimpl.X.CompressGZIP(file_expression_calculate_proto_rawDescData) + }) + return file_expression_calculate_proto_rawDescData +} + +var file_expression_calculate_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_expression_calculate_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_expression_calculate_proto_goTypes = []interface{}{ + (DataUnit)(0), // 0: DataUnit + (*DataSourceParams)(nil), // 1: DataSourceParams + (*RegionDataResults)(nil), // 2: RegionDataResults + (*RegionDataResultItem)(nil), // 3: RegionDataResultItem + (*MemDataQueryResult)(nil), // 4: MemDataQueryResult + (*DataExpression)(nil), // 5: DataExpression +} +var file_expression_calculate_proto_depIdxs = []int32{ + 0, // 0: DataSourceParams.units:type_name -> DataUnit + 3, // 1: RegionDataResults.queryResults:type_name -> RegionDataResultItem + 4, // 2: RegionDataResultItem.exprResult:type_name -> MemDataQueryResult + 5, // 3: RegionDataResultItem.expression:type_name -> DataExpression + 1, // 4: RegionDataResultItem.query:type_name -> DataSourceParams + 5, // [5:5] is the sub-list for method output_type + 5, // [5:5] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_expression_calculate_proto_init() } +func file_expression_calculate_proto_init() { + if File_expression_calculate_proto != nil { + return + } + file_expressions_proto_init() + file_memoisation_proto_init() + if !protoimpl.UnsafeEnabled { + file_expression_calculate_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DataSourceParams); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_expression_calculate_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegionDataResults); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_expression_calculate_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegionDataResultItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_expression_calculate_proto_rawDesc, + NumEnums: 1, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_expression_calculate_proto_goTypes, + DependencyIndexes: file_expression_calculate_proto_depIdxs, + EnumInfos: file_expression_calculate_proto_enumTypes, + MessageInfos: file_expression_calculate_proto_msgTypes, + }.Build() + File_expression_calculate_proto = out.File + file_expression_calculate_proto_rawDesc = nil + file_expression_calculate_proto_goTypes = nil + file_expression_calculate_proto_depIdxs = nil +} diff --git a/generated-protos/websocket.pb.go b/generated-protos/websocket.pb.go index 9a94b8bd..e9a4895a 100644 --- a/generated-protos/websocket.pb.go +++ b/generated-protos/websocket.pb.go @@ -144,6 +144,8 @@ type WSMessage struct { // *WSMessage_ElementSetWriteResp // *WSMessage_ExportFilesReq // *WSMessage_ExportFilesResp + // *WSMessage_ExpressionCalculateReq + // *WSMessage_ExpressionCalculateResp // *WSMessage_ExpressionDeleteReq // *WSMessage_ExpressionDeleteResp // *WSMessage_ExpressionDisplaySettingsGetReq @@ -781,6 +783,20 @@ func (x *WSMessage) GetExportFilesResp() *ExportFilesResp { return nil } +func (x *WSMessage) GetExpressionCalculateReq() *ExpressionCalculateReq { + if x, ok := x.GetContents().(*WSMessage_ExpressionCalculateReq); ok { + return x.ExpressionCalculateReq + } + return nil +} + +func (x *WSMessage) GetExpressionCalculateResp() *ExpressionCalculateResp { + if x, ok := x.GetContents().(*WSMessage_ExpressionCalculateResp); ok { + return x.ExpressionCalculateResp + } + return nil +} + func (x *WSMessage) GetExpressionDeleteReq() *ExpressionDeleteReq { if x, ok := x.GetContents().(*WSMessage_ExpressionDeleteReq); ok { return x.ExpressionDeleteReq @@ -2958,6 +2974,14 @@ type WSMessage_ExportFilesResp struct { ExportFilesResp *ExportFilesResp `protobuf:"bytes,39,opt,name=exportFilesResp,proto3,oneof"` } +type WSMessage_ExpressionCalculateReq struct { + ExpressionCalculateReq *ExpressionCalculateReq `protobuf:"bytes,362,opt,name=expressionCalculateReq,proto3,oneof"` +} + +type WSMessage_ExpressionCalculateResp struct { + ExpressionCalculateResp *ExpressionCalculateResp `protobuf:"bytes,363,opt,name=expressionCalculateResp,proto3,oneof"` +} + type WSMessage_ExpressionDeleteReq struct { ExpressionDeleteReq *ExpressionDeleteReq `protobuf:"bytes,40,opt,name=expressionDeleteReq,proto3,oneof"` } @@ -4188,6 +4212,10 @@ func (*WSMessage_ExportFilesReq) isWSMessage_Contents() {} func (*WSMessage_ExportFilesResp) isWSMessage_Contents() {} +func (*WSMessage_ExpressionCalculateReq) isWSMessage_Contents() {} + +func (*WSMessage_ExpressionCalculateResp) isWSMessage_Contents() {} + func (*WSMessage_ExpressionDeleteReq) isWSMessage_Contents() {} func (*WSMessage_ExpressionDeleteResp) isWSMessage_Contents() {} @@ -4780,1712 +4808,1724 @@ var file_websocket_proto_rawDesc = []byte{ 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2d, 0x33, 0x64, 0x2d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x2d, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x1e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2d, 0x62, 0x65, 0x61, 0x6d, 0x2d, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x10, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x67, - 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x2d, 0x70, 0x79, 0x72, 0x61, 0x6d, 0x69, 0x64, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0e, 0x6a, 0x6f, 0x62, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0e, 0x6c, 0x6f, 0x67, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x2d, 0x61, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x12, 0x70, - 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x1d, 0x70, 0x73, 0x65, 0x75, 0x64, 0x6f, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1b, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x24, 0x71, - 0x75, 0x61, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x61, 0x6c, 0x2d, 0x6d, - 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x71, 0x75, 0x61, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0e, 0x72, 0x6f, 0x69, - 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x73, 0x63, 0x61, - 0x6e, 0x2d, 0x62, 0x65, 0x61, 0x6d, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, - 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x73, 0x63, 0x61, 0x6e, - 0x2d, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2d, - 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x73, 0x63, 0x61, 0x6e, - 0x2d, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x1d, 0x73, 0x63, 0x61, 0x6e, 0x2d, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2d, 0x70, 0x6f, - 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x0f, 0x73, 0x63, 0x61, 0x6e, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x1a, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x70, 0x69, 0x78, - 0x65, 0x6c, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2d, 0x6d, - 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x73, 0x70, 0x65, 0x63, 0x74, - 0x72, 0x75, 0x6d, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, - 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x73, 0x67, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0e, 0x74, 0x61, 0x67, 0x2d, 0x6d, 0x73, 0x67, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0f, 0x74, 0x65, 0x73, 0x74, 0x2d, 0x6d, 0x73, + 0x1a, 0x1f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6c, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2d, 0x33, 0x64, 0x2d, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x2d, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2d, 0x62, 0x65, 0x61, 0x6d, 0x2d, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x10, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2d, 0x63, 0x6f, 0x72, 0x65, + 0x67, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x2d, 0x70, 0x79, 0x72, 0x61, 0x6d, 0x69, 0x64, 0x2d, 0x6d, 0x73, 0x67, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0e, 0x6a, 0x6f, 0x62, 0x2d, 0x6d, 0x73, 0x67, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0e, 0x6c, 0x6f, 0x67, 0x2d, 0x6d, 0x73, 0x67, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x2d, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x12, + 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1d, 0x70, 0x73, 0x65, 0x75, 0x64, 0x6f, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1b, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x24, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x61, 0x6c, 0x2d, + 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x71, 0x75, 0x61, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x75, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0e, 0x72, 0x6f, + 0x69, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x73, 0x63, + 0x61, 0x6e, 0x2d, 0x62, 0x65, 0x61, 0x6d, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x73, 0x63, 0x61, + 0x6e, 0x2d, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2d, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x73, 0x63, 0x61, + 0x6e, 0x2d, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1d, 0x73, 0x63, 0x61, 0x6e, 0x2d, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2d, 0x70, + 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x0f, 0x73, 0x63, 0x61, 0x6e, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1a, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x70, 0x69, + 0x78, 0x65, 0x6c, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2d, + 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x73, 0x70, 0x65, 0x63, + 0x74, 0x72, 0x75, 0x6d, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x17, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x73, + 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0e, 0x74, 0x61, 0x67, 0x2d, 0x6d, 0x73, + 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0f, 0x74, 0x65, 0x73, 0x74, 0x2d, 0x6d, + 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2d, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x75, 0x73, 0x65, + 0x72, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x73, 0x2d, 0x6d, + 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x73, 0x65, 0x72, 0x2d, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x6a, 0x6f, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2d, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2d, - 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x75, 0x73, 0x65, 0x72, - 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x73, 0x2d, 0x6d, 0x73, - 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x73, 0x65, 0x72, 0x2d, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x6a, 0x6f, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x2d, 0x6d, 0x73, 0x67, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2d, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x2d, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x2d, 0x6d, - 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x75, 0x73, 0x65, 0x72, 0x2d, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x61, 0x6c, 0x2d, - 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x75, 0x73, 0x65, 0x72, - 0x2d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2d, 0x6d, 0x73, 0x67, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x2d, 0x6d, 0x73, 0x67, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x24, 0x75, 0x73, 0x65, 0x72, 0x2d, 0x6e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0e, 0x64, - 0x6f, 0x69, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x73, - 0x63, 0x72, 0x65, 0x65, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, - 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x6d, 0x73, 0x67, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, - 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9e, 0xcb, 0x01, 0x0a, - 0x09, 0x57, 0x53, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x73, - 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, - 0x12, 0x27, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x54, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x74, 0x12, 0x31, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x44, 0x42, 0x52, 0x65, 0x71, 0x18, 0xb7, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x44, 0x42, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0b, 0x62, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x44, 0x42, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x0c, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x44, 0x42, 0x52, 0x65, 0x73, 0x70, 0x18, 0xb8, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0d, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x44, 0x42, 0x52, 0x65, 0x73, 0x70, - 0x48, 0x00, 0x52, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x44, 0x42, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x31, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x44, 0x42, 0x55, 0x70, 0x64, 0x18, - 0xb9, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x44, - 0x42, 0x55, 0x70, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x44, 0x42, - 0x55, 0x70, 0x64, 0x12, 0x49, 0x0a, 0x13, 0x64, 0x42, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xba, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x44, 0x42, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x13, 0x64, 0x42, 0x41, 0x64, 0x6d, - 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x4c, - 0x0a, 0x14, 0x64, 0x42, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xbb, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x44, 0x42, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x14, 0x64, 0x42, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x55, 0x0a, 0x17, - 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x18, 0xc6, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x17, 0x64, 0x61, 0x74, 0x61, - 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x12, 0x58, 0x0a, 0x18, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x41, 0x64, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, - 0xc7, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x48, 0x00, 0x52, 0x18, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x41, - 0x64, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3f, 0x0a, - 0x10, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, 0x64, 0x61, - 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x42, - 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, - 0x11, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x42, 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x48, 0x00, 0x52, 0x11, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x45, 0x0a, 0x12, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x12, 0x64, 0x61, 0x74, 0x61, 0x4d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a, - 0x12, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, - 0x52, 0x12, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x12, 0x48, 0x0a, 0x13, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x13, 0x64, 0x61, 0x74, 0x61, 0x4d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x61, - 0x0a, 0x1b, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x18, 0xe0, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, + 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x2d, + 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x75, 0x73, 0x65, 0x72, + 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2d, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x61, 0x6c, + 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x75, 0x73, 0x65, + 0x72, 0x2d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2d, 0x6d, 0x73, 0x67, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x2d, 0x6d, 0x73, + 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x24, 0x75, 0x73, 0x65, 0x72, 0x2d, 0x6e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x73, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0e, + 0x64, 0x6f, 0x69, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, + 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x16, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x6d, 0x73, 0x67, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x2d, 0x6d, 0x73, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc9, 0xcc, 0x01, + 0x0a, 0x09, 0x57, 0x53, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, + 0x73, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, + 0x64, 0x12, 0x27, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x74, 0x12, 0x31, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x44, 0x42, 0x52, 0x65, 0x71, 0x18, 0xb7, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x44, 0x42, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0b, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x44, 0x42, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x0c, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x44, 0x42, 0x52, 0x65, 0x73, 0x70, 0x18, 0xb8, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x44, 0x42, 0x52, 0x65, 0x73, + 0x70, 0x48, 0x00, 0x52, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x44, 0x42, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x31, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x44, 0x42, 0x55, 0x70, 0x64, + 0x18, 0xb9, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x44, 0x42, 0x55, 0x70, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x44, + 0x42, 0x55, 0x70, 0x64, 0x12, 0x49, 0x0a, 0x13, 0x64, 0x42, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xba, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x44, 0x42, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x13, 0x64, 0x42, 0x41, 0x64, + 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, + 0x4c, 0x0a, 0x14, 0x64, 0x42, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xbb, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x44, 0x42, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x14, 0x64, 0x42, 0x41, 0x64, 0x6d, 0x69, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x55, 0x0a, + 0x17, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x18, 0xc6, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x17, 0x64, 0x61, 0x74, + 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x12, 0x58, 0x0a, 0x18, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x41, 0x64, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x18, 0xc7, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x41, 0x64, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x48, 0x00, 0x52, 0x18, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x41, 0x64, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3f, + 0x0a, 0x10, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, 0x64, + 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, + 0x42, 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, + 0x52, 0x11, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x42, 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x48, 0x00, 0x52, 0x11, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x45, 0x0a, 0x12, 0x64, 0x61, 0x74, 0x61, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x12, 0x64, 0x61, 0x74, 0x61, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, + 0x0a, 0x12, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, + 0x00, 0x52, 0x12, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x48, 0x0a, 0x13, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x13, 0x64, 0x61, 0x74, 0x61, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x61, 0x0a, 0x1b, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x69, 0x66, 0x66, 0x72, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x18, 0xe0, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x73, + 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1b, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x1b, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x69, + 0x65, 0x71, 0x12, 0x64, 0x0a, 0x1c, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x73, 0x52, 0x65, - 0x71, 0x12, 0x64, 0x0a, 0x1c, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x69, 0x66, - 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x18, 0xe1, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, - 0x61, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1c, 0x64, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, - 0x61, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x15, 0x64, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x18, 0x82, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, - 0x00, 0x52, 0x15, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x16, 0x64, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x18, 0x83, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x44, 0x65, 0x74, 0x65, + 0x73, 0x70, 0x18, 0xe1, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x65, 0x61, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1c, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x65, 0x61, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x15, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x48, 0x00, 0x52, 0x16, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x42, 0x0a, 0x11, + 0x71, 0x18, 0x82, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x48, 0x00, 0x52, 0x15, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x16, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x18, 0x83, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x16, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x42, 0x0a, + 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x71, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, - 0x71, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x11, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, - 0x12, 0x45, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x48, 0x00, 0x52, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x69, 0x0a, 0x1e, 0x64, 0x69, 0x66, 0x66, 0x72, + 0x71, 0x12, 0x45, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, + 0x73, 0x70, 0x48, 0x00, 0x52, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x69, 0x0a, 0x1e, 0x64, 0x69, 0x66, 0x66, + 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, + 0x6c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, + 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x48, 0x00, 0x52, 0x1e, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x12, 0x6c, 0x0a, 0x1f, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x44, + 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, + 0x6e, 0x75, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, + 0x52, 0x1f, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, + 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x69, 0x0a, 0x1e, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x52, 0x65, 0x71, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x44, 0x69, 0x66, 0x66, + 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, + 0x6c, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1e, 0x64, 0x69, + 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, + 0x75, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x12, 0x6c, 0x0a, 0x1f, + 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, + 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, + 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1f, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x63, 0x0a, 0x1c, 0x64, 0x69, + 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, + 0x75, 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, + 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, + 0x00, 0x52, 0x1c, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, + 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, + 0x66, 0x0a, 0x1d, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, + 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1d, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x69, 0x0a, 0x1e, 0x64, 0x69, 0x66, 0x66, 0x72, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, - 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1e, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x6c, 0x0a, 0x1f, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x44, 0x69, - 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, - 0x75, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, - 0x1f, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, - 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x69, 0x0a, 0x1e, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, - 0x65, 0x71, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x72, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, - 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1e, 0x64, 0x69, 0x66, - 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, - 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x12, 0x6c, 0x0a, 0x1f, 0x64, - 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, - 0x6e, 0x75, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x17, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1f, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x49, - 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x63, 0x0a, 0x1c, 0x64, 0x69, 0x66, - 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, - 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, - 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, - 0x52, 0x1c, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, - 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x66, - 0x0a, 0x1d, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, - 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1d, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x69, 0x0a, 0x1e, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, - 0x00, 0x52, 0x1e, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, - 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x12, 0x6c, 0x0a, 0x1f, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x44, 0x69, 0x66, - 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1f, - 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x63, 0x0a, 0x1c, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, - 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, - 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1c, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x12, 0x66, 0x0a, 0x1d, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x44, 0x69, + 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1d, 0x64, + 0x74, 0x75, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, + 0x1f, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x63, 0x0a, 0x1c, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1c, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x66, 0x0a, 0x1d, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x66, 0x0a, 0x1d, + 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1d, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x1c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1d, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x66, 0x0a, + 0x1d, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x1c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x12, 0x69, 0x0a, 0x1e, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1d, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x44, - 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, - 0x1e, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x48, 0x0a, 0x13, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x45, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x13, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x4b, 0x0a, 0x14, 0x65, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, - 0x52, 0x14, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3f, 0x0a, 0x10, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x42, 0x0a, 0x11, 0x65, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x21, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x11, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x42, 0x0a, 0x11, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x69, 0x0a, 0x1e, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x44, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, 0x6b, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, + 0x52, 0x1e, 0x64, 0x69, 0x66, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x61, + 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x48, 0x0a, 0x13, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x13, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x4b, 0x0a, 0x14, 0x65, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, + 0x00, 0x52, 0x14, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3f, 0x0a, 0x10, 0x65, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0x20, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x42, 0x0a, 0x11, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x21, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x11, 0x65, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x42, 0x0a, 0x11, + 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x11, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x11, 0x65, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, - 0x45, 0x0a, 0x12, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x45, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x48, 0x00, 0x52, 0x12, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a, 0x12, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x24, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x12, 0x65, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x48, 0x0a, - 0x13, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x48, 0x00, 0x52, 0x13, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x39, 0x0a, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0f, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x48, 0x00, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x12, 0x3c, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, - 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x48, 0x0a, 0x13, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x13, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x4b, 0x0a, 0x14, 0x65, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x14, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x6d, 0x0a, 0x1f, 0x65, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xa0, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x12, 0x45, 0x0a, 0x12, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x48, 0x00, 0x52, 0x12, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a, 0x12, 0x65, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x24, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x12, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x48, + 0x0a, 0x13, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x45, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x48, 0x00, 0x52, 0x13, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x74, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x39, 0x0a, 0x0e, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x48, 0x00, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x12, 0x3c, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, + 0x52, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x52, 0x0a, 0x16, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, + 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xea, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, + 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x16, 0x65, + 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x55, 0x0a, 0x17, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x18, 0xeb, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x48, 0x00, 0x52, 0x17, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, + 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x48, 0x0a, 0x13, + 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x45, 0x78, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, + 0x00, 0x52, 0x13, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x4b, 0x0a, 0x14, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x29, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x14, 0x65, + 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x6d, 0x0a, 0x1f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x70, 0x0a, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xa1, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xa0, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, + 0x00, 0x52, 0x1f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x12, 0x70, 0x0a, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xa1, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x48, 0x00, 0x52, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x73, 0x0a, 0x21, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x73, 0x0a, 0x21, 0x65, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xa2, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x21, 0x65, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x76, 0x0a, - 0x22, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x18, 0xa3, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x45, 0x78, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x22, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, + 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xa2, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3f, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x42, 0x0a, 0x11, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x33, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x11, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x57, 0x0a, 0x18, 0x65, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x45, - 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, 0x65, 0x78, 0x70, 0x72, 0x65, + 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x21, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x76, 0x0a, 0x22, 0x65, 0x78, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, + 0xa3, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x22, 0x65, + 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x3f, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x45, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x10, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x12, 0x42, 0x0a, 0x11, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x48, 0x00, 0x52, 0x11, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x57, 0x0a, 0x18, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x12, 0x5a, 0x0a, 0x19, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x48, 0x00, 0x52, 0x19, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x4f, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xb0, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x15, 0x65, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x12, 0x52, 0x0a, 0x16, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xb1, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x16, 0x65, 0x78, + 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, + 0x5a, 0x0a, 0x19, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x2b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, + 0x52, 0x19, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x15, 0x65, + 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x18, 0xb0, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x51, 0x0a, 0x16, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x2c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, - 0x16, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x54, 0x0a, 0x17, 0x65, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x48, 0x00, 0x52, 0x17, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x54, 0x0a, - 0x17, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x17, 0x65, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x12, 0x57, 0x0a, 0x18, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, - 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x48, 0x00, 0x52, 0x18, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x42, 0x0a, 0x11, + 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x15, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x16, + 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xb1, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x16, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x51, 0x0a, 0x16, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x16, 0x65, 0x78, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x12, 0x54, 0x0a, 0x17, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x2d, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, + 0x52, 0x17, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x54, 0x0a, 0x17, 0x65, 0x78, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x45, 0x78, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x17, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, + 0x57, 0x0a, 0x18, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x2f, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x18, + 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x42, 0x0a, 0x11, 0x65, 0x78, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x30, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x11, 0x65, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x45, 0x0a, 0x12, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x18, 0x30, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x11, 0x65, - 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x12, 0x45, 0x0a, 0x12, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x45, - 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x48, 0x00, 0x52, 0x12, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5d, 0x0a, 0x1a, 0x65, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x78, 0x65, 0x63, 0x53, 0x74, - 0x61, 0x74, 0x52, 0x65, 0x71, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x45, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x78, 0x65, - 0x63, 0x53, 0x74, 0x61, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1a, 0x65, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x78, 0x65, 0x63, 0x53, - 0x74, 0x61, 0x74, 0x52, 0x65, 0x71, 0x12, 0x60, 0x0a, 0x1b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x70, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, + 0x12, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x5d, 0x0a, 0x1a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x78, 0x65, 0x63, 0x53, 0x74, 0x61, 0x74, 0x52, 0x65, + 0x71, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x78, 0x65, 0x63, 0x53, 0x74, 0x61, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x45, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x78, 0x65, - 0x63, 0x53, 0x74, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1b, 0x65, 0x78, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x78, 0x65, 0x63, - 0x53, 0x74, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a, 0x12, 0x65, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x36, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x12, 0x65, 0x78, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, - 0x48, 0x0a, 0x13, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x45, + 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x78, 0x65, 0x63, 0x53, 0x74, 0x61, 0x74, 0x52, + 0x65, 0x71, 0x12, 0x60, 0x0a, 0x1b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x78, 0x65, 0x63, 0x53, 0x74, 0x61, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x78, 0x65, 0x63, 0x53, 0x74, 0x61, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1b, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x45, 0x78, 0x65, 0x63, 0x53, 0x74, 0x61, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a, 0x12, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x12, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x48, 0x0a, 0x13, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x48, 0x00, 0x52, 0x13, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x0f, 0x67, 0x65, 0x74, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x18, 0xac, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, - 0x69, 0x70, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0f, 0x67, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, - 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x12, 0x40, 0x0a, 0x10, 0x67, 0x65, 0x74, 0x4f, - 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x18, 0xad, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, - 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x10, 0x67, 0x65, 0x74, 0x4f, 0x77, 0x6e, - 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5e, 0x0a, 0x1a, 0x69, 0x6d, + 0x73, 0x70, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, + 0x52, 0x13, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x0f, 0x67, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, + 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x18, 0xac, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, + 0x71, 0x48, 0x00, 0x52, 0x0f, 0x67, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, + 0x70, 0x52, 0x65, 0x71, 0x12, 0x40, 0x0a, 0x10, 0x67, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x18, 0xad, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, + 0x73, 0x70, 0x48, 0x00, 0x52, 0x10, 0x67, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5e, 0x0a, 0x1a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x33, + 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x65, 0x71, 0x18, 0xda, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x18, 0xda, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1a, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x12, 0x61, 0x0a, 0x1b, 0x69, 0x6d, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1a, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x12, 0x61, 0x0a, 0x1b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x33, + 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x18, 0xdb, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, 0x69, 0x6e, 0x74, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x18, 0xdb, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, - 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, - 0x52, 0x1b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f, 0x0a, - 0x15, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x18, 0xdc, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x49, 0x6d, 0x61, 0x67, 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x15, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x33, 0x44, - 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x52, - 0x0a, 0x16, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0xdd, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x16, 0x69, 0x6d, 0x61, 0x67, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x15, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x18, 0xdc, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x5e, 0x0a, 0x1a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, + 0x71, 0x48, 0x00, 0x52, 0x15, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x16, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x18, 0xdd, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x33, 0x44, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x16, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x33, 0x44, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5e, + 0x0a, 0x1a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x18, 0xca, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, - 0x18, 0xca, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, - 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, - 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x71, 0x12, 0x61, 0x0a, 0x1b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, + 0x48, 0x00, 0x52, 0x1a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x12, 0x61, + 0x0a, 0x1b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x18, 0xcb, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, + 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x48, 0x00, 0x52, 0x1b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x18, 0xcb, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, - 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x64, 0x0a, 0x1c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, - 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x18, 0xab, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1c, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x67, 0x0a, 0x1d, 0x69, + 0x70, 0x12, 0x64, 0x0a, 0x1c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x18, 0xab, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1c, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x67, 0x0a, 0x1d, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0xac, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, + 0x00, 0x52, 0x1d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x4f, 0x0a, 0x15, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x18, 0xbe, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x15, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x12, 0x52, 0x0a, 0x16, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0xbf, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x16, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0xac, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, - 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x15, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, - 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x18, 0xbe, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, - 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x15, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x16, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, - 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, - 0xbf, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, - 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x16, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x39, 0x0a, 0x0e, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x3a, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0f, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x0e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x12, 0x3c, 0x0a, 0x0f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x0f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x46, 0x0a, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x65, 0x74, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x18, 0x86, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x12, 0x49, 0x0a, 0x13, 0x69, 0x6d, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x39, 0x0a, 0x0e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x0e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x12, 0x3c, 0x0a, 0x0f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0f, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x46, + 0x0a, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x71, 0x18, 0x86, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, + 0x48, 0x00, 0x52, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x12, 0x49, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, + 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x87, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x18, 0x87, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, - 0x52, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x31, 0x0a, 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x18, 0x88, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x0c, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x89, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, - 0x52, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x33, - 0x0a, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x3c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x12, 0x36, 0x0a, 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x69, 0x6d, - 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x34, 0x0a, 0x0c, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x18, 0x96, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, - 0x64, 0x48, 0x00, 0x52, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, - 0x64, 0x12, 0x46, 0x0a, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x79, 0x72, 0x61, 0x6d, 0x69, - 0x64, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xe0, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x79, 0x72, 0x61, 0x6d, 0x69, 0x64, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x79, 0x72, 0x61, - 0x6d, 0x69, 0x64, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x49, 0x0a, 0x13, 0x69, 0x6d, 0x61, + 0x70, 0x12, 0x31, 0x0a, 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x18, 0x88, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x18, 0x89, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0c, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x33, 0x0a, 0x0c, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, + 0x00, 0x52, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, + 0x36, 0x0a, 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x34, 0x0a, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x18, 0x96, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, + 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x48, 0x00, 0x52, + 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x12, 0x46, 0x0a, + 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x79, 0x72, 0x61, 0x6d, 0x69, 0x64, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x18, 0xe0, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x50, 0x79, 0x72, 0x61, 0x6d, 0x69, 0x64, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, + 0x00, 0x52, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x79, 0x72, 0x61, 0x6d, 0x69, 0x64, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x49, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x79, + 0x72, 0x61, 0x6d, 0x69, 0x64, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xe1, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x79, 0x72, 0x61, 0x6d, + 0x69, 0x64, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x79, 0x72, 0x61, 0x6d, 0x69, 0x64, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x18, 0xe1, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, - 0x79, 0x72, 0x61, 0x6d, 0x69, 0x64, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, - 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x79, 0x72, 0x61, 0x6d, 0x69, 0x64, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x79, 0x0a, 0x23, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x63, 0x61, - 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xe8, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x23, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, - 0x7c, 0x0a, 0x24, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xe9, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x12, 0x79, 0x0a, 0x23, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xe8, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x24, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x63, - 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x45, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a, - 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x71, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x49, 0x6d, 0x61, 0x67, - 0x65, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, - 0x52, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x71, 0x12, 0x48, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x40, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5b, - 0x0a, 0x19, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x18, 0x8a, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x48, 0x00, - 0x52, 0x19, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x5e, 0x0a, 0x1a, 0x69, + 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x23, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x63, 0x61, + 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x7c, 0x0a, 0x24, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x44, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x18, 0xe9, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x44, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x48, 0x00, 0x52, 0x24, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a, 0x12, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x18, + 0x3f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x12, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, + 0x12, 0x48, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5b, 0x0a, 0x19, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x18, 0x8a, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x19, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x5e, 0x0a, 0x1a, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x53, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x52, 0x65, 0x73, 0x70, 0x18, 0x8b, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x18, 0x8b, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, - 0x1a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x12, 0x49, 0x0a, 0x13, 0x69, + 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1a, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x12, 0x49, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x54, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xe2, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x18, 0xe2, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x49, 0x6d, 0x61, 0x67, - 0x65, 0x54, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, - 0x00, 0x52, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x4c, 0x0a, 0x14, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x54, - 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xe3, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x14, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x58, 0x0a, 0x18, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, - 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x18, 0xe4, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x54, - 0x69, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x5b, - 0x0a, 0x19, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xe5, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, - 0x52, 0x19, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x58, 0x0a, 0x18, 0x69, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x72, 0x73, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x18, 0x91, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x72, 0x73, 0x56, 0x69, 0x65, 0x77, 0x65, - 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, 0x69, 0x6d, 0x70, + 0x65, 0x71, 0x12, 0x4c, 0x0a, 0x14, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xe3, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x14, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x54, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x58, 0x0a, 0x18, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xe4, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x18, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x5b, 0x0a, 0x19, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xe5, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x19, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x58, 0x0a, 0x18, 0x69, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x4d, 0x61, 0x72, 0x73, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x71, 0x18, 0x91, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x72, 0x73, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x5b, 0x0a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, - 0x61, 0x72, 0x73, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x18, 0x92, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x49, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x4d, 0x61, 0x72, 0x73, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, + 0x67, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x72, 0x73, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x58, 0x0a, 0x18, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x72, 0x73, - 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x70, 0x64, 0x18, 0x93, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x61, - 0x72, 0x73, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x70, 0x64, - 0x48, 0x00, 0x52, 0x18, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x72, 0x73, 0x56, 0x69, - 0x65, 0x77, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x70, 0x64, 0x12, 0x2e, 0x0a, 0x0a, - 0x6a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0xa8, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0b, 0x2e, 0x4a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, - 0x52, 0x0a, 0x6a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x31, 0x0a, 0x0b, - 0x6a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xa9, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x4a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x48, 0x00, 0x52, 0x0b, 0x6a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x2e, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x18, 0xaa, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x4a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, - 0x64, 0x48, 0x00, 0x52, 0x0a, 0x6a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x12, - 0x39, 0x0a, 0x0e, 0x6c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, - 0x71, 0x18, 0x43, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0e, 0x6c, 0x6f, 0x67, 0x47, - 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x3c, 0x0a, 0x0f, 0x6c, 0x6f, - 0x67, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x18, 0x44, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0f, 0x6c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x52, - 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x18, 0x45, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x4c, - 0x6f, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0a, 0x6c, 0x6f, 0x67, - 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x12, 0x30, 0x0a, 0x0b, 0x6c, 0x6f, 0x67, 0x52, 0x65, - 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x18, 0x46, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x4c, - 0x6f, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6c, 0x6f, - 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x39, 0x0a, 0x0e, 0x6c, 0x6f, 0x67, - 0x53, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x18, 0x47, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0f, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x0e, 0x6c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x52, 0x65, 0x71, 0x12, 0x3c, 0x0a, 0x0f, 0x6c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x18, 0x48, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x0f, 0x6c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x55, 0x0a, 0x17, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x42, 0x79, 0x52, 0x65, 0x67, 0x65, 0x78, 0x52, 0x65, 0x71, 0x18, 0xc4, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x42, 0x79, 0x52, 0x65, 0x67, 0x65, 0x78, 0x52, 0x65, 0x71, 0x48, 0x00, - 0x52, 0x17, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, - 0x79, 0x52, 0x65, 0x67, 0x65, 0x78, 0x52, 0x65, 0x71, 0x12, 0x58, 0x0a, 0x18, 0x6d, 0x65, 0x6d, - 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x79, 0x52, 0x65, 0x67, 0x65, - 0x78, 0x52, 0x65, 0x73, 0x70, 0x18, 0xc5, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x4d, - 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x79, 0x52, 0x65, - 0x67, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x18, 0x6d, 0x65, 0x6d, 0x6f, 0x69, + 0x71, 0x12, 0x5b, 0x0a, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x72, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x92, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x61, + 0x72, 0x73, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x48, 0x00, 0x52, 0x19, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x72, 0x73, 0x56, + 0x69, 0x65, 0x77, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x58, + 0x0a, 0x18, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x72, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x70, 0x64, 0x18, 0x93, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x72, 0x73, 0x56, 0x69, + 0x65, 0x77, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x70, 0x64, 0x48, 0x00, 0x52, 0x18, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x72, 0x73, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x70, 0x64, 0x12, 0x2e, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0xa8, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, + 0x4a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0a, 0x6a, 0x6f, + 0x62, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x31, 0x0a, 0x0b, 0x6a, 0x6f, 0x62, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xa9, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x4a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0b, + 0x6a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2e, 0x0a, 0x0a, 0x6a, + 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x18, 0xaa, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0b, 0x2e, 0x4a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x48, 0x00, 0x52, + 0x0a, 0x6a, 0x6f, 0x62, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x12, 0x39, 0x0a, 0x0e, 0x6c, + 0x6f, 0x67, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x18, 0x43, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0e, 0x6c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x3c, 0x0a, 0x0f, 0x6c, 0x6f, 0x67, 0x47, 0x65, 0x74, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x48, 0x00, 0x52, 0x0f, 0x6c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x2d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, + 0x65, 0x71, 0x18, 0x45, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x65, + 0x61, 0x64, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0a, 0x6c, 0x6f, 0x67, 0x52, 0x65, 0x61, 0x64, + 0x52, 0x65, 0x71, 0x12, 0x30, 0x0a, 0x0b, 0x6c, 0x6f, 0x67, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x18, 0x46, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x65, + 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6c, 0x6f, 0x67, 0x52, 0x65, 0x61, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x39, 0x0a, 0x0e, 0x6c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, + 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x0e, 0x6c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, + 0x12, 0x3c, 0x0a, 0x0f, 0x6c, 0x6f, 0x67, 0x53, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, + 0x65, 0x73, 0x70, 0x18, 0x48, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x4c, 0x6f, 0x67, 0x53, + 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0f, 0x6c, + 0x6f, 0x67, 0x53, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x55, + 0x0a, 0x17, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, + 0x79, 0x52, 0x65, 0x67, 0x65, 0x78, 0x52, 0x65, 0x71, 0x18, 0xc4, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x42, 0x79, 0x52, 0x65, 0x67, 0x65, 0x78, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x17, 0x6d, 0x65, + 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x79, 0x52, 0x65, 0x67, + 0x65, 0x78, 0x52, 0x65, 0x71, 0x12, 0x58, 0x0a, 0x18, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x79, 0x52, 0x65, 0x67, 0x65, 0x78, 0x52, 0x65, 0x73, + 0x70, 0x18, 0xc5, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x79, 0x52, 0x65, 0x67, 0x65, 0x78, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x40, 0x0a, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xc2, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x48, 0x00, 0x52, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x43, 0x0a, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xc3, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a, 0x14, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x52, - 0x65, 0x71, 0x18, 0xc8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, - 0x48, 0x00, 0x52, 0x14, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x12, 0x4f, 0x0a, 0x15, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x18, 0xc9, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, - 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x48, 0x00, 0x52, 0x15, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x52, 0x0a, 0x16, 0x6e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x6d, 0x69, 0x73, 0x73, - 0x52, 0x65, 0x71, 0x18, 0x9e, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x4e, 0x6f, 0x74, + 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x18, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x42, 0x79, 0x52, 0x65, 0x67, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x40, 0x0a, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x18, 0xc2, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x4d, 0x65, 0x6d, + 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, + 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x12, 0x43, 0x0a, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xc3, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x4d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x48, 0x00, 0x52, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a, 0x14, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x51, + 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x18, 0xc8, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x51, 0x75, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x14, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, + 0x65, 0x52, 0x65, 0x71, 0x12, 0x4f, 0x0a, 0x15, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x51, 0x75, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xc9, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x51, 0x75, 0x61, 0x6e, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x15, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x52, 0x0a, 0x16, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x52, 0x65, 0x71, 0x18, + 0x9e, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x52, 0x65, 0x71, 0x48, + 0x00, 0x52, 0x16, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x69, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x55, 0x0a, 0x17, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x6d, 0x69, 0x73, 0x73, - 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x16, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x55, 0x0a, - 0x17, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, - 0x6d, 0x69, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0x9f, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, - 0x73, 0x6d, 0x69, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x17, 0x6e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x6d, 0x69, 0x73, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x0f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x18, 0x8c, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x48, 0x00, 0x52, 0x0f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x12, 0x40, 0x0a, 0x10, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0x8d, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x48, 0x00, 0x52, 0x10, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x0f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x18, 0x93, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, - 0x64, 0x48, 0x00, 0x52, 0x0f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x55, 0x70, 0x64, 0x12, 0x49, 0x0a, 0x13, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x64, - 0x69, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x18, 0xae, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x64, 0x69, 0x74, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x13, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x45, 0x64, 0x69, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, - 0x4c, 0x0a, 0x14, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x64, 0x69, 0x74, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0xaf, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x52, 0x65, 0x73, 0x70, 0x18, 0x9f, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x6d, 0x69, 0x73, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x17, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x3d, 0x0a, 0x0f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x18, 0x8c, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x4e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0f, + 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, + 0x40, 0x0a, 0x10, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x18, 0x8d, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x4e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, + 0x10, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x3d, 0x0a, 0x0f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x70, 0x64, 0x18, 0x93, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x48, 0x00, 0x52, + 0x0f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, + 0x12, 0x49, 0x0a, 0x13, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x64, 0x69, 0x74, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x18, 0xae, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x64, 0x69, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x14, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, - 0x64, 0x69, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a, - 0x14, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, - 0x6c, 0x65, 0x52, 0x65, 0x71, 0x18, 0xde, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x50, - 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x14, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x4f, 0x0a, 0x15, 0x70, - 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x18, 0xdf, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x50, 0x69, - 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x15, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4b, 0x0a, 0x14, + 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x13, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x64, + 0x69, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x4c, 0x0a, 0x14, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x64, 0x69, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x18, 0xaf, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x45, 0x64, 0x69, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x48, 0x00, 0x52, 0x14, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x64, 0x69, 0x74, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a, 0x14, 0x70, 0x69, 0x71, + 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x18, 0xde, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x48, + 0x00, 0x52, 0x14, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x4f, 0x0a, 0x15, 0x70, 0x69, 0x71, 0x75, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x18, 0xdf, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, + 0x00, 0x52, 0x15, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4b, 0x0a, 0x14, 0x70, 0x69, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x18, 0x49, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, + 0x14, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x4e, 0x0a, 0x15, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x4a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x15, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x18, 0x49, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x50, 0x69, 0x71, - 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x48, 0x00, 0x52, 0x14, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x4e, 0x0a, 0x15, 0x70, 0x69, 0x71, - 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x48, 0x00, 0x52, 0x15, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x54, 0x0a, 0x17, 0x70, 0x69, 0x71, - 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x50, 0x69, 0x71, - 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x17, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, - 0x57, 0x0a, 0x18, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0x4c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x18, - 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x63, 0x0a, 0x1c, 0x70, 0x69, 0x71, 0x75, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x54, 0x0a, 0x17, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x18, 0x4b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x48, 0x00, 0x52, 0x17, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x57, 0x0a, 0x18, 0x70, + 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x18, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, - 0x1c, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x66, 0x0a, - 0x1d, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x4e, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1d, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x63, 0x0a, 0x1c, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x57, 0x0a, 0x18, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, + 0x74, 0x52, 0x65, 0x71, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x50, 0x69, 0x71, + 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1c, 0x70, 0x69, 0x71, + 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x66, 0x0a, 0x1d, 0x70, 0x69, 0x71, + 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x48, 0x00, 0x52, 0x1d, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x57, 0x0a, 0x18, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x18, 0x4f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x18, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x5a, 0x0a, 0x19, 0x70, 0x69, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x19, 0x70, 0x69, 0x71, + 0x75, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4e, 0x0a, 0x15, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, + 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, + 0x15, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x51, 0x0a, 0x16, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x18, 0x52, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, + 0x00, 0x52, 0x16, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x66, 0x0a, 0x1d, 0x70, 0x69, 0x71, + 0x75, 0x61, 0x6e, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x48, 0x00, 0x52, 0x1d, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, - 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x5a, - 0x0a, 0x19, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0x50, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, - 0x19, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4e, 0x0a, 0x15, 0x70, 0x69, - 0x71, 0x75, 0x61, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x50, 0x69, 0x71, 0x75, - 0x61, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x48, 0x00, 0x52, 0x15, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x51, 0x0a, 0x16, 0x70, 0x69, - 0x71, 0x75, 0x61, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x18, 0x52, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x50, 0x69, 0x71, - 0x75, 0x61, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x16, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x66, 0x0a, - 0x1d, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x18, 0x53, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1d, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x69, 0x0a, 0x1e, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x50, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, - 0x52, 0x1e, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x45, 0x0a, 0x12, 0x70, 0x73, 0x65, 0x75, 0x64, 0x6f, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x18, 0x55, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x50, - 0x73, 0x65, 0x75, 0x64, 0x6f, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x52, 0x65, - 0x71, 0x48, 0x00, 0x52, 0x12, 0x70, 0x73, 0x65, 0x75, 0x64, 0x6f, 0x49, 0x6e, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x12, 0x48, 0x0a, 0x13, 0x70, 0x73, 0x65, 0x75, 0x64, - 0x6f, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x18, 0x56, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x50, 0x73, 0x65, 0x75, 0x64, 0x6f, 0x49, 0x6e, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x13, 0x70, 0x73, - 0x65, 0x75, 0x64, 0x6f, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x64, 0x0a, 0x1c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x5a, 0x65, 0x6e, 0x6f, 0x64, 0x6f, 0x52, 0x65, - 0x71, 0x18, 0xf2, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x5a, 0x65, - 0x6e, 0x6f, 0x64, 0x6f, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1c, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x5a, 0x65, - 0x6e, 0x6f, 0x64, 0x6f, 0x52, 0x65, 0x71, 0x12, 0x67, 0x0a, 0x1d, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x5a, 0x65, - 0x6e, 0x6f, 0x64, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x18, 0xf3, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x5a, 0x65, 0x6e, 0x6f, 0x64, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x1d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x5a, 0x65, 0x6e, 0x6f, 0x64, 0x6f, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x37, 0x0a, 0x0d, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x42, 0x6c, 0x65, 0x73, 0x73, 0x52, 0x65, - 0x71, 0x18, 0xca, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, - 0x42, 0x6c, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0d, 0x71, 0x75, 0x61, 0x6e, - 0x74, 0x42, 0x6c, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x3a, 0x0a, 0x0e, 0x71, 0x75, 0x61, - 0x6e, 0x74, 0x42, 0x6c, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0xcb, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x42, 0x6c, 0x65, 0x73, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x42, 0x6c, 0x65, 0x73, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x52, 0x0a, 0x16, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, - 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, - 0xcc, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, - 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, - 0x00, 0x52, 0x16, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x55, 0x0a, 0x17, 0x71, 0x75, 0x61, - 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x18, 0xcd, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x51, 0x75, - 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x17, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, + 0x71, 0x12, 0x69, 0x0a, 0x1e, 0x70, 0x69, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x50, 0x69, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1e, 0x70, 0x69, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a, 0x12, + 0x70, 0x73, 0x65, 0x75, 0x64, 0x6f, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x52, + 0x65, 0x71, 0x18, 0x55, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x50, 0x73, 0x65, 0x75, 0x64, + 0x6f, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, + 0x12, 0x70, 0x73, 0x65, 0x75, 0x64, 0x6f, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, + 0x52, 0x65, 0x71, 0x12, 0x48, 0x0a, 0x13, 0x70, 0x73, 0x65, 0x75, 0x64, 0x6f, 0x49, 0x6e, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x18, 0x56, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x50, 0x73, 0x65, 0x75, 0x64, 0x6f, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x13, 0x70, 0x73, 0x65, 0x75, 0x64, 0x6f, + 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x12, 0x64, 0x0a, + 0x1c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x54, 0x6f, 0x5a, 0x65, 0x6e, 0x6f, 0x64, 0x6f, 0x52, 0x65, 0x71, 0x18, 0xf2, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x5a, 0x65, 0x6e, 0x6f, 0x64, 0x6f, + 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x5a, 0x65, 0x6e, 0x6f, 0x64, 0x6f, + 0x52, 0x65, 0x71, 0x12, 0x67, 0x0a, 0x1d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x5a, 0x65, 0x6e, 0x6f, 0x64, 0x6f, + 0x52, 0x65, 0x73, 0x70, 0x18, 0xf3, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x50, 0x75, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, + 0x6f, 0x5a, 0x65, 0x6e, 0x6f, 0x64, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1d, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x54, 0x6f, 0x5a, 0x65, 0x6e, 0x6f, 0x64, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x37, 0x0a, 0x0d, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x42, 0x6c, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x18, 0xca, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x42, 0x6c, 0x65, 0x73, + 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0d, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x42, 0x6c, 0x65, + 0x73, 0x73, 0x52, 0x65, 0x71, 0x12, 0x3a, 0x0a, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x42, 0x6c, + 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0xcb, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, + 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x42, 0x6c, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, + 0x00, 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x42, 0x6c, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x52, 0x0a, 0x16, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xcc, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x16, 0x71, + 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x55, 0x0a, 0x17, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x58, 0x0a, 0x18, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, - 0x4c, 0x69, 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xce, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, - 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, - 0x52, 0x18, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x5b, 0x0a, 0x19, 0x71, 0x75, - 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xcf, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x19, 0x71, 0x75, + 0x18, 0xcd, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, + 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x48, 0x00, 0x52, 0x17, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x58, 0x0a, 0x18, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xce, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, - 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x18, 0xd0, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, - 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x12, 0x40, 0x0a, 0x10, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, - 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd1, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x10, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, - 0x62, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3a, 0x0a, 0x0e, 0x71, 0x75, 0x61, 0x6e, - 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x8e, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0f, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x12, 0x3d, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x8f, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x48, 0x00, 0x52, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x3a, 0x0a, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x55, 0x70, 0x64, 0x18, 0x90, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x51, - 0x75, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x64, 0x48, 0x00, 0x52, - 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x64, 0x12, - 0x3a, 0x0a, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x18, 0xd2, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0e, 0x71, 0x75, 0x61, - 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x3d, 0x0a, 0x0f, 0x71, - 0x75, 0x61, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd3, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x31, 0x0a, 0x0b, 0x71, 0x75, - 0x61, 0x6e, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xd4, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, - 0x52, 0x0b, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, - 0x0c, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd5, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0c, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x15, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x61, 0x73, 0x74, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xd6, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x15, 0x71, - 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x16, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x61, 0x73, - 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd7, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x61, 0x73, - 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, - 0x52, 0x16, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x34, 0x0a, 0x0c, 0x71, 0x75, 0x61, 0x6e, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0xd8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, - 0x52, 0x0c, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x37, - 0x0a, 0x0d, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, - 0xd9, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3a, 0x0a, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, - 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xad, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0f, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x48, 0x00, 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x12, 0x3d, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xae, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x51, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0xaf, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x51, - 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, - 0x52, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x12, 0x40, 0x0a, 0x10, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xb0, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x51, - 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x10, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x18, 0xda, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x51, 0x75, 0x61, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x48, - 0x00, 0x52, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, - 0x65, 0x71, 0x12, 0x40, 0x0a, 0x10, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x18, 0xdb, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x51, 0x75, 0x61, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x48, 0x00, 0x52, 0x10, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x46, 0x0a, 0x12, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x52, 0x61, 0x77, - 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xb1, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x52, 0x61, 0x77, 0x44, 0x61, 0x74, 0x61, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x12, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x52, - 0x61, 0x77, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x49, 0x0a, 0x13, + 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x5b, 0x0a, 0x19, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, + 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x18, 0xcf, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x51, 0x75, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x19, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, + 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, + 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x18, 0xd0, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x48, + 0x00, 0x52, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x52, + 0x65, 0x71, 0x12, 0x40, 0x0a, 0x10, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, + 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd1, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x48, 0x00, 0x52, 0x10, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x3a, 0x0a, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x8e, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, + 0x51, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x12, 0x3d, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x18, 0x8f, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x51, 0x75, 0x61, + 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0f, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x3a, 0x0a, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, + 0x64, 0x18, 0x90, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x64, 0x48, 0x00, 0x52, 0x0e, 0x71, 0x75, 0x61, + 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x64, 0x12, 0x3a, 0x0a, 0x0e, 0x71, + 0x75, 0x61, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xd2, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x3d, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd3, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x31, 0x0a, 0x0b, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xd4, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x51, + 0x75, 0x61, 0x6e, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0b, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x0c, 0x71, 0x75, 0x61, + 0x6e, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd5, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, + 0x00, 0x52, 0x0c, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x4f, 0x0a, 0x15, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xd6, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x15, 0x71, 0x75, 0x61, 0x6e, 0x74, + 0x4c, 0x61, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x12, 0x52, 0x0a, 0x16, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd7, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x16, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x34, 0x0a, 0x0c, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x18, 0xd8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x51, 0x75, + 0x61, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0c, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x37, 0x0a, 0x0d, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd9, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x3a, 0x0a, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xad, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x51, + 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, + 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, + 0x3d, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x18, 0xae, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x51, 0x75, 0x61, 0x6e, + 0x74, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0f, 0x71, + 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3d, + 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x18, 0xaf, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, + 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0f, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x40, 0x0a, + 0x10, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x18, 0xb0, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, + 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x10, 0x71, + 0x75, 0x61, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x3d, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, + 0x65, 0x71, 0x18, 0xda, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x51, 0x75, 0x61, 0x6e, + 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0f, 0x71, + 0x75, 0x61, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x12, 0x40, + 0x0a, 0x10, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x18, 0xdb, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x51, 0x75, 0x61, 0x6e, + 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x10, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x46, 0x0a, 0x12, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x52, 0x61, 0x77, 0x44, 0x61, 0x74, 0x61, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xb1, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x51, 0x75, 0x61, 0x6e, 0x74, 0x52, 0x61, 0x77, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x48, 0x00, 0x52, 0x12, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x52, 0x61, 0x77, 0x44, 0x61, + 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x49, 0x0a, 0x13, 0x71, 0x75, 0x61, 0x6e, + 0x74, 0x52, 0x61, 0x77, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, + 0xb2, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x52, 0x61, + 0x77, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x13, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x52, 0x61, 0x77, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x18, 0xb2, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x51, 0x75, 0x61, - 0x6e, 0x74, 0x52, 0x61, 0x77, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x48, 0x00, 0x52, 0x13, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x52, 0x61, 0x77, 0x44, 0x61, 0x74, 0x61, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3a, 0x0a, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x18, 0xdc, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0f, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, - 0x71, 0x48, 0x00, 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x65, 0x71, 0x12, 0x3d, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x18, 0xdd, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x51, 0x75, 0x61, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x5b, 0x0a, 0x19, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x42, 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, - 0xd8, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x42, 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x19, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x42, 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, - 0x5e, 0x0a, 0x1a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x42, 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd9, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x42, 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x48, 0x00, 0x52, 0x1a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x42, 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x65, 0x73, 0x70, 0x12, 0x3a, 0x0a, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x71, 0x18, 0xdc, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x51, + 0x75, 0x61, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, + 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x12, + 0x3d, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x18, 0xdd, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x51, 0x75, 0x61, 0x6e, + 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0f, 0x71, + 0x75, 0x61, 0x6e, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5b, + 0x0a, 0x19, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x42, + 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xd8, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x42, 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x19, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x42, + 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x5e, 0x0a, 0x1a, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x42, 0x75, 0x6c, 0x6b, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd9, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x42, 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, + 0x1a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x42, 0x75, + 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x52, 0x0a, 0x16, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xd0, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x16, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, + 0x55, 0x0a, 0x17, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd1, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x17, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x49, 0x0a, 0x13, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xd2, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x13, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x12, 0x4c, 0x0a, 0x14, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd3, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x14, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x4c, 0x0a, 0x14, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0xd4, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x14, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x4f, 0x0a, + 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd5, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f, + 0x0a, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xd6, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x16, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xd0, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd7, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x16, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x12, 0x55, 0x0a, 0x17, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd1, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x17, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x49, 0x0a, 0x13, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x18, 0xd2, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, - 0x52, 0x13, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x4c, 0x0a, 0x14, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd3, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x14, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a, 0x14, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0xd4, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x14, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x12, 0x4f, 0x0a, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd5, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x15, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xd6, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x15, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x16, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xd7, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x44, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, - 0x16, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x70, 0x0a, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, - 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x44, - 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xee, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x16, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x70, 0x0a, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x75, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xee, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, + 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x48, 0x00, 0x52, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x73, 0x0a, 0x21, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x75, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x73, 0x0a, 0x21, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, - 0x6b, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xef, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x75, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x21, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, - 0x6b, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x64, - 0x0a, 0x1c, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, - 0x73, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xec, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1c, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x12, 0x67, 0x0a, 0x1d, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xed, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, - 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1d, - 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, - 0x42, 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5a, 0x0a, - 0x19, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, - 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x57, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x65, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x19, - 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x5d, 0x0a, 0x1a, 0x72, 0x65, 0x67, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xef, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x21, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, + 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x75, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x64, 0x0a, 0x1c, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, + 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xec, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x48, 0x00, 0x52, 0x1c, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x12, 0x67, 0x0a, 0x1d, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x18, 0xed, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1d, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x42, 0x75, 0x6c, 0x6b, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5a, 0x0a, 0x19, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x58, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1a, 0x72, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x7f, 0x0a, 0x25, 0x72, 0x65, 0x67, 0x69, - 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x18, 0xf6, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, - 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x48, 0x00, 0x52, 0x25, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x82, 0x01, 0x0a, 0x26, 0x72, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x18, 0xf7, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x26, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x57, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x19, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x5d, 0x0a, 0x1a, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, + 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x18, 0x58, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1a, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x7f, 0x0a, 0x25, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x85, - 0x01, 0x0a, 0x27, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xf4, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xf6, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x25, + 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, + 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x82, 0x01, 0x0a, 0x26, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x18, 0xf7, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x48, 0x00, 0x52, 0x26, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x27, 0x72, + 0x6e, 0x67, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x85, 0x01, 0x0a, 0x27, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x88, 0x01, 0x0a, 0x28, 0x72, 0x65, 0x67, 0x69, 0x6f, + 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xf4, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, + 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x27, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x18, 0xf5, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x52, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x28, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, + 0x65, 0x71, 0x12, 0x88, 0x01, 0x0a, 0x28, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, + 0xf5, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x51, 0x0a, 0x16, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x65, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0x5b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x65, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x16, 0x72, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x12, 0x54, 0x0a, 0x17, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, - 0x5c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x17, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x65, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x54, 0x0a, 0x17, 0x72, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x59, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x17, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, - 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x12, 0x57, 0x0a, 0x18, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x5a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, - 0x18, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x57, 0x0a, 0x18, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x70, 0x48, 0x00, 0x52, 0x28, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x51, 0x0a, + 0x16, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, + 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x16, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x12, 0x54, 0x0a, 0x17, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x65, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x5c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x65, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x17, 0x72, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x54, 0x0a, 0x17, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x18, 0x59, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x48, 0x00, 0x52, 0x17, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x57, 0x0a, 0x18, + 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, + 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x18, 0x72, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x57, 0x0a, 0x18, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, + 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x12, 0x5a, 0x0a, 0x19, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, - 0x5e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x48, 0x00, 0x52, 0x19, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x65, 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x34, - 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x42, 0x52, 0x65, 0x71, 0x18, 0xbc, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, - 0x42, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, - 0x42, 0x52, 0x65, 0x71, 0x12, 0x37, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, - 0x42, 0x52, 0x65, 0x73, 0x70, 0x18, 0xbd, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x52, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x42, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0d, - 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x42, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5e, 0x0a, - 0x1a, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, 0x63, 0x4c, 0x69, - 0x6e, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xbe, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, - 0x69, 0x63, 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, - 0x00, 0x52, 0x1a, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, 0x63, - 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x61, 0x0a, + 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x5a, + 0x0a, 0x19, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, + 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x5e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x65, 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, + 0x19, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, + 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x34, 0x0a, 0x0c, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x42, 0x52, 0x65, 0x71, 0x18, 0xbc, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x42, 0x52, 0x65, 0x71, + 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x42, 0x52, 0x65, 0x71, + 0x12, 0x37, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x42, 0x52, 0x65, 0x73, + 0x70, 0x18, 0xbd, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x44, 0x42, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x44, 0x42, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5e, 0x0a, 0x1a, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, 0x63, 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xbe, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, 0x63, 0x4c, 0x69, + 0x6e, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1a, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, 0x63, 0x4c, 0x69, 0x6e, 0x6b, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x61, 0x0a, 0x1b, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, 0x63, 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xbf, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, 0x63, 0x4c, + 0x69, 0x6e, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1b, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, 0x63, 0x4c, 0x69, - 0x6e, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xbf, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, - 0x67, 0x69, 0x63, 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x48, 0x00, 0x52, 0x1b, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, - 0x69, 0x63, 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x5b, 0x0a, 0x19, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, - 0x63, 0x4c, 0x69, 0x6e, 0x6b, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x18, 0xc0, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, - 0x61, 0x67, 0x69, 0x63, 0x4c, 0x69, 0x6e, 0x6b, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, - 0x48, 0x00, 0x52, 0x19, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, - 0x63, 0x4c, 0x69, 0x6e, 0x6b, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x5e, 0x0a, - 0x1a, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, 0x63, 0x4c, 0x69, - 0x6e, 0x6b, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0xc1, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, - 0x69, 0x63, 0x4c, 0x69, 0x6e, 0x6b, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x1a, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, 0x63, - 0x4c, 0x69, 0x6e, 0x6b, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2d, 0x0a, - 0x0a, 0x72, 0x75, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x5f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0b, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, - 0x52, 0x0a, 0x72, 0x75, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x30, 0x0a, 0x0b, - 0x72, 0x75, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x60, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0c, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x0b, 0x72, 0x75, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x40, - 0x0a, 0x10, 0x73, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, - 0x65, 0x71, 0x18, 0x97, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x63, 0x61, 0x6e, - 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, - 0x73, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, - 0x12, 0x43, 0x0a, 0x11, 0x73, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x98, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x53, - 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x48, 0x00, 0x52, 0x11, 0x73, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x15, 0x73, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, - 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x99, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, - 0x53, 0x68, 0x61, 0x72, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, - 0x15, 0x73, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x16, 0x73, 0x63, 0x61, 0x6e, 0x41, 0x75, - 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x18, 0x9a, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x41, 0x75, - 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x48, 0x00, 0x52, 0x16, 0x73, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, - 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a, 0x14, 0x73, 0x63, - 0x61, 0x6e, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x18, 0xc0, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x53, 0x63, 0x61, 0x6e, - 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x48, 0x00, 0x52, 0x14, 0x73, 0x63, 0x61, 0x6e, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x4f, 0x0a, 0x15, 0x73, 0x63, 0x61, 0x6e, - 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x18, 0xc1, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x42, - 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x48, 0x00, 0x52, 0x15, 0x73, 0x63, 0x61, 0x6e, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x58, 0x0a, 0x18, 0x73, 0x63, 0x61, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, - 0x65, 0x64, 0x52, 0x65, 0x71, 0x18, 0xe6, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x53, - 0x63, 0x61, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x66, - 0x69, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, 0x73, 0x63, 0x61, 0x6e, 0x43, + 0x6e, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5b, 0x0a, 0x19, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, 0x63, 0x4c, 0x69, 0x6e, + 0x6b, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x18, 0xc0, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, 0x63, + 0x4c, 0x69, 0x6e, 0x6b, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x19, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, 0x63, 0x4c, 0x69, 0x6e, + 0x6b, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x5e, 0x0a, 0x1a, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, 0x63, 0x4c, 0x69, 0x6e, 0x6b, 0x4c, 0x6f, + 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0xc1, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, 0x63, 0x4c, 0x69, + 0x6e, 0x6b, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1a, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x4d, 0x61, 0x67, 0x69, 0x63, 0x4c, 0x69, 0x6e, 0x6b, + 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2d, 0x0a, 0x0a, 0x72, 0x75, 0x6e, + 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, + 0x52, 0x75, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x75, + 0x6e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x30, 0x0a, 0x0b, 0x72, 0x75, 0x6e, 0x54, + 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x60, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x52, 0x75, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x72, + 0x75, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x40, 0x0a, 0x10, 0x73, 0x63, + 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x18, 0x97, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, + 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, 0x73, 0x63, 0x61, 0x6e, + 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x12, 0x43, 0x0a, 0x11, + 0x73, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x18, 0x98, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x41, + 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x11, + 0x73, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x4f, 0x0a, 0x15, 0x73, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, + 0x72, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x99, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, + 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x15, 0x73, 0x63, 0x61, + 0x6e, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x12, 0x52, 0x0a, 0x16, 0x73, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, + 0x61, 0x72, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x9a, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, + 0x61, 0x72, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x16, + 0x73, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a, 0x14, 0x73, 0x63, 0x61, 0x6e, 0x42, 0x65, + 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x18, 0xc0, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x42, 0x65, 0x61, 0x6d, + 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x14, + 0x73, 0x63, 0x61, 0x6e, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x12, 0x4f, 0x0a, 0x15, 0x73, 0x63, 0x61, 0x6e, 0x42, 0x65, 0x61, 0x6d, + 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0xc1, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x42, 0x65, 0x61, 0x6d, 0x4c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x15, + 0x73, 0x63, 0x61, 0x6e, 0x42, 0x65, 0x61, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x58, 0x0a, 0x18, 0x73, 0x63, 0x61, 0x6e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x52, 0x65, + 0x71, 0x18, 0xe6, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, - 0x52, 0x65, 0x71, 0x12, 0x5b, 0x0a, 0x19, 0x73, 0x63, 0x61, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x18, 0xe7, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x19, 0x73, 0x63, 0x61, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x37, 0x0a, 0x0d, 0x73, 0x63, 0x61, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x18, 0x94, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0d, 0x73, 0x63, 0x61, 0x6e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x3a, 0x0a, 0x0e, 0x73, 0x63, 0x61, - 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x95, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x63, 0x61, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a, 0x14, 0x73, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x18, 0xc2, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x14, 0x73, - 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x65, 0x71, 0x12, 0x4f, 0x0a, 0x15, 0x73, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x18, 0xc3, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x15, 0x73, - 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x34, 0x0a, 0x0c, 0x73, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x18, 0xc4, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x53, 0x63, - 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x63, - 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x37, 0x0a, 0x0d, 0x73, 0x63, - 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x18, 0xc5, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x73, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x2e, 0x0a, 0x0a, 0x73, 0x63, 0x61, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x18, 0xa4, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x63, 0x61, 0x6e, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x12, 0x31, 0x0a, 0x0b, 0x73, 0x63, 0x61, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x18, 0xa5, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x53, 0x63, 0x61, 0x6e, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x63, 0x61, 0x6e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x0f, 0x73, 0x63, 0x61, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x18, 0xc6, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, - 0x62, 0x73, 0x52, 0x65, 0x71, 0x12, 0x40, 0x0a, 0x10, 0x73, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0xc7, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x10, 0x73, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x4a, - 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x30, 0x0a, 0x0b, 0x73, 0x63, 0x61, 0x6e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x63, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x53, - 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x63, - 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x0c, 0x73, 0x63, 0x61, - 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, - 0x52, 0x0c, 0x73, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x30, - 0x0a, 0x0b, 0x73, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x18, 0x65, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, - 0x64, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, - 0x12, 0x5a, 0x0a, 0x19, 0x73, 0x63, 0x61, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x18, 0x68, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x48, - 0x00, 0x52, 0x19, 0x73, 0x63, 0x61, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x41, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x5d, 0x0a, 0x1a, + 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, 0x73, 0x63, 0x61, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x71, 0x12, + 0x5b, 0x0a, 0x19, 0x73, 0x63, 0x61, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x18, 0xe7, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x48, + 0x00, 0x52, 0x19, 0x73, 0x63, 0x61, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x37, 0x0a, 0x0d, + 0x73, 0x63, 0x61, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x94, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0d, 0x73, 0x63, 0x61, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x3a, 0x0a, 0x0e, 0x73, 0x63, 0x61, 0x6e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x95, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, + 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, + 0x00, 0x52, 0x0e, 0x73, 0x63, 0x61, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x4c, 0x0a, 0x14, 0x73, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x18, 0xc2, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x14, 0x73, 0x63, 0x61, 0x6e, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x12, + 0x4f, 0x0a, 0x15, 0x73, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x18, 0xc3, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x15, 0x73, 0x63, 0x61, 0x6e, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x34, 0x0a, 0x0c, 0x73, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x18, 0xc4, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x63, 0x61, 0x6e, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x37, 0x0a, 0x0d, 0x73, 0x63, 0x61, 0x6e, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x18, 0xc5, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, + 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, + 0x52, 0x0d, 0x73, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x2e, 0x0a, 0x0a, 0x73, 0x63, 0x61, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xa4, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x63, 0x61, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, + 0x31, 0x0a, 0x0b, 0x73, 0x63, 0x61, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xa5, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x63, 0x61, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x0f, 0x73, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, + 0x62, 0x73, 0x52, 0x65, 0x71, 0x18, 0xc6, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x53, + 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x0f, 0x73, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, + 0x71, 0x12, 0x40, 0x0a, 0x10, 0x73, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0xc7, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, + 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, + 0x00, 0x52, 0x10, 0x73, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x30, 0x0a, 0x0b, 0x73, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x18, 0x63, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x63, 0x61, 0x6e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x0c, 0x73, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x53, 0x63, + 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x63, + 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x30, 0x0a, 0x0b, 0x73, 0x63, + 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0c, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x48, 0x00, 0x52, + 0x0b, 0x73, 0x63, 0x61, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x12, 0x5a, 0x0a, 0x19, 0x73, 0x63, 0x61, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x41, 0x6e, - 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0x69, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x41, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, - 0x1a, 0x73, 0x63, 0x61, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x41, - 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3f, 0x0a, 0x10, 0x73, - 0x63, 0x61, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, - 0x6a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x4d, 0x65, 0x74, 0x61, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, 0x73, 0x63, 0x61, 0x6e, - 0x4d, 0x65, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x42, 0x0a, 0x11, - 0x73, 0x63, 0x61, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x4d, 0x65, - 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x11, 0x73, - 0x63, 0x61, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x43, 0x0a, 0x11, 0x73, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4a, - 0x6f, 0x62, 0x52, 0x65, 0x71, 0x18, 0xa6, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x53, - 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, - 0x48, 0x00, 0x52, 0x11, 0x73, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4a, - 0x6f, 0x62, 0x52, 0x65, 0x71, 0x12, 0x46, 0x0a, 0x12, 0x73, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x18, 0xa7, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x12, 0x73, 0x63, 0x61, 0x6e, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x12, 0x51, 0x0a, - 0x16, 0x73, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x49, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x41, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x19, 0x73, + 0x63, 0x61, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x41, 0x6e, 0x64, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x5d, 0x0a, 0x1a, 0x73, 0x63, 0x61, 0x6e, + 0x4d, 0x65, 0x74, 0x61, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x79, 0x70, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0x69, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x53, + 0x63, 0x61, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x41, 0x6e, 0x64, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1a, 0x73, 0x63, 0x61, + 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3f, 0x0a, 0x10, 0x73, 0x63, 0x61, 0x6e, 0x4d, + 0x65, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x6a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, 0x73, 0x63, 0x61, 0x6e, 0x4d, 0x65, 0x74, 0x61, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x42, 0x0a, 0x11, 0x73, 0x63, 0x61, 0x6e, + 0x4d, 0x65, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x6b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x11, 0x73, 0x63, 0x61, 0x6e, 0x4d, + 0x65, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x43, 0x0a, 0x11, + 0x73, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x52, 0x65, + 0x71, 0x18, 0xa6, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x11, + 0x73, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x52, 0x65, + 0x71, 0x12, 0x46, 0x0a, 0x12, 0x73, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x18, 0xa7, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x12, 0x73, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x12, 0x51, 0x0a, 0x16, 0x73, 0x63, 0x61, + 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x52, 0x65, 0x71, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x53, 0x63, 0x61, 0x6e, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, + 0x65, 0x71, 0x48, 0x00, 0x52, 0x16, 0x73, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x52, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x12, 0x54, 0x0a, 0x17, + 0x73, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x49, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x49, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x16, 0x73, 0x63, 0x61, 0x6e, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, - 0x12, 0x54, 0x0a, 0x17, 0x73, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, - 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x6d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, - 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x17, 0x73, - 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x49, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x52, 0x0a, 0x16, 0x73, 0x63, 0x61, 0x6e, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x70, 0x64, - 0x18, 0x8d, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x70, 0x64, - 0x48, 0x00, 0x52, 0x16, 0x73, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, - 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x70, 0x64, 0x12, 0x36, 0x0a, 0x0d, 0x73, 0x63, - 0x61, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x18, 0x6e, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0e, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, - 0x71, 0x48, 0x00, 0x52, 0x0d, 0x73, 0x63, 0x61, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x71, 0x12, 0x39, 0x0a, 0x0e, 0x73, 0x63, 0x61, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x53, 0x63, 0x61, - 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0e, 0x73, - 0x63, 0x61, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x37, 0x0a, - 0x0d, 0x73, 0x63, 0x61, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x70, 0x64, 0x18, 0x8c, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x55, 0x70, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x73, 0x63, 0x61, 0x6e, 0x55, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x55, 0x70, 0x64, 0x12, 0x3d, 0x0a, 0x0f, 0x73, 0x63, 0x61, 0x6e, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x18, 0xc8, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x63, 0x61, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4a, - 0x6f, 0x62, 0x52, 0x65, 0x71, 0x12, 0x40, 0x0a, 0x10, 0x73, 0x63, 0x61, 0x6e, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x18, 0xc9, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x10, 0x73, 0x63, 0x61, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x12, 0x64, 0x0a, 0x1c, 0x73, 0x63, 0x72, 0x65, 0x65, - 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x84, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, - 0x1c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x67, 0x0a, - 0x1d, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x85, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1d, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5b, 0x0a, 0x19, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x18, 0xf8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x53, 0x63, 0x72, + 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x17, 0x73, 0x63, 0x61, 0x6e, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x52, 0x0a, 0x16, 0x73, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x52, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x70, 0x64, 0x18, 0x8d, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x52, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x70, 0x64, 0x48, 0x00, 0x52, 0x16, + 0x73, 0x63, 0x61, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x49, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x55, 0x70, 0x64, 0x12, 0x36, 0x0a, 0x0d, 0x73, 0x63, 0x61, 0x6e, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x53, 0x63, 0x61, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, + 0x0d, 0x73, 0x63, 0x61, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x12, 0x39, + 0x0a, 0x0e, 0x73, 0x63, 0x61, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x18, 0x6f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x63, 0x61, 0x6e, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x37, 0x0a, 0x0d, 0x73, 0x63, 0x61, + 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x70, 0x64, 0x18, 0x8c, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x53, 0x63, 0x61, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x70, + 0x64, 0x48, 0x00, 0x52, 0x0d, 0x73, 0x63, 0x61, 0x6e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, + 0x70, 0x64, 0x12, 0x3d, 0x0a, 0x0f, 0x73, 0x63, 0x61, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x18, 0xc8, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x53, + 0x63, 0x61, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x0f, 0x73, 0x63, 0x61, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, + 0x71, 0x12, 0x40, 0x0a, 0x10, 0x73, 0x63, 0x61, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4a, 0x6f, + 0x62, 0x52, 0x65, 0x73, 0x70, 0x18, 0xc9, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, + 0x63, 0x61, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x48, + 0x00, 0x52, 0x10, 0x73, 0x63, 0x61, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x64, 0x0a, 0x1c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x18, 0x84, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x19, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x12, 0x5e, 0x0a, 0x1a, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x18, 0xf9, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, - 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1a, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1c, 0x73, 0x63, 0x72, + 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x67, 0x0a, 0x1d, 0x73, 0x63, 0x72, + 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x85, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x48, 0x00, 0x52, 0x1d, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x5b, 0x0a, 0x19, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, + 0xf8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x5e, 0x0a, 0x1a, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, + 0x65, 0x71, 0x48, 0x00, 0x52, 0x19, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, + 0x5e, 0x0a, 0x1a, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xf9, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x48, 0x00, 0x52, 0x1a, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x5e, 0x0a, 0x1a, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0xfa, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x18, 0xfa, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, - 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1a, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x12, 0x61, 0x0a, 0x1b, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, + 0x71, 0x48, 0x00, 0x52, 0x1a, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, + 0x61, 0x0a, 0x1b, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xfb, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1b, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x18, 0xfb, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x53, 0x63, 0x72, 0x65, - 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1b, 0x73, 0x63, 0x72, 0x65, 0x65, - 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x61, 0x0a, 0x1b, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, + 0x73, 0x70, 0x12, 0x61, 0x0a, 0x1b, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x18, 0xfc, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, + 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1b, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xfc, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x53, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x64, 0x0a, 0x1c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xfd, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1b, 0x73, 0x63, - 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x64, 0x0a, 0x1c, 0x73, 0x63, 0x72, - 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xfd, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x1c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x52, 0x0a, 0x16, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x18, 0xe2, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x16, 0x73, 0x65, 0x6c, + 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1c, 0x73, + 0x63, 0x72, 0x65, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x52, 0x0a, 0x16, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x69, 0x78, 0x65, + 0x6c, 0x73, 0x52, 0x65, 0x71, 0x18, 0xe2, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x69, 0x78, 0x65, + 0x6c, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x16, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x12, + 0x55, 0x0a, 0x17, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0xe3, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x17, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x69, 0x78, 0x65, + 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x61, 0x0a, 0x1b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xe4, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x69, 0x78, 0x65, + 0x6c, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1b, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, + 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x64, 0x0a, 0x1c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, - 0x52, 0x65, 0x71, 0x12, 0x55, 0x0a, 0x17, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0xe3, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xe5, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, + 0x00, 0x52, 0x1c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x52, 0x0a, 0x16, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x63, 0x61, 0x6e, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x18, 0xe6, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x63, 0x61, 0x6e, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x16, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x12, 0x55, 0x0a, 0x17, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, + 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0xe7, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x17, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x61, 0x0a, 0x1b, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, - 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xe4, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, - 0x52, 0x1b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, - 0x69, 0x78, 0x65, 0x6c, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x64, 0x0a, - 0x1c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x69, - 0x78, 0x65, 0x6c, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xe5, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x52, 0x0a, 0x16, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, - 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x18, 0xe6, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, - 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, - 0x16, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x55, 0x0a, 0x17, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x18, 0xe7, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x17, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, - 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x61, - 0x0a, 0x1b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xe8, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, + 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, + 0x00, 0x52, 0x17, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x63, 0x61, 0x6e, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x61, 0x0a, 0x1b, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xe8, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x63, 0x61, 0x6e, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x1b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x64, 0x0a, + 0x1c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xe9, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, + 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x1b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x63, - 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x12, 0x64, 0x0a, 0x1c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x63, 0x61, - 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x18, 0xe9, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1c, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x54, 0x0a, 0x17, 0x73, 0x65, 0x6e, 0x64, 0x55, - 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x18, 0x70, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x55, - 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x17, 0x73, 0x65, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x57, 0x0a, - 0x18, 0x73, 0x65, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x18, 0x73, 0x65, + 0x65, 0x73, 0x70, 0x12, 0x54, 0x0a, 0x17, 0x73, 0x65, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x18, 0x70, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x17, 0x73, 0x65, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x57, 0x0a, 0x18, 0x73, 0x65, 0x6e, + 0x64, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x30, 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x63, 0x74, 0x72, - 0x75, 0x6d, 0x52, 0x65, 0x71, 0x18, 0x72, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x53, 0x70, - 0x65, 0x63, 0x74, 0x72, 0x75, 0x6d, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x72, 0x75, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x0c, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x72, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x18, 0x73, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, - 0x2e, 0x53, 0x70, 0x65, 0x63, 0x74, 0x72, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, - 0x0c, 0x73, 0x70, 0x65, 0x63, 0x74, 0x72, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x12, 0x33, 0x0a, - 0x0c, 0x74, 0x61, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x74, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x54, 0x61, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x61, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x12, 0x36, 0x0a, 0x0d, 0x74, 0x61, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x18, 0x75, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x54, 0x61, 0x67, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x74, 0x61, 0x67, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x33, 0x0a, 0x0c, 0x74, 0x61, - 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x76, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x54, 0x61, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, - 0x00, 0x52, 0x0c, 0x74, 0x61, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, - 0x36, 0x0a, 0x0d, 0x74, 0x61, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x18, 0x77, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x54, 0x61, 0x67, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x74, 0x61, 0x67, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2d, 0x0a, 0x0a, 0x74, 0x61, 0x67, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x78, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x54, 0x61, - 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x61, 0x67, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x30, 0x0a, 0x0b, 0x74, 0x61, 0x67, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x79, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x54, 0x61, - 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x61, 0x67, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x39, 0x0a, 0x0e, 0x75, 0x73, 0x65, 0x72, - 0x41, 0x64, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x18, 0x7a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, - 0x71, 0x48, 0x00, 0x52, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x52, 0x6f, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x12, 0x3c, 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x52, 0x6f, - 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x7b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, - 0x52, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x42, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x18, 0x7c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, - 0x48, 0x00, 0x52, 0x11, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, - 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x45, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x7d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, - 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x12, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x39, 0x0a, 0x0e, - 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x18, 0x7e, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x12, 0x3c, 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0x7f, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x48, 0x00, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x49, 0x0a, 0x13, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x81, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x13, 0x75, 0x73, 0x65, - 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x12, 0x4c, 0x0a, 0x14, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x82, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x14, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, - 0x0a, 0x14, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x41, 0x64, - 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x18, 0x9c, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, - 0x6e, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x14, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x41, 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x4f, 0x0a, 0x15, - 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0x9d, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x41, 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f, 0x0a, - 0x15, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x18, 0x9e, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x52, - 0x0a, 0x16, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x18, 0x9f, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x16, 0x75, 0x73, 0x65, 0x72, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x18, 0x73, 0x65, 0x6e, 0x64, 0x55, 0x73, + 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x30, 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x63, 0x74, 0x72, 0x75, 0x6d, 0x52, 0x65, + 0x71, 0x18, 0x72, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x74, 0x72, + 0x75, 0x6d, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x70, 0x65, 0x63, 0x74, 0x72, 0x75, + 0x6d, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x0c, 0x73, 0x70, 0x65, 0x63, 0x74, 0x72, 0x75, 0x6d, + 0x52, 0x65, 0x73, 0x70, 0x18, 0x73, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x53, 0x70, 0x65, + 0x63, 0x74, 0x72, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x70, 0x65, + 0x63, 0x74, 0x72, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x12, 0x33, 0x0a, 0x0c, 0x74, 0x61, 0x67, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x74, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x54, 0x61, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x0c, 0x74, 0x61, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x36, + 0x0a, 0x0d, 0x74, 0x61, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, + 0x75, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x54, 0x61, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x74, 0x61, 0x67, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x33, 0x0a, 0x0c, 0x74, 0x61, 0x67, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x76, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x54, + 0x61, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0c, 0x74, + 0x61, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x36, 0x0a, 0x0d, 0x74, + 0x61, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x77, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x54, 0x61, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x74, 0x61, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x2d, 0x0a, 0x0a, 0x74, 0x61, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x18, 0x78, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x54, 0x61, 0x67, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x61, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x12, 0x30, 0x0a, 0x0b, 0x74, 0x61, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x18, 0x79, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x54, 0x61, 0x67, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x61, 0x67, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x39, 0x0a, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x52, + 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x18, 0x7a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, + 0x0e, 0x75, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, + 0x3c, 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x18, 0x7b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, + 0x64, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0f, 0x75, 0x73, + 0x65, 0x72, 0x41, 0x64, 0x64, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x42, 0x0a, + 0x11, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, + 0x65, 0x71, 0x18, 0x7c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x11, + 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x12, 0x45, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x7d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x48, 0x00, 0x52, 0x12, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x39, 0x0a, 0x0e, 0x75, 0x73, 0x65, 0x72, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x18, 0x7e, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, + 0x71, 0x48, 0x00, 0x52, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x52, 0x65, 0x71, 0x12, 0x3c, 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0x7f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, + 0x52, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x49, 0x0a, 0x13, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x81, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x13, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x4c, 0x0a, 0x14, + 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x18, 0x82, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x48, 0x00, 0x52, 0x14, 0x75, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a, 0x14, 0x75, 0x73, + 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, + 0x65, 0x71, 0x18, 0x9c, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x71, + 0x48, 0x00, 0x52, 0x14, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, + 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x4f, 0x0a, 0x15, 0x75, 0x73, 0x65, 0x72, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x18, 0x9d, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x48, 0x00, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, + 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x15, 0x75, 0x73, 0x65, + 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x18, 0x9e, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x15, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, - 0x64, 0x64, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x71, 0x18, 0xb4, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, - 0x64, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x15, 0x75, 0x73, - 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x16, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x41, 0x64, 0x64, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x18, 0xb5, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x41, 0x64, 0x64, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, - 0x16, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x56, 0x69, 0x65, - 0x77, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x46, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x72, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xa0, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x12, 0x75, 0x73, 0x65, - 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, - 0x49, 0x0a, 0x13, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xa1, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x13, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x55, 0x0a, 0x17, 0x75, 0x73, - 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x64, 0x6d, - 0x69, 0x6e, 0x52, 0x65, 0x71, 0x18, 0xa2, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x64, - 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x17, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, + 0x71, 0x48, 0x00, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, + 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x16, 0x75, 0x73, + 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x18, 0x9f, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x16, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f, + 0x0a, 0x15, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x56, 0x69, + 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x71, 0x18, 0xb4, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x56, 0x69, 0x65, + 0x77, 0x65, 0x72, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, + 0x52, 0x0a, 0x16, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x56, + 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x18, 0xb5, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x56, + 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x16, 0x75, 0x73, 0x65, + 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x64, 0x64, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x46, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xa0, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x12, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x49, 0x0a, 0x13, 0x75, + 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x18, 0xa1, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, + 0x00, 0x52, 0x13, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x55, 0x0a, 0x17, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, - 0x71, 0x12, 0x58, 0x0a, 0x18, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0xa3, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x18, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x58, 0x0a, 0x18, 0x75, - 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x18, 0xa4, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, 0x75, 0x73, 0x65, + 0x71, 0x18, 0xa2, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, + 0x65, 0x71, 0x48, 0x00, 0x52, 0x17, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x58, 0x0a, + 0x18, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0xa3, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x18, 0x75, + 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x64, + 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x58, 0x0a, 0x18, 0x75, 0x73, 0x65, 0x72, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x18, 0xa4, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x5b, 0x0a, 0x19, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x18, 0xa5, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x19, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x46, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xa6, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x12, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x49, 0x0a, 0x13, 0x75, 0x73, + 0x71, 0x12, 0x5b, 0x0a, 0x19, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x18, 0xa5, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x48, 0x00, 0x52, 0x19, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x46, + 0x0a, 0x12, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x18, 0xa6, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x48, 0x00, 0x52, 0x12, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x49, 0x0a, 0x13, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xa7, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x13, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x18, 0xa7, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, - 0x52, 0x13, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x58, 0x0a, 0x18, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x18, 0xb2, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, - 0x5b, 0x0a, 0x19, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x18, 0xb3, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x19, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x55, 0x0a, 0x17, - 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x45, 0x64, 0x69, 0x74, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x18, 0xaa, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x45, 0x64, 0x69, 0x74, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x17, 0x75, 0x73, 0x65, 0x72, + 0x70, 0x12, 0x58, 0x0a, 0x18, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x71, 0x18, 0xb2, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x71, 0x48, + 0x00, 0x52, 0x18, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x5b, 0x0a, 0x19, 0x75, + 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x69, + 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x18, 0xb3, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x56, 0x69, 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x19, 0x75, + 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x69, + 0x65, 0x77, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x55, 0x0a, 0x17, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x45, 0x64, 0x69, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x52, 0x65, 0x71, 0x12, 0x58, 0x0a, 0x18, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x45, 0x64, 0x69, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, - 0xab, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x45, 0x64, 0x69, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x48, 0x00, 0x52, 0x18, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x45, 0x64, - 0x69, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x52, 0x0a, - 0x16, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, - 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x18, 0xb6, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, - 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x16, 0x75, 0x73, 0x65, 0x72, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, - 0x71, 0x12, 0x55, 0x0a, 0x17, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x67, - 0x6e, 0x6f, 0x72, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0xb7, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, - 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, + 0x52, 0x65, 0x71, 0x18, 0xaa, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x45, 0x64, 0x69, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x17, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x45, 0x64, 0x69, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x12, + 0x58, 0x0a, 0x18, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x45, 0x64, 0x69, 0x74, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0xab, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x45, 0x64, + 0x69, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, + 0x18, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x45, 0x64, 0x69, 0x74, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x52, 0x0a, 0x16, 0x75, 0x73, 0x65, + 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4a, 0x6f, 0x69, 0x6e, + 0x52, 0x65, 0x71, 0x18, 0xb6, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4a, 0x6f, 0x69, 0x6e, + 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x16, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x55, 0x0a, 0x17, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, - 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a, 0x14, 0x75, 0x73, 0x65, 0x72, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x18, 0xb8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, - 0x52, 0x14, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x4f, 0x0a, 0x15, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, - 0xb9, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, - 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x40, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x18, 0xba, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4a, 0x6f, - 0x69, 0x6e, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x43, 0x0a, 0x11, 0x75, 0x73, 0x65, - 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0xbb, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x11, 0x75, 0x73, 0x65, - 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x58, - 0x0a, 0x18, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x4a, - 0x6f, 0x69, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x18, 0xea, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, - 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, - 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x69, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x5b, 0x0a, 0x19, 0x75, 0x73, 0x65, 0x72, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xeb, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x69, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x19, 0x75, 0x73, 0x65, 0x72, + 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0xb7, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x17, 0x75, 0x73, 0x65, + 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4a, 0x6f, 0x69, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a, 0x14, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0xb8, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4a, + 0x6f, 0x69, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x14, 0x75, 0x73, + 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x12, 0x4f, 0x0a, 0x15, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4a, + 0x6f, 0x69, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xb9, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4a, 0x6f, + 0x69, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x15, 0x75, 0x73, + 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x40, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x18, 0xba, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, + 0x71, 0x48, 0x00, 0x52, 0x10, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4a, 0x6f, + 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x43, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x18, 0xbb, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4a, 0x6f, 0x69, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x11, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x58, 0x0a, 0x18, 0x75, 0x73, + 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x18, 0xea, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x69, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x18, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x40, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0xa8, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x43, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x72, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xa9, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x11, 0x75, 0x73, 0x65, 0x72, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x34, 0x0a, 0x0c, - 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x18, 0xbc, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x65, 0x71, 0x12, 0x37, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x65, 0x73, 0x70, 0x18, 0xbd, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x75, 0x73, - 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x15, 0x75, - 0x73, 0x65, 0x72, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x18, 0xb5, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6d, 0x70, 0x65, 0x72, - 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x16, - 0x75, 0x73, 0x65, 0x72, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xb6, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x16, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6d, - 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x46, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xb3, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x48, 0x00, 0x52, 0x12, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, - 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x49, 0x0a, 0x13, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, - 0xb4, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6d, 0x70, - 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x13, + 0x65, 0x52, 0x65, 0x71, 0x12, 0x5b, 0x0a, 0x19, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x18, 0xeb, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x19, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x4c, 0x69, 0x73, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x40, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0xa8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, + 0x00, 0x52, 0x10, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x12, 0x43, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xa9, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x11, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x34, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x18, 0xbc, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x37, + 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x18, + 0xbd, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x15, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x18, 0xb5, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6d, + 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, + 0x00, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, + 0x74, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x52, 0x0a, 0x16, 0x75, 0x73, 0x65, 0x72, + 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x18, 0xb6, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x48, 0x00, 0x52, 0x16, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, + 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x46, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x31, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x18, 0x8a, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x8b, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0c, - 0x75, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x61, 0x0a, 0x1b, + 0x65, 0x71, 0x18, 0xb3, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x12, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x12, 0x49, 0x0a, 0x13, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6d, 0x70, 0x65, + 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0xb4, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, + 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x13, 0x75, 0x73, 0x65, 0x72, + 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x31, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x8a, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x12, 0x34, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x18, 0x8b, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x61, 0x0a, 0x1b, 0x75, 0x73, 0x65, 0x72, + 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x18, 0x8e, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x1b, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x18, 0x8e, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, - 0x48, 0x00, 0x52, 0x1b, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x12, - 0x64, 0x0a, 0x1c, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, - 0x8f, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x1c, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x61, 0x0a, 0x1b, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x12, 0x64, 0x0a, 0x1c, 0x75, + 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x18, 0x8f, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x48, 0x00, 0x52, 0x1c, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x61, 0x0a, 0x1b, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x55, 0x70, 0x64, + 0x18, 0x90, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x55, 0x70, 0x64, 0x48, 0x00, 0x52, 0x1b, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x55, 0x70, 0x64, 0x18, 0x90, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x55, 0x70, 0x64, 0x48, 0x00, 0x52, 0x1b, 0x75, 0x73, 0x65, - 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x55, 0x70, 0x64, 0x12, 0x70, 0x0a, 0x20, 0x75, 0x73, 0x65, 0x72, - 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x91, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x73, 0x55, 0x70, 0x64, 0x12, 0x70, 0x0a, 0x20, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x91, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x48, 0x00, 0x52, 0x20, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x20, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x6f, + 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x73, 0x0a, 0x21, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x73, 0x0a, 0x21, 0x75, 0x73, - 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, - 0x92, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x21, 0x75, 0x73, - 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x3d, 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x18, 0x94, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x6f, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0f, 0x75, - 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x40, - 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x18, 0x95, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x6f, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x10, - 0x75, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x40, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x18, 0x96, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, - 0x52, 0x10, 0x75, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x12, 0x43, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x97, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x48, 0x00, 0x52, 0x11, 0x75, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x37, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x18, 0xde, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x48, - 0x00, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, - 0x12, 0x3a, 0x0a, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x18, 0xdf, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0e, 0x75, 0x73, - 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x12, 0x40, 0x0a, 0x10, - 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x18, 0xfe, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, 0x77, 0x69, - 0x64, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x43, - 0x0a, 0x11, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x18, 0xff, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x57, 0x69, 0x64, - 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, - 0x52, 0x11, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x46, 0x0a, 0x12, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, - 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x80, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x12, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x44, - 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x49, 0x0a, 0x13, 0x77, + 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x92, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x21, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x0f, 0x75, + 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x18, 0x94, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x52, + 0x6f, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x40, 0x0a, 0x10, 0x75, 0x73, + 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0x95, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x10, 0x75, 0x73, 0x65, 0x72, + 0x52, 0x6f, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x40, 0x0a, 0x10, + 0x75, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x18, 0x96, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, 0x75, 0x73, + 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x43, + 0x0a, 0x11, 0x75, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x18, 0x97, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, + 0x52, 0x11, 0x75, 0x73, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x37, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x52, 0x65, 0x71, 0x18, 0xde, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0d, 0x75, + 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x12, 0x3a, 0x0a, 0x0e, + 0x75, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x18, 0xdf, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x12, 0x40, 0x0a, 0x10, 0x77, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xfe, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x43, 0x0a, 0x11, 0x77, 0x69, + 0x64, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, + 0xff, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x44, + 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x11, 0x77, 0x69, + 0x64, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x46, 0x0a, 0x12, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0x80, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x57, + 0x69, 0x64, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x48, 0x00, 0x52, 0x12, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x49, 0x0a, 0x13, 0x77, 0x69, 0x64, 0x67, 0x65, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x18, 0x81, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x13, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x18, 0x81, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x57, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, - 0x00, 0x52, 0x13, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a, 0x14, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xcc, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x14, - 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x12, 0x4f, 0x0a, 0x15, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xcd, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x15, - 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x52, 0x0a, 0x16, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, - 0xce, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, - 0x00, 0x52, 0x16, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x55, 0x0a, 0x17, 0x77, 0x69, 0x64, - 0x67, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x18, 0xcf, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x57, 0x69, - 0x64, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x17, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, + 0x73, 0x70, 0x12, 0x4c, 0x0a, 0x14, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, 0xcc, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x14, 0x77, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x12, 0x4f, 0x0a, 0x15, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, 0xcd, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x15, 0x77, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x52, 0x0a, 0x16, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x18, 0xce, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x16, 0x77, + 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x55, 0x0a, 0x17, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x3d, 0x0a, 0x0f, 0x7a, 0x65, 0x6e, 0x6f, 0x64, 0x6f, 0x44, 0x4f, 0x49, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x18, 0xf0, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x5a, 0x65, 0x6e, - 0x6f, 0x64, 0x6f, 0x44, 0x4f, 0x49, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0f, - 0x7a, 0x65, 0x6e, 0x6f, 0x64, 0x6f, 0x44, 0x4f, 0x49, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, - 0x40, 0x0a, 0x10, 0x7a, 0x65, 0x6e, 0x6f, 0x64, 0x6f, 0x44, 0x4f, 0x49, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x18, 0xf1, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x5a, 0x65, 0x6e, - 0x6f, 0x64, 0x6f, 0x44, 0x4f, 0x49, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, - 0x10, 0x7a, 0x65, 0x6e, 0x6f, 0x64, 0x6f, 0x44, 0x4f, 0x49, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x42, 0x0a, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2a, 0x8e, 0x01, - 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x10, 0x0a, 0x0c, 0x57, 0x53, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x57, 0x53, 0x5f, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x10, 0x0a, - 0x0c, 0x57, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x02, 0x12, - 0x12, 0x0a, 0x0e, 0x57, 0x53, 0x5f, 0x42, 0x41, 0x44, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, - 0x54, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x57, 0x53, 0x5f, 0x4e, 0x4f, 0x5f, 0x50, 0x45, 0x52, - 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x57, 0x53, 0x5f, - 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0e, - 0x0a, 0x0a, 0x57, 0x53, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x06, 0x42, 0x0a, - 0x5a, 0x08, 0x2e, 0x3b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x18, 0xcf, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x48, 0x00, 0x52, 0x17, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3d, 0x0a, 0x0f, + 0x7a, 0x65, 0x6e, 0x6f, 0x64, 0x6f, 0x44, 0x4f, 0x49, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x18, + 0xf0, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x5a, 0x65, 0x6e, 0x6f, 0x64, 0x6f, 0x44, + 0x4f, 0x49, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0f, 0x7a, 0x65, 0x6e, 0x6f, + 0x64, 0x6f, 0x44, 0x4f, 0x49, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x40, 0x0a, 0x10, 0x7a, + 0x65, 0x6e, 0x6f, 0x64, 0x6f, 0x44, 0x4f, 0x49, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x18, + 0xf1, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x5a, 0x65, 0x6e, 0x6f, 0x64, 0x6f, 0x44, + 0x4f, 0x49, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x10, 0x7a, 0x65, 0x6e, + 0x6f, 0x64, 0x6f, 0x44, 0x4f, 0x49, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x42, 0x0a, 0x0a, + 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2a, 0x8e, 0x01, 0x0a, 0x0e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x10, 0x0a, 0x0c, + 0x57, 0x53, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x09, + 0x0a, 0x05, 0x57, 0x53, 0x5f, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x57, 0x53, 0x5f, + 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x57, + 0x53, 0x5f, 0x42, 0x41, 0x44, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x03, 0x12, + 0x14, 0x0a, 0x10, 0x57, 0x53, 0x5f, 0x4e, 0x4f, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, + 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x57, 0x53, 0x5f, 0x53, 0x45, 0x52, 0x56, + 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x57, 0x53, + 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x06, 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x3b, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6546,293 +6586,295 @@ var file_websocket_proto_goTypes = []interface{}{ (*ElementSetWriteResp)(nil), // 40: ElementSetWriteResp (*ExportFilesReq)(nil), // 41: ExportFilesReq (*ExportFilesResp)(nil), // 42: ExportFilesResp - (*ExpressionDeleteReq)(nil), // 43: ExpressionDeleteReq - (*ExpressionDeleteResp)(nil), // 44: ExpressionDeleteResp - (*ExpressionDisplaySettingsGetReq)(nil), // 45: ExpressionDisplaySettingsGetReq - (*ExpressionDisplaySettingsGetResp)(nil), // 46: ExpressionDisplaySettingsGetResp - (*ExpressionDisplaySettingsWriteReq)(nil), // 47: ExpressionDisplaySettingsWriteReq - (*ExpressionDisplaySettingsWriteResp)(nil), // 48: ExpressionDisplaySettingsWriteResp - (*ExpressionGetReq)(nil), // 49: ExpressionGetReq - (*ExpressionGetResp)(nil), // 50: ExpressionGetResp - (*ExpressionGroupDeleteReq)(nil), // 51: ExpressionGroupDeleteReq - (*ExpressionGroupDeleteResp)(nil), // 52: ExpressionGroupDeleteResp - (*ExpressionGroupGetReq)(nil), // 53: ExpressionGroupGetReq - (*ExpressionGroupGetResp)(nil), // 54: ExpressionGroupGetResp - (*ExpressionGroupListReq)(nil), // 55: ExpressionGroupListReq - (*ExpressionGroupListResp)(nil), // 56: ExpressionGroupListResp - (*ExpressionGroupWriteReq)(nil), // 57: ExpressionGroupWriteReq - (*ExpressionGroupWriteResp)(nil), // 58: ExpressionGroupWriteResp - (*ExpressionListReq)(nil), // 59: ExpressionListReq - (*ExpressionListResp)(nil), // 60: ExpressionListResp - (*ExpressionWriteExecStatReq)(nil), // 61: ExpressionWriteExecStatReq - (*ExpressionWriteExecStatResp)(nil), // 62: ExpressionWriteExecStatResp - (*ExpressionWriteReq)(nil), // 63: ExpressionWriteReq - (*ExpressionWriteResp)(nil), // 64: ExpressionWriteResp - (*GetOwnershipReq)(nil), // 65: GetOwnershipReq - (*GetOwnershipResp)(nil), // 66: GetOwnershipResp - (*Image3DModelPointUploadReq)(nil), // 67: Image3DModelPointUploadReq - (*Image3DModelPointUploadResp)(nil), // 68: Image3DModelPointUploadResp - (*Image3DModelPointsReq)(nil), // 69: Image3DModelPointsReq - (*Image3DModelPointsResp)(nil), // 70: Image3DModelPointsResp - (*ImageBeamLocationUploadReq)(nil), // 71: ImageBeamLocationUploadReq - (*ImageBeamLocationUploadResp)(nil), // 72: ImageBeamLocationUploadResp - (*ImageBeamLocationVersionsReq)(nil), // 73: ImageBeamLocationVersionsReq - (*ImageBeamLocationVersionsResp)(nil), // 74: ImageBeamLocationVersionsResp - (*ImageBeamLocationsReq)(nil), // 75: ImageBeamLocationsReq - (*ImageBeamLocationsResp)(nil), // 76: ImageBeamLocationsResp - (*ImageDeleteReq)(nil), // 77: ImageDeleteReq - (*ImageDeleteResp)(nil), // 78: ImageDeleteResp - (*ImageGetDefaultReq)(nil), // 79: ImageGetDefaultReq - (*ImageGetDefaultResp)(nil), // 80: ImageGetDefaultResp - (*ImageGetReq)(nil), // 81: ImageGetReq - (*ImageGetResp)(nil), // 82: ImageGetResp - (*ImageListReq)(nil), // 83: ImageListReq - (*ImageListResp)(nil), // 84: ImageListResp - (*ImageListUpd)(nil), // 85: ImageListUpd - (*ImagePyramidGetReq)(nil), // 86: ImagePyramidGetReq - (*ImagePyramidGetResp)(nil), // 87: ImagePyramidGetResp - (*ImageScanEntryDisplayElementsGetReq)(nil), // 88: ImageScanEntryDisplayElementsGetReq - (*ImageScanEntryDisplayElementsGetResp)(nil), // 89: ImageScanEntryDisplayElementsGetResp - (*ImageSetDefaultReq)(nil), // 90: ImageSetDefaultReq - (*ImageSetDefaultResp)(nil), // 91: ImageSetDefaultResp - (*ImageSetMatchTransformReq)(nil), // 92: ImageSetMatchTransformReq - (*ImageSetMatchTransformResp)(nil), // 93: ImageSetMatchTransformResp - (*ImageTileDataGetReq)(nil), // 94: ImageTileDataGetReq - (*ImageTileDataGetResp)(nil), // 95: ImageTileDataGetResp - (*ImageTileStructureGetReq)(nil), // 96: ImageTileStructureGetReq - (*ImageTileStructureGetResp)(nil), // 97: ImageTileStructureGetResp - (*ImportMarsViewerImageReq)(nil), // 98: ImportMarsViewerImageReq - (*ImportMarsViewerImageResp)(nil), // 99: ImportMarsViewerImageResp - (*ImportMarsViewerImageUpd)(nil), // 100: ImportMarsViewerImageUpd - (*JobListReq)(nil), // 101: JobListReq - (*JobListResp)(nil), // 102: JobListResp - (*JobListUpd)(nil), // 103: JobListUpd - (*LogGetLevelReq)(nil), // 104: LogGetLevelReq - (*LogGetLevelResp)(nil), // 105: LogGetLevelResp - (*LogReadReq)(nil), // 106: LogReadReq - (*LogReadResp)(nil), // 107: LogReadResp - (*LogSetLevelReq)(nil), // 108: LogSetLevelReq - (*LogSetLevelResp)(nil), // 109: LogSetLevelResp - (*MemoiseDeleteByRegexReq)(nil), // 110: MemoiseDeleteByRegexReq - (*MemoiseDeleteByRegexResp)(nil), // 111: MemoiseDeleteByRegexResp - (*MemoiseDeleteReq)(nil), // 112: MemoiseDeleteReq - (*MemoiseDeleteResp)(nil), // 113: MemoiseDeleteResp - (*MultiQuantCompareReq)(nil), // 114: MultiQuantCompareReq - (*MultiQuantCompareResp)(nil), // 115: MultiQuantCompareResp - (*NotificationDismissReq)(nil), // 116: NotificationDismissReq - (*NotificationDismissResp)(nil), // 117: NotificationDismissResp - (*NotificationReq)(nil), // 118: NotificationReq - (*NotificationResp)(nil), // 119: NotificationResp - (*NotificationUpd)(nil), // 120: NotificationUpd - (*ObjectEditAccessReq)(nil), // 121: ObjectEditAccessReq - (*ObjectEditAccessResp)(nil), // 122: ObjectEditAccessResp - (*PiquantConfigFileReq)(nil), // 123: PiquantConfigFileReq - (*PiquantConfigFileResp)(nil), // 124: PiquantConfigFileResp - (*PiquantConfigListReq)(nil), // 125: PiquantConfigListReq - (*PiquantConfigListResp)(nil), // 126: PiquantConfigListResp - (*PiquantConfigVersionReq)(nil), // 127: PiquantConfigVersionReq - (*PiquantConfigVersionResp)(nil), // 128: PiquantConfigVersionResp - (*PiquantConfigVersionsListReq)(nil), // 129: PiquantConfigVersionsListReq - (*PiquantConfigVersionsListResp)(nil), // 130: PiquantConfigVersionsListResp - (*PiquantCurrentVersionReq)(nil), // 131: PiquantCurrentVersionReq - (*PiquantCurrentVersionResp)(nil), // 132: PiquantCurrentVersionResp - (*PiquantVersionListReq)(nil), // 133: PiquantVersionListReq - (*PiquantVersionListResp)(nil), // 134: PiquantVersionListResp - (*PiquantWriteCurrentVersionReq)(nil), // 135: PiquantWriteCurrentVersionReq - (*PiquantWriteCurrentVersionResp)(nil), // 136: PiquantWriteCurrentVersionResp - (*PseudoIntensityReq)(nil), // 137: PseudoIntensityReq - (*PseudoIntensityResp)(nil), // 138: PseudoIntensityResp - (*PublishExpressionToZenodoReq)(nil), // 139: PublishExpressionToZenodoReq - (*PublishExpressionToZenodoResp)(nil), // 140: PublishExpressionToZenodoResp - (*QuantBlessReq)(nil), // 141: QuantBlessReq - (*QuantBlessResp)(nil), // 142: QuantBlessResp - (*QuantCombineListGetReq)(nil), // 143: QuantCombineListGetReq - (*QuantCombineListGetResp)(nil), // 144: QuantCombineListGetResp - (*QuantCombineListWriteReq)(nil), // 145: QuantCombineListWriteReq - (*QuantCombineListWriteResp)(nil), // 146: QuantCombineListWriteResp - (*QuantCombineReq)(nil), // 147: QuantCombineReq - (*QuantCombineResp)(nil), // 148: QuantCombineResp - (*QuantCreateReq)(nil), // 149: QuantCreateReq - (*QuantCreateResp)(nil), // 150: QuantCreateResp - (*QuantCreateUpd)(nil), // 151: QuantCreateUpd - (*QuantDeleteReq)(nil), // 152: QuantDeleteReq - (*QuantDeleteResp)(nil), // 153: QuantDeleteResp - (*QuantGetReq)(nil), // 154: QuantGetReq - (*QuantGetResp)(nil), // 155: QuantGetResp - (*QuantLastOutputGetReq)(nil), // 156: QuantLastOutputGetReq - (*QuantLastOutputGetResp)(nil), // 157: QuantLastOutputGetResp - (*QuantListReq)(nil), // 158: QuantListReq - (*QuantListResp)(nil), // 159: QuantListResp - (*QuantLogGetReq)(nil), // 160: QuantLogGetReq - (*QuantLogGetResp)(nil), // 161: QuantLogGetResp - (*QuantLogListReq)(nil), // 162: QuantLogListReq - (*QuantLogListResp)(nil), // 163: QuantLogListResp - (*QuantPublishReq)(nil), // 164: QuantPublishReq - (*QuantPublishResp)(nil), // 165: QuantPublishResp - (*QuantRawDataGetReq)(nil), // 166: QuantRawDataGetReq - (*QuantRawDataGetResp)(nil), // 167: QuantRawDataGetResp - (*QuantUploadReq)(nil), // 168: QuantUploadReq - (*QuantUploadResp)(nil), // 169: QuantUploadResp - (*ReferenceDataBulkWriteReq)(nil), // 170: ReferenceDataBulkWriteReq - (*ReferenceDataBulkWriteResp)(nil), // 171: ReferenceDataBulkWriteResp - (*ReferenceDataDeleteReq)(nil), // 172: ReferenceDataDeleteReq - (*ReferenceDataDeleteResp)(nil), // 173: ReferenceDataDeleteResp - (*ReferenceDataGetReq)(nil), // 174: ReferenceDataGetReq - (*ReferenceDataGetResp)(nil), // 175: ReferenceDataGetResp - (*ReferenceDataListReq)(nil), // 176: ReferenceDataListReq - (*ReferenceDataListResp)(nil), // 177: ReferenceDataListResp - (*ReferenceDataWriteReq)(nil), // 178: ReferenceDataWriteReq - (*ReferenceDataWriteResp)(nil), // 179: ReferenceDataWriteResp - (*RegionOfInterestBulkDuplicateReq)(nil), // 180: RegionOfInterestBulkDuplicateReq - (*RegionOfInterestBulkDuplicateResp)(nil), // 181: RegionOfInterestBulkDuplicateResp - (*RegionOfInterestBulkWriteReq)(nil), // 182: RegionOfInterestBulkWriteReq - (*RegionOfInterestBulkWriteResp)(nil), // 183: RegionOfInterestBulkWriteResp - (*RegionOfInterestDeleteReq)(nil), // 184: RegionOfInterestDeleteReq - (*RegionOfInterestDeleteResp)(nil), // 185: RegionOfInterestDeleteResp - (*RegionOfInterestDisplaySettingsGetReq)(nil), // 186: RegionOfInterestDisplaySettingsGetReq - (*RegionOfInterestDisplaySettingsGetResp)(nil), // 187: RegionOfInterestDisplaySettingsGetResp - (*RegionOfInterestDisplaySettingsWriteReq)(nil), // 188: RegionOfInterestDisplaySettingsWriteReq - (*RegionOfInterestDisplaySettingsWriteResp)(nil), // 189: RegionOfInterestDisplaySettingsWriteResp - (*RegionOfInterestGetReq)(nil), // 190: RegionOfInterestGetReq - (*RegionOfInterestGetResp)(nil), // 191: RegionOfInterestGetResp - (*RegionOfInterestListReq)(nil), // 192: RegionOfInterestListReq - (*RegionOfInterestListResp)(nil), // 193: RegionOfInterestListResp - (*RegionOfInterestWriteReq)(nil), // 194: RegionOfInterestWriteReq - (*RegionOfInterestWriteResp)(nil), // 195: RegionOfInterestWriteResp - (*RestoreDBReq)(nil), // 196: RestoreDBReq - (*RestoreDBResp)(nil), // 197: RestoreDBResp - (*ReviewerMagicLinkCreateReq)(nil), // 198: ReviewerMagicLinkCreateReq - (*ReviewerMagicLinkCreateResp)(nil), // 199: ReviewerMagicLinkCreateResp - (*ReviewerMagicLinkLoginReq)(nil), // 200: ReviewerMagicLinkLoginReq - (*ReviewerMagicLinkLoginResp)(nil), // 201: ReviewerMagicLinkLoginResp - (*RunTestReq)(nil), // 202: RunTestReq - (*RunTestResp)(nil), // 203: RunTestResp - (*ScanAutoShareReq)(nil), // 204: ScanAutoShareReq - (*ScanAutoShareResp)(nil), // 205: ScanAutoShareResp - (*ScanAutoShareWriteReq)(nil), // 206: ScanAutoShareWriteReq - (*ScanAutoShareWriteResp)(nil), // 207: ScanAutoShareWriteResp - (*ScanBeamLocationsReq)(nil), // 208: ScanBeamLocationsReq - (*ScanBeamLocationsResp)(nil), // 209: ScanBeamLocationsResp - (*ScanCreateUserDefinedReq)(nil), // 210: ScanCreateUserDefinedReq - (*ScanCreateUserDefinedResp)(nil), // 211: ScanCreateUserDefinedResp - (*ScanDeleteReq)(nil), // 212: ScanDeleteReq - (*ScanDeleteResp)(nil), // 213: ScanDeleteResp - (*ScanEntryMetadataReq)(nil), // 214: ScanEntryMetadataReq - (*ScanEntryMetadataResp)(nil), // 215: ScanEntryMetadataResp - (*ScanEntryReq)(nil), // 216: ScanEntryReq - (*ScanEntryResp)(nil), // 217: ScanEntryResp - (*ScanGetReq)(nil), // 218: ScanGetReq - (*ScanGetResp)(nil), // 219: ScanGetResp - (*ScanListJobsReq)(nil), // 220: ScanListJobsReq - (*ScanListJobsResp)(nil), // 221: ScanListJobsResp - (*ScanListReq)(nil), // 222: ScanListReq - (*ScanListResp)(nil), // 223: ScanListResp - (*ScanListUpd)(nil), // 224: ScanListUpd - (*ScanMetaLabelsAndTypesReq)(nil), // 225: ScanMetaLabelsAndTypesReq - (*ScanMetaLabelsAndTypesResp)(nil), // 226: ScanMetaLabelsAndTypesResp - (*ScanMetaWriteReq)(nil), // 227: ScanMetaWriteReq - (*ScanMetaWriteResp)(nil), // 228: ScanMetaWriteResp - (*ScanTriggerJobReq)(nil), // 229: ScanTriggerJobReq - (*ScanTriggerJobResp)(nil), // 230: ScanTriggerJobResp - (*ScanTriggerReImportReq)(nil), // 231: ScanTriggerReImportReq - (*ScanTriggerReImportResp)(nil), // 232: ScanTriggerReImportResp - (*ScanTriggerReImportUpd)(nil), // 233: ScanTriggerReImportUpd - (*ScanUploadReq)(nil), // 234: ScanUploadReq - (*ScanUploadResp)(nil), // 235: ScanUploadResp - (*ScanUploadUpd)(nil), // 236: ScanUploadUpd - (*ScanWriteJobReq)(nil), // 237: ScanWriteJobReq - (*ScanWriteJobResp)(nil), // 238: ScanWriteJobResp - (*ScreenConfigurationDeleteReq)(nil), // 239: ScreenConfigurationDeleteReq - (*ScreenConfigurationDeleteResp)(nil), // 240: ScreenConfigurationDeleteResp - (*ScreenConfigurationGetReq)(nil), // 241: ScreenConfigurationGetReq - (*ScreenConfigurationGetResp)(nil), // 242: ScreenConfigurationGetResp - (*ScreenConfigurationListReq)(nil), // 243: ScreenConfigurationListReq - (*ScreenConfigurationListResp)(nil), // 244: ScreenConfigurationListResp - (*ScreenConfigurationWriteReq)(nil), // 245: ScreenConfigurationWriteReq - (*ScreenConfigurationWriteResp)(nil), // 246: ScreenConfigurationWriteResp - (*SelectedImagePixelsReq)(nil), // 247: SelectedImagePixelsReq - (*SelectedImagePixelsResp)(nil), // 248: SelectedImagePixelsResp - (*SelectedImagePixelsWriteReq)(nil), // 249: SelectedImagePixelsWriteReq - (*SelectedImagePixelsWriteResp)(nil), // 250: SelectedImagePixelsWriteResp - (*SelectedScanEntriesReq)(nil), // 251: SelectedScanEntriesReq - (*SelectedScanEntriesResp)(nil), // 252: SelectedScanEntriesResp - (*SelectedScanEntriesWriteReq)(nil), // 253: SelectedScanEntriesWriteReq - (*SelectedScanEntriesWriteResp)(nil), // 254: SelectedScanEntriesWriteResp - (*SendUserNotificationReq)(nil), // 255: SendUserNotificationReq - (*SendUserNotificationResp)(nil), // 256: SendUserNotificationResp - (*SpectrumReq)(nil), // 257: SpectrumReq - (*SpectrumResp)(nil), // 258: SpectrumResp - (*TagCreateReq)(nil), // 259: TagCreateReq - (*TagCreateResp)(nil), // 260: TagCreateResp - (*TagDeleteReq)(nil), // 261: TagDeleteReq - (*TagDeleteResp)(nil), // 262: TagDeleteResp - (*TagListReq)(nil), // 263: TagListReq - (*TagListResp)(nil), // 264: TagListResp - (*UserAddRoleReq)(nil), // 265: UserAddRoleReq - (*UserAddRoleResp)(nil), // 266: UserAddRoleResp - (*UserDeleteRoleReq)(nil), // 267: UserDeleteRoleReq - (*UserDeleteRoleResp)(nil), // 268: UserDeleteRoleResp - (*UserDetailsReq)(nil), // 269: UserDetailsReq - (*UserDetailsResp)(nil), // 270: UserDetailsResp - (*UserDetailsWriteReq)(nil), // 271: UserDetailsWriteReq - (*UserDetailsWriteResp)(nil), // 272: UserDetailsWriteResp - (*UserGroupAddAdminReq)(nil), // 273: UserGroupAddAdminReq - (*UserGroupAddAdminResp)(nil), // 274: UserGroupAddAdminResp - (*UserGroupAddMemberReq)(nil), // 275: UserGroupAddMemberReq - (*UserGroupAddMemberResp)(nil), // 276: UserGroupAddMemberResp - (*UserGroupAddViewerReq)(nil), // 277: UserGroupAddViewerReq - (*UserGroupAddViewerResp)(nil), // 278: UserGroupAddViewerResp - (*UserGroupCreateReq)(nil), // 279: UserGroupCreateReq - (*UserGroupCreateResp)(nil), // 280: UserGroupCreateResp - (*UserGroupDeleteAdminReq)(nil), // 281: UserGroupDeleteAdminReq - (*UserGroupDeleteAdminResp)(nil), // 282: UserGroupDeleteAdminResp - (*UserGroupDeleteMemberReq)(nil), // 283: UserGroupDeleteMemberReq - (*UserGroupDeleteMemberResp)(nil), // 284: UserGroupDeleteMemberResp - (*UserGroupDeleteReq)(nil), // 285: UserGroupDeleteReq - (*UserGroupDeleteResp)(nil), // 286: UserGroupDeleteResp - (*UserGroupDeleteViewerReq)(nil), // 287: UserGroupDeleteViewerReq - (*UserGroupDeleteViewerResp)(nil), // 288: UserGroupDeleteViewerResp - (*UserGroupEditDetailsReq)(nil), // 289: UserGroupEditDetailsReq - (*UserGroupEditDetailsResp)(nil), // 290: UserGroupEditDetailsResp - (*UserGroupIgnoreJoinReq)(nil), // 291: UserGroupIgnoreJoinReq - (*UserGroupIgnoreJoinResp)(nil), // 292: UserGroupIgnoreJoinResp - (*UserGroupJoinListReq)(nil), // 293: UserGroupJoinListReq - (*UserGroupJoinListResp)(nil), // 294: UserGroupJoinListResp - (*UserGroupJoinReq)(nil), // 295: UserGroupJoinReq - (*UserGroupJoinResp)(nil), // 296: UserGroupJoinResp - (*UserGroupListJoinableReq)(nil), // 297: UserGroupListJoinableReq - (*UserGroupListJoinableResp)(nil), // 298: UserGroupListJoinableResp - (*UserGroupListReq)(nil), // 299: UserGroupListReq - (*UserGroupListResp)(nil), // 300: UserGroupListResp - (*UserGroupReq)(nil), // 301: UserGroupReq - (*UserGroupResp)(nil), // 302: UserGroupResp - (*UserImpersonateGetReq)(nil), // 303: UserImpersonateGetReq - (*UserImpersonateGetResp)(nil), // 304: UserImpersonateGetResp - (*UserImpersonateReq)(nil), // 305: UserImpersonateReq - (*UserImpersonateResp)(nil), // 306: UserImpersonateResp - (*UserListReq)(nil), // 307: UserListReq - (*UserListResp)(nil), // 308: UserListResp - (*UserNotificationSettingsReq)(nil), // 309: UserNotificationSettingsReq - (*UserNotificationSettingsResp)(nil), // 310: UserNotificationSettingsResp - (*UserNotificationSettingsUpd)(nil), // 311: UserNotificationSettingsUpd - (*UserNotificationSettingsWriteReq)(nil), // 312: UserNotificationSettingsWriteReq - (*UserNotificationSettingsWriteResp)(nil), // 313: UserNotificationSettingsWriteResp - (*UserRoleListReq)(nil), // 314: UserRoleListReq - (*UserRoleListResp)(nil), // 315: UserRoleListResp - (*UserRolesListReq)(nil), // 316: UserRolesListReq - (*UserRolesListResp)(nil), // 317: UserRolesListResp - (*UserSearchReq)(nil), // 318: UserSearchReq - (*UserSearchResp)(nil), // 319: UserSearchResp - (*WidgetDataGetReq)(nil), // 320: WidgetDataGetReq - (*WidgetDataGetResp)(nil), // 321: WidgetDataGetResp - (*WidgetDataWriteReq)(nil), // 322: WidgetDataWriteReq - (*WidgetDataWriteResp)(nil), // 323: WidgetDataWriteResp - (*WidgetMetadataGetReq)(nil), // 324: WidgetMetadataGetReq - (*WidgetMetadataGetResp)(nil), // 325: WidgetMetadataGetResp - (*WidgetMetadataWriteReq)(nil), // 326: WidgetMetadataWriteReq - (*WidgetMetadataWriteResp)(nil), // 327: WidgetMetadataWriteResp - (*ZenodoDOIGetReq)(nil), // 328: ZenodoDOIGetReq - (*ZenodoDOIGetResp)(nil), // 329: ZenodoDOIGetResp + (*ExpressionCalculateReq)(nil), // 43: ExpressionCalculateReq + (*ExpressionCalculateResp)(nil), // 44: ExpressionCalculateResp + (*ExpressionDeleteReq)(nil), // 45: ExpressionDeleteReq + (*ExpressionDeleteResp)(nil), // 46: ExpressionDeleteResp + (*ExpressionDisplaySettingsGetReq)(nil), // 47: ExpressionDisplaySettingsGetReq + (*ExpressionDisplaySettingsGetResp)(nil), // 48: ExpressionDisplaySettingsGetResp + (*ExpressionDisplaySettingsWriteReq)(nil), // 49: ExpressionDisplaySettingsWriteReq + (*ExpressionDisplaySettingsWriteResp)(nil), // 50: ExpressionDisplaySettingsWriteResp + (*ExpressionGetReq)(nil), // 51: ExpressionGetReq + (*ExpressionGetResp)(nil), // 52: ExpressionGetResp + (*ExpressionGroupDeleteReq)(nil), // 53: ExpressionGroupDeleteReq + (*ExpressionGroupDeleteResp)(nil), // 54: ExpressionGroupDeleteResp + (*ExpressionGroupGetReq)(nil), // 55: ExpressionGroupGetReq + (*ExpressionGroupGetResp)(nil), // 56: ExpressionGroupGetResp + (*ExpressionGroupListReq)(nil), // 57: ExpressionGroupListReq + (*ExpressionGroupListResp)(nil), // 58: ExpressionGroupListResp + (*ExpressionGroupWriteReq)(nil), // 59: ExpressionGroupWriteReq + (*ExpressionGroupWriteResp)(nil), // 60: ExpressionGroupWriteResp + (*ExpressionListReq)(nil), // 61: ExpressionListReq + (*ExpressionListResp)(nil), // 62: ExpressionListResp + (*ExpressionWriteExecStatReq)(nil), // 63: ExpressionWriteExecStatReq + (*ExpressionWriteExecStatResp)(nil), // 64: ExpressionWriteExecStatResp + (*ExpressionWriteReq)(nil), // 65: ExpressionWriteReq + (*ExpressionWriteResp)(nil), // 66: ExpressionWriteResp + (*GetOwnershipReq)(nil), // 67: GetOwnershipReq + (*GetOwnershipResp)(nil), // 68: GetOwnershipResp + (*Image3DModelPointUploadReq)(nil), // 69: Image3DModelPointUploadReq + (*Image3DModelPointUploadResp)(nil), // 70: Image3DModelPointUploadResp + (*Image3DModelPointsReq)(nil), // 71: Image3DModelPointsReq + (*Image3DModelPointsResp)(nil), // 72: Image3DModelPointsResp + (*ImageBeamLocationUploadReq)(nil), // 73: ImageBeamLocationUploadReq + (*ImageBeamLocationUploadResp)(nil), // 74: ImageBeamLocationUploadResp + (*ImageBeamLocationVersionsReq)(nil), // 75: ImageBeamLocationVersionsReq + (*ImageBeamLocationVersionsResp)(nil), // 76: ImageBeamLocationVersionsResp + (*ImageBeamLocationsReq)(nil), // 77: ImageBeamLocationsReq + (*ImageBeamLocationsResp)(nil), // 78: ImageBeamLocationsResp + (*ImageDeleteReq)(nil), // 79: ImageDeleteReq + (*ImageDeleteResp)(nil), // 80: ImageDeleteResp + (*ImageGetDefaultReq)(nil), // 81: ImageGetDefaultReq + (*ImageGetDefaultResp)(nil), // 82: ImageGetDefaultResp + (*ImageGetReq)(nil), // 83: ImageGetReq + (*ImageGetResp)(nil), // 84: ImageGetResp + (*ImageListReq)(nil), // 85: ImageListReq + (*ImageListResp)(nil), // 86: ImageListResp + (*ImageListUpd)(nil), // 87: ImageListUpd + (*ImagePyramidGetReq)(nil), // 88: ImagePyramidGetReq + (*ImagePyramidGetResp)(nil), // 89: ImagePyramidGetResp + (*ImageScanEntryDisplayElementsGetReq)(nil), // 90: ImageScanEntryDisplayElementsGetReq + (*ImageScanEntryDisplayElementsGetResp)(nil), // 91: ImageScanEntryDisplayElementsGetResp + (*ImageSetDefaultReq)(nil), // 92: ImageSetDefaultReq + (*ImageSetDefaultResp)(nil), // 93: ImageSetDefaultResp + (*ImageSetMatchTransformReq)(nil), // 94: ImageSetMatchTransformReq + (*ImageSetMatchTransformResp)(nil), // 95: ImageSetMatchTransformResp + (*ImageTileDataGetReq)(nil), // 96: ImageTileDataGetReq + (*ImageTileDataGetResp)(nil), // 97: ImageTileDataGetResp + (*ImageTileStructureGetReq)(nil), // 98: ImageTileStructureGetReq + (*ImageTileStructureGetResp)(nil), // 99: ImageTileStructureGetResp + (*ImportMarsViewerImageReq)(nil), // 100: ImportMarsViewerImageReq + (*ImportMarsViewerImageResp)(nil), // 101: ImportMarsViewerImageResp + (*ImportMarsViewerImageUpd)(nil), // 102: ImportMarsViewerImageUpd + (*JobListReq)(nil), // 103: JobListReq + (*JobListResp)(nil), // 104: JobListResp + (*JobListUpd)(nil), // 105: JobListUpd + (*LogGetLevelReq)(nil), // 106: LogGetLevelReq + (*LogGetLevelResp)(nil), // 107: LogGetLevelResp + (*LogReadReq)(nil), // 108: LogReadReq + (*LogReadResp)(nil), // 109: LogReadResp + (*LogSetLevelReq)(nil), // 110: LogSetLevelReq + (*LogSetLevelResp)(nil), // 111: LogSetLevelResp + (*MemoiseDeleteByRegexReq)(nil), // 112: MemoiseDeleteByRegexReq + (*MemoiseDeleteByRegexResp)(nil), // 113: MemoiseDeleteByRegexResp + (*MemoiseDeleteReq)(nil), // 114: MemoiseDeleteReq + (*MemoiseDeleteResp)(nil), // 115: MemoiseDeleteResp + (*MultiQuantCompareReq)(nil), // 116: MultiQuantCompareReq + (*MultiQuantCompareResp)(nil), // 117: MultiQuantCompareResp + (*NotificationDismissReq)(nil), // 118: NotificationDismissReq + (*NotificationDismissResp)(nil), // 119: NotificationDismissResp + (*NotificationReq)(nil), // 120: NotificationReq + (*NotificationResp)(nil), // 121: NotificationResp + (*NotificationUpd)(nil), // 122: NotificationUpd + (*ObjectEditAccessReq)(nil), // 123: ObjectEditAccessReq + (*ObjectEditAccessResp)(nil), // 124: ObjectEditAccessResp + (*PiquantConfigFileReq)(nil), // 125: PiquantConfigFileReq + (*PiquantConfigFileResp)(nil), // 126: PiquantConfigFileResp + (*PiquantConfigListReq)(nil), // 127: PiquantConfigListReq + (*PiquantConfigListResp)(nil), // 128: PiquantConfigListResp + (*PiquantConfigVersionReq)(nil), // 129: PiquantConfigVersionReq + (*PiquantConfigVersionResp)(nil), // 130: PiquantConfigVersionResp + (*PiquantConfigVersionsListReq)(nil), // 131: PiquantConfigVersionsListReq + (*PiquantConfigVersionsListResp)(nil), // 132: PiquantConfigVersionsListResp + (*PiquantCurrentVersionReq)(nil), // 133: PiquantCurrentVersionReq + (*PiquantCurrentVersionResp)(nil), // 134: PiquantCurrentVersionResp + (*PiquantVersionListReq)(nil), // 135: PiquantVersionListReq + (*PiquantVersionListResp)(nil), // 136: PiquantVersionListResp + (*PiquantWriteCurrentVersionReq)(nil), // 137: PiquantWriteCurrentVersionReq + (*PiquantWriteCurrentVersionResp)(nil), // 138: PiquantWriteCurrentVersionResp + (*PseudoIntensityReq)(nil), // 139: PseudoIntensityReq + (*PseudoIntensityResp)(nil), // 140: PseudoIntensityResp + (*PublishExpressionToZenodoReq)(nil), // 141: PublishExpressionToZenodoReq + (*PublishExpressionToZenodoResp)(nil), // 142: PublishExpressionToZenodoResp + (*QuantBlessReq)(nil), // 143: QuantBlessReq + (*QuantBlessResp)(nil), // 144: QuantBlessResp + (*QuantCombineListGetReq)(nil), // 145: QuantCombineListGetReq + (*QuantCombineListGetResp)(nil), // 146: QuantCombineListGetResp + (*QuantCombineListWriteReq)(nil), // 147: QuantCombineListWriteReq + (*QuantCombineListWriteResp)(nil), // 148: QuantCombineListWriteResp + (*QuantCombineReq)(nil), // 149: QuantCombineReq + (*QuantCombineResp)(nil), // 150: QuantCombineResp + (*QuantCreateReq)(nil), // 151: QuantCreateReq + (*QuantCreateResp)(nil), // 152: QuantCreateResp + (*QuantCreateUpd)(nil), // 153: QuantCreateUpd + (*QuantDeleteReq)(nil), // 154: QuantDeleteReq + (*QuantDeleteResp)(nil), // 155: QuantDeleteResp + (*QuantGetReq)(nil), // 156: QuantGetReq + (*QuantGetResp)(nil), // 157: QuantGetResp + (*QuantLastOutputGetReq)(nil), // 158: QuantLastOutputGetReq + (*QuantLastOutputGetResp)(nil), // 159: QuantLastOutputGetResp + (*QuantListReq)(nil), // 160: QuantListReq + (*QuantListResp)(nil), // 161: QuantListResp + (*QuantLogGetReq)(nil), // 162: QuantLogGetReq + (*QuantLogGetResp)(nil), // 163: QuantLogGetResp + (*QuantLogListReq)(nil), // 164: QuantLogListReq + (*QuantLogListResp)(nil), // 165: QuantLogListResp + (*QuantPublishReq)(nil), // 166: QuantPublishReq + (*QuantPublishResp)(nil), // 167: QuantPublishResp + (*QuantRawDataGetReq)(nil), // 168: QuantRawDataGetReq + (*QuantRawDataGetResp)(nil), // 169: QuantRawDataGetResp + (*QuantUploadReq)(nil), // 170: QuantUploadReq + (*QuantUploadResp)(nil), // 171: QuantUploadResp + (*ReferenceDataBulkWriteReq)(nil), // 172: ReferenceDataBulkWriteReq + (*ReferenceDataBulkWriteResp)(nil), // 173: ReferenceDataBulkWriteResp + (*ReferenceDataDeleteReq)(nil), // 174: ReferenceDataDeleteReq + (*ReferenceDataDeleteResp)(nil), // 175: ReferenceDataDeleteResp + (*ReferenceDataGetReq)(nil), // 176: ReferenceDataGetReq + (*ReferenceDataGetResp)(nil), // 177: ReferenceDataGetResp + (*ReferenceDataListReq)(nil), // 178: ReferenceDataListReq + (*ReferenceDataListResp)(nil), // 179: ReferenceDataListResp + (*ReferenceDataWriteReq)(nil), // 180: ReferenceDataWriteReq + (*ReferenceDataWriteResp)(nil), // 181: ReferenceDataWriteResp + (*RegionOfInterestBulkDuplicateReq)(nil), // 182: RegionOfInterestBulkDuplicateReq + (*RegionOfInterestBulkDuplicateResp)(nil), // 183: RegionOfInterestBulkDuplicateResp + (*RegionOfInterestBulkWriteReq)(nil), // 184: RegionOfInterestBulkWriteReq + (*RegionOfInterestBulkWriteResp)(nil), // 185: RegionOfInterestBulkWriteResp + (*RegionOfInterestDeleteReq)(nil), // 186: RegionOfInterestDeleteReq + (*RegionOfInterestDeleteResp)(nil), // 187: RegionOfInterestDeleteResp + (*RegionOfInterestDisplaySettingsGetReq)(nil), // 188: RegionOfInterestDisplaySettingsGetReq + (*RegionOfInterestDisplaySettingsGetResp)(nil), // 189: RegionOfInterestDisplaySettingsGetResp + (*RegionOfInterestDisplaySettingsWriteReq)(nil), // 190: RegionOfInterestDisplaySettingsWriteReq + (*RegionOfInterestDisplaySettingsWriteResp)(nil), // 191: RegionOfInterestDisplaySettingsWriteResp + (*RegionOfInterestGetReq)(nil), // 192: RegionOfInterestGetReq + (*RegionOfInterestGetResp)(nil), // 193: RegionOfInterestGetResp + (*RegionOfInterestListReq)(nil), // 194: RegionOfInterestListReq + (*RegionOfInterestListResp)(nil), // 195: RegionOfInterestListResp + (*RegionOfInterestWriteReq)(nil), // 196: RegionOfInterestWriteReq + (*RegionOfInterestWriteResp)(nil), // 197: RegionOfInterestWriteResp + (*RestoreDBReq)(nil), // 198: RestoreDBReq + (*RestoreDBResp)(nil), // 199: RestoreDBResp + (*ReviewerMagicLinkCreateReq)(nil), // 200: ReviewerMagicLinkCreateReq + (*ReviewerMagicLinkCreateResp)(nil), // 201: ReviewerMagicLinkCreateResp + (*ReviewerMagicLinkLoginReq)(nil), // 202: ReviewerMagicLinkLoginReq + (*ReviewerMagicLinkLoginResp)(nil), // 203: ReviewerMagicLinkLoginResp + (*RunTestReq)(nil), // 204: RunTestReq + (*RunTestResp)(nil), // 205: RunTestResp + (*ScanAutoShareReq)(nil), // 206: ScanAutoShareReq + (*ScanAutoShareResp)(nil), // 207: ScanAutoShareResp + (*ScanAutoShareWriteReq)(nil), // 208: ScanAutoShareWriteReq + (*ScanAutoShareWriteResp)(nil), // 209: ScanAutoShareWriteResp + (*ScanBeamLocationsReq)(nil), // 210: ScanBeamLocationsReq + (*ScanBeamLocationsResp)(nil), // 211: ScanBeamLocationsResp + (*ScanCreateUserDefinedReq)(nil), // 212: ScanCreateUserDefinedReq + (*ScanCreateUserDefinedResp)(nil), // 213: ScanCreateUserDefinedResp + (*ScanDeleteReq)(nil), // 214: ScanDeleteReq + (*ScanDeleteResp)(nil), // 215: ScanDeleteResp + (*ScanEntryMetadataReq)(nil), // 216: ScanEntryMetadataReq + (*ScanEntryMetadataResp)(nil), // 217: ScanEntryMetadataResp + (*ScanEntryReq)(nil), // 218: ScanEntryReq + (*ScanEntryResp)(nil), // 219: ScanEntryResp + (*ScanGetReq)(nil), // 220: ScanGetReq + (*ScanGetResp)(nil), // 221: ScanGetResp + (*ScanListJobsReq)(nil), // 222: ScanListJobsReq + (*ScanListJobsResp)(nil), // 223: ScanListJobsResp + (*ScanListReq)(nil), // 224: ScanListReq + (*ScanListResp)(nil), // 225: ScanListResp + (*ScanListUpd)(nil), // 226: ScanListUpd + (*ScanMetaLabelsAndTypesReq)(nil), // 227: ScanMetaLabelsAndTypesReq + (*ScanMetaLabelsAndTypesResp)(nil), // 228: ScanMetaLabelsAndTypesResp + (*ScanMetaWriteReq)(nil), // 229: ScanMetaWriteReq + (*ScanMetaWriteResp)(nil), // 230: ScanMetaWriteResp + (*ScanTriggerJobReq)(nil), // 231: ScanTriggerJobReq + (*ScanTriggerJobResp)(nil), // 232: ScanTriggerJobResp + (*ScanTriggerReImportReq)(nil), // 233: ScanTriggerReImportReq + (*ScanTriggerReImportResp)(nil), // 234: ScanTriggerReImportResp + (*ScanTriggerReImportUpd)(nil), // 235: ScanTriggerReImportUpd + (*ScanUploadReq)(nil), // 236: ScanUploadReq + (*ScanUploadResp)(nil), // 237: ScanUploadResp + (*ScanUploadUpd)(nil), // 238: ScanUploadUpd + (*ScanWriteJobReq)(nil), // 239: ScanWriteJobReq + (*ScanWriteJobResp)(nil), // 240: ScanWriteJobResp + (*ScreenConfigurationDeleteReq)(nil), // 241: ScreenConfigurationDeleteReq + (*ScreenConfigurationDeleteResp)(nil), // 242: ScreenConfigurationDeleteResp + (*ScreenConfigurationGetReq)(nil), // 243: ScreenConfigurationGetReq + (*ScreenConfigurationGetResp)(nil), // 244: ScreenConfigurationGetResp + (*ScreenConfigurationListReq)(nil), // 245: ScreenConfigurationListReq + (*ScreenConfigurationListResp)(nil), // 246: ScreenConfigurationListResp + (*ScreenConfigurationWriteReq)(nil), // 247: ScreenConfigurationWriteReq + (*ScreenConfigurationWriteResp)(nil), // 248: ScreenConfigurationWriteResp + (*SelectedImagePixelsReq)(nil), // 249: SelectedImagePixelsReq + (*SelectedImagePixelsResp)(nil), // 250: SelectedImagePixelsResp + (*SelectedImagePixelsWriteReq)(nil), // 251: SelectedImagePixelsWriteReq + (*SelectedImagePixelsWriteResp)(nil), // 252: SelectedImagePixelsWriteResp + (*SelectedScanEntriesReq)(nil), // 253: SelectedScanEntriesReq + (*SelectedScanEntriesResp)(nil), // 254: SelectedScanEntriesResp + (*SelectedScanEntriesWriteReq)(nil), // 255: SelectedScanEntriesWriteReq + (*SelectedScanEntriesWriteResp)(nil), // 256: SelectedScanEntriesWriteResp + (*SendUserNotificationReq)(nil), // 257: SendUserNotificationReq + (*SendUserNotificationResp)(nil), // 258: SendUserNotificationResp + (*SpectrumReq)(nil), // 259: SpectrumReq + (*SpectrumResp)(nil), // 260: SpectrumResp + (*TagCreateReq)(nil), // 261: TagCreateReq + (*TagCreateResp)(nil), // 262: TagCreateResp + (*TagDeleteReq)(nil), // 263: TagDeleteReq + (*TagDeleteResp)(nil), // 264: TagDeleteResp + (*TagListReq)(nil), // 265: TagListReq + (*TagListResp)(nil), // 266: TagListResp + (*UserAddRoleReq)(nil), // 267: UserAddRoleReq + (*UserAddRoleResp)(nil), // 268: UserAddRoleResp + (*UserDeleteRoleReq)(nil), // 269: UserDeleteRoleReq + (*UserDeleteRoleResp)(nil), // 270: UserDeleteRoleResp + (*UserDetailsReq)(nil), // 271: UserDetailsReq + (*UserDetailsResp)(nil), // 272: UserDetailsResp + (*UserDetailsWriteReq)(nil), // 273: UserDetailsWriteReq + (*UserDetailsWriteResp)(nil), // 274: UserDetailsWriteResp + (*UserGroupAddAdminReq)(nil), // 275: UserGroupAddAdminReq + (*UserGroupAddAdminResp)(nil), // 276: UserGroupAddAdminResp + (*UserGroupAddMemberReq)(nil), // 277: UserGroupAddMemberReq + (*UserGroupAddMemberResp)(nil), // 278: UserGroupAddMemberResp + (*UserGroupAddViewerReq)(nil), // 279: UserGroupAddViewerReq + (*UserGroupAddViewerResp)(nil), // 280: UserGroupAddViewerResp + (*UserGroupCreateReq)(nil), // 281: UserGroupCreateReq + (*UserGroupCreateResp)(nil), // 282: UserGroupCreateResp + (*UserGroupDeleteAdminReq)(nil), // 283: UserGroupDeleteAdminReq + (*UserGroupDeleteAdminResp)(nil), // 284: UserGroupDeleteAdminResp + (*UserGroupDeleteMemberReq)(nil), // 285: UserGroupDeleteMemberReq + (*UserGroupDeleteMemberResp)(nil), // 286: UserGroupDeleteMemberResp + (*UserGroupDeleteReq)(nil), // 287: UserGroupDeleteReq + (*UserGroupDeleteResp)(nil), // 288: UserGroupDeleteResp + (*UserGroupDeleteViewerReq)(nil), // 289: UserGroupDeleteViewerReq + (*UserGroupDeleteViewerResp)(nil), // 290: UserGroupDeleteViewerResp + (*UserGroupEditDetailsReq)(nil), // 291: UserGroupEditDetailsReq + (*UserGroupEditDetailsResp)(nil), // 292: UserGroupEditDetailsResp + (*UserGroupIgnoreJoinReq)(nil), // 293: UserGroupIgnoreJoinReq + (*UserGroupIgnoreJoinResp)(nil), // 294: UserGroupIgnoreJoinResp + (*UserGroupJoinListReq)(nil), // 295: UserGroupJoinListReq + (*UserGroupJoinListResp)(nil), // 296: UserGroupJoinListResp + (*UserGroupJoinReq)(nil), // 297: UserGroupJoinReq + (*UserGroupJoinResp)(nil), // 298: UserGroupJoinResp + (*UserGroupListJoinableReq)(nil), // 299: UserGroupListJoinableReq + (*UserGroupListJoinableResp)(nil), // 300: UserGroupListJoinableResp + (*UserGroupListReq)(nil), // 301: UserGroupListReq + (*UserGroupListResp)(nil), // 302: UserGroupListResp + (*UserGroupReq)(nil), // 303: UserGroupReq + (*UserGroupResp)(nil), // 304: UserGroupResp + (*UserImpersonateGetReq)(nil), // 305: UserImpersonateGetReq + (*UserImpersonateGetResp)(nil), // 306: UserImpersonateGetResp + (*UserImpersonateReq)(nil), // 307: UserImpersonateReq + (*UserImpersonateResp)(nil), // 308: UserImpersonateResp + (*UserListReq)(nil), // 309: UserListReq + (*UserListResp)(nil), // 310: UserListResp + (*UserNotificationSettingsReq)(nil), // 311: UserNotificationSettingsReq + (*UserNotificationSettingsResp)(nil), // 312: UserNotificationSettingsResp + (*UserNotificationSettingsUpd)(nil), // 313: UserNotificationSettingsUpd + (*UserNotificationSettingsWriteReq)(nil), // 314: UserNotificationSettingsWriteReq + (*UserNotificationSettingsWriteResp)(nil), // 315: UserNotificationSettingsWriteResp + (*UserRoleListReq)(nil), // 316: UserRoleListReq + (*UserRoleListResp)(nil), // 317: UserRoleListResp + (*UserRolesListReq)(nil), // 318: UserRolesListReq + (*UserRolesListResp)(nil), // 319: UserRolesListResp + (*UserSearchReq)(nil), // 320: UserSearchReq + (*UserSearchResp)(nil), // 321: UserSearchResp + (*WidgetDataGetReq)(nil), // 322: WidgetDataGetReq + (*WidgetDataGetResp)(nil), // 323: WidgetDataGetResp + (*WidgetDataWriteReq)(nil), // 324: WidgetDataWriteReq + (*WidgetDataWriteResp)(nil), // 325: WidgetDataWriteResp + (*WidgetMetadataGetReq)(nil), // 326: WidgetMetadataGetReq + (*WidgetMetadataGetResp)(nil), // 327: WidgetMetadataGetResp + (*WidgetMetadataWriteReq)(nil), // 328: WidgetMetadataWriteReq + (*WidgetMetadataWriteResp)(nil), // 329: WidgetMetadataWriteResp + (*ZenodoDOIGetReq)(nil), // 330: ZenodoDOIGetReq + (*ZenodoDOIGetResp)(nil), // 331: ZenodoDOIGetResp } var file_websocket_proto_depIdxs = []int32{ 0, // 0: WSMessage.status:type_name -> ResponseStatus @@ -6877,298 +6919,300 @@ var file_websocket_proto_depIdxs = []int32{ 40, // 39: WSMessage.elementSetWriteResp:type_name -> ElementSetWriteResp 41, // 40: WSMessage.exportFilesReq:type_name -> ExportFilesReq 42, // 41: WSMessage.exportFilesResp:type_name -> ExportFilesResp - 43, // 42: WSMessage.expressionDeleteReq:type_name -> ExpressionDeleteReq - 44, // 43: WSMessage.expressionDeleteResp:type_name -> ExpressionDeleteResp - 45, // 44: WSMessage.expressionDisplaySettingsGetReq:type_name -> ExpressionDisplaySettingsGetReq - 46, // 45: WSMessage.expressionDisplaySettingsGetResp:type_name -> ExpressionDisplaySettingsGetResp - 47, // 46: WSMessage.expressionDisplaySettingsWriteReq:type_name -> ExpressionDisplaySettingsWriteReq - 48, // 47: WSMessage.expressionDisplaySettingsWriteResp:type_name -> ExpressionDisplaySettingsWriteResp - 49, // 48: WSMessage.expressionGetReq:type_name -> ExpressionGetReq - 50, // 49: WSMessage.expressionGetResp:type_name -> ExpressionGetResp - 51, // 50: WSMessage.expressionGroupDeleteReq:type_name -> ExpressionGroupDeleteReq - 52, // 51: WSMessage.expressionGroupDeleteResp:type_name -> ExpressionGroupDeleteResp - 53, // 52: WSMessage.expressionGroupGetReq:type_name -> ExpressionGroupGetReq - 54, // 53: WSMessage.expressionGroupGetResp:type_name -> ExpressionGroupGetResp - 55, // 54: WSMessage.expressionGroupListReq:type_name -> ExpressionGroupListReq - 56, // 55: WSMessage.expressionGroupListResp:type_name -> ExpressionGroupListResp - 57, // 56: WSMessage.expressionGroupWriteReq:type_name -> ExpressionGroupWriteReq - 58, // 57: WSMessage.expressionGroupWriteResp:type_name -> ExpressionGroupWriteResp - 59, // 58: WSMessage.expressionListReq:type_name -> ExpressionListReq - 60, // 59: WSMessage.expressionListResp:type_name -> ExpressionListResp - 61, // 60: WSMessage.expressionWriteExecStatReq:type_name -> ExpressionWriteExecStatReq - 62, // 61: WSMessage.expressionWriteExecStatResp:type_name -> ExpressionWriteExecStatResp - 63, // 62: WSMessage.expressionWriteReq:type_name -> ExpressionWriteReq - 64, // 63: WSMessage.expressionWriteResp:type_name -> ExpressionWriteResp - 65, // 64: WSMessage.getOwnershipReq:type_name -> GetOwnershipReq - 66, // 65: WSMessage.getOwnershipResp:type_name -> GetOwnershipResp - 67, // 66: WSMessage.image3DModelPointUploadReq:type_name -> Image3DModelPointUploadReq - 68, // 67: WSMessage.image3DModelPointUploadResp:type_name -> Image3DModelPointUploadResp - 69, // 68: WSMessage.image3DModelPointsReq:type_name -> Image3DModelPointsReq - 70, // 69: WSMessage.image3DModelPointsResp:type_name -> Image3DModelPointsResp - 71, // 70: WSMessage.imageBeamLocationUploadReq:type_name -> ImageBeamLocationUploadReq - 72, // 71: WSMessage.imageBeamLocationUploadResp:type_name -> ImageBeamLocationUploadResp - 73, // 72: WSMessage.imageBeamLocationVersionsReq:type_name -> ImageBeamLocationVersionsReq - 74, // 73: WSMessage.imageBeamLocationVersionsResp:type_name -> ImageBeamLocationVersionsResp - 75, // 74: WSMessage.imageBeamLocationsReq:type_name -> ImageBeamLocationsReq - 76, // 75: WSMessage.imageBeamLocationsResp:type_name -> ImageBeamLocationsResp - 77, // 76: WSMessage.imageDeleteReq:type_name -> ImageDeleteReq - 78, // 77: WSMessage.imageDeleteResp:type_name -> ImageDeleteResp - 79, // 78: WSMessage.imageGetDefaultReq:type_name -> ImageGetDefaultReq - 80, // 79: WSMessage.imageGetDefaultResp:type_name -> ImageGetDefaultResp - 81, // 80: WSMessage.imageGetReq:type_name -> ImageGetReq - 82, // 81: WSMessage.imageGetResp:type_name -> ImageGetResp - 83, // 82: WSMessage.imageListReq:type_name -> ImageListReq - 84, // 83: WSMessage.imageListResp:type_name -> ImageListResp - 85, // 84: WSMessage.imageListUpd:type_name -> ImageListUpd - 86, // 85: WSMessage.imagePyramidGetReq:type_name -> ImagePyramidGetReq - 87, // 86: WSMessage.imagePyramidGetResp:type_name -> ImagePyramidGetResp - 88, // 87: WSMessage.imageScanEntryDisplayElementsGetReq:type_name -> ImageScanEntryDisplayElementsGetReq - 89, // 88: WSMessage.imageScanEntryDisplayElementsGetResp:type_name -> ImageScanEntryDisplayElementsGetResp - 90, // 89: WSMessage.imageSetDefaultReq:type_name -> ImageSetDefaultReq - 91, // 90: WSMessage.imageSetDefaultResp:type_name -> ImageSetDefaultResp - 92, // 91: WSMessage.imageSetMatchTransformReq:type_name -> ImageSetMatchTransformReq - 93, // 92: WSMessage.imageSetMatchTransformResp:type_name -> ImageSetMatchTransformResp - 94, // 93: WSMessage.imageTileDataGetReq:type_name -> ImageTileDataGetReq - 95, // 94: WSMessage.imageTileDataGetResp:type_name -> ImageTileDataGetResp - 96, // 95: WSMessage.imageTileStructureGetReq:type_name -> ImageTileStructureGetReq - 97, // 96: WSMessage.imageTileStructureGetResp:type_name -> ImageTileStructureGetResp - 98, // 97: WSMessage.importMarsViewerImageReq:type_name -> ImportMarsViewerImageReq - 99, // 98: WSMessage.importMarsViewerImageResp:type_name -> ImportMarsViewerImageResp - 100, // 99: WSMessage.importMarsViewerImageUpd:type_name -> ImportMarsViewerImageUpd - 101, // 100: WSMessage.jobListReq:type_name -> JobListReq - 102, // 101: WSMessage.jobListResp:type_name -> JobListResp - 103, // 102: WSMessage.jobListUpd:type_name -> JobListUpd - 104, // 103: WSMessage.logGetLevelReq:type_name -> LogGetLevelReq - 105, // 104: WSMessage.logGetLevelResp:type_name -> LogGetLevelResp - 106, // 105: WSMessage.logReadReq:type_name -> LogReadReq - 107, // 106: WSMessage.logReadResp:type_name -> LogReadResp - 108, // 107: WSMessage.logSetLevelReq:type_name -> LogSetLevelReq - 109, // 108: WSMessage.logSetLevelResp:type_name -> LogSetLevelResp - 110, // 109: WSMessage.memoiseDeleteByRegexReq:type_name -> MemoiseDeleteByRegexReq - 111, // 110: WSMessage.memoiseDeleteByRegexResp:type_name -> MemoiseDeleteByRegexResp - 112, // 111: WSMessage.memoiseDeleteReq:type_name -> MemoiseDeleteReq - 113, // 112: WSMessage.memoiseDeleteResp:type_name -> MemoiseDeleteResp - 114, // 113: WSMessage.multiQuantCompareReq:type_name -> MultiQuantCompareReq - 115, // 114: WSMessage.multiQuantCompareResp:type_name -> MultiQuantCompareResp - 116, // 115: WSMessage.notificationDismissReq:type_name -> NotificationDismissReq - 117, // 116: WSMessage.notificationDismissResp:type_name -> NotificationDismissResp - 118, // 117: WSMessage.notificationReq:type_name -> NotificationReq - 119, // 118: WSMessage.notificationResp:type_name -> NotificationResp - 120, // 119: WSMessage.notificationUpd:type_name -> NotificationUpd - 121, // 120: WSMessage.objectEditAccessReq:type_name -> ObjectEditAccessReq - 122, // 121: WSMessage.objectEditAccessResp:type_name -> ObjectEditAccessResp - 123, // 122: WSMessage.piquantConfigFileReq:type_name -> PiquantConfigFileReq - 124, // 123: WSMessage.piquantConfigFileResp:type_name -> PiquantConfigFileResp - 125, // 124: WSMessage.piquantConfigListReq:type_name -> PiquantConfigListReq - 126, // 125: WSMessage.piquantConfigListResp:type_name -> PiquantConfigListResp - 127, // 126: WSMessage.piquantConfigVersionReq:type_name -> PiquantConfigVersionReq - 128, // 127: WSMessage.piquantConfigVersionResp:type_name -> PiquantConfigVersionResp - 129, // 128: WSMessage.piquantConfigVersionsListReq:type_name -> PiquantConfigVersionsListReq - 130, // 129: WSMessage.piquantConfigVersionsListResp:type_name -> PiquantConfigVersionsListResp - 131, // 130: WSMessage.piquantCurrentVersionReq:type_name -> PiquantCurrentVersionReq - 132, // 131: WSMessage.piquantCurrentVersionResp:type_name -> PiquantCurrentVersionResp - 133, // 132: WSMessage.piquantVersionListReq:type_name -> PiquantVersionListReq - 134, // 133: WSMessage.piquantVersionListResp:type_name -> PiquantVersionListResp - 135, // 134: WSMessage.piquantWriteCurrentVersionReq:type_name -> PiquantWriteCurrentVersionReq - 136, // 135: WSMessage.piquantWriteCurrentVersionResp:type_name -> PiquantWriteCurrentVersionResp - 137, // 136: WSMessage.pseudoIntensityReq:type_name -> PseudoIntensityReq - 138, // 137: WSMessage.pseudoIntensityResp:type_name -> PseudoIntensityResp - 139, // 138: WSMessage.publishExpressionToZenodoReq:type_name -> PublishExpressionToZenodoReq - 140, // 139: WSMessage.publishExpressionToZenodoResp:type_name -> PublishExpressionToZenodoResp - 141, // 140: WSMessage.quantBlessReq:type_name -> QuantBlessReq - 142, // 141: WSMessage.quantBlessResp:type_name -> QuantBlessResp - 143, // 142: WSMessage.quantCombineListGetReq:type_name -> QuantCombineListGetReq - 144, // 143: WSMessage.quantCombineListGetResp:type_name -> QuantCombineListGetResp - 145, // 144: WSMessage.quantCombineListWriteReq:type_name -> QuantCombineListWriteReq - 146, // 145: WSMessage.quantCombineListWriteResp:type_name -> QuantCombineListWriteResp - 147, // 146: WSMessage.quantCombineReq:type_name -> QuantCombineReq - 148, // 147: WSMessage.quantCombineResp:type_name -> QuantCombineResp - 149, // 148: WSMessage.quantCreateReq:type_name -> QuantCreateReq - 150, // 149: WSMessage.quantCreateResp:type_name -> QuantCreateResp - 151, // 150: WSMessage.quantCreateUpd:type_name -> QuantCreateUpd - 152, // 151: WSMessage.quantDeleteReq:type_name -> QuantDeleteReq - 153, // 152: WSMessage.quantDeleteResp:type_name -> QuantDeleteResp - 154, // 153: WSMessage.quantGetReq:type_name -> QuantGetReq - 155, // 154: WSMessage.quantGetResp:type_name -> QuantGetResp - 156, // 155: WSMessage.quantLastOutputGetReq:type_name -> QuantLastOutputGetReq - 157, // 156: WSMessage.quantLastOutputGetResp:type_name -> QuantLastOutputGetResp - 158, // 157: WSMessage.quantListReq:type_name -> QuantListReq - 159, // 158: WSMessage.quantListResp:type_name -> QuantListResp - 160, // 159: WSMessage.quantLogGetReq:type_name -> QuantLogGetReq - 161, // 160: WSMessage.quantLogGetResp:type_name -> QuantLogGetResp - 162, // 161: WSMessage.quantLogListReq:type_name -> QuantLogListReq - 163, // 162: WSMessage.quantLogListResp:type_name -> QuantLogListResp - 164, // 163: WSMessage.quantPublishReq:type_name -> QuantPublishReq - 165, // 164: WSMessage.quantPublishResp:type_name -> QuantPublishResp - 166, // 165: WSMessage.quantRawDataGetReq:type_name -> QuantRawDataGetReq - 167, // 166: WSMessage.quantRawDataGetResp:type_name -> QuantRawDataGetResp - 168, // 167: WSMessage.quantUploadReq:type_name -> QuantUploadReq - 169, // 168: WSMessage.quantUploadResp:type_name -> QuantUploadResp - 170, // 169: WSMessage.referenceDataBulkWriteReq:type_name -> ReferenceDataBulkWriteReq - 171, // 170: WSMessage.referenceDataBulkWriteResp:type_name -> ReferenceDataBulkWriteResp - 172, // 171: WSMessage.referenceDataDeleteReq:type_name -> ReferenceDataDeleteReq - 173, // 172: WSMessage.referenceDataDeleteResp:type_name -> ReferenceDataDeleteResp - 174, // 173: WSMessage.referenceDataGetReq:type_name -> ReferenceDataGetReq - 175, // 174: WSMessage.referenceDataGetResp:type_name -> ReferenceDataGetResp - 176, // 175: WSMessage.referenceDataListReq:type_name -> ReferenceDataListReq - 177, // 176: WSMessage.referenceDataListResp:type_name -> ReferenceDataListResp - 178, // 177: WSMessage.referenceDataWriteReq:type_name -> ReferenceDataWriteReq - 179, // 178: WSMessage.referenceDataWriteResp:type_name -> ReferenceDataWriteResp - 180, // 179: WSMessage.regionOfInterestBulkDuplicateReq:type_name -> RegionOfInterestBulkDuplicateReq - 181, // 180: WSMessage.regionOfInterestBulkDuplicateResp:type_name -> RegionOfInterestBulkDuplicateResp - 182, // 181: WSMessage.regionOfInterestBulkWriteReq:type_name -> RegionOfInterestBulkWriteReq - 183, // 182: WSMessage.regionOfInterestBulkWriteResp:type_name -> RegionOfInterestBulkWriteResp - 184, // 183: WSMessage.regionOfInterestDeleteReq:type_name -> RegionOfInterestDeleteReq - 185, // 184: WSMessage.regionOfInterestDeleteResp:type_name -> RegionOfInterestDeleteResp - 186, // 185: WSMessage.regionOfInterestDisplaySettingsGetReq:type_name -> RegionOfInterestDisplaySettingsGetReq - 187, // 186: WSMessage.regionOfInterestDisplaySettingsGetResp:type_name -> RegionOfInterestDisplaySettingsGetResp - 188, // 187: WSMessage.regionOfInterestDisplaySettingsWriteReq:type_name -> RegionOfInterestDisplaySettingsWriteReq - 189, // 188: WSMessage.regionOfInterestDisplaySettingsWriteResp:type_name -> RegionOfInterestDisplaySettingsWriteResp - 190, // 189: WSMessage.regionOfInterestGetReq:type_name -> RegionOfInterestGetReq - 191, // 190: WSMessage.regionOfInterestGetResp:type_name -> RegionOfInterestGetResp - 192, // 191: WSMessage.regionOfInterestListReq:type_name -> RegionOfInterestListReq - 193, // 192: WSMessage.regionOfInterestListResp:type_name -> RegionOfInterestListResp - 194, // 193: WSMessage.regionOfInterestWriteReq:type_name -> RegionOfInterestWriteReq - 195, // 194: WSMessage.regionOfInterestWriteResp:type_name -> RegionOfInterestWriteResp - 196, // 195: WSMessage.restoreDBReq:type_name -> RestoreDBReq - 197, // 196: WSMessage.restoreDBResp:type_name -> RestoreDBResp - 198, // 197: WSMessage.reviewerMagicLinkCreateReq:type_name -> ReviewerMagicLinkCreateReq - 199, // 198: WSMessage.reviewerMagicLinkCreateResp:type_name -> ReviewerMagicLinkCreateResp - 200, // 199: WSMessage.reviewerMagicLinkLoginReq:type_name -> ReviewerMagicLinkLoginReq - 201, // 200: WSMessage.reviewerMagicLinkLoginResp:type_name -> ReviewerMagicLinkLoginResp - 202, // 201: WSMessage.runTestReq:type_name -> RunTestReq - 203, // 202: WSMessage.runTestResp:type_name -> RunTestResp - 204, // 203: WSMessage.scanAutoShareReq:type_name -> ScanAutoShareReq - 205, // 204: WSMessage.scanAutoShareResp:type_name -> ScanAutoShareResp - 206, // 205: WSMessage.scanAutoShareWriteReq:type_name -> ScanAutoShareWriteReq - 207, // 206: WSMessage.scanAutoShareWriteResp:type_name -> ScanAutoShareWriteResp - 208, // 207: WSMessage.scanBeamLocationsReq:type_name -> ScanBeamLocationsReq - 209, // 208: WSMessage.scanBeamLocationsResp:type_name -> ScanBeamLocationsResp - 210, // 209: WSMessage.scanCreateUserDefinedReq:type_name -> ScanCreateUserDefinedReq - 211, // 210: WSMessage.scanCreateUserDefinedResp:type_name -> ScanCreateUserDefinedResp - 212, // 211: WSMessage.scanDeleteReq:type_name -> ScanDeleteReq - 213, // 212: WSMessage.scanDeleteResp:type_name -> ScanDeleteResp - 214, // 213: WSMessage.scanEntryMetadataReq:type_name -> ScanEntryMetadataReq - 215, // 214: WSMessage.scanEntryMetadataResp:type_name -> ScanEntryMetadataResp - 216, // 215: WSMessage.scanEntryReq:type_name -> ScanEntryReq - 217, // 216: WSMessage.scanEntryResp:type_name -> ScanEntryResp - 218, // 217: WSMessage.scanGetReq:type_name -> ScanGetReq - 219, // 218: WSMessage.scanGetResp:type_name -> ScanGetResp - 220, // 219: WSMessage.scanListJobsReq:type_name -> ScanListJobsReq - 221, // 220: WSMessage.scanListJobsResp:type_name -> ScanListJobsResp - 222, // 221: WSMessage.scanListReq:type_name -> ScanListReq - 223, // 222: WSMessage.scanListResp:type_name -> ScanListResp - 224, // 223: WSMessage.scanListUpd:type_name -> ScanListUpd - 225, // 224: WSMessage.scanMetaLabelsAndTypesReq:type_name -> ScanMetaLabelsAndTypesReq - 226, // 225: WSMessage.scanMetaLabelsAndTypesResp:type_name -> ScanMetaLabelsAndTypesResp - 227, // 226: WSMessage.scanMetaWriteReq:type_name -> ScanMetaWriteReq - 228, // 227: WSMessage.scanMetaWriteResp:type_name -> ScanMetaWriteResp - 229, // 228: WSMessage.scanTriggerJobReq:type_name -> ScanTriggerJobReq - 230, // 229: WSMessage.scanTriggerJobResp:type_name -> ScanTriggerJobResp - 231, // 230: WSMessage.scanTriggerReImportReq:type_name -> ScanTriggerReImportReq - 232, // 231: WSMessage.scanTriggerReImportResp:type_name -> ScanTriggerReImportResp - 233, // 232: WSMessage.scanTriggerReImportUpd:type_name -> ScanTriggerReImportUpd - 234, // 233: WSMessage.scanUploadReq:type_name -> ScanUploadReq - 235, // 234: WSMessage.scanUploadResp:type_name -> ScanUploadResp - 236, // 235: WSMessage.scanUploadUpd:type_name -> ScanUploadUpd - 237, // 236: WSMessage.scanWriteJobReq:type_name -> ScanWriteJobReq - 238, // 237: WSMessage.scanWriteJobResp:type_name -> ScanWriteJobResp - 239, // 238: WSMessage.screenConfigurationDeleteReq:type_name -> ScreenConfigurationDeleteReq - 240, // 239: WSMessage.screenConfigurationDeleteResp:type_name -> ScreenConfigurationDeleteResp - 241, // 240: WSMessage.screenConfigurationGetReq:type_name -> ScreenConfigurationGetReq - 242, // 241: WSMessage.screenConfigurationGetResp:type_name -> ScreenConfigurationGetResp - 243, // 242: WSMessage.screenConfigurationListReq:type_name -> ScreenConfigurationListReq - 244, // 243: WSMessage.screenConfigurationListResp:type_name -> ScreenConfigurationListResp - 245, // 244: WSMessage.screenConfigurationWriteReq:type_name -> ScreenConfigurationWriteReq - 246, // 245: WSMessage.screenConfigurationWriteResp:type_name -> ScreenConfigurationWriteResp - 247, // 246: WSMessage.selectedImagePixelsReq:type_name -> SelectedImagePixelsReq - 248, // 247: WSMessage.selectedImagePixelsResp:type_name -> SelectedImagePixelsResp - 249, // 248: WSMessage.selectedImagePixelsWriteReq:type_name -> SelectedImagePixelsWriteReq - 250, // 249: WSMessage.selectedImagePixelsWriteResp:type_name -> SelectedImagePixelsWriteResp - 251, // 250: WSMessage.selectedScanEntriesReq:type_name -> SelectedScanEntriesReq - 252, // 251: WSMessage.selectedScanEntriesResp:type_name -> SelectedScanEntriesResp - 253, // 252: WSMessage.selectedScanEntriesWriteReq:type_name -> SelectedScanEntriesWriteReq - 254, // 253: WSMessage.selectedScanEntriesWriteResp:type_name -> SelectedScanEntriesWriteResp - 255, // 254: WSMessage.sendUserNotificationReq:type_name -> SendUserNotificationReq - 256, // 255: WSMessage.sendUserNotificationResp:type_name -> SendUserNotificationResp - 257, // 256: WSMessage.spectrumReq:type_name -> SpectrumReq - 258, // 257: WSMessage.spectrumResp:type_name -> SpectrumResp - 259, // 258: WSMessage.tagCreateReq:type_name -> TagCreateReq - 260, // 259: WSMessage.tagCreateResp:type_name -> TagCreateResp - 261, // 260: WSMessage.tagDeleteReq:type_name -> TagDeleteReq - 262, // 261: WSMessage.tagDeleteResp:type_name -> TagDeleteResp - 263, // 262: WSMessage.tagListReq:type_name -> TagListReq - 264, // 263: WSMessage.tagListResp:type_name -> TagListResp - 265, // 264: WSMessage.userAddRoleReq:type_name -> UserAddRoleReq - 266, // 265: WSMessage.userAddRoleResp:type_name -> UserAddRoleResp - 267, // 266: WSMessage.userDeleteRoleReq:type_name -> UserDeleteRoleReq - 268, // 267: WSMessage.userDeleteRoleResp:type_name -> UserDeleteRoleResp - 269, // 268: WSMessage.userDetailsReq:type_name -> UserDetailsReq - 270, // 269: WSMessage.userDetailsResp:type_name -> UserDetailsResp - 271, // 270: WSMessage.userDetailsWriteReq:type_name -> UserDetailsWriteReq - 272, // 271: WSMessage.userDetailsWriteResp:type_name -> UserDetailsWriteResp - 273, // 272: WSMessage.userGroupAddAdminReq:type_name -> UserGroupAddAdminReq - 274, // 273: WSMessage.userGroupAddAdminResp:type_name -> UserGroupAddAdminResp - 275, // 274: WSMessage.userGroupAddMemberReq:type_name -> UserGroupAddMemberReq - 276, // 275: WSMessage.userGroupAddMemberResp:type_name -> UserGroupAddMemberResp - 277, // 276: WSMessage.userGroupAddViewerReq:type_name -> UserGroupAddViewerReq - 278, // 277: WSMessage.userGroupAddViewerResp:type_name -> UserGroupAddViewerResp - 279, // 278: WSMessage.userGroupCreateReq:type_name -> UserGroupCreateReq - 280, // 279: WSMessage.userGroupCreateResp:type_name -> UserGroupCreateResp - 281, // 280: WSMessage.userGroupDeleteAdminReq:type_name -> UserGroupDeleteAdminReq - 282, // 281: WSMessage.userGroupDeleteAdminResp:type_name -> UserGroupDeleteAdminResp - 283, // 282: WSMessage.userGroupDeleteMemberReq:type_name -> UserGroupDeleteMemberReq - 284, // 283: WSMessage.userGroupDeleteMemberResp:type_name -> UserGroupDeleteMemberResp - 285, // 284: WSMessage.userGroupDeleteReq:type_name -> UserGroupDeleteReq - 286, // 285: WSMessage.userGroupDeleteResp:type_name -> UserGroupDeleteResp - 287, // 286: WSMessage.userGroupDeleteViewerReq:type_name -> UserGroupDeleteViewerReq - 288, // 287: WSMessage.userGroupDeleteViewerResp:type_name -> UserGroupDeleteViewerResp - 289, // 288: WSMessage.userGroupEditDetailsReq:type_name -> UserGroupEditDetailsReq - 290, // 289: WSMessage.userGroupEditDetailsResp:type_name -> UserGroupEditDetailsResp - 291, // 290: WSMessage.userGroupIgnoreJoinReq:type_name -> UserGroupIgnoreJoinReq - 292, // 291: WSMessage.userGroupIgnoreJoinResp:type_name -> UserGroupIgnoreJoinResp - 293, // 292: WSMessage.userGroupJoinListReq:type_name -> UserGroupJoinListReq - 294, // 293: WSMessage.userGroupJoinListResp:type_name -> UserGroupJoinListResp - 295, // 294: WSMessage.userGroupJoinReq:type_name -> UserGroupJoinReq - 296, // 295: WSMessage.userGroupJoinResp:type_name -> UserGroupJoinResp - 297, // 296: WSMessage.userGroupListJoinableReq:type_name -> UserGroupListJoinableReq - 298, // 297: WSMessage.userGroupListJoinableResp:type_name -> UserGroupListJoinableResp - 299, // 298: WSMessage.userGroupListReq:type_name -> UserGroupListReq - 300, // 299: WSMessage.userGroupListResp:type_name -> UserGroupListResp - 301, // 300: WSMessage.userGroupReq:type_name -> UserGroupReq - 302, // 301: WSMessage.userGroupResp:type_name -> UserGroupResp - 303, // 302: WSMessage.userImpersonateGetReq:type_name -> UserImpersonateGetReq - 304, // 303: WSMessage.userImpersonateGetResp:type_name -> UserImpersonateGetResp - 305, // 304: WSMessage.userImpersonateReq:type_name -> UserImpersonateReq - 306, // 305: WSMessage.userImpersonateResp:type_name -> UserImpersonateResp - 307, // 306: WSMessage.userListReq:type_name -> UserListReq - 308, // 307: WSMessage.userListResp:type_name -> UserListResp - 309, // 308: WSMessage.userNotificationSettingsReq:type_name -> UserNotificationSettingsReq - 310, // 309: WSMessage.userNotificationSettingsResp:type_name -> UserNotificationSettingsResp - 311, // 310: WSMessage.userNotificationSettingsUpd:type_name -> UserNotificationSettingsUpd - 312, // 311: WSMessage.userNotificationSettingsWriteReq:type_name -> UserNotificationSettingsWriteReq - 313, // 312: WSMessage.userNotificationSettingsWriteResp:type_name -> UserNotificationSettingsWriteResp - 314, // 313: WSMessage.userRoleListReq:type_name -> UserRoleListReq - 315, // 314: WSMessage.userRoleListResp:type_name -> UserRoleListResp - 316, // 315: WSMessage.userRolesListReq:type_name -> UserRolesListReq - 317, // 316: WSMessage.userRolesListResp:type_name -> UserRolesListResp - 318, // 317: WSMessage.userSearchReq:type_name -> UserSearchReq - 319, // 318: WSMessage.userSearchResp:type_name -> UserSearchResp - 320, // 319: WSMessage.widgetDataGetReq:type_name -> WidgetDataGetReq - 321, // 320: WSMessage.widgetDataGetResp:type_name -> WidgetDataGetResp - 322, // 321: WSMessage.widgetDataWriteReq:type_name -> WidgetDataWriteReq - 323, // 322: WSMessage.widgetDataWriteResp:type_name -> WidgetDataWriteResp - 324, // 323: WSMessage.widgetMetadataGetReq:type_name -> WidgetMetadataGetReq - 325, // 324: WSMessage.widgetMetadataGetResp:type_name -> WidgetMetadataGetResp - 326, // 325: WSMessage.widgetMetadataWriteReq:type_name -> WidgetMetadataWriteReq - 327, // 326: WSMessage.widgetMetadataWriteResp:type_name -> WidgetMetadataWriteResp - 328, // 327: WSMessage.zenodoDOIGetReq:type_name -> ZenodoDOIGetReq - 329, // 328: WSMessage.zenodoDOIGetResp:type_name -> ZenodoDOIGetResp - 329, // [329:329] is the sub-list for method output_type - 329, // [329:329] is the sub-list for method input_type - 329, // [329:329] is the sub-list for extension type_name - 329, // [329:329] is the sub-list for extension extendee - 0, // [0:329] is the sub-list for field type_name + 43, // 42: WSMessage.expressionCalculateReq:type_name -> ExpressionCalculateReq + 44, // 43: WSMessage.expressionCalculateResp:type_name -> ExpressionCalculateResp + 45, // 44: WSMessage.expressionDeleteReq:type_name -> ExpressionDeleteReq + 46, // 45: WSMessage.expressionDeleteResp:type_name -> ExpressionDeleteResp + 47, // 46: WSMessage.expressionDisplaySettingsGetReq:type_name -> ExpressionDisplaySettingsGetReq + 48, // 47: WSMessage.expressionDisplaySettingsGetResp:type_name -> ExpressionDisplaySettingsGetResp + 49, // 48: WSMessage.expressionDisplaySettingsWriteReq:type_name -> ExpressionDisplaySettingsWriteReq + 50, // 49: WSMessage.expressionDisplaySettingsWriteResp:type_name -> ExpressionDisplaySettingsWriteResp + 51, // 50: WSMessage.expressionGetReq:type_name -> ExpressionGetReq + 52, // 51: WSMessage.expressionGetResp:type_name -> ExpressionGetResp + 53, // 52: WSMessage.expressionGroupDeleteReq:type_name -> ExpressionGroupDeleteReq + 54, // 53: WSMessage.expressionGroupDeleteResp:type_name -> ExpressionGroupDeleteResp + 55, // 54: WSMessage.expressionGroupGetReq:type_name -> ExpressionGroupGetReq + 56, // 55: WSMessage.expressionGroupGetResp:type_name -> ExpressionGroupGetResp + 57, // 56: WSMessage.expressionGroupListReq:type_name -> ExpressionGroupListReq + 58, // 57: WSMessage.expressionGroupListResp:type_name -> ExpressionGroupListResp + 59, // 58: WSMessage.expressionGroupWriteReq:type_name -> ExpressionGroupWriteReq + 60, // 59: WSMessage.expressionGroupWriteResp:type_name -> ExpressionGroupWriteResp + 61, // 60: WSMessage.expressionListReq:type_name -> ExpressionListReq + 62, // 61: WSMessage.expressionListResp:type_name -> ExpressionListResp + 63, // 62: WSMessage.expressionWriteExecStatReq:type_name -> ExpressionWriteExecStatReq + 64, // 63: WSMessage.expressionWriteExecStatResp:type_name -> ExpressionWriteExecStatResp + 65, // 64: WSMessage.expressionWriteReq:type_name -> ExpressionWriteReq + 66, // 65: WSMessage.expressionWriteResp:type_name -> ExpressionWriteResp + 67, // 66: WSMessage.getOwnershipReq:type_name -> GetOwnershipReq + 68, // 67: WSMessage.getOwnershipResp:type_name -> GetOwnershipResp + 69, // 68: WSMessage.image3DModelPointUploadReq:type_name -> Image3DModelPointUploadReq + 70, // 69: WSMessage.image3DModelPointUploadResp:type_name -> Image3DModelPointUploadResp + 71, // 70: WSMessage.image3DModelPointsReq:type_name -> Image3DModelPointsReq + 72, // 71: WSMessage.image3DModelPointsResp:type_name -> Image3DModelPointsResp + 73, // 72: WSMessage.imageBeamLocationUploadReq:type_name -> ImageBeamLocationUploadReq + 74, // 73: WSMessage.imageBeamLocationUploadResp:type_name -> ImageBeamLocationUploadResp + 75, // 74: WSMessage.imageBeamLocationVersionsReq:type_name -> ImageBeamLocationVersionsReq + 76, // 75: WSMessage.imageBeamLocationVersionsResp:type_name -> ImageBeamLocationVersionsResp + 77, // 76: WSMessage.imageBeamLocationsReq:type_name -> ImageBeamLocationsReq + 78, // 77: WSMessage.imageBeamLocationsResp:type_name -> ImageBeamLocationsResp + 79, // 78: WSMessage.imageDeleteReq:type_name -> ImageDeleteReq + 80, // 79: WSMessage.imageDeleteResp:type_name -> ImageDeleteResp + 81, // 80: WSMessage.imageGetDefaultReq:type_name -> ImageGetDefaultReq + 82, // 81: WSMessage.imageGetDefaultResp:type_name -> ImageGetDefaultResp + 83, // 82: WSMessage.imageGetReq:type_name -> ImageGetReq + 84, // 83: WSMessage.imageGetResp:type_name -> ImageGetResp + 85, // 84: WSMessage.imageListReq:type_name -> ImageListReq + 86, // 85: WSMessage.imageListResp:type_name -> ImageListResp + 87, // 86: WSMessage.imageListUpd:type_name -> ImageListUpd + 88, // 87: WSMessage.imagePyramidGetReq:type_name -> ImagePyramidGetReq + 89, // 88: WSMessage.imagePyramidGetResp:type_name -> ImagePyramidGetResp + 90, // 89: WSMessage.imageScanEntryDisplayElementsGetReq:type_name -> ImageScanEntryDisplayElementsGetReq + 91, // 90: WSMessage.imageScanEntryDisplayElementsGetResp:type_name -> ImageScanEntryDisplayElementsGetResp + 92, // 91: WSMessage.imageSetDefaultReq:type_name -> ImageSetDefaultReq + 93, // 92: WSMessage.imageSetDefaultResp:type_name -> ImageSetDefaultResp + 94, // 93: WSMessage.imageSetMatchTransformReq:type_name -> ImageSetMatchTransformReq + 95, // 94: WSMessage.imageSetMatchTransformResp:type_name -> ImageSetMatchTransformResp + 96, // 95: WSMessage.imageTileDataGetReq:type_name -> ImageTileDataGetReq + 97, // 96: WSMessage.imageTileDataGetResp:type_name -> ImageTileDataGetResp + 98, // 97: WSMessage.imageTileStructureGetReq:type_name -> ImageTileStructureGetReq + 99, // 98: WSMessage.imageTileStructureGetResp:type_name -> ImageTileStructureGetResp + 100, // 99: WSMessage.importMarsViewerImageReq:type_name -> ImportMarsViewerImageReq + 101, // 100: WSMessage.importMarsViewerImageResp:type_name -> ImportMarsViewerImageResp + 102, // 101: WSMessage.importMarsViewerImageUpd:type_name -> ImportMarsViewerImageUpd + 103, // 102: WSMessage.jobListReq:type_name -> JobListReq + 104, // 103: WSMessage.jobListResp:type_name -> JobListResp + 105, // 104: WSMessage.jobListUpd:type_name -> JobListUpd + 106, // 105: WSMessage.logGetLevelReq:type_name -> LogGetLevelReq + 107, // 106: WSMessage.logGetLevelResp:type_name -> LogGetLevelResp + 108, // 107: WSMessage.logReadReq:type_name -> LogReadReq + 109, // 108: WSMessage.logReadResp:type_name -> LogReadResp + 110, // 109: WSMessage.logSetLevelReq:type_name -> LogSetLevelReq + 111, // 110: WSMessage.logSetLevelResp:type_name -> LogSetLevelResp + 112, // 111: WSMessage.memoiseDeleteByRegexReq:type_name -> MemoiseDeleteByRegexReq + 113, // 112: WSMessage.memoiseDeleteByRegexResp:type_name -> MemoiseDeleteByRegexResp + 114, // 113: WSMessage.memoiseDeleteReq:type_name -> MemoiseDeleteReq + 115, // 114: WSMessage.memoiseDeleteResp:type_name -> MemoiseDeleteResp + 116, // 115: WSMessage.multiQuantCompareReq:type_name -> MultiQuantCompareReq + 117, // 116: WSMessage.multiQuantCompareResp:type_name -> MultiQuantCompareResp + 118, // 117: WSMessage.notificationDismissReq:type_name -> NotificationDismissReq + 119, // 118: WSMessage.notificationDismissResp:type_name -> NotificationDismissResp + 120, // 119: WSMessage.notificationReq:type_name -> NotificationReq + 121, // 120: WSMessage.notificationResp:type_name -> NotificationResp + 122, // 121: WSMessage.notificationUpd:type_name -> NotificationUpd + 123, // 122: WSMessage.objectEditAccessReq:type_name -> ObjectEditAccessReq + 124, // 123: WSMessage.objectEditAccessResp:type_name -> ObjectEditAccessResp + 125, // 124: WSMessage.piquantConfigFileReq:type_name -> PiquantConfigFileReq + 126, // 125: WSMessage.piquantConfigFileResp:type_name -> PiquantConfigFileResp + 127, // 126: WSMessage.piquantConfigListReq:type_name -> PiquantConfigListReq + 128, // 127: WSMessage.piquantConfigListResp:type_name -> PiquantConfigListResp + 129, // 128: WSMessage.piquantConfigVersionReq:type_name -> PiquantConfigVersionReq + 130, // 129: WSMessage.piquantConfigVersionResp:type_name -> PiquantConfigVersionResp + 131, // 130: WSMessage.piquantConfigVersionsListReq:type_name -> PiquantConfigVersionsListReq + 132, // 131: WSMessage.piquantConfigVersionsListResp:type_name -> PiquantConfigVersionsListResp + 133, // 132: WSMessage.piquantCurrentVersionReq:type_name -> PiquantCurrentVersionReq + 134, // 133: WSMessage.piquantCurrentVersionResp:type_name -> PiquantCurrentVersionResp + 135, // 134: WSMessage.piquantVersionListReq:type_name -> PiquantVersionListReq + 136, // 135: WSMessage.piquantVersionListResp:type_name -> PiquantVersionListResp + 137, // 136: WSMessage.piquantWriteCurrentVersionReq:type_name -> PiquantWriteCurrentVersionReq + 138, // 137: WSMessage.piquantWriteCurrentVersionResp:type_name -> PiquantWriteCurrentVersionResp + 139, // 138: WSMessage.pseudoIntensityReq:type_name -> PseudoIntensityReq + 140, // 139: WSMessage.pseudoIntensityResp:type_name -> PseudoIntensityResp + 141, // 140: WSMessage.publishExpressionToZenodoReq:type_name -> PublishExpressionToZenodoReq + 142, // 141: WSMessage.publishExpressionToZenodoResp:type_name -> PublishExpressionToZenodoResp + 143, // 142: WSMessage.quantBlessReq:type_name -> QuantBlessReq + 144, // 143: WSMessage.quantBlessResp:type_name -> QuantBlessResp + 145, // 144: WSMessage.quantCombineListGetReq:type_name -> QuantCombineListGetReq + 146, // 145: WSMessage.quantCombineListGetResp:type_name -> QuantCombineListGetResp + 147, // 146: WSMessage.quantCombineListWriteReq:type_name -> QuantCombineListWriteReq + 148, // 147: WSMessage.quantCombineListWriteResp:type_name -> QuantCombineListWriteResp + 149, // 148: WSMessage.quantCombineReq:type_name -> QuantCombineReq + 150, // 149: WSMessage.quantCombineResp:type_name -> QuantCombineResp + 151, // 150: WSMessage.quantCreateReq:type_name -> QuantCreateReq + 152, // 151: WSMessage.quantCreateResp:type_name -> QuantCreateResp + 153, // 152: WSMessage.quantCreateUpd:type_name -> QuantCreateUpd + 154, // 153: WSMessage.quantDeleteReq:type_name -> QuantDeleteReq + 155, // 154: WSMessage.quantDeleteResp:type_name -> QuantDeleteResp + 156, // 155: WSMessage.quantGetReq:type_name -> QuantGetReq + 157, // 156: WSMessage.quantGetResp:type_name -> QuantGetResp + 158, // 157: WSMessage.quantLastOutputGetReq:type_name -> QuantLastOutputGetReq + 159, // 158: WSMessage.quantLastOutputGetResp:type_name -> QuantLastOutputGetResp + 160, // 159: WSMessage.quantListReq:type_name -> QuantListReq + 161, // 160: WSMessage.quantListResp:type_name -> QuantListResp + 162, // 161: WSMessage.quantLogGetReq:type_name -> QuantLogGetReq + 163, // 162: WSMessage.quantLogGetResp:type_name -> QuantLogGetResp + 164, // 163: WSMessage.quantLogListReq:type_name -> QuantLogListReq + 165, // 164: WSMessage.quantLogListResp:type_name -> QuantLogListResp + 166, // 165: WSMessage.quantPublishReq:type_name -> QuantPublishReq + 167, // 166: WSMessage.quantPublishResp:type_name -> QuantPublishResp + 168, // 167: WSMessage.quantRawDataGetReq:type_name -> QuantRawDataGetReq + 169, // 168: WSMessage.quantRawDataGetResp:type_name -> QuantRawDataGetResp + 170, // 169: WSMessage.quantUploadReq:type_name -> QuantUploadReq + 171, // 170: WSMessage.quantUploadResp:type_name -> QuantUploadResp + 172, // 171: WSMessage.referenceDataBulkWriteReq:type_name -> ReferenceDataBulkWriteReq + 173, // 172: WSMessage.referenceDataBulkWriteResp:type_name -> ReferenceDataBulkWriteResp + 174, // 173: WSMessage.referenceDataDeleteReq:type_name -> ReferenceDataDeleteReq + 175, // 174: WSMessage.referenceDataDeleteResp:type_name -> ReferenceDataDeleteResp + 176, // 175: WSMessage.referenceDataGetReq:type_name -> ReferenceDataGetReq + 177, // 176: WSMessage.referenceDataGetResp:type_name -> ReferenceDataGetResp + 178, // 177: WSMessage.referenceDataListReq:type_name -> ReferenceDataListReq + 179, // 178: WSMessage.referenceDataListResp:type_name -> ReferenceDataListResp + 180, // 179: WSMessage.referenceDataWriteReq:type_name -> ReferenceDataWriteReq + 181, // 180: WSMessage.referenceDataWriteResp:type_name -> ReferenceDataWriteResp + 182, // 181: WSMessage.regionOfInterestBulkDuplicateReq:type_name -> RegionOfInterestBulkDuplicateReq + 183, // 182: WSMessage.regionOfInterestBulkDuplicateResp:type_name -> RegionOfInterestBulkDuplicateResp + 184, // 183: WSMessage.regionOfInterestBulkWriteReq:type_name -> RegionOfInterestBulkWriteReq + 185, // 184: WSMessage.regionOfInterestBulkWriteResp:type_name -> RegionOfInterestBulkWriteResp + 186, // 185: WSMessage.regionOfInterestDeleteReq:type_name -> RegionOfInterestDeleteReq + 187, // 186: WSMessage.regionOfInterestDeleteResp:type_name -> RegionOfInterestDeleteResp + 188, // 187: WSMessage.regionOfInterestDisplaySettingsGetReq:type_name -> RegionOfInterestDisplaySettingsGetReq + 189, // 188: WSMessage.regionOfInterestDisplaySettingsGetResp:type_name -> RegionOfInterestDisplaySettingsGetResp + 190, // 189: WSMessage.regionOfInterestDisplaySettingsWriteReq:type_name -> RegionOfInterestDisplaySettingsWriteReq + 191, // 190: WSMessage.regionOfInterestDisplaySettingsWriteResp:type_name -> RegionOfInterestDisplaySettingsWriteResp + 192, // 191: WSMessage.regionOfInterestGetReq:type_name -> RegionOfInterestGetReq + 193, // 192: WSMessage.regionOfInterestGetResp:type_name -> RegionOfInterestGetResp + 194, // 193: WSMessage.regionOfInterestListReq:type_name -> RegionOfInterestListReq + 195, // 194: WSMessage.regionOfInterestListResp:type_name -> RegionOfInterestListResp + 196, // 195: WSMessage.regionOfInterestWriteReq:type_name -> RegionOfInterestWriteReq + 197, // 196: WSMessage.regionOfInterestWriteResp:type_name -> RegionOfInterestWriteResp + 198, // 197: WSMessage.restoreDBReq:type_name -> RestoreDBReq + 199, // 198: WSMessage.restoreDBResp:type_name -> RestoreDBResp + 200, // 199: WSMessage.reviewerMagicLinkCreateReq:type_name -> ReviewerMagicLinkCreateReq + 201, // 200: WSMessage.reviewerMagicLinkCreateResp:type_name -> ReviewerMagicLinkCreateResp + 202, // 201: WSMessage.reviewerMagicLinkLoginReq:type_name -> ReviewerMagicLinkLoginReq + 203, // 202: WSMessage.reviewerMagicLinkLoginResp:type_name -> ReviewerMagicLinkLoginResp + 204, // 203: WSMessage.runTestReq:type_name -> RunTestReq + 205, // 204: WSMessage.runTestResp:type_name -> RunTestResp + 206, // 205: WSMessage.scanAutoShareReq:type_name -> ScanAutoShareReq + 207, // 206: WSMessage.scanAutoShareResp:type_name -> ScanAutoShareResp + 208, // 207: WSMessage.scanAutoShareWriteReq:type_name -> ScanAutoShareWriteReq + 209, // 208: WSMessage.scanAutoShareWriteResp:type_name -> ScanAutoShareWriteResp + 210, // 209: WSMessage.scanBeamLocationsReq:type_name -> ScanBeamLocationsReq + 211, // 210: WSMessage.scanBeamLocationsResp:type_name -> ScanBeamLocationsResp + 212, // 211: WSMessage.scanCreateUserDefinedReq:type_name -> ScanCreateUserDefinedReq + 213, // 212: WSMessage.scanCreateUserDefinedResp:type_name -> ScanCreateUserDefinedResp + 214, // 213: WSMessage.scanDeleteReq:type_name -> ScanDeleteReq + 215, // 214: WSMessage.scanDeleteResp:type_name -> ScanDeleteResp + 216, // 215: WSMessage.scanEntryMetadataReq:type_name -> ScanEntryMetadataReq + 217, // 216: WSMessage.scanEntryMetadataResp:type_name -> ScanEntryMetadataResp + 218, // 217: WSMessage.scanEntryReq:type_name -> ScanEntryReq + 219, // 218: WSMessage.scanEntryResp:type_name -> ScanEntryResp + 220, // 219: WSMessage.scanGetReq:type_name -> ScanGetReq + 221, // 220: WSMessage.scanGetResp:type_name -> ScanGetResp + 222, // 221: WSMessage.scanListJobsReq:type_name -> ScanListJobsReq + 223, // 222: WSMessage.scanListJobsResp:type_name -> ScanListJobsResp + 224, // 223: WSMessage.scanListReq:type_name -> ScanListReq + 225, // 224: WSMessage.scanListResp:type_name -> ScanListResp + 226, // 225: WSMessage.scanListUpd:type_name -> ScanListUpd + 227, // 226: WSMessage.scanMetaLabelsAndTypesReq:type_name -> ScanMetaLabelsAndTypesReq + 228, // 227: WSMessage.scanMetaLabelsAndTypesResp:type_name -> ScanMetaLabelsAndTypesResp + 229, // 228: WSMessage.scanMetaWriteReq:type_name -> ScanMetaWriteReq + 230, // 229: WSMessage.scanMetaWriteResp:type_name -> ScanMetaWriteResp + 231, // 230: WSMessage.scanTriggerJobReq:type_name -> ScanTriggerJobReq + 232, // 231: WSMessage.scanTriggerJobResp:type_name -> ScanTriggerJobResp + 233, // 232: WSMessage.scanTriggerReImportReq:type_name -> ScanTriggerReImportReq + 234, // 233: WSMessage.scanTriggerReImportResp:type_name -> ScanTriggerReImportResp + 235, // 234: WSMessage.scanTriggerReImportUpd:type_name -> ScanTriggerReImportUpd + 236, // 235: WSMessage.scanUploadReq:type_name -> ScanUploadReq + 237, // 236: WSMessage.scanUploadResp:type_name -> ScanUploadResp + 238, // 237: WSMessage.scanUploadUpd:type_name -> ScanUploadUpd + 239, // 238: WSMessage.scanWriteJobReq:type_name -> ScanWriteJobReq + 240, // 239: WSMessage.scanWriteJobResp:type_name -> ScanWriteJobResp + 241, // 240: WSMessage.screenConfigurationDeleteReq:type_name -> ScreenConfigurationDeleteReq + 242, // 241: WSMessage.screenConfigurationDeleteResp:type_name -> ScreenConfigurationDeleteResp + 243, // 242: WSMessage.screenConfigurationGetReq:type_name -> ScreenConfigurationGetReq + 244, // 243: WSMessage.screenConfigurationGetResp:type_name -> ScreenConfigurationGetResp + 245, // 244: WSMessage.screenConfigurationListReq:type_name -> ScreenConfigurationListReq + 246, // 245: WSMessage.screenConfigurationListResp:type_name -> ScreenConfigurationListResp + 247, // 246: WSMessage.screenConfigurationWriteReq:type_name -> ScreenConfigurationWriteReq + 248, // 247: WSMessage.screenConfigurationWriteResp:type_name -> ScreenConfigurationWriteResp + 249, // 248: WSMessage.selectedImagePixelsReq:type_name -> SelectedImagePixelsReq + 250, // 249: WSMessage.selectedImagePixelsResp:type_name -> SelectedImagePixelsResp + 251, // 250: WSMessage.selectedImagePixelsWriteReq:type_name -> SelectedImagePixelsWriteReq + 252, // 251: WSMessage.selectedImagePixelsWriteResp:type_name -> SelectedImagePixelsWriteResp + 253, // 252: WSMessage.selectedScanEntriesReq:type_name -> SelectedScanEntriesReq + 254, // 253: WSMessage.selectedScanEntriesResp:type_name -> SelectedScanEntriesResp + 255, // 254: WSMessage.selectedScanEntriesWriteReq:type_name -> SelectedScanEntriesWriteReq + 256, // 255: WSMessage.selectedScanEntriesWriteResp:type_name -> SelectedScanEntriesWriteResp + 257, // 256: WSMessage.sendUserNotificationReq:type_name -> SendUserNotificationReq + 258, // 257: WSMessage.sendUserNotificationResp:type_name -> SendUserNotificationResp + 259, // 258: WSMessage.spectrumReq:type_name -> SpectrumReq + 260, // 259: WSMessage.spectrumResp:type_name -> SpectrumResp + 261, // 260: WSMessage.tagCreateReq:type_name -> TagCreateReq + 262, // 261: WSMessage.tagCreateResp:type_name -> TagCreateResp + 263, // 262: WSMessage.tagDeleteReq:type_name -> TagDeleteReq + 264, // 263: WSMessage.tagDeleteResp:type_name -> TagDeleteResp + 265, // 264: WSMessage.tagListReq:type_name -> TagListReq + 266, // 265: WSMessage.tagListResp:type_name -> TagListResp + 267, // 266: WSMessage.userAddRoleReq:type_name -> UserAddRoleReq + 268, // 267: WSMessage.userAddRoleResp:type_name -> UserAddRoleResp + 269, // 268: WSMessage.userDeleteRoleReq:type_name -> UserDeleteRoleReq + 270, // 269: WSMessage.userDeleteRoleResp:type_name -> UserDeleteRoleResp + 271, // 270: WSMessage.userDetailsReq:type_name -> UserDetailsReq + 272, // 271: WSMessage.userDetailsResp:type_name -> UserDetailsResp + 273, // 272: WSMessage.userDetailsWriteReq:type_name -> UserDetailsWriteReq + 274, // 273: WSMessage.userDetailsWriteResp:type_name -> UserDetailsWriteResp + 275, // 274: WSMessage.userGroupAddAdminReq:type_name -> UserGroupAddAdminReq + 276, // 275: WSMessage.userGroupAddAdminResp:type_name -> UserGroupAddAdminResp + 277, // 276: WSMessage.userGroupAddMemberReq:type_name -> UserGroupAddMemberReq + 278, // 277: WSMessage.userGroupAddMemberResp:type_name -> UserGroupAddMemberResp + 279, // 278: WSMessage.userGroupAddViewerReq:type_name -> UserGroupAddViewerReq + 280, // 279: WSMessage.userGroupAddViewerResp:type_name -> UserGroupAddViewerResp + 281, // 280: WSMessage.userGroupCreateReq:type_name -> UserGroupCreateReq + 282, // 281: WSMessage.userGroupCreateResp:type_name -> UserGroupCreateResp + 283, // 282: WSMessage.userGroupDeleteAdminReq:type_name -> UserGroupDeleteAdminReq + 284, // 283: WSMessage.userGroupDeleteAdminResp:type_name -> UserGroupDeleteAdminResp + 285, // 284: WSMessage.userGroupDeleteMemberReq:type_name -> UserGroupDeleteMemberReq + 286, // 285: WSMessage.userGroupDeleteMemberResp:type_name -> UserGroupDeleteMemberResp + 287, // 286: WSMessage.userGroupDeleteReq:type_name -> UserGroupDeleteReq + 288, // 287: WSMessage.userGroupDeleteResp:type_name -> UserGroupDeleteResp + 289, // 288: WSMessage.userGroupDeleteViewerReq:type_name -> UserGroupDeleteViewerReq + 290, // 289: WSMessage.userGroupDeleteViewerResp:type_name -> UserGroupDeleteViewerResp + 291, // 290: WSMessage.userGroupEditDetailsReq:type_name -> UserGroupEditDetailsReq + 292, // 291: WSMessage.userGroupEditDetailsResp:type_name -> UserGroupEditDetailsResp + 293, // 292: WSMessage.userGroupIgnoreJoinReq:type_name -> UserGroupIgnoreJoinReq + 294, // 293: WSMessage.userGroupIgnoreJoinResp:type_name -> UserGroupIgnoreJoinResp + 295, // 294: WSMessage.userGroupJoinListReq:type_name -> UserGroupJoinListReq + 296, // 295: WSMessage.userGroupJoinListResp:type_name -> UserGroupJoinListResp + 297, // 296: WSMessage.userGroupJoinReq:type_name -> UserGroupJoinReq + 298, // 297: WSMessage.userGroupJoinResp:type_name -> UserGroupJoinResp + 299, // 298: WSMessage.userGroupListJoinableReq:type_name -> UserGroupListJoinableReq + 300, // 299: WSMessage.userGroupListJoinableResp:type_name -> UserGroupListJoinableResp + 301, // 300: WSMessage.userGroupListReq:type_name -> UserGroupListReq + 302, // 301: WSMessage.userGroupListResp:type_name -> UserGroupListResp + 303, // 302: WSMessage.userGroupReq:type_name -> UserGroupReq + 304, // 303: WSMessage.userGroupResp:type_name -> UserGroupResp + 305, // 304: WSMessage.userImpersonateGetReq:type_name -> UserImpersonateGetReq + 306, // 305: WSMessage.userImpersonateGetResp:type_name -> UserImpersonateGetResp + 307, // 306: WSMessage.userImpersonateReq:type_name -> UserImpersonateReq + 308, // 307: WSMessage.userImpersonateResp:type_name -> UserImpersonateResp + 309, // 308: WSMessage.userListReq:type_name -> UserListReq + 310, // 309: WSMessage.userListResp:type_name -> UserListResp + 311, // 310: WSMessage.userNotificationSettingsReq:type_name -> UserNotificationSettingsReq + 312, // 311: WSMessage.userNotificationSettingsResp:type_name -> UserNotificationSettingsResp + 313, // 312: WSMessage.userNotificationSettingsUpd:type_name -> UserNotificationSettingsUpd + 314, // 313: WSMessage.userNotificationSettingsWriteReq:type_name -> UserNotificationSettingsWriteReq + 315, // 314: WSMessage.userNotificationSettingsWriteResp:type_name -> UserNotificationSettingsWriteResp + 316, // 315: WSMessage.userRoleListReq:type_name -> UserRoleListReq + 317, // 316: WSMessage.userRoleListResp:type_name -> UserRoleListResp + 318, // 317: WSMessage.userRolesListReq:type_name -> UserRolesListReq + 319, // 318: WSMessage.userRolesListResp:type_name -> UserRolesListResp + 320, // 319: WSMessage.userSearchReq:type_name -> UserSearchReq + 321, // 320: WSMessage.userSearchResp:type_name -> UserSearchResp + 322, // 321: WSMessage.widgetDataGetReq:type_name -> WidgetDataGetReq + 323, // 322: WSMessage.widgetDataGetResp:type_name -> WidgetDataGetResp + 324, // 323: WSMessage.widgetDataWriteReq:type_name -> WidgetDataWriteReq + 325, // 324: WSMessage.widgetDataWriteResp:type_name -> WidgetDataWriteResp + 326, // 325: WSMessage.widgetMetadataGetReq:type_name -> WidgetMetadataGetReq + 327, // 326: WSMessage.widgetMetadataGetResp:type_name -> WidgetMetadataGetResp + 328, // 327: WSMessage.widgetMetadataWriteReq:type_name -> WidgetMetadataWriteReq + 329, // 328: WSMessage.widgetMetadataWriteResp:type_name -> WidgetMetadataWriteResp + 330, // 329: WSMessage.zenodoDOIGetReq:type_name -> ZenodoDOIGetReq + 331, // 330: WSMessage.zenodoDOIGetResp:type_name -> ZenodoDOIGetResp + 331, // [331:331] is the sub-list for method output_type + 331, // [331:331] is the sub-list for method input_type + 331, // [331:331] is the sub-list for extension type_name + 331, // [331:331] is the sub-list for extension extendee + 0, // [0:331] is the sub-list for field type_name } func init() { file_websocket_proto_init() } @@ -7184,6 +7228,7 @@ func file_websocket_proto_init() { file_export_msgs_proto_init() file_expression_group_msgs_proto_init() file_expression_msgs_proto_init() + file_expression_calculate_msgs_proto_init() file_image_3d_model_point_msgs_proto_init() file_image_beam_location_msgs_proto_init() file_image_msgs_proto_init() @@ -7282,6 +7327,8 @@ func file_websocket_proto_init() { (*WSMessage_ElementSetWriteResp)(nil), (*WSMessage_ExportFilesReq)(nil), (*WSMessage_ExportFilesResp)(nil), + (*WSMessage_ExpressionCalculateReq)(nil), + (*WSMessage_ExpressionCalculateResp)(nil), (*WSMessage_ExpressionDeleteReq)(nil), (*WSMessage_ExpressionDeleteResp)(nil), (*WSMessage_ExpressionDisplaySettingsGetReq)(nil), diff --git a/internal/api/main.go b/internal/api/main.go index fdc60453..96d40f16 100644 --- a/internal/api/main.go +++ b/internal/api/main.go @@ -19,7 +19,7 @@ import ( "github.com/pixlise/core/v4/api/endpoints" "github.com/pixlise/core/v4/api/filepaths" "github.com/pixlise/core/v4/api/job" - "github.com/pixlise/core/v4/api/job/jobstarter" + jobexecutor "github.com/pixlise/core/v4/api/job/executor" "github.com/pixlise/core/v4/api/memoisation" "github.com/pixlise/core/v4/api/notificationSender" "github.com/pixlise/core/v4/api/permission" @@ -407,7 +407,7 @@ func (h autoImportHandler) handleAutoImportJobStatus(status *protos.JobStatus) { } func runPostImportJobs(scanId string, svcs *services.APIServices) { - _, err := jobstarter.GetJobStarter(svcs.Config.QuantExecutor) + _, err := jobexecutor.GetJobExecutor(svcs.Config.QuantExecutor) if err != nil { svcs.Log.Errorf("Failed to create job starter for running post-import jobs: %v", err) return diff --git a/internal/cmd-line-tools/job-runner/main.go b/internal/cmd-line-tools/job-runner/main.go deleted file mode 100644 index 09e44232..00000000 --- a/internal/cmd-line-tools/job-runner/main.go +++ /dev/null @@ -1,7 +0,0 @@ -package main - -import jobrunner "github.com/pixlise/core/v4/api/job/runner" - -func main() { - jobrunner.RunJob(true) -}