Repository: akuity/kargo

Issue:
Add a way to map users git email address to a user name for easier understanding who made the change.
# Proposed Feature

The list of emails in the "Created By" column on the stage details page seems to be coming from the git commits. It would be nice if there were a way to map these git emails to users and display the user's names in case some of the emails aren't obvious who they are. You could still show the emails if needed (Maybe when you hover over, or click on an "i" icon)

<img width="718" alt="Image" src="https://github.com/user-attachments/assets/25ffd224-cf57-45a8-a170-7a1b5d0c01fd" />

# Motivation

Make it created by list more user-friendly and easier to use when someone has weird email addresses for their git commits. This will also make it easier if someone commits code from multiple email addresses.

# Suggested Implementation

None


Discussion:
@krancour: @kencochrane those aren't coming from a commit, but from claims in the ID token of the authenticated user who manually triggered the Promotion. In the case of an auto-promotion, it will show up as "N/A".

Current logic seems to prefer the email claim, followed by the sub claim. Then it gives up if neither of those are found. But those are standard claims, so in practice, it is probably always email.

GitHub user handles would be nice, but we'd only have a claim with that info if GitHub is the IDP.

Since many useful claims (like GitHub handle) _aren't_ standard, the best thing might be to just make it configurable which claim Kargo should use as the username.

wdyt?@kencochrane: @krancour yeah that seems reasonable, thanks.

Solution patch:
diff --git a/api/v1alpha1/generated.pb.go b/api/v1alpha1/generated.pb.go
index 1e9d6cec..4a85c659 100644
--- a/api/v1alpha1/generated.pb.go
+++ b/api/v1alpha1/generated.pb.go
@@ -506,10 +506,38 @@ func (m *DiscoveredImageReference) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_DiscoveredImageReference proto.InternalMessageInfo
 
+func (m *ExpressionVariable) Reset()      { *m = ExpressionVariable{} }
+func (*ExpressionVariable) ProtoMessage() {}
+func (*ExpressionVariable) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e26b7f7bbc391025, []int{17}
+}
+func (m *ExpressionVariable) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *ExpressionVariable) 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 *ExpressionVariable) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExpressionVariable.Merge(m, src)
+}
+func (m *ExpressionVariable) XXX_Size() int {
+	return m.Size()
+}
+func (m *ExpressionVariable) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExpressionVariable.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExpressionVariable proto.InternalMessageInfo
+
 func (m *Freight) Reset()      { *m = Freight{} }
 func (*Freight) ProtoMessage() {}
 func (*Freight) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e26b7f7bbc391025, []int{17}
+	return fileDescriptor_e26b7f7bbc391025, []int{18}
 }
 func (m *Freight) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -537,7 +565,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{18}
+	return fileDescriptor_e26b7f7bbc391025, []int{19}
 }
 func (m *FreightCollection) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -565,7 +593,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{19}
+	return fileDescriptor_e26b7f7bbc391025, []int{20}
 }
 func (m *FreightList) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -593,7 +621,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{20}
+	return fileDescriptor_e26b7f7bbc391025, []int{21}
 }
 func (m *FreightOrigin) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -621,7 +649,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{21}
+	return fileDescriptor_e26b7f7bbc391025, []int{22}
 }
 func (m *FreightReference) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -649,7 +677,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{22}
+	return fileDescriptor_e26b7f7bbc391025, []int{23}
 }
 func (m *FreightRequest) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -677,7 +705,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{23}
+	return fileDescriptor_e26b7f7bbc391025, []int{24}
 }
 func (m *FreightSources) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -705,7 +733,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{24}
+	return fileDescriptor_e26b7f7bbc391025, []int{25}
 }
 func (m *FreightStatus) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -733,7 +761,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{25}
+	return fileDescriptor_e26b7f7bbc391025, []int{26}
 }
 func (m *GitCommit) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -761,7 +789,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{26}
+	return fileDescriptor_e26b7f7bbc391025, []int{27}
 }
 func (m *GitDiscoveryResult) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -789,7 +817,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{27}
+	return fileDescriptor_e26b7f7bbc391025, []int{28}
 }
 func (m *GitSubscription) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -817,7 +845,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{28}
+	return fileDescriptor_e26b7f7bbc391025, []int{29}
 }
 func (m *Health) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -845,7 +873,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{29}
+	return fileDescriptor_e26b7f7bbc391025, []int{30}
 }
 func (m *HealthCheckStep) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -873,7 +901,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{30}
+	return fileDescriptor_e26b7f7bbc391025, []int{31}
 }
 func (m *Image) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -901,7 +929,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{31}
+	return fileDescriptor_e26b7f7bbc391025, []int{32}
 }
 func (m *ImageDiscoveryResult) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -929,7 +957,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{32}
+	return fileDescriptor_e26b7f7bbc391025, []int{33}
 }
 func (m *ImageSubscription) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -957,7 +985,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{33}
+	return fileDescriptor_e26b7f7bbc391025, []int{34}
 }
 func (m *Project) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -985,7 +1013,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{34}
+	return fileDescriptor_e26b7f7bbc391025, []int{35}
 }
 func (m *ProjectList) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1013,7 +1041,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{35}
+	return fileDescriptor_e26b7f7bbc391025, []int{36}
 }
 func (m *ProjectSpec) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1041,7 +1069,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{36}
+	return fileDescriptor_e26b7f7bbc391025, []int{37}
 }
 func (m *ProjectStatus) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1069,7 +1097,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{37}
+	return fileDescriptor_e26b7f7bbc391025, []int{38}
 }
 func (m *Promotion) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1097,7 +1125,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{38}
+	return fileDescriptor_e26b7f7bbc391025, []int{39}
 }
 func (m *PromotionList) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1125,7 +1153,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{39}
+	return fileDescriptor_e26b7f7bbc391025, []int{40}
 }
 func (m *PromotionPolicy) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1153,7 +1181,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{40}
+	return fileDescriptor_e26b7f7bbc391025, []int{41}
 }
 func (m *PromotionReference) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1181,7 +1209,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{41}
+	return fileDescriptor_e26b7f7bbc391025, []int{42}
 }
 func (m *PromotionSpec) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1209,7 +1237,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{42}
+	return fileDescriptor_e26b7f7bbc391025, []int{43}
 }
 func (m *PromotionStatus) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1237,7 +1265,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{43}
+	return fileDescriptor_e26b7f7bbc391025, []int{44}
 }
 func (m *PromotionStep) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1265,7 +1293,7 @@ var xxx_messageInfo_PromotionStep proto.InternalMessageInfo
 func (m *PromotionStepRetry) Reset()      { *m = PromotionStepRetry{} }
 func (*PromotionStepRetry) ProtoMessage() {}
 func (*PromotionStepRetry) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e26b7f7bbc391025, []int{44}
+	return fileDescriptor_e26b7f7bbc391025, []int{45}
 }
 func (m *PromotionStepRetry) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1293,7 +1321,7 @@ var xxx_messageInfo_PromotionStepRetry proto.InternalMessageInfo
 func (m *PromotionTask) Reset()      { *m = PromotionTask{} }
 func (*PromotionTask) ProtoMessage() {}
 func (*PromotionTask) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e26b7f7bbc391025, []int{45}
+	return fileDescriptor_e26b7f7bbc391025, []int{46}
 }
 func (m *PromotionTask) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1321,7 +1349,7 @@ var xxx_messageInfo_PromotionTask proto.InternalMessageInfo
 func (m *PromotionTaskList) Reset()      { *m = PromotionTaskList{} }
 func (*PromotionTaskList) ProtoMessage() {}
 func (*PromotionTaskList) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e26b7f7bbc391025, []int{46}
+	return fileDescriptor_e26b7f7bbc391025, []int{47}
 }
 func (m *PromotionTaskList) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1349,7 +1377,7 @@ var xxx_messageInfo_PromotionTaskList proto.InternalMessageInfo
 func (m *PromotionTaskReference) Reset()      { *m = PromotionTaskReference{} }
 func (*PromotionTaskReference) ProtoMessage() {}
 func (*PromotionTaskReference) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e26b7f7bbc391025, []int{47}
+	return fileDescriptor_e26b7f7bbc391025, []int{48}
 }
 func (m *PromotionTaskReference) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1377,7 +1405,7 @@ var xxx_messageInfo_PromotionTaskReference proto.InternalMessageInfo
 func (m *PromotionTaskSpec) Reset()      { *m = PromotionTaskSpec{} }
 func (*PromotionTaskSpec) ProtoMessage() {}
 func (*PromotionTaskSpec) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e26b7f7bbc391025, []int{48}
+	return fileDescriptor_e26b7f7bbc391025, []int{49}
 }
 func (m *PromotionTaskSpec) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1405,7 +1433,7 @@ var xxx_messageInfo_PromotionTaskSpec proto.InternalMessageInfo
 func (m *PromotionTemplate) Reset()      { *m = PromotionTemplate{} }
 func (*PromotionTemplate) ProtoMessage() {}
 func (*PromotionTemplate) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e26b7f7bbc391025, []int{49}
+	return fileDescriptor_e26b7f7bbc391025, []int{50}
 }
 func (m *PromotionTemplate) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1433,7 +1461,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{50}
+	return fileDescriptor_e26b7f7bbc391025, []int{51}
 }
 func (m *PromotionTemplateSpec) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1458,34 +1486,6 @@ func (m *PromotionTemplateSpec) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_PromotionTemplateSpec proto.InternalMessageInfo
 
