From cd45c93de0133d93d42d384e87899d264593c72c Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Tue, 15 Oct 2024 22:14:38 +0200 Subject: [PATCH] feat(webhook): set actor for Promotion abort request Signed-off-by: Hidde Beydals --- api/v1alpha1/generated.pb.go | 792 ++++++------------ api/v1alpha1/generated.proto | 14 - api/v1alpha1/promotion_helpers.go | 31 + api/v1alpha1/promotion_helpers_test.go | 86 ++ api/v1alpha1/zz_generated.deepcopy.go | 15 - .../controller/promotions/promotions_test.go | 3 +- internal/webhook/promotion/webhook.go | 33 +- internal/webhook/promotion/webhook_test.go | 545 +++++++++++- ui/src/gen/v1alpha1/generated_pb.ts | 59 -- 9 files changed, 943 insertions(+), 635 deletions(-) diff --git a/api/v1alpha1/generated.pb.go b/api/v1alpha1/generated.pb.go index 2daad7de8..29fb24a7f 100644 --- a/api/v1alpha1/generated.pb.go +++ b/api/v1alpha1/generated.pb.go @@ -30,38 +30,10 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -func (m *AbortPromotionRequest) Reset() { *m = AbortPromotionRequest{} } -func (*AbortPromotionRequest) ProtoMessage() {} -func (*AbortPromotionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{0} -} -func (m *AbortPromotionRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AbortPromotionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *AbortPromotionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_AbortPromotionRequest.Merge(m, src) -} -func (m *AbortPromotionRequest) XXX_Size() int { - return m.Size() -} -func (m *AbortPromotionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_AbortPromotionRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_AbortPromotionRequest proto.InternalMessageInfo - func (m *AnalysisRunArgument) Reset() { *m = AnalysisRunArgument{} } func (*AnalysisRunArgument) ProtoMessage() {} func (*AnalysisRunArgument) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{1} + return fileDescriptor_e26b7f7bbc391025, []int{0} } func (m *AnalysisRunArgument) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -89,7 +61,7 @@ var xxx_messageInfo_AnalysisRunArgument proto.InternalMessageInfo func (m *AnalysisRunMetadata) Reset() { *m = AnalysisRunMetadata{} } func (*AnalysisRunMetadata) ProtoMessage() {} func (*AnalysisRunMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{2} + return fileDescriptor_e26b7f7bbc391025, []int{1} } func (m *AnalysisRunMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -117,7 +89,7 @@ var xxx_messageInfo_AnalysisRunMetadata proto.InternalMessageInfo func (m *AnalysisRunReference) Reset() { *m = AnalysisRunReference{} } func (*AnalysisRunReference) ProtoMessage() {} func (*AnalysisRunReference) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{3} + return fileDescriptor_e26b7f7bbc391025, []int{2} } func (m *AnalysisRunReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -145,7 +117,7 @@ var xxx_messageInfo_AnalysisRunReference proto.InternalMessageInfo func (m *AnalysisTemplateReference) Reset() { *m = AnalysisTemplateReference{} } func (*AnalysisTemplateReference) ProtoMessage() {} func (*AnalysisTemplateReference) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{4} + return fileDescriptor_e26b7f7bbc391025, []int{3} } func (m *AnalysisTemplateReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -173,7 +145,7 @@ var xxx_messageInfo_AnalysisTemplateReference proto.InternalMessageInfo func (m *ApprovedStage) Reset() { *m = ApprovedStage{} } func (*ApprovedStage) ProtoMessage() {} func (*ApprovedStage) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{5} + return fileDescriptor_e26b7f7bbc391025, []int{4} } func (m *ApprovedStage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -201,7 +173,7 @@ var xxx_messageInfo_ApprovedStage proto.InternalMessageInfo func (m *ArgoCDAppHealthStatus) Reset() { *m = ArgoCDAppHealthStatus{} } func (*ArgoCDAppHealthStatus) ProtoMessage() {} func (*ArgoCDAppHealthStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{6} + return fileDescriptor_e26b7f7bbc391025, []int{5} } func (m *ArgoCDAppHealthStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -229,7 +201,7 @@ var xxx_messageInfo_ArgoCDAppHealthStatus proto.InternalMessageInfo func (m *ArgoCDAppStatus) Reset() { *m = ArgoCDAppStatus{} } func (*ArgoCDAppStatus) ProtoMessage() {} func (*ArgoCDAppStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{7} + return fileDescriptor_e26b7f7bbc391025, []int{6} } func (m *ArgoCDAppStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -257,7 +229,7 @@ var xxx_messageInfo_ArgoCDAppStatus proto.InternalMessageInfo func (m *ArgoCDAppSyncStatus) Reset() { *m = ArgoCDAppSyncStatus{} } func (*ArgoCDAppSyncStatus) ProtoMessage() {} func (*ArgoCDAppSyncStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{8} + return fileDescriptor_e26b7f7bbc391025, []int{7} } func (m *ArgoCDAppSyncStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -285,7 +257,7 @@ var xxx_messageInfo_ArgoCDAppSyncStatus proto.InternalMessageInfo func (m *Chart) Reset() { *m = Chart{} } func (*Chart) ProtoMessage() {} func (*Chart) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{9} + return fileDescriptor_e26b7f7bbc391025, []int{8} } func (m *Chart) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -313,7 +285,7 @@ var xxx_messageInfo_Chart proto.InternalMessageInfo func (m *ChartDiscoveryResult) Reset() { *m = ChartDiscoveryResult{} } func (*ChartDiscoveryResult) ProtoMessage() {} func (*ChartDiscoveryResult) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{10} + return fileDescriptor_e26b7f7bbc391025, []int{9} } func (m *ChartDiscoveryResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -341,7 +313,7 @@ var xxx_messageInfo_ChartDiscoveryResult proto.InternalMessageInfo func (m *ChartSubscription) Reset() { *m = ChartSubscription{} } func (*ChartSubscription) ProtoMessage() {} func (*ChartSubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{11} + return fileDescriptor_e26b7f7bbc391025, []int{10} } func (m *ChartSubscription) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -369,7 +341,7 @@ var xxx_messageInfo_ChartSubscription proto.InternalMessageInfo func (m *DiscoveredArtifacts) Reset() { *m = DiscoveredArtifacts{} } func (*DiscoveredArtifacts) ProtoMessage() {} func (*DiscoveredArtifacts) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{12} + return fileDescriptor_e26b7f7bbc391025, []int{11} } func (m *DiscoveredArtifacts) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -397,7 +369,7 @@ var xxx_messageInfo_DiscoveredArtifacts proto.InternalMessageInfo func (m *DiscoveredCommit) Reset() { *m = DiscoveredCommit{} } func (*DiscoveredCommit) ProtoMessage() {} func (*DiscoveredCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{13} + return fileDescriptor_e26b7f7bbc391025, []int{12} } func (m *DiscoveredCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -425,7 +397,7 @@ var xxx_messageInfo_DiscoveredCommit proto.InternalMessageInfo func (m *DiscoveredImageReference) Reset() { *m = DiscoveredImageReference{} } func (*DiscoveredImageReference) ProtoMessage() {} func (*DiscoveredImageReference) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{14} + return fileDescriptor_e26b7f7bbc391025, []int{13} } func (m *DiscoveredImageReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -453,7 +425,7 @@ var xxx_messageInfo_DiscoveredImageReference proto.InternalMessageInfo func (m *Freight) Reset() { *m = Freight{} } func (*Freight) ProtoMessage() {} func (*Freight) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{15} + return fileDescriptor_e26b7f7bbc391025, []int{14} } func (m *Freight) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -481,7 +453,7 @@ var xxx_messageInfo_Freight proto.InternalMessageInfo func (m *FreightCollection) Reset() { *m = FreightCollection{} } func (*FreightCollection) ProtoMessage() {} func (*FreightCollection) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{16} + return fileDescriptor_e26b7f7bbc391025, []int{15} } func (m *FreightCollection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -509,7 +481,7 @@ var xxx_messageInfo_FreightCollection proto.InternalMessageInfo func (m *FreightList) Reset() { *m = FreightList{} } func (*FreightList) ProtoMessage() {} func (*FreightList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{17} + return fileDescriptor_e26b7f7bbc391025, []int{16} } func (m *FreightList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -537,7 +509,7 @@ var xxx_messageInfo_FreightList proto.InternalMessageInfo func (m *FreightOrigin) Reset() { *m = FreightOrigin{} } func (*FreightOrigin) ProtoMessage() {} func (*FreightOrigin) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{18} + return fileDescriptor_e26b7f7bbc391025, []int{17} } func (m *FreightOrigin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -565,7 +537,7 @@ var xxx_messageInfo_FreightOrigin proto.InternalMessageInfo func (m *FreightReference) Reset() { *m = FreightReference{} } func (*FreightReference) ProtoMessage() {} func (*FreightReference) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{19} + return fileDescriptor_e26b7f7bbc391025, []int{18} } func (m *FreightReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -593,7 +565,7 @@ var xxx_messageInfo_FreightReference proto.InternalMessageInfo func (m *FreightRequest) Reset() { *m = FreightRequest{} } func (*FreightRequest) ProtoMessage() {} func (*FreightRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{20} + return fileDescriptor_e26b7f7bbc391025, []int{19} } func (m *FreightRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -621,7 +593,7 @@ var xxx_messageInfo_FreightRequest proto.InternalMessageInfo func (m *FreightSources) Reset() { *m = FreightSources{} } func (*FreightSources) ProtoMessage() {} func (*FreightSources) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{21} + return fileDescriptor_e26b7f7bbc391025, []int{20} } func (m *FreightSources) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -649,7 +621,7 @@ var xxx_messageInfo_FreightSources proto.InternalMessageInfo func (m *FreightStatus) Reset() { *m = FreightStatus{} } func (*FreightStatus) ProtoMessage() {} func (*FreightStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{22} + return fileDescriptor_e26b7f7bbc391025, []int{21} } func (m *FreightStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -677,7 +649,7 @@ var xxx_messageInfo_FreightStatus proto.InternalMessageInfo func (m *GitCommit) Reset() { *m = GitCommit{} } func (*GitCommit) ProtoMessage() {} func (*GitCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{23} + return fileDescriptor_e26b7f7bbc391025, []int{22} } func (m *GitCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -705,7 +677,7 @@ var xxx_messageInfo_GitCommit proto.InternalMessageInfo func (m *GitDiscoveryResult) Reset() { *m = GitDiscoveryResult{} } func (*GitDiscoveryResult) ProtoMessage() {} func (*GitDiscoveryResult) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{24} + return fileDescriptor_e26b7f7bbc391025, []int{23} } func (m *GitDiscoveryResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -733,7 +705,7 @@ var xxx_messageInfo_GitDiscoveryResult proto.InternalMessageInfo func (m *GitSubscription) Reset() { *m = GitSubscription{} } func (*GitSubscription) ProtoMessage() {} func (*GitSubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{25} + return fileDescriptor_e26b7f7bbc391025, []int{24} } func (m *GitSubscription) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -761,7 +733,7 @@ var xxx_messageInfo_GitSubscription proto.InternalMessageInfo func (m *Health) Reset() { *m = Health{} } func (*Health) ProtoMessage() {} func (*Health) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{26} + return fileDescriptor_e26b7f7bbc391025, []int{25} } func (m *Health) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -789,7 +761,7 @@ var xxx_messageInfo_Health proto.InternalMessageInfo func (m *HealthCheckStep) Reset() { *m = HealthCheckStep{} } func (*HealthCheckStep) ProtoMessage() {} func (*HealthCheckStep) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{27} + return fileDescriptor_e26b7f7bbc391025, []int{26} } func (m *HealthCheckStep) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -817,7 +789,7 @@ var xxx_messageInfo_HealthCheckStep proto.InternalMessageInfo func (m *Image) Reset() { *m = Image{} } func (*Image) ProtoMessage() {} func (*Image) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{28} + return fileDescriptor_e26b7f7bbc391025, []int{27} } func (m *Image) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -845,7 +817,7 @@ var xxx_messageInfo_Image proto.InternalMessageInfo func (m *ImageDiscoveryResult) Reset() { *m = ImageDiscoveryResult{} } func (*ImageDiscoveryResult) ProtoMessage() {} func (*ImageDiscoveryResult) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{29} + return fileDescriptor_e26b7f7bbc391025, []int{28} } func (m *ImageDiscoveryResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -873,7 +845,7 @@ var xxx_messageInfo_ImageDiscoveryResult proto.InternalMessageInfo func (m *ImageSubscription) Reset() { *m = ImageSubscription{} } func (*ImageSubscription) ProtoMessage() {} func (*ImageSubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{30} + return fileDescriptor_e26b7f7bbc391025, []int{29} } func (m *ImageSubscription) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -901,7 +873,7 @@ var xxx_messageInfo_ImageSubscription proto.InternalMessageInfo func (m *Project) Reset() { *m = Project{} } func (*Project) ProtoMessage() {} func (*Project) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{31} + return fileDescriptor_e26b7f7bbc391025, []int{30} } func (m *Project) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -929,7 +901,7 @@ var xxx_messageInfo_Project proto.InternalMessageInfo func (m *ProjectList) Reset() { *m = ProjectList{} } func (*ProjectList) ProtoMessage() {} func (*ProjectList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{32} + return fileDescriptor_e26b7f7bbc391025, []int{31} } func (m *ProjectList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -957,7 +929,7 @@ var xxx_messageInfo_ProjectList proto.InternalMessageInfo func (m *ProjectSpec) Reset() { *m = ProjectSpec{} } func (*ProjectSpec) ProtoMessage() {} func (*ProjectSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{33} + return fileDescriptor_e26b7f7bbc391025, []int{32} } func (m *ProjectSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -985,7 +957,7 @@ var xxx_messageInfo_ProjectSpec proto.InternalMessageInfo func (m *ProjectStatus) Reset() { *m = ProjectStatus{} } func (*ProjectStatus) ProtoMessage() {} func (*ProjectStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{34} + return fileDescriptor_e26b7f7bbc391025, []int{33} } func (m *ProjectStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1013,7 +985,7 @@ var xxx_messageInfo_ProjectStatus proto.InternalMessageInfo func (m *Promotion) Reset() { *m = Promotion{} } func (*Promotion) ProtoMessage() {} func (*Promotion) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{35} + return fileDescriptor_e26b7f7bbc391025, []int{34} } func (m *Promotion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1041,7 +1013,7 @@ var xxx_messageInfo_Promotion proto.InternalMessageInfo func (m *PromotionList) Reset() { *m = PromotionList{} } func (*PromotionList) ProtoMessage() {} func (*PromotionList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{36} + return fileDescriptor_e26b7f7bbc391025, []int{35} } func (m *PromotionList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1069,7 +1041,7 @@ var xxx_messageInfo_PromotionList proto.InternalMessageInfo func (m *PromotionPolicy) Reset() { *m = PromotionPolicy{} } func (*PromotionPolicy) ProtoMessage() {} func (*PromotionPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{37} + return fileDescriptor_e26b7f7bbc391025, []int{36} } func (m *PromotionPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1097,7 +1069,7 @@ var xxx_messageInfo_PromotionPolicy proto.InternalMessageInfo func (m *PromotionReference) Reset() { *m = PromotionReference{} } func (*PromotionReference) ProtoMessage() {} func (*PromotionReference) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{38} + return fileDescriptor_e26b7f7bbc391025, []int{37} } func (m *PromotionReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1125,7 +1097,7 @@ var xxx_messageInfo_PromotionReference proto.InternalMessageInfo func (m *PromotionSpec) Reset() { *m = PromotionSpec{} } func (*PromotionSpec) ProtoMessage() {} func (*PromotionSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{39} + return fileDescriptor_e26b7f7bbc391025, []int{38} } func (m *PromotionSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1153,7 +1125,7 @@ var xxx_messageInfo_PromotionSpec proto.InternalMessageInfo func (m *PromotionStatus) Reset() { *m = PromotionStatus{} } func (*PromotionStatus) ProtoMessage() {} func (*PromotionStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{40} + return fileDescriptor_e26b7f7bbc391025, []int{39} } func (m *PromotionStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1181,7 +1153,7 @@ var xxx_messageInfo_PromotionStatus proto.InternalMessageInfo func (m *PromotionStep) Reset() { *m = PromotionStep{} } func (*PromotionStep) ProtoMessage() {} func (*PromotionStep) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{41} + return fileDescriptor_e26b7f7bbc391025, []int{40} } func (m *PromotionStep) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1209,7 +1181,7 @@ var xxx_messageInfo_PromotionStep proto.InternalMessageInfo func (m *PromotionTemplate) Reset() { *m = PromotionTemplate{} } func (*PromotionTemplate) ProtoMessage() {} func (*PromotionTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{42} + return fileDescriptor_e26b7f7bbc391025, []int{41} } func (m *PromotionTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1237,7 +1209,7 @@ var xxx_messageInfo_PromotionTemplate proto.InternalMessageInfo func (m *PromotionTemplateSpec) Reset() { *m = PromotionTemplateSpec{} } func (*PromotionTemplateSpec) ProtoMessage() {} func (*PromotionTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{43} + return fileDescriptor_e26b7f7bbc391025, []int{42} } func (m *PromotionTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1265,7 +1237,7 @@ var xxx_messageInfo_PromotionTemplateSpec proto.InternalMessageInfo func (m *RepoSubscription) Reset() { *m = RepoSubscription{} } func (*RepoSubscription) ProtoMessage() {} func (*RepoSubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{44} + return fileDescriptor_e26b7f7bbc391025, []int{43} } func (m *RepoSubscription) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1293,7 +1265,7 @@ var xxx_messageInfo_RepoSubscription proto.InternalMessageInfo func (m *Stage) Reset() { *m = Stage{} } func (*Stage) ProtoMessage() {} func (*Stage) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{45} + return fileDescriptor_e26b7f7bbc391025, []int{44} } func (m *Stage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1321,7 +1293,7 @@ var xxx_messageInfo_Stage proto.InternalMessageInfo func (m *StageList) Reset() { *m = StageList{} } func (*StageList) ProtoMessage() {} func (*StageList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{46} + return fileDescriptor_e26b7f7bbc391025, []int{45} } func (m *StageList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1349,7 +1321,7 @@ var xxx_messageInfo_StageList proto.InternalMessageInfo func (m *StageSpec) Reset() { *m = StageSpec{} } func (*StageSpec) ProtoMessage() {} func (*StageSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{47} + return fileDescriptor_e26b7f7bbc391025, []int{46} } func (m *StageSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1377,7 +1349,7 @@ var xxx_messageInfo_StageSpec proto.InternalMessageInfo func (m *StageStatus) Reset() { *m = StageStatus{} } func (*StageStatus) ProtoMessage() {} func (*StageStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{48} + return fileDescriptor_e26b7f7bbc391025, []int{47} } func (m *StageStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1405,7 +1377,7 @@ var xxx_messageInfo_StageStatus proto.InternalMessageInfo func (m *Verification) Reset() { *m = Verification{} } func (*Verification) ProtoMessage() {} func (*Verification) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{49} + return fileDescriptor_e26b7f7bbc391025, []int{48} } func (m *Verification) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1433,7 +1405,7 @@ var xxx_messageInfo_Verification proto.InternalMessageInfo func (m *VerificationInfo) Reset() { *m = VerificationInfo{} } func (*VerificationInfo) ProtoMessage() {} func (*VerificationInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{50} + return fileDescriptor_e26b7f7bbc391025, []int{49} } func (m *VerificationInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1461,7 +1433,7 @@ var xxx_messageInfo_VerificationInfo proto.InternalMessageInfo func (m *VerifiedStage) Reset() { *m = VerifiedStage{} } func (*VerifiedStage) ProtoMessage() {} func (*VerifiedStage) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{51} + return fileDescriptor_e26b7f7bbc391025, []int{50} } func (m *VerifiedStage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1489,7 +1461,7 @@ var xxx_messageInfo_VerifiedStage proto.InternalMessageInfo func (m *Warehouse) Reset() { *m = Warehouse{} } func (*Warehouse) ProtoMessage() {} func (*Warehouse) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{52} + return fileDescriptor_e26b7f7bbc391025, []int{51} } func (m *Warehouse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1517,7 +1489,7 @@ var xxx_messageInfo_Warehouse proto.InternalMessageInfo func (m *WarehouseList) Reset() { *m = WarehouseList{} } func (*WarehouseList) ProtoMessage() {} func (*WarehouseList) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{53} + return fileDescriptor_e26b7f7bbc391025, []int{52} } func (m *WarehouseList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1545,7 +1517,7 @@ var xxx_messageInfo_WarehouseList proto.InternalMessageInfo func (m *WarehouseSpec) Reset() { *m = WarehouseSpec{} } func (*WarehouseSpec) ProtoMessage() {} func (*WarehouseSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{54} + return fileDescriptor_e26b7f7bbc391025, []int{53} } func (m *WarehouseSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1573,7 +1545,7 @@ var xxx_messageInfo_WarehouseSpec proto.InternalMessageInfo func (m *WarehouseStatus) Reset() { *m = WarehouseStatus{} } func (*WarehouseStatus) ProtoMessage() {} func (*WarehouseStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e26b7f7bbc391025, []int{55} + return fileDescriptor_e26b7f7bbc391025, []int{54} } func (m *WarehouseStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1599,7 +1571,6 @@ func (m *WarehouseStatus) XXX_DiscardUnknown() { var xxx_messageInfo_WarehouseStatus proto.InternalMessageInfo func init() { - proto.RegisterType((*AbortPromotionRequest)(nil), "github.com.akuity.kargo.api.v1alpha1.AbortPromotionRequest") proto.RegisterType((*AnalysisRunArgument)(nil), "github.com.akuity.kargo.api.v1alpha1.AnalysisRunArgument") proto.RegisterType((*AnalysisRunMetadata)(nil), "github.com.akuity.kargo.api.v1alpha1.AnalysisRunMetadata") proto.RegisterMapType((map[string]string)(nil), "github.com.akuity.kargo.api.v1alpha1.AnalysisRunMetadata.AnnotationsEntry") @@ -1667,275 +1638,230 @@ func init() { } var fileDescriptor_e26b7f7bbc391025 = []byte{ - // 3630 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3b, 0x4b, 0x6c, 0x1b, 0xc7, - 0xd9, 0x5e, 0x52, 0xa2, 0xc4, 0x8f, 0x7a, 0x8e, 0xe5, 0x44, 0x51, 0xfe, 0x48, 0xfe, 0x37, 0x41, - 0xe0, 0xfc, 0x49, 0xa8, 0xdf, 0xaf, 0xf8, 0x91, 0xff, 0xf7, 0x0f, 0x91, 0xf2, 0x43, 0xfe, 0x95, - 0x58, 0x1d, 0x3a, 0x76, 0x9a, 0xd8, 0x48, 0x47, 0xe4, 0x88, 0xdc, 0x8a, 0xdc, 0x65, 0x76, 0x86, - 0x4a, 0xd4, 0x16, 0x6d, 0xd2, 0x07, 0x10, 0xa0, 0x68, 0xd1, 0x43, 0xd0, 0xa4, 0x40, 0x0b, 0x14, - 0xed, 0x39, 0x05, 0x7a, 0x2c, 0x7a, 0xc8, 0xa1, 0x97, 0xa0, 0x28, 0x8a, 0xa0, 0xed, 0x21, 0x87, - 0x40, 0x68, 0x14, 0xa0, 0xc7, 0xdc, 0x7a, 0xa8, 0x81, 0x02, 0xc5, 0xce, 0xcc, 0xee, 0xce, 0x2e, - 0x97, 0x16, 0x97, 0x96, 0x0c, 0xa3, 0x37, 0x72, 0xbe, 0xd7, 0x3c, 0xbe, 0xf7, 0xcc, 0xc2, 0xa9, - 0xba, 0xc5, 0x1b, 0x9d, 0xf5, 0x62, 0xd5, 0x69, 0x2d, 0x92, 0xcd, 0x8e, 0xc5, 0xb7, 0x17, 0x37, - 0x89, 0x5b, 0x77, 0x16, 0x49, 0xdb, 0x5a, 0xdc, 0x3a, 0x4e, 0x9a, 0xed, 0x06, 0x39, 0xbe, 0x58, - 0xa7, 0x36, 0x75, 0x09, 0xa7, 0xb5, 0x62, 0xdb, 0x75, 0xb8, 0x83, 0x9e, 0x08, 0xa9, 0x8a, 0x92, - 0xaa, 0x28, 0xa8, 0x8a, 0xa4, 0x6d, 0x15, 0x7d, 0xaa, 0xb9, 0x67, 0x35, 0xde, 0x75, 0xa7, 0xee, - 0x2c, 0x0a, 0xe2, 0xf5, 0xce, 0x86, 0xf8, 0x27, 0xfe, 0x88, 0x5f, 0x92, 0xe9, 0xdc, 0x95, 0xcd, - 0xb3, 0xac, 0x68, 0x09, 0xc9, 0xf4, 0x4d, 0x4e, 0x6d, 0x66, 0x39, 0x36, 0x7b, 0x96, 0xb4, 0x2d, - 0x46, 0xdd, 0x2d, 0xea, 0x2e, 0xb6, 0x37, 0xeb, 0x1e, 0x8c, 0x45, 0x11, 0x16, 0xb7, 0xba, 0xa6, - 0x37, 0x77, 0x2a, 0xe4, 0xd4, 0x22, 0xd5, 0x86, 0x65, 0x53, 0x77, 0x3b, 0x24, 0x6f, 0x51, 0x4e, - 0x92, 0xa8, 0x16, 0x7b, 0x51, 0xb9, 0x1d, 0x9b, 0x5b, 0x2d, 0xda, 0x45, 0xf0, 0xdc, 0x5e, 0x04, - 0xac, 0xda, 0xa0, 0x2d, 0x12, 0xa7, 0x33, 0x3f, 0x30, 0xe0, 0xc8, 0xd2, 0xba, 0xe3, 0xf2, 0x35, - 0xd7, 0x69, 0x39, 0xdc, 0x72, 0x6c, 0x4c, 0x5f, 0xef, 0x50, 0xc6, 0xd1, 0x69, 0xc8, 0x91, 0xaa, - 0x37, 0x30, 0x6b, 0x1c, 0x35, 0x8e, 0xe5, 0x4b, 0x8f, 0x7d, 0xb4, 0xb3, 0x70, 0x68, 0x77, 0x67, - 0x21, 0xb7, 0x24, 0x46, 0xef, 0xec, 0x2c, 0x14, 0x04, 0xa1, 0xfc, 0x8b, 0x15, 0x32, 0x7a, 0x1c, - 0x86, 0x49, 0x95, 0x3b, 0xee, 0x6c, 0x46, 0x50, 0x8d, 0x2b, 0xaa, 0xe1, 0x25, 0x6f, 0x10, 0x4b, - 0x18, 0x3a, 0x0b, 0x63, 0x55, 0xc7, 0xe6, 0xae, 0xd3, 0x5c, 0x6b, 0x12, 0x9b, 0xce, 0x66, 0x8f, - 0x1a, 0xc7, 0x46, 0x4b, 0x33, 0x0a, 0x77, 0xac, 0xac, 0xc1, 0x70, 0x04, 0xd3, 0xbc, 0x05, 0x87, - 0x97, 0x6c, 0xd2, 0xdc, 0x66, 0x16, 0xc3, 0x1d, 0x7b, 0xc9, 0xad, 0x77, 0x5a, 0xd4, 0xe6, 0xe8, - 0x28, 0x0c, 0xd9, 0xa4, 0x45, 0xd5, 0x54, 0xc7, 0x14, 0xa3, 0xa1, 0x17, 0x49, 0x8b, 0x62, 0x01, - 0xf1, 0xe6, 0xb5, 0x45, 0x9a, 0x1d, 0x1a, 0x9f, 0xd7, 0x0d, 0x6f, 0x10, 0x4b, 0x98, 0xf9, 0x9d, - 0x6c, 0x84, 0xfd, 0x0b, 0x94, 0x93, 0x1a, 0xe1, 0x04, 0xb5, 0x20, 0xd7, 0x24, 0xeb, 0xb4, 0xc9, - 0x66, 0x8d, 0xa3, 0xd9, 0x63, 0x85, 0x13, 0x17, 0x8b, 0xfd, 0x28, 0x5d, 0x31, 0x81, 0x55, 0x71, - 0x55, 0xf0, 0xb9, 0x68, 0x73, 0x77, 0xbb, 0x34, 0xe1, 0x6f, 0xa9, 0x1c, 0xc4, 0x4a, 0x08, 0x7a, - 0xdb, 0x80, 0x02, 0xb1, 0x6d, 0x87, 0x13, 0x6f, 0x4b, 0xd9, 0x6c, 0x46, 0x08, 0xbd, 0x3a, 0xb8, - 0xd0, 0xa5, 0x90, 0x99, 0x94, 0x7c, 0x58, 0x49, 0x2e, 0x68, 0x10, 0xac, 0xcb, 0x9c, 0x3b, 0x07, - 0x05, 0x6d, 0xaa, 0x68, 0x0a, 0xb2, 0x9b, 0x74, 0x5b, 0xee, 0x2f, 0xf6, 0x7e, 0xa2, 0x99, 0xc8, - 0x86, 0xaa, 0x1d, 0x3c, 0x9f, 0x39, 0x6b, 0xcc, 0x5d, 0x80, 0xa9, 0xb8, 0xc0, 0x34, 0xf4, 0xe6, - 0x0f, 0x0d, 0x98, 0xd1, 0x56, 0x81, 0xe9, 0x06, 0x75, 0xa9, 0x5d, 0xa5, 0x68, 0x11, 0xf2, 0xde, - 0x59, 0xb2, 0x36, 0xa9, 0xfa, 0x47, 0x3d, 0xad, 0x16, 0x92, 0x7f, 0xd1, 0x07, 0xe0, 0x10, 0x27, - 0x50, 0x8b, 0xcc, 0xdd, 0xd4, 0xa2, 0xdd, 0x20, 0x4c, 0xaa, 0xa0, 0xa6, 0x16, 0x6b, 0xde, 0x20, - 0x96, 0x30, 0xf3, 0x7f, 0xe1, 0x11, 0x7f, 0x3e, 0xd7, 0x69, 0xab, 0xdd, 0x24, 0x9c, 0x86, 0x93, - 0xda, 0x53, 0xf5, 0xcc, 0x49, 0x18, 0x5f, 0x6a, 0xb7, 0x5d, 0x67, 0x8b, 0xd6, 0x2a, 0x9c, 0xd4, - 0xa9, 0xf9, 0x6d, 0xcf, 0xe8, 0xdc, 0xba, 0x53, 0x5e, 0x5e, 0x6a, 0xb7, 0xaf, 0x50, 0xd2, 0xe4, - 0x8d, 0x0a, 0x27, 0xbc, 0xc3, 0xd0, 0x05, 0xc8, 0x31, 0xf1, 0x4b, 0xb1, 0x7b, 0xd2, 0xd7, 0x10, - 0x09, 0xbf, 0xb3, 0xb3, 0x30, 0x93, 0x40, 0x48, 0xb1, 0xa2, 0x42, 0x4f, 0xc1, 0x48, 0x8b, 0x32, - 0x46, 0xea, 0xfe, 0x9a, 0x27, 0x15, 0x83, 0x91, 0x17, 0xe4, 0x30, 0xf6, 0xe1, 0xe6, 0xef, 0x33, - 0x30, 0x19, 0xf0, 0x52, 0xe2, 0x0f, 0x60, 0x83, 0x3b, 0x30, 0xd6, 0xd0, 0x56, 0x28, 0xf6, 0xb9, - 0x70, 0xe2, 0xf9, 0x3e, 0x75, 0x39, 0x69, 0x93, 0x42, 0x3f, 0xa1, 0x8f, 0xe2, 0x88, 0x18, 0xd4, - 0x02, 0x60, 0xdb, 0x76, 0x55, 0x09, 0x1d, 0x12, 0x42, 0xcf, 0xa5, 0x14, 0x5a, 0x09, 0x18, 0x94, - 0x90, 0x12, 0x09, 0xe1, 0x18, 0xd6, 0x04, 0x98, 0xbf, 0x32, 0xe0, 0x70, 0x02, 0x1d, 0xfa, 0x9f, - 0xd8, 0x79, 0x3e, 0xd1, 0x75, 0x9e, 0xa8, 0x8b, 0x2c, 0x3c, 0xcd, 0x67, 0x60, 0xd4, 0xa5, 0x5b, - 0x96, 0x17, 0x5b, 0xd4, 0x0e, 0x4f, 0x29, 0xfa, 0x51, 0xac, 0xc6, 0x71, 0x80, 0x81, 0x9e, 0x86, - 0xbc, 0xff, 0xdb, 0xdb, 0xe6, 0xac, 0xa7, 0xce, 0xde, 0xc1, 0xf9, 0xa8, 0x0c, 0x87, 0x70, 0xf3, - 0x5b, 0x30, 0x5c, 0x6e, 0x10, 0x97, 0x7b, 0x1a, 0xe3, 0xd2, 0xb6, 0xf3, 0x12, 0x5e, 0x55, 0x53, - 0x0c, 0x34, 0x06, 0xcb, 0x61, 0xec, 0xc3, 0xfb, 0x38, 0xec, 0xa7, 0x60, 0x64, 0x8b, 0xba, 0x62, - 0xbe, 0xd9, 0x28, 0xb3, 0x1b, 0x72, 0x18, 0xfb, 0x70, 0xf3, 0xcf, 0x06, 0xcc, 0x88, 0x19, 0x2c, - 0x5b, 0xac, 0xea, 0x6c, 0x51, 0x77, 0x1b, 0x53, 0xd6, 0x69, 0xee, 0xf3, 0x84, 0x96, 0x61, 0x8a, - 0xd1, 0xd6, 0x16, 0x75, 0xcb, 0x8e, 0xcd, 0xb8, 0x4b, 0x2c, 0x9b, 0xab, 0x99, 0xcd, 0x2a, 0xec, - 0xa9, 0x4a, 0x0c, 0x8e, 0xbb, 0x28, 0xd0, 0x31, 0x18, 0x55, 0xd3, 0xf6, 0x54, 0xc9, 0xdb, 0xd8, - 0x31, 0xef, 0x0c, 0xd4, 0x9a, 0x18, 0x0e, 0xa0, 0xe6, 0xdf, 0x0c, 0x98, 0x16, 0xab, 0xaa, 0x74, - 0xd6, 0x59, 0xd5, 0xb5, 0xda, 0x22, 0x26, 0x3e, 0x80, 0x4b, 0xba, 0x00, 0x13, 0x35, 0x7f, 0xe3, - 0x57, 0xad, 0x96, 0xc5, 0x85, 0x8d, 0x0c, 0x97, 0x1e, 0x52, 0x3c, 0x26, 0x96, 0x23, 0x50, 0x1c, - 0xc3, 0x36, 0x7f, 0x9a, 0x85, 0xc3, 0x3e, 0x0a, 0xad, 0x2d, 0xb9, 0xdc, 0xda, 0x20, 0x55, 0xce, - 0x50, 0x0d, 0xc6, 0x6a, 0xe1, 0x30, 0x57, 0x96, 0xf7, 0x5f, 0x45, 0x99, 0x9e, 0x14, 0xf5, 0xf4, - 0xa4, 0xd8, 0xde, 0xac, 0x7b, 0x03, 0xac, 0xe8, 0x65, 0x41, 0xc5, 0xad, 0xe3, 0xc5, 0xeb, 0x56, - 0x8b, 0x86, 0xd6, 0xad, 0xb1, 0xe7, 0x38, 0xc2, 0x15, 0xdd, 0x84, 0x6c, 0xdd, 0xe2, 0x2a, 0x18, - 0x9f, 0xed, 0xcf, 0xac, 0x2f, 0x5b, 0x71, 0x55, 0x2b, 0x15, 0x94, 0xa8, 0xec, 0x65, 0x8b, 0x63, - 0x8f, 0x23, 0x5a, 0x87, 0x9c, 0xd5, 0x22, 0x75, 0xea, 0xc7, 0xdc, 0xf3, 0xfd, 0xf1, 0x5e, 0xf1, - 0x68, 0xe2, 0xdc, 0x83, 0xe8, 0x2e, 0xa0, 0x0c, 0x2b, 0xce, 0x9e, 0x8c, 0xaa, 0xa7, 0x22, 0xd2, - 0x48, 0xfb, 0x96, 0x91, 0x64, 0x2c, 0xa1, 0x0c, 0x01, 0x65, 0x58, 0x71, 0x36, 0x3f, 0xc9, 0xc0, - 0x54, 0xb8, 0x7f, 0x65, 0xa7, 0xd5, 0xb2, 0x38, 0x9a, 0x83, 0x8c, 0x55, 0x53, 0x1a, 0x08, 0x8a, - 0x30, 0xb3, 0xb2, 0x8c, 0x33, 0x56, 0x0d, 0x3d, 0x09, 0xb9, 0x75, 0x97, 0xd8, 0xd5, 0x86, 0xd2, - 0xbc, 0x80, 0x71, 0x49, 0x8c, 0x62, 0x05, 0x45, 0x8f, 0x41, 0x96, 0x93, 0xba, 0x52, 0xb8, 0x60, - 0xff, 0xae, 0x93, 0x3a, 0xf6, 0xc6, 0x3d, 0x4d, 0x67, 0x9d, 0xf5, 0xaf, 0xd2, 0xaa, 0x3c, 0x79, - 0x4d, 0xd3, 0x2b, 0x72, 0x18, 0xfb, 0x70, 0x4f, 0x22, 0xe9, 0xf0, 0x86, 0xe3, 0xce, 0x0e, 0x47, - 0x25, 0x2e, 0x89, 0x51, 0xac, 0xa0, 0x5e, 0x4c, 0xaa, 0x8a, 0xf9, 0x73, 0xea, 0xce, 0xe6, 0xa2, - 0x31, 0xa9, 0xec, 0x03, 0x70, 0x88, 0x83, 0x6e, 0x43, 0xa1, 0xea, 0x52, 0xc2, 0x1d, 0x77, 0x99, - 0x70, 0x3a, 0x3b, 0x92, 0x5a, 0x03, 0x27, 0xbd, 0xc4, 0xa8, 0x1c, 0xb2, 0xc0, 0x3a, 0x3f, 0xf3, - 0x0b, 0x03, 0x66, 0xc3, 0xad, 0x15, 0x67, 0x1b, 0x26, 0x03, 0x6a, 0x7b, 0x8c, 0x1e, 0xdb, 0xf3, - 0x24, 0xe4, 0x6a, 0x56, 0x9d, 0x32, 0x1e, 0xdf, 0xe5, 0x65, 0x31, 0x8a, 0x15, 0x14, 0x9d, 0x00, - 0xa8, 0x5b, 0x5c, 0x39, 0x07, 0xb5, 0xd9, 0x41, 0x08, 0xba, 0x1c, 0x40, 0xb0, 0x86, 0x85, 0x6e, - 0x42, 0x5e, 0x4c, 0x73, 0x40, 0xb3, 0x13, 0xa1, 0xa2, 0xec, 0x33, 0xc0, 0x21, 0x2f, 0xf3, 0xe3, - 0x21, 0x18, 0xb9, 0xe4, 0x52, 0xab, 0xde, 0xe0, 0xe8, 0x2b, 0x30, 0xda, 0x52, 0x49, 0xa5, 0x58, - 0x64, 0xe1, 0xc4, 0x7f, 0xf7, 0x27, 0xe3, 0x9a, 0x38, 0x74, 0x2f, 0x21, 0x0d, 0x17, 0x12, 0x8e, - 0xe1, 0x80, 0xab, 0xa8, 0x1f, 0x9a, 0x16, 0x61, 0xe2, 0xdc, 0xf4, 0xfa, 0xc1, 0x1b, 0xc4, 0x12, - 0x86, 0x5e, 0x85, 0x9c, 0xe3, 0x5a, 0x75, 0xcb, 0x9e, 0xcd, 0x8b, 0x49, 0x9c, 0xec, 0xcf, 0x84, - 0xd4, 0x2a, 0xae, 0x09, 0xd2, 0x70, 0xf3, 0xe5, 0x7f, 0xac, 0x58, 0xa2, 0x57, 0x60, 0x44, 0x2a, - 0x93, 0x6f, 0xa0, 0x8b, 0x7d, 0x3b, 0x18, 0xa9, 0x8f, 0xa1, 0xd2, 0xcb, 0xff, 0x0c, 0xfb, 0x0c, - 0x51, 0x25, 0xf0, 0x2f, 0x43, 0x82, 0xf5, 0xd3, 0x29, 0xfc, 0x4b, 0x4f, 0x87, 0x52, 0x09, 0x1c, - 0xca, 0x70, 0x1a, 0xa6, 0xc2, 0x65, 0xf4, 0xf2, 0x20, 0xde, 0x16, 0xab, 0xcc, 0x25, 0x37, 0xc0, - 0x16, 0xab, 0xb4, 0x69, 0x22, 0x9a, 0xee, 0xf8, 0x89, 0x8d, 0xf9, 0x6e, 0x16, 0xa6, 0x15, 0x66, - 0xd9, 0x69, 0x36, 0xa9, 0x2c, 0x1d, 0xa5, 0x7f, 0xca, 0x26, 0xfa, 0x27, 0x0b, 0x86, 0x2d, 0x4e, - 0x5b, 0x7e, 0x01, 0x56, 0x4a, 0x35, 0x9b, 0x50, 0x46, 0x71, 0xc5, 0x63, 0x22, 0x6b, 0xa0, 0xe0, - 0x94, 0x14, 0x16, 0x96, 0x12, 0xd0, 0xf7, 0x0c, 0x38, 0xbc, 0x45, 0x5d, 0x6b, 0xc3, 0xaa, 0x8a, - 0x0a, 0xe6, 0x8a, 0xc5, 0xb8, 0xe3, 0x6e, 0xab, 0x88, 0xf0, 0x5c, 0x7f, 0x92, 0x6f, 0x68, 0x0c, - 0x56, 0xec, 0x0d, 0xa7, 0xf4, 0xa8, 0x92, 0x76, 0xf8, 0x46, 0x37, 0x6b, 0x9c, 0x24, 0x6f, 0xae, - 0x0d, 0x10, 0xce, 0x36, 0xa1, 0x80, 0x5a, 0xd5, 0x0b, 0xa8, 0xbe, 0x27, 0xe6, 0x2f, 0xd6, 0x77, - 0x59, 0x7a, 0xe1, 0xf5, 0xa1, 0x01, 0x05, 0x05, 0x5f, 0xb5, 0x18, 0x47, 0xb7, 0xba, 0xac, 0xbd, - 0xd8, 0x9f, 0xb5, 0x7b, 0xd4, 0xc2, 0xd6, 0x83, 0x7c, 0xd5, 0x1f, 0xd1, 0x2c, 0x1d, 0xfb, 0x47, - 0x2a, 0x37, 0xf6, 0xd9, 0x54, 0xf3, 0x0f, 0x1d, 0x83, 0xd8, 0x23, 0x75, 0x76, 0xa6, 0x0b, 0xe3, - 0x11, 0x23, 0x47, 0xa7, 0x61, 0x68, 0xd3, 0xb2, 0xfd, 0xa8, 0xf7, 0x9f, 0x7e, 0x3e, 0xf5, 0xff, - 0x96, 0x5d, 0xbb, 0xb3, 0xb3, 0x30, 0x1d, 0x41, 0xf6, 0x06, 0xb1, 0x40, 0xdf, 0x3b, 0x0d, 0x3b, - 0x3f, 0xfa, 0xfe, 0xcf, 0x17, 0x0e, 0xbd, 0xf5, 0xe9, 0xd1, 0x43, 0xe6, 0x7b, 0x59, 0x98, 0x8a, - 0xef, 0x6a, 0x1f, 0x0d, 0x89, 0xd0, 0x87, 0x8d, 0x1e, 0xa8, 0x0f, 0xcb, 0x1c, 0x9c, 0x0f, 0xcb, - 0x1e, 0x84, 0x0f, 0x1b, 0xda, 0x37, 0x1f, 0x66, 0xfe, 0xd1, 0x80, 0x89, 0xe0, 0x64, 0x64, 0x57, - 0x2b, 0xdc, 0x75, 0x63, 0xff, 0x77, 0xfd, 0x35, 0x18, 0x61, 0x4e, 0xc7, 0xad, 0x8a, 0xf4, 0xd1, - 0xe3, 0x7e, 0x2a, 0x9d, 0xd3, 0x94, 0xb4, 0x5a, 0xce, 0x24, 0x07, 0xb0, 0xcf, 0xd5, 0xbc, 0x15, - 0xac, 0x47, 0x81, 0x64, 0x46, 0xe1, 0x7a, 0xf9, 0x96, 0x21, 0x7a, 0x68, 0x5a, 0x46, 0xe1, 0x8d, - 0x62, 0x05, 0x45, 0xa6, 0x70, 0xe7, 0x7e, 0x62, 0x9b, 0x2f, 0x81, 0xf2, 0xca, 0xe2, 0x0c, 0x24, - 0xc4, 0xfc, 0x22, 0x1b, 0x58, 0x8f, 0x2a, 0x5f, 0xdf, 0x00, 0x90, 0x9e, 0x89, 0xd6, 0x56, 0x6c, - 0xe5, 0x7a, 0xcb, 0x03, 0x04, 0x02, 0xe5, 0x0e, 0x3d, 0x2e, 0xd2, 0xf7, 0x06, 0x39, 0x40, 0x08, - 0xc0, 0x9a, 0x28, 0xf4, 0x75, 0x28, 0x10, 0xd5, 0x32, 0xb9, 0x24, 0x7a, 0x89, 0x9e, 0xe4, 0xe5, - 0x41, 0x24, 0x2f, 0x85, 0x6c, 0xe2, 0xad, 0xaf, 0x10, 0x82, 0x75, 0x69, 0x73, 0x2e, 0x4c, 0xc6, - 0xe6, 0x9b, 0xe0, 0x7d, 0x57, 0xa2, 0xde, 0xf7, 0x64, 0x9a, 0xb0, 0xa0, 0xfa, 0x40, 0x7a, 0xcf, - 0x8c, 0xc1, 0x54, 0x7c, 0xa6, 0xfb, 0x26, 0x34, 0xd2, 0x7c, 0xd2, 0xfd, 0xfd, 0xcf, 0x32, 0x90, - 0x0f, 0x2c, 0x3e, 0x4d, 0x95, 0x2a, 0x23, 0x75, 0x66, 0x8f, 0x4a, 0x22, 0xdb, 0x4f, 0x25, 0x31, - 0xd4, 0xbb, 0x92, 0xf0, 0x3b, 0x59, 0xb9, 0xbb, 0x77, 0xb2, 0xb4, 0x4a, 0x62, 0xa4, 0xff, 0x4a, - 0x62, 0x74, 0xef, 0x4a, 0xc2, 0xfc, 0x85, 0x01, 0xa8, 0xbb, 0x6c, 0x4c, 0xb3, 0x51, 0x24, 0xee, - 0x87, 0xfb, 0x8c, 0xd2, 0xf1, 0xda, 0xad, 0xb7, 0x3b, 0x36, 0x3f, 0x1c, 0x86, 0xc9, 0xcb, 0xd6, - 0xc0, 0x0d, 0x07, 0x0e, 0x0f, 0x4b, 0x4e, 0x15, 0xaa, 0x72, 0xa4, 0x0a, 0x77, 0x09, 0xa7, 0xf5, - 0x6d, 0x75, 0xbe, 0xe7, 0x15, 0xe9, 0xc3, 0xe5, 0x64, 0xb4, 0x3b, 0xbd, 0x41, 0xb8, 0x17, 0xeb, - 0xbe, 0x95, 0xe4, 0x79, 0x18, 0x67, 0xdc, 0xb5, 0xaa, 0x5c, 0xb6, 0x34, 0xd8, 0x6c, 0x41, 0x78, - 0xb9, 0x23, 0x0a, 0x7d, 0xbc, 0xa2, 0x03, 0x71, 0x14, 0x37, 0xb1, 0x53, 0x32, 0x94, 0xba, 0x53, - 0xb2, 0x08, 0x79, 0xd2, 0x6c, 0x3a, 0x6f, 0x5c, 0x27, 0x75, 0xa6, 0x4a, 0xd5, 0x40, 0x6b, 0x96, - 0x7c, 0x00, 0x0e, 0x71, 0x50, 0x11, 0xc0, 0xaa, 0xdb, 0x8e, 0x4b, 0x05, 0x45, 0x4e, 0xb8, 0xdb, - 0x09, 0xcf, 0xd7, 0xad, 0x04, 0xa3, 0x58, 0xc3, 0x40, 0x15, 0x38, 0x62, 0xd9, 0x8c, 0x56, 0x3b, - 0x2e, 0xad, 0x6c, 0x5a, 0xed, 0xeb, 0xab, 0x15, 0xe1, 0x25, 0xb6, 0x85, 0x36, 0x8f, 0x06, 0xf7, - 0x2e, 0x47, 0x56, 0x92, 0x90, 0x70, 0x32, 0x2d, 0x3a, 0x05, 0x63, 0x96, 0x5d, 0x6d, 0x76, 0x6a, - 0x74, 0x8d, 0xf0, 0x06, 0x9b, 0x1d, 0x15, 0xd3, 0x98, 0xda, 0xdd, 0x59, 0x18, 0x5b, 0xd1, 0xc6, - 0x71, 0x04, 0xcb, 0xa3, 0xa2, 0x6f, 0x6a, 0x54, 0xf9, 0x90, 0xea, 0xe2, 0x9b, 0x3a, 0x95, 0x8e, - 0x95, 0xd0, 0x4b, 0x82, 0x54, 0xbd, 0xa4, 0x1f, 0x67, 0x21, 0x27, 0x5b, 0xb9, 0xe8, 0x74, 0xac, - 0x5f, 0xfa, 0x58, 0x57, 0xbf, 0xb4, 0x90, 0xd4, 0xf6, 0x36, 0x21, 0x67, 0x31, 0xd6, 0x89, 0x46, - 0xb7, 0x15, 0x31, 0x82, 0x15, 0x04, 0x59, 0x00, 0xc4, 0x6f, 0xb5, 0xfa, 0xa9, 0xcb, 0xe9, 0xb4, - 0x1d, 0xe1, 0x58, 0x37, 0x38, 0x00, 0x30, 0xac, 0x31, 0x17, 0x1d, 0x1e, 0xc7, 0xde, 0xb0, 0xea, - 0xaa, 0x0e, 0xbf, 0xa0, 0x65, 0xcd, 0xe1, 0x6d, 0xe1, 0x6b, 0xc1, 0x75, 0x62, 0x98, 0x40, 0x47, - 0x10, 0xbc, 0x4c, 0xfa, 0x6a, 0xe5, 0xda, 0x8b, 0x72, 0x39, 0x65, 0xc1, 0x11, 0x2b, 0xce, 0x9e, - 0x0c, 0xa7, 0xc3, 0xdb, 0x1d, 0x2e, 0x74, 0x72, 0x9f, 0x64, 0x5c, 0x13, 0x1c, 0xb1, 0xe2, 0x6c, - 0xbe, 0x67, 0xc0, 0xa4, 0xdc, 0xee, 0x72, 0x83, 0x56, 0x37, 0x2b, 0x9c, 0xb6, 0xbd, 0xc4, 0xb6, - 0xc3, 0x28, 0x8b, 0x27, 0xb6, 0x2f, 0x31, 0xca, 0xb0, 0x80, 0x68, 0xab, 0xcf, 0x1c, 0xd4, 0xea, - 0xcd, 0x0f, 0x0c, 0x18, 0x16, 0x19, 0x64, 0x1a, 0x57, 0x17, 0xed, 0xaa, 0x64, 0xfa, 0xea, 0xaa, - 0xec, 0xd1, 0xef, 0x0a, 0x1b, 0x3a, 0x43, 0x77, 0x6b, 0xe8, 0x98, 0x9f, 0x1b, 0x30, 0x93, 0xd4, - 0x24, 0x4c, 0x33, 0xfd, 0x67, 0x60, 0xb4, 0xdd, 0x24, 0x7c, 0xc3, 0x71, 0x5b, 0xf1, 0xdb, 0x80, - 0x35, 0x35, 0x8e, 0x03, 0x0c, 0xe4, 0x02, 0xb8, 0x7e, 0x35, 0xe2, 0xab, 0xfb, 0x85, 0xb4, 0xc1, - 0x27, 0xda, 0xdd, 0x0a, 0x37, 0x2b, 0x18, 0x62, 0x58, 0x93, 0x62, 0x7e, 0x7f, 0x18, 0xa6, 0x05, - 0xc9, 0xa0, 0xc1, 0x68, 0x90, 0x13, 0x6a, 0xc3, 0x43, 0xa2, 0x86, 0xe8, 0x8e, 0x5f, 0xf2, 0xd0, - 0xce, 0x2a, 0xfa, 0x87, 0x56, 0x12, 0xb1, 0xee, 0xf4, 0x84, 0xe0, 0x1e, 0x7c, 0xbb, 0x83, 0x12, - 0xfc, 0xfb, 0x05, 0x25, 0x5d, 0xd9, 0x46, 0xf6, 0x54, 0xb6, 0x9e, 0x21, 0x6c, 0xf4, 0x1e, 0x42, - 0x58, 0x77, 0x58, 0xc9, 0xa7, 0x0a, 0x2b, 0x3f, 0xc9, 0xc0, 0xc8, 0x9a, 0xeb, 0x88, 0x66, 0xf3, - 0xc1, 0xf7, 0x2d, 0xaf, 0xc1, 0x10, 0x6b, 0xd3, 0xaa, 0xf2, 0x79, 0xc7, 0xfb, 0xb3, 0x34, 0x35, - 0xbd, 0x4a, 0x9b, 0x56, 0x4b, 0xa3, 0x9e, 0x1b, 0xf5, 0x7e, 0x61, 0xc1, 0x48, 0x6b, 0xc0, 0x65, - 0xd3, 0x24, 0xfb, 0x3e, 0xcb, 0xbb, 0x37, 0xe0, 0x3e, 0x34, 0xa0, 0xa0, 0x30, 0x1f, 0xd8, 0x4e, - 0x8f, 0x9a, 0x5f, 0x8f, 0x4e, 0xcf, 0x0f, 0xc2, 0x15, 0x78, 0x9b, 0x86, 0xbe, 0x09, 0xd3, 0x6d, - 0xff, 0x09, 0xcb, 0x9a, 0xd3, 0xb4, 0xaa, 0x16, 0xf5, 0x9b, 0x85, 0xa7, 0xfb, 0x96, 0xa7, 0x91, - 0x6f, 0x97, 0x1e, 0x51, 0x72, 0xa7, 0xd7, 0xe2, 0x7c, 0x71, 0xb7, 0x28, 0xf3, 0x2f, 0x06, 0x8c, - 0x47, 0xf6, 0x1e, 0x55, 0x01, 0xaa, 0x8e, 0x5d, 0xb3, 0x78, 0x70, 0x21, 0x5b, 0x38, 0xb1, 0xd8, - 0xdf, 0xae, 0x96, 0x7d, 0xba, 0x50, 0xe9, 0x82, 0x21, 0x86, 0x35, 0xb6, 0xe8, 0xa4, 0xff, 0x7e, - 0x21, 0x9a, 0x2f, 0xc9, 0xf7, 0x0b, 0x77, 0x76, 0x16, 0xc6, 0xd4, 0x9c, 0xf4, 0xf7, 0x0c, 0x69, - 0x5e, 0x09, 0xfc, 0x32, 0x03, 0xf9, 0x60, 0xfd, 0xf7, 0xc1, 0x8c, 0x5e, 0x8a, 0x98, 0xd1, 0xc9, - 0x94, 0x27, 0x27, 0x0c, 0x29, 0xc8, 0x49, 0x34, 0x63, 0xba, 0x1d, 0x33, 0xa6, 0xb4, 0x2a, 0xb1, - 0x87, 0x39, 0xfd, 0x4e, 0x1e, 0xbe, 0xc4, 0xbd, 0x0f, 0x06, 0x75, 0x3d, 0x6a, 0x50, 0x8b, 0x29, - 0x57, 0xd3, 0xc3, 0xa4, 0xde, 0x31, 0x60, 0x32, 0x66, 0x04, 0xe8, 0x71, 0x18, 0x16, 0xdd, 0x21, - 0xa5, 0x5f, 0x01, 0xa1, 0xea, 0x25, 0x08, 0x18, 0x5a, 0x83, 0x19, 0xd2, 0xe1, 0x4e, 0x40, 0x7b, - 0xd1, 0x26, 0xeb, 0x4d, 0x2a, 0x1b, 0x04, 0xa3, 0xa5, 0xff, 0x50, 0x34, 0x33, 0x4b, 0x09, 0x38, - 0x38, 0x91, 0xd2, 0xfc, 0x43, 0x06, 0x90, 0xf6, 0x22, 0xad, 0xff, 0xae, 0xea, 0x6d, 0x18, 0xd9, - 0x90, 0xfd, 0x9f, 0x7b, 0x6b, 0x8b, 0x97, 0x0a, 0xfa, 0xcd, 0x80, 0xcf, 0x13, 0x7d, 0x79, 0x7f, - 0xf4, 0x08, 0xba, 0x75, 0x08, 0xbd, 0x02, 0xb0, 0x61, 0xd9, 0x16, 0x6b, 0x0c, 0x78, 0x81, 0x27, - 0xa2, 0xf9, 0xa5, 0x80, 0x03, 0xd6, 0xb8, 0x99, 0xbf, 0xd1, 0xf5, 0x53, 0xb8, 0xcb, 0xbe, 0xce, - 0xf5, 0xa9, 0xe8, 0x66, 0xe6, 0xbb, 0xaf, 0x4c, 0x82, 0x8d, 0x79, 0xd9, 0xe3, 0x47, 0x83, 0xc2, - 0x2a, 0xb5, 0xe1, 0x72, 0xda, 0xd6, 0x27, 0x41, 0xdb, 0x0c, 0x4b, 0x86, 0xe6, 0xdb, 0x39, 0x4d, - 0x2b, 0x95, 0x6b, 0xbd, 0x0a, 0xa8, 0x49, 0x18, 0xbf, 0x42, 0xec, 0x9a, 0xa7, 0x43, 0x74, 0xc3, - 0xa5, 0xac, 0xa1, 0xd2, 0xa8, 0x39, 0xc5, 0x05, 0xad, 0x76, 0x61, 0xe0, 0x04, 0x2a, 0x74, 0x3a, - 0xea, 0x41, 0x17, 0xe2, 0x1e, 0x74, 0x22, 0x34, 0x89, 0xc1, 0x7c, 0xa8, 0xae, 0x93, 0xc3, 0x07, - 0xa0, 0x93, 0xdf, 0x80, 0xe9, 0x8d, 0xf8, 0x3d, 0x97, 0xba, 0xf5, 0x3e, 0x33, 0xe0, 0x35, 0x59, - 0xe9, 0xc8, 0x6e, 0x78, 0x39, 0x12, 0x0e, 0xe3, 0x6e, 0x41, 0xc8, 0xf1, 0xdf, 0x77, 0x89, 0x12, - 0x51, 0x36, 0x1a, 0xfa, 0xb6, 0x8b, 0x58, 0x71, 0x19, 0x7f, 0xd9, 0x25, 0x59, 0xe2, 0x88, 0x80, - 0x98, 0x9d, 0xe4, 0xf6, 0xd3, 0x4e, 0xd0, 0x69, 0x28, 0x54, 0x3b, 0xae, 0x4b, 0x6d, 0xee, 0x4d, - 0x47, 0xe4, 0x9b, 0xd9, 0xb0, 0x61, 0x5c, 0x0e, 0x41, 0x58, 0xc7, 0x43, 0xaf, 0x09, 0x63, 0xe2, - 0x54, 0x14, 0x02, 0xf7, 0x5e, 0xf0, 0xe6, 0x95, 0x21, 0x72, 0x69, 0x88, 0x9c, 0x9a, 0xbf, 0x8e, - 0xd8, 0x6f, 0x7f, 0x65, 0xf8, 0x1c, 0x64, 0x08, 0x8b, 0xf7, 0x68, 0x97, 0x18, 0xce, 0x10, 0xbd, - 0x44, 0xcf, 0x1e, 0x58, 0x89, 0xee, 0x42, 0x98, 0x38, 0xf9, 0xaf, 0x26, 0xd1, 0x6d, 0x15, 0xde, - 0x8d, 0x34, 0xaf, 0x00, 0xbb, 0xd8, 0xf4, 0x0a, 0xf3, 0xe6, 0xeb, 0x70, 0x24, 0x11, 0x39, 0x74, - 0x4f, 0xc6, 0x7e, 0xbb, 0xa7, 0xf7, 0x33, 0x30, 0xe5, 0x95, 0xa2, 0x91, 0x92, 0x77, 0xcd, 0x7f, - 0x9f, 0x94, 0x22, 0x46, 0xc4, 0x7a, 0xb8, 0xa5, 0x91, 0xc8, 0xc3, 0xa4, 0x97, 0x61, 0x58, 0x54, - 0xa3, 0x2a, 0xaa, 0x9d, 0x49, 0x71, 0xe7, 0x16, 0xe1, 0x2a, 0x74, 0x4b, 0x96, 0xf5, 0x92, 0xa1, - 0xc7, 0x59, 0x5c, 0x97, 0x29, 0x55, 0x38, 0x93, 0xe2, 0xe2, 0xad, 0x9b, 0xb3, 0x18, 0xc6, 0x92, - 0xa1, 0xf9, 0x5e, 0x06, 0x64, 0x3c, 0xb9, 0x0f, 0x79, 0xe3, 0x97, 0x22, 0x79, 0x63, 0x9f, 0x09, - 0x91, 0x98, 0x5c, 0xcf, 0x9c, 0x31, 0x1e, 0xeb, 0x8f, 0xa7, 0x61, 0x7a, 0xf7, 0x7c, 0xf1, 0xb7, - 0x06, 0xe4, 0x05, 0xde, 0x7d, 0xc8, 0x15, 0xd7, 0xa2, 0xb9, 0xe2, 0xd3, 0x29, 0x56, 0xd1, 0x23, - 0x4f, 0x7c, 0x37, 0xab, 0x66, 0x1f, 0x64, 0x12, 0x0d, 0xe2, 0xd6, 0x54, 0xf8, 0x0d, 0xad, 0xc4, - 0x1b, 0xc4, 0x12, 0x86, 0xbe, 0x06, 0x53, 0xae, 0xbc, 0x81, 0xa5, 0xb5, 0x4b, 0x41, 0x2c, 0xcc, - 0xa6, 0xbe, 0x22, 0x55, 0xd7, 0xb8, 0x61, 0xaf, 0x04, 0xc7, 0xb8, 0xe2, 0x2e, 0x39, 0x5e, 0x7c, - 0x6c, 0xc7, 0x9d, 0x82, 0x8a, 0x1b, 0x67, 0x06, 0x74, 0x40, 0x32, 0x3e, 0x76, 0x0d, 0xe3, 0x6e, - 0x41, 0xa8, 0x01, 0x63, 0xfa, 0xe3, 0x0e, 0xa5, 0x4b, 0x27, 0xd2, 0xbf, 0x22, 0x91, 0x6d, 0x78, - 0x7d, 0x04, 0x47, 0x38, 0x9b, 0xff, 0x18, 0x86, 0x82, 0xa6, 0x7c, 0x3d, 0x92, 0xa4, 0xc2, 0x40, - 0x49, 0xd2, 0xf1, 0x68, 0x92, 0xf4, 0x68, 0x3c, 0x49, 0x02, 0x21, 0x38, 0x92, 0x20, 0x31, 0x98, - 0x50, 0xd9, 0x82, 0xff, 0x80, 0x46, 0xde, 0xec, 0x0f, 0x9c, 0x93, 0xa0, 0xdd, 0x9d, 0x05, 0xff, - 0xfa, 0xdb, 0x7f, 0x38, 0x13, 0x13, 0x81, 0x2e, 0x04, 0x42, 0x2b, 0x9d, 0x56, 0x8b, 0xb8, 0xdb, - 0xb3, 0x63, 0x62, 0xc2, 0x41, 0xcf, 0xe8, 0x52, 0x04, 0x8a, 0x63, 0xd8, 0x68, 0x0d, 0x72, 0x32, - 0xd9, 0x50, 0x8f, 0x32, 0x9e, 0x49, 0x93, 0xc7, 0xc8, 0x30, 0x28, 0x7f, 0x63, 0xc5, 0x47, 0xcf, - 0x13, 0xf3, 0x7b, 0xe4, 0x89, 0x57, 0x01, 0x39, 0xeb, 0x22, 0xe0, 0xd6, 0x2e, 0xcb, 0xcf, 0x74, - 0x3c, 0x85, 0xc9, 0x89, 0x24, 0x24, 0x38, 0xb0, 0x6b, 0x5d, 0x18, 0x38, 0x81, 0xca, 0x33, 0x38, - 0x95, 0xa1, 0x04, 0x5a, 0xaa, 0x72, 0xc2, 0xb3, 0x29, 0x75, 0x3e, 0x4c, 0x3f, 0x67, 0x3c, 0x83, - 0x2b, 0xc7, 0xb8, 0xe2, 0x2e, 0x39, 0xe8, 0x75, 0x18, 0xf7, 0x54, 0x28, 0x14, 0x0c, 0xf7, 0x28, - 0x78, 0x7a, 0x77, 0x67, 0x61, 0x7c, 0x55, 0x67, 0x89, 0xa3, 0x12, 0xcc, 0x7f, 0x66, 0x20, 0x62, - 0x1a, 0xe8, 0x1d, 0x03, 0xa6, 0x49, 0xec, 0x9b, 0x0d, 0x3f, 0xfa, 0xff, 0x5f, 0xba, 0x0f, 0x69, - 0xba, 0x3e, 0xf9, 0x08, 0x3b, 0x43, 0x71, 0x14, 0x86, 0xbb, 0x85, 0xa2, 0xef, 0x1a, 0x70, 0x98, - 0x74, 0x7f, 0x94, 0xa3, 0x42, 0xd5, 0xb9, 0x81, 0xbf, 0xea, 0x29, 0x3d, 0xbc, 0xbb, 0xb3, 0x90, - 0xf4, 0xb9, 0x12, 0x4e, 0x12, 0x87, 0x5e, 0x85, 0x21, 0xe2, 0xd6, 0xfd, 0x02, 0x2d, 0xbd, 0x58, - 0xff, 0x5b, 0xab, 0x30, 0x56, 0x2e, 0xb9, 0x75, 0x86, 0x05, 0x53, 0xf3, 0xd3, 0x2c, 0x4c, 0xc5, - 0x9f, 0xbc, 0xa9, 0x57, 0x02, 0x43, 0x89, 0xaf, 0x04, 0x82, 0xcf, 0xc4, 0x46, 0xee, 0xf2, 0x99, - 0xd8, 0x4d, 0xc8, 0x33, 0x4e, 0x5c, 0xee, 0xe5, 0xed, 0xaa, 0x74, 0x4a, 0xfd, 0xa4, 0xb5, 0xe2, - 0x33, 0xc0, 0x21, 0x2f, 0x74, 0x36, 0xea, 0xce, 0xcc, 0xb8, 0x3b, 0x9b, 0xd6, 0xd7, 0x32, 0x68, - 0xd9, 0xd7, 0x82, 0x82, 0x76, 0x0e, 0xca, 0xf1, 0x9f, 0x4f, 0xbd, 0xef, 0xa1, 0xda, 0x4d, 0xca, - 0x0f, 0xb6, 0x42, 0x88, 0xce, 0x3f, 0xac, 0x8b, 0xc4, 0x6e, 0xdd, 0x53, 0x5d, 0x24, 0xb6, 0x4b, - 0xe3, 0x66, 0x4e, 0xc2, 0x78, 0xe4, 0xe5, 0x8a, 0x68, 0x0b, 0xde, 0x24, 0x2e, 0x6d, 0x38, 0x1d, - 0x46, 0x1f, 0xd4, 0xb6, 0x60, 0x30, 0xc1, 0xfd, 0x6e, 0x0b, 0x86, 0x8c, 0xf7, 0x6e, 0x0b, 0x06, - 0xb8, 0x0f, 0x6c, 0x5b, 0x30, 0x98, 0x61, 0x8f, 0x74, 0xef, 0xef, 0x19, 0x6d, 0x15, 0xd1, 0x94, - 0x2f, 0x73, 0x97, 0x94, 0xef, 0x16, 0x8c, 0x5a, 0x36, 0xa7, 0xee, 0x16, 0x69, 0xaa, 0x6e, 0x56, - 0x9f, 0x4b, 0x5d, 0xee, 0xb8, 0x2a, 0xe1, 0xf1, 0x97, 0xba, 0xa2, 0xf8, 0xe0, 0x80, 0x23, 0x6a, - 0xc2, 0x11, 0xbf, 0x17, 0xe1, 0x52, 0x12, 0x36, 0x2c, 0xd5, 0xa5, 0xdf, 0x73, 0xfe, 0x8d, 0xd3, - 0xa5, 0x24, 0xa4, 0x3b, 0xbd, 0x00, 0x38, 0x99, 0x29, 0x62, 0x30, 0xce, 0xb4, 0x5a, 0xc7, 0x0f, - 0x24, 0x7d, 0xf6, 0x71, 0xe2, 0xe5, 0xa1, 0x76, 0x53, 0xa8, 0x33, 0xc5, 0x51, 0x19, 0xe6, 0x9f, - 0xb2, 0x30, 0x19, 0xd3, 0xb4, 0xd8, 0x9d, 0x42, 0xfe, 0x60, 0xee, 0x14, 0x92, 0x13, 0xc7, 0xdc, - 0x40, 0x89, 0x63, 0x72, 0x4e, 0x33, 0x34, 0x50, 0x4e, 0xf3, 0xbc, 0xcc, 0x2b, 0xd4, 0xc9, 0xad, - 0x2c, 0xab, 0x37, 0x5c, 0xc1, 0x6e, 0xae, 0xea, 0x40, 0x1c, 0xc5, 0x15, 0x51, 0xb8, 0xd6, 0xfd, - 0xc1, 0x92, 0x4a, 0x8a, 0xce, 0xa5, 0xbd, 0x19, 0x0f, 0x18, 0xc8, 0x28, 0x9c, 0x00, 0xc0, 0x49, - 0xe2, 0x4a, 0x57, 0x3f, 0xfa, 0x6c, 0xfe, 0xd0, 0xc7, 0x9f, 0xcd, 0x1f, 0xfa, 0xe4, 0xb3, 0xf9, - 0x43, 0x6f, 0xed, 0xce, 0x1b, 0x1f, 0xed, 0xce, 0x1b, 0x1f, 0xef, 0xce, 0x1b, 0x9f, 0xec, 0xce, - 0x1b, 0x7f, 0xdd, 0x9d, 0x37, 0x7e, 0xf4, 0xf9, 0xfc, 0xa1, 0x57, 0x9e, 0xe8, 0xe7, 0x4b, 0xf8, - 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x63, 0x6e, 0xff, 0x30, 0x3f, 0x00, 0x00, -} - -func (m *AbortPromotionRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AbortPromotionRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AbortPromotionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - i-- - if m.ControlPlane { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - i -= len(m.Actor) - copy(dAtA[i:], m.Actor) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Actor))) - i-- - dAtA[i] = 0x12 - i -= len(m.Action) - copy(dAtA[i:], m.Action) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Action))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil + // 3563 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5b, 0x4b, 0x6c, 0x24, 0x47, + 0xf9, 0xdf, 0x9e, 0xb1, 0xc7, 0x9e, 0x6f, 0xfc, 0xac, 0xf5, 0x26, 0x8e, 0xf3, 0x8f, 0xbd, 0xff, + 0x4e, 0x14, 0x25, 0x24, 0x19, 0xb3, 0xaf, 0xec, 0x23, 0xb0, 0xc8, 0x33, 0xde, 0x87, 0x17, 0x27, + 0x6b, 0x6a, 0x36, 0xbb, 0x21, 0xd9, 0x55, 0x28, 0xcf, 0x94, 0x67, 0x1a, 0xcf, 0x74, 0x4f, 0xba, + 0x6a, 0x9c, 0x18, 0x10, 0x24, 0x3c, 0xa4, 0x48, 0x08, 0xc4, 0x21, 0x22, 0x41, 0x02, 0x09, 0xc1, + 0x19, 0x24, 0x8e, 0x88, 0x43, 0x0e, 0x5c, 0x22, 0x84, 0x50, 0x04, 0x1c, 0x72, 0x88, 0x2c, 0xe2, + 0x48, 0x1c, 0x73, 0xe3, 0xc0, 0x4a, 0x48, 0xa8, 0xab, 0xaa, 0xbb, 0xab, 0x7b, 0x7a, 0xd6, 0xd3, + 0xb3, 0xf6, 0x6a, 0xc5, 0x6d, 0xa6, 0xbe, 0xfa, 0x7e, 0x5f, 0x3d, 0xbe, 0x57, 0x7d, 0x55, 0x0d, + 0x27, 0xeb, 0x16, 0x6f, 0x74, 0xd6, 0x8b, 0x55, 0xa7, 0xb5, 0x48, 0x36, 0x3b, 0x16, 0xdf, 0x5e, + 0xdc, 0x24, 0x6e, 0xdd, 0x59, 0x24, 0x6d, 0x6b, 0x71, 0xeb, 0x18, 0x69, 0xb6, 0x1b, 0xe4, 0xd8, + 0x62, 0x9d, 0xda, 0xd4, 0x25, 0x9c, 0xd6, 0x8a, 0x6d, 0xd7, 0xe1, 0x0e, 0x7a, 0x2c, 0xe4, 0x2a, + 0x4a, 0xae, 0xa2, 0xe0, 0x2a, 0x92, 0xb6, 0x55, 0xf4, 0xb9, 0xe6, 0x9e, 0xd1, 0xb0, 0xeb, 0x4e, + 0xdd, 0x59, 0x14, 0xcc, 0xeb, 0x9d, 0x0d, 0xf1, 0x4f, 0xfc, 0x11, 0xbf, 0x24, 0xe8, 0xdc, 0xe5, + 0xcd, 0x33, 0xac, 0x68, 0x09, 0xc9, 0xf4, 0x0d, 0x4e, 0x6d, 0x66, 0x39, 0x36, 0x7b, 0x86, 0xb4, + 0x2d, 0x46, 0xdd, 0x2d, 0xea, 0x2e, 0xb6, 0x37, 0xeb, 0x1e, 0x8d, 0x45, 0x3b, 0x2c, 0x6e, 0x75, + 0x0d, 0x6f, 0xee, 0x64, 0x88, 0xd4, 0x22, 0xd5, 0x86, 0x65, 0x53, 0x77, 0x3b, 0x64, 0x6f, 0x51, + 0x4e, 0x92, 0xb8, 0x16, 0x7b, 0x71, 0xb9, 0x1d, 0x9b, 0x5b, 0x2d, 0xda, 0xc5, 0xf0, 0xec, 0x5e, + 0x0c, 0xac, 0xda, 0xa0, 0x2d, 0x12, 0xe7, 0x33, 0x6f, 0xc2, 0xe1, 0x25, 0x9b, 0x34, 0xb7, 0x99, + 0xc5, 0x70, 0xc7, 0x5e, 0x72, 0xeb, 0x9d, 0x16, 0xb5, 0x39, 0x3a, 0x0a, 0x43, 0x36, 0x69, 0xd1, + 0x59, 0xe3, 0xa8, 0xf1, 0x44, 0xbe, 0x34, 0xf6, 0xc1, 0xce, 0xc2, 0xa1, 0xdd, 0x9d, 0x85, 0xa1, + 0x17, 0x48, 0x8b, 0x62, 0x41, 0x41, 0x8f, 0xc2, 0xf0, 0x16, 0x69, 0x76, 0xe8, 0x6c, 0x46, 0x74, + 0x19, 0x57, 0x5d, 0x86, 0xaf, 0x7b, 0x8d, 0x58, 0xd2, 0xcc, 0xef, 0x65, 0x23, 0xf0, 0xcf, 0x53, + 0x4e, 0x6a, 0x84, 0x13, 0xd4, 0x82, 0x5c, 0x93, 0xac, 0xd3, 0x26, 0x9b, 0x35, 0x8e, 0x66, 0x9f, + 0x28, 0x1c, 0xbf, 0x50, 0xec, 0x67, 0x13, 0x8b, 0x09, 0x50, 0xc5, 0x55, 0x81, 0x73, 0xc1, 0xe6, + 0xee, 0x76, 0x69, 0x42, 0x0d, 0x22, 0x27, 0x1b, 0xb1, 0x12, 0x82, 0xde, 0x32, 0xa0, 0x40, 0x6c, + 0xdb, 0xe1, 0x84, 0x7b, 0xdb, 0x34, 0x9b, 0x11, 0x42, 0xaf, 0x0c, 0x2e, 0x74, 0x29, 0x04, 0x93, + 0x92, 0x0f, 0x2b, 0xc9, 0x05, 0x8d, 0x82, 0x75, 0x99, 0x73, 0x67, 0xa1, 0xa0, 0x0d, 0x15, 0x4d, + 0x41, 0x76, 0x93, 0x6e, 0xcb, 0xf5, 0xc5, 0xde, 0x4f, 0x34, 0x13, 0x59, 0x50, 0xb5, 0x82, 0xe7, + 0x32, 0x67, 0x8c, 0xb9, 0xf3, 0x30, 0x15, 0x17, 0x98, 0x86, 0xdf, 0xfc, 0xb1, 0x01, 0x33, 0xda, + 0x2c, 0x30, 0xdd, 0xa0, 0x2e, 0xb5, 0xab, 0x14, 0x2d, 0x42, 0xde, 0xdb, 0x4b, 0xd6, 0x26, 0x55, + 0x7f, 0xab, 0xa7, 0xd5, 0x44, 0xf2, 0x2f, 0xf8, 0x04, 0x1c, 0xf6, 0x09, 0xd4, 0x22, 0x73, 0x27, + 0xb5, 0x68, 0x37, 0x08, 0xa3, 0xb3, 0xd9, 0xa8, 0x5a, 0xac, 0x79, 0x8d, 0x58, 0xd2, 0xcc, 0x2f, + 0xc2, 0x43, 0xfe, 0x78, 0xae, 0xd1, 0x56, 0xbb, 0x49, 0x38, 0x0d, 0x07, 0xb5, 0xa7, 0xea, 0x99, + 0x93, 0x30, 0xbe, 0xd4, 0x6e, 0xbb, 0xce, 0x16, 0xad, 0x55, 0x38, 0xa9, 0x53, 0xf3, 0xbb, 0x06, + 0x1c, 0x59, 0x72, 0xeb, 0x4e, 0x79, 0x79, 0xa9, 0xdd, 0xbe, 0x4c, 0x49, 0x93, 0x37, 0x2a, 0x9c, + 0xf0, 0x0e, 0x43, 0xe7, 0x21, 0xc7, 0xc4, 0x2f, 0x05, 0xf7, 0xb8, 0xaf, 0x21, 0x92, 0x7e, 0x7b, + 0x67, 0x61, 0x26, 0x81, 0x91, 0x62, 0xc5, 0x85, 0x9e, 0x84, 0x91, 0x16, 0x65, 0x8c, 0xd4, 0xfd, + 0x39, 0x4f, 0x2a, 0x80, 0x91, 0xe7, 0x65, 0x33, 0xf6, 0xe9, 0xe6, 0x9f, 0x32, 0x30, 0x19, 0x60, + 0x29, 0xf1, 0x07, 0xb0, 0xc0, 0x1d, 0x18, 0x6b, 0x68, 0x33, 0x14, 0xeb, 0x5c, 0x38, 0xfe, 0x5c, + 0x9f, 0xba, 0x9c, 0xb4, 0x48, 0xa5, 0x19, 0x25, 0x66, 0x4c, 0x6f, 0xc5, 0x11, 0x31, 0xa8, 0x05, + 0xc0, 0xb6, 0xed, 0xaa, 0x12, 0x3a, 0x24, 0x84, 0x9e, 0x4d, 0x29, 0xb4, 0x12, 0x00, 0x94, 0x90, + 0x12, 0x09, 0x61, 0x1b, 0xd6, 0x04, 0x98, 0xbf, 0x35, 0xe0, 0x70, 0x02, 0x1f, 0xfa, 0x42, 0x6c, + 0x3f, 0x1f, 0xeb, 0xda, 0x4f, 0xd4, 0xc5, 0x16, 0xee, 0xe6, 0xd3, 0x30, 0xea, 0xd2, 0x2d, 0xcb, + 0xf3, 0xd5, 0x6a, 0x85, 0xa7, 0x14, 0xff, 0x28, 0x56, 0xed, 0x38, 0xe8, 0x81, 0x9e, 0x82, 0xbc, + 0xff, 0xdb, 0x5b, 0xe6, 0xac, 0xa7, 0xce, 0xde, 0xc6, 0xf9, 0x5d, 0x19, 0x0e, 0xe9, 0xe6, 0x77, + 0x60, 0xb8, 0xdc, 0x20, 0x2e, 0xf7, 0x34, 0xc6, 0xa5, 0x6d, 0xe7, 0x45, 0xbc, 0xaa, 0x86, 0x18, + 0x68, 0x0c, 0x96, 0xcd, 0xd8, 0xa7, 0xf7, 0xb1, 0xd9, 0x4f, 0xc2, 0xc8, 0x16, 0x75, 0xc5, 0x78, + 0xb3, 0x51, 0xb0, 0xeb, 0xb2, 0x19, 0xfb, 0x74, 0xf3, 0x6f, 0x06, 0xcc, 0x88, 0x11, 0x2c, 0x5b, + 0xac, 0xea, 0x6c, 0x51, 0x77, 0x1b, 0x53, 0xd6, 0x69, 0xee, 0xf3, 0x80, 0x96, 0x61, 0x8a, 0xd1, + 0xd6, 0x16, 0x75, 0xcb, 0x8e, 0xcd, 0xb8, 0x4b, 0x2c, 0x9b, 0xab, 0x91, 0xcd, 0xaa, 0xde, 0x53, + 0x95, 0x18, 0x1d, 0x77, 0x71, 0xa0, 0x27, 0x60, 0x54, 0x0d, 0xdb, 0x53, 0x25, 0x6f, 0x61, 0xc7, + 0xbc, 0x3d, 0x50, 0x73, 0x62, 0x38, 0xa0, 0x9a, 0xff, 0x34, 0x60, 0x5a, 0xcc, 0xaa, 0xd2, 0x59, + 0x67, 0x55, 0xd7, 0x6a, 0x7b, 0x2e, 0xf0, 0x7e, 0x9c, 0xd2, 0x79, 0x98, 0xa8, 0xf9, 0x0b, 0xbf, + 0x6a, 0xb5, 0x2c, 0x2e, 0x6c, 0x64, 0xb8, 0xf4, 0x80, 0xc2, 0x98, 0x58, 0x8e, 0x50, 0x71, 0xac, + 0xb7, 0xf9, 0xf3, 0x2c, 0x1c, 0xf6, 0xbb, 0xd0, 0xda, 0x92, 0xcb, 0xad, 0x0d, 0x52, 0xe5, 0x0c, + 0xd5, 0x60, 0xac, 0x16, 0x36, 0x73, 0x65, 0x79, 0x9f, 0x2b, 0xca, 0x70, 0x5f, 0xd4, 0xc3, 0x7d, + 0xb1, 0xbd, 0x59, 0xf7, 0x1a, 0x58, 0xd1, 0xcb, 0x2a, 0x8a, 0x5b, 0xc7, 0x8a, 0xd7, 0xac, 0x16, + 0x0d, 0xad, 0x5b, 0x83, 0xe7, 0x38, 0x82, 0x8a, 0x6e, 0x40, 0xb6, 0x6e, 0x71, 0x15, 0x8c, 0xcf, + 0xf4, 0x67, 0xd6, 0x97, 0xac, 0xb8, 0xaa, 0x95, 0x0a, 0x4a, 0x54, 0xf6, 0x92, 0xc5, 0xb1, 0x87, + 0x88, 0xd6, 0x21, 0x67, 0xb5, 0x48, 0x9d, 0xfa, 0x31, 0xf7, 0x5c, 0x7f, 0xd8, 0x2b, 0x1e, 0x4f, + 0x1c, 0x3d, 0x88, 0xee, 0x82, 0xca, 0xb0, 0x42, 0xf6, 0x64, 0x54, 0x3d, 0x15, 0x91, 0x46, 0xda, + 0xb7, 0x8c, 0x24, 0x63, 0x09, 0x65, 0x08, 0x2a, 0xc3, 0x0a, 0xd9, 0xfc, 0x28, 0x03, 0x53, 0xe1, + 0xfa, 0x95, 0x9d, 0x56, 0xcb, 0xe2, 0x68, 0x0e, 0x32, 0x56, 0x4d, 0x69, 0x20, 0x28, 0xc6, 0xcc, + 0xca, 0x32, 0xce, 0x58, 0x35, 0xf4, 0x38, 0xe4, 0xd6, 0x5d, 0x62, 0x57, 0x1b, 0x4a, 0xf3, 0x02, + 0xe0, 0x92, 0x68, 0xc5, 0x8a, 0x8a, 0x1e, 0x81, 0x2c, 0x27, 0x75, 0xa5, 0x70, 0xc1, 0xfa, 0x5d, + 0x23, 0x75, 0xec, 0xb5, 0x7b, 0x9a, 0xce, 0x3a, 0xeb, 0x5f, 0xa7, 0x55, 0xb9, 0xf3, 0x9a, 0xa6, + 0x57, 0x64, 0x33, 0xf6, 0xe9, 0x9e, 0x44, 0xd2, 0xe1, 0x0d, 0xc7, 0x9d, 0x1d, 0x8e, 0x4a, 0x5c, + 0x12, 0xad, 0x58, 0x51, 0xbd, 0x98, 0x54, 0x15, 0xe3, 0xe7, 0xd4, 0x9d, 0xcd, 0x45, 0x63, 0x52, + 0xd9, 0x27, 0xe0, 0xb0, 0x0f, 0xba, 0x05, 0x85, 0xaa, 0x4b, 0x09, 0x77, 0xdc, 0x65, 0xc2, 0xe9, + 0xec, 0x48, 0x6a, 0x0d, 0x9c, 0xf4, 0x12, 0xa3, 0x72, 0x08, 0x81, 0x75, 0x3c, 0xf3, 0x33, 0x03, + 0x66, 0xc3, 0xa5, 0x15, 0x7b, 0x1b, 0x26, 0x03, 0x6a, 0x79, 0x8c, 0x1e, 0xcb, 0xf3, 0x38, 0xe4, + 0x6a, 0x56, 0x9d, 0x32, 0x1e, 0x5f, 0xe5, 0x65, 0xd1, 0x8a, 0x15, 0x15, 0x1d, 0x07, 0xa8, 0x5b, + 0x5c, 0x39, 0x07, 0xb5, 0xd8, 0x41, 0x08, 0xba, 0x14, 0x50, 0xb0, 0xd6, 0x0b, 0xdd, 0x80, 0xbc, + 0x18, 0xe6, 0x80, 0x66, 0x27, 0x42, 0x45, 0xd9, 0x07, 0xc0, 0x21, 0x96, 0xf9, 0xe1, 0x10, 0x8c, + 0x5c, 0x74, 0xa9, 0x55, 0x6f, 0x70, 0xf4, 0x35, 0x18, 0x6d, 0xa9, 0xa4, 0x52, 0x4c, 0xb2, 0x70, + 0xfc, 0xf3, 0xfd, 0xc9, 0xb8, 0x2a, 0x36, 0xdd, 0x4b, 0x48, 0xc3, 0x89, 0x84, 0x6d, 0x38, 0x40, + 0xf5, 0x12, 0x32, 0xd2, 0xb4, 0x08, 0x13, 0xfb, 0xa6, 0x25, 0x64, 0x4b, 0x5e, 0x23, 0x96, 0x34, + 0xf4, 0x0a, 0xe4, 0x1c, 0xd7, 0xaa, 0x5b, 0xf6, 0x6c, 0x5e, 0x0c, 0xe2, 0x44, 0x7f, 0x26, 0xa4, + 0x66, 0x71, 0x55, 0xb0, 0x86, 0x8b, 0x2f, 0xff, 0x63, 0x05, 0x89, 0x5e, 0x86, 0x11, 0xa9, 0x4c, + 0xbe, 0x81, 0x2e, 0xf6, 0xed, 0x60, 0xa4, 0x3e, 0x86, 0x4a, 0x2f, 0xff, 0x33, 0xec, 0x03, 0xa2, + 0x4a, 0xe0, 0x5f, 0x86, 0x04, 0xf4, 0x53, 0x29, 0xfc, 0x4b, 0x4f, 0x87, 0x52, 0x09, 0x1c, 0xca, + 0x70, 0x1a, 0x50, 0xe1, 0x32, 0x7a, 0x79, 0x10, 0x6f, 0x89, 0x55, 0xe6, 0x92, 0x1b, 0x60, 0x89, + 0x55, 0xda, 0x34, 0x11, 0x4d, 0x77, 0xfc, 0xc4, 0xc6, 0x7c, 0x27, 0x0b, 0xd3, 0xaa, 0x67, 0xd9, + 0x69, 0x36, 0x69, 0x55, 0x84, 0x49, 0xe9, 0x9f, 0xb2, 0x89, 0xfe, 0xc9, 0x82, 0x61, 0x8b, 0xd3, + 0x96, 0x7f, 0x00, 0x2b, 0xa5, 0x1a, 0x4d, 0x28, 0xa3, 0xb8, 0xe2, 0x81, 0xc8, 0x33, 0x50, 0xb0, + 0x4b, 0xaa, 0x17, 0x96, 0x12, 0xd0, 0x0f, 0x0c, 0x38, 0xbc, 0x45, 0x5d, 0x6b, 0xc3, 0xaa, 0x8a, + 0x13, 0xcc, 0x65, 0x8b, 0x71, 0xc7, 0xdd, 0x56, 0x11, 0xe1, 0xd9, 0xfe, 0x24, 0x5f, 0xd7, 0x00, + 0x56, 0xec, 0x0d, 0xa7, 0xf4, 0xb0, 0x92, 0x76, 0xf8, 0x7a, 0x37, 0x34, 0x4e, 0x92, 0x37, 0xd7, + 0x06, 0x08, 0x47, 0x9b, 0x70, 0x80, 0x5a, 0xd5, 0x0f, 0x50, 0x7d, 0x0f, 0xcc, 0x9f, 0xac, 0xef, + 0xb2, 0xf4, 0x83, 0xd7, 0xfb, 0x06, 0x14, 0x14, 0x7d, 0xd5, 0x62, 0x1c, 0xdd, 0xec, 0xb2, 0xf6, + 0x62, 0x7f, 0xd6, 0xee, 0x71, 0x0b, 0x5b, 0x0f, 0xf2, 0x55, 0xbf, 0x45, 0xb3, 0x74, 0xec, 0x6f, + 0xa9, 0x5c, 0xd8, 0x67, 0x52, 0x8d, 0x3f, 0x74, 0x0c, 0x62, 0x8d, 0xd4, 0xde, 0x99, 0x2e, 0x8c, + 0x47, 0x8c, 0x1c, 0x9d, 0x82, 0xa1, 0x4d, 0xcb, 0xf6, 0xa3, 0xde, 0xff, 0xfb, 0xf9, 0xd4, 0x97, + 0x2d, 0xbb, 0x76, 0x7b, 0x67, 0x61, 0x3a, 0xd2, 0xd9, 0x6b, 0xc4, 0xa2, 0xfb, 0xde, 0x69, 0xd8, + 0xb9, 0xd1, 0xf7, 0x7e, 0xb9, 0x70, 0xe8, 0xcd, 0x8f, 0x8f, 0x1e, 0x32, 0xdf, 0xcd, 0xc2, 0x54, + 0x7c, 0x55, 0xfb, 0x28, 0x48, 0x84, 0x3e, 0x6c, 0xf4, 0x40, 0x7d, 0x58, 0xe6, 0xe0, 0x7c, 0x58, + 0xf6, 0x20, 0x7c, 0xd8, 0xd0, 0xbe, 0xf9, 0x30, 0xf3, 0x2f, 0x06, 0x4c, 0x04, 0x3b, 0xf3, 0x5a, + 0xc7, 0x8b, 0xac, 0xe1, 0xaa, 0x1b, 0xfb, 0xbf, 0xea, 0xaf, 0xc2, 0x08, 0x73, 0x3a, 0x6e, 0x55, + 0xa4, 0x8f, 0x1e, 0xfa, 0xc9, 0x74, 0x4e, 0x53, 0xf2, 0x6a, 0x39, 0x93, 0x6c, 0xc0, 0x3e, 0xaa, + 0x79, 0x33, 0x98, 0x8f, 0x22, 0xc9, 0x8c, 0xc2, 0xf5, 0xf2, 0x2d, 0x6f, 0x3e, 0xa3, 0x7a, 0x46, + 0xe1, 0xb5, 0x62, 0x45, 0x45, 0xa6, 0x70, 0xe7, 0x7e, 0x62, 0x9b, 0x2f, 0x81, 0xf2, 0xca, 0x62, + 0x0f, 0x24, 0xc5, 0xfc, 0x2c, 0x1b, 0x58, 0x8f, 0x3a, 0xbe, 0xbe, 0x0e, 0x20, 0x3d, 0x13, 0xad, + 0xad, 0xd8, 0xca, 0xf5, 0x96, 0x07, 0x08, 0x04, 0xca, 0x1d, 0x7a, 0x28, 0xd2, 0xf7, 0x06, 0x39, + 0x40, 0x48, 0xc0, 0x9a, 0x28, 0xf4, 0x4d, 0x28, 0x10, 0x55, 0x32, 0xb9, 0xe8, 0xb8, 0x4a, 0x87, + 0x97, 0x07, 0x91, 0xbc, 0x14, 0xc2, 0xc4, 0x4b, 0x5f, 0x21, 0x05, 0xeb, 0xd2, 0xe6, 0x5c, 0x98, + 0x8c, 0x8d, 0x37, 0xc1, 0xfb, 0xae, 0x44, 0xbd, 0xef, 0x89, 0x34, 0x61, 0x41, 0xd5, 0x81, 0xf4, + 0x9a, 0x19, 0x83, 0xa9, 0xf8, 0x48, 0xf7, 0x4d, 0x68, 0xa4, 0xf8, 0xa4, 0xfb, 0xfb, 0x5f, 0x64, + 0x20, 0x1f, 0x58, 0x7c, 0x9a, 0x53, 0xaa, 0x8c, 0xd4, 0x99, 0x3d, 0x4e, 0x12, 0xd9, 0x7e, 0x4e, + 0x12, 0x43, 0xbd, 0x4f, 0x12, 0x7e, 0x25, 0x2b, 0x77, 0xe7, 0x4a, 0x96, 0x76, 0x92, 0x18, 0xe9, + 0xff, 0x24, 0x31, 0xba, 0xf7, 0x49, 0xc2, 0xfc, 0x95, 0x01, 0xa8, 0xfb, 0xd8, 0x98, 0x66, 0xa1, + 0x48, 0xdc, 0x0f, 0xf7, 0x19, 0xa5, 0xe3, 0x67, 0xb7, 0xde, 0xee, 0xd8, 0x7c, 0x7f, 0x18, 0x26, + 0x2f, 0x59, 0x03, 0x17, 0x1c, 0x38, 0x3c, 0x28, 0x91, 0x2a, 0x54, 0xe5, 0x48, 0x15, 0xee, 0x12, + 0x4e, 0xeb, 0xdb, 0x6a, 0x7f, 0xcf, 0x29, 0xd6, 0x07, 0xcb, 0xc9, 0xdd, 0x6e, 0xf7, 0x26, 0xe1, + 0x5e, 0xd0, 0x7d, 0x2b, 0xc9, 0x73, 0x30, 0xce, 0xb8, 0x6b, 0x55, 0xb9, 0x2c, 0x69, 0xb0, 0xd9, + 0x82, 0xf0, 0x72, 0x47, 0x54, 0xf7, 0xf1, 0x8a, 0x4e, 0xc4, 0xd1, 0xbe, 0x89, 0x95, 0x92, 0xa1, + 0xd4, 0x95, 0x92, 0x45, 0xc8, 0x93, 0x66, 0xd3, 0x79, 0xfd, 0x1a, 0xa9, 0x33, 0x75, 0x54, 0x0d, + 0xb4, 0x66, 0xc9, 0x27, 0xe0, 0xb0, 0x0f, 0x2a, 0x02, 0x58, 0x75, 0xdb, 0x71, 0xa9, 0xe0, 0xc8, + 0x09, 0x77, 0x3b, 0xe1, 0xf9, 0xba, 0x95, 0xa0, 0x15, 0x6b, 0x3d, 0x50, 0x05, 0x8e, 0x58, 0x36, + 0xa3, 0xd5, 0x8e, 0x4b, 0x2b, 0x9b, 0x56, 0xfb, 0xda, 0x6a, 0x45, 0x78, 0x89, 0x6d, 0xa1, 0xcd, + 0xa3, 0xa5, 0x47, 0x94, 0xb0, 0x23, 0x2b, 0x49, 0x9d, 0x70, 0x32, 0x2f, 0x3a, 0x09, 0x63, 0x96, + 0x5d, 0x6d, 0x76, 0x6a, 0x74, 0x8d, 0xf0, 0x06, 0x9b, 0x1d, 0x15, 0xc3, 0x98, 0xda, 0xdd, 0x59, + 0x18, 0x5b, 0xd1, 0xda, 0x71, 0xa4, 0x97, 0xc7, 0x45, 0xdf, 0xd0, 0xb8, 0xf2, 0x21, 0xd7, 0x85, + 0x37, 0x74, 0x2e, 0xbd, 0x57, 0x42, 0x2d, 0x09, 0x52, 0xd5, 0x92, 0x7e, 0x9a, 0x85, 0x9c, 0x2c, + 0xe5, 0xa2, 0x53, 0xb1, 0x7a, 0xe9, 0x23, 0x5d, 0xf5, 0xd2, 0x42, 0x52, 0xd9, 0xdb, 0x84, 0x9c, + 0xc5, 0x58, 0x27, 0x1a, 0xdd, 0x56, 0x44, 0x0b, 0x56, 0x14, 0x64, 0x01, 0x10, 0xbf, 0xd4, 0xea, + 0xa7, 0x2e, 0xa7, 0xd2, 0x56, 0x84, 0x63, 0xd5, 0xe0, 0x80, 0xc0, 0xb0, 0x06, 0x2e, 0x2a, 0x3c, + 0x8e, 0xbd, 0x61, 0xd5, 0xd5, 0x39, 0xfc, 0xbc, 0x96, 0x35, 0x87, 0xb7, 0x6f, 0xaf, 0x06, 0xd7, + 0x73, 0x61, 0x02, 0x1d, 0xe9, 0xe0, 0x65, 0xd2, 0x57, 0x2a, 0x57, 0x5f, 0x90, 0xd3, 0x29, 0x0b, + 0x44, 0xac, 0x90, 0x3d, 0x19, 0x4e, 0x87, 0xb7, 0x3b, 0x5c, 0xe8, 0xe4, 0x3e, 0xc9, 0xb8, 0x2a, + 0x10, 0xb1, 0x42, 0x36, 0xdf, 0x35, 0x60, 0x52, 0x2e, 0x77, 0xb9, 0x41, 0xab, 0x9b, 0x15, 0x4e, + 0xdb, 0x5e, 0x62, 0xdb, 0x61, 0x94, 0xc5, 0x13, 0xdb, 0x17, 0x19, 0x65, 0x58, 0x50, 0xb4, 0xd9, + 0x67, 0x0e, 0x6a, 0xf6, 0xe6, 0x6f, 0x0c, 0x18, 0x16, 0x19, 0x64, 0x1a, 0x57, 0x17, 0xad, 0xaa, + 0x64, 0xfa, 0xaa, 0xaa, 0xec, 0x51, 0xef, 0x0a, 0x0b, 0x3a, 0x43, 0x77, 0x2a, 0xe8, 0x98, 0x9f, + 0x1a, 0x30, 0x93, 0x54, 0x24, 0x4c, 0x33, 0xfc, 0xa7, 0x61, 0xb4, 0xdd, 0x24, 0x7c, 0xc3, 0x71, + 0x5b, 0xf1, 0xdb, 0x80, 0x35, 0xd5, 0x8e, 0x83, 0x1e, 0xc8, 0x05, 0x70, 0xfd, 0xd3, 0x88, 0xaf, + 0xee, 0xe7, 0xd3, 0x06, 0x9f, 0x68, 0x75, 0x2b, 0x5c, 0xac, 0xa0, 0x89, 0x61, 0x4d, 0x8a, 0xf9, + 0xc3, 0x61, 0x98, 0x16, 0x2c, 0x83, 0x06, 0xa3, 0x41, 0x76, 0xa8, 0x0d, 0x0f, 0x88, 0x33, 0x44, + 0x77, 0xfc, 0x92, 0x9b, 0x76, 0x46, 0xf1, 0x3f, 0xb0, 0x92, 0xd8, 0xeb, 0x76, 0x4f, 0x0a, 0xee, + 0x81, 0xdb, 0x1d, 0x94, 0xe0, 0x7f, 0x2f, 0x28, 0xe9, 0xca, 0x36, 0xb2, 0xa7, 0xb2, 0xf5, 0x0c, + 0x61, 0xa3, 0x77, 0x11, 0xc2, 0xba, 0xc3, 0x4a, 0x3e, 0x55, 0x58, 0xf9, 0x59, 0x06, 0x46, 0xd6, + 0x5c, 0x47, 0x14, 0x9b, 0x0f, 0xbe, 0x6e, 0x79, 0x15, 0x86, 0x58, 0x9b, 0x56, 0x95, 0xcf, 0x3b, + 0xd6, 0x9f, 0xa5, 0xa9, 0xe1, 0x55, 0xda, 0xb4, 0x5a, 0x1a, 0xf5, 0xdc, 0xa8, 0xf7, 0x0b, 0x0b, + 0x20, 0xad, 0x00, 0x97, 0x4d, 0x93, 0xec, 0xfb, 0x90, 0x77, 0x2e, 0xc0, 0xbd, 0x6f, 0x40, 0x41, + 0xf5, 0xbc, 0x6f, 0x2b, 0x3d, 0x6a, 0x7c, 0x3d, 0x2a, 0x3d, 0x3f, 0x0a, 0x67, 0xe0, 0x2d, 0x1a, + 0xfa, 0x36, 0x4c, 0xb7, 0x5d, 0xa7, 0xe5, 0x78, 0x96, 0xba, 0xe6, 0x34, 0xad, 0xaa, 0x45, 0xfd, + 0x62, 0xe1, 0xa9, 0xbe, 0xe5, 0x69, 0xec, 0xdb, 0xa5, 0x87, 0x94, 0xdc, 0xe9, 0xb5, 0x38, 0x2e, + 0xee, 0x16, 0x65, 0xfe, 0xdd, 0x80, 0xf1, 0xc8, 0xda, 0xa3, 0x2a, 0x40, 0xd5, 0xb1, 0x6b, 0x16, + 0x0f, 0x2e, 0x64, 0x0b, 0xc7, 0x17, 0xfb, 0x5b, 0xd5, 0xb2, 0xcf, 0x17, 0x2a, 0x5d, 0xd0, 0xc4, + 0xb0, 0x06, 0x8b, 0x4e, 0xf8, 0xef, 0x17, 0xa2, 0xf9, 0x92, 0x7c, 0xbf, 0x70, 0x7b, 0x67, 0x61, + 0x4c, 0x8d, 0x49, 0x7f, 0xcf, 0x90, 0xe6, 0x95, 0xc0, 0xaf, 0x33, 0x90, 0x0f, 0xe6, 0x7f, 0x0f, + 0xcc, 0xe8, 0xc5, 0x88, 0x19, 0x9d, 0x48, 0xb9, 0x73, 0xc2, 0x90, 0x82, 0x9c, 0x44, 0x33, 0xa6, + 0x5b, 0x31, 0x63, 0x4a, 0xab, 0x12, 0x7b, 0x98, 0xd3, 0x1f, 0xe5, 0xe6, 0xcb, 0xbe, 0xf7, 0xc0, + 0xa0, 0xae, 0x45, 0x0d, 0x6a, 0x31, 0xe5, 0x6c, 0x7a, 0x98, 0xd4, 0xdb, 0x06, 0x4c, 0xc6, 0x8c, + 0x00, 0x3d, 0x0a, 0xc3, 0xa2, 0x3a, 0xa4, 0xf4, 0x2b, 0x60, 0x54, 0xb5, 0x04, 0x41, 0x43, 0x6b, + 0x30, 0x43, 0x3a, 0xdc, 0x09, 0x78, 0x2f, 0xd8, 0x64, 0xbd, 0x49, 0x65, 0x81, 0x60, 0xb4, 0xf4, + 0x7f, 0x8a, 0x67, 0x66, 0x29, 0xa1, 0x0f, 0x4e, 0xe4, 0x34, 0xff, 0x9c, 0x01, 0x14, 0x34, 0xa6, + 0xa9, 0xaa, 0xde, 0x82, 0x91, 0x0d, 0x59, 0xff, 0xb9, 0xbb, 0xb2, 0x78, 0xa9, 0xa0, 0xdf, 0x0c, + 0xf8, 0x98, 0xe8, 0xab, 0xfb, 0xa3, 0x47, 0xd0, 0xad, 0x43, 0xe8, 0x65, 0x80, 0x0d, 0xcb, 0xb6, + 0x58, 0x63, 0xc0, 0x0b, 0x3c, 0x11, 0xcd, 0x2f, 0x06, 0x08, 0x58, 0x43, 0x33, 0x7f, 0xaf, 0xeb, + 0xa7, 0x70, 0x97, 0x7d, 0xed, 0xeb, 0x93, 0xd1, 0xc5, 0xcc, 0x77, 0x5f, 0x99, 0x04, 0x0b, 0xf3, + 0x92, 0x87, 0x47, 0x83, 0x83, 0x55, 0x6a, 0xc3, 0xe5, 0xb4, 0xad, 0x0f, 0x82, 0xb6, 0x19, 0x96, + 0x80, 0xe6, 0x5b, 0x39, 0x4d, 0x2b, 0x95, 0x6b, 0xbd, 0x02, 0xa8, 0x49, 0x18, 0xbf, 0x4c, 0xec, + 0x9a, 0xa7, 0x43, 0x74, 0xc3, 0xa5, 0xac, 0xa1, 0xd2, 0xa8, 0x39, 0x85, 0x82, 0x56, 0xbb, 0x7a, + 0xe0, 0x04, 0x2e, 0x74, 0x2a, 0xea, 0x41, 0x17, 0xe2, 0x1e, 0x74, 0x22, 0x34, 0x89, 0xc1, 0x7c, + 0xa8, 0xae, 0x93, 0xc3, 0x07, 0xa0, 0x93, 0xdf, 0x82, 0xe9, 0x8d, 0xf8, 0x3d, 0x97, 0xba, 0xf5, + 0x3e, 0x3d, 0xe0, 0x35, 0x59, 0xe9, 0xc8, 0x6e, 0x78, 0x39, 0x12, 0x36, 0xe3, 0x6e, 0x41, 0xc8, + 0xf1, 0xdf, 0x77, 0x89, 0x23, 0xa2, 0x2c, 0x34, 0xf4, 0x6d, 0x17, 0xb1, 0xc3, 0x65, 0xfc, 0x65, + 0x97, 0x84, 0xc4, 0x11, 0x01, 0x31, 0x3b, 0xc9, 0xed, 0xa7, 0x9d, 0xa0, 0x53, 0x50, 0xa8, 0x76, + 0x5c, 0x97, 0xda, 0xdc, 0x1b, 0x8e, 0xc8, 0x37, 0xb3, 0x61, 0xc1, 0xb8, 0x1c, 0x92, 0xb0, 0xde, + 0x0f, 0xbd, 0x2a, 0x8c, 0x89, 0x53, 0x71, 0x10, 0xb8, 0xfb, 0x03, 0x6f, 0x5e, 0x19, 0x22, 0x97, + 0x86, 0xc8, 0xa9, 0xf9, 0xbb, 0x88, 0xfd, 0xf6, 0x77, 0x0c, 0x9f, 0x83, 0x0c, 0x61, 0xf1, 0x1a, + 0xed, 0x12, 0xc3, 0x19, 0xa2, 0x1f, 0xd1, 0xb3, 0x07, 0x76, 0x44, 0x77, 0x21, 0x4c, 0x9c, 0xfc, + 0x57, 0x93, 0xe8, 0x96, 0x0a, 0xef, 0x46, 0x9a, 0x57, 0x80, 0x5d, 0x30, 0xbd, 0xc2, 0xbc, 0xf9, + 0x1a, 0x1c, 0x49, 0xec, 0x1c, 0xba, 0x27, 0x63, 0xbf, 0xdd, 0xd3, 0x7b, 0x19, 0x98, 0xf2, 0x8e, + 0xa2, 0x91, 0x23, 0xef, 0x9a, 0xff, 0x3e, 0x29, 0x45, 0x8c, 0x88, 0xd5, 0x70, 0x4b, 0x23, 0x91, + 0x87, 0x49, 0x2f, 0xc1, 0xb0, 0x38, 0x8d, 0xaa, 0xa8, 0x76, 0x3a, 0xc5, 0x9d, 0x5b, 0x04, 0x55, + 0xe8, 0x96, 0x3c, 0xd6, 0x4b, 0x40, 0x0f, 0x59, 0x5c, 0x97, 0x29, 0x55, 0x38, 0x9d, 0xe2, 0xe2, + 0xad, 0x1b, 0x59, 0x34, 0x63, 0x09, 0x68, 0xbe, 0x9b, 0x01, 0x19, 0x4f, 0xee, 0x41, 0xde, 0xf8, + 0x95, 0x48, 0xde, 0xd8, 0x67, 0x42, 0x24, 0x06, 0xd7, 0x33, 0x67, 0x8c, 0xc7, 0xfa, 0x63, 0x69, + 0x40, 0xef, 0x9c, 0x2f, 0xfe, 0xc1, 0x80, 0xbc, 0xe8, 0x77, 0x0f, 0x72, 0xc5, 0xb5, 0x68, 0xae, + 0xf8, 0x54, 0x8a, 0x59, 0xf4, 0xc8, 0x13, 0xdf, 0xc9, 0xaa, 0xd1, 0x07, 0x99, 0x44, 0x83, 0xb8, + 0x35, 0x15, 0x7e, 0x43, 0x2b, 0xf1, 0x1a, 0xb1, 0xa4, 0xa1, 0x6f, 0xc0, 0x94, 0x2b, 0x6f, 0x60, + 0x69, 0xed, 0x62, 0x10, 0x0b, 0xb3, 0xa9, 0xaf, 0x48, 0xd5, 0x35, 0x6e, 0x58, 0x2b, 0xc1, 0x31, + 0x54, 0xdc, 0x25, 0xc7, 0x8b, 0x8f, 0xed, 0xb8, 0x53, 0x50, 0x71, 0xe3, 0xf4, 0x80, 0x0e, 0x48, + 0xc6, 0xc7, 0xae, 0x66, 0xdc, 0x2d, 0x08, 0x35, 0x60, 0x4c, 0x7f, 0xdc, 0xa1, 0x74, 0xe9, 0x78, + 0xfa, 0x57, 0x24, 0xb2, 0x0c, 0xaf, 0xb7, 0xe0, 0x08, 0xb2, 0xf9, 0xef, 0x61, 0x28, 0x68, 0xca, + 0xd7, 0x23, 0x49, 0x2a, 0x0c, 0x94, 0x24, 0x1d, 0x8b, 0x26, 0x49, 0x0f, 0xc7, 0x93, 0x24, 0x10, + 0x82, 0x23, 0x09, 0x12, 0x83, 0x09, 0x95, 0x2d, 0xf8, 0x0f, 0x68, 0xe4, 0xcd, 0xfe, 0xc0, 0x39, + 0x09, 0xda, 0xdd, 0x59, 0xf0, 0xaf, 0xbf, 0xfd, 0x87, 0x33, 0x31, 0x11, 0xe8, 0x7c, 0x20, 0xb4, + 0xd2, 0x69, 0xb5, 0x88, 0xbb, 0x3d, 0x3b, 0x26, 0x06, 0x1c, 0xd4, 0x8c, 0x2e, 0x46, 0xa8, 0x38, + 0xd6, 0x1b, 0xad, 0x41, 0x4e, 0x26, 0x1b, 0xea, 0x51, 0xc6, 0xd3, 0x69, 0xf2, 0x18, 0x19, 0x06, + 0xe5, 0x6f, 0xac, 0x70, 0xf4, 0x3c, 0x31, 0xbf, 0x47, 0x9e, 0x78, 0x05, 0x90, 0xb3, 0x2e, 0x02, + 0x6e, 0xed, 0x92, 0xfc, 0xec, 0xc5, 0x53, 0x98, 0x9c, 0x48, 0x42, 0x82, 0x0d, 0xbb, 0xda, 0xd5, + 0x03, 0x27, 0x70, 0x79, 0x06, 0xa7, 0x32, 0x94, 0x40, 0x4b, 0x55, 0x4e, 0x78, 0x26, 0xa5, 0xce, + 0x87, 0xe9, 0xe7, 0x8c, 0x67, 0x70, 0xe5, 0x18, 0x2a, 0xee, 0x92, 0x83, 0x5e, 0x83, 0x71, 0x4f, + 0x85, 0x42, 0xc1, 0x70, 0x97, 0x82, 0xa7, 0x77, 0x77, 0x16, 0xc6, 0x57, 0x75, 0x48, 0x1c, 0x95, + 0x60, 0xfe, 0x27, 0x03, 0x11, 0xd3, 0x40, 0x6f, 0x1b, 0x30, 0x4d, 0x62, 0xdf, 0x6c, 0xf8, 0xd1, + 0xff, 0x4b, 0xe9, 0x3e, 0xa4, 0xe9, 0xfa, 0xe4, 0x23, 0xac, 0x0c, 0xc5, 0xbb, 0x30, 0xdc, 0x2d, + 0x14, 0x7d, 0xdf, 0x80, 0xc3, 0xa4, 0xfb, 0xa3, 0x1c, 0x15, 0xaa, 0xce, 0x0e, 0xfc, 0x55, 0x4f, + 0xe9, 0xc1, 0xdd, 0x9d, 0x85, 0xa4, 0xcf, 0x95, 0x70, 0x92, 0x38, 0xf4, 0x0a, 0x0c, 0x11, 0xb7, + 0xee, 0x1f, 0xd0, 0xd2, 0x8b, 0xf5, 0xbf, 0xb5, 0x0a, 0x63, 0xe5, 0x92, 0x5b, 0x67, 0x58, 0x80, + 0x9a, 0x1f, 0x67, 0x61, 0x2a, 0xfe, 0xe4, 0x4d, 0xbd, 0x12, 0x18, 0x4a, 0x7c, 0x25, 0xf0, 0x28, + 0x0c, 0x93, 0x2a, 0x0f, 0xae, 0xec, 0xc3, 0x67, 0x9e, 0x5e, 0x23, 0x96, 0x34, 0x74, 0x03, 0xf2, + 0x8c, 0x13, 0x97, 0x7b, 0x79, 0xbb, 0x3a, 0x3a, 0xa5, 0x7e, 0xd2, 0x5a, 0xf1, 0x01, 0x70, 0x88, + 0x85, 0xce, 0x44, 0xdd, 0x99, 0x19, 0x77, 0x67, 0xd3, 0xfa, 0x5c, 0x06, 0x3d, 0xf6, 0xb5, 0xa0, + 0xa0, 0xed, 0x83, 0x72, 0xfc, 0xe7, 0x52, 0xaf, 0x7b, 0xa8, 0x76, 0x93, 0xf2, 0x83, 0xad, 0x90, + 0xa2, 0xe3, 0x87, 0xe7, 0x22, 0xb1, 0x5a, 0x77, 0x75, 0x2e, 0x12, 0xcb, 0xa5, 0xa1, 0x99, 0x93, + 0x30, 0x1e, 0x79, 0xb9, 0x22, 0xca, 0x82, 0x37, 0x88, 0x4b, 0x1b, 0x4e, 0x87, 0xd1, 0xfb, 0xb5, + 0x2c, 0x18, 0x0c, 0x70, 0xbf, 0xcb, 0x82, 0x21, 0xf0, 0xde, 0x65, 0xc1, 0xa0, 0xef, 0x7d, 0x5b, + 0x16, 0x0c, 0x46, 0xd8, 0x23, 0xdd, 0xfb, 0x57, 0x46, 0x9b, 0x45, 0x34, 0xe5, 0xcb, 0xdc, 0x21, + 0xe5, 0xbb, 0x09, 0xa3, 0x96, 0xcd, 0xa9, 0xbb, 0x45, 0x9a, 0xaa, 0x9a, 0xd5, 0xe7, 0x54, 0x97, + 0x3b, 0xae, 0x4a, 0x78, 0xfc, 0xa9, 0xae, 0x28, 0x1c, 0x1c, 0x20, 0xa2, 0x26, 0x1c, 0xf1, 0x6b, + 0x11, 0x2e, 0x25, 0x61, 0xc1, 0x52, 0x5d, 0xfa, 0x3d, 0xeb, 0xdf, 0x38, 0x5d, 0x4c, 0xea, 0x74, + 0xbb, 0x17, 0x01, 0x27, 0x83, 0x22, 0x06, 0xe3, 0x4c, 0x3b, 0xeb, 0xf8, 0x81, 0xa4, 0xcf, 0x3a, + 0x4e, 0xfc, 0x78, 0xa8, 0xdd, 0x14, 0xea, 0xa0, 0x38, 0x2a, 0xc3, 0xfc, 0x6b, 0x16, 0x26, 0x63, + 0x9a, 0x16, 0xbb, 0x53, 0xc8, 0x1f, 0xcc, 0x9d, 0x42, 0x72, 0xe2, 0x98, 0x1b, 0x28, 0x71, 0x4c, + 0xce, 0x69, 0x86, 0x06, 0xca, 0x69, 0x9e, 0x93, 0x79, 0x85, 0xda, 0xb9, 0x95, 0x65, 0xf5, 0x86, + 0x2b, 0x58, 0xcd, 0x55, 0x9d, 0x88, 0xa3, 0x7d, 0x45, 0x14, 0xae, 0x75, 0x7f, 0xb0, 0xa4, 0x92, + 0xa2, 0xb3, 0x69, 0x6f, 0xc6, 0x03, 0x00, 0x19, 0x85, 0x13, 0x08, 0x38, 0x49, 0x5c, 0xe9, 0xca, + 0x07, 0x9f, 0xcc, 0x1f, 0xfa, 0xf0, 0x93, 0xf9, 0x43, 0x1f, 0x7d, 0x32, 0x7f, 0xe8, 0xcd, 0xdd, + 0x79, 0xe3, 0x83, 0xdd, 0x79, 0xe3, 0xc3, 0xdd, 0x79, 0xe3, 0xa3, 0xdd, 0x79, 0xe3, 0x1f, 0xbb, + 0xf3, 0xc6, 0x4f, 0x3e, 0x9d, 0x3f, 0xf4, 0xf2, 0x63, 0xfd, 0x7c, 0x59, 0xfe, 0xdf, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x73, 0x23, 0xfb, 0x5e, 0x80, 0x3e, 0x00, 0x00, } func (m *AnalysisRunArgument) Marshal() (dAtA []byte, err error) { @@ -4917,20 +4843,6 @@ func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *AbortPromotionRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Action) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Actor) - n += 1 + l + sovGenerated(uint64(l)) - n += 2 - return n -} - func (m *AnalysisRunArgument) Size() (n int) { if m == nil { return 0 @@ -6043,18 +5955,6 @@ func sovGenerated(x uint64) (n int) { func sozGenerated(x uint64) (n int) { return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (this *AbortPromotionRequest) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&AbortPromotionRequest{`, - `Action:` + fmt.Sprintf("%v", this.Action) + `,`, - `Actor:` + fmt.Sprintf("%v", this.Actor) + `,`, - `ControlPlane:` + fmt.Sprintf("%v", this.ControlPlane) + `,`, - `}`, - }, "") - return s -} func (this *AnalysisRunArgument) String() string { if this == nil { return "nil" @@ -6936,140 +6836,6 @@ func valueToStringGenerated(v interface{}) string { pv := reflect.Indirect(rv).Interface() return fmt.Sprintf("*%v", pv) } -func (m *AbortPromotionRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: AbortPromotionRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AbortPromotionRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Action = AbortAction(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Actor", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Actor = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ControlPlane", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ControlPlane = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *AnalysisRunArgument) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/api/v1alpha1/generated.proto b/api/v1alpha1/generated.proto index 33a515d1c..0f6695441 100644 --- a/api/v1alpha1/generated.proto +++ b/api/v1alpha1/generated.proto @@ -13,20 +13,6 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; // Package-wide variables from generator "generated". option go_package = "github.com/akuity/kargo/api/v1alpha1"; -// AbortPromotionRequest is a request payload with an optional actor field which -// can be used to annotate a Promotion using the AnnotationKeyAbort annotation. -message AbortPromotionRequest { - // Action is the action to take on the Promotion to abort it. - optional string action = 1; - - // Actor is the user who initiated the request. - optional string actor = 2; - - // ControlPlane is a flag to indicate if the request has been initiated by - // a control plane. - optional bool controlPlane = 3; -} - // AnalysisRunArgument represents an argument to be added to an AnalysisRun. message AnalysisRunArgument { // Name is the name of the argument. diff --git a/api/v1alpha1/promotion_helpers.go b/api/v1alpha1/promotion_helpers.go index 1fe58db3f..27cab0002 100644 --- a/api/v1alpha1/promotion_helpers.go +++ b/api/v1alpha1/promotion_helpers.go @@ -2,6 +2,7 @@ package v1alpha1 import ( "context" + "encoding/json" "fmt" "strings" "time" @@ -25,6 +26,10 @@ const ( // AbortPromotionRequest is a request payload with an optional actor field which // can be used to annotate a Promotion using the AnnotationKeyAbort annotation. +// +// +protobuf=false +// +k8s:deepcopy-gen=false +// +k8s:openapi-gen=false type AbortPromotionRequest struct { // Action is the action to take on the Promotion to abort it. Action AbortAction `json:"action,omitempty" protobuf:"bytes,1,opt,name=action"` @@ -35,6 +40,32 @@ type AbortPromotionRequest struct { ControlPlane bool `json:"controlPlane,omitempty" protobuf:"varint,3,opt,name=controlPlane"` } +// Equals returns true if the AbortPromotionRequest is equal to the other +// AbortPromotionRequest, false otherwise. Two VerificationRequests are equal +// if their Action, Actor, and ControlPlane fields are equal. +func (r *AbortPromotionRequest) Equals(other *AbortPromotionRequest) bool { + if r == nil && other == nil { + return true + } + if r == nil || other == nil { + return false + } + return r.Action == other.Action && r.Actor == other.Actor && r.ControlPlane == other.ControlPlane +} + +// String returns the JSON string representation of the AbortPromotionRequest, +// or an empty string if the AbortPromotionRequest is nil or has an empty Action. +func (r *AbortPromotionRequest) String() string { + if r == nil || r.Action == "" { + return "" + } + b, _ := json.Marshal(r) + if b == nil { + return "" + } + return string(b) +} + // GetPromotion returns a pointer to the Promotion resource specified by the // namespacedName argument. If no such resource is found, nil is returned // instead. diff --git a/api/v1alpha1/promotion_helpers_test.go b/api/v1alpha1/promotion_helpers_test.go index ed60ffebc..b802dbfed 100644 --- a/api/v1alpha1/promotion_helpers_test.go +++ b/api/v1alpha1/promotion_helpers_test.go @@ -14,6 +14,92 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client/fake" ) +func TestAbortPromotionRequest_Equals(t *testing.T) { + tests := []struct { + name string + r1 *AbortPromotionRequest + r2 *AbortPromotionRequest + expected bool + }{ + { + name: "both nil", + r1: nil, + r2: nil, + expected: true, + }, + { + name: "one nil", + r1: &AbortPromotionRequest{Action: "fake-action", Actor: "fake-actor", ControlPlane: false}, + r2: nil, + expected: false, + }, + { + name: "other nil", + r1: nil, + r2: &AbortPromotionRequest{Action: "fake-action", Actor: "fake-actor", ControlPlane: false}, + expected: false, + }, + { + name: "different actions", + r1: &AbortPromotionRequest{Action: "fake-action", Actor: "fake-actor", ControlPlane: false}, + r2: &AbortPromotionRequest{Action: "other-action", Actor: "fake-actor", ControlPlane: false}, + expected: false, + }, + { + name: "different actors", + r1: &AbortPromotionRequest{Action: "fake-action", Actor: "fake-actor", ControlPlane: true}, + r2: &AbortPromotionRequest{Action: "fake-action", Actor: "other-actor", ControlPlane: true}, + expected: false, + }, + { + name: "different control plane flags", + r1: &AbortPromotionRequest{Action: "fake-action", Actor: "fake-actor", ControlPlane: true}, + r2: &AbortPromotionRequest{Action: "fake-action", Actor: "fake-actor", ControlPlane: false}, + expected: false, + }, + { + name: "equal", + r1: &AbortPromotionRequest{Action: "fake-action", Actor: "fake-actor", ControlPlane: true}, + r2: &AbortPromotionRequest{Action: "fake-action", Actor: "fake-actor", ControlPlane: true}, + expected: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require.Equal(t, tt.r1.Equals(tt.r2), tt.expected) + }) + } +} + +func TestAbortPromotionRequest_String(t *testing.T) { + t.Run("abort request is nil", func(t *testing.T) { + var r *AbortPromotionRequest + require.Empty(t, r.String()) + }) + + t.Run("abort request is empty", func(t *testing.T) { + r := &AbortPromotionRequest{} + require.Empty(t, r.String()) + }) + + t.Run("abort request has empty action", func(t *testing.T) { + r := &AbortPromotionRequest{ + Action: "", + } + require.Empty(t, r.String()) + }) + + t.Run("abort request has data", func(t *testing.T) { + r := &AbortPromotionRequest{ + Action: "foo", + Actor: "fake-actor", + ControlPlane: true, + } + require.Equal(t, `{"action":"foo","actor":"fake-actor","controlPlane":true}`, r.String()) + }) +} + func TestGetPromotion(t *testing.T) { scheme := k8sruntime.NewScheme() require.NoError(t, SchemeBuilder.AddToScheme(scheme)) diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index fd9035819..63b3cce81 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -10,21 +10,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" ) -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AbortPromotionRequest) DeepCopyInto(out *AbortPromotionRequest) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AbortPromotionRequest. -func (in *AbortPromotionRequest) DeepCopy() *AbortPromotionRequest { - if in == nil { - return nil - } - out := new(AbortPromotionRequest) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AnalysisRunArgument) DeepCopyInto(out *AnalysisRunArgument) { *out = *in diff --git a/internal/controller/promotions/promotions_test.go b/internal/controller/promotions/promotions_test.go index 4b585d7fc..a396124e7 100644 --- a/internal/controller/promotions/promotions_test.go +++ b/internal/controller/promotions/promotions_test.go @@ -440,7 +440,8 @@ func Test_reconciler_terminatePromotion(t *testing.T) { recorder: recorder, } - err := r.terminatePromotion(context.Background(), tt.req.DeepCopy(), tt.promo, tt.freight) + req := tt.req + err := r.terminatePromotion(context.Background(), &req, tt.promo, tt.freight) tt.assertions(t, recorder, tt.promo, err) }) } diff --git a/internal/webhook/promotion/webhook.go b/internal/webhook/promotion/webhook.go index 1ef305f22..f0f86f752 100644 --- a/internal/webhook/promotion/webhook.go +++ b/internal/webhook/promotion/webhook.go @@ -139,20 +139,28 @@ func (w *webhook) Default(ctx context.Context, obj runtime.Object) error { if promo.Annotations == nil { promo.Annotations = make(map[string]string, 1) } - if req.Operation == admissionv1.Create { + + switch req.Operation { + case admissionv1.Create: // Set actor as an admission request's user info when the promotion is created // to allow controllers to track who created it. if !w.isRequestFromKargoControlplaneFn(req) { promo.Annotations[kargoapi.AnnotationKeyCreateActor] = kargoapi.FormatEventKubernetesUserActor(req.UserInfo) } - } else if req.Operation == admissionv1.Update { + + // Enrich the annotation with the actor and control plane information. + w.setAbortAnnotationActor(req, nil, promo) + case admissionv1.Update: // Ensure actor annotation immutability if oldActor, ok := oldPromo.Annotations[kargoapi.AnnotationKeyCreateActor]; ok { promo.Annotations[kargoapi.AnnotationKeyCreateActor] = oldActor } else { delete(promo.Annotations, kargoapi.AnnotationKeyCreateActor) } + + // Enrich the annotation with the actor and control plane information. + w.setAbortAnnotationActor(req, oldPromo, promo) } stage, err := w.getStageFn( @@ -372,3 +380,24 @@ func (w *webhook) recordPromotionCreatedEvent( actor, ) } + +func (w *webhook) setAbortAnnotationActor(req admission.Request, old, new *kargoapi.Promotion) { + if abortReq, ok := kargoapi.AbortPromotionAnnotationValue(new.Annotations); ok { + var oldAbortReq *kargoapi.AbortPromotionRequest + if old != nil { + oldAbortReq, _ = kargoapi.AbortPromotionAnnotationValue(old.Annotations) + } + // If the abort request has changed, enrich the annotation with the + // actor and control plane information. + if old == nil || oldAbortReq == nil || !abortReq.Equals(oldAbortReq) { + abortReq.ControlPlane = w.isRequestFromKargoControlplaneFn(req) + if !abortReq.ControlPlane { + // If the abort request is not from the control plane, then it's + // from a specific Kubernetes user. Without this check we would + // overwrite the actor field set by the control plane. + abortReq.Actor = kargoapi.FormatEventKubernetesUserActor(req.UserInfo) + } + new.Annotations[kargoapi.AnnotationKeyAbort] = abortReq.String() + } + } +} diff --git a/internal/webhook/promotion/webhook_test.go b/internal/webhook/promotion/webhook_test.go index edf2b70fd..baf6d00e1 100644 --- a/internal/webhook/promotion/webhook_test.go +++ b/internal/webhook/promotion/webhook_test.go @@ -2,14 +2,17 @@ package promotion import ( "context" + "encoding/json" "errors" "regexp" "testing" "github.com/stretchr/testify/require" + admissionv1 "k8s.io/api/admission/v1" authnv1 "k8s.io/api/authentication/v1" authzv1 "k8s.io/api/authorization/v1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/apiserver/pkg/authentication/serviceaccount" @@ -41,18 +44,20 @@ func TestNewWebhook(t *testing.T) { } func TestDefault(t *testing.T) { + scheme := runtime.NewScheme() + require.NoError(t, kargoapi.AddToScheme(scheme)) + testCases := []struct { name string promotion *kargoapi.Promotion + req admission.Request webhook *webhook assertions func(*testing.T, *kargoapi.Promotion, error) }{ { name: "error getting stage", webhook: &webhook{ - admissionRequestFromContextFn: func(context.Context) (admission.Request, error) { - return admission.Request{}, nil - }, + admissionRequestFromContextFn: admission.RequestFromContext, getStageFn: func( context.Context, client.Client, @@ -60,7 +65,16 @@ func TestDefault(t *testing.T) { ) (*kargoapi.Stage, error) { return nil, errors.New("something went wrong") }, + isRequestFromKargoControlplaneFn: func(admission.Request) bool { + return false + }, }, + req: admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Operation: admissionv1.Create, + }, + }, + promotion: &kargoapi.Promotion{}, assertions: func(t *testing.T, _ *kargoapi.Promotion, err error) { require.ErrorContains(t, err, "something went wrong") }, @@ -68,9 +82,7 @@ func TestDefault(t *testing.T) { { name: "stage not found", webhook: &webhook{ - admissionRequestFromContextFn: func(context.Context) (admission.Request, error) { - return admission.Request{}, nil - }, + admissionRequestFromContextFn: admission.RequestFromContext, getStageFn: func( context.Context, client.Client, @@ -78,7 +90,16 @@ func TestDefault(t *testing.T) { ) (*kargoapi.Stage, error) { return nil, nil }, + isRequestFromKargoControlplaneFn: func(admission.Request) bool { + return false + }, }, + req: admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Operation: admissionv1.Create, + }, + }, + promotion: &kargoapi.Promotion{}, assertions: func(t *testing.T, _ *kargoapi.Promotion, err error) { require.ErrorContains(t, err, "could not find Stage") }, @@ -86,9 +107,7 @@ func TestDefault(t *testing.T) { { name: "stage without promotion steps", webhook: &webhook{ - admissionRequestFromContextFn: func(context.Context) (admission.Request, error) { - return admission.Request{}, nil - }, + admissionRequestFromContextFn: admission.RequestFromContext, getStageFn: func( context.Context, client.Client, @@ -96,13 +115,44 @@ func TestDefault(t *testing.T) { ) (*kargoapi.Stage, error) { return &kargoapi.Stage{}, nil }, + isRequestFromKargoControlplaneFn: func(admission.Request) bool { + return false + }, }, + req: admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Operation: admissionv1.Create, + }, + }, + promotion: &kargoapi.Promotion{}, assertions: func(t *testing.T, _ *kargoapi.Promotion, err error) { require.ErrorContains(t, err, "defines no promotion steps") }, }, { name: "success with PromotionTemplate", + webhook: &webhook{ + admissionRequestFromContextFn: admission.RequestFromContext, + getStageFn: func( + context.Context, + client.Client, + types.NamespacedName, + ) (*kargoapi.Stage, error) { + return &kargoapi.Stage{ + Spec: kargoapi.StageSpec{ + Shard: "fake-shard", + }, + }, nil + }, + isRequestFromKargoControlplaneFn: func(admission.Request) bool { + return false + }, + }, + req: admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Operation: admissionv1.Create, + }, + }, promotion: &kargoapi.Promotion{ Spec: kargoapi.PromotionSpec{ Stage: "fake-stage", @@ -111,41 +161,474 @@ func TestDefault(t *testing.T) { }, }, }, + assertions: func(t *testing.T, promo *kargoapi.Promotion, err error) { + require.NoError(t, err) + require.Equal(t, "fake-shard", promo.Labels[kargoapi.ShardLabelKey]) + require.NotEmpty(t, promo.OwnerReferences) + }, + }, + { + name: "set abort actor when request doesn't come from kargo control plane", webhook: &webhook{ - admissionRequestFromContextFn: func(context.Context) (admission.Request, error) { - return admission.Request{}, nil + admissionRequestFromContextFn: admission.RequestFromContext, + getStageFn: func( + context.Context, + client.Client, + types.NamespacedName, + ) (*kargoapi.Stage, error) { + return &kargoapi.Stage{}, nil + }, + isRequestFromKargoControlplaneFn: func(admission.Request) bool { + return false + }, + }, + req: admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Operation: admissionv1.Update, + UserInfo: authnv1.UserInfo{ + Username: "real-user", + }, + OldObject: runtime.RawExtension{ + Object: &kargoapi.Promotion{}, + }, }, + }, + promotion: &kargoapi.Promotion{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + kargoapi.AnnotationKeyAbort: "fake-action", + }, + }, + Spec: kargoapi.PromotionSpec{ + Steps: []kargoapi.PromotionStep{ + {}, + }, + }, + }, + assertions: func(t *testing.T, promotion *kargoapi.Promotion, err error) { + require.NoError(t, err) + require.Contains(t, promotion.Annotations, kargoapi.AnnotationKeyAbort) + rr, ok := kargoapi.AbortPromotionAnnotationValue(promotion.Annotations) + require.True(t, ok) + require.Equal(t, &kargoapi.AbortPromotionRequest{ + Action: "fake-action", + Actor: kargoapi.FormatEventKubernetesUserActor(authnv1.UserInfo{ + Username: "real-user", + }), + ControlPlane: false, + }, rr) + }, + }, + { + name: "overwrite with admission request user info if abort actor annotation exists", + webhook: &webhook{ + admissionRequestFromContextFn: admission.RequestFromContext, getStageFn: func( context.Context, client.Client, types.NamespacedName, ) (*kargoapi.Stage, error) { - return &kargoapi.Stage{ - Spec: kargoapi.StageSpec{ - Shard: "fake-shard", + return &kargoapi.Stage{}, nil + }, + isRequestFromKargoControlplaneFn: func(admission.Request) bool { + return false + }, + }, + req: admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Operation: admissionv1.Update, + UserInfo: authnv1.UserInfo{ + Username: "real-user", + }, + OldObject: runtime.RawExtension{ + Object: &kargoapi.Promotion{}, + }, + }, + }, + promotion: &kargoapi.Promotion{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + kargoapi.AnnotationKeyAbort: (&kargoapi.AbortPromotionRequest{ + Action: "fake-action", + Actor: "fake-user", + }).String(), + }, + }, + Spec: kargoapi.PromotionSpec{ + Steps: []kargoapi.PromotionStep{ + {}, + }, + }, + }, + assertions: func(t *testing.T, promotion *kargoapi.Promotion, err error) { + require.NoError(t, err) + require.Contains(t, promotion.Annotations, kargoapi.AnnotationKeyAbort) + rr, ok := kargoapi.AbortPromotionAnnotationValue(promotion.Annotations) + require.True(t, ok) + require.Equal(t, &kargoapi.AbortPromotionRequest{ + Action: "fake-action", + Actor: kargoapi.FormatEventKubernetesUserActor(authnv1.UserInfo{ + Username: "real-user", + }), + ControlPlane: false, + }, rr) + }, + }, + { + name: "do not overwrite abort actor when request comes from control plane", + webhook: &webhook{ + admissionRequestFromContextFn: admission.RequestFromContext, + getStageFn: func( + context.Context, + client.Client, + types.NamespacedName, + ) (*kargoapi.Stage, error) { + return &kargoapi.Stage{}, nil + }, + isRequestFromKargoControlplaneFn: func(admission.Request) bool { + return true + }, + }, + req: admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Operation: admissionv1.Update, + UserInfo: authnv1.UserInfo{ + Username: "control-plane-user", + }, + OldObject: runtime.RawExtension{ + Object: &kargoapi.Promotion{}, + }, + }, + }, + promotion: &kargoapi.Promotion{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + kargoapi.AnnotationKeyAbort: (&kargoapi.AbortPromotionRequest{ + Action: "fake-action", + Actor: kargoapi.EventActorAdmin, + }).String(), + }, + }, + Spec: kargoapi.PromotionSpec{ + Steps: []kargoapi.PromotionStep{ + {}, + }, + }, + }, + assertions: func(t *testing.T, promotion *kargoapi.Promotion, err error) { + require.NoError(t, err) + require.Contains(t, promotion.Annotations, kargoapi.AnnotationKeyAbort) + rr, ok := kargoapi.AbortPromotionAnnotationValue(promotion.Annotations) + require.True(t, ok) + require.Equal(t, &kargoapi.AbortPromotionRequest{ + Action: "fake-action", + Actor: kargoapi.EventActorAdmin, + ControlPlane: true, + }, rr) + }, + }, + { + name: "overwrite abort actor when it has changed for the same ID", + webhook: &webhook{ + admissionRequestFromContextFn: admission.RequestFromContext, + getStageFn: func( + context.Context, + client.Client, + types.NamespacedName, + ) (*kargoapi.Stage, error) { + return &kargoapi.Stage{}, nil + }, + isRequestFromKargoControlplaneFn: func(admission.Request) bool { + return false + }, + }, + req: admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Operation: admissionv1.Update, + UserInfo: authnv1.UserInfo{ + Username: "real-user", + }, + OldObject: runtime.RawExtension{ + Object: &kargoapi.Promotion{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + kargoapi.AnnotationKeyAbort: (&kargoapi.AbortPromotionRequest{ + Action: "fake-action", + Actor: "fake-user", + }).String(), + }, + }, }, - }, nil + }, }, }, - assertions: func(t *testing.T, promo *kargoapi.Promotion, err error) { + promotion: &kargoapi.Promotion{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + kargoapi.AnnotationKeyAbort: (&kargoapi.AbortPromotionRequest{ + Action: "fake-action", + Actor: "illegitimate-user", + }).String(), + }, + }, + Spec: kargoapi.PromotionSpec{ + Steps: []kargoapi.PromotionStep{ + {}, + }, + }, + }, + assertions: func(t *testing.T, promotion *kargoapi.Promotion, err error) { require.NoError(t, err) - require.Equal(t, "fake-shard", promo.Labels[kargoapi.ShardLabelKey]) - require.NotEmpty(t, promo.OwnerReferences) + require.Contains(t, promotion.Annotations, kargoapi.AnnotationKeyAbort) + rr, ok := kargoapi.AbortPromotionAnnotationValue(promotion.Annotations) + require.True(t, ok) + require.Equal(t, &kargoapi.AbortPromotionRequest{ + Action: "fake-action", + Actor: kargoapi.FormatEventKubernetesUserActor(authnv1.UserInfo{Username: "real-user"}), + }, rr) + }, + }, + { + name: "overwrite abort control plane flag when it has changed for the same ID", + webhook: &webhook{ + admissionRequestFromContextFn: admission.RequestFromContext, + getStageFn: func( + context.Context, + client.Client, + types.NamespacedName, + ) (*kargoapi.Stage, error) { + return &kargoapi.Stage{}, nil + }, + isRequestFromKargoControlplaneFn: func(admission.Request) bool { + return false + }, + }, + req: admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Operation: admissionv1.Update, + UserInfo: authnv1.UserInfo{ + Username: "real-user", + }, + OldObject: runtime.RawExtension{ + Object: &kargoapi.Promotion{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + kargoapi.AnnotationKeyAbort: (&kargoapi.AbortPromotionRequest{ + Action: "fake-action", + Actor: "fake-user", + }).String(), + }, + }, + }, + }, + }, + }, + promotion: &kargoapi.Promotion{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + kargoapi.AnnotationKeyAbort: (&kargoapi.AbortPromotionRequest{ + Action: "fake-action", + Actor: "fake-user", + ControlPlane: true, + }).String(), + }, + }, + Spec: kargoapi.PromotionSpec{ + Steps: []kargoapi.PromotionStep{ + {}, + }, + }, + }, + assertions: func(t *testing.T, promotion *kargoapi.Promotion, err error) { + require.NoError(t, err) + require.Contains(t, promotion.Annotations, kargoapi.AnnotationKeyAbort) + rr, ok := kargoapi.AbortPromotionAnnotationValue(promotion.Annotations) + require.True(t, ok) + require.Equal(t, &kargoapi.AbortPromotionRequest{ + Action: "fake-action", + Actor: kargoapi.FormatEventKubernetesUserActor(authnv1.UserInfo{Username: "real-user"}), + ControlPlane: false, + }, rr) + }, + }, + { + name: "ignore empty abort annotation", + webhook: &webhook{ + admissionRequestFromContextFn: admission.RequestFromContext, + getStageFn: func( + context.Context, + client.Client, + types.NamespacedName, + ) (*kargoapi.Stage, error) { + return &kargoapi.Stage{}, nil + }, + isRequestFromKargoControlplaneFn: func(admission.Request) bool { + return false + }, + }, + req: admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Operation: admissionv1.Update, + UserInfo: authnv1.UserInfo{ + Username: "real-user", + }, + OldObject: runtime.RawExtension{ + Object: &kargoapi.Promotion{}, + }, + }, + }, + promotion: &kargoapi.Promotion{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + kargoapi.AnnotationKeyAbort: "", + }, + }, + Spec: kargoapi.PromotionSpec{ + Steps: []kargoapi.PromotionStep{ + {}, + }, + }, + }, + assertions: func(t *testing.T, promotion *kargoapi.Promotion, err error) { + require.NoError(t, err) + v, ok := promotion.Annotations[kargoapi.AnnotationKeyAbort] + require.True(t, ok) + require.Empty(t, v) + }, + }, + { + name: "ignore abort annotation with empty ID", + webhook: &webhook{ + admissionRequestFromContextFn: admission.RequestFromContext, + getStageFn: func( + context.Context, + client.Client, + types.NamespacedName, + ) (*kargoapi.Stage, error) { + return &kargoapi.Stage{}, nil + }, + isRequestFromKargoControlplaneFn: func(admission.Request) bool { + return false + }, + }, + req: admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Operation: admissionv1.Update, + UserInfo: authnv1.UserInfo{ + Username: "real-user", + }, + OldObject: runtime.RawExtension{ + Object: &kargoapi.Promotion{}, + }, + }, + }, + promotion: &kargoapi.Promotion{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + kargoapi.AnnotationKeyAbort: (&kargoapi.AbortPromotionRequest{ + Action: "", + }).String(), + }, + }, + Spec: kargoapi.PromotionSpec{ + Steps: []kargoapi.PromotionStep{ + {}, + }, + }, + }, + assertions: func(t *testing.T, promotion *kargoapi.Promotion, err error) { + require.NoError(t, err) + v, ok := promotion.Annotations[kargoapi.AnnotationKeyAbort] + require.True(t, ok) + require.Equal(t, (&kargoapi.AbortPromotionRequest{ + Action: "", + }).String(), v) + }, + }, + { + name: "ignore unchanged abort annotation", + webhook: &webhook{ + admissionRequestFromContextFn: admission.RequestFromContext, + getStageFn: func( + context.Context, + client.Client, + types.NamespacedName, + ) (*kargoapi.Stage, error) { + return &kargoapi.Stage{}, nil + }, + isRequestFromKargoControlplaneFn: func(admission.Request) bool { + return false + }, + }, + req: admission.Request{ + AdmissionRequest: admissionv1.AdmissionRequest{ + Operation: admissionv1.Update, + UserInfo: authnv1.UserInfo{ + Username: "real-user", + }, + OldObject: runtime.RawExtension{ + Object: &kargoapi.Promotion{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + kargoapi.AnnotationKeyAbort: (&kargoapi.AbortPromotionRequest{ + Action: "fake-action", + Actor: "fake-user", + }).String(), + }, + }, + }, + }, + }, + }, + promotion: &kargoapi.Promotion{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + kargoapi.AnnotationKeyAbort: (&kargoapi.AbortPromotionRequest{ + Action: "fake-action", + Actor: "fake-user", + }).String(), + }, + }, + Spec: kargoapi.PromotionSpec{ + Steps: []kargoapi.PromotionStep{ + {}, + }, + }, + }, + assertions: func(t *testing.T, promotion *kargoapi.Promotion, err error) { + require.NoError(t, err) + v, ok := promotion.Annotations[kargoapi.AnnotationKeyAbort] + require.True(t, ok) + require.Equal(t, (&kargoapi.AbortPromotionRequest{ + Action: "fake-action", + Actor: "fake-user", + }).String(), v) }, }, } for _, testCase := range testCases { t.Run(testCase.name, func(t *testing.T) { - promo := testCase.promotion - if promo == nil { - promo = &kargoapi.Promotion{ - Spec: kargoapi.PromotionSpec{ - Stage: "fake-stage", - }, - } + // Apply default decoder to all test cases + testCase.webhook.decoder = admission.NewDecoder(scheme) + + // Make sure old object has corresponding Raw data instead of Object + // since controller-runtime doesn't decode the old object. + if testCase.req.OldObject.Object != nil { + data, err := json.Marshal(testCase.req.OldObject.Object) + require.NoError(t, err) + testCase.req.OldObject.Raw = data + testCase.req.OldObject.Object = nil } - err := testCase.webhook.Default(context.Background(), promo) - testCase.assertions(t, promo, err) + + ctx := admission.NewContextWithRequest( + context.Background(), + testCase.req, + ) + testCase.assertions( + t, + testCase.promotion, + testCase.webhook.Default(ctx, testCase.promotion), + ) }) } } @@ -460,7 +943,7 @@ func TestValidateUpdate(t *testing.T) { name: "attempt to mutate", setup: func() (*kargoapi.Promotion, *kargoapi.Promotion) { oldPromo := &kargoapi.Promotion{ - ObjectMeta: v1.ObjectMeta{ + ObjectMeta: metav1.ObjectMeta{ Name: "fake-name", Namespace: "fake-namespace", }, @@ -486,7 +969,7 @@ func TestValidateUpdate(t *testing.T) { name: "update without mutation", setup: func() (*kargoapi.Promotion, *kargoapi.Promotion) { oldPromo := &kargoapi.Promotion{ - ObjectMeta: v1.ObjectMeta{ + ObjectMeta: metav1.ObjectMeta{ Name: "fake-name", Namespace: "fake-namespace", }, @@ -652,7 +1135,7 @@ func TestAuthorize(t *testing.T) { w.authorize( context.Background(), &kargoapi.Promotion{ - ObjectMeta: v1.ObjectMeta{ + ObjectMeta: metav1.ObjectMeta{ Name: "fake-promotion", Namespace: "fake-namespace", }, diff --git a/ui/src/gen/v1alpha1/generated_pb.ts b/ui/src/gen/v1alpha1/generated_pb.ts index 384c3e413..8c37c4552 100644 --- a/ui/src/gen/v1alpha1/generated_pb.ts +++ b/ui/src/gen/v1alpha1/generated_pb.ts @@ -10,65 +10,6 @@ import { Message, proto2 } from "@bufbuild/protobuf"; import { Condition, Duration, ListMeta, ObjectMeta, Time } from "../k8s.io/apimachinery/pkg/apis/meta/v1/generated_pb.js"; import { JSON } from "../k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1/generated_pb.js"; -/** - * AbortPromotionRequest is a request payload with an optional actor field which - * can be used to annotate a Promotion using the AnnotationKeyAbort annotation. - * - * @generated from message github.com.akuity.kargo.api.v1alpha1.AbortPromotionRequest - */ -export class AbortPromotionRequest extends Message { - /** - * Action is the action to take on the Promotion to abort it. - * - * @generated from field: optional string action = 1; - */ - action?: string; - - /** - * Actor is the user who initiated the request. - * - * @generated from field: optional string actor = 2; - */ - actor?: string; - - /** - * ControlPlane is a flag to indicate if the request has been initiated by - * a control plane. - * - * @generated from field: optional bool controlPlane = 3; - */ - controlPlane?: boolean; - - constructor(data?: PartialMessage) { - super(); - proto2.util.initPartial(data, this); - } - - static readonly runtime: typeof proto2 = proto2; - static readonly typeName = "github.com.akuity.kargo.api.v1alpha1.AbortPromotionRequest"; - static readonly fields: FieldList = proto2.util.newFieldList(() => [ - { no: 1, name: "action", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, - { no: 2, name: "actor", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, - { no: 3, name: "controlPlane", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): AbortPromotionRequest { - return new AbortPromotionRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): AbortPromotionRequest { - return new AbortPromotionRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): AbortPromotionRequest { - return new AbortPromotionRequest().fromJsonString(jsonString, options); - } - - static equals(a: AbortPromotionRequest | PlainMessage | undefined, b: AbortPromotionRequest | PlainMessage | undefined): boolean { - return proto2.util.equals(AbortPromotionRequest, a, b); - } -} - /** * AnalysisRunArgument represents an argument to be added to an AnalysisRun. *