-func (m *ExpressionVariable) Reset()      { *m = ExpressionVariable{} }
-func (*ExpressionVariable) ProtoMessage() {}
-func (*ExpressionVariable) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e26b7f7bbc391025, []int{51}
-}
-func (m *ExpressionVariable) XXX_Unmarshal(b []byte) error {
-	return m.Unmarshal(b)
-}
-func (m *ExpressionVariable) 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 *ExpressionVariable) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExpressionVariable.Merge(m, src)
-}
-func (m *ExpressionVariable) XXX_Size() int {
-	return m.Size()
-}
-func (m *ExpressionVariable) XXX_DiscardUnknown() {
-	xxx_messageInfo_ExpressionVariable.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_ExpressionVariable proto.InternalMessageInfo
-
 func (m *RepoSubscription) Reset()      { *m = RepoSubscription{} }
 func (*RepoSubscription) ProtoMessage() {}
 func (*RepoSubscription) Descriptor() ([]byte, []int) {
@@ -1871,6 +1871,7 @@ func init() {
 	proto.RegisterType((*DiscoveredCommit)(nil), "github.com.akuity.kargo.api.v1alpha1.DiscoveredCommit")
 	proto.RegisterType((*DiscoveredImageReference)(nil), "github.com.akuity.kargo.api.v1alpha1.DiscoveredImageReference")
 	proto.RegisterMapType((map[string]string)(nil), "github.com.akuity.kargo.api.v1alpha1.DiscoveredImageReference.AnnotationsEntry")
+	proto.RegisterType((*ExpressionVariable)(nil), "github.com.akuity.kargo.api.v1alpha1.ExpressionVariable")
 	proto.RegisterType((*Freight)(nil), "github.com.akuity.kargo.api.v1alpha1.Freight")
 	proto.RegisterType((*FreightCollection)(nil), "github.com.akuity.kargo.api.v1alpha1.FreightCollection")
 	proto.RegisterMapType((map[string]FreightReference)(nil), "github.com.akuity.kargo.api.v1alpha1.FreightCollection.ItemsEntry")
@@ -1910,7 +1911,6 @@ func init() {
 	proto.RegisterType((*PromotionTaskSpec)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTaskSpec")
 	proto.RegisterType((*PromotionTemplate)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTemplate")
 	proto.RegisterType((*PromotionTemplateSpec)(nil), "github.com.akuity.kargo.api.v1alpha1.PromotionTemplateSpec")
-	proto.RegisterType((*ExpressionVariable)(nil), "github.com.akuity.kargo.api.v1alpha1.ExpressionVariable")
 	proto.RegisterType((*RepoSubscription)(nil), "github.com.akuity.kargo.api.v1alpha1.RepoSubscription")
 	proto.RegisterType((*Stage)(nil), "github.com.akuity.kargo.api.v1alpha1.Stage")
 	proto.RegisterType((*StageList)(nil), "github.com.akuity.kargo.api.v1alpha1.StageList")
@@ -1931,267 +1931,268 @@ func init() {
 }
 
 var fileDescriptor_e26b7f7bbc391025 = []byte{
-	// 4156 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5c, 0xdd, 0x6f, 0x23, 0x47,
-	0x72, 0xdf, 0x21, 0x45, 0x4a, 0x2c, 0x4a, 0xbb, 0x52, 0xaf, 0xd6, 0xd6, 0xc9, 0xf1, 0x6a, 0x33,
-	0x36, 0x0c, 0x3b, 0xb6, 0xa9, 0xac, 0xec, 0xb5, 0xd7, 0x6b, 0x63, 0x03, 0x91, 0xda, 0x0f, 0xed,
-	0xe9, 0xbc, 0x4a, 0x53, 0x5e, 0x9f, 0xd7, 0x36, 0x36, 0x2d, 0xb2, 0x45, 0xce, 0x89, 0x9c, 0xa1,
-	0xa7, 0x9b, 0x3a, 0x2b, 0x09, 0x92, 0xcb, 0x27, 0x0e, 0x09, 0x12, 0xdc, 0x83, 0x01, 0x5f, 0x80,
-	0x04, 0x08, 0x92, 0xc7, 0x03, 0xf2, 0x9a, 0x87, 0x3c, 0xf8, 0x21, 0x2f, 0x46, 0x62, 0x04, 0x46,
-	0x12, 0x20, 0x0e, 0x70, 0xd0, 0xc5, 0x3a, 0x20, 0xff, 0x41, 0x5e, 0x16, 0x08, 0x10, 0xf4, 0xc7,
-	0xcc, 0xf4, 0x0c, 0x87, 0x2b, 0x0e, 0x25, 0x2d, 0x9c, 0x7b, 0x93, 0xba, 0xba, 0x7f, 0xd5, 0x5d,
-	0xdd, 0x55, 0x5d, 0x55, 0x5d, 0x43, 0x78, 0xb5, 0xe5, 0xf0, 0x76, 0x7f, 0xbb, 0xd2, 0xf0, 0xba,
-	0xcb, 0x64, 0xb7, 0xef, 0xf0, 0xfd, 0xe5, 0x5d, 0xe2, 0xb7, 0xbc, 0x65, 0xd2, 0x73, 0x96, 0xf7,
-	0x2e, 0x93, 0x4e, 0xaf, 0x4d, 0x2e, 0x2f, 0xb7, 0xa8, 0x4b, 0x7d, 0xc2, 0x69, 0xb3, 0xd2, 0xf3,
-	0x3d, 0xee, 0xa1, 0x67, 0xa3, 0x51, 0x15, 0x35, 0xaa, 0x22, 0x47, 0x55, 0x48, 0xcf, 0xa9, 0x04,
-	0xa3, 0x16, 0x5f, 0x36, 0xb0, 0x5b, 0x5e, 0xcb, 0x5b, 0x96, 0x83, 0xb7, 0xfb, 0x3b, 0xf2, 0x3f,
-	0xf9, 0x8f, 0xfc, 0x4b, 0x81, 0x2e, 0xde, 0xde, 0xbd, 0xca, 0x2a, 0x8e, 0xe4, 0x4c, 0x3f, 0xe6,
-	0xd4, 0x65, 0x8e, 0xe7, 0xb2, 0x97, 0x49, 0xcf, 0x61, 0xd4, 0xdf, 0xa3, 0xfe, 0x72, 0x6f, 0xb7,
-	0x25, 0x68, 0x2c, 0xde, 0x61, 0x79, 0x6f, 0x60, 0x7a, 0x8b, 0xaf, 0x46, 0x48, 0x5d, 0xd2, 0x68,
-	0x3b, 0x2e, 0xf5, 0xf7, 0xa3, 0xe1, 0x5d, 0xca, 0x49, 0xda, 0xa8, 0xe5, 0x61, 0xa3, 0xfc, 0xbe,
-	0xcb, 0x9d, 0x2e, 0x1d, 0x18, 0xf0, 0xda, 0x51, 0x03, 0x58, 0xa3, 0x4d, 0xbb, 0x24, 0x39, 0xce,
-	0xfe, 0x00, 0xce, 0xaf, 0xba, 0xa4, 0xb3, 0xcf, 0x1c, 0x86, 0xfb, 0xee, 0xaa, 0xdf, 0xea, 0x77,
-	0xa9, 0xcb, 0xd1, 0x25, 0x98, 0x70, 0x49, 0x97, 0x2e, 0x58, 0x97, 0xac, 0xe7, 0x4b, 0xd5, 0xe9,
-	0xcf, 0x0f, 0x96, 0xce, 0x1c, 0x1e, 0x2c, 0x4d, 0xbc, 0x4d, 0xba, 0x14, 0x4b, 0x0a, 0x7a, 0x06,
-	0x0a, 0x7b, 0xa4, 0xd3, 0xa7, 0x0b, 0x39, 0xd9, 0x65, 0x46, 0x77, 0x29, 0xdc, 0x13, 0x8d, 0x58,
-	0xd1, 0xec, 0x3f, 0xc8, 0xc7, 0xe0, 0xbf, 0x43, 0x39, 0x69, 0x12, 0x4e, 0x50, 0x17, 0x8a, 0x1d,
-	0xb2, 0x4d, 0x3b, 0x6c, 0xc1, 0xba, 0x94, 0x7f, 0xbe, 0xbc, 0x72, 0xa3, 0x32, 0xca, 0x26, 0x56,
-	0x52, 0xa0, 0x2a, 0x1b, 0x12, 0xe7, 0x86, 0xcb, 0xfd, 0xfd, 0xea, 0x59, 0x3d, 0x89, 0xa2, 0x6a,
-	0xc4, 0x9a, 0x09, 0xfa, 0x3d, 0x0b, 0xca, 0xc4, 0x75, 0x3d, 0x4e, 0xb8, 0xd8, 0xa6, 0x85, 0x9c,
-	0x64, 0x7a, 0x67, 0x7c, 0xa6, 0xab, 0x11, 0x98, 0xe2, 0x7c, 0x5e, 0x73, 0x2e, 0x1b, 0x14, 0x6c,
-	0xf2, 0x5c, 0x7c, 0x03, 0xca, 0xc6, 0x54, 0xd1, 0x2c, 0xe4, 0x77, 0xe9, 0xbe, 0x92, 0x2f, 0x16,
-	0x7f, 0xa2, 0xf9, 0x98, 0x40, 0xb5, 0x04, 0xaf, 0xe5, 0xae, 0x5a, 0x8b, 0xd7, 0x61, 0x36, 0xc9,
-	0x30, 0xcb, 0x78, 0xfb, 0xcf, 0x2d, 0x98, 0x37, 0x56, 0x81, 0xe9, 0x0e, 0xf5, 0xa9, 0xdb, 0xa0,
-	0x68, 0x19, 0x4a, 0x62, 0x2f, 0x59, 0x8f, 0x34, 0x82, 0xad, 0x9e, 0xd3, 0x0b, 0x29, 0xbd, 0x1d,
-	0x10, 0x70, 0xd4, 0x27, 0x3c, 0x16, 0xb9, 0x47, 0x1d, 0x8b, 0x5e, 0x9b, 0x30, 0xba, 0x90, 0x8f,
-	0x1f, 0x8b, 0x4d, 0xd1, 0x88, 0x15, 0xcd, 0x7e, 0x00, 0xdf, 0x0a, 0xe6, 0xb3, 0x45, 0xbb, 0xbd,
-	0x0e, 0xe1, 0x34, 0x9a, 0xd4, 0xd1, 0x47, 0xef, 0x12, 0x4c, 0xec, 0x3a, 0x6e, 0x33, 0x39, 0x8b,
-	0x6f, 0x3b, 0x6e, 0x13, 0x4b, 0x8a, 0xbd, 0x0b, 0x33, 0xab, 0xbd, 0x9e, 0xef, 0xed, 0xd1, 0x66,
-	0x9d, 0x93, 0x16, 0x45, 0xf7, 0x01, 0x88, 0x6e, 0x58, 0xe5, 0x12, 0xba, 0xbc, 0xf2, 0x2b, 0x15,
-	0xa5, 0x33, 0x15, 0x53, 0x67, 0x2a, 0xbd, 0xdd, 0x96, 0x68, 0x60, 0x15, 0xa1, 0x9a, 0x95, 0xbd,
-	0xcb, 0x95, 0x2d, 0xa7, 0x4b, 0xab, 0x67, 0x0f, 0x0f, 0x96, 0x60, 0x35, 0x44, 0xc0, 0x06, 0x9a,
-	0xfd, 0xfb, 0x16, 0x5c, 0x58, 0xf5, 0x5b, 0x5e, 0x6d, 0x6d, 0xb5, 0xd7, 0xbb, 0x4d, 0x49, 0x87,
-	0xb7, 0xeb, 0x9c, 0xf0, 0x3e, 0x43, 0xd7, 0xa1, 0xc8, 0xe4, 0x5f, 0x7a, 0x31, 0xcf, 0x05, 0xe7,
-	0x53, 0xd1, 0x1f, 0x1e, 0x2c, 0xcd, 0xa7, 0x0c, 0xa4, 0x58, 0x8f, 0x42, 0x2f, 0xc0, 0x64, 0x97,
-	0x32, 0x46, 0x5a, 0x81, 0xc4, 0xcf, 0x69, 0x80, 0xc9, 0xef, 0xa8, 0x66, 0x1c, 0xd0, 0xed, 0x7f,
-	0xca, 0xc1, 0xb9, 0x10, 0x4b, 0xb3, 0x3f, 0x85, 0xed, 0xed, 0xc3, 0x74, 0xdb, 0x58, 0xa1, 0xdc,
-	0xe5, 0xf2, 0xca, 0x9b, 0x23, 0x6a, 0x52, 0x9a, 0x90, 0xaa, 0xf3, 0x9a, 0xcd, 0xb4, 0xd9, 0x8a,
-	0x63, 0x6c, 0x50, 0x17, 0x80, 0xed, 0xbb, 0x0d, 0xcd, 0x74, 0x42, 0x32, 0x7d, 0x23, 0x23, 0xd3,
-	0x7a, 0x08, 0x50, 0x45, 0x9a, 0x25, 0x44, 0x6d, 0xd8, 0x60, 0x60, 0xff, 0x9d, 0x05, 0xe7, 0x53,
-	0xc6, 0xa1, 0xb7, 0x12, 0xfb, 0xf9, 0xec, 0xc0, 0x7e, 0xa2, 0x81, 0x61, 0xd1, 0x6e, 0xbe, 0x04,
-	0x53, 0x3e, 0xdd, 0x73, 0xc4, 0x4d, 0xa1, 0x25, 0x3c, 0xab, 0xc7, 0x4f, 0x61, 0xdd, 0x8e, 0xc3,
-	0x1e, 0xe8, 0x45, 0x28, 0x05, 0x7f, 0x0b, 0x31, 0xe7, 0x85, 0x32, 0x89, 0x8d, 0x0b, 0xba, 0x32,
-	0x1c, 0xd1, 0xed, 0xdf, 0x85, 0x42, 0xad, 0x4d, 0x7c, 0x2e, 0x4e, 0x8c, 0x4f, 0x7b, 0xde, 0x3b,
-	0x78, 0x43, 0x4f, 0x31, 0x3c, 0x31, 0x58, 0x35, 0xe3, 0x80, 0x3e, 0xc2, 0x66, 0xbf, 0x00, 0x93,
-	0x7b, 0xd4, 0x97, 0xf3, 0xcd, 0xc7, 0xc1, 0xee, 0xa9, 0x66, 0x1c, 0xd0, 0xed, 0x7f, 0xb3, 0x60,
-	0x5e, 0xce, 0x60, 0xcd, 0x61, 0x0d, 0x6f, 0x8f, 0xfa, 0xfb, 0x98, 0xb2, 0x7e, 0xe7, 0x84, 0x27,
-	0xb4, 0x06, 0xb3, 0x8c, 0x76, 0xf7, 0xa8, 0x5f, 0xf3, 0x5c, 0xc6, 0x7d, 0xe2, 0xb8, 0x5c, 0xcf,
-	0x6c, 0x41, 0xf7, 0x9e, 0xad, 0x27, 0xe8, 0x78, 0x60, 0x04, 0x7a, 0x1e, 0xa6, 0xf4, 0xb4, 0xc5,
-	0x51, 0x12, 0x82, 0x9d, 0x16, 0x7b, 0xa0, 0xd7, 0xc4, 0x70, 0x48, 0xb5, 0xff, 0xdb, 0x82, 0x39,
-	0xb9, 0xaa, 0x7a, 0x7f, 0x9b, 0x35, 0x7c, 0xa7, 0x27, 0x0c, 0xf0, 0x37, 0x71, 0x49, 0xd7, 0xe1,
-	0x6c, 0x33, 0x10, 0xfc, 0x86, 0xd3, 0x75, 0xb8, 0xd4, 0x91, 0x42, 0xf5, 0x09, 0x8d, 0x71, 0x76,
-	0x2d, 0x46, 0xc5, 0x89, 0xde, 0x6a, 0xfb, 0x3a, 0x7d, 0xc6, 0xa9, 0xbf, 0xe9, 0x7b, 0x5d, 0x4f,
-	0xac, 0x73, 0x8b, 0xb0, 0x5d, 0xf4, 0x1b, 0x30, 0xd5, 0xd5, 0x97, 0x9e, 0xb6, 0x9a, 0xbf, 0x3a,
-	0x9a, 0xd5, 0xbc, 0xbb, 0xfd, 0x3d, 0xda, 0xe0, 0xe2, 0xc2, 0x8c, 0xb4, 0x2d, 0x6a, 0xc3, 0x21,
-	0x2a, 0x7a, 0x0f, 0x26, 0x58, 0x8f, 0x36, 0xa4, 0x88, 0xca, 0x2b, 0xaf, 0x8f, 0xa6, 0xd4, 0xb1,
-	0x49, 0xd6, 0x7b, 0xb4, 0x11, 0xc9, 0x56, 0xfc, 0x87, 0x25, 0xa4, 0xfd, 0x9f, 0x16, 0x2c, 0xa4,
-	0xad, 0x6a, 0xc3, 0x61, 0x1c, 0x7d, 0x30, 0xb0, 0xb2, 0xca, 0x68, 0x2b, 0x13, 0xa3, 0xe5, 0xba,
-	0x42, 0xed, 0x0d, 0x5a, 0x8c, 0x55, 0x3d, 0x80, 0x82, 0xc3, 0x69, 0x37, 0x70, 0x35, 0xae, 0x8d,
-	0xb6, 0xac, 0xb4, 0xc9, 0x46, 0x57, 0xe8, 0xba, 0x00, 0xc4, 0x0a, 0xd7, 0x7e, 0x1f, 0xa6, 0x6b,
-	0x7d, 0xdf, 0xa7, 0x2e, 0x57, 0x17, 0xdc, 0xb7, 0xa1, 0xc0, 0x1c, 0x57, 0xdb, 0xf9, 0x6c, 0x77,
-	0x5b, 0x49, 0x80, 0xd7, 0xc5, 0x60, 0xac, 0x30, 0xec, 0xbf, 0xcc, 0xc3, 0xf9, 0xe0, 0xc4, 0xd0,
-	0xe6, 0xaa, 0xcf, 0x9d, 0x1d, 0xd2, 0xe0, 0x0c, 0x35, 0x61, 0xba, 0x19, 0x35, 0x73, 0x6d, 0x88,
-	0xb3, 0xf0, 0x0a, 0x8d, 0xbd, 0x01, 0xcf, 0x71, 0x0c, 0x15, 0xbd, 0x0b, 0xf9, 0x96, 0xc3, 0xb5,
-	0x67, 0x78, 0x75, 0x34, 0xc9, 0xdd, 0x72, 0x92, 0x96, 0xa7, 0x5a, 0xd6, 0xac, 0xf2, 0xb7, 0x1c,
-	0x8e, 0x05, 0x22, 0xda, 0x86, 0xa2, 0xd3, 0x25, 0x2d, 0x9a, 0x71, 0x57, 0xd6, 0xc5, 0x98, 0x24,
-	0x7a, 0xe8, 0x6a, 0x4a, 0x2a, 0xc3, 0x1a, 0x59, 0xf0, 0x68, 0x08, 0x8b, 0xa1, 0x6c, 0xf6, 0xe8,
-	0x3b, 0x9f, 0x62, 0x3b, 0x23, 0x1e, 0x92, 0xca, 0xb0, 0x46, 0xb6, 0xbf, 0xca, 0xc1, 0x6c, 0x24,
-	0xbf, 0x9a, 0xd7, 0xed, 0x3a, 0x1c, 0x2d, 0x42, 0xce, 0x69, 0x6a, 0x83, 0x04, 0x7a, 0x60, 0x6e,
-	0x7d, 0x0d, 0xe7, 0x9c, 0x26, 0x7a, 0x0e, 0x8a, 0xdb, 0x3e, 0x71, 0x1b, 0x6d, 0x6d, 0x88, 0x42,
-	0xe0, 0xaa, 0x6c, 0xc5, 0x9a, 0x8a, 0x9e, 0x86, 0x3c, 0x27, 0x2d, 0x6d, 0x7f, 0x42, 0xf9, 0x6d,
-	0x91, 0x16, 0x16, 0xed, 0xc2, 0xf0, 0xb1, 0xbe, 0xd4, 0x61, 0xb9, 0xf3, 0x86, 0xe1, 0xab, 0xab,
-	0x66, 0x1c, 0xd0, 0x05, 0x47, 0xd2, 0xe7, 0x6d, 0xcf, 0x5f, 0x28, 0xc4, 0x39, 0xae, 0xca, 0x56,
-	0xac, 0xa9, 0xc2, 0x45, 0x69, 0xc8, 0xf9, 0x73, 0xea, 0x2f, 0x14, 0xe3, 0x2e, 0x4a, 0x2d, 0x20,
-	0xe0, 0xa8, 0x0f, 0xfa, 0x10, 0xca, 0x0d, 0x9f, 0x12, 0xee, 0xf9, 0x6b, 0x84, 0xd3, 0x85, 0xc9,
-	0xcc, 0x27, 0xf0, 0x9c, 0xf0, 0xd2, 0x6b, 0x11, 0x04, 0x36, 0xf1, 0xec, 0xbf, 0xcf, 0xc3, 0x42,
-	0x24, 0x5a, 0xb9, 0xb7, 0x91, 0x67, 0xaa, 0xc5, 0x63, 0x0d, 0x11, 0xcf, 0x73, 0x50, 0x6c, 0x3a,
-	0x2d, 0xca, 0x78, 0x52, 0xca, 0x6b, 0xb2, 0x15, 0x6b, 0x2a, 0xfa, 0xe3, 0x44, 0x34, 0x52, 0x90,
-	0x07, 0xe5, 0xee, 0x68, 0x07, 0x65, 0xd8, 0xe4, 0xc6, 0x08, 0x49, 0xd0, 0x0a, 0x40, 0xcb, 0xe1,
-	0xfa, 0xd2, 0xd2, 0xbb, 0x1e, 0x1a, 0xeb, 0x5b, 0x21, 0x05, 0x1b, 0xbd, 0xd0, 0xbb, 0x50, 0x92,
-	0xf2, 0x1a, 0x53, 0xff, 0xa5, 0x0b, 0x53, 0x0b, 0x00, 0x70, 0x84, 0x75, 0xec, 0x20, 0xe7, 0xcb,
-	0x09, 0x98, 0xbc, 0xe9, 0x53, 0xa7, 0xd5, 0xe6, 0x8f, 0xe1, 0xd6, 0x7a, 0x06, 0x0a, 0xa4, 0xe3,
-	0x10, 0x26, 0x0f, 0xa0, 0x11, 0xe6, 0xac, 0x8a, 0x46, 0xac, 0x68, 0xe8, 0x7d, 0x28, 0x7a, 0xbe,
-	0xd3, 0x72, 0xdc, 0x85, 0x92, 0x9c, 0xc4, 0x2b, 0xa3, 0x6d, 0xb1, 0x5e, 0xc5, 0x5d, 0x39, 0x34,
-	0x3a, 0x45, 0xea, 0x7f, 0xac, 0x21, 0xd1, 0x7d, 0x98, 0x54, 0x5a, 0x11, 0x58, 0x9a, 0xe5, 0x91,
-	0x2d, 0xa5, 0x52, 0xac, 0x48, 0x7b, 0xd5, 0xff, 0x0c, 0x07, 0x80, 0xa8, 0x1e, 0x1a, 0xca, 0x09,
-	0x09, 0xfd, 0x62, 0x06, 0x43, 0x39, 0xd4, 0x32, 0xd6, 0x43, 0xcb, 0x58, 0xc8, 0x02, 0x2a, 0x6d,
-	0xdf, 0x30, 0x53, 0x28, 0x44, 0xac, 0x3d, 0xf2, 0xe2, 0x18, 0x22, 0xd6, 0xe1, 0xc0, 0xd9, 0xb8,
-	0x1b, 0x1f, 0x38, 0xec, 0xf6, 0x27, 0x79, 0x98, 0xd3, 0x3d, 0x6b, 0x5e, 0xa7, 0x43, 0x1b, 0xd2,
-	0xfd, 0x53, 0x86, 0x36, 0x9f, 0x6a, 0x68, 0x9d, 0xe0, 0xda, 0x57, 0x97, 0x57, 0x35, 0xd3, 0x6c,
-	0x22, 0x1e, 0x15, 0x79, 0xd5, 0x2b, 0x35, 0x0e, 0x77, 0x49, 0xf7, 0xd2, 0x0e, 0x00, 0xfa, 0x23,
-	0x0b, 0xce, 0xef, 0x51, 0xdf, 0xd9, 0x71, 0x1a, 0x52, 0x65, 0x6e, 0x3b, 0x8c, 0x7b, 0xfe, 0xbe,
-	0xbe, 0xda, 0x5e, 0x1b, 0x8d, 0xf3, 0x3d, 0x03, 0x60, 0xdd, 0xdd, 0xf1, 0xaa, 0x4f, 0x69, 0x6e,
-	0xe7, 0xef, 0x0d, 0x42, 0xe3, 0x34, 0x7e, 0x8b, 0x3d, 0x80, 0x68, 0xb6, 0x29, 0x1a, 0xbb, 0x61,
-	0x6a, 0xec, 0xc8, 0x13, 0x0b, 0x16, 0x1b, 0x98, 0x37, 0x53, 0xd3, 0x3f, 0xb3, 0xa0, 0xac, 0xe9,
-	0x8f, 0xc1, 0x93, 0xc3, 0x71, 0x4f, 0xee, 0xe5, 0x4c, 0xf3, 0x1f, 0xe2, 0xbc, 0xf9, 0x30, 0x13,
-	0x53, 0x72, 0x74, 0x45, 0x67, 0x34, 0xd4, 0xd5, 0xf2, 0xcb, 0x66, 0x46, 0xe3, 0xe1, 0xc1, 0xd2,
-	0x5c, 0xac, 0x73, 0x94, 0xe6, 0x38, 0x3a, 0xbc, 0xb8, 0x36, 0xf5, 0xe3, 0xbf, 0x5e, 0x3a, 0xf3,
-	0x83, 0x9f, 0x5e, 0x3a, 0x63, 0x7f, 0x9a, 0x87, 0xd9, 0xa4, 0x54, 0x47, 0xc8, 0xb5, 0x44, 0x36,
-	0x6c, 0xea, 0x54, 0x6d, 0x58, 0xee, 0xf4, 0x6c, 0x58, 0xfe, 0x34, 0x6c, 0xd8, 0xc4, 0x89, 0xd9,
-	0x30, 0xfb, 0x5f, 0x2c, 0x38, 0x1b, 0xee, 0xcc, 0x47, 0x7d, 0xe1, 0x22, 0x44, 0x52, 0xb7, 0x4e,
-	0x5e, 0xea, 0x0f, 0x60, 0x92, 0x79, 0x7d, 0xbf, 0x21, 0xfd, 0x60, 0x81, 0xfe, 0x6a, 0x36, 0xa3,
-	0xa9, 0xc6, 0x1a, 0xce, 0x9f, 0x6a, 0xc0, 0x01, 0xaa, 0xfd, 0x59, 0x2e, 0x5c, 0x90, 0xa6, 0x29,
-	0xdf, 0xc8, 0x17, 0x9e, 0xa3, 0x58, 0xd0, 0x94, 0xe9, 0x1b, 0x89, 0x56, 0xac, 0xa9, 0xc8, 0x96,
-	0xf6, 0x3c, 0x70, 0xd1, 0x4b, 0x55, 0xd0, 0x66, 0x59, 0x6e, 0x82, 0xa2, 0xa0, 0x1e, 0xcc, 0xfa,
-	0xf4, 0xa3, 0xbe, 0xe3, 0xd3, 0x66, 0xdd, 0x23, 0xbb, 0xc2, 0xaf, 0xd0, 0x79, 0xa8, 0x11, 0xf5,
-	0x7e, 0xad, 0xef, 0x4b, 0x13, 0x56, 0x9d, 0x17, 0xe1, 0x35, 0x4e, 0x60, 0xe1, 0x01, 0x74, 0xe4,
-	0xc1, 0x3c, 0xd9, 0x23, 0x4e, 0x87, 0x6c, 0x3b, 0x1d, 0x87, 0xef, 0xd7, 0xb9, 0x4f, 0x38, 0x6d,
-	0xed, 0x6b, 0x2f, 0xf8, 0x4d, 0xbd, 0x96, 0xf9, 0xd5, 0x94, 0x3e, 0x0f, 0x0f, 0x96, 0x9e, 0xd2,
-	0xb2, 0x48, 0x23, 0xe3, 0x54, 0x60, 0xfb, 0x67, 0x85, 0xd0, 0x42, 0xe8, 0xd4, 0xd3, 0x6f, 0x41,
-	0xb9, 0xa1, 0xe2, 0xbd, 0xce, 0xfe, 0xba, 0xab, 0xcf, 0xf4, 0xda, 0x18, 0xb7, 0x5d, 0xa5, 0x16,
-	0xc1, 0x24, 0x1c, 0x45, 0x83, 0x82, 0x4d, 0x6e, 0xe8, 0xfb, 0x00, 0xca, 0xf4, 0xd3, 0xe6, 0xba,
-	0xab, 0xef, 0xb6, 0xda, 0x38, 0xbc, 0xef, 0x85, 0x28, 0x8a, 0x75, 0xe8, 0x64, 0x45, 0x04, 0x6c,
-	0xb0, 0x12, 0xab, 0x0e, 0x12, 0xad, 0x37, 0x3d, 0x5f, 0x1b, 0x89, 0xb1, 0x56, 0xbd, 0x1a, 0xc1,
-	0x24, 0xdd, 0xe3, 0x88, 0x82, 0x4d, 0x6e, 0x8b, 0x3e, 0xcc, 0x26, 0x65, 0x95, 0x72, 0xbf, 0xdd,
-	0x8e, 0xdf, 0x6f, 0x2b, 0x23, 0x5a, 0x04, 0x23, 0x76, 0x37, 0x53, 0xfd, 0x3e, 0x9c, 0x4b, 0xc8,
-	0x28, 0x85, 0xe5, 0x7a, 0x9c, 0xe5, 0x2b, 0x59, 0xee, 0x7a, 0x9d, 0x10, 0x37, 0x79, 0x32, 0x98,
-	0x4d, 0x4a, 0xe7, 0xc4, 0x98, 0xc6, 0xb2, 0xf0, 0xe6, 0x25, 0xfe, 0x57, 0x39, 0x28, 0x85, 0x66,
-	0x3c, 0x4b, 0x4a, 0x4d, 0xb9, 0x5f, 0xb9, 0x23, 0xe2, 0xdc, 0xfc, 0x28, 0x71, 0xee, 0xc4, 0xf0,
-	0x38, 0x37, 0x48, 0xbb, 0x17, 0x1f, 0x9d, 0x76, 0x37, 0xe2, 0xdc, 0xc9, 0xd1, 0xe3, 0xdc, 0xa9,
-	0xa3, 0xe3, 0x5c, 0xfb, 0x6f, 0x2c, 0x40, 0x83, 0x49, 0x8d, 0x2c, 0x82, 0x22, 0xc9, 0xcb, 0xf5,
-	0xb5, 0xac, 0x11, 0xe6, 0x51, 0x77, 0xac, 0xfd, 0x59, 0x01, 0xce, 0xdd, 0x72, 0xc6, 0xce, 0x8e,
-	0x72, 0x78, 0x52, 0x21, 0xd5, 0xa9, 0x76, 0x7c, 0x43, 0xcb, 0xaa, 0xf6, 0xf7, 0x9a, 0x1e, 0xfa,
-	0x64, 0x2d, 0xbd, 0xdb, 0xc3, 0xe1, 0x24, 0x3c, 0x0c, 0x7a, 0xe4, 0x43, 0xf2, 0x26, 0xcc, 0x30,
-	0xee, 0x3b, 0x0d, 0xae, 0xf2, 0xaf, 0x6c, 0xa1, 0x2c, 0x6f, 0xae, 0x0b, 0xba, 0xfb, 0x4c, 0xdd,
-	0x24, 0xe2, 0x78, 0xdf, 0xd4, 0xb4, 0xee, 0x44, 0xe6, 0xb4, 0xee, 0x32, 0x94, 0x48, 0xa7, 0xe3,
-	0x7d, 0x7f, 0x8b, 0xb4, 0x98, 0x4e, 0xa4, 0x84, 0xa7, 0x66, 0x35, 0x20, 0xe0, 0xa8, 0x0f, 0xaa,
-	0x00, 0x38, 0x2d, 0xd7, 0xf3, 0xa9, 0x1c, 0x51, 0x94, 0x57, 0xa8, 0x7c, 0xba, 0x5a, 0x0f, 0x5b,
-	0xb1, 0xd1, 0x03, 0xd5, 0xe1, 0x82, 0xe3, 0x32, 0xda, 0xe8, 0xfb, 0xb4, 0xbe, 0xeb, 0xf4, 0xb6,
-	0x36, 0xea, 0xd2, 0x4a, 0xec, 0xcb, 0xd3, 0x3c, 0x55, 0x7d, 0x5a, 0x33, 0xbb, 0xb0, 0x9e, 0xd6,
-	0x09, 0xa7, 0x8f, 0x45, 0xaf, 0xc2, 0xb4, 0xe3, 0x36, 0x3a, 0xfd, 0x26, 0xdd, 0x24, 0xbc, 0xcd,
-	0x16, 0xa6, 0xe4, 0x34, 0x66, 0x0f, 0x0f, 0x96, 0xa6, 0xd7, 0x8d, 0x76, 0x1c, 0xeb, 0x25, 0x46,
-	0xd1, 0x8f, 0x8d, 0x51, 0xa5, 0x68, 0xd4, 0x8d, 0x8f, 0xcd, 0x51, 0x66, 0xaf, 0x94, 0xc4, 0x37,
-	0x64, 0x4a, 0x7c, 0xff, 0x24, 0x07, 0x45, 0xf5, 0xee, 0x84, 0xae, 0x24, 0x1e, 0x77, 0x9e, 0x1e,
-	0x78, 0xdc, 0x29, 0xa7, 0xbd, 0xd1, 0xd9, 0x50, 0x74, 0x18, 0xeb, 0xc7, 0x3d, 0x96, 0x75, 0xd9,
-	0x82, 0x35, 0x45, 0x26, 0x05, 0x3d, 0x77, 0xc7, 0x69, 0xe9, 0x8c, 0xc9, 0x75, 0xc3, 0x4f, 0x89,
-	0xaa, 0x07, 0x1e, 0x84, 0xe5, 0x05, 0x91, 0xcb, 0x12, 0xeb, 0x20, 0x7c, 0x97, 0x3b, 0xf5, 0xbb,
-	0x6f, 0x2b, 0x1e, 0x35, 0x89, 0x88, 0x35, 0xb2, 0xe0, 0xe1, 0xf5, 0x79, 0xaf, 0xcf, 0xe5, 0x41,
-	0x39, 0x21, 0x1e, 0x77, 0x25, 0x22, 0xd6, 0xc8, 0xf6, 0xa7, 0x16, 0x9c, 0x53, 0x32, 0xa8, 0xb5,
-	0x69, 0x63, 0xb7, 0xce, 0x69, 0x4f, 0x84, 0x10, 0x7d, 0x46, 0x59, 0x32, 0x84, 0x78, 0x87, 0x51,
-	0x86, 0x25, 0xc5, 0x58, 0x7d, 0xee, 0xb4, 0x56, 0x6f, 0x1f, 0xe6, 0xa0, 0x20, 0x7d, 0xf5, 0x2c,
-	0xf6, 0x27, 0x9e, 0xff, 0xca, 0x8d, 0x94, 0xff, 0x3a, 0x22, 0x45, 0x1a, 0xe5, 0x00, 0x27, 0x1e,
-	0x99, 0x03, 0x64, 0x69, 0x29, 0xc0, 0xb7, 0x32, 0x84, 0x28, 0xe3, 0x94, 0x20, 0x1c, 0x37, 0xc5,
-	0xf6, 0x73, 0x0b, 0xe6, 0xd3, 0x92, 0xe1, 0x59, 0x64, 0xfe, 0x12, 0x4c, 0xf5, 0x3a, 0x84, 0xef,
-	0x78, 0x7e, 0x37, 0xf9, 0x08, 0xba, 0xa9, 0xdb, 0x71, 0xd8, 0x03, 0xf9, 0x00, 0x7e, 0x10, 0xac,
-	0x06, 0x81, 0xdc, 0xf5, 0xe3, 0x25, 0x4a, 0xa3, 0x1d, 0x0e, 0x9b, 0x18, 0x36, 0xb8, 0xd8, 0x7f,
-	0x5a, 0x80, 0x39, 0x39, 0x64, 0xdc, 0x6b, 0x6d, 0x9c, 0x63, 0xd5, 0x83, 0x27, 0x64, 0x88, 0x39,
-	0x78, 0x13, 0xaa, 0x93, 0x76, 0x55, 0x8f, 0x7f, 0x62, 0x3d, 0xb5, 0xd7, 0xc3, 0xa1, 0x14, 0x3c,
-	0x04, 0x77, 0xf0, 0x7a, 0x83, 0x5f, 0xbc, 0xeb, 0xcd, 0x3c, 0x6c, 0x93, 0x47, 0x1e, 0xb6, 0xa1,
-	0x97, 0xe1, 0xd4, 0x31, 0x2e, 0xc3, 0xc1, 0x0b, 0xaa, 0x94, 0xe9, 0x82, 0xfa, 0x8b, 0x1c, 0x4c,
-	0x6e, 0xfa, 0x9e, 0x7c, 0x54, 0x39, 0xfd, 0xb4, 0xf6, 0xdd, 0xd8, 0x63, 0xec, 0xe5, 0x91, 0x1f,
-	0x63, 0x05, 0x94, 0x7c, 0x86, 0x9d, 0x8a, 0x3f, 0xc1, 0x1a, 0xf9, 0xd9, 0x7c, 0x96, 0xb0, 0x21,
-	0x80, 0x7c, 0x74, 0x7e, 0xf6, 0x33, 0x0b, 0xca, 0xba, 0xe7, 0x37, 0x36, 0x11, 0xa8, 0xe7, 0x37,
-	0x24, 0x11, 0xf8, 0x67, 0xd1, 0x0a, 0x84, 0xd0, 0xd0, 0xef, 0xc0, 0x5c, 0x2f, 0x78, 0xfc, 0xdd,
-	0xf4, 0x3a, 0x4e, 0xc3, 0xa1, 0x41, 0x2e, 0xf9, 0x4a, 0xc6, 0x97, 0x71, 0x39, 0x7c, 0xbf, 0xfa,
-	0x2d, 0xcd, 0x77, 0x6e, 0x33, 0x89, 0x8b, 0x07, 0x59, 0xd9, 0xff, 0x6e, 0xc1, 0x4c, 0x4c, 0xf6,
-	0xa8, 0x01, 0xd0, 0xf0, 0xdc, 0xa6, 0xc3, 0xc3, 0x3a, 0x94, 0xf2, 0xca, 0xf2, 0x68, 0x52, 0xad,
-	0x05, 0xe3, 0xa2, 0x43, 0x17, 0x36, 0x31, 0x6c, 0xc0, 0xa2, 0x57, 0x82, 0xa2, 0xb1, 0xb8, 0xe7,
-	0xa5, 0x8a, 0xc6, 0x1e, 0x1e, 0x2c, 0x4d, 0xeb, 0x39, 0x99, 0x45, 0x64, 0x59, 0x8a, 0xa3, 0xfe,
-	0x36, 0x07, 0xa5, 0x70, 0xfd, 0x8f, 0x41, 0x8d, 0xde, 0x89, 0xa9, 0xd1, 0x2b, 0x19, 0x77, 0x6e,
-	0x58, 0x3d, 0x03, 0xfa, 0x30, 0xa1, 0x4c, 0x59, 0x8f, 0xc4, 0x11, 0xea, 0xf4, 0x8f, 0x6a, 0xf3,
-	0x55, 0xdf, 0xc7, 0xa0, 0x50, 0x5b, 0x71, 0x85, 0x5a, 0xce, 0xb8, 0x9a, 0x21, 0x2a, 0xf5, 0x43,
-	0x0b, 0xce, 0x25, 0x94, 0x00, 0x3d, 0x03, 0x05, 0x99, 0x3b, 0xd4, 0xe7, 0x2b, 0x1c, 0xa8, 0xb3,
-	0x12, 0x92, 0x86, 0x36, 0x61, 0x9e, 0xf4, 0xb9, 0x17, 0x8e, 0xbd, 0xe1, 0x92, 0xed, 0x0e, 0x55,
-	0xa9, 0x86, 0xa9, 0xea, 0x2f, 0x85, 0x49, 0xbe, 0x94, 0x3e, 0x38, 0x75, 0xa4, 0xfd, 0x45, 0x0e,
-	0x50, 0xd8, 0x98, 0x25, 0xe9, 0xfe, 0x21, 0x4c, 0xee, 0xa8, 0xec, 0xd5, 0xf1, 0x5e, 0x4d, 0xaa,
-	0x65, 0xf3, 0xe1, 0x28, 0xc0, 0x44, 0xef, 0x9d, 0xcc, 0x39, 0x82, 0xc1, 0x33, 0x84, 0xee, 0x03,
-	0xec, 0x38, 0xae, 0xc3, 0xda, 0x63, 0xbe, 0x0f, 0xcb, 0xdb, 0xfc, 0x66, 0x88, 0x80, 0x0d, 0x34,
-	0xfb, 0x93, 0x9c, 0x71, 0x3e, 0xa5, 0xb9, 0x1c, 0x69, 0x5f, 0x5f, 0x88, 0x0b, 0xb3, 0x34, 0xf8,
-	0xa2, 0x66, 0x08, 0x66, 0x62, 0x8f, 0xf8, 0x41, 0x72, 0x3f, 0x6b, 0x2d, 0xd2, 0x3d, 0xe2, 0x3b,
-	0x62, 0xe3, 0xa3, 0x2d, 0xbd, 0x47, 0x7c, 0x86, 0x25, 0x24, 0xfa, 0xae, 0x98, 0x2a, 0xed, 0x05,
-	0x26, 0x34, 0xb3, 0x4d, 0xe0, 0xb4, 0x67, 0xae, 0x8f, 0xf6, 0x18, 0x56, 0x80, 0xf6, 0x27, 0x93,
-	0xc6, 0x81, 0xd7, 0x56, 0xfb, 0x0e, 0xa0, 0x0e, 0x61, 0xfc, 0x36, 0x71, 0x9b, 0xe2, 0x78, 0xd2,
-	0x1d, 0x9f, 0xb2, 0xb6, 0xf6, 0xd0, 0x16, 0x35, 0x0a, 0xda, 0x18, 0xe8, 0x81, 0x53, 0x46, 0xa1,
-	0x2b, 0x71, 0xe3, 0xbc, 0x94, 0x34, 0xce, 0x67, 0x23, 0x6d, 0x1b, 0xcf, 0x3c, 0x9b, 0xc7, 0xbd,
-	0x70, 0x0a, 0xc7, 0xfd, 0xb7, 0x61, 0x6e, 0x27, 0xf9, 0xc2, 0xaa, 0x0b, 0x47, 0x5e, 0x1f, 0xf3,
-	0x81, 0xb6, 0x7a, 0xe1, 0x30, 0x7a, 0x96, 0x8b, 0x9a, 0xf1, 0x20, 0x23, 0xe4, 0x05, 0x15, 0xb3,
-	0x32, 0x64, 0x56, 0xd9, 0x90, 0x91, 0x55, 0x2e, 0x11, 0x6c, 0x27, 0x6b, 0x65, 0x15, 0x24, 0x8e,
-	0x31, 0x48, 0xa8, 0x60, 0xf1, 0x24, 0x55, 0x10, 0x5d, 0x09, 0x5f, 0x21, 0xc4, 0x74, 0xa4, 0x2b,
-	0x9b, 0x1f, 0x78, 0x3f, 0x10, 0x24, 0x6c, 0xf6, 0x43, 0x3f, 0xb2, 0xe0, 0x82, 0x38, 0xac, 0x37,
-	0x3e, 0xa6, 0x8d, 0xbe, 0x90, 0x4a, 0x50, 0x48, 0xbf, 0x50, 0x96, 0xd2, 0x18, 0xb1, 0x7e, 0xb8,
-	0x9e, 0x06, 0x11, 0xf9, 0xe5, 0xa9, 0x64, 0x9c, 0xce, 0x18, 0x3d, 0x90, 0xa6, 0x83, 0x53, 0x19,
-	0xf6, 0x1c, 0x3f, 0x27, 0x51, 0xd2, 0x66, 0x87, 0x2b, 0xb3, 0xc3, 0xa9, 0xfd, 0xb3, 0xbc, 0x69,
-	0xad, 0x46, 0xcb, 0x94, 0xdc, 0x87, 0x09, 0x4e, 0xd8, 0xae, 0xd6, 0x82, 0xb7, 0xc6, 0xa8, 0x85,
-	0x8c, 0x74, 0x41, 0x7a, 0xe2, 0xb2, 0x49, 0x62, 0xa2, 0x45, 0xc8, 0x11, 0x96, 0xcc, 0x9b, 0xaf,
-	0x32, 0x9c, 0x23, 0x4c, 0xe6, 0xd4, 0x77, 0x74, 0x84, 0x14, 0xe5, 0xd4, 0x77, 0x70, 0xce, 0xd9,
-	0x41, 0xef, 0x41, 0xc1, 0xa7, 0xdc, 0xdf, 0xd7, 0xc6, 0xfc, 0xea, 0x18, 0x86, 0x0b, 0x8b, 0xf1,
-	0x4a, 0x44, 0xf2, 0x4f, 0xac, 0x10, 0x43, 0x73, 0x5b, 0x3c, 0x79, 0x73, 0x1b, 0xe5, 0x9c, 0xf2,
-	0xa7, 0x96, 0x73, 0xfa, 0x89, 0x65, 0x5c, 0xef, 0xe1, 0x3a, 0xd1, 0x3b, 0x30, 0xc9, 0x9d, 0x2e,
-	0xf5, 0xfa, 0x3c, 0x9b, 0xcf, 0x14, 0xbe, 0x4a, 0x4a, 0x2b, 0xb6, 0xa5, 0x20, 0x70, 0x80, 0x25,
-	0x02, 0x49, 0xea, 0xfb, 0x9e, 0xbf, 0xd5, 0x16, 0x56, 0xd9, 0xeb, 0x28, 0xc7, 0x64, 0x26, 0x0a,
-	0x24, 0x6f, 0xc4, 0xa8, 0x38, 0xd1, 0xdb, 0xfe, 0xc2, 0xf4, 0xee, 0xfe, 0xff, 0xd7, 0xf6, 0xfe,
-	0xb3, 0x05, 0x73, 0x8f, 0xbb, 0xa8, 0xf7, 0xbb, 0x71, 0x87, 0xf5, 0x95, 0x31, 0xd6, 0x33, 0xc4,
-	0x69, 0xfd, 0x00, 0x9e, 0x48, 0x57, 0xe3, 0x13, 0xf9, 0x1a, 0xe6, 0xf3, 0xa4, 0xac, 0xa4, 0xf3,
-	0x14, 0x68, 0x9f, 0x75, 0x8a, 0xce, 0x4e, 0xee, 0xa4, 0x9d, 0x1d, 0xdf, 0x5c, 0x89, 0xfe, 0x74,
-	0x08, 0x7d, 0xa8, 0x8f, 0x99, 0x95, 0xe5, 0x63, 0x94, 0x01, 0x98, 0xa1, 0x47, 0xed, 0x0b, 0x0b,
-	0x2e, 0xa4, 0xf6, 0x0e, 0x45, 0x98, 0x3b, 0x45, 0x11, 0x5a, 0x27, 0x2d, 0xc2, 0xfb, 0x86, 0x08,
-	0x83, 0x29, 0x9c, 0xd4, 0xf7, 0x7e, 0x3f, 0xce, 0xc1, 0x2c, 0xa6, 0x3d, 0x2f, 0x96, 0x3a, 0xdd,
-	0x0c, 0xea, 0xb9, 0x33, 0xc4, 0x1a, 0x89, 0x57, 0xc5, 0xea, 0x64, 0xac, 0x90, 0x5b, 0x28, 0x62,
-	0x37, 0xf0, 0x2c, 0x47, 0x16, 0xfc, 0x40, 0x52, 0x57, 0x5d, 0x49, 0x2a, 0x3d, 0xac, 0x00, 0x05,
-	0xb2, 0xac, 0xca, 0xd1, 0xd7, 0xc6, 0xeb, 0x19, 0xea, 0x7b, 0x06, 0x91, 0x65, 0x33, 0x56, 0x80,
-	0xf6, 0xa7, 0x39, 0x50, 0x71, 0xc9, 0x63, 0xb0, 0xbb, 0xbf, 0x1e, 0xb3, 0xbb, 0xcb, 0xa3, 0x7a,
-	0x57, 0x42, 0x3c, 0xc3, 0x72, 0x0f, 0xc9, 0x98, 0xf1, 0x72, 0x16, 0xd0, 0x47, 0xe7, 0x1d, 0xfe,
-	0xc1, 0x82, 0x92, 0xec, 0xf7, 0x18, 0x4c, 0xf8, 0x66, 0xdc, 0x84, 0xbf, 0x98, 0x61, 0x15, 0x43,
-	0x4c, 0xf7, 0x27, 0x79, 0x3d, 0xfb, 0x30, 0x22, 0x6d, 0x13, 0xbf, 0xa9, 0x63, 0xad, 0x48, 0x03,
-	0x45, 0x23, 0x56, 0x34, 0xf4, 0x9b, 0xaa, 0x80, 0x89, 0x32, 0x4e, 0x9b, 0x37, 0xc3, 0xc0, 0x27,
-	0x9f, 0xb9, 0x12, 0x4b, 0x57, 0x8b, 0x45, 0x39, 0x77, 0x9c, 0x40, 0xc5, 0x03, 0x7c, 0x44, 0x30,
-	0xd4, 0x4b, 0xda, 0x32, 0x1d, 0x24, 0xbc, 0x3e, 0xa6, 0xe1, 0x54, 0xc1, 0xd0, 0x40, 0x33, 0x1e,
-	0x64, 0x84, 0xda, 0x30, 0x6d, 0xd6, 0x90, 0xea, 0xb3, 0xb4, 0x92, 0xbd, 0x58, 0x55, 0x3d, 0x0c,
-	0x9b, 0x2d, 0x38, 0x86, 0x6c, 0x1f, 0x14, 0xa1, 0x6c, 0x1c, 0xbe, 0x44, 0x1e, 0x73, 0xe6, 0x74,
-	0xf2, 0x98, 0xe9, 0x61, 0x77, 0x79, 0xac, 0xb0, 0xfb, 0x72, 0x3c, 0xec, 0x7e, 0x2a, 0x19, 0x76,
-	0x83, 0x5c, 0x5d, 0x2c, 0xe4, 0x66, 0x70, 0x56, 0xc7, 0x9f, 0x41, 0x31, 0x70, 0xa6, 0x44, 0xc6,
-	0x60, 0x94, 0x8b, 0x84, 0x5f, 0x79, 0x33, 0x06, 0x89, 0x13, 0x2c, 0x84, 0x5f, 0xaa, 0x5b, 0xea,
-	0xfd, 0x6e, 0x97, 0xf8, 0xfb, 0x0b, 0xd3, 0x72, 0xc2, 0xa1, 0x5f, 0x7a, 0x33, 0x46, 0xc5, 0x89,
-	0xde, 0x68, 0x13, 0x8a, 0x2a, 0x7c, 0xd5, 0x05, 0xa6, 0x2f, 0x65, 0x89, 0x8c, 0x95, 0x5f, 0xae,
-	0xfe, 0xc6, 0x1a, 0xc7, 0xcc, 0x3c, 0x94, 0x8e, 0xc8, 0x3c, 0xdc, 0x01, 0xe4, 0x6d, 0xcb, 0x08,
-	0xa0, 0x79, 0x4b, 0x7d, 0x18, 0x2f, 0x4e, 0x65, 0x51, 0x86, 0xb5, 0xe1, 0x86, 0xdd, 0x1d, 0xe8,
-	0x81, 0x53, 0x46, 0x09, 0xad, 0xd6, 0x31, 0x6f, 0xa8, 0x0a, 0x3a, 0xcb, 0x90, 0x35, 0x66, 0x8a,
-	0x82, 0x38, 0x59, 0xa0, 0x58, 0x4b, 0xa0, 0xe2, 0x01, 0x3e, 0xe8, 0x23, 0x98, 0x11, 0x47, 0x28,
-	0x62, 0x0c, 0xc7, 0x64, 0x3c, 0x77, 0x78, 0xb0, 0x34, 0xb3, 0x61, 0x42, 0xe2, 0x38, 0x07, 0xfb,
-	0x4f, 0xf2, 0x90, 0x1e, 0x71, 0x47, 0xdf, 0x46, 0x58, 0x8f, 0xf8, 0x36, 0xe2, 0x5d, 0x28, 0x31,
-	0x4e, 0x7c, 0xf5, 0x1d, 0x49, 0x6e, 0xbc, 0xef, 0x48, 0xea, 0x01, 0x00, 0x8e, 0xb0, 0x12, 0xe9,
-	0x8f, 0xfc, 0x89, 0xa6, 0x3f, 0x56, 0x00, 0x64, 0x54, 0x55, 0xf3, 0xfa, 0xfa, 0xc1, 0x73, 0x26,
-	0xb2, 0x09, 0x37, 0x42, 0x0a, 0x36, 0x7a, 0xa1, 0xab, 0xe1, 0xc5, 0xa9, 0x5e, 0x38, 0x2f, 0x0d,
-	0x94, 0x95, 0x24, 0x13, 0x68, 0x29, 0x5f, 0x7f, 0x1f, 0x51, 0x86, 0x66, 0xff, 0x6f, 0x0e, 0x62,
-	0xc6, 0x10, 0xfd, 0xd0, 0x82, 0x39, 0x92, 0xf8, 0xc4, 0x3e, 0xf0, 0x25, 0x7f, 0x2d, 0xdb, 0xef,
-	0x1e, 0x0c, 0x7c, 0xa1, 0x1f, 0xbd, 0x29, 0x25, 0xbb, 0x30, 0x3c, 0xc8, 0x14, 0xfd, 0xa1, 0x05,
-	0xe7, 0xc9, 0xe0, 0x6f, 0x28, 0xe8, 0x4d, 0x7f, 0x63, 0xec, 0x1f, 0x61, 0xa8, 0x3e, 0x79, 0x78,
-	0xb0, 0x94, 0xf6, 0xeb, 0x12, 0x38, 0x8d, 0x1d, 0x7a, 0x1f, 0x26, 0x88, 0xdf, 0x0a, 0xf2, 0xaf,
-	0xd9, 0xd9, 0x06, 0x3f, 0x8d, 0x11, 0x79, 0x47, 0xab, 0x7e, 0x8b, 0x61, 0x09, 0x6a, 0xff, 0x34,
-	0x0f, 0xb3, 0xc9, 0x6f, 0x29, 0x74, 0xa5, 0xe2, 0x44, 0x6a, 0xa5, 0xa2, 0xd0, 0x91, 0x06, 0x0f,
-	0xcb, 0x06, 0x23, 0x1d, 0x11, 0x8d, 0x58, 0xd1, 0x42, 0x1d, 0x91, 0x15, 0xce, 0x85, 0x63, 0xe8,
-	0x88, 0x2c, 0x6b, 0x8e, 0xb0, 0xd0, 0xd5, 0xf8, 0xdd, 0x62, 0x27, 0xef, 0x96, 0x39, 0x73, 0x2d,
-	0xe3, 0x66, 0x75, 0xbb, 0x50, 0x36, 0xf6, 0x41, 0x6b, 0xe2, 0xb5, 0xcc, 0x72, 0x8f, 0x8e, 0xdd,
-	0x39, 0x55, 0xdc, 0x12, 0x51, 0x4c, 0xfc, 0x48, 0xef, 0xa5, 0xb4, 0x8e, 0x95, 0xf6, 0x94, 0xe2,
-	0x32, 0xd0, 0xec, 0xff, 0xb0, 0x60, 0x26, 0x56, 0x3e, 0x2b, 0xb8, 0x05, 0x65, 0xca, 0xe3, 0xff,
-	0x9e, 0xc4, 0xbd, 0x10, 0x01, 0x1b, 0x68, 0xe8, 0x7b, 0x50, 0xee, 0x78, 0x6e, 0x8b, 0x32, 0x5e,
-	0xf7, 0xc8, 0xae, 0xd6, 0x93, 0xac, 0x49, 0xa4, 0x85, 0xc3, 0x83, 0xa5, 0xf9, 0x0d, 0x05, 0x53,
-	0xf3, 0xba, 0xbd, 0x0e, 0xe5, 0xaa, 0xa0, 0x1d, 0x9b, 0xe0, 0xf2, 0x65, 0xf4, 0x5d, 0xe2, 0xd3,
-	0xb6, 0xd7, 0x67, 0xf4, 0x9b, 0xfa, 0x32, 0x1a, 0x4e, 0xf0, 0xa4, 0x5f, 0x46, 0x23, 0xe0, 0xa3,
-	0x5f, 0x46, 0xc3, 0xbe, 0xdf, 0xd8, 0x97, 0xd1, 0x70, 0x86, 0x43, 0x22, 0x95, 0xff, 0xc9, 0x19,
-	0xab, 0x88, 0x47, 0x2b, 0xb9, 0x47, 0x44, 0x2b, 0x1f, 0xc0, 0x94, 0xe3, 0x72, 0xea, 0xef, 0x91,
-	0x8e, 0xce, 0x01, 0x67, 0x3d, 0x8b, 0xe1, 0x52, 0xd7, 0x35, 0x0e, 0x0e, 0x11, 0x51, 0x07, 0x2e,
-	0x04, 0x6f, 0x26, 0x3e, 0x25, 0xd1, 0x9b, 0xad, 0xae, 0x7b, 0x7a, 0x2d, 0x48, 0xee, 0xdf, 0x4c,
-	0xeb, 0xf4, 0x70, 0x18, 0x01, 0xa7, 0x83, 0x22, 0x06, 0x33, 0xcc, 0x08, 0xd3, 0x83, 0x1b, 0x71,
-	0xc4, 0xf7, 0xa6, 0x64, 0x66, 0xc3, 0x28, 0x96, 0x32, 0x41, 0x71, 0x9c, 0x87, 0xfd, 0xaf, 0x79,
-	0x38, 0x97, 0x38, 0x69, 0x89, 0x70, 0xa4, 0xf4, 0x38, 0xc3, 0x91, 0xe2, 0x58, 0xe1, 0x48, 0xba,
-	0xa7, 0x3c, 0x31, 0x96, 0xa7, 0xfc, 0xa6, 0xf2, 0x56, 0xf5, 0xce, 0xad, 0xaf, 0xe9, 0x82, 0xf8,
-	0x50, 0x9a, 0x1b, 0x26, 0x11, 0xc7, 0xfb, 0x4a, 0x77, 0xa2, 0x39, 0xf8, 0xdb, 0x04, 0xda, 0xd5,
-	0x7e, 0x23, 0x6b, 0x71, 0x60, 0x08, 0xa0, 0xdc, 0x89, 0x14, 0x02, 0x4e, 0x63, 0x57, 0xbd, 0xf3,
-	0xf9, 0xd7, 0x17, 0xcf, 0x7c, 0xf9, 0xf5, 0xc5, 0x33, 0x5f, 0x7d, 0x7d, 0xf1, 0xcc, 0x0f, 0x0e,
-	0x2f, 0x5a, 0x9f, 0x1f, 0x5e, 0xb4, 0xbe, 0x3c, 0xbc, 0x68, 0x7d, 0x75, 0x78, 0xd1, 0xfa, 0xaf,
-	0xc3, 0x8b, 0xd6, 0x8f, 0x7e, 0x7e, 0xf1, 0xcc, 0xfd, 0x67, 0x47, 0xf9, 0x45, 0xb3, 0xff, 0x0b,
-	0x00, 0x00, 0xff, 0xff, 0xb3, 0x95, 0x0d, 0x4d, 0xf8, 0x4c, 0x00, 0x00,
+	// 4174 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5c, 0x4d, 0x6c, 0x1c, 0x47,
+	0x76, 0x56, 0xcf, 0x70, 0x86, 0x9c, 0x37, 0xa4, 0x44, 0x96, 0x28, 0x9b, 0x4b, 0xc7, 0xa2, 0xd2,
+	0x36, 0x0c, 0x3b, 0xb6, 0x87, 0x91, 0x64, 0xd9, 0xb2, 0x6c, 0x28, 0xe0, 0x0c, 0xf5, 0x43, 0x2d,
+	0xd7, 0x62, 0x6a, 0x68, 0x79, 0x2d, 0xdb, 0x50, 0x8a, 0x33, 0xc5, 0x99, 0x5e, 0xce, 0x74, 0x8f,
+	0xbb, 0x6a, 0xb8, 0x62, 0x12, 0x24, 0x9b, 0x5f, 0x2c, 0x12, 0x24, 0xd8, 0xc3, 0x06, 0xde, 0x00,
+	0x09, 0x10, 0x24, 0xc7, 0x05, 0x72, 0xcd, 0x21, 0x07, 0x1f, 0x72, 0x71, 0x92, 0x4d, 0x60, 0x24,
+	0x01, 0xe2, 0x00, 0x0b, 0x66, 0xcd, 0x05, 0x72, 0xce, 0x25, 0x17, 0x01, 0x01, 0x82, 0xfa, 0xe9,
+	0xee, 0xea, 0x9e, 0x1e, 0x71, 0x7a, 0x48, 0x0a, 0xce, 0xde, 0xc8, 0x7a, 0x55, 0xdf, 0xab, 0x7a,
+	0x55, 0xef, 0xd5, 0x7b, 0xaf, 0x5e, 0x0f, 0xbc, 0xd6, 0x72, 0x78, 0xbb, 0xbf, 0x55, 0x69, 0x78,
+	0xdd, 0x65, 0xb2, 0xd3, 0x77, 0xf8, 0xde, 0xf2, 0x0e, 0xf1, 0x5b, 0xde, 0x32, 0xe9, 0x39, 0xcb,
+	0xbb, 0x17, 0x49, 0xa7, 0xd7, 0x26, 0x17, 0x97, 0x5b, 0xd4, 0xa5, 0x3e, 0xe1, 0xb4, 0x59, 0xe9,
+	0xf9, 0x1e, 0xf7, 0xd0, 0xf3, 0xd1, 0xa8, 0x8a, 0x1a, 0x55, 0x91, 0xa3, 0x2a, 0xa4, 0xe7, 0x54,
+	0x82, 0x51, 0x8b, 0xaf, 0x1a, 0xd8, 0x2d, 0xaf, 0xe5, 0x2d, 0xcb, 0xc1, 0x5b, 0xfd, 0x6d, 0xf9,
+	0x9f, 0xfc, 0x47, 0xfe, 0xa5, 0x40, 0x17, 0x6f, 0xef, 0x5c, 0x65, 0x15, 0x47, 0x72, 0xa6, 0x0f,
+	0x39, 0x75, 0x99, 0xe3, 0xb9, 0xec, 0x55, 0xd2, 0x73, 0x18, 0xf5, 0x77, 0xa9, 0xbf, 0xdc, 0xdb,
+	0x69, 0x09, 0x1a, 0x8b, 0x77, 0x58, 0xde, 0x1d, 0x98, 0xde, 0xe2, 0x6b, 0x11, 0x52, 0x97, 0x34,
+	0xda, 0x8e, 0x4b, 0xfd, 0xbd, 0x68, 0x78, 0x97, 0x72, 0x92, 0x36, 0x6a, 0x79, 0xd8, 0x28, 0xbf,
+	0xef, 0x72, 0xa7, 0x4b, 0x07, 0x06, 0xbc, 0x7e, 0xd8, 0x00, 0xd6, 0x68, 0xd3, 0x2e, 0x49, 0x8e,
+	0xb3, 0x3f, 0x84, 0xb3, 0x2b, 0x2e, 0xe9, 0xec, 0x31, 0x87, 0xe1, 0xbe, 0xbb, 0xe2, 0xb7, 0xfa,
+	0x5d, 0xea, 0x72, 0x74, 0x01, 0x26, 0x5c, 0xd2, 0xa5, 0x0b, 0xd6, 0x05, 0xeb, 0xc5, 0x52, 0x75,
+	0xfa, 0xb3, 0xfd, 0xa5, 0x53, 0x07, 0xfb, 0x4b, 0x13, 0xef, 0x90, 0x2e, 0xc5, 0x92, 0x82, 0x9e,
+	0x83, 0xc2, 0x2e, 0xe9, 0xf4, 0xe9, 0x42, 0x4e, 0x76, 0x99, 0xd1, 0x5d, 0x0a, 0xf7, 0x44, 0x23,
+	0x56, 0x34, 0xfb, 0x77, 0xf2, 0x31, 0xf8, 0x6f, 0x50, 0x4e, 0x9a, 0x84, 0x13, 0xd4, 0x85, 0x62,
+	0x87, 0x6c, 0xd1, 0x0e, 0x5b, 0xb0, 0x2e, 0xe4, 0x5f, 0x2c, 0x5f, 0xba, 0x51, 0x19, 0x65, 0x13,
+	0x2b, 0x29, 0x50, 0x95, 0x75, 0x89, 0x73, 0xc3, 0xe5, 0xfe, 0x5e, 0xf5, 0xb4, 0x9e, 0x44, 0x51,
+	0x35, 0x62, 0xcd, 0x04, 0xfd, 0x96, 0x05, 0x65, 0xe2, 0xba, 0x1e, 0x27, 0x5c, 0x6c, 0xd3, 0x42,
+	0x4e, 0x32, 0xbd, 0x33, 0x3e, 0xd3, 0x95, 0x08, 0x4c, 0x71, 0x3e, 0xab, 0x39, 0x97, 0x0d, 0x0a,
+	0x36, 0x79, 0x2e, 0xbe, 0x09, 0x65, 0x63, 0xaa, 0x68, 0x16, 0xf2, 0x3b, 0x74, 0x4f, 0xc9, 0x17,
+	0x8b, 0x3f, 0xd1, 0x7c, 0x4c, 0xa0, 0x5a, 0x82, 0xd7, 0x72, 0x57, 0xad, 0xc5, 0xeb, 0x30, 0x9b,
+	0x64, 0x98, 0x65, 0xbc, 0xfd, 0xc7, 0x16, 0xcc, 0x1b, 0xab, 0xc0, 0x74, 0x9b, 0xfa, 0xd4, 0x6d,
+	0x50, 0xb4, 0x0c, 0x25, 0xb1, 0x97, 0xac, 0x47, 0x1a, 0xc1, 0x56, 0xcf, 0xe9, 0x85, 0x94, 0xde,
+	0x09, 0x08, 0x38, 0xea, 0x13, 0x1e, 0x8b, 0xdc, 0xe3, 0x8e, 0x45, 0xaf, 0x4d, 0x18, 0x5d, 0xc8,
+	0xc7, 0x8f, 0xc5, 0x86, 0x68, 0xc4, 0x8a, 0x66, 0x3f, 0x80, 0xaf, 0x05, 0xf3, 0xd9, 0xa4, 0xdd,
+	0x5e, 0x87, 0x70, 0x1a, 0x4d, 0xea, 0xf0, 0xa3, 0x77, 0x01, 0x26, 0x76, 0x1c, 0xb7, 0x99, 0x9c,
+	0xc5, 0xd7, 0x1d, 0xb7, 0x89, 0x25, 0xc5, 0xde, 0x81, 0x99, 0x95, 0x5e, 0xcf, 0xf7, 0x76, 0x69,
+	0xb3, 0xce, 0x49, 0x8b, 0xa2, 0xfb, 0x00, 0x44, 0x37, 0xac, 0x70, 0x09, 0x5d, 0xbe, 0xf4, 0x0b,
+	0x15, 0xa5, 0x33, 0x15, 0x53, 0x67, 0x2a, 0xbd, 0x9d, 0x96, 0x68, 0x60, 0x15, 0xa1, 0x9a, 0x95,
+	0xdd, 0x8b, 0x95, 0x4d, 0xa7, 0x4b, 0xab, 0xa7, 0x0f, 0xf6, 0x97, 0x60, 0x25, 0x44, 0xc0, 0x06,
+	0x9a, 0xfd, 0xdb, 0x16, 0x9c, 0x5b, 0xf1, 0x5b, 0x5e, 0x6d, 0x75, 0xa5, 0xd7, 0xbb, 0x4d, 0x49,
+	0x87, 0xb7, 0xeb, 0x9c, 0xf0, 0x3e, 0x43, 0xd7, 0xa1, 0xc8, 0xe4, 0x5f, 0x7a, 0x31, 0x2f, 0x04,
+	0xe7, 0x53, 0xd1, 0x1f, 0xed, 0x2f, 0xcd, 0xa7, 0x0c, 0xa4, 0x58, 0x8f, 0x42, 0x2f, 0xc1, 0x64,
+	0x97, 0x32, 0x46, 0x5a, 0x81, 0xc4, 0xcf, 0x68, 0x80, 0xc9, 0x6f, 0xa8, 0x66, 0x1c, 0xd0, 0xed,
+	0x7f, 0xc8, 0xc1, 0x99, 0x10, 0x4b, 0xb3, 0x3f, 0x81, 0xed, 0xed, 0xc3, 0x74, 0xdb, 0x58, 0xa1,
+	0xdc, 0xe5, 0xf2, 0xa5, 0xb7, 0x46, 0xd4, 0xa4, 0x34, 0x21, 0x55, 0xe7, 0x35, 0x9b, 0x69, 0xb3,
+	0x15, 0xc7, 0xd8, 0xa0, 0x2e, 0x00, 0xdb, 0x73, 0x1b, 0x9a, 0xe9, 0x84, 0x64, 0xfa, 0x66, 0x46,
+	0xa6, 0xf5, 0x10, 0xa0, 0x8a, 0x34, 0x4b, 0x88, 0xda, 0xb0, 0xc1, 0xc0, 0xfe, 0x6b, 0x0b, 0xce,
+	0xa6, 0x8c, 0x43, 0x6f, 0x27, 0xf6, 0xf3, 0xf9, 0x81, 0xfd, 0x44, 0x03, 0xc3, 0xa2, 0xdd, 0x7c,
+	0x05, 0xa6, 0x7c, 0xba, 0xeb, 0x88, 0x9b, 0x42, 0x4b, 0x78, 0x56, 0x8f, 0x9f, 0xc2, 0xba, 0x1d,
+	0x87, 0x3d, 0xd0, 0xcb, 0x50, 0x0a, 0xfe, 0x16, 0x62, 0xce, 0x0b, 0x65, 0x12, 0x1b, 0x17, 0x74,
+	0x65, 0x38, 0xa2, 0xdb, 0xbf, 0x09, 0x85, 0x5a, 0x9b, 0xf8, 0x5c, 0x9c, 0x18, 0x9f, 0xf6, 0xbc,
+	0x77, 0xf1, 0xba, 0x9e, 0x62, 0x78, 0x62, 0xb0, 0x6a, 0xc6, 0x01, 0x7d, 0x84, 0xcd, 0x7e, 0x09,
+	0x26, 0x77, 0xa9, 0x2f, 0xe7, 0x9b, 0x8f, 0x83, 0xdd, 0x53, 0xcd, 0x38, 0xa0, 0xdb, 0xff, 0x6a,
+	0xc1, 0xbc, 0x9c, 0xc1, 0xaa, 0xc3, 0x1a, 0xde, 0x2e, 0xf5, 0xf7, 0x30, 0x65, 0xfd, 0xce, 0x31,
+	0x4f, 0x68, 0x15, 0x66, 0x19, 0xed, 0xee, 0x52, 0xbf, 0xe6, 0xb9, 0x8c, 0xfb, 0xc4, 0x71, 0xb9,
+	0x9e, 0xd9, 0x82, 0xee, 0x3d, 0x5b, 0x4f, 0xd0, 0xf1, 0xc0, 0x08, 0xf4, 0x22, 0x4c, 0xe9, 0x69,
+	0x8b, 0xa3, 0x24, 0x04, 0x3b, 0x2d, 0xf6, 0x40, 0xaf, 0x89, 0xe1, 0x90, 0x6a, 0xff, 0x97, 0x05,
+	0x73, 0x72, 0x55, 0xf5, 0xfe, 0x16, 0x6b, 0xf8, 0x4e, 0x4f, 0x18, 0xe0, 0xaf, 0xe2, 0x92, 0xae,
+	0xc3, 0xe9, 0x66, 0x20, 0xf8, 0x75, 0xa7, 0xeb, 0x70, 0xa9, 0x23, 0x85, 0xea, 0x53, 0x1a, 0xe3,
+	0xf4, 0x6a, 0x8c, 0x8a, 0x13, 0xbd, 0xd5, 0xf6, 0x75, 0xfa, 0x8c, 0x53, 0x7f, 0xc3, 0xf7, 0xba,
+	0x9e, 0x58, 0xe7, 0x26, 0x61, 0x3b, 0xe8, 0x57, 0x60, 0xaa, 0xab, 0x2f, 0x3d, 0x6d, 0x35, 0x7f,
+	0x71, 0x34, 0xab, 0x79, 0x77, 0xeb, 0x5b, 0xb4, 0xc1, 0xc5, 0x85, 0x19, 0x69, 0x5b, 0xd4, 0x86,
+	0x43, 0x54, 0xf4, 0x3e, 0x4c, 0xb0, 0x1e, 0x6d, 0x48, 0x11, 0x95, 0x2f, 0xbd, 0x31, 0x9a, 0x52,
+	0xc7, 0x26, 0x59, 0xef, 0xd1, 0x46, 0x24, 0x5b, 0xf1, 0x1f, 0x96, 0x90, 0xf6, 0x7f, 0x58, 0xb0,
+	0x90, 0xb6, 0xaa, 0x75, 0x87, 0x71, 0xf4, 0xe1, 0xc0, 0xca, 0x2a, 0xa3, 0xad, 0x4c, 0x8c, 0x96,
+	0xeb, 0x0a, 0xb5, 0x37, 0x68, 0x31, 0x56, 0xf5, 0x00, 0x0a, 0x0e, 0xa7, 0xdd, 0xc0, 0xd5, 0xb8,
+	0x36, 0xda, 0xb2, 0xd2, 0x26, 0x1b, 0x5d, 0xa1, 0x6b, 0x02, 0x10, 0x2b, 0x5c, 0xfb, 0x03, 0x98,
+	0xae, 0xf5, 0x7d, 0x9f, 0xba, 0x5c, 0x5d, 0x70, 0x5f, 0x87, 0x02, 0x73, 0x5c, 0x6d, 0xe7, 0xb3,
+	0xdd, 0x6d, 0x25, 0x01, 0x5e, 0x17, 0x83, 0xb1, 0xc2, 0xb0, 0xff, 0x2c, 0x0f, 0x67, 0x83, 0x13,
+	0x43, 0x9b, 0x2b, 0x3e, 0x77, 0xb6, 0x49, 0x83, 0x33, 0xd4, 0x84, 0xe9, 0x66, 0xd4, 0xcc, 0xb5,
+	0x21, 0xce, 0xc2, 0x2b, 0x34, 0xf6, 0x06, 0x3c, 0xc7, 0x31, 0x54, 0xf4, 0x1e, 0xe4, 0x5b, 0x0e,
+	0xd7, 0x9e, 0xe1, 0xd5, 0xd1, 0x24, 0x77, 0xcb, 0x49, 0x5a, 0x9e, 0x6a, 0x59, 0xb3, 0xca, 0xdf,
+	0x72, 0x38, 0x16, 0x88, 0x68, 0x0b, 0x8a, 0x4e, 0x97, 0xb4, 0x68, 0xc6, 0x5d, 0x59, 0x13, 0x63,
+	0x92, 0xe8, 0xa1, 0xab, 0x29, 0xa9, 0x0c, 0x6b, 0x64, 0xc1, 0xa3, 0x21, 0x2c, 0x86, 0xb2, 0xd9,
+	0xa3, 0xef, 0x7c, 0x8a, 0xed, 0x8c, 0x78, 0x48, 0x2a, 0xc3, 0x1a, 0xd9, 0xfe, 0x22, 0x07, 0xb3,
+	0x91, 0xfc, 0x6a, 0x5e, 0xb7, 0xeb, 0x70, 0xb4, 0x08, 0x39, 0xa7, 0xa9, 0x0d, 0x12, 0xe8, 0x81,
+	0xb9, 0xb5, 0x55, 0x9c, 0x73, 0x9a, 0xe8, 0x05, 0x28, 0x6e, 0xf9, 0xc4, 0x6d, 0xb4, 0xb5, 0x21,
+	0x0a, 0x81, 0xab, 0xb2, 0x15, 0x6b, 0x2a, 0x7a, 0x16, 0xf2, 0x9c, 0xb4, 0xb4, 0xfd, 0x09, 0xe5,
+	0xb7, 0x49, 0x5a, 0x58, 0xb4, 0x0b, 0xc3, 0xc7, 0xfa, 0x52, 0x87, 0xe5, 0xce, 0x1b, 0x86, 0xaf,
+	0xae, 0x9a, 0x71, 0x40, 0x17, 0x1c, 0x49, 0x9f, 0xb7, 0x3d, 0x7f, 0xa1, 0x10, 0xe7, 0xb8, 0x22,
+	0x5b, 0xb1, 0xa6, 0x0a, 0x17, 0xa5, 0x21, 0xe7, 0xcf, 0xa9, 0xbf, 0x50, 0x8c, 0xbb, 0x28, 0xb5,
+	0x80, 0x80, 0xa3, 0x3e, 0xe8, 0x23, 0x28, 0x37, 0x7c, 0x4a, 0xb8, 0xe7, 0xaf, 0x12, 0x4e, 0x17,
+	0x26, 0x33, 0x9f, 0xc0, 0x33, 0xc2, 0x4b, 0xaf, 0x45, 0x10, 0xd8, 0xc4, 0xb3, 0xff, 0x26, 0x0f,
+	0x0b, 0x91, 0x68, 0xe5, 0xde, 0x46, 0x9e, 0xa9, 0x16, 0x8f, 0x35, 0x44, 0x3c, 0x2f, 0x40, 0xb1,
+	0xe9, 0xb4, 0x28, 0xe3, 0x49, 0x29, 0xaf, 0xca, 0x56, 0xac, 0xa9, 0xe8, 0xf7, 0x13, 0xd1, 0x48,
+	0x41, 0x1e, 0x94, 0xbb, 0xa3, 0x1d, 0x94, 0x61, 0x93, 0x1b, 0x23, 0x24, 0x41, 0x97, 0x00, 0x5a,
+	0x0e, 0xd7, 0x97, 0x96, 0xde, 0xf5, 0xd0, 0x58, 0xdf, 0x0a, 0x29, 0xd8, 0xe8, 0x85, 0xde, 0x83,
+	0x92, 0x94, 0xd7, 0x98, 0xfa, 0x2f, 0x5d, 0x98, 0x5a, 0x00, 0x80, 0x23, 0xac, 0x23, 0x07, 0x39,
+	0x1f, 0x00, 0xba, 0xf1, 0xb0, 0xe7, 0x53, 0x26, 0xae, 0xee, 0x7b, 0xc4, 0x77, 0xc8, 0x56, 0x87,
+	0x1e, 0x57, 0x1c, 0xfb, 0xf9, 0x04, 0x4c, 0xde, 0xf4, 0xa9, 0xd3, 0x6a, 0xf3, 0x27, 0x70, 0x25,
+	0x3e, 0x07, 0x05, 0xd2, 0x71, 0x08, 0x93, 0xa7, 0xdb, 0x98, 0xd2, 0x8a, 0x68, 0xc4, 0x8a, 0x86,
+	0x3e, 0x80, 0xa2, 0xe7, 0x3b, 0x2d, 0xc7, 0x5d, 0x28, 0xc9, 0x49, 0x5c, 0x1e, 0xed, 0xfc, 0xe8,
+	0x55, 0xdc, 0x95, 0x43, 0xa3, 0x23, 0xaa, 0xfe, 0xc7, 0x1a, 0x12, 0xdd, 0x87, 0x49, 0xa5, 0x72,
+	0x81, 0x19, 0x5b, 0x1e, 0xd9, 0x0c, 0x2b, 0xad, 0x8d, 0x4c, 0x83, 0xfa, 0x9f, 0xe1, 0x00, 0x10,
+	0xd5, 0x43, 0x2b, 0x3c, 0x21, 0xa1, 0x5f, 0xce, 0x60, 0x85, 0x87, 0x9a, 0xdd, 0x7a, 0x68, 0x76,
+	0x0b, 0x59, 0x40, 0xa5, 0x61, 0x1d, 0x66, 0x67, 0x85, 0x88, 0xb5, 0xbb, 0x5f, 0x1c, 0x43, 0xc4,
+	0x3a, 0xd6, 0x38, 0x1d, 0x8f, 0x11, 0x82, 0x68, 0xc0, 0xfe, 0x7e, 0x1e, 0xe6, 0x74, 0xcf, 0x9a,
+	0xd7, 0xe9, 0xd0, 0x86, 0xf4, 0x2d, 0x95, 0x15, 0xcf, 0xa7, 0x5a, 0x71, 0x27, 0xf0, 0x29, 0xd4,
+	0xcd, 0x58, 0xcd, 0x34, 0x9b, 0x88, 0x47, 0x45, 0xfa, 0x11, 0xca, 0x46, 0x84, 0xbb, 0xa4, 0x7b,
+	0x69, 0xef, 0x02, 0xfd, 0x9e, 0x05, 0x67, 0x77, 0xa9, 0xef, 0x6c, 0x3b, 0x0d, 0xa9, 0x8f, 0xb7,
+	0x1d, 0xc6, 0x3d, 0x7f, 0x4f, 0xdf, 0x9b, 0xaf, 0x8f, 0xc6, 0xf9, 0x9e, 0x01, 0xb0, 0xe6, 0x6e,
+	0x7b, 0xd5, 0x67, 0x34, 0xb7, 0xb3, 0xf7, 0x06, 0xa1, 0x71, 0x1a, 0xbf, 0xc5, 0x1e, 0x40, 0x34,
+	0xdb, 0x14, 0x73, 0xb0, 0x6e, 0x2a, 0xef, 0xc8, 0x13, 0x0b, 0x16, 0x1b, 0xd8, 0x4e, 0xd3, 0x8c,
+	0x7c, 0x6a, 0x41, 0x59, 0xd3, 0x9f, 0x80, 0x9b, 0x88, 0xe3, 0x6e, 0xe2, 0xab, 0x99, 0xe6, 0x3f,
+	0xc4, 0x33, 0xf4, 0x61, 0x26, 0xa6, 0xe4, 0xe8, 0x8a, 0x4e, 0x97, 0x28, 0x1b, 0xf8, 0xf3, 0x66,
+	0xba, 0xe4, 0xd1, 0xfe, 0xd2, 0x5c, 0xac, 0x73, 0x94, 0x43, 0x39, 0x3c, 0x76, 0xb9, 0x36, 0xf5,
+	0x83, 0xbf, 0x58, 0x3a, 0xf5, 0x9d, 0x1f, 0x5f, 0x38, 0x65, 0x7f, 0x92, 0x87, 0xd9, 0xa4, 0x54,
+	0x47, 0xb0, 0xbd, 0x91, 0x0d, 0x9b, 0x3a, 0x51, 0x1b, 0x96, 0x3b, 0x39, 0x1b, 0x96, 0x3f, 0x09,
+	0x1b, 0x36, 0x71, 0x6c, 0x36, 0xcc, 0xfe, 0x67, 0x0b, 0x4e, 0x87, 0x3b, 0xf3, 0x71, 0x5f, 0xf8,
+	0x1f, 0x91, 0xd4, 0xad, 0xe3, 0x97, 0xfa, 0x03, 0x98, 0x64, 0x5e, 0xdf, 0x6f, 0x48, 0x27, 0x5b,
+	0xa0, 0xbf, 0x96, 0xcd, 0x68, 0xaa, 0xb1, 0x86, 0x67, 0xa9, 0x1a, 0x70, 0x80, 0x6a, 0x7f, 0x9a,
+	0x0b, 0x17, 0xa4, 0x69, 0xca, 0xf1, 0xf2, 0x85, 0x5b, 0x2a, 0x16, 0x34, 0x65, 0x3a, 0x5e, 0xa2,
+	0x15, 0x6b, 0x2a, 0xb2, 0xa5, 0x3d, 0x0f, 0xfc, 0xff, 0x52, 0x15, 0xb4, 0x59, 0x96, 0x9b, 0xa0,
+	0x28, 0xa8, 0x07, 0xb3, 0x3e, 0xfd, 0xb8, 0xef, 0xf8, 0xb4, 0x59, 0xf7, 0xc8, 0x8e, 0x70, 0x5a,
+	0x74, 0x92, 0x6b, 0x44, 0xbd, 0x5f, 0xed, 0xfb, 0xd2, 0x84, 0x55, 0xe7, 0x45, 0xec, 0x8e, 0x13,
+	0x58, 0x78, 0x00, 0x1d, 0x79, 0x30, 0x4f, 0x76, 0x89, 0xd3, 0x21, 0x5b, 0x4e, 0xc7, 0xe1, 0x7b,
+	0x75, 0xee, 0x13, 0x4e, 0x5b, 0x7b, 0xda, 0xc5, 0x7e, 0x4b, 0xaf, 0x65, 0x7e, 0x25, 0xa5, 0xcf,
+	0xa3, 0xfd, 0xa5, 0x67, 0xb4, 0x2c, 0xd2, 0xc8, 0x38, 0x15, 0xd8, 0xfe, 0xcf, 0x42, 0x68, 0x21,
+	0x74, 0x5e, 0xeb, 0xd7, 0xa0, 0xdc, 0x50, 0xc1, 0x64, 0x67, 0x6f, 0xcd, 0xd5, 0x67, 0x7a, 0x75,
+	0x8c, 0xdb, 0xae, 0x52, 0x8b, 0x60, 0x12, 0x5e, 0xa8, 0x41, 0xc1, 0x26, 0x37, 0xf4, 0x6d, 0x00,
+	0x65, 0xfa, 0x69, 0x73, 0xcd, 0xd5, 0x77, 0x5b, 0x6d, 0x1c, 0xde, 0xf7, 0x42, 0x14, 0xc5, 0x3a,
+	0x74, 0xb2, 0x22, 0x02, 0x36, 0x58, 0x89, 0x55, 0x07, 0x59, 0xdc, 0x9b, 0x9e, 0xaf, 0x8d, 0xc4,
+	0x58, 0xab, 0x5e, 0x89, 0x60, 0x92, 0xbe, 0x77, 0x44, 0xc1, 0x26, 0xb7, 0x45, 0x1f, 0x66, 0x93,
+	0xb2, 0x4a, 0xb9, 0xdf, 0x6e, 0xc7, 0xef, 0xb7, 0x4b, 0x23, 0x5a, 0x04, 0x23, 0x31, 0x60, 0xbe,
+	0x23, 0xf8, 0x70, 0x26, 0x21, 0xa3, 0x14, 0x96, 0x6b, 0x71, 0x96, 0x97, 0xb3, 0xdc, 0xf5, 0x3a,
+	0xdb, 0x6e, 0xf2, 0x64, 0x30, 0x9b, 0x94, 0xce, 0xb1, 0x31, 0x8d, 0xa5, 0xf8, 0xcd, 0x4b, 0xfc,
+	0xcf, 0x73, 0x50, 0x0a, 0xcd, 0x78, 0x96, 0x7c, 0x9d, 0x72, 0xbf, 0x72, 0x87, 0x04, 0xd1, 0xf9,
+	0x51, 0x82, 0xe8, 0x89, 0xe1, 0x41, 0x74, 0x90, 0xd3, 0x2f, 0x3e, 0x3e, 0xa7, 0x6f, 0x04, 0xd1,
+	0x93, 0xa3, 0x07, 0xd1, 0x53, 0x87, 0x07, 0xd1, 0xf6, 0x5f, 0x5a, 0x80, 0x06, 0x33, 0x26, 0x59,
+	0x04, 0x45, 0x92, 0x97, 0xeb, 0xeb, 0x59, 0xc3, 0xd7, 0xc3, 0xee, 0x58, 0xfb, 0xd3, 0x02, 0x9c,
+	0xb9, 0xe5, 0x8c, 0x9d, 0x7a, 0xe5, 0xf0, 0xb4, 0x42, 0xaa, 0x53, 0xed, 0xf8, 0x86, 0x96, 0x55,
+	0xed, 0xef, 0x35, 0x3d, 0xf4, 0xe9, 0x5a, 0x7a, 0xb7, 0x47, 0xc3, 0x49, 0x78, 0x18, 0xf4, 0xc8,
+	0x87, 0xe4, 0x2d, 0x98, 0x61, 0xdc, 0x77, 0x1a, 0x5c, 0x25, 0x77, 0xd9, 0x42, 0x59, 0xde, 0x5c,
+	0xe7, 0x74, 0xf7, 0x99, 0xba, 0x49, 0xc4, 0xf1, 0xbe, 0xa9, 0x39, 0xe3, 0x89, 0xcc, 0x39, 0xe3,
+	0x65, 0x28, 0x91, 0x4e, 0xc7, 0xfb, 0xf6, 0x26, 0x69, 0x31, 0x9d, 0xa5, 0x09, 0x4f, 0xcd, 0x4a,
+	0x40, 0xc0, 0x51, 0x1f, 0x54, 0x01, 0x70, 0x5a, 0xae, 0xe7, 0x53, 0x39, 0xa2, 0x28, 0xaf, 0x50,
+	0xf9, 0x2e, 0xb6, 0x16, 0xb6, 0x62, 0xa3, 0x07, 0xaa, 0xc3, 0x39, 0xc7, 0x65, 0xb4, 0xd1, 0xf7,
+	0x69, 0x7d, 0xc7, 0xe9, 0x6d, 0xae, 0xd7, 0xa5, 0x95, 0xd8, 0x93, 0xa7, 0x79, 0xaa, 0xfa, 0xac,
+	0x66, 0x76, 0x6e, 0x2d, 0xad, 0x13, 0x4e, 0x1f, 0x8b, 0x5e, 0x83, 0x69, 0xc7, 0x6d, 0x74, 0xfa,
+	0x4d, 0xba, 0x41, 0x78, 0x9b, 0x2d, 0x4c, 0xc9, 0x69, 0xcc, 0x1e, 0xec, 0x2f, 0x4d, 0xaf, 0x19,
+	0xed, 0x38, 0xd6, 0x4b, 0x8c, 0xa2, 0x0f, 0x8d, 0x51, 0xa5, 0x68, 0xd4, 0x8d, 0x87, 0xe6, 0x28,
+	0xb3, 0x57, 0x4a, 0x56, 0x1d, 0x32, 0x65, 0xd5, 0x7f, 0x98, 0x83, 0xa2, 0x7a, 0xd4, 0x42, 0x57,
+	0x12, 0x2f, 0x47, 0xcf, 0x0e, 0xbc, 0x1c, 0x95, 0xd3, 0x1e, 0x00, 0x6d, 0x28, 0x3a, 0x8c, 0xf5,
+	0xe3, 0x1e, 0xcb, 0x9a, 0x6c, 0xc1, 0x9a, 0x22, 0x33, 0x8e, 0x9e, 0xbb, 0xed, 0xb4, 0x74, 0x3a,
+	0xe6, 0xba, 0xe1, 0xa7, 0x44, 0xa5, 0x09, 0x0f, 0xc2, 0xda, 0x85, 0xc8, 0x65, 0x89, 0x75, 0x10,
+	0xbe, 0xcb, 0x9d, 0xfa, 0xdd, 0x77, 0x14, 0x8f, 0x9a, 0x44, 0xc4, 0x1a, 0x59, 0xf0, 0xf0, 0xfa,
+	0xbc, 0xd7, 0xe7, 0xf2, 0xa0, 0x1c, 0x13, 0x8f, 0xbb, 0x12, 0x11, 0x6b, 0x64, 0xfb, 0x13, 0x0b,
+	0xce, 0x28, 0x19, 0xd4, 0xda, 0xb4, 0xb1, 0x53, 0xe7, 0xb4, 0x27, 0x42, 0x88, 0x3e, 0xa3, 0x2c,
+	0x19, 0x42, 0xbc, 0xcb, 0x28, 0xc3, 0x92, 0x62, 0xac, 0x3e, 0x77, 0x52, 0xab, 0xb7, 0x0f, 0x72,
+	0x50, 0x90, 0xbe, 0x7a, 0x16, 0xfb, 0x13, 0x4f, 0xae, 0xe5, 0x46, 0x4a, 0xae, 0x1d, 0x92, 0x7f,
+	0x8d, 0x12, 0x8c, 0x13, 0x8f, 0x4d, 0x30, 0xb2, 0xb4, 0xfc, 0xe2, 0xdb, 0x19, 0x42, 0x94, 0x71,
+	0xea, 0x1b, 0x8e, 0x9a, 0xbf, 0xfb, 0xa9, 0x05, 0xf3, 0x69, 0x99, 0xf6, 0x2c, 0x32, 0x7f, 0x05,
+	0xa6, 0x7a, 0x1d, 0xc2, 0xb7, 0x3d, 0xbf, 0x9b, 0x7c, 0x61, 0xdd, 0xd0, 0xed, 0x38, 0xec, 0x81,
+	0x7c, 0x00, 0x3f, 0x08, 0x56, 0x83, 0x40, 0xee, 0xfa, 0xd1, 0xb2, 0xb0, 0xd1, 0x0e, 0x87, 0x4d,
+	0x0c, 0x1b, 0x5c, 0xec, 0x3f, 0x2c, 0xc0, 0x9c, 0x1c, 0x32, 0xee, 0xb5, 0x36, 0xce, 0xb1, 0xea,
+	0xc1, 0x53, 0x32, 0xc4, 0x1c, 0xbc, 0x09, 0xd5, 0x49, 0xbb, 0xaa, 0xc7, 0x3f, 0xb5, 0x96, 0xda,
+	0xeb, 0xd1, 0x50, 0x0a, 0x1e, 0x82, 0x3b, 0x78, 0xbd, 0xc1, 0xcf, 0xde, 0xf5, 0x66, 0x1e, 0xb6,
+	0xc9, 0x43, 0x0f, 0xdb, 0xd0, 0xcb, 0x70, 0xea, 0x08, 0x97, 0xe1, 0xe0, 0x05, 0x55, 0xca, 0x74,
+	0x41, 0xfd, 0x69, 0x0e, 0x26, 0x37, 0x7c, 0x4f, 0xbe, 0xd8, 0x9c, 0x7c, 0x5a, 0xfb, 0x6e, 0xec,
+	0xa5, 0xf7, 0xe2, 0xc8, 0x2f, 0xbd, 0x02, 0x4a, 0xbe, 0xf1, 0x4e, 0xc5, 0xdf, 0x77, 0x8d, 0xfc,
+	0x6c, 0x3e, 0x4b, 0xd8, 0x10, 0x40, 0x3e, 0x3e, 0x3f, 0xfb, 0xa9, 0x05, 0x65, 0xdd, 0xf3, 0x2b,
+	0x9b, 0x08, 0xd4, 0xf3, 0x1b, 0x92, 0x08, 0xfc, 0xa3, 0x68, 0x05, 0x42, 0x68, 0xe8, 0x37, 0x60,
+	0xae, 0x17, 0xbc, 0x2c, 0x6f, 0x78, 0x1d, 0xa7, 0xe1, 0xd0, 0x20, 0x97, 0x7c, 0x25, 0xe3, 0xb3,
+	0xbb, 0x1c, 0xbe, 0x57, 0xfd, 0x9a, 0xe6, 0x3b, 0xb7, 0x91, 0xc4, 0xc5, 0x83, 0xac, 0xec, 0x7f,
+	0xb3, 0x60, 0x26, 0x26, 0x7b, 0xd4, 0x00, 0x68, 0x78, 0x6e, 0xd3, 0xe1, 0x61, 0x91, 0x4b, 0xf9,
+	0xd2, 0xf2, 0x68, 0x52, 0xad, 0x05, 0xe3, 0xa2, 0x43, 0x17, 0x36, 0x31, 0x6c, 0xc0, 0xa2, 0xcb,
+	0x41, 0x45, 0x5a, 0xdc, 0xf3, 0x52, 0x15, 0x69, 0x8f, 0xf6, 0x97, 0xa6, 0xf5, 0x9c, 0xcc, 0x0a,
+	0xb5, 0x2c, 0x95, 0x57, 0x7f, 0x95, 0x83, 0x52, 0xb8, 0xfe, 0x27, 0xa0, 0x46, 0xef, 0xc6, 0xd4,
+	0xe8, 0x72, 0xc6, 0x9d, 0x1b, 0x56, 0x2c, 0x81, 0x3e, 0x4a, 0x28, 0x53, 0xd6, 0x23, 0x71, 0x88,
+	0x3a, 0xfd, 0x9d, 0xda, 0x7c, 0xd5, 0xf7, 0x09, 0x28, 0xd4, 0x66, 0x5c, 0xa1, 0x96, 0x33, 0xae,
+	0x66, 0x88, 0x4a, 0x7d, 0xd7, 0x82, 0x33, 0x09, 0x25, 0x40, 0xcf, 0x41, 0x41, 0xe6, 0x0e, 0xf5,
+	0xf9, 0x0a, 0x07, 0xea, 0xac, 0x84, 0xa4, 0xa1, 0x0d, 0x98, 0x27, 0x7d, 0xee, 0x85, 0x63, 0x6f,
+	0xb8, 0x64, 0xab, 0x43, 0x55, 0xaa, 0x61, 0xaa, 0xfa, 0x73, 0x61, 0x92, 0x2f, 0xa5, 0x0f, 0x4e,
+	0x1d, 0x69, 0xff, 0x28, 0x07, 0x28, 0x6c, 0xcc, 0x92, 0x74, 0xff, 0x08, 0x26, 0xb7, 0x55, 0xf6,
+	0xea, 0x68, 0xaf, 0x26, 0xd5, 0xb2, 0xf9, 0x70, 0x14, 0x60, 0xa2, 0xf7, 0x8f, 0xe7, 0x1c, 0xc1,
+	0xe0, 0x19, 0x42, 0xf7, 0x01, 0xb6, 0x1d, 0xd7, 0x61, 0xed, 0x31, 0x1f, 0x9f, 0xe5, 0x6d, 0x7e,
+	0x33, 0x44, 0xc0, 0x06, 0x9a, 0xfd, 0x27, 0x39, 0xe3, 0x7c, 0x4a, 0x73, 0x39, 0xd2, 0xbe, 0xbe,
+	0x14, 0x17, 0x66, 0x69, 0xf0, 0x45, 0x2d, 0x14, 0xcc, 0x7d, 0x98, 0xd8, 0x25, 0x7e, 0x90, 0xdc,
+	0x1f, 0xb1, 0xae, 0x65, 0xf0, 0x49, 0x3b, 0xda, 0xd3, 0x7b, 0xc4, 0x67, 0x58, 0x62, 0xa2, 0x6f,
+	0x8a, 0xb9, 0xd2, 0x5e, 0x60, 0x43, 0x33, 0x1b, 0x05, 0x4e, 0x7b, 0xe6, 0x02, 0x69, 0x8f, 0x61,
+	0x05, 0x68, 0x7f, 0x7f, 0xd2, 0x38, 0xf1, 0xda, 0x6c, 0xdf, 0x01, 0xd4, 0x21, 0x8c, 0xdf, 0x26,
+	0x6e, 0x53, 0x9c, 0x4f, 0xba, 0xed, 0x53, 0xd6, 0xd6, 0x2e, 0xda, 0xa2, 0x46, 0x41, 0xeb, 0x03,
+	0x3d, 0x70, 0xca, 0x28, 0x74, 0x25, 0x6e, 0x9d, 0x97, 0x92, 0xd6, 0xf9, 0x74, 0xa4, 0x6e, 0xe3,
+	0xd9, 0x67, 0xf3, 0xbc, 0x17, 0x4e, 0xe0, 0xbc, 0xff, 0x3a, 0xcc, 0x6d, 0x27, 0x9f, 0x58, 0x75,
+	0x59, 0xca, 0x1b, 0x63, 0xbe, 0xd0, 0x56, 0xcf, 0x1d, 0x44, 0xef, 0x72, 0x51, 0x33, 0x1e, 0x64,
+	0x84, 0xbc, 0xa0, 0x1e, 0x57, 0xc6, 0xcc, 0x2a, 0x1d, 0x32, 0xb2, 0xce, 0x25, 0xa2, 0xed, 0x64,
+	0x25, 0xae, 0x82, 0xc4, 0x31, 0x06, 0x09, 0x1d, 0x2c, 0x1e, 0xa7, 0x0e, 0xa2, 0x2b, 0xe1, 0x33,
+	0x84, 0x98, 0x8e, 0xf4, 0x65, 0xf3, 0x03, 0x0f, 0x08, 0x82, 0x84, 0xcd, 0x7e, 0xe8, 0x7b, 0x16,
+	0x9c, 0x13, 0x87, 0xf5, 0xc6, 0x43, 0xda, 0xe8, 0x0b, 0xa9, 0x04, 0x65, 0xfa, 0x0b, 0x65, 0x29,
+	0x8d, 0x11, 0xab, 0x93, 0xeb, 0x69, 0x10, 0x91, 0x63, 0x9e, 0x4a, 0xc6, 0xe9, 0x8c, 0xd1, 0x03,
+	0x69, 0x3b, 0x38, 0x95, 0x71, 0xcf, 0xd1, 0x93, 0x12, 0x25, 0x6d, 0x77, 0xb8, 0xb2, 0x3b, 0x9c,
+	0xda, 0x3f, 0xc9, 0x9b, 0xe6, 0x6a, 0xb4, 0x54, 0xc9, 0x7d, 0x98, 0xe0, 0x84, 0xed, 0x68, 0x2d,
+	0x78, 0x7b, 0x8c, 0x4a, 0xcb, 0x48, 0x17, 0xa4, 0x2b, 0x2e, 0x9b, 0x24, 0x26, 0x5a, 0x84, 0x1c,
+	0x61, 0xc9, 0xc4, 0xf9, 0x0a, 0xc3, 0x39, 0xc2, 0x64, 0x52, 0x7d, 0x5b, 0x87, 0x48, 0x51, 0x52,
+	0x7d, 0x1b, 0xe7, 0x9c, 0x6d, 0xf4, 0x3e, 0x14, 0x7c, 0xca, 0xfd, 0x3d, 0x6d, 0xcd, 0xaf, 0x8e,
+	0x61, 0xb8, 0xb0, 0x18, 0xaf, 0x44, 0x24, 0xff, 0xc4, 0x0a, 0x31, 0xb4, 0xb7, 0xc5, 0x13, 0xb0,
+	0xb7, 0x51, 0xd6, 0x29, 0x7f, 0x62, 0x59, 0xa7, 0x1f, 0x5a, 0xc6, 0x05, 0x1f, 0x2e, 0x14, 0xbd,
+	0x0b, 0x93, 0xdc, 0xe9, 0x52, 0xaf, 0xcf, 0xb3, 0x79, 0x4d, 0xe1, 0xbb, 0xa4, 0x34, 0x63, 0x9b,
+	0x0a, 0x02, 0x07, 0x58, 0x22, 0x94, 0xa4, 0xbe, 0xef, 0xf9, 0x9b, 0x6d, 0x61, 0x96, 0xbd, 0x8e,
+	0x72, 0x4d, 0x66, 0xa2, 0x50, 0xf2, 0x46, 0x8c, 0x8a, 0x13, 0xbd, 0xed, 0x1f, 0x99, 0xfe, 0xdd,
+	0xff, 0xff, 0xd2, 0xe1, 0x7f, 0xb4, 0x60, 0xee, 0x49, 0xd7, 0x0c, 0x7f, 0x33, 0xee, 0xb2, 0x5e,
+	0x1e, 0x63, 0x3d, 0x43, 0xdc, 0xd6, 0x0f, 0xe1, 0xa9, 0x74, 0x3d, 0x3e, 0x96, 0x8f, 0x6d, 0xfe,
+	0x3e, 0x29, 0x2b, 0xe9, 0x3e, 0x05, 0xea, 0x67, 0x9d, 0xa4, 0xbb, 0x93, 0x3b, 0x6e, 0x77, 0xc7,
+	0x37, 0x97, 0xa2, 0x3f, 0x4d, 0x42, 0x1f, 0xe9, 0x73, 0x66, 0x65, 0xf9, 0xd8, 0x65, 0x00, 0x66,
+	0xe8, 0x59, 0xfb, 0x27, 0x0b, 0xce, 0xa5, 0xf6, 0x0e, 0x65, 0x98, 0x3b, 0x49, 0x19, 0x5a, 0xc7,
+	0x2d, 0xc3, 0x1f, 0xe4, 0x60, 0x16, 0xd3, 0x9e, 0x17, 0x4b, 0x71, 0x6e, 0x04, 0x45, 0xdd, 0x19,
+	0x62, 0x82, 0xc4, 0xeb, 0x5f, 0x75, 0x32, 0x56, 0xcd, 0x2d, 0xd4, 0xa5, 0x1b, 0x38, 0x80, 0x23,
+	0xab, 0xff, 0x40, 0xf2, 0x55, 0xdd, 0x1c, 0x2a, 0x8d, 0xab, 0x00, 0x05, 0xb2, 0xac, 0x9e, 0xd1,
+	0xc6, 0xfd, 0x8d, 0x0c, 0x75, 0x38, 0x83, 0xc8, 0xb2, 0x19, 0x2b, 0x40, 0xfb, 0x93, 0x1c, 0xa8,
+	0xf8, 0xe1, 0x09, 0x58, 0xc7, 0x5f, 0x8e, 0x59, 0xc7, 0xe5, 0x51, 0x9d, 0x20, 0x21, 0x9e, 0x61,
+	0x39, 0x82, 0x64, 0x6c, 0x77, 0x31, 0x0b, 0xe8, 0xe3, 0xf3, 0x03, 0x7f, 0x6b, 0x41, 0x49, 0xf6,
+	0x7b, 0x02, 0x86, 0x76, 0x23, 0x6e, 0x68, 0x5f, 0xce, 0xb0, 0x8a, 0x21, 0x06, 0xf6, 0xbf, 0xf3,
+	0x7a, 0xf6, 0x61, 0xe4, 0xd8, 0x26, 0x7e, 0x53, 0x87, 0x44, 0x91, 0x96, 0x88, 0x46, 0xac, 0x68,
+	0xa1, 0x6e, 0x4f, 0x9e, 0x80, 0x6e, 0xff, 0xaa, 0x2a, 0x62, 0xa2, 0x8c, 0xd3, 0xe6, 0xcd, 0x30,
+	0xf6, 0xc9, 0x67, 0xae, 0xc6, 0xd2, 0x15, 0x63, 0x51, 0xde, 0x1d, 0x27, 0x50, 0xf1, 0x00, 0x1f,
+	0x11, 0x0f, 0xf5, 0x92, 0xc6, 0x4c, 0xc7, 0x09, 0x6f, 0x8c, 0x69, 0x39, 0x55, 0x3c, 0x34, 0xd0,
+	0x8c, 0x07, 0x19, 0xa1, 0x36, 0x4c, 0x9b, 0x75, 0xa4, 0xfa, 0x9c, 0x5e, 0xca, 0x5e, 0xb0, 0xaa,
+	0x1e, 0x87, 0xcd, 0x16, 0x1c, 0x43, 0xb6, 0xf7, 0x8b, 0x50, 0x36, 0x0e, 0x76, 0x22, 0x97, 0x39,
+	0x73, 0x32, 0xb9, 0xcc, 0xf4, 0xc8, 0xbb, 0x3c, 0x56, 0xe4, 0x7d, 0x31, 0x1e, 0x79, 0x3f, 0x93,
+	0x8c, 0xbc, 0x41, 0xae, 0x2e, 0x16, 0x75, 0x33, 0x38, 0xad, 0x43, 0xd0, 0xa0, 0x20, 0x58, 0x25,
+	0x33, 0xc6, 0x0e, 0x74, 0x91, 0xf0, 0x2c, 0x6f, 0xc6, 0x20, 0x71, 0x82, 0x85, 0xf0, 0x4c, 0x75,
+	0x4b, 0xbd, 0xdf, 0xed, 0x12, 0x7f, 0x6f, 0x61, 0x5a, 0x4e, 0x38, 0xf4, 0x4c, 0x6f, 0xc6, 0xa8,
+	0x38, 0xd1, 0x1b, 0x6d, 0x40, 0x51, 0x45, 0xb0, 0xba, 0xc8, 0xf4, 0x95, 0x2c, 0xc1, 0xb1, 0xf2,
+	0xcc, 0xd5, 0xdf, 0x58, 0xe3, 0x98, 0xc9, 0x87, 0xd2, 0x21, 0xc9, 0x87, 0x3b, 0x80, 0xbc, 0x2d,
+	0x19, 0x03, 0x34, 0x6f, 0xa9, 0x2f, 0xef, 0xc5, 0xa9, 0x2c, 0xca, 0xc8, 0x36, 0xdc, 0xb0, 0xbb,
+	0x03, 0x3d, 0x70, 0xca, 0x28, 0xa1, 0xd5, 0x3a, 0xec, 0x0d, 0x55, 0x41, 0x27, 0x1a, 0xb2, 0x86,
+	0x4d, 0x51, 0x1c, 0x27, 0x8b, 0x14, 0x6b, 0x09, 0x54, 0x3c, 0xc0, 0x07, 0x7d, 0x0c, 0x33, 0xe2,
+	0x08, 0x45, 0x8c, 0xe1, 0x88, 0x8c, 0xe7, 0x0e, 0xf6, 0x97, 0x66, 0xd6, 0x4d, 0x48, 0x1c, 0xe7,
+	0x60, 0xff, 0x41, 0x1e, 0xd2, 0x83, 0xee, 0xe8, 0xfb, 0x08, 0xeb, 0x31, 0xdf, 0x47, 0xbc, 0x07,
+	0x25, 0xc6, 0x89, 0xaf, 0x3e, 0x54, 0xc9, 0x8d, 0xf7, 0xa1, 0x4a, 0x3d, 0x00, 0xc0, 0x11, 0x56,
+	0x22, 0x03, 0x92, 0x3f, 0xd6, 0x0c, 0xc8, 0x25, 0x00, 0x19, 0x57, 0xd5, 0xbc, 0xbe, 0x7e, 0xf4,
+	0x9c, 0x89, 0x6c, 0xc2, 0x8d, 0x90, 0x82, 0x8d, 0x5e, 0xe8, 0x6a, 0x78, 0x29, 0xab, 0x57, 0xce,
+	0x0b, 0x03, 0xa5, 0x25, 0xc9, 0x1c, 0x5a, 0xca, 0xe7, 0xe5, 0x87, 0x94, 0xa2, 0xd9, 0xff, 0x9b,
+	0x83, 0x98, 0x31, 0x44, 0xdf, 0xb5, 0x60, 0x8e, 0x24, 0xbe, 0xe1, 0x0f, 0x7c, 0xc9, 0x5f, 0xca,
+	0xf6, 0xc3, 0x0a, 0x03, 0x3f, 0x01, 0x10, 0xbd, 0x2b, 0x25, 0xbb, 0x30, 0x3c, 0xc8, 0x14, 0xfd,
+	0xae, 0x05, 0x67, 0xc9, 0xe0, 0x8f, 0x34, 0xe8, 0x4d, 0x7f, 0x73, 0xec, 0x5f, 0x79, 0xa8, 0x3e,
+	0x7d, 0xb0, 0xbf, 0x94, 0xf6, 0xf3, 0x15, 0x38, 0x8d, 0x1d, 0xfa, 0x00, 0x26, 0x88, 0xdf, 0x0a,
+	0x52, 0xb0, 0xd9, 0xd9, 0x06, 0xbf, 0xbd, 0x11, 0xdd, 0xe8, 0x2b, 0x7e, 0x8b, 0x61, 0x09, 0x6a,
+	0xff, 0x38, 0x0f, 0xb3, 0xc9, 0xef, 0x29, 0x74, 0xb5, 0xe2, 0x44, 0x6a, 0xb5, 0xa2, 0xd0, 0x91,
+	0x06, 0x0f, 0x4b, 0x07, 0x23, 0x1d, 0x11, 0x8d, 0x58, 0xd1, 0x42, 0x1d, 0x91, 0x55, 0xce, 0x85,
+	0x23, 0xe8, 0x88, 0x2c, 0x6d, 0x8e, 0xb0, 0xd0, 0xd5, 0xf8, 0xdd, 0x62, 0x27, 0xef, 0x96, 0x39,
+	0x73, 0x2d, 0xe3, 0x26, 0x76, 0xbb, 0x50, 0x36, 0xf6, 0x41, 0x6b, 0xe2, 0xb5, 0xcc, 0x72, 0x8f,
+	0x8e, 0xdd, 0x19, 0x55, 0xe0, 0x12, 0x51, 0x4c, 0xfc, 0x48, 0xef, 0xa5, 0xb4, 0x8e, 0x94, 0xf9,
+	0x94, 0xe2, 0x32, 0xd0, 0xec, 0x7f, 0xb7, 0x60, 0x26, 0x56, 0x42, 0x2b, 0xb8, 0x05, 0xa5, 0xca,
+	0xe3, 0xff, 0x60, 0xc5, 0xbd, 0x10, 0x01, 0x1b, 0x68, 0xe8, 0x5b, 0x50, 0xee, 0x78, 0x6e, 0x8b,
+	0x32, 0x5e, 0xf7, 0xc8, 0x8e, 0xd6, 0x93, 0xac, 0x69, 0xa4, 0x85, 0x83, 0xfd, 0xa5, 0xf9, 0x75,
+	0x05, 0x53, 0xf3, 0xba, 0xbd, 0x0e, 0xe5, 0xaa, 0xa8, 0x1d, 0x9b, 0xe0, 0xf2, 0x75, 0xf4, 0x3d,
+	0xe2, 0xd3, 0xb6, 0xd7, 0x67, 0xf4, 0xab, 0xfa, 0x3a, 0x1a, 0x4e, 0xf0, 0xb8, 0x5f, 0x47, 0x23,
+	0xe0, 0xc3, 0x5f, 0x47, 0xc3, 0xbe, 0x5f, 0xd9, 0xd7, 0xd1, 0x70, 0x86, 0x43, 0xa2, 0xa0, 0xff,
+	0xc9, 0x19, 0xab, 0x88, 0x47, 0x42, 0xb9, 0xc7, 0x44, 0x42, 0x1f, 0xc2, 0x94, 0xe3, 0x72, 0xea,
+	0xef, 0x92, 0x8e, 0x4e, 0x03, 0x67, 0x3d, 0x8b, 0xe1, 0x52, 0xd7, 0x34, 0x0e, 0x0e, 0x11, 0x51,
+	0x07, 0xce, 0x05, 0xcf, 0x26, 0x3e, 0x25, 0xd1, 0xbb, 0xad, 0xae, 0x7d, 0x7a, 0x3d, 0xc8, 0xef,
+	0xdf, 0x4c, 0xeb, 0xf4, 0x68, 0x18, 0x01, 0xa7, 0x83, 0x22, 0x06, 0x33, 0xcc, 0x48, 0x01, 0x04,
+	0x37, 0xe2, 0x88, 0x4f, 0x4e, 0xc9, 0xac, 0x89, 0x51, 0x30, 0x65, 0x82, 0xe2, 0x38, 0x0f, 0xfb,
+	0x5f, 0xf2, 0x70, 0x26, 0x71, 0xd2, 0x12, 0xe1, 0x48, 0xe9, 0x49, 0x86, 0x23, 0xc5, 0xb1, 0xc2,
+	0x91, 0x74, 0x4f, 0x79, 0x62, 0x2c, 0x4f, 0xf9, 0x2d, 0xe5, 0xad, 0xea, 0x9d, 0x5b, 0x5b, 0xd5,
+	0x45, 0xf1, 0xa1, 0x34, 0xd7, 0x4d, 0x22, 0x8e, 0xf7, 0x95, 0xee, 0x44, 0x73, 0xf0, 0xc7, 0x0f,
+	0xb4, 0xab, 0xfd, 0x66, 0xd6, 0x02, 0xc1, 0x10, 0x40, 0xb9, 0x13, 0x29, 0x04, 0x9c, 0xc6, 0xae,
+	0x7a, 0xe7, 0xb3, 0x2f, 0xcf, 0x9f, 0xfa, 0xfc, 0xcb, 0xf3, 0xa7, 0xbe, 0xf8, 0xf2, 0xfc, 0xa9,
+	0xef, 0x1c, 0x9c, 0xb7, 0x3e, 0x3b, 0x38, 0x6f, 0x7d, 0x7e, 0x70, 0xde, 0xfa, 0xe2, 0xe0, 0xbc,
+	0xf5, 0x93, 0x83, 0xf3, 0xd6, 0xf7, 0x7e, 0x7a, 0xfe, 0xd4, 0xfd, 0xe7, 0x47, 0xf9, 0xc9, 0xb4,
+	0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x28, 0x9c, 0x2e, 0x6d, 0x59, 0x4d, 0x00, 0x00,
 }
 
 func (m *AnalysisRunArgument) Marshal() (dAtA []byte, err error) {
@@ -2997,6 +2998,39 @@ func (m *DiscoveredImageReference) MarshalToSizedBuffer(dAtA []byte) (int, error
 	return len(dAtA) - i, nil
 }
 
+func (m *ExpressionVariable) 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 *ExpressionVariable) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *ExpressionVariable) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	i -= len(m.Value)
+	copy(dAtA[i:], m.Value)
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Value)))
+	i--
+	dAtA[i] = 0x12
+	i -= len(m.Name)
+	copy(dAtA[i:], m.Name)
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name)))
+	i--
+	dAtA[i] = 0xa
+	return len(dAtA) - i, nil
+}
+
 func (m *Freight) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -4976,39 +5010,6 @@ func (m *PromotionTemplateSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	return len(dAtA) - i, nil
 }
 
-func (m *ExpressionVariable) 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 *ExpressionVariable) MarshalTo(dAtA []byte) (int, error) {
-	size := m.Size()
-	return m.MarshalToSizedBuffer(dAtA[:size])
-}
-
-func (m *ExpressionVariable) MarshalToSizedBuffer(dAtA []byte) (int, error) {
-	i := len(dAtA)
-	_ = i
-	var l int
-	_ = l
-	i -= len(m.Value)
-	copy(dAtA[i:], m.Value)
-	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Value)))
-	i--
-	dAtA[i] = 0x12
-	i -= len(m.Name)
-	copy(dAtA[i:], m.Name)
-	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name)))
-	i--
-	dAtA[i] = 0xa
-	return len(dAtA) - i, nil
-}
-
 func (m *RepoSubscription) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -5188,6 +5189,20 @@ func (m *StageSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	_ = i
 	var l int
 	_ = l
+	if len(m.Vars) > 0 {
+		for iNdEx := len(m.Vars) - 1; iNdEx >= 0; iNdEx-- {
+			{
+				size, err := m.Vars[iNdEx].MarshalToSizedBuffer(dAtA[:i])
+				if err != nil {
+					return 0, err
+				}
+				i -= size
+				i = encodeVarintGenerated(dAtA, i, uint64(size))
+			}
+			i--
+			dAtA[i] = 0x3a
+		}
+	}
 	if m.PromotionTemplate != nil {
 		{
 			size, err := m.PromotionTemplate.MarshalToSizedBuffer(dAtA[:i])
@@ -6132,6 +6147,19 @@ func (m *DiscoveredImageReference) Size() (n int) {
 	return n
 }
 
+func (m *ExpressionVariable) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	l = len(m.Name)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.Value)
+	n += 1 + l + sovGenerated(uint64(l))
+	return n
+}
+
 func (m *Freight) Size() (n int) {
 	if m == nil {
 		return 0
@@ -6866,19 +6894,6 @@ func (m *PromotionTemplateSpec) Size() (n int) {
 	return n
 }
 
-func (m *ExpressionVariable) Size() (n int) {
-	if m == nil {
-		return 0
-	}
-	var l int
-	_ = l
-	l = len(m.Name)
-	n += 1 + l + sovGenerated(uint64(l))
-	l = len(m.Value)
-	n += 1 + l + sovGenerated(uint64(l))
-	return n
-}
-
 func (m *RepoSubscription) Size() (n int) {
 	if m == nil {
 		return 0
@@ -6954,6 +6969,12 @@ func (m *StageSpec) Size() (n int) {
 		l = m.PromotionTemplate.Size()
 		n += 1 + l + sovGenerated(uint64(l))
 	}
+	if len(m.Vars) > 0 {
+		for _, e := range m.Vars {
+			l = e.Size()
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
 	return n
 }
 
@@ -7431,6 +7452,17 @@ func (this *DiscoveredImageReference) String() string {
 	}, "")
 	return s
 }
+func (this *ExpressionVariable) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&ExpressionVariable{`,
+		`Name:` + fmt.Sprintf("%v", this.Name) + `,`,
+		`Value:` + fmt.Sprintf("%v", this.Value) + `,`,
+		`}`,
+	}, "")
+	return s
+}
 func (this *Freight) String() string {
 	if this == nil {
 		return "nil"
@@ -8022,18 +8054,7 @@ func (this *PromotionTemplateSpec) String() string {
 	}, "")
 	return s
 }
-func (this *ExpressionVariable) String() string {
-	if this == nil {
-		return "nil"
-	}
-	s := strings.Join([]string{`&ExpressionVariable{`,
-		`Name:` + fmt.Sprintf("%v", this.Name) + `,`,
-		`Value:` + fmt.Sprintf("%v", this.Value) + `,`,
-		`}`,
-	}, "")
-	return s
-}
-func (this *RepoSubscription) String() string {
+func (this *RepoSubscription) String() string {
 	if this == nil {
 		return "nil"
 	}
@@ -8082,11 +8103,17 @@ func (this *StageSpec) String() string {
 		repeatedStringForRequestedFreight += strings.Replace(strings.Replace(f.String(), "FreightRequest", "FreightRequest", 1), `&`, ``, 1) + ","
 	}
 	repeatedStringForRequestedFreight += "}"
+	repeatedStringForVars := "[]ExpressionVariable{"
+	for _, f := range this.Vars {
+		repeatedStringForVars += strings.Replace(strings.Replace(f.String(), "ExpressionVariable", "ExpressionVariable", 1), `&`, ``, 1) + ","
+	}
+	repeatedStringForVars += "}"
 	s := strings.Join([]string{`&StageSpec{`,
 		`Verification:` + strings.Replace(this.Verification.String(), "Verification", "Verification", 1) + `,`,
 		`Shard:` + fmt.Sprintf("%v", this.Shard) + `,`,
 		`RequestedFreight:` + repeatedStringForRequestedFreight + `,`,
 		`PromotionTemplate:` + strings.Replace(this.PromotionTemplate.String(), "PromotionTemplate", "PromotionTemplate", 1) + `,`,
+		`Vars:` + repeatedStringForVars + `,`,
 		`}`,
 	}, "")
 	return s
@@ -11041,6 +11068,120 @@ func (m *DiscoveredImageReference) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *ExpressionVariable) 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: ExpressionVariable: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: ExpressionVariable: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return 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.Name = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Value", 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.Value = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		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 *Freight) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
@@ -17262,120 +17403,6 @@ func (m *PromotionTemplateSpec) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
-func (m *ExpressionVariable) 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: ExpressionVariable: wiretype end group for non-group")
-		}
-		if fieldNum <= 0 {
-			return fmt.Errorf("proto: ExpressionVariable: illegal tag %d (wire type %d)", fieldNum, wire)
-		}
-		switch fieldNum {
-		case 1:
-			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
-			}
-			var stringLen uint64
-			for shift := uint(0); ; shift += 7 {
-				if shift >= 64 {
-					return 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.Name = string(dAtA[iNdEx:postIndex])
-			iNdEx = postIndex
-		case 2:
-			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Value", 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.Value = string(dAtA[iNdEx:postIndex])
-			iNdEx = postIndex
-		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 *RepoSubscription) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
@@ -17967,6 +17994,40 @@ func (m *StageSpec) Unmarshal(dAtA []byte) error {
 				return err
 			}
 			iNdEx = postIndex
+		case 7:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Vars = append(m.Vars, ExpressionVariable{})
+			if err := m.Vars[len(m.Vars)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := skipGenerated(dAtA[iNdEx:])
diff --git a/charts/kargo/README.md b/charts/kargo/README.md
index 40211d99..2bdd5502 100644
--- a/charts/kargo/README.md
+++ b/charts/kargo/README.md
@@ -111,6 +111,7 @@ the Kargo controller is running.
 | `api.oidc.clientID`                         | The client ID for the OIDC client. If Dex is enabled, this value will be ignored and the client ID will be automatically configured. If Dex is not enabled, this should be set to the client ID provided to you by your identity provider.                                                                                                                                                                                                                                                                                                                                                                                                                                          | `nil`                    |
 | `api.oidc.cliClientID`                      | The client ID for the OIDC client used by CLI (optional). Needed by some OIDC providers (such as Dex) that require a separate Client ID for web app login vs. CLI login (`http://localhost`). If Dex is enabled, this value will be ignored and cli client ID will be automatically configured. If Dex is not enabled, and a different client app is configured for localhost CLI login, this should be the client ID configured in the IdP.                                                                                                                                                                                                                                        | `nil`                    |
 | `api.oidc.additionalScopes`                 | The additional scopes to send to the OIDC provider. This should be set to the scopes you wish to be provided to your identity provider from clients of Kargo, the scopes openid, profile and email are always requested and don't need to be added, this value is intended for any additional ones you require.                                                                                                                                                                                                                                                                                                                                                                     | `["groups"]`             |
+| `api.oidc.usernameClaim`                    | The claim to use as the username for the user.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | `email`                  |
 | `api.oidc.admins.claims`                    | Subjects having any of these claims will automatically be Kargo admins.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | `{}`                     |
 | `api.oidc.viewers.claims`                   | Subjects having any of these claims will automatically receive read-only access to all Kargo resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | `{}`                     |
 | `api.oidc.globalServiceAccounts.namespaces` | List of namespaces to look for shared service accounts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | `[]`                     |
diff --git a/charts/kargo/templates/api/cluster-role.yaml b/charts/kargo/templates/api/cluster-role.yaml
index 0a35ca02..2f51b917 100644
--- a/charts/kargo/templates/api/cluster-role.yaml
+++ b/charts/kargo/templates/api/cluster-role.yaml
@@ -33,22 +33,6 @@ rules:
       - watch
       - create
       - patch
-  - apiGroups:
-      - ""
-    resources:
-      - configmaps
-    verbs:
-      - get
-      - list
-      - watch
-  - apiGroups:
-      - ""
-    resources:
-      - secrets
-    verbs:
-      - get
-      - list
-      - watch
   - apiGroups:
       - authorization.k8s.io
     resources:
diff --git a/charts/kargo/templates/api/configmap.yaml b/charts/kargo/templates/api/configmap.yaml
index ece6b8c6..cc369b68 100644
--- a/charts/kargo/templates/api/configmap.yaml
+++ b/charts/kargo/templates/api/configmap.yaml
@@ -49,6 +49,7 @@ data:
   {{- if .Values.api.oidc.cliClientID }}
   OIDC_CLI_CLIENT_ID: {{ quote .Values.api.oidc.cliClientID }}
   {{- end }}
+  OIDC_USERNAME_CLAIM: {{ quote .Values.api.oidc.usernameClaim | default "email" }}
   {{- end }}
   {{- end }}
   {{- if .Values.api.argocd.urls }}
diff --git a/charts/kargo/values.yaml b/charts/kargo/values.yaml
index 295be553..35f44c83 100755
--- a/charts/kargo/values.yaml
+++ b/charts/kargo/values.yaml
@@ -211,6 +211,8 @@ api:
     ## @param api.oidc.additionalScopes The additional scopes to send to the OIDC provider. This should be set to the scopes you wish to be provided to your identity provider from clients of Kargo, the scopes openid, profile and email are always requested and don't need to be added, this value is intended for any additional ones you require.
     additionalScopes:
     - groups
+    ## @param api.oidc.usernameClaim The claim to use as the username for the user.
+    usernameClaim: email
 
     admins:
       ## @param api.oidc.admins.claims Subjects having any of these claims will automatically be Kargo admins.
diff --git a/docs/docs/50-user-guide/60-reference-docs/50-analysis-templates.md b/docs/docs/50-user-guide/60-reference-docs/50-analysis-templates.md
index 12b1b5b6..5498c242 100644
--- a/docs/docs/50-user-guide/60-reference-docs/50-analysis-templates.md
+++ b/docs/docs/50-user-guide/60-reference-docs/50-analysis-templates.md
@@ -97,6 +97,40 @@ spec:
         jsonPath: "{$.results.ok}"
 ```
 
+## Interval and Count
+
+To collect multiple measurements over a longer duration, use the 
+`count` and `interval` fields. This allows you to define how many
+measurements to take and how frequently to take them.
+
+In the example below, the analysis is configured to take 20
+measurements at 3-minute intervals, resulting in a total duration
+of approximately 1 hour:
+
+```yaml
+apiVersion: argoproj.io/v1alpha1
+kind: AnalysisTemplate
+metadata:
+  name: count-interval-example
+spec:
+  metrics:
+  - name: test
+    # Number of measurements to take
+    count: 20
+    # Time interval between each measurement as a duration string
+    interval: 3m
+    provider:
+      web:
+        url: https://pokeapi.co/api/v2/pokemon/pikachu
+```
+
+:::caution
+When specifying an `interval`, you must also specify a `count`. Without 
+it, the AnalysisRun would collect an indefinite amount of measurements
+and never complete (until terminated).
+:::
+
+
 ## Success Condition
 
 When interpreting the result of a query, an
diff --git a/hack/codegen/proto.sh b/hack/codegen/proto.sh
index f6905d07..9b5cce90 100755
--- a/hack/codegen/proto.sh
+++ b/hack/codegen/proto.sh
@@ -20,6 +20,36 @@ readonly APIMACHINERY_PKGS=(
   "-k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
+# Default to cleaning up the temporary directory
+CLEANUP_TMP="true"
+
+# Function to display usage
+function usage() {
+  echo "Usage: $0 [options]"
+  echo "Options:"
+  echo "  --no-cleanup    Don't clean up temporary directory after execution"
+  echo "  -h, --help      Display this help message"
+}
+
+# Parse command line arguments
+while [[ $# -gt 0 ]]; do
+  case "$1" in
+    --no-cleanup)
+      CLEANUP_TMP="false"
+      shift
+      ;;
+    -h|--help)
+      usage
+      exit 0
+      ;;
+    *)
+      echo "Unknown option: $1"
+      usage
+      exit 1
+      ;;
+  esac
+done
+
 function main() {
   set -x
 
@@ -78,9 +108,9 @@ function main() {
   { msg "Copying generated .proto and .pb.go files back to the project root..."; } 2> /dev/null
   find "$build_src_dir/api" \( \
     -name '*.proto' -o \
-    -name '*.pg.go' \
+    -name '*.pb.go' \
   \) -type f | while read -r file; do
-    rel_path="${file#$build_src_dir/}"
+    rel_path="${file#"$build_src_dir"/}"
     dest_file="$proj_dir/$rel_path"
     dest_dir=$(dirname "$dest_file")
     mkdir -p "$dest_dir"
@@ -138,6 +168,14 @@ function clean() {
   { msg "Cleaning up all intermediate resources..."; } 2> /dev/null
   rm -rf "${proj_dir}/vendor" || true
   rm -rf "${proj_dir}/tmp" || true
+
+  if [[ "${CLEANUP_TMP}" == "true" ]]; then
+    { msg "Cleaning up temporary directory..."; } 2> /dev/null
+    rm -rf "${tmp_dir}" || true
+  else
+    { msg "Temporary directory '${tmp_dir}' preserved"; } 2> /dev/null
+  fi
+
   { msg "Done"; } 2> /dev/null
 }
 
diff --git a/internal/api/event.go b/internal/api/event.go
index 02d183d3..ce8d250a 100644
--- a/internal/api/event.go
+++ b/internal/api/event.go
@@ -1,6 +1,8 @@
 package api
 
 import (
+	"fmt"
+	"os"
 	"time"
 
 	authnv1 "k8s.io/api/authentication/v1"
@@ -21,28 +23,23 @@ func FormatEventControllerActor(name string) string {
 // 3. If the subject is available, it returns subject in "subject:<subject>" format.
 // 4. Otherwise, it returns EventActorUnknown.
 func FormatEventUserActor(u user.Info) string {
-	var email, subject string
+	if u.IsAdmin {
+		return kargoapi.EventActorAdmin
+	}
+	if u.Username != "" {
+		return formatOIDCUsername(u.Username)
+	}
 	if emailClaim, ok := u.Claims["email"]; ok {
-		if emailStr, ok := emailClaim.(string); ok {
-			email = emailStr
+		if email, ok := emailClaim.(string); ok {
+			return kargoapi.EventActorEmailPrefix + email
 		}
 	}
 	if subClaim, ok := u.Claims["sub"]; ok {
-		if subStr, ok := subClaim.(string); ok {
-			subject = subStr
+		if sub, ok := subClaim.(string); ok {
+			return kargoapi.EventActorSubjectPrefix + sub
 		}
 	}
-
-	switch {
-	case u.IsAdmin:
-		return kargoapi.EventActorAdmin
-	case email != "":
-		return kargoapi.EventActorEmailPrefix + email
-	case subject != "":
-		return kargoapi.EventActorSubjectPrefix + subject
-	default:
-		return kargoapi.EventActorUnknown
-	}
+	return kargoapi.EventActorUnknown
 }
 
 func FormatEventKubernetesUserActor(u authnv1.UserInfo) string {
@@ -62,3 +59,7 @@ func NewFreightApprovedEventAnnotations(actor string, f *kargoapi.Freight, stage
 	}
 	return annotations
 }
+
+func formatOIDCUsername(oidcUsername string) string {
+	return fmt.Sprintf("%s:%s", os.Getenv("OIDC_USERNAME_CLAIM"), oidcUsername)
+}
diff --git a/internal/server/oidc/config.go b/internal/server/oidc/config.go
index 1a67e88b..76804202 100644
--- a/internal/server/oidc/config.go
+++ b/internal/server/oidc/config.go
@@ -22,6 +22,8 @@ type Config struct {
 	// AdditionalScopes are any more scopes to be requested during the authorization code flow
 	// on top of the default Scopes.
 	AdditionalScopes []string `envconfig:"OIDC_ADDITIONAL_SCOPES"`
+	// UsernameClaim is the claim to use as the username for the user.
+	UsernameClaim string `envconfig:"OIDC_USERNAME_CLAIM" default:"email"`
 
 	// GlobalServiceAccountNamespaces is the list of namespaces to look up
 	// for shared service accounts.
diff --git a/internal/server/option/auth.go b/internal/server/option/auth.go
index 085c09be..d648b756 100644
--- a/internal/server/option/auth.go
+++ b/internal/server/option/auth.go
@@ -398,12 +398,23 @@ func (a *authInterceptor) authenticate(
 		if err != nil {
 			return ctx, fmt.Errorf("list service accounts for user: %w", err)
 		}
+		var username string
+		if un, ok := c[a.cfg.OIDCConfig.UsernameClaim]; ok {
+			if username, ok = un.(string); !ok {
+				return ctx, fmt.Errorf(
+					"claim %q must be a string; got %T",
+					a.cfg.OIDCConfig.UsernameClaim,
+					un,
+				)
+			}
+		}
 		return user.ContextWithInfo(
 			ctx,
 			user.Info{
 				Claims:                     c,
 				ServiceAccountsByNamespace: sa,
 				BearerToken:                rawToken,
+				Username:                   username,
 			},
 		), nil
 
diff --git a/internal/server/user/user.go b/internal/server/user/user.go
index 0f9774eb..bd19a82d 100644
--- a/internal/server/user/user.go
+++ b/internal/server/user/user.go
@@ -27,6 +27,9 @@ type Info struct {
 	// ServiceAccountsByNamespace is the mapping of namespace names to sets of
 	// ServiceAccounts that a user has been mapped to.
 	ServiceAccountsByNamespace map[string]map[types.NamespacedName]struct{}
+	// Username is the username of the user. This is often the email address
+	// of the user, but may be different depending on configuration.
+	Username string
 }
 
 // ContextWithInfo returns a context.Context that has been augmented with



Test patch:
diff --git a/internal/api/events_test.go b/internal/api/events_test.go
new file mode 100644
index 00000000..68895b64
--- /dev/null
+++ b/internal/api/events_test.go
@@ -0,0 +1,54 @@
+package api
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/require"
+
+	kargoapi "github.com/akuity/kargo/api/v1alpha1"
+	"github.com/akuity/kargo/internal/server/user"
+)
+
+func TestFormatEventUserActor(t *testing.T) {
+	for _, test := range []struct {
+		name     string
+		user     user.Info
+		expected string
+	}{
+		{
+			name:     "admin",
+			user:     user.Info{IsAdmin: true},
+			expected: kargoapi.EventActorAdmin,
+		},
+		{
+			name: "sub",
+			user: user.Info{
+				Claims: map[string]any{
+					"sub": "subject",
+				},
+			},
+			expected: kargoapi.EventActorSubjectPrefix + "subject",
+		},
+		{
+			name: "email",
+			user: user.Info{
+				Claims: map[string]any{
+					"email": "email@inbox.com",
+				},
+			},
+			expected: kargoapi.EventActorEmailPrefix + "email@inbox.com",
+		},
+		{
+			name: "oidc-username",
+			user: user.Info{
+				Username: "oidc-username",
+			},
+			expected: formatOIDCUsername("oidc-username"),
+		},
+	} {
+		t.Run(test.name, func(t *testing.T) {
+			result := FormatEventUserActor(test.user)
+			require.Equal(t, test.expected, result)
+		})
+	}
+}
diff --git a/internal/server/option/auth_test.go b/internal/server/option/auth_test.go
index 8958f3ec..130c4898 100644
--- a/internal/server/option/auth_test.go
+++ b/internal/server/option/auth_test.go
@@ -308,7 +308,8 @@ func TestAuthenticate(t *testing.T) {
 			authInterceptor: &authInterceptor{
 				cfg: config.ServerConfig{
 					OIDCConfig: &libOIDC.Config{
-						IssuerURL: testIDPIssuer,
+						IssuerURL:     testIDPIssuer,
+						UsernameClaim: "preferred_username",
 					},
 				},
 				parseUnverifiedJWTFn: func(_ string, claims jwt.Claims) (*jwt.Token, []string, error) {
@@ -322,8 +323,9 @@ func TestAuthenticate(t *testing.T) {
 					string,
 				) (claims, error) {
 					return claims{
-						"sub":   "ironman",
-						"email": "tony@starkindustries.com",
+						"preferred_username": "foo",
+						"sub":                "ironman",
+						"email":              "tony@starkindustries.com",
 						"groups": []string{
 							"avengers",
 							"shield",
@@ -345,6 +347,7 @@ func TestAuthenticate(t *testing.T) {
 				u, ok := user.InfoFromContext(ctx)
 				require.True(t, ok)
 				require.False(t, u.IsAdmin)
+				require.Equal(t, u.Username, "foo")
 				require.Equal(t, "ironman", u.Claims["sub"])
 				require.Equal(t, "tony@starkindustries.com", u.Claims["email"])
 				require.Equal(t, []string{"avengers", "shield"}, u.Claims["groups"])