Repository: akuity/kargo
Pull request #1882 (2024-04-22 12:27:39)

chore(api): tidy various bits

netlify[bot]: ### <span aria-hidden="true">👷</span> Deploy Preview for *docs-kargo-akuity-io* processing.


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | 379c7813da4729d320ce1dd3b790540cd43aff01 |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/docs-kargo-akuity-io/deploys/662657be1585b70008148430 |
codecov[bot]: ## [Codecov](https://app.codecov.io/gh/akuity/kargo/pull/1882?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=akuity) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 46.97%. Comparing base [(`54c1149`)](https://app.codecov.io/gh/akuity/kargo/commit/54c11493f3fa0e159a5bab4891785653c54aaae7?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=akuity) to head [(`379c781`)](https://app.codecov.io/gh/akuity/kargo/pull/1882?dropdown=coverage&src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=akuity).


<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##             main    #1882      +/-   ##
==========================================
- Coverage   47.01%   46.97%   -0.04%     
==========================================
  Files         219      219              
  Lines       14335    14332       -3     
==========================================
- Hits         6740     6733       -7     
- Misses       7296     7297       +1     
- Partials      299      302       +3     
```



</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/akuity/kargo/pull/1882?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=akuity).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=akuity).


Patch:
diff --git a/api/v1alpha1/annotations.go b/api/v1alpha1/annotations.go
index 21cc55c5..31caa87a 100644
--- a/api/v1alpha1/annotations.go
+++ b/api/v1alpha1/annotations.go
@@ -3,8 +3,9 @@ package v1alpha1
 import "encoding/json"
 
 const (
-	// AnnotationKeyCreateActor is an annotation key that can be injected to a resource
-	// by the Kargo controlplane to indicate the actor that created the resource.
+	// AnnotationKeyCreateActor is an annotation key that can be injected to a
+	// resource by the Kargo control plane to indicate the actor that created
+	// the resource.
 	AnnotationKeyCreateActor = "kargo.akuity.io/create-actor"
 
 	// AnnotationKeyRefresh is an annotation key that can be set on a resource
@@ -25,27 +26,34 @@ const (
 	// aborted.
 	AnnotationKeyAbort = "kargo.akuity.io/abort"
 
+	// AnnotationKeyDescription is an annotation key that can be set on a
+	// resource to provide a description of it. The value of the annotation may
+	// be used by the Kargo UI to display additional information about the
+	// resource.
 	AnnotationKeyDescription = "kargo.akuity.io/description"
 
-	AnnotationKeyOIDCEmails   = "rbac.kargo.akuity.io/email"
-	AnnotationKeyOIDCGroups   = "rbac.kargo.akuity.io/groups"
-	AnnotationKeyOIDCSubjects = "rbac.kargo.akuity.io/sub"
+	// AnnotationKeyOIDCEmails is an annotation key that can be set on a
+	// ServiceAccount to associate it with a list of email addresses. The
+	// annotation is used to grant permissions to the ServiceAccount based on
+	// the email claim from a user who authenticates using OIDC.
+	// The value of the annotation should be a comma-separated list.
+	AnnotationKeyOIDCEmails = "rbac.kargo.akuity.io/email"
+
+	// AnnotationKeyOIDCGroups is an annotation key that can be set on a
+	// ServiceAccount to associate it with a list of groups from an OIDC
+	// provider. The annotation is used to grant permissions to the
+	// ServiceAccount based on the groups claim from a user who authenticates
+	// using OIDC.
+	// The value of the annotation should be a comma-separated list.
+	AnnotationKeyOIDCGroups = "rbac.kargo.akuity.io/groups"
 
-	AnnotationKeyEventActor                  = "event.kargo.akuity.io/actor"
-	AnnotationKeyEventProject                = "event.kargo.akuity.io/project"
-	AnnotationKeyEventPromotionName          = "event.kargo.akuity.io/promotion-name"
-	AnnotationKeyEventPromotionCreateTime    = "event.kargo.akuity.io/promotion-create-time"
-	AnnotationKeyEventFreightAlias           = "event.kargo.akuity.io/freight-alias"
-	AnnotationKeyEventFreightName            = "event.kargo.akuity.io/freight-name"
-	AnnotationKeyEventFreightCreateTime      = "event.kargo.akuity.io/freight-create-time"
-	AnnotationKeyEventFreightCommits         = "event.kargo.akuity.io/freight-commits"
-	AnnotationKeyEventFreightImages          = "event.kargo.akuity.io/freight-images"
-	AnnotationKeyEventFreightCharts          = "event.kargo.akuity.io/freight-charts"
-	AnnotationKeyEventStageName              = "event.kargo.akuity.io/stage-name"
-	AnnotationKeyEventAnalysisRunName        = "event.kargo.akuity.io/analysis-run-name"
-	AnnotationKeyEventVerificationPending    = "event.kargo.akuity.io/verification-pending"
-	AnnotationKeyEventVerificationStartTime  = "event.kargo.akuity.io/verification-start-time"
-	AnnotationKeyEventVerificationFinishTime = "event.kargo.akuity.io/verification-finish-time"
+	// AnnotationKeyOIDCSubjects is an annotation key that can be set on a
+	// ServiceAccount to associate it with a list of subjects from an OIDC
+	// provider. The annotation is used to grant permissions to the
+	// ServiceAccount based on the subject claim from a user who authenticates
+	// using OIDC.
+	// The value of the annotation should be a comma-separated list.
+	AnnotationKeyOIDCSubjects = "rbac.kargo.akuity.io/sub"
 )
 
 // RefreshAnnotationValue returns the value of the AnnotationKeyRefresh
diff --git a/api/v1alpha1/event.go b/api/v1alpha1/event.go
index 6b4ac4bd..6a2f0d54 100644
--- a/api/v1alpha1/event.go
+++ b/api/v1alpha1/event.go
@@ -11,6 +11,24 @@ import (
 	"github.com/akuity/kargo/internal/logging"
 )
 
+const (
+	AnnotationKeyEventActor                  = "event.kargo.akuity.io/actor"
+	AnnotationKeyEventProject                = "event.kargo.akuity.io/project"
+	AnnotationKeyEventPromotionName          = "event.kargo.akuity.io/promotion-name"
+	AnnotationKeyEventPromotionCreateTime    = "event.kargo.akuity.io/promotion-create-time"
+	AnnotationKeyEventFreightAlias           = "event.kargo.akuity.io/freight-alias"
+	AnnotationKeyEventFreightName            = "event.kargo.akuity.io/freight-name"
+	AnnotationKeyEventFreightCreateTime      = "event.kargo.akuity.io/freight-create-time"
+	AnnotationKeyEventFreightCommits         = "event.kargo.akuity.io/freight-commits"
+	AnnotationKeyEventFreightImages          = "event.kargo.akuity.io/freight-images"
+	AnnotationKeyEventFreightCharts          = "event.kargo.akuity.io/freight-charts"
+	AnnotationKeyEventStageName              = "event.kargo.akuity.io/stage-name"
+	AnnotationKeyEventAnalysisRunName        = "event.kargo.akuity.io/analysis-run-name"
+	AnnotationKeyEventVerificationPending    = "event.kargo.akuity.io/verification-pending"
+	AnnotationKeyEventVerificationStartTime  = "event.kargo.akuity.io/verification-start-time"
+	AnnotationKeyEventVerificationFinishTime = "event.kargo.akuity.io/verification-finish-time"
+)
+
 const (
 	EventReasonPromotionCreated                = "PromotionCreated"
 	EventReasonPromotionSucceeded              = "PromotionSucceeded"
diff --git a/api/v1alpha1/freight_helpers.go b/api/v1alpha1/freight_helpers.go
index 4b3509da..7888d981 100644
--- a/api/v1alpha1/freight_helpers.go
+++ b/api/v1alpha1/freight_helpers.go
@@ -91,7 +91,7 @@ func GetFreightByAlias(
 //
 //  1. No upstreamStages are specified
 //     OR
-//  2. The Freight has has been verified in ANY of the specified upstream stages
+//  2. The Freight has been verified in ANY of the specified upstream stages
 //     OR
 //  3. The Freight is approved for the specified stage
 //
diff --git a/api/v1alpha1/freight_types.go b/api/v1alpha1/freight_types.go
index 3f3e004c..cc127141 100644
--- a/api/v1alpha1/freight_types.go
+++ b/api/v1alpha1/freight_types.go
@@ -7,15 +7,16 @@ import (
 	"sort"
 	"strings"
 
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
 	"github.com/akuity/kargo/internal/git"
 	"github.com/akuity/kargo/internal/helm"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-//+kubebuilder:object:root=true
-//+kubebuilder:subresource:status
-//+kubebuilder:printcolumn:name=Alias,type=string,JSONPath=`.metadata.labels.kargo\.akuity\.io/alias`
-//+kubebuilder:printcolumn:name=Age,type=date,JSONPath=`.metadata.creationTimestamp`
+// +kubebuilder:object:root=true
+// +kubebuilder:subresource:status
+// +kubebuilder:printcolumn:name=Alias,type=string,JSONPath=`.metadata.labels.kargo\.akuity\.io/alias`
+// +kubebuilder:printcolumn:name=Age,type=date,JSONPath=`.metadata.creationTimestamp`
 
 // Freight represents a collection of versioned artifacts.
 type Freight struct {
@@ -151,7 +152,7 @@ type VerifiedStage struct{}
 // approved.
 type ApprovedStage struct{}
 
-//+kubebuilder:object:root=true
+// +kubebuilder:object:root=true
 
 // FreightList is a list of Freight resources.
 type FreightList struct {
diff --git a/api/v1alpha1/generated.pb.go b/api/v1alpha1/generated.pb.go
index 914926d1..b4d2370f 100644
--- a/api/v1alpha1/generated.pb.go
+++ b/api/v1alpha1/generated.pb.go
@@ -1811,222 +1811,222 @@ func init() {
 }
 
 var fileDescriptor_e26b7f7bbc391025 = []byte{
-	// 3439 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4d, 0x6c, 0x24, 0xd5,
-	0xb5, 0x9e, 0xea, 0x6e, 0xb7, 0xdd, 0xa7, 0xfd, 0x7b, 0xed, 0x19, 0x8c, 0x79, 0xe3, 0x19, 0x15,
-	0x3c, 0x04, 0x0f, 0x68, 0xbf, 0x99, 0xc1, 0x30, 0x0c, 0x3c, 0x78, 0x6e, 0xcf, 0x9f, 0x07, 0xcf,
-	0xe0, 0x5c, 0x7b, 0x06, 0x32, 0x80, 0x92, 0xeb, 0xee, 0xeb, 0xee, 0xc2, 0xdd, 0x5d, 0x45, 0xdd,
-	0x6a, 0x0f, 0x0e, 0x52, 0x12, 0x92, 0xa0, 0xb0, 0x09, 0x49, 0x94, 0x0d, 0x59, 0x45, 0x8a, 0xa2,
-	0x44, 0x59, 0x24, 0xbb, 0x2c, 0xa2, 0x2c, 0x90, 0xc2, 0x06, 0x65, 0x11, 0xa1, 0xac, 0x88, 0x14,
-	0x8d, 0xc0, 0xd9, 0x45, 0x22, 0xec, 0x47, 0x8a, 0x14, 0xdd, 0x9f, 0xaa, 0xba, 0x55, 0x5d, 0x6d,
-	0x57, 0x35, 0x33, 0x23, 0xb2, 0xb3, 0xef, 0x39, 0xe7, 0x3b, 0xf7, 0xe7, 0xdc, 0xf3, 0x57, 0xb7,
-	0xe1, 0xf1, 0x86, 0xe5, 0x35, 0xbb, 0x9b, 0x95, 0x9a, 0xdd, 0x5e, 0x20, 0xdb, 0x5d, 0xcb, 0xdb,
-	0x5d, 0xd8, 0x26, 0x6e, 0xc3, 0x5e, 0x20, 0x8e, 0xb5, 0xb0, 0x73, 0x82, 0xb4, 0x9c, 0x26, 0x39,
-	0xb1, 0xd0, 0xa0, 0x1d, 0xea, 0x12, 0x8f, 0xd6, 0x2b, 0x8e, 0x6b, 0x7b, 0x36, 0x7a, 0x20, 0x94,
-	0xaa, 0x48, 0xa9, 0x8a, 0x90, 0xaa, 0x10, 0xc7, 0xaa, 0xf8, 0x52, 0x73, 0x8f, 0x69, 0xd8, 0x0d,
-	0xbb, 0x61, 0x2f, 0x08, 0xe1, 0xcd, 0xee, 0x96, 0xf8, 0x4f, 0xfc, 0x23, 0xfe, 0x92, 0xa0, 0x73,
-	0x8f, 0x6f, 0x9f, 0x66, 0x15, 0x4b, 0x68, 0x6e, 0x93, 0x5a, 0xd3, 0xea, 0x50, 0x77, 0x77, 0xc1,
-	0xd9, 0x6e, 0xf0, 0x01, 0xb6, 0xd0, 0xa6, 0x1e, 0x59, 0xd8, 0xe9, 0x99, 0xca, 0xdc, 0x42, 0x3f,
-	0x29, 0xb7, 0xdb, 0xf1, 0xac, 0x36, 0xed, 0x11, 0x78, 0xe2, 0x20, 0x01, 0x56, 0x6b, 0xd2, 0x36,
-	0x89, 0xcb, 0x99, 0xaf, 0xc0, 0xf4, 0x52, 0x87, 0xb4, 0x76, 0x99, 0xc5, 0x70, 0xb7, 0xb3, 0xe4,
-	0x36, 0xba, 0x6d, 0xda, 0xf1, 0xd0, 0x71, 0x28, 0x74, 0x48, 0x9b, 0xce, 0x1a, 0xc7, 0x8d, 0x87,
-	0x4a, 0xd5, 0xd1, 0x0f, 0x6f, 0x1e, 0x3b, 0xb4, 0x77, 0xf3, 0x58, 0xe1, 0x0a, 0x69, 0x53, 0x2c,
-	0x28, 0xe8, 0x7e, 0x18, 0xda, 0x21, 0xad, 0x2e, 0x9d, 0xcd, 0x09, 0x96, 0x31, 0xc5, 0x32, 0x74,
-	0x8d, 0x0f, 0x62, 0x49, 0x33, 0xbf, 0x9b, 0x8f, 0xc0, 0x5f, 0xa6, 0x1e, 0xa9, 0x13, 0x8f, 0xa0,
-	0x36, 0x14, 0x5b, 0x64, 0x93, 0xb6, 0xd8, 0xac, 0x71, 0x3c, 0xff, 0x50, 0xf9, 0xe4, 0xb9, 0x4a,
-	0x9a, 0xad, 0xaf, 0x24, 0x40, 0x55, 0x56, 0x05, 0xce, 0xb9, 0x8e, 0xe7, 0xee, 0x56, 0xc7, 0xd5,
-	0x24, 0x8a, 0x72, 0x10, 0x2b, 0x25, 0xe8, 0x2d, 0x03, 0xca, 0xa4, 0xd3, 0xb1, 0x3d, 0xe2, 0x59,
-	0x76, 0x87, 0xcd, 0xe6, 0x84, 0xd2, 0x4b, 0x83, 0x2b, 0x5d, 0x0a, 0xc1, 0xa4, 0xe6, 0x69, 0xa5,
-	0xb9, 0xac, 0x51, 0xb0, 0xae, 0x73, 0xee, 0x29, 0x28, 0x6b, 0x53, 0x45, 0x93, 0x90, 0xdf, 0xa6,
-	0xbb, 0x72, 0x7f, 0x31, 0xff, 0x13, 0xcd, 0x44, 0x36, 0x54, 0xed, 0xe0, 0x99, 0xdc, 0x69, 0x63,
-	0xee, 0x59, 0x98, 0x8c, 0x2b, 0xcc, 0x22, 0x6f, 0xbe, 0x6b, 0xc0, 0x8c, 0xb6, 0x0a, 0x4c, 0xb7,
-	0xa8, 0x4b, 0x3b, 0x35, 0x8a, 0x16, 0xa0, 0xc4, 0xcf, 0x92, 0x39, 0xa4, 0xe6, 0x1f, 0xf5, 0x94,
-	0x5a, 0x48, 0xe9, 0x8a, 0x4f, 0xc0, 0x21, 0x4f, 0x60, 0x16, 0xb9, 0xfd, 0xcc, 0xc2, 0x69, 0x12,
-	0x46, 0x67, 0xf3, 0x51, 0xb3, 0x58, 0xe3, 0x83, 0x58, 0xd2, 0xcc, 0xff, 0x83, 0x7b, 0xfd, 0xf9,
-	0x6c, 0xd0, 0xb6, 0xd3, 0x22, 0x1e, 0x0d, 0x27, 0x75, 0xa0, 0xe9, 0x99, 0x13, 0x30, 0xb6, 0xe4,
-	0x38, 0xae, 0xbd, 0x43, 0xeb, 0xeb, 0x1e, 0x69, 0x50, 0xf3, 0x3b, 0x06, 0x1c, 0x5e, 0x72, 0x1b,
-	0xf6, 0xf2, 0xd9, 0x25, 0xc7, 0xb9, 0x48, 0x49, 0xcb, 0x6b, 0xae, 0x7b, 0xc4, 0xeb, 0x32, 0xf4,
-	0x2c, 0x14, 0x99, 0xf8, 0x4b, 0xc1, 0x3d, 0xe8, 0x5b, 0x88, 0xa4, 0xdf, 0xba, 0x79, 0x6c, 0x26,
-	0x41, 0x90, 0x62, 0x25, 0x85, 0x1e, 0x86, 0xe1, 0x36, 0x65, 0x8c, 0x34, 0xfc, 0x35, 0x4f, 0x28,
-	0x80, 0xe1, 0xcb, 0x72, 0x18, 0xfb, 0x74, 0xf3, 0x4f, 0x39, 0x98, 0x08, 0xb0, 0x94, 0xfa, 0x3b,
-	0xb0, 0xc1, 0x5d, 0x18, 0x6d, 0x6a, 0x2b, 0x14, 0xfb, 0x5c, 0x3e, 0xf9, 0x74, 0x4a, 0x5b, 0x4e,
-	0xda, 0xa4, 0xea, 0x8c, 0x52, 0x33, 0xaa, 0x8f, 0xe2, 0x88, 0x1a, 0xd4, 0x06, 0x60, 0xbb, 0x9d,
-	0x9a, 0x52, 0x5a, 0x10, 0x4a, 0x9f, 0xca, 0xa8, 0x74, 0x3d, 0x00, 0xa8, 0x22, 0xa5, 0x12, 0xc2,
-	0x31, 0xac, 0x29, 0x30, 0x7f, 0x6b, 0xc0, 0x74, 0x82, 0x1c, 0x7a, 0x26, 0x76, 0x9e, 0x0f, 0xf4,
-	0x9c, 0x27, 0xea, 0x11, 0x0b, 0x4f, 0xf3, 0x51, 0x18, 0x71, 0xe9, 0x8e, 0xc5, 0x2c, 0xbb, 0xa3,
-	0x76, 0x78, 0x52, 0xc9, 0x8f, 0x60, 0x35, 0x8e, 0x03, 0x0e, 0xf4, 0x08, 0x94, 0xfc, 0xbf, 0xf9,
-	0x36, 0xe7, 0xb9, 0x39, 0xf3, 0x83, 0xf3, 0x59, 0x19, 0x0e, 0xe9, 0xe6, 0x67, 0x86, 0x76, 0xfa,
-	0x57, 0x9d, 0x3a, 0xf1, 0x28, 0x37, 0x1e, 0xe2, 0x38, 0x57, 0x42, 0x63, 0x0e, 0x8c, 0x67, 0x49,
-	0x0e, 0x63, 0x9f, 0x8e, 0x4e, 0xc3, 0xa8, 0xfa, 0x53, 0xda, 0x8a, 0x9c, 0x5d, 0x70, 0x30, 0x4b,
-	0x1a, 0x0d, 0x47, 0x38, 0x51, 0x17, 0xc6, 0x98, 0xdd, 0x75, 0x6b, 0x54, 0x2a, 0x95, 0x33, 0x2d,
-	0x9f, 0x3c, 0x9d, 0xe5, 0x6c, 0xd6, 0x35, 0x80, 0xea, 0x61, 0xa5, 0x74, 0x4c, 0x1f, 0x65, 0x38,
-	0xaa, 0xc5, 0x7c, 0x1d, 0x40, 0xca, 0x5e, 0xa4, 0xad, 0x36, 0xaa, 0x41, 0xd1, 0x6a, 0x93, 0x06,
-	0xf5, 0xfd, 0x79, 0x26, 0x73, 0xe4, 0x08, 0x2b, 0x5c, 0x5a, 0x4d, 0x20, 0xf0, 0xe2, 0x62, 0x90,
-	0x61, 0x05, 0x6d, 0xbe, 0x17, 0xdc, 0xf2, 0x98, 0x04, 0x77, 0x3a, 0x82, 0x47, 0x6d, 0x73, 0xe0,
-	0x74, 0x04, 0x0f, 0x96, 0x34, 0x74, 0x54, 0x7a, 0x4c, 0xb9, 0xb3, 0x65, 0xc5, 0x92, 0x7f, 0x9e,
-	0xee, 0x4a, 0xf7, 0xf9, 0xb4, 0xef, 0x3e, 0xa5, 0xe3, 0xfa, 0xef, 0x48, 0x3c, 0xe3, 0x7e, 0x42,
-	0x53, 0x28, 0xc6, 0x36, 0x76, 0x9d, 0x20, 0xce, 0xbd, 0xe9, 0x1f, 0xfe, 0xf3, 0x5d, 0xe6, 0xd9,
-	0x6d, 0xeb, 0x1b, 0x14, 0x35, 0x63, 0x5b, 0xf2, 0xff, 0x59, 0xb6, 0x24, 0x80, 0x49, 0xb3, 0x2f,
-	0x2e, 0xcc, 0xf5, 0x97, 0x4a, 0xb7, 0x37, 0x0b, 0x50, 0xea, 0x32, 0x7a, 0xd6, 0x6a, 0x50, 0xe6,
-	0x89, 0x1d, 0x1a, 0x09, 0xfd, 0xd4, 0x55, 0x9f, 0x80, 0x43, 0x1e, 0xf3, 0x1f, 0x39, 0x40, 0xbd,
-	0xb6, 0xc3, 0x2d, 0xde, 0xa5, 0x8e, 0x7d, 0x15, 0xaf, 0xc6, 0x2d, 0x1e, 0xcb, 0x61, 0xec, 0xd3,
-	0xf9, 0xbc, 0x6a, 0x4d, 0xe2, 0x7a, 0xf1, 0xfc, 0x61, 0x99, 0x0f, 0x62, 0x49, 0x43, 0x6b, 0x30,
-	0xd3, 0x15, 0xc8, 0x1b, 0xc4, 0x6d, 0x50, 0xcf, 0xbf, 0x79, 0xe2, 0x8c, 0x46, 0xaa, 0xff, 0xa5,
-	0x64, 0x66, 0xae, 0x26, 0xf0, 0xe0, 0x44, 0x49, 0xb4, 0x09, 0xa5, 0x6d, 0x7f, 0x9b, 0x94, 0x1b,
-	0x5b, 0x1c, 0xe8, 0x64, 0xa4, 0x2f, 0x08, 0xfe, 0xc5, 0x21, 0x2c, 0xba, 0x02, 0x85, 0x26, 0x6d,
-	0xb5, 0x67, 0x87, 0x04, 0xfc, 0xff, 0x66, 0xbd, 0x0b, 0xd5, 0x11, 0xee, 0xf2, 0xf9, 0x5f, 0x58,
-	0xe0, 0x98, 0xdf, 0x02, 0xb9, 0x2b, 0x59, 0xb6, 0xf7, 0xe0, 0x40, 0xf2, 0x30, 0x0c, 0xef, 0x50,
-	0x37, 0xd8, 0x4e, 0x0d, 0xec, 0x9a, 0x1c, 0xc6, 0x3e, 0xdd, 0xfc, 0xa5, 0x01, 0x53, 0x62, 0x06,
-	0xeb, 0xdd, 0x4d, 0x56, 0x73, 0x2d, 0x87, 0x27, 0x22, 0xb7, 0x77, 0x36, 0x67, 0x61, 0x92, 0xd1,
-	0xf6, 0x0e, 0x75, 0x97, 0xed, 0x0e, 0xf3, 0x5c, 0x62, 0x75, 0x3c, 0x35, 0xad, 0x59, 0xc5, 0x3d,
-	0xb9, 0x1e, 0xa3, 0xe3, 0x1e, 0x09, 0xf3, 0x17, 0x05, 0x18, 0x3e, 0xef, 0x52, 0xab, 0xd1, 0xf4,
-	0xd0, 0xd7, 0x61, 0xa4, 0xad, 0xf2, 0x35, 0x31, 0x3f, 0x7e, 0x12, 0x32, 0x49, 0xae, 0xe8, 0x49,
-	0x72, 0xc5, 0xd9, 0x6e, 0xf0, 0x01, 0x56, 0xe1, 0xdc, 0x95, 0x9d, 0x13, 0x95, 0x17, 0x36, 0x5f,
-	0xa3, 0x35, 0x8f, 0xe7, 0x7a, 0x61, 0x98, 0x0a, 0xc7, 0x70, 0x80, 0xca, 0x4d, 0x98, 0xb4, 0x2c,
-	0xc2, 0x66, 0x87, 0xa3, 0x26, 0xbc, 0xc4, 0x07, 0xb1, 0xa4, 0xf1, 0xab, 0x75, 0x83, 0xb8, 0xb4,
-	0x69, 0x77, 0x19, 0x9d, 0x1d, 0x89, 0xa6, 0x00, 0x2f, 0xfa, 0x04, 0x1c, 0xf2, 0xa0, 0xeb, 0x30,
-	0x5c, 0xb3, 0xdb, 0x6d, 0xcb, 0xf3, 0x5d, 0xf9, 0x42, 0x3a, 0x03, 0xba, 0x60, 0x79, 0xcb, 0x42,
-	0x2e, 0x3c, 0x07, 0xf9, 0x3f, 0xc3, 0x3e, 0x20, 0x5a, 0x0f, 0x9c, 0x52, 0x41, 0x40, 0x3f, 0x92,
-	0x0e, 0x5a, 0xf8, 0x8a, 0x7e, 0xfe, 0x87, 0x83, 0x8a, 0xdb, 0xca, 0x66, 0x87, 0xb2, 0x80, 0x0a,
-	0x83, 0x0a, 0x41, 0xc5, 0xbf, 0x0c, 0x2b, 0x28, 0xf4, 0x72, 0x10, 0xe8, 0x8b, 0xe2, 0xec, 0x4e,
-	0xa5, 0x03, 0x55, 0x87, 0xaf, 0xb2, 0x8c, 0xf1, 0x68, 0x76, 0xe0, 0xe7, 0x01, 0xe6, 0xfb, 0x06,
-	0x94, 0x15, 0xe7, 0xaa, 0xc5, 0x3c, 0xf4, 0x4a, 0x8f, 0xa9, 0x54, 0xd2, 0x99, 0x0a, 0x97, 0x16,
-	0x86, 0x12, 0xe4, 0x11, 0xfe, 0x88, 0x66, 0x26, 0x18, 0x86, 0x2c, 0x8f, 0xb6, 0xfd, 0xb2, 0xe3,
-	0xb1, 0x4c, 0x2b, 0xd1, 0x1c, 0x36, 0xc7, 0xc0, 0x12, 0xca, 0xfc, 0xac, 0x00, 0x93, 0x8a, 0x23,
-	0x43, 0xe6, 0x1c, 0x35, 0xc6, 0x62, 0x36, 0x63, 0xcc, 0xdd, 0x39, 0x63, 0xcc, 0xdf, 0x09, 0x63,
-	0x2c, 0xdc, 0x3e, 0x63, 0x7c, 0x03, 0x26, 0x77, 0xa8, 0x6b, 0x6d, 0x59, 0x35, 0x51, 0x82, 0xad,
-	0x74, 0xb6, 0x6c, 0xe5, 0xdc, 0x9f, 0x48, 0x07, 0x7f, 0x2d, 0x26, 0x5d, 0x9d, 0xe1, 0x0e, 0x2d,
-	0x3e, 0x8a, 0x7b, 0xb4, 0xa0, 0xb7, 0x0d, 0x98, 0xd6, 0x07, 0x2f, 0x5a, 0xcc, 0xb3, 0xdd, 0xdd,
-	0xd9, 0x61, 0xb1, 0xb8, 0x41, 0xb5, 0xdf, 0xa7, 0xd6, 0x39, 0x7d, 0xad, 0x17, 0x1a, 0x27, 0xe9,
-	0x33, 0xff, 0x99, 0x87, 0xb1, 0xc8, 0xdd, 0x42, 0x37, 0x00, 0x24, 0x23, 0xad, 0xaf, 0x74, 0x54,
-	0x8e, 0xb3, 0x3c, 0xc0, 0x25, 0x55, 0xb3, 0xe3, 0x28, 0xb2, 0x94, 0x0e, 0x7c, 0x6e, 0x48, 0xc0,
-	0x9a, 0x2a, 0xf4, 0x26, 0x94, 0x89, 0xaa, 0xfe, 0xce, 0xdb, 0xae, 0x32, 0xcb, 0xb3, 0x83, 0x68,
-	0x5e, 0x0a, 0x61, 0xe2, 0x55, 0x7c, 0x48, 0xc1, 0xba, 0xb6, 0x39, 0x17, 0x26, 0x62, 0xf3, 0x4d,
-	0xa8, 0xc4, 0x57, 0xf4, 0x4a, 0x3c, 0xb5, 0xeb, 0xf2, 0x71, 0x45, 0x49, 0xab, 0x97, 0xff, 0x0c,
-	0x26, 0xe3, 0x33, 0xbd, 0x6d, 0x4a, 0x23, 0x75, 0xb4, 0xde, 0x33, 0xf8, 0x5d, 0x0e, 0x4a, 0xc1,
-	0x25, 0xce, 0x12, 0xea, 0xe7, 0x20, 0x67, 0xd5, 0x55, 0xa0, 0x07, 0xc5, 0x95, 0x5b, 0x39, 0x8b,
-	0x73, 0x56, 0x1d, 0x3d, 0x08, 0xc5, 0x4d, 0x97, 0x74, 0x6a, 0x4d, 0x15, 0xda, 0x83, 0xfb, 0x56,
-	0x15, 0xa3, 0x58, 0x51, 0x79, 0xaa, 0xee, 0x91, 0x86, 0x48, 0xcf, 0xb4, 0x54, 0x7d, 0x83, 0x34,
-	0x30, 0x1f, 0x47, 0x17, 0x60, 0x4a, 0xd6, 0xa6, 0xcb, 0x4d, 0x5a, 0xdb, 0x96, 0x53, 0x14, 0xf7,
-	0xb1, 0x54, 0xbd, 0x57, 0x31, 0x4f, 0x5d, 0x8c, 0x33, 0xe0, 0x5e, 0x19, 0xbd, 0xba, 0x2f, 0xee,
-	0x5f, 0xdd, 0xf3, 0xa9, 0x93, 0xae, 0xd7, 0xb4, 0x5d, 0x15, 0xec, 0x83, 0xa9, 0x2f, 0x89, 0x51,
-	0xac, 0xa8, 0xe6, 0x34, 0x4c, 0x5d, 0xb0, 0xbc, 0x8b, 0xdd, 0xcd, 0xb5, 0x6e, 0xab, 0x85, 0xe9,
-	0xeb, 0x5d, 0x9e, 0x2d, 0xcb, 0xc1, 0x55, 0x12, 0x19, 0xfc, 0xd5, 0x10, 0x8c, 0x5d, 0xb0, 0x3c,
-	0xb1, 0x81, 0x99, 0xb3, 0xe7, 0x75, 0x38, 0x6c, 0x75, 0x18, 0xad, 0x75, 0x5d, 0xba, 0xbe, 0x6d,
-	0x39, 0x1b, 0xab, 0xeb, 0xc2, 0x7c, 0x76, 0x55, 0xf2, 0x7e, 0x54, 0x09, 0x1e, 0x5e, 0x49, 0x62,
-	0xc2, 0xc9, 0xb2, 0xe8, 0x24, 0x80, 0x4b, 0x49, 0xbd, 0xaa, 0x1f, 0x51, 0x70, 0x1b, 0x71, 0x40,
-	0xc1, 0x1a, 0x17, 0x5a, 0x84, 0xf2, 0x0d, 0xd7, 0xf2, 0xa8, 0x12, 0x92, 0x47, 0x16, 0xdc, 0xa3,
-	0x17, 0x43, 0x12, 0xd6, 0xf9, 0xd0, 0x0e, 0x94, 0x9d, 0x70, 0x2f, 0x94, 0x33, 0x4d, 0xe9, 0x3e,
-	0xb4, 0x4d, 0x5c, 0x73, 0xed, 0xb6, 0xcd, 0xfd, 0xd4, 0x65, 0x5a, 0x6b, 0x92, 0x8e, 0xc5, 0xda,
-	0xd5, 0x09, 0xae, 0x57, 0x63, 0xc1, 0xba, 0x22, 0xd4, 0x80, 0xa2, 0x4b, 0x3b, 0x75, 0xea, 0xaa,
-	0xb4, 0x22, 0xa5, 0xca, 0xe7, 0xf9, 0x10, 0x16, 0x82, 0x09, 0x2a, 0x81, 0xdb, 0x81, 0xa4, 0x62,
-	0x05, 0x8f, 0x3a, 0x7a, 0x9d, 0x31, 0x2c, 0x74, 0x2d, 0xa5, 0xd4, 0xe5, 0x8b, 0x25, 0x68, 0xea,
-	0x5f, 0x73, 0x5c, 0x57, 0x35, 0xc7, 0x88, 0x50, 0xf5, 0x4c, 0x3a, 0x55, 0xbc, 0xc6, 0x48, 0xd0,
-	0x12, 0xaf, 0x3f, 0xfe, 0x58, 0x80, 0x89, 0x0b, 0xd6, 0xc0, 0xc9, 0xbf, 0x07, 0xf7, 0xc8, 0x90,
-	0xbf, 0x4e, 0x5b, 0xb4, 0xc6, 0xa5, 0xd7, 0x3d, 0x97, 0x78, 0xb4, 0xe1, 0x17, 0xe3, 0x67, 0x94,
-	0xe8, 0x3d, 0xcb, 0xc9, 0x6c, 0xb7, 0xfa, 0x93, 0x70, 0x3f, 0xe8, 0xd4, 0xbe, 0x26, 0xa9, 0xf0,
-	0x28, 0x64, 0x2d, 0x3c, 0x78, 0x62, 0x45, 0x5a, 0x2d, 0xfb, 0xc6, 0x06, 0x69, 0x30, 0xe5, 0x8a,
-	0x82, 0xc4, 0x6a, 0xc9, 0x27, 0xe0, 0x90, 0x07, 0x55, 0x00, 0xac, 0x46, 0xc7, 0x76, 0xa9, 0x90,
-	0x28, 0x8a, 0xee, 0xd2, 0x38, 0xbf, 0x67, 0x2b, 0xc1, 0x28, 0xd6, 0x38, 0xfa, 0x5f, 0xf8, 0xe1,
-	0x2f, 0x70, 0xe1, 0x1f, 0x87, 0x51, 0xab, 0x53, 0x6b, 0x75, 0xeb, 0x74, 0x8d, 0x78, 0x4d, 0x36,
-	0x3b, 0x22, 0xa6, 0x31, 0xb9, 0x77, 0xf3, 0xd8, 0xe8, 0x8a, 0x36, 0x8e, 0x23, 0x5c, 0x5c, 0x8a,
-	0xbe, 0xa1, 0x49, 0x95, 0x42, 0xa9, 0x73, 0x6f, 0xe8, 0x52, 0x3a, 0x97, 0xf9, 0x67, 0x03, 0x8a,
-	0xd2, 0x29, 0xa3, 0xc5, 0x58, 0x13, 0xef, 0x68, 0x4f, 0x13, 0xaf, 0x9c, 0xd4, 0x8b, 0x35, 0xa1,
-	0x68, 0x31, 0xd6, 0xa5, 0x32, 0x15, 0x2d, 0xc9, 0x6b, 0xb7, 0x22, 0x46, 0xb0, 0xa2, 0x20, 0x0b,
-	0x80, 0xf8, 0x5d, 0x38, 0x3f, 0xaf, 0x5c, 0xcc, 0xda, 0xa6, 0x8c, 0xb5, 0x28, 0x03, 0x02, 0xc3,
-	0x1a, 0xb8, 0xf9, 0x73, 0x03, 0xee, 0xe5, 0x97, 0x44, 0xe4, 0x8a, 0x67, 0xa9, 0xc3, 0xef, 0x7d,
-	0xa7, 0xb6, 0xab, 0x7c, 0xb9, 0xf0, 0xa5, 0x8e, 0xcd, 0x2c, 0x91, 0xae, 0x19, 0x71, 0x5f, 0xea,
-	0x53, 0xb0, 0xc6, 0x95, 0xa2, 0x4a, 0x5e, 0x80, 0x92, 0x48, 0x49, 0xf9, 0x96, 0x2a, 0xbb, 0x0e,
-	0xcc, 0x6c, 0xd9, 0x27, 0xe0, 0x90, 0xc7, 0xfc, 0x8b, 0x01, 0x13, 0x03, 0x75, 0xcb, 0x9e, 0x85,
-	0x71, 0x91, 0x0c, 0xb0, 0xf3, 0x56, 0x4b, 0x9c, 0xa0, 0x9a, 0xd5, 0x11, 0xc5, 0x3d, 0x7e, 0x2d,
-	0x42, 0xc5, 0x31, 0x6e, 0xbf, 0xdb, 0x96, 0x3f, 0xa8, 0xdb, 0x56, 0x18, 0xa0, 0xdb, 0xf6, 0x89,
-	0x01, 0x47, 0x92, 0x5d, 0x17, 0x7a, 0x35, 0xd6, 0x75, 0x5b, 0x4c, 0xef, 0x08, 0x53, 0xb4, 0xda,
-	0x78, 0xf8, 0x50, 0xd5, 0x85, 0x4c, 0x3b, 0x9f, 0x4b, 0x0f, 0x9f, 0x68, 0x26, 0xfd, 0x2a, 0x0e,
-	0xf3, 0x37, 0x06, 0xc8, 0xf3, 0xc8, 0xe2, 0x68, 0x4f, 0x02, 0x34, 0x54, 0x42, 0x81, 0x57, 0xd5,
-	0x79, 0x05, 0x36, 0x77, 0x21, 0xa0, 0x60, 0x8d, 0xcb, 0x4f, 0xb5, 0xf2, 0x7d, 0x52, 0xad, 0x07,
-	0xa1, 0x58, 0x97, 0x5d, 0xc1, 0x42, 0xd4, 0x8b, 0xaa, 0x96, 0xa0, 0xa2, 0x9a, 0xef, 0x16, 0x60,
-	0x4a, 0xcc, 0x77, 0xd0, 0x20, 0x31, 0xc8, 0xdc, 0x1d, 0x38, 0x22, 0xce, 0xa5, 0x37, 0xae, 0xc8,
-	0xe5, 0x9c, 0x56, 0xf2, 0x47, 0x56, 0x12, 0xb9, 0x6e, 0xf5, 0xa5, 0xe0, 0x3e, 0xb8, 0xff, 0x29,
-	0xc1, 0xe2, 0x51, 0x18, 0x71, 0x5a, 0xc4, 0xdb, 0xb2, 0xdd, 0xb6, 0x4a, 0x57, 0x83, 0xfe, 0xc4,
-	0x9a, 0x1a, 0xc7, 0x01, 0x47, 0xff, 0xd0, 0x32, 0x32, 0x78, 0x68, 0x31, 0x3b, 0x70, 0x44, 0x4b,
-	0x9a, 0xee, 0x7c, 0x43, 0xfa, 0x6d, 0x03, 0x8e, 0xee, 0x9b, 0xa5, 0xa1, 0x7a, 0xcc, 0x35, 0x3c,
-	0x93, 0x39, 0xf5, 0x4b, 0xd3, 0x8c, 0x7f, 0xd7, 0x80, 0x99, 0xc1, 0xfb, 0xf0, 0xc7, 0xa1, 0xe0,
-	0x84, 0xbe, 0x36, 0x88, 0x00, 0xc2, 0xc3, 0x0a, 0x4a, 0x74, 0x63, 0xf2, 0x29, 0x36, 0xe6, 0x2d,
-	0x03, 0xee, 0xdb, 0x27, 0xa5, 0x44, 0x9b, 0xb1, 0x6d, 0x39, 0x93, 0x31, 0x4b, 0x4d, 0xb3, 0x29,
-	0x3f, 0xcd, 0xc1, 0xf0, 0x9a, 0x6b, 0xbf, 0x46, 0x6b, 0x77, 0xa3, 0x2d, 0xfb, 0x02, 0x14, 0x98,
-	0x43, 0x6b, 0xaa, 0x10, 0x3e, 0x91, 0xb2, 0xa8, 0x90, 0xd3, 0x5b, 0x77, 0x68, 0x4d, 0xe6, 0xbf,
-	0xfc, 0x2f, 0x2c, 0x80, 0xb4, 0x5e, 0x64, 0x3e, 0x4b, 0x6d, 0xed, 0x43, 0x1e, 0xdc, 0x8b, 0x54,
-	0x9c, 0x5f, 0xda, 0x5e, 0xa4, 0x9a, 0x5f, 0x9f, 0x5e, 0xe4, 0x0f, 0xc2, 0x15, 0xf0, 0x4d, 0x43,
-	0xdf, 0x84, 0x29, 0xc7, 0xb7, 0xb3, 0x35, 0xbb, 0x65, 0xd5, 0xac, 0xac, 0xe1, 0x78, 0x2d, 0x22,
-	0xbe, 0x1b, 0x56, 0xf5, 0x6b, 0x71, 0x5c, 0xdc, 0xab, 0xca, 0xb4, 0x61, 0x2c, 0xb2, 0xf5, 0xe8,
-	0x94, 0xff, 0x26, 0x21, 0x9a, 0x6e, 0xca, 0x37, 0x09, 0xb7, 0x6e, 0x1e, 0x1b, 0x55, 0xec, 0xfa,
-	0x1b, 0x85, 0x2c, 0x5f, 0xfe, 0x7f, 0x96, 0x83, 0x52, 0x30, 0xb3, 0xbb, 0x60, 0xe0, 0x5f, 0x89,
-	0x18, 0xf8, 0xa9, 0x8c, 0x7b, 0x9a, 0x68, 0xe2, 0xaf, 0xc6, 0x4c, 0x3c, 0xeb, 0x41, 0x1d, 0x60,
-	0xe4, 0x9f, 0x1b, 0xe2, 0x4c, 0x24, 0xaf, 0x68, 0x6c, 0x1e, 0xdc, 0xab, 0x26, 0x30, 0xbc, 0x25,
-	0xdb, 0x75, 0x6a, 0xa1, 0x4f, 0x64, 0xea, 0xf1, 0x05, 0x6d, 0xf1, 0xf0, 0xe0, 0x7c, 0x8a, 0x8f,
-	0x8b, 0xbe, 0x7a, 0x7b, 0x56, 0x0d, 0x09, 0x2b, 0xfe, 0x40, 0x5f, 0xf1, 0x5d, 0xb8, 0xd8, 0x1b,
-	0xd1, 0x8b, 0xbd, 0x90, 0x71, 0x25, 0x7d, 0xae, 0xf6, 0xf7, 0x73, 0x30, 0xdd, 0x1b, 0x33, 0x18,
-	0x62, 0x30, 0xde, 0xd0, 0x5b, 0x57, 0xfe, 0xfd, 0x3e, 0x95, 0xfa, 0xeb, 0x40, 0x28, 0x1b, 0x96,
-	0x14, 0x91, 0x61, 0x86, 0x63, 0x2a, 0xd0, 0x9b, 0x30, 0x49, 0xa2, 0x2f, 0x2c, 0xfc, 0xd5, 0x66,
-	0xad, 0xf0, 0x94, 0xe2, 0x20, 0x67, 0x8b, 0x11, 0x18, 0xee, 0x51, 0x64, 0xbe, 0x63, 0xc0, 0x44,
-	0xcc, 0x2d, 0xf1, 0x90, 0xce, 0xbc, 0x84, 0x90, 0xae, 0x9a, 0xa9, 0x82, 0x86, 0xd6, 0x60, 0x86,
-	0x74, 0x3d, 0x3b, 0x90, 0x3d, 0xd7, 0x21, 0x9b, 0x2d, 0x5a, 0x57, 0x49, 0x4d, 0xf0, 0x09, 0x7b,
-	0x29, 0x81, 0x07, 0x27, 0x4a, 0x9a, 0x5f, 0xd3, 0x2c, 0x4b, 0x38, 0xdc, 0x54, 0xf3, 0x78, 0x38,
-	0x7a, 0x9d, 0x4a, 0xfd, 0xaf, 0x85, 0xf9, 0x79, 0x4e, 0x5b, 0xab, 0xf2, 0xa1, 0x97, 0x00, 0xb5,
-	0x08, 0xf3, 0x2e, 0x92, 0x4e, 0x9d, 0xcf, 0x8c, 0x6e, 0xb9, 0x94, 0xf9, 0xed, 0xbe, 0x39, 0x85,
-	0x84, 0x56, 0x7b, 0x38, 0x70, 0x82, 0x14, 0x5a, 0x8c, 0xfa, 0xe3, 0x63, 0x71, 0x7f, 0x3c, 0x1e,
-	0x6e, 0xf4, 0x60, 0x1e, 0x19, 0xbd, 0xae, 0xdd, 0xb5, 0x7c, 0x96, 0x4f, 0x13, 0xb1, 0x65, 0x57,
-	0xfc, 0x17, 0x7f, 0xf2, 0xfb, 0x40, 0x70, 0x01, 0xfd, 0xe1, 0xf0, 0x02, 0xce, 0x3d, 0x0d, 0x63,
-	0x11, 0xe6, 0x4c, 0x2f, 0xf4, 0xfe, 0x6a, 0xc0, 0xd1, 0x7d, 0xdb, 0x9a, 0x3c, 0x07, 0x91, 0x0b,
-	0x50, 0xbe, 0xe3, 0xc9, 0xd4, 0x37, 0x2d, 0xda, 0x8b, 0x96, 0xce, 0x4a, 0x0e, 0x63, 0x05, 0xa9,
-	0xc0, 0x5b, 0x64, 0x53, 0x79, 0xda, 0xf4, 0xe0, 0xd1, 0x9e, 0x76, 0x00, 0xbe, 0x4a, 0x24, 0x78,
-	0x8b, 0x6c, 0x9a, 0xef, 0xe5, 0x60, 0x92, 0x5f, 0xe3, 0x48, 0x65, 0xb8, 0x06, 0xf9, 0x86, 0xe5,
-	0xa9, 0xb5, 0x2c, 0xa6, 0x56, 0xa7, 0x63, 0x54, 0x87, 0x79, 0xa5, 0xca, 0x7d, 0x06, 0x87, 0x42,
-	0x2f, 0xf9, 0xf9, 0x75, 0xa6, 0x25, 0xf4, 0xd4, 0xac, 0xd5, 0x52, 0x4f, 0x52, 0xfe, 0x92, 0xff,
-	0x52, 0x25, 0x9f, 0x05, 0xb9, 0xe7, 0xbd, 0x84, 0x44, 0xd6, 0x9f, 0xb7, 0x98, 0x3f, 0xc9, 0x81,
-	0xbc, 0xa4, 0x77, 0x21, 0x69, 0xb8, 0x1c, 0x49, 0x1a, 0x52, 0xc6, 0x07, 0x31, 0xb9, 0xc4, 0x84,
-	0x21, 0x1e, 0x3a, 0x4f, 0x64, 0x01, 0xdc, 0x3f, 0x59, 0xf8, 0x83, 0x01, 0x25, 0xc1, 0x77, 0x17,
-	0xc2, 0xe6, 0x5a, 0x34, 0x6c, 0x3e, 0x92, 0x61, 0x15, 0x7d, 0x42, 0xe6, 0x0f, 0xf3, 0x6a, 0xf6,
-	0x81, 0x6b, 0x6e, 0x12, 0xb7, 0xae, 0x3c, 0x65, 0xe8, 0x9a, 0xf9, 0x20, 0x96, 0x34, 0xd4, 0x82,
-	0x31, 0xa6, 0x19, 0x0a, 0x53, 0xeb, 0x4c, 0x19, 0x4c, 0x75, 0x1b, 0x63, 0xd5, 0x29, 0xf1, 0x72,
-	0x4f, 0x1f, 0xc2, 0x51, 0x70, 0xf4, 0x3d, 0x03, 0xa6, 0x9d, 0xde, 0x98, 0xae, 0x0c, 0xe3, 0xa9,
-	0x8c, 0x7e, 0x32, 0x04, 0xa8, 0xde, 0xb3, 0x77, 0xf3, 0x58, 0x52, 0xb6, 0x80, 0x93, 0xd4, 0xa1,
-	0x26, 0x8c, 0xea, 0x1f, 0x9a, 0x95, 0x19, 0x9d, 0xcc, 0xfe, 0x45, 0x5b, 0x76, 0x9e, 0xf5, 0x11,
-	0x1c, 0x41, 0x36, 0x7f, 0x5c, 0x84, 0xb2, 0x66, 0x77, 0x7d, 0x42, 0x59, 0x79, 0xa0, 0x50, 0x76,
-	0x22, 0x1a, 0xca, 0xee, 0x8b, 0x87, 0x32, 0x10, 0x8a, 0x23, 0x61, 0xcc, 0x85, 0xf1, 0x5a, 0xd7,
-	0x75, 0x69, 0xc7, 0x3b, 0x7f, 0x5b, 0xd2, 0x5b, 0xc4, 0x53, 0xa7, 0xe5, 0x08, 0x22, 0x8e, 0x69,
-	0xe0, 0xb9, 0x74, 0x53, 0xbd, 0x1c, 0xc8, 0x67, 0x79, 0x39, 0xd0, 0x3f, 0x97, 0xf6, 0x5f, 0x0b,
-	0xf8, 0xb8, 0x68, 0x0d, 0x8a, 0xf2, 0x03, 0xab, 0xfa, 0x04, 0xf5, 0x68, 0xda, 0xd6, 0x28, 0x97,
-	0x91, 0x81, 0x43, 0xfe, 0x8d, 0x15, 0x8e, 0x1e, 0xef, 0x4b, 0x07, 0xc4, 0xfb, 0x4b, 0x80, 0xec,
-	0x4d, 0x46, 0xdd, 0x1d, 0x5a, 0xbf, 0x20, 0x7f, 0xe0, 0xc0, 0x4d, 0xaa, 0x78, 0xdc, 0x78, 0x28,
-	0x1f, 0x1e, 0xe9, 0x0b, 0x3d, 0x1c, 0x38, 0x41, 0x0a, 0x75, 0x61, 0x52, 0xed, 0x5e, 0x60, 0xcb,
-	0xea, 0x03, 0x5e, 0xd6, 0x4a, 0x2b, 0x7c, 0xe9, 0xb1, 0x1c, 0x03, 0xc4, 0x3d, 0x2a, 0xb8, 0x13,
-	0xe0, 0xf6, 0x15, 0xea, 0x84, 0xc1, 0x75, 0x0a, 0x27, 0xb0, 0xaa, 0xa3, 0xe1, 0x28, 0xb8, 0xb9,
-	0x08, 0x53, 0xf2, 0x4a, 0xe8, 0x41, 0xf9, 0xe0, 0x97, 0xf7, 0xbf, 0x37, 0x20, 0xea, 0x5c, 0xa2,
-	0x2f, 0x8a, 0x8c, 0x14, 0x2f, 0x8a, 0x6e, 0xc0, 0x78, 0xd7, 0x61, 0x9e, 0x4b, 0x49, 0x5b, 0xcc,
-	0xc0, 0x77, 0xbd, 0x4f, 0x66, 0x09, 0x20, 0x7a, 0x58, 0x0d, 0xca, 0x87, 0xab, 0x11, 0x58, 0x1c,
-	0x53, 0x63, 0xfe, 0x2b, 0x07, 0x11, 0x2f, 0x81, 0xde, 0x31, 0x60, 0x8a, 0xc4, 0x7e, 0x86, 0xe0,
-	0x17, 0x32, 0xcf, 0x65, 0xfb, 0x6d, 0x48, 0xcf, 0xaf, 0x18, 0xc2, 0x96, 0x45, 0x9c, 0x85, 0xe1,
-	0x5e, 0xa5, 0xc2, 0x27, 0x93, 0xde, 0xdf, 0x99, 0x64, 0xf3, 0xc9, 0x09, 0x3f, 0x54, 0x91, 0x3e,
-	0x39, 0x81, 0x80, 0x93, 0xd4, 0xa1, 0x97, 0xa1, 0x40, 0xdc, 0x86, 0xff, 0xdd, 0x2c, 0xbb, 0x5a,
-	0xff, 0xe7, 0x43, 0xa1, 0xed, 0x2c, 0xb9, 0x0d, 0x86, 0x05, 0xa8, 0xf9, 0xb7, 0x3c, 0xf4, 0xbc,
-	0x78, 0x52, 0xaf, 0x45, 0x0a, 0x89, 0xaf, 0x45, 0xee, 0x87, 0x21, 0x52, 0xf3, 0x82, 0x17, 0x17,
-	0xe1, 0xf3, 0x4a, 0x3e, 0x88, 0x25, 0x0d, 0xbd, 0x08, 0x25, 0xe6, 0x11, 0xd7, 0xdb, 0xb0, 0xda,
-	0x54, 0x3d, 0x23, 0xf8, 0x9f, 0x74, 0xf9, 0x01, 0x97, 0x90, 0x1f, 0xd4, 0xd7, 0x7d, 0x00, 0x1c,
-	0x62, 0xa1, 0xd3, 0x51, 0xcf, 0x6e, 0xc6, 0x3d, 0xfb, 0x94, 0xbe, 0x96, 0x41, 0xeb, 0x94, 0x36,
-	0x94, 0xb5, 0x73, 0x50, 0x31, 0xf0, 0x4c, 0xe6, 0x7d, 0xd7, 0xfc, 0xb3, 0xfc, 0x0d, 0x52, 0x48,
-	0xd1, 0xf1, 0xd1, 0x75, 0x80, 0x2d, 0xab, 0x63, 0xb1, 0xa6, 0xd8, 0xad, 0x62, 0xe6, 0xdd, 0x12,
-	0xdf, 0x1c, 0xce, 0x07, 0x08, 0x58, 0x43, 0x33, 0x27, 0x60, 0x2c, 0xf2, 0x82, 0x49, 0x74, 0xc5,
-	0x02, 0x0f, 0xf0, 0x65, 0xed, 0x8a, 0x05, 0x13, 0xbc, 0x9d, 0x5d, 0xb1, 0x10, 0x74, 0xff, 0x44,
-	0xf7, 0x03, 0x03, 0xc6, 0x02, 0xde, 0x2f, 0x6d, 0x8f, 0x28, 0x98, 0x61, 0x9f, 0x84, 0xf7, 0xd7,
-	0xfa, 0x2a, 0xa2, 0x49, 0x6f, 0x6e, 0x9f, 0xa4, 0x97, 0xf5, 0x26, 0xbd, 0x19, 0x12, 0x93, 0x78,
-	0x41, 0xa9, 0xfd, 0x6a, 0x65, 0x9f, 0xdc, 0xd7, 0x7c, 0x3f, 0x07, 0x13, 0xb1, 0xd3, 0xe9, 0x93,
-	0x0e, 0x16, 0x07, 0x4a, 0x07, 0xb5, 0xab, 0x9f, 0x1f, 0x28, 0x65, 0x29, 0x0c, 0x94, 0xb2, 0x58,
-	0x50, 0xe6, 0x93, 0xf1, 0xf3, 0xc9, 0xa1, 0x2f, 0xd6, 0x2e, 0xe5, 0x2e, 0x64, 0x35, 0x84, 0xc3,
-	0x3a, 0x76, 0xf5, 0xd2, 0x87, 0x9f, 0xce, 0x1f, 0xfa, 0xe8, 0xd3, 0xf9, 0x43, 0x1f, 0x7f, 0x3a,
-	0x7f, 0xe8, 0xdb, 0x7b, 0xf3, 0xc6, 0x87, 0x7b, 0xf3, 0xc6, 0x47, 0x7b, 0xf3, 0xc6, 0xc7, 0x7b,
-	0xf3, 0xc6, 0x27, 0x7b, 0xf3, 0xc6, 0x8f, 0xfe, 0x3e, 0x7f, 0xe8, 0xfa, 0x03, 0x69, 0x7e, 0x7f,
-	0xfb, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x19, 0x4d, 0x94, 0xce, 0xa6, 0x3b, 0x00, 0x00,
+	// 3435 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3b, 0x4b, 0x6c, 0x24, 0xc5,
+	0xd9, 0xdb, 0x33, 0xe3, 0xb1, 0xe7, 0x1b, 0x3f, 0xcb, 0xde, 0xc5, 0x98, 0x7f, 0xbd, 0xab, 0x86,
+	0x1f, 0x41, 0x80, 0x71, 0x76, 0x17, 0xc3, 0xb2, 0x10, 0x88, 0xc7, 0xfb, 0xf2, 0x62, 0x16, 0xa7,
+	0xec, 0x5d, 0xc8, 0x02, 0x4a, 0xca, 0x33, 0xe5, 0x99, 0xc6, 0x33, 0xd3, 0x4d, 0x57, 0x8f, 0x17,
+	0x07, 0x29, 0x09, 0x49, 0x50, 0xb8, 0x04, 0x25, 0xca, 0x21, 0xe4, 0x9a, 0x44, 0x89, 0x72, 0x48,
+	0x6e, 0x39, 0x44, 0x39, 0x20, 0x85, 0x0b, 0xca, 0x21, 0x42, 0x39, 0x11, 0x29, 0x5a, 0x81, 0x73,
+	0x8b, 0x44, 0xb8, 0xaf, 0x14, 0x29, 0xaa, 0x47, 0x77, 0x57, 0xf7, 0xf4, 0xd8, 0xdd, 0xc3, 0xee,
+	0x8a, 0xdc, 0xec, 0xef, 0x59, 0xf5, 0xd5, 0x57, 0xdf, 0xab, 0x6b, 0xe0, 0xd1, 0x86, 0xe5, 0x35,
+	0xbb, 0x9b, 0x95, 0x9a, 0xdd, 0x5e, 0x20, 0xdb, 0x5d, 0xcb, 0xdb, 0x5d, 0xd8, 0x26, 0x6e, 0xc3,
+	0x5e, 0x20, 0x8e, 0xb5, 0xb0, 0x73, 0x82, 0xb4, 0x9c, 0x26, 0x39, 0xb1, 0xd0, 0xa0, 0x1d, 0xea,
+	0x12, 0x8f, 0xd6, 0x2b, 0x8e, 0x6b, 0x7b, 0x36, 0xba, 0x2f, 0xe4, 0xaa, 0x48, 0xae, 0x8a, 0xe0,
+	0xaa, 0x10, 0xc7, 0xaa, 0xf8, 0x5c, 0x73, 0x8f, 0x68, 0xb2, 0x1b, 0x76, 0xc3, 0x5e, 0x10, 0xcc,
+	0x9b, 0xdd, 0x2d, 0xf1, 0x9f, 0xf8, 0x47, 0xfc, 0x25, 0x85, 0xce, 0x3d, 0xba, 0x7d, 0x9a, 0x55,
+	0x2c, 0xa1, 0xb9, 0x4d, 0x6a, 0x4d, 0xab, 0x43, 0xdd, 0xdd, 0x05, 0x67, 0xbb, 0xc1, 0x01, 0x6c,
+	0xa1, 0x4d, 0x3d, 0xb2, 0xb0, 0xd3, 0xb3, 0x94, 0xb9, 0x85, 0x7e, 0x5c, 0x6e, 0xb7, 0xe3, 0x59,
+	0x6d, 0xda, 0xc3, 0xf0, 0xd8, 0x41, 0x0c, 0xac, 0xd6, 0xa4, 0x6d, 0x12, 0xe7, 0x33, 0x5f, 0x86,
+	0xe9, 0xa5, 0x0e, 0x69, 0xed, 0x32, 0x8b, 0xe1, 0x6e, 0x67, 0xc9, 0x6d, 0x74, 0xdb, 0xb4, 0xe3,
+	0xa1, 0xe3, 0x50, 0xe8, 0x90, 0x36, 0x9d, 0x35, 0x8e, 0x1b, 0x0f, 0x94, 0xaa, 0xa3, 0x1f, 0xdc,
+	0x38, 0x76, 0x68, 0xef, 0xc6, 0xb1, 0xc2, 0x65, 0xd2, 0xa6, 0x58, 0x60, 0xd0, 0xbd, 0x30, 0xb4,
+	0x43, 0x5a, 0x5d, 0x3a, 0x9b, 0x13, 0x24, 0x63, 0x8a, 0x64, 0xe8, 0x2a, 0x07, 0x62, 0x89, 0x33,
+	0xbf, 0x9f, 0x8f, 0x88, 0x7f, 0x8e, 0x7a, 0xa4, 0x4e, 0x3c, 0x82, 0xda, 0x50, 0x6c, 0x91, 0x4d,
+	0xda, 0x62, 0xb3, 0xc6, 0xf1, 0xfc, 0x03, 0xe5, 0x93, 0xe7, 0x2a, 0x69, 0x4c, 0x5f, 0x49, 0x10,
+	0x55, 0x59, 0x15, 0x72, 0xce, 0x75, 0x3c, 0x77, 0xb7, 0x3a, 0xae, 0x16, 0x51, 0x94, 0x40, 0xac,
+	0x94, 0xa0, 0x37, 0x0d, 0x28, 0x93, 0x4e, 0xc7, 0xf6, 0x88, 0x67, 0xd9, 0x1d, 0x36, 0x9b, 0x13,
+	0x4a, 0x2f, 0x0d, 0xae, 0x74, 0x29, 0x14, 0x26, 0x35, 0x4f, 0x2b, 0xcd, 0x65, 0x0d, 0x83, 0x75,
+	0x9d, 0x73, 0x4f, 0x40, 0x59, 0x5b, 0x2a, 0x9a, 0x84, 0xfc, 0x36, 0xdd, 0x95, 0xf6, 0xc5, 0xfc,
+	0x4f, 0x34, 0x13, 0x31, 0xa8, 0xb2, 0xe0, 0x99, 0xdc, 0x69, 0x63, 0xee, 0x69, 0x98, 0x8c, 0x2b,
+	0xcc, 0xc2, 0x6f, 0xbe, 0x63, 0xc0, 0x8c, 0xb6, 0x0b, 0x4c, 0xb7, 0xa8, 0x4b, 0x3b, 0x35, 0x8a,
+	0x16, 0xa0, 0xc4, 0xcf, 0x92, 0x39, 0xa4, 0xe6, 0x1f, 0xf5, 0x94, 0xda, 0x48, 0xe9, 0xb2, 0x8f,
+	0xc0, 0x21, 0x4d, 0xe0, 0x16, 0xb9, 0xfd, 0xdc, 0xc2, 0x69, 0x12, 0x46, 0x67, 0xf3, 0x51, 0xb7,
+	0x58, 0xe3, 0x40, 0x2c, 0x71, 0xe6, 0x57, 0xe0, 0x6e, 0x7f, 0x3d, 0x1b, 0xb4, 0xed, 0xb4, 0x88,
+	0x47, 0xc3, 0x45, 0x1d, 0xe8, 0x7a, 0xe6, 0x04, 0x8c, 0x2d, 0x39, 0x8e, 0x6b, 0xef, 0xd0, 0xfa,
+	0xba, 0x47, 0x1a, 0xd4, 0xfc, 0x9e, 0x01, 0x87, 0x97, 0xdc, 0x86, 0xbd, 0x7c, 0x76, 0xc9, 0x71,
+	0x2e, 0x52, 0xd2, 0xf2, 0x9a, 0xeb, 0x1e, 0xf1, 0xba, 0x0c, 0x3d, 0x0d, 0x45, 0x26, 0xfe, 0x52,
+	0xe2, 0xee, 0xf7, 0x3d, 0x44, 0xe2, 0x6f, 0xde, 0x38, 0x36, 0x93, 0xc0, 0x48, 0xb1, 0xe2, 0x42,
+	0x0f, 0xc2, 0x70, 0x9b, 0x32, 0x46, 0x1a, 0xfe, 0x9e, 0x27, 0x94, 0x80, 0xe1, 0xe7, 0x24, 0x18,
+	0xfb, 0x78, 0xf3, 0x2f, 0x39, 0x98, 0x08, 0x64, 0x29, 0xf5, 0xb7, 0xc1, 0xc0, 0x5d, 0x18, 0x6d,
+	0x6a, 0x3b, 0x14, 0x76, 0x2e, 0x9f, 0x7c, 0x32, 0xa5, 0x2f, 0x27, 0x19, 0xa9, 0x3a, 0xa3, 0xd4,
+	0x8c, 0xea, 0x50, 0x1c, 0x51, 0x83, 0xda, 0x00, 0x6c, 0xb7, 0x53, 0x53, 0x4a, 0x0b, 0x42, 0xe9,
+	0x13, 0x19, 0x95, 0xae, 0x07, 0x02, 0xaa, 0x48, 0xa9, 0x84, 0x10, 0x86, 0x35, 0x05, 0xe6, 0xef,
+	0x0d, 0x98, 0x4e, 0xe0, 0x43, 0x4f, 0xc5, 0xce, 0xf3, 0xbe, 0x9e, 0xf3, 0x44, 0x3d, 0x6c, 0xe1,
+	0x69, 0x3e, 0x0c, 0x23, 0x2e, 0xdd, 0xb1, 0x98, 0x65, 0x77, 0x94, 0x85, 0x27, 0x15, 0xff, 0x08,
+	0x56, 0x70, 0x1c, 0x50, 0xa0, 0x87, 0xa0, 0xe4, 0xff, 0xcd, 0xcd, 0x9c, 0xe7, 0xee, 0xcc, 0x0f,
+	0xce, 0x27, 0x65, 0x38, 0xc4, 0x9b, 0x9f, 0x1a, 0xda, 0xe9, 0x5f, 0x71, 0xea, 0xc4, 0xa3, 0xdc,
+	0x79, 0x88, 0xe3, 0x5c, 0x0e, 0x9d, 0x39, 0x70, 0x9e, 0x25, 0x09, 0xc6, 0x3e, 0x1e, 0x9d, 0x86,
+	0x51, 0xf5, 0xa7, 0xf4, 0x15, 0xb9, 0xba, 0xe0, 0x60, 0x96, 0x34, 0x1c, 0x8e, 0x50, 0xa2, 0x2e,
+	0x8c, 0x31, 0xbb, 0xeb, 0xd6, 0xa8, 0x54, 0x2a, 0x57, 0x5a, 0x3e, 0x79, 0x3a, 0xcb, 0xd9, 0xac,
+	0x6b, 0x02, 0xaa, 0x87, 0x95, 0xd2, 0x31, 0x1d, 0xca, 0x70, 0x54, 0x8b, 0xf9, 0x1a, 0x80, 0xe4,
+	0xbd, 0x48, 0x5b, 0x6d, 0x54, 0x83, 0xa2, 0xd5, 0x26, 0x0d, 0xea, 0xc7, 0xf3, 0x4c, 0xee, 0xc8,
+	0x25, 0xac, 0x70, 0x6e, 0xb5, 0x80, 0x20, 0x8a, 0x0b, 0x20, 0xc3, 0x4a, 0xb4, 0xf9, 0x6e, 0x70,
+	0xcb, 0x63, 0x1c, 0x3c, 0xe8, 0x08, 0x1a, 0x65, 0xe6, 0x20, 0xe8, 0x08, 0x1a, 0x2c, 0x71, 0xe8,
+	0xa8, 0x8c, 0x98, 0xd2, 0xb2, 0x65, 0x45, 0x92, 0x7f, 0x96, 0xee, 0xca, 0xf0, 0xf9, 0xa4, 0x1f,
+	0x3e, 0x65, 0xe0, 0xfa, 0xff, 0x48, 0x3e, 0xe3, 0x71, 0x42, 0x53, 0x28, 0x60, 0x1b, 0xbb, 0x4e,
+	0x90, 0xe7, 0xde, 0xf0, 0x0f, 0xff, 0xd9, 0x2e, 0xf3, 0xec, 0xb6, 0xf5, 0x2d, 0x8a, 0x9a, 0x31,
+	0x93, 0x7c, 0x35, 0x8b, 0x49, 0x02, 0x31, 0x69, 0xec, 0xe2, 0xc2, 0x5c, 0x7f, 0xae, 0x74, 0xb6,
+	0x59, 0x80, 0x52, 0x97, 0xd1, 0xb3, 0x56, 0x83, 0x32, 0x4f, 0x58, 0x68, 0x24, 0x8c, 0x53, 0x57,
+	0x7c, 0x04, 0x0e, 0x69, 0xcc, 0x7f, 0xe5, 0x00, 0xf5, 0xfa, 0x0e, 0xf7, 0x78, 0x97, 0x3a, 0xf6,
+	0x15, 0xbc, 0x1a, 0xf7, 0x78, 0x2c, 0xc1, 0xd8, 0xc7, 0xf3, 0x75, 0xd5, 0x9a, 0xc4, 0xf5, 0xe2,
+	0xf5, 0xc3, 0x32, 0x07, 0x62, 0x89, 0x43, 0x6b, 0x30, 0xd3, 0x15, 0x92, 0x37, 0x88, 0xdb, 0xa0,
+	0x9e, 0x7f, 0xf3, 0xc4, 0x19, 0x8d, 0x54, 0xff, 0x4f, 0xf1, 0xcc, 0x5c, 0x49, 0xa0, 0xc1, 0x89,
+	0x9c, 0x68, 0x13, 0x4a, 0xdb, 0xbe, 0x99, 0x54, 0x18, 0x5b, 0x1c, 0xe8, 0x64, 0x64, 0x2c, 0x08,
+	0xfe, 0xc5, 0xa1, 0x58, 0x74, 0x19, 0x0a, 0x4d, 0xda, 0x6a, 0xcf, 0x0e, 0x09, 0xf1, 0x5f, 0xce,
+	0x7a, 0x17, 0xaa, 0x23, 0x3c, 0xe4, 0xf3, 0xbf, 0xb0, 0x90, 0x63, 0x7e, 0x07, 0xa4, 0x55, 0xb2,
+	0x98, 0xf7, 0xe0, 0x44, 0xf2, 0x20, 0x0c, 0xef, 0x50, 0x37, 0x30, 0xa7, 0x26, 0xec, 0xaa, 0x04,
+	0x63, 0x1f, 0x6f, 0xfe, 0xda, 0x80, 0x29, 0xb1, 0x82, 0xf5, 0xee, 0x26, 0xab, 0xb9, 0x96, 0xc3,
+	0x0b, 0x91, 0x5b, 0xbb, 0x9a, 0xb3, 0x30, 0xc9, 0x68, 0x7b, 0x87, 0xba, 0xcb, 0x76, 0x87, 0x79,
+	0x2e, 0xb1, 0x3a, 0x9e, 0x5a, 0xd6, 0xac, 0xa2, 0x9e, 0x5c, 0x8f, 0xe1, 0x71, 0x0f, 0x87, 0xf9,
+	0xab, 0x02, 0x0c, 0x9f, 0x77, 0xa9, 0xd5, 0x68, 0x7a, 0xe8, 0x9b, 0x30, 0xd2, 0x56, 0xf5, 0x9a,
+	0x58, 0x1f, 0x3f, 0x09, 0x59, 0x24, 0x57, 0xf4, 0x22, 0xb9, 0xe2, 0x6c, 0x37, 0x38, 0x80, 0x55,
+	0x38, 0x75, 0x65, 0xe7, 0x44, 0xe5, 0xf9, 0xcd, 0x57, 0x69, 0xcd, 0xe3, 0xb5, 0x5e, 0x98, 0xa6,
+	0x42, 0x18, 0x0e, 0xa4, 0x72, 0x17, 0x26, 0x2d, 0x8b, 0xb0, 0xd9, 0xe1, 0xa8, 0x0b, 0x2f, 0x71,
+	0x20, 0x96, 0x38, 0x7e, 0xb5, 0xae, 0x13, 0x97, 0x36, 0xed, 0x2e, 0xa3, 0xb3, 0x23, 0xd1, 0x12,
+	0xe0, 0x05, 0x1f, 0x81, 0x43, 0x1a, 0x74, 0x0d, 0x86, 0x6b, 0x76, 0xbb, 0x6d, 0x79, 0x7e, 0x28,
+	0x5f, 0x48, 0xe7, 0x40, 0x17, 0x2c, 0x6f, 0x59, 0xf0, 0x85, 0xe7, 0x20, 0xff, 0x67, 0xd8, 0x17,
+	0x88, 0xd6, 0x83, 0xa0, 0x54, 0x10, 0xa2, 0x1f, 0x4a, 0x27, 0x5a, 0xc4, 0x8a, 0x7e, 0xf1, 0x87,
+	0x0b, 0x15, 0xb7, 0x95, 0xcd, 0x0e, 0x65, 0x11, 0x2a, 0x1c, 0x2a, 0x14, 0x2a, 0xfe, 0x65, 0x58,
+	0x89, 0x42, 0x2f, 0x05, 0x89, 0xbe, 0x28, 0xce, 0xee, 0x54, 0x3a, 0xa1, 0xea, 0xf0, 0x55, 0x95,
+	0x31, 0x1e, 0xad, 0x0e, 0xfc, 0x3a, 0xc0, 0x7c, 0xcf, 0x80, 0xb2, 0xa2, 0x5c, 0xb5, 0x98, 0x87,
+	0x5e, 0xee, 0x71, 0x95, 0x4a, 0x3a, 0x57, 0xe1, 0xdc, 0xc2, 0x51, 0x82, 0x3a, 0xc2, 0x87, 0x68,
+	0x6e, 0x82, 0x61, 0xc8, 0xf2, 0x68, 0xdb, 0x6f, 0x3b, 0x1e, 0xc9, 0xb4, 0x13, 0x2d, 0x60, 0x73,
+	0x19, 0x58, 0x8a, 0x32, 0x3f, 0x2d, 0xc0, 0xa4, 0xa2, 0xc8, 0x50, 0x39, 0x47, 0x9d, 0xb1, 0x98,
+	0xcd, 0x19, 0x73, 0xb7, 0xcf, 0x19, 0xf3, 0xb7, 0xc3, 0x19, 0x0b, 0xb7, 0xce, 0x19, 0x5f, 0x87,
+	0xc9, 0x1d, 0xea, 0x5a, 0x5b, 0x56, 0x4d, 0xb4, 0x60, 0x2b, 0x9d, 0x2d, 0x5b, 0x05, 0xf7, 0xc7,
+	0xd2, 0x89, 0xbf, 0x1a, 0xe3, 0xae, 0xce, 0xf0, 0x80, 0x16, 0x87, 0xe2, 0x1e, 0x2d, 0xe8, 0x2d,
+	0x03, 0xa6, 0x75, 0xe0, 0x45, 0x8b, 0x79, 0xb6, 0xbb, 0x3b, 0x3b, 0x2c, 0x36, 0x37, 0xa8, 0xf6,
+	0x7b, 0xd4, 0x3e, 0xa7, 0xaf, 0xf6, 0x8a, 0xc6, 0x49, 0xfa, 0xcc, 0x7f, 0xe7, 0x61, 0x2c, 0x72,
+	0xb7, 0xd0, 0x75, 0x00, 0x49, 0x48, 0xeb, 0x2b, 0x1d, 0x55, 0xe3, 0x2c, 0x0f, 0x70, 0x49, 0xd5,
+	0xea, 0xb8, 0x14, 0xd9, 0x4a, 0x07, 0x31, 0x37, 0x44, 0x60, 0x4d, 0x15, 0x7a, 0x03, 0xca, 0x44,
+	0x75, 0x7f, 0xe7, 0x6d, 0x57, 0xb9, 0xe5, 0xd9, 0x41, 0x34, 0x2f, 0x85, 0x62, 0xe2, 0x5d, 0x7c,
+	0x88, 0xc1, 0xba, 0xb6, 0x39, 0x17, 0x26, 0x62, 0xeb, 0x4d, 0xe8, 0xc4, 0x57, 0xf4, 0x4e, 0x3c,
+	0x75, 0xe8, 0xf2, 0xe5, 0x8a, 0x96, 0x56, 0x6f, 0xff, 0x19, 0x4c, 0xc6, 0x57, 0x7a, 0xcb, 0x94,
+	0x46, 0xfa, 0x68, 0x7d, 0x66, 0xf0, 0x87, 0x1c, 0x94, 0x82, 0x4b, 0x9c, 0x25, 0xd5, 0xcf, 0x41,
+	0xce, 0xaa, 0xab, 0x44, 0x0f, 0x8a, 0x2a, 0xb7, 0x72, 0x16, 0xe7, 0xac, 0x3a, 0xba, 0x1f, 0x8a,
+	0x9b, 0x2e, 0xe9, 0xd4, 0x9a, 0x2a, 0xb5, 0x07, 0xf7, 0xad, 0x2a, 0xa0, 0x58, 0x61, 0x79, 0xa9,
+	0xee, 0x91, 0x86, 0x28, 0xcf, 0xb4, 0x52, 0x7d, 0x83, 0x34, 0x30, 0x87, 0xa3, 0x0b, 0x30, 0x25,
+	0x7b, 0xd3, 0xe5, 0x26, 0xad, 0x6d, 0xcb, 0x25, 0x8a, 0xfb, 0x58, 0xaa, 0xde, 0xad, 0x88, 0xa7,
+	0x2e, 0xc6, 0x09, 0x70, 0x2f, 0x8f, 0xde, 0xdd, 0x17, 0xf7, 0xef, 0xee, 0xf9, 0xd2, 0x49, 0xd7,
+	0x6b, 0xda, 0xae, 0x4a, 0xf6, 0xc1, 0xd2, 0x97, 0x04, 0x14, 0x2b, 0xac, 0x39, 0x0d, 0x53, 0x17,
+	0x2c, 0xef, 0x62, 0x77, 0x73, 0xad, 0xdb, 0x6a, 0x61, 0xfa, 0x5a, 0x97, 0x57, 0xcb, 0x12, 0xb8,
+	0x4a, 0x22, 0xc0, 0xdf, 0x0c, 0xc1, 0xd8, 0x05, 0xcb, 0x13, 0x06, 0xcc, 0x5c, 0x3d, 0xaf, 0xc3,
+	0x61, 0xab, 0xc3, 0x68, 0xad, 0xeb, 0xd2, 0xf5, 0x6d, 0xcb, 0xd9, 0x58, 0x5d, 0x17, 0xee, 0xb3,
+	0xab, 0x8a, 0xf7, 0xa3, 0x8a, 0xf1, 0xf0, 0x4a, 0x12, 0x11, 0x4e, 0xe6, 0x45, 0x27, 0x01, 0x5c,
+	0x4a, 0xea, 0x55, 0xfd, 0x88, 0x82, 0xdb, 0x88, 0x03, 0x0c, 0xd6, 0xa8, 0xd0, 0x22, 0x94, 0xaf,
+	0xbb, 0x96, 0x47, 0x15, 0x93, 0x3c, 0xb2, 0xe0, 0x1e, 0xbd, 0x10, 0xa2, 0xb0, 0x4e, 0x87, 0x76,
+	0xa0, 0xec, 0x84, 0xb6, 0x50, 0xc1, 0x34, 0x65, 0xf8, 0xd0, 0x8c, 0xb8, 0xe6, 0xda, 0x6d, 0x9b,
+	0xc7, 0xa9, 0xe7, 0x68, 0xad, 0x49, 0x3a, 0x16, 0x6b, 0x57, 0x27, 0xb8, 0x5e, 0x8d, 0x04, 0xeb,
+	0x8a, 0x50, 0x03, 0x8a, 0x2e, 0xed, 0xd4, 0xa9, 0xab, 0xca, 0x8a, 0x94, 0x2a, 0x9f, 0xe5, 0x20,
+	0x2c, 0x18, 0x13, 0x54, 0x02, 0xf7, 0x03, 0x89, 0xc5, 0x4a, 0x3c, 0xea, 0xe8, 0x7d, 0xc6, 0xb0,
+	0xd0, 0xb5, 0x94, 0x52, 0x97, 0xcf, 0x96, 0xa0, 0xa9, 0x7f, 0xcf, 0x71, 0x4d, 0xf5, 0x1c, 0x23,
+	0x42, 0xd5, 0x53, 0xe9, 0x54, 0xf1, 0x1e, 0x23, 0x41, 0x4b, 0xbc, 0xff, 0xf8, 0x73, 0x01, 0x26,
+	0x2e, 0x58, 0x03, 0x17, 0xff, 0x1e, 0xdc, 0x25, 0x53, 0xfe, 0x3a, 0x6d, 0xd1, 0x1a, 0xe7, 0x5e,
+	0xf7, 0x5c, 0xe2, 0xd1, 0x86, 0xdf, 0x8c, 0x9f, 0x51, 0xac, 0x77, 0x2d, 0x27, 0x93, 0xdd, 0xec,
+	0x8f, 0xc2, 0xfd, 0x44, 0xa7, 0x8e, 0x35, 0x49, 0x8d, 0x47, 0x21, 0x6b, 0xe3, 0xc1, 0x0b, 0x2b,
+	0xd2, 0x6a, 0xd9, 0xd7, 0x37, 0x48, 0x83, 0xa9, 0x50, 0x14, 0x14, 0x56, 0x4b, 0x3e, 0x02, 0x87,
+	0x34, 0xa8, 0x02, 0x60, 0x35, 0x3a, 0xb6, 0x4b, 0x05, 0x47, 0x51, 0x4c, 0x97, 0xc6, 0xf9, 0x3d,
+	0x5b, 0x09, 0xa0, 0x58, 0xa3, 0xe8, 0x7f, 0xe1, 0x87, 0x3f, 0xc7, 0x85, 0x7f, 0x14, 0x46, 0xad,
+	0x4e, 0xad, 0xd5, 0xad, 0xd3, 0x35, 0xe2, 0x35, 0xd9, 0xec, 0x88, 0x58, 0xc6, 0xe4, 0xde, 0x8d,
+	0x63, 0xa3, 0x2b, 0x1a, 0x1c, 0x47, 0xa8, 0x38, 0x17, 0x7d, 0x5d, 0xe3, 0x2a, 0x85, 0x5c, 0xe7,
+	0x5e, 0xd7, 0xb9, 0x74, 0x2a, 0xf3, 0xaf, 0x06, 0x14, 0x65, 0x50, 0x46, 0x8b, 0xb1, 0x21, 0xde,
+	0xd1, 0x9e, 0x21, 0x5e, 0x39, 0x69, 0x16, 0x6b, 0x42, 0xd1, 0x62, 0xac, 0x4b, 0x65, 0x29, 0x5a,
+	0x92, 0xd7, 0x6e, 0x45, 0x40, 0xb0, 0xc2, 0x20, 0x0b, 0x80, 0xf8, 0x53, 0x38, 0xbf, 0xae, 0x5c,
+	0xcc, 0x3a, 0xa6, 0x8c, 0x8d, 0x28, 0x03, 0x04, 0xc3, 0x9a, 0x70, 0xf3, 0x17, 0x06, 0xdc, 0xcd,
+	0x2f, 0x89, 0xa8, 0x15, 0xcf, 0x52, 0x87, 0xdf, 0xfb, 0x4e, 0x6d, 0x57, 0xc5, 0x72, 0x11, 0x4b,
+	0x1d, 0x9b, 0x59, 0xa2, 0x5c, 0x33, 0xe2, 0xb1, 0xd4, 0xc7, 0x60, 0x8d, 0x2a, 0x45, 0x97, 0xbc,
+	0x00, 0x25, 0x51, 0x92, 0x72, 0x93, 0x2a, 0xbf, 0x0e, 0xdc, 0x6c, 0xd9, 0x47, 0xe0, 0x90, 0xc6,
+	0xfc, 0x9b, 0x01, 0x13, 0x03, 0x4d, 0xcb, 0x9e, 0x86, 0x71, 0x51, 0x0c, 0xb0, 0xf3, 0x56, 0x4b,
+	0x9c, 0xa0, 0x5a, 0xd5, 0x11, 0x45, 0x3d, 0x7e, 0x35, 0x82, 0xc5, 0x31, 0x6a, 0x7f, 0xda, 0x96,
+	0x3f, 0x68, 0xda, 0x56, 0x18, 0x60, 0xda, 0xf6, 0xb1, 0x01, 0x47, 0x92, 0x43, 0x17, 0x7a, 0x25,
+	0x36, 0x75, 0x5b, 0x4c, 0x1f, 0x08, 0x53, 0x8c, 0xda, 0x78, 0xfa, 0x50, 0xdd, 0x85, 0x2c, 0x3b,
+	0x9f, 0x49, 0x2f, 0x3e, 0xd1, 0x4d, 0xfa, 0x75, 0x1c, 0xe6, 0xef, 0x0c, 0x90, 0xe7, 0x91, 0x25,
+	0xd0, 0x9e, 0x04, 0x68, 0xa8, 0x82, 0x02, 0xaf, 0xaa, 0xf3, 0x0a, 0x7c, 0xee, 0x42, 0x80, 0xc1,
+	0x1a, 0x95, 0x5f, 0x6a, 0xe5, 0xfb, 0x94, 0x5a, 0xf7, 0x43, 0xb1, 0x2e, 0xa7, 0x82, 0x85, 0x68,
+	0x14, 0x55, 0x23, 0x41, 0x85, 0x35, 0xdf, 0x29, 0xc0, 0x94, 0x58, 0xef, 0xa0, 0x49, 0x62, 0x90,
+	0xb5, 0x3b, 0x70, 0x44, 0x9c, 0x4b, 0x6f, 0x5e, 0x91, 0xdb, 0x39, 0xad, 0xf8, 0x8f, 0xac, 0x24,
+	0x52, 0xdd, 0xec, 0x8b, 0xc1, 0x7d, 0xe4, 0xfe, 0xaf, 0x24, 0x8b, 0x87, 0x61, 0xc4, 0x69, 0x11,
+	0x6f, 0xcb, 0x76, 0xdb, 0xaa, 0x5c, 0x0d, 0xe6, 0x13, 0x6b, 0x0a, 0x8e, 0x03, 0x8a, 0xfe, 0xa9,
+	0x65, 0x64, 0xf0, 0xd4, 0x62, 0x76, 0xe0, 0x88, 0x56, 0x34, 0xdd, 0xfe, 0x81, 0xf4, 0x5b, 0x06,
+	0x1c, 0xdd, 0xb7, 0x4a, 0x43, 0xf5, 0x58, 0x68, 0x78, 0x2a, 0x73, 0xe9, 0x97, 0x66, 0x18, 0xff,
+	0x8e, 0x01, 0x33, 0x83, 0xcf, 0xe1, 0x8f, 0x43, 0xc1, 0x09, 0x63, 0x6d, 0x90, 0x01, 0x44, 0x84,
+	0x15, 0x98, 0xa8, 0x61, 0xf2, 0x29, 0x0c, 0xf3, 0xa6, 0x01, 0xf7, 0xec, 0x53, 0x52, 0xa2, 0xcd,
+	0x98, 0x59, 0xce, 0x64, 0xac, 0x52, 0xd3, 0x18, 0xe5, 0xe7, 0x39, 0x18, 0x5e, 0x73, 0xed, 0x57,
+	0x69, 0xed, 0x4e, 0x8c, 0x65, 0x9f, 0x87, 0x02, 0x73, 0x68, 0x4d, 0x35, 0xc2, 0x27, 0x52, 0x36,
+	0x15, 0x72, 0x79, 0xeb, 0x0e, 0xad, 0xc9, 0xfa, 0x97, 0xff, 0x85, 0x85, 0x20, 0x6d, 0x16, 0x99,
+	0xcf, 0xd2, 0x5b, 0xfb, 0x22, 0x0f, 0x9e, 0x45, 0x2a, 0xca, 0x2f, 0xec, 0x2c, 0x52, 0xad, 0xaf,
+	0xcf, 0x2c, 0xf2, 0x47, 0xe1, 0x0e, 0xb8, 0xd1, 0xd0, 0xb7, 0x61, 0xca, 0xf1, 0xfd, 0x6c, 0xcd,
+	0x6e, 0x59, 0x35, 0x2b, 0x6b, 0x3a, 0x5e, 0x8b, 0xb0, 0xef, 0x86, 0x5d, 0xfd, 0x5a, 0x5c, 0x2e,
+	0xee, 0x55, 0x65, 0xda, 0x30, 0x16, 0x31, 0x3d, 0x3a, 0xe5, 0xbf, 0x49, 0x88, 0x96, 0x9b, 0xf2,
+	0x4d, 0xc2, 0xcd, 0x1b, 0xc7, 0x46, 0x15, 0xb9, 0xfe, 0x46, 0x21, 0xcb, 0x97, 0xff, 0x5f, 0xe6,
+	0xa0, 0x14, 0xac, 0xec, 0x0e, 0x38, 0xf8, 0x95, 0x88, 0x83, 0x9f, 0xca, 0x68, 0x53, 0xe1, 0xe2,
+	0x41, 0x68, 0xd1, 0xdc, 0xfc, 0x95, 0x98, 0x9b, 0x67, 0x3d, 0xac, 0x03, 0x1c, 0xfd, 0x33, 0x43,
+	0x9c, 0x8b, 0xa4, 0x15, 0xc3, 0xcd, 0x83, 0xe7, 0xd5, 0x04, 0x86, 0xb7, 0xe4, 0xc8, 0x4e, 0x6d,
+	0xf6, 0xb1, 0x4c, 0x73, 0xbe, 0x60, 0x34, 0x1e, 0x1e, 0x9e, 0x8f, 0xf1, 0xe5, 0xa2, 0xaf, 0xdf,
+	0x9a, 0x5d, 0x43, 0xc2, 0x8e, 0xdf, 0xd7, 0x77, 0x7c, 0x07, 0x2e, 0xf7, 0x46, 0xf4, 0x72, 0x2f,
+	0x64, 0xdc, 0x49, 0x9f, 0xeb, 0xfd, 0xc3, 0x1c, 0x4c, 0xf7, 0xe6, 0x0d, 0x86, 0x18, 0x8c, 0x37,
+	0xf4, 0xf1, 0x95, 0x7f, 0xc7, 0x4f, 0xa5, 0xfe, 0x42, 0x10, 0xf2, 0x86, 0x6d, 0x45, 0x04, 0xcc,
+	0x70, 0x4c, 0x05, 0x7a, 0x03, 0x26, 0x49, 0xf4, 0x95, 0x85, 0xbf, 0xdb, 0xac, 0x5d, 0x9e, 0x52,
+	0x1c, 0xd4, 0x6d, 0x31, 0x04, 0xc3, 0x3d, 0x8a, 0xcc, 0xb7, 0x0d, 0x98, 0x88, 0x85, 0x26, 0x9e,
+	0xd6, 0x99, 0x97, 0x90, 0xd6, 0xd5, 0x40, 0x55, 0xe0, 0xd0, 0x1a, 0xcc, 0x90, 0xae, 0x67, 0x07,
+	0xbc, 0xe7, 0x3a, 0x64, 0xb3, 0x45, 0xeb, 0xaa, 0xb0, 0x09, 0x3e, 0x63, 0x2f, 0x25, 0xd0, 0xe0,
+	0x44, 0x4e, 0xf3, 0x1b, 0x9a, 0x67, 0x89, 0xa0, 0x9b, 0x6a, 0x1d, 0x0f, 0x46, 0xaf, 0x53, 0xa9,
+	0xff, 0xb5, 0x30, 0x3f, 0xcb, 0x69, 0x7b, 0x55, 0x71, 0xf4, 0x12, 0xa0, 0x16, 0x61, 0xde, 0x45,
+	0xd2, 0xa9, 0xf3, 0x95, 0xd1, 0x2d, 0x97, 0x32, 0x7f, 0xe4, 0x37, 0xa7, 0x24, 0xa1, 0xd5, 0x1e,
+	0x0a, 0x9c, 0xc0, 0x85, 0x16, 0xa3, 0x31, 0xf9, 0x58, 0x3c, 0x26, 0x8f, 0x87, 0x86, 0x1e, 0x2c,
+	0x2a, 0xa3, 0xd7, 0xb4, 0xbb, 0x96, 0xcf, 0xf2, 0x79, 0x22, 0xb6, 0xed, 0x8a, 0xff, 0xea, 0x4f,
+	0x7e, 0x23, 0x08, 0x2e, 0xa0, 0x0f, 0x0e, 0x2f, 0xe0, 0xdc, 0x93, 0x30, 0x16, 0x21, 0xce, 0xf4,
+	0x4a, 0xef, 0xef, 0x06, 0x1c, 0xdd, 0x77, 0xb4, 0xc9, 0xeb, 0x10, 0xb9, 0x01, 0x15, 0x3b, 0x1e,
+	0x4f, 0x7d, 0xd3, 0xa2, 0xf3, 0x68, 0x19, 0xac, 0x24, 0x18, 0x2b, 0x91, 0x4a, 0x78, 0x8b, 0x6c,
+	0xaa, 0x48, 0x9b, 0x5e, 0x78, 0x74, 0xae, 0x1d, 0x08, 0x5f, 0x25, 0x52, 0x78, 0x8b, 0x6c, 0x9a,
+	0xef, 0xe6, 0x60, 0x92, 0x5f, 0xe3, 0x48, 0x77, 0xb8, 0x06, 0xf9, 0x86, 0xe5, 0xa9, 0xbd, 0x2c,
+	0xa6, 0x56, 0xa7, 0xcb, 0xa8, 0x0e, 0xf3, 0x6e, 0x95, 0xc7, 0x0c, 0x2e, 0x0a, 0xbd, 0xe8, 0xd7,
+	0xd8, 0x99, 0xb6, 0xd0, 0xd3, 0xb7, 0x56, 0x4b, 0x3d, 0x85, 0xf9, 0x8b, 0xfe, 0x6b, 0x95, 0x7c,
+	0x16, 0xc9, 0x3d, 0x6f, 0x26, 0xa4, 0x64, 0xfd, 0x89, 0x8b, 0xf9, 0xb3, 0x1c, 0xc8, 0x4b, 0x7a,
+	0x07, 0x0a, 0x87, 0xaf, 0x45, 0x0a, 0x87, 0x94, 0xf9, 0x41, 0x2c, 0xae, 0x6f, 0xd1, 0x10, 0x4f,
+	0x9f, 0x27, 0xb2, 0x08, 0xdd, 0xbf, 0x60, 0xf8, 0x93, 0x01, 0x25, 0x41, 0x77, 0x07, 0x52, 0xe7,
+	0x5a, 0x34, 0x75, 0x3e, 0x94, 0x61, 0x17, 0x7d, 0xd2, 0xe6, 0x4f, 0xf3, 0x6a, 0xf5, 0x41, 0x78,
+	0x6e, 0x12, 0xb7, 0xae, 0xa2, 0x65, 0x18, 0x9e, 0x39, 0x10, 0x4b, 0x1c, 0x72, 0x60, 0x8c, 0x69,
+	0xce, 0xc2, 0xd4, 0x3e, 0x53, 0x26, 0x54, 0xdd, 0xcf, 0x98, 0xf6, 0x8a, 0x4f, 0x07, 0xe3, 0xa8,
+	0x02, 0xf4, 0x03, 0x03, 0xa6, 0x9d, 0xde, 0xdc, 0xae, 0x1c, 0xe4, 0x89, 0x8c, 0xf1, 0x32, 0x14,
+	0x50, 0xbd, 0x6b, 0xef, 0xc6, 0xb1, 0xa4, 0xaa, 0x01, 0x27, 0xa9, 0x43, 0x4d, 0x18, 0xd5, 0x3f,
+	0x3a, 0x2b, 0x57, 0x3a, 0x99, 0xfd, 0xeb, 0xb6, 0x9c, 0x42, 0xeb, 0x10, 0x1c, 0x91, 0x6c, 0xfe,
+	0xa4, 0x08, 0x65, 0xcd, 0xf7, 0xfa, 0xa4, 0xb4, 0xf2, 0x40, 0x29, 0xed, 0x44, 0x34, 0xa5, 0xdd,
+	0x13, 0x4f, 0x69, 0x20, 0x14, 0x47, 0xd2, 0x99, 0x0b, 0xe3, 0xb5, 0xae, 0xeb, 0xd2, 0x8e, 0x77,
+	0xfe, 0x96, 0x94, 0xb9, 0x88, 0x97, 0x50, 0xcb, 0x11, 0x89, 0x38, 0xa6, 0x81, 0xd7, 0xd4, 0x4d,
+	0xf5, 0x8a, 0x20, 0x9f, 0xe5, 0x15, 0x41, 0xff, 0x9a, 0xda, 0x7f, 0x39, 0xe0, 0xcb, 0x45, 0x6b,
+	0x50, 0x94, 0x1f, 0x5b, 0xd5, 0xe7, 0xa8, 0x87, 0xd3, 0x8e, 0x49, 0x39, 0x8f, 0x4c, 0x20, 0xf2,
+	0x6f, 0xac, 0xe4, 0xe8, 0x79, 0xbf, 0x74, 0x40, 0xde, 0xbf, 0x04, 0xc8, 0xde, 0x64, 0xd4, 0xdd,
+	0xa1, 0xf5, 0x0b, 0xf2, 0xc7, 0x0e, 0xdc, 0xa5, 0x8a, 0xc7, 0x8d, 0x07, 0xf2, 0xe1, 0x91, 0x3e,
+	0xdf, 0x43, 0x81, 0x13, 0xb8, 0x50, 0x17, 0x26, 0x95, 0xf5, 0x02, 0x5f, 0x56, 0x1f, 0xf3, 0xb2,
+	0x76, 0x5d, 0xe1, 0xab, 0x8f, 0xe5, 0x98, 0x40, 0xdc, 0xa3, 0x02, 0xb5, 0x60, 0x8c, 0xfb, 0x57,
+	0xa8, 0x13, 0x06, 0xd7, 0x39, 0xc5, 0x83, 0xc0, 0xaa, 0x2e, 0x0d, 0x47, 0x85, 0x9b, 0x8b, 0x30,
+	0x25, 0xaf, 0x84, 0x9e, 0x9c, 0x0f, 0x7e, 0x85, 0xff, 0x47, 0x03, 0xa2, 0xc1, 0x25, 0xfa, 0xba,
+	0xc8, 0x48, 0xf1, 0xba, 0xe8, 0x3a, 0x8c, 0x77, 0x1d, 0xe6, 0xb9, 0x94, 0xb4, 0xc5, 0x0a, 0xfc,
+	0xf0, 0xfb, 0x78, 0x96, 0x24, 0xa2, 0xa7, 0xd7, 0xa0, 0x8d, 0xb8, 0x12, 0x11, 0x8b, 0x63, 0x6a,
+	0xcc, 0xff, 0xe4, 0x20, 0x12, 0x25, 0xd0, 0xdb, 0x06, 0x4c, 0x91, 0xd8, 0x4f, 0x12, 0xfc, 0x86,
+	0xe6, 0x99, 0x6c, 0xbf, 0x13, 0xe9, 0xf9, 0x45, 0x43, 0x38, 0xbe, 0x88, 0x93, 0x30, 0xdc, 0xab,
+	0x54, 0xc4, 0x64, 0xd2, 0xfb, 0x9b, 0x93, 0x6c, 0x31, 0x39, 0xe1, 0x47, 0x2b, 0x32, 0x26, 0x27,
+	0x20, 0x70, 0x92, 0x3a, 0xf4, 0x12, 0x14, 0x88, 0xdb, 0xf0, 0xbf, 0xa1, 0x65, 0x57, 0xeb, 0xff,
+	0x94, 0x28, 0xf4, 0x9d, 0x25, 0xb7, 0xc1, 0xb0, 0x10, 0x6a, 0xfe, 0x23, 0x0f, 0x3d, 0xaf, 0x9f,
+	0xd4, 0xcb, 0x91, 0x42, 0xe2, 0xcb, 0x91, 0x7b, 0x61, 0x88, 0xd4, 0xbc, 0xe0, 0xf5, 0x45, 0xf8,
+	0xd4, 0x92, 0x03, 0xb1, 0xc4, 0xa1, 0x17, 0xa0, 0xc4, 0x3c, 0xe2, 0x7a, 0x1b, 0x56, 0x9b, 0xaa,
+	0x27, 0x05, 0x5f, 0x4a, 0x57, 0x23, 0x70, 0x0e, 0xf9, 0x71, 0x7d, 0xdd, 0x17, 0x80, 0x43, 0x59,
+	0xe8, 0x74, 0x34, 0xb2, 0x9b, 0xf1, 0xc8, 0x3e, 0xa5, 0xef, 0x65, 0xd0, 0x7e, 0xa5, 0x0d, 0x65,
+	0xed, 0x1c, 0x54, 0x0e, 0x3c, 0x93, 0xd9, 0xee, 0x5a, 0x7c, 0x96, 0xbf, 0x47, 0x0a, 0x31, 0xba,
+	0x7c, 0x74, 0x0d, 0x60, 0xcb, 0xea, 0x58, 0xac, 0x29, 0xac, 0x55, 0xcc, 0x6c, 0x2d, 0xf1, 0xfd,
+	0xe1, 0x7c, 0x20, 0x01, 0x6b, 0xd2, 0xcc, 0x09, 0x18, 0x8b, 0xbc, 0x66, 0x12, 0x13, 0xb2, 0x20,
+	0x02, 0x7c, 0x51, 0x27, 0x64, 0xc1, 0x02, 0x6f, 0xf5, 0x84, 0x2c, 0x14, 0xbc, 0x7f, 0xc1, 0xfb,
+	0xbe, 0x01, 0x63, 0x01, 0xed, 0x17, 0x76, 0x5e, 0x14, 0xac, 0xb0, 0x4f, 0xe1, 0xfb, 0x5b, 0x7d,
+	0x17, 0xd1, 0xe2, 0x37, 0xb7, 0x4f, 0xf1, 0xcb, 0x7a, 0x8b, 0xdf, 0x0c, 0xc5, 0x49, 0xbc, 0xb9,
+	0x4c, 0x57, 0xff, 0x9a, 0xef, 0xe5, 0x60, 0x22, 0x76, 0x3a, 0x7d, 0x4a, 0xc2, 0xe2, 0x40, 0x25,
+	0xa1, 0x76, 0xfd, 0xf3, 0x03, 0x95, 0x2d, 0x85, 0x81, 0xca, 0x16, 0x0b, 0xca, 0x7c, 0x31, 0x7e,
+	0x4d, 0x39, 0xf4, 0xf9, 0x46, 0xa7, 0x3c, 0x8c, 0xac, 0x86, 0xe2, 0xb0, 0x2e, 0xbb, 0x7a, 0xe9,
+	0x83, 0x4f, 0xe6, 0x0f, 0x7d, 0xf8, 0xc9, 0xfc, 0xa1, 0x8f, 0x3e, 0x99, 0x3f, 0xf4, 0xdd, 0xbd,
+	0x79, 0xe3, 0x83, 0xbd, 0x79, 0xe3, 0xc3, 0xbd, 0x79, 0xe3, 0xa3, 0xbd, 0x79, 0xe3, 0xe3, 0xbd,
+	0x79, 0xe3, 0xc7, 0xff, 0x9c, 0x3f, 0x74, 0xed, 0xbe, 0x34, 0xbf, 0xc7, 0xfd, 0x6f, 0x00, 0x00,
+	0x00, 0xff, 0xff, 0x54, 0x96, 0x8c, 0x0d, 0xb6, 0x3b, 0x00, 0x00,
 }
 
 func (m *AnalysisRunArgument) Marshal() (dAtA []byte, err error) {
@@ -3940,18 +3940,16 @@ func (m *Promotion) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	}
 	i--
 	dAtA[i] = 0x1a
-	if m.Spec != nil {
-		{
-			size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i])
-			if err != nil {
-				return 0, err
-			}
-			i -= size
-			i = encodeVarintGenerated(dAtA, i, uint64(size))
+	{
+		size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i])
+		if err != nil {
+			return 0, err
 		}
-		i--
-		dAtA[i] = 0x12
+		i -= size
+		i = encodeVarintGenerated(dAtA, i, uint64(size))
 	}
+	i--
+	dAtA[i] = 0x12
 	{
 		size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i])
 		if err != nil {
@@ -4380,18 +4378,16 @@ func (m *Stage) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	}
 	i--
 	dAtA[i] = 0x1a
-	if m.Spec != nil {
-		{
-			size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i])
-			if err != nil {
-				return 0, err
-			}
-			i -= size
-			i = encodeVarintGenerated(dAtA, i, uint64(size))
+	{
+		size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i])
+		if err != nil {
+			return 0, err
 		}
-		i--
-		dAtA[i] = 0x12
+		i -= size
+		i = encodeVarintGenerated(dAtA, i, uint64(size))
 	}
+	i--
+	dAtA[i] = 0x12
 	{
 		size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i])
 		if err != nil {
@@ -4501,18 +4497,16 @@ func (m *StageSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 		i--
 		dAtA[i] = 0x12
 	}
-	if m.Subscriptions != nil {
-		{
-			size, err := m.Subscriptions.MarshalToSizedBuffer(dAtA[:i])
-			if err != nil {
-				return 0, err
-			}
-			i -= size
-			i = encodeVarintGenerated(dAtA, i, uint64(size))
+	{
+		size, err := m.Subscriptions.MarshalToSizedBuffer(dAtA[:i])
+		if err != nil {
+			return 0, err
 		}
-		i--
-		dAtA[i] = 0xa
+		i -= size
+		i = encodeVarintGenerated(dAtA, i, uint64(size))
 	}
+	i--
+	dAtA[i] = 0xa
 	return len(dAtA) - i, nil
 }
 
@@ -4884,18 +4878,16 @@ func (m *Warehouse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	}
 	i--
 	dAtA[i] = 0x1a
-	if m.Spec != nil {
-		{
-			size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i])
-			if err != nil {
-				return 0, err
-			}
-			i -= size
-			i = encodeVarintGenerated(dAtA, i, uint64(size))
+	{
+		size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i])
+		if err != nil {
+			return 0, err
 		}
-		i--
-		dAtA[i] = 0x12
+		i -= size
+		i = encodeVarintGenerated(dAtA, i, uint64(size))
 	}
+	i--
+	dAtA[i] = 0x12
 	{
 		size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i])
 		if err != nil {
@@ -5785,10 +5777,8 @@ func (m *Promotion) Size() (n int) {
 	_ = l
 	l = m.ObjectMeta.Size()
 	n += 1 + l + sovGenerated(uint64(l))
-	if m.Spec != nil {
-		l = m.Spec.Size()
-		n += 1 + l + sovGenerated(uint64(l))
-	}
+	l = m.Spec.Size()
+	n += 1 + l + sovGenerated(uint64(l))
 	l = m.Status.Size()
 	n += 1 + l + sovGenerated(uint64(l))
 	return n
@@ -5943,10 +5933,8 @@ func (m *Stage) Size() (n int) {
 	_ = l
 	l = m.ObjectMeta.Size()
 	n += 1 + l + sovGenerated(uint64(l))
-	if m.Spec != nil {
-		l = m.Spec.Size()
-		n += 1 + l + sovGenerated(uint64(l))
-	}
+	l = m.Spec.Size()
+	n += 1 + l + sovGenerated(uint64(l))
 	l = m.Status.Size()
 	n += 1 + l + sovGenerated(uint64(l))
 	return n
@@ -5975,10 +5963,8 @@ func (m *StageSpec) Size() (n int) {
 	}
 	var l int
 	_ = l
-	if m.Subscriptions != nil {
-		l = m.Subscriptions.Size()
-		n += 1 + l + sovGenerated(uint64(l))
-	}
+	l = m.Subscriptions.Size()
+	n += 1 + l + sovGenerated(uint64(l))
 	if m.PromotionMechanisms != nil {
 		l = m.PromotionMechanisms.Size()
 		n += 1 + l + sovGenerated(uint64(l))
@@ -6129,10 +6115,8 @@ func (m *Warehouse) Size() (n int) {
 	_ = l
 	l = m.ObjectMeta.Size()
 	n += 1 + l + sovGenerated(uint64(l))
-	if m.Spec != nil {
-		l = m.Spec.Size()
-		n += 1 + l + sovGenerated(uint64(l))
-	}
+	l = m.Spec.Size()
+	n += 1 + l + sovGenerated(uint64(l))
 	l = m.Status.Size()
 	n += 1 + l + sovGenerated(uint64(l))
 	return n
@@ -6802,7 +6786,7 @@ func (this *Promotion) String() string {
 	}
 	s := strings.Join([]string{`&Promotion{`,
 		`ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`,
-		`Spec:` + strings.Replace(this.Spec.String(), "PromotionSpec", "PromotionSpec", 1) + `,`,
+		`Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "PromotionSpec", "PromotionSpec", 1), `&`, ``, 1) + `,`,
 		`Status:` + strings.Replace(strings.Replace(this.Status.String(), "PromotionStatus", "PromotionStatus", 1), `&`, ``, 1) + `,`,
 		`}`,
 	}, "")
@@ -6931,7 +6915,7 @@ func (this *Stage) String() string {
 	}
 	s := strings.Join([]string{`&Stage{`,
 		`ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`,
-		`Spec:` + strings.Replace(this.Spec.String(), "StageSpec", "StageSpec", 1) + `,`,
+		`Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "StageSpec", "StageSpec", 1), `&`, ``, 1) + `,`,
 		`Status:` + strings.Replace(strings.Replace(this.Status.String(), "StageStatus", "StageStatus", 1), `&`, ``, 1) + `,`,
 		`}`,
 	}, "")
@@ -6958,7 +6942,7 @@ func (this *StageSpec) String() string {
 		return "nil"
 	}
 	s := strings.Join([]string{`&StageSpec{`,
-		`Subscriptions:` + strings.Replace(this.Subscriptions.String(), "Subscriptions", "Subscriptions", 1) + `,`,
+		`Subscriptions:` + strings.Replace(strings.Replace(this.Subscriptions.String(), "Subscriptions", "Subscriptions", 1), `&`, ``, 1) + `,`,
 		`PromotionMechanisms:` + strings.Replace(this.PromotionMechanisms.String(), "PromotionMechanisms", "PromotionMechanisms", 1) + `,`,
 		`Verification:` + strings.Replace(this.Verification.String(), "Verification", "Verification", 1) + `,`,
 		`Shard:` + fmt.Sprintf("%v", this.Shard) + `,`,
@@ -7068,7 +7052,7 @@ func (this *Warehouse) String() string {
 	}
 	s := strings.Join([]string{`&Warehouse{`,
 		`ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`,
-		`Spec:` + strings.Replace(this.Spec.String(), "WarehouseSpec", "WarehouseSpec", 1) + `,`,
+		`Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "WarehouseSpec", "WarehouseSpec", 1), `&`, ``, 1) + `,`,
 		`Status:` + strings.Replace(strings.Replace(this.Status.String(), "WarehouseStatus", "WarehouseStatus", 1), `&`, ``, 1) + `,`,
 		`}`,
 	}, "")
@@ -13352,9 +13336,6 @@ func (m *Promotion) Unmarshal(dAtA []byte) error {
 			if postIndex > l {
 				return io.ErrUnexpectedEOF
 			}
-			if m.Spec == nil {
-				m.Spec = &PromotionSpec{}
-			}
 			if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
 				return err
 			}
@@ -14659,9 +14640,6 @@ func (m *Stage) Unmarshal(dAtA []byte) error {
 			if postIndex > l {
 				return io.ErrUnexpectedEOF
 			}
-			if m.Spec == nil {
-				m.Spec = &StageSpec{}
-			}
 			if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
 				return err
 			}
@@ -14895,9 +14873,6 @@ func (m *StageSpec) Unmarshal(dAtA []byte) error {
 			if postIndex > l {
 				return io.ErrUnexpectedEOF
 			}
-			if m.Subscriptions == nil {
-				m.Subscriptions = &Subscriptions{}
-			}
 			if err := m.Subscriptions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
 				return err
 			}
@@ -16149,9 +16124,6 @@ func (m *Warehouse) Unmarshal(dAtA []byte) error {
 			if postIndex > l {
 				return io.ErrUnexpectedEOF
 			}
-			if m.Spec == nil {
-				m.Spec = &WarehouseSpec{}
-			}
 			if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
 				return err
 			}
diff --git a/api/v1alpha1/generated.proto b/api/v1alpha1/generated.proto
index f6803b78..df550fcf 100644
--- a/api/v1alpha1/generated.proto
+++ b/api/v1alpha1/generated.proto
@@ -1057,7 +1057,7 @@ message Verification {
   // downstream.
   repeated AnalysisTemplateReference analysisTemplates = 1;
 
-  // AnalysisRunMetadata is contains optional metadata that should be applied to
+  // AnalysisRunMetadata contains optional metadata that should be applied to
   // all AnalysisRuns.
   optional AnalysisRunMetadata analysisRunMetadata = 2;
 
diff --git a/api/v1alpha1/project_types.go b/api/v1alpha1/project_types.go
index 2974d673..a9f4d5ac 100644
--- a/api/v1alpha1/project_types.go
+++ b/api/v1alpha1/project_types.go
@@ -27,11 +27,11 @@ func (p *ProjectPhase) IsTerminal() bool {
 	}
 }
 
-//+kubebuilder:object:root=true
-//+kubebuilder:resource:scope=Cluster
-//+kubebuilder:subresource:status
-//+kubebuilder:printcolumn:name=Phase,type=string,JSONPath=`.status.phase`
-//+kubebuilder:printcolumn:name=Age,type=date,JSONPath=`.metadata.creationTimestamp`
+// +kubebuilder:object:root=true
+// +kubebuilder:resource:scope=Cluster
+// +kubebuilder:subresource:status
+// +kubebuilder:printcolumn:name=Phase,type=string,JSONPath=`.status.phase`
+// +kubebuilder:printcolumn:name=Age,type=date,JSONPath=`.metadata.creationTimestamp`
 
 // Project is a resource type that reconciles to a specially labeled namespace
 // and other TODO: TBD project-level resources.
@@ -58,8 +58,8 @@ type ProjectSpec struct {
 // PromotionPolicy defines policies governing the promotion of Freight to a
 // specific Stage.
 type PromotionPolicy struct {
-	//+kubebuilder:validation:MinLength=1
-	//+kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
 	Stage string `json:"stage" protobuf:"bytes,1,opt,name=stage"`
 	// AutoPromotionEnabled indicates whether new Freight can automatically be
 	// promoted into the Stage referenced by the Stage field. Note: There are may
@@ -81,7 +81,7 @@ type ProjectStatus struct {
 	Message string `json:"message,omitempty" protobuf:"bytes,2,opt,name=message"`
 }
 
-//+kubebuilder:object:root=true
+// +kubebuilder:object:root=true
 
 // ProjectList is a list of Project resources.
 type ProjectList struct {
diff --git a/api/v1alpha1/promotion_types.go b/api/v1alpha1/promotion_types.go
index 144848f4..995dea71 100644
--- a/api/v1alpha1/promotion_types.go
+++ b/api/v1alpha1/promotion_types.go
@@ -38,14 +38,14 @@ func (p *PromotionPhase) IsTerminal() bool {
 	}
 }
 
-//+kubebuilder:resource:shortName={promo,promos}
-//+kubebuilder:object:root=true
-//+kubebuilder:subresource:status
-//+kubebuilder:printcolumn:name=Shard,type=string,JSONPath=`.metadata.labels.kargo\.akuity\.io/shard`
-//+kubebuilder:printcolumn:name=Stage,type=string,JSONPath=`.spec.stage`
-//+kubebuilder:printcolumn:name=Freight,type=string,JSONPath=`.spec.freight`
-//+kubebuilder:printcolumn:name=Phase,type=string,JSONPath=`.status.phase`
-//+kubebuilder:printcolumn:name=Age,type=date,JSONPath=`.metadata.creationTimestamp`
+// +kubebuilder:resource:shortName={promo,promos}
+// +kubebuilder:object:root=true
+// +kubebuilder:subresource:status
+// +kubebuilder:printcolumn:name=Shard,type=string,JSONPath=`.metadata.labels.kargo\.akuity\.io/shard`
+// +kubebuilder:printcolumn:name=Stage,type=string,JSONPath=`.spec.stage`
+// +kubebuilder:printcolumn:name=Freight,type=string,JSONPath=`.spec.freight`
+// +kubebuilder:printcolumn:name=Phase,type=string,JSONPath=`.status.phase`
+// +kubebuilder:printcolumn:name=Age,type=date,JSONPath=`.metadata.creationTimestamp`
 
 // Promotion represents a request to transition a particular Stage into a
 // particular Freight.
@@ -55,8 +55,8 @@ type Promotion struct {
 	// Spec describes the desired transition of a specific Stage into a specific
 	// Freight.
 	//
-	//+kubebuilder:validation:Required
-	Spec *PromotionSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"`
+	// +kubebuilder:validation:Required
+	Spec PromotionSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"`
 	// Status describes the current state of the transition represented by this
 	// Promotion.
 	Status PromotionStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
@@ -73,13 +73,13 @@ type PromotionSpec struct {
 	// applies. The Stage referenced by this field MUST be in the same
 	// namespace as the Promotion.
 	//
-	//+kubebuilder:validation:MinLength=1
-	//+kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
 	Stage string `json:"stage" protobuf:"bytes,1,opt,name=stage"`
 	// Freight specifies the piece of Freight to be promoted into the Stage
 	// referenced by the Stage field.
 	//
-	//+kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:MinLength=1
 	Freight string `json:"freight" protobuf:"bytes,2,opt,name=freight"`
 }
 
@@ -110,7 +110,7 @@ func (p *PromotionStatus) WithPhase(phase PromotionPhase) *PromotionStatus {
 	return status
 }
 
-//+kubebuilder:object:root=true
+// +kubebuilder:object:root=true
 
 // PromotionList contains a list of Promotion
 type PromotionList struct {
diff --git a/api/v1alpha1/stage_types.go b/api/v1alpha1/stage_types.go
index 20f519d5..4267cddd 100644
--- a/api/v1alpha1/stage_types.go
+++ b/api/v1alpha1/stage_types.go
@@ -27,7 +27,7 @@ type VerificationPhase string
 
 const (
 	// VerificationPhasePending denotes a verification process that has not yet
-	// started yet.
+	// started.
 	VerificationPhasePending VerificationPhase = "Pending"
 	// VerificationPhaseRunning denotes a verification that is currently running.
 	VerificationPhaseRunning VerificationPhase = "Running"
@@ -112,13 +112,13 @@ const (
 	ArgoCDAppSyncStateOutOfSync ArgoCDAppSyncState = "OutOfSync"
 )
 
-//+kubebuilder:object:root=true
-//+kubebuilder:subresource:status
-//+kubebuilder:printcolumn:name=Shard,type=string,JSONPath=`.spec.shard`
-//+kubebuilder:printcolumn:name=Current Freight,type=string,JSONPath=`.status.currentFreight.name`
-//+kubebuilder:printcolumn:name=Health,type=string,JSONPath=`.status.health.status`
-//+kubebuilder:printcolumn:name=Phase,type=string,JSONPath=`.status.phase`
-//+kubebuilder:printcolumn:name=Age,type=date,JSONPath=`.metadata.creationTimestamp`
+// +kubebuilder:object:root=true
+// +kubebuilder:subresource:status
+// +kubebuilder:printcolumn:name=Shard,type=string,JSONPath=`.spec.shard`
+// +kubebuilder:printcolumn:name=Current Freight,type=string,JSONPath=`.status.currentFreight.name`
+// +kubebuilder:printcolumn:name=Health,type=string,JSONPath=`.status.health.status`
+// +kubebuilder:printcolumn:name=Phase,type=string,JSONPath=`.status.phase`
+// +kubebuilder:printcolumn:name=Age,type=date,JSONPath=`.metadata.creationTimestamp`
 
 // Stage is the Kargo API's main type.
 type Stage struct {
@@ -127,8 +127,8 @@ type Stage struct {
 	// Spec describes sources of Freight used by the Stage and how to incorporate
 	// Freight into the Stage.
 	//
-	//+kubebuilder:validation:Required
-	Spec *StageSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"`
+	// +kubebuilder:validation:Required
+	Spec StageSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"`
 	// Status describes the Stage's current and recent Freight, health, and more.
 	Status StageStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
 }
@@ -149,8 +149,8 @@ type StageSpec struct {
 	// Subscriptions describes the Stage's sources of Freight. This is a required
 	// field.
 	//
-	//+kubebuilder:validation:Required
-	Subscriptions *Subscriptions `json:"subscriptions" protobuf:"bytes,1,opt,name=subscriptions"`
+	// +kubebuilder:validation:Required
+	Subscriptions Subscriptions `json:"subscriptions" protobuf:"bytes,1,opt,name=subscriptions"`
 	// PromotionMechanisms describes how to incorporate Freight into the Stage.
 	// This is an optional field as it is sometimes useful to aggregates available
 	// Freight from multiple upstream Stages without performing any actions. The
@@ -177,8 +177,8 @@ type Subscriptions struct {
 type StageSubscription struct {
 	// Name specifies the name of a Stage.
 	//
-	//+kubebuilder:validation:MinLength=1
-	//+kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
 	Name string `json:"name" protobuf:"bytes,1,opt,name=name"`
 }
 
@@ -202,8 +202,8 @@ type PromotionMechanisms struct {
 type GitRepoUpdate struct {
 	// RepoURL is the URL of the repository to update. This is a required field.
 	//
-	//+kubebuilder:validation:MinLength=1
-	//+kubebuilder:validation:Pattern=`^https?://(\w+([\.-]\w+)*@)?\w+([\.-]\w+)*(:[\d]+)?(/.*)?$`
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:Pattern=`^https?://(\w+([\.-]\w+)*@)?\w+([\.-]\w+)*(:[\d]+)?(/.*)?$`
 	RepoURL string `json:"repoURL" protobuf:"bytes,1,opt,name=repoURL"`
 	// InsecureSkipTLSVerify specifies whether certificate verification errors
 	// should be ignored when connecting to the repository. This should be enabled
@@ -218,14 +218,14 @@ type GitRepoUpdate struct {
 	// what branch of a repository can be treated as a source of manifests or
 	// other configuration when a Stage has no subscription to that repository.
 	//
-	//+kubebuilder:validation:Optional
-	//+kubebuilder:validation:Pattern=`^(\w+([-/]\w+)*)?$`
+	// +kubebuilder:validation:Optional
+	// +kubebuilder:validation:Pattern=`^(\w+([-/]\w+)*)?$`
 	ReadBranch string `json:"readBranch,omitempty" protobuf:"bytes,3,opt,name=readBranch"`
 	// WriteBranch specifies the particular branch of the repository to be
 	// updated. This is a required field.
 	//
-	//+kubebuilder:validation:MinLength=1
-	//+kubebuilder:validation:Pattern=`^\w+([-/]\w+)*$`
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:Pattern=`^\w+([-/]\w+)*$`
 	WriteBranch string `json:"writeBranch" protobuf:"bytes,4,opt,name=writeBranch"`
 	// PullRequest will generate a pull request instead of making the commit directly
 	PullRequest *PullRequestPromotionMechanism `json:"pullRequest,omitempty" protobuf:"bytes,5,opt,name=pullRequest"`
@@ -263,7 +263,7 @@ type KargoRenderPromotionMechanism struct {
 	// will be passed to Kargo Render in the form <image name>:<tag>. (e.g. Will
 	// not use digests by default.)
 	//
-	//+kubebuilder:validation:Optional
+	// +kubebuilder:validation:Optional
 	Images []KargoRenderImageUpdate `json:"images,omitempty" protobuf:"bytes,1,rep,name=images"`
 }
 
@@ -272,12 +272,12 @@ type KargoRenderPromotionMechanism struct {
 type KargoRenderImageUpdate struct {
 	// Image specifies a container image (without tag). This is a required field.
 	//
-	//+kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:MinLength=1
 	Image string `json:"image" protobuf:"bytes,1,opt,name=image"`
 	// UseDigest specifies whether the image's digest should be used instead of
 	// its tag.
 	//
-	//+kubebuilder:validation:Optional
+	// +kubebuilder:validation:Optional
 	UseDigest bool `json:"useDigest" protobuf:"varint,2,opt,name=useDigest"`
 }
 
@@ -287,7 +287,7 @@ type KustomizePromotionMechanism struct {
 	// Images describes images for which `kustomize edit set image` should be
 	// executed and the paths in which those commands should be executed.
 	//
-	//+kubebuilder:validation:MinItems=1
+	// +kubebuilder:validation:MinItems=1
 	Images []KustomizeImageUpdate `json:"images" protobuf:"bytes,1,rep,name=images"`
 }
 
@@ -296,18 +296,18 @@ type KustomizePromotionMechanism struct {
 type KustomizeImageUpdate struct {
 	// Image specifies a container image (without tag). This is a required field.
 	//
-	//+kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:MinLength=1
 	Image string `json:"image" protobuf:"bytes,1,opt,name=image"`
 	// Path specifies a path in which the `kustomize edit set image` command
 	// should be executed. This is a required field.
 	//
-	//+kubebuilder:validation:MinLength=1
-	//+kubebuilder:validation:Pattern=^[\w-\.]+(/[\w-\.]+)*$
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:Pattern=^[\w-\.]+(/[\w-\.]+)*$
 	Path string `json:"path" protobuf:"bytes,2,opt,name=path"`
 	// UseDigest specifies whether the image's digest should be used instead of
 	// its tag.
 	//
-	//+kubebuilder:validation:Optional
+	// +kubebuilder:validation:Optional
 	UseDigest bool `json:"useDigest" protobuf:"varint,3,opt,name=useDigest"`
 }
 
@@ -327,19 +327,19 @@ type HelmPromotionMechanism struct {
 type HelmImageUpdate struct {
 	// Image specifies a container image (without tag). This is a required field.
 	//
-	//+kubebuilder:validation:MinLength=1
-	//+kubebuilder:validation:Pattern=`^(\w+([\.-]\w+)*(:[\d]+)?/)?(\w+([\.-]\w+)*)(/\w+([\.-]\w+)*)*$`
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:Pattern=`^(\w+([\.-]\w+)*(:[\d]+)?/)?(\w+([\.-]\w+)*)(/\w+([\.-]\w+)*)*$`
 	Image string `json:"image" protobuf:"bytes,1,opt,name=image"`
 	// ValuesFilePath specifies a path to the Helm values file that is to be
 	// updated. This is a required field.
 	//
-	//+kubebuilder:validation:MinLength=1
-	//+kubebuilder:validation:Pattern=^[\w-\.]+(/[\w-\.]+)*$
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:Pattern=^[\w-\.]+(/[\w-\.]+)*$
 	ValuesFilePath string `json:"valuesFilePath" protobuf:"bytes,2,opt,name=valuesFilePath"`
 	// Key specifies a key within the Helm values file that is to be updated. This
 	// is a required field.
 	//
-	//+kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:MinLength=1
 	Key string `json:"key" protobuf:"bytes,3,opt,name=key"`
 	// Value specifies the new value for the specified key in the specified Helm
 	// values file. Valid values are:
@@ -365,8 +365,8 @@ type HelmChartDependencyUpdate struct {
 	// match the values of these two fields to your Warehouse; match them to the
 	// Chart.yaml. This is a required field.
 	//
-	//+kubebuilder:validation:MinLength=1
-	//+kubebuilder:validation:Pattern=`^(((https?)|(oci))://)([\w\d\.\-]+)(:[\d]+)?(/.*)*$`
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:Pattern=`^(((https?)|(oci))://)([\w\d\.\-]+)(:[\d]+)?(/.*)*$`
 	Repository string `json:"repository" protobuf:"bytes,1,opt,name=repository"`
 	// Name along with Repository identifies a subchart of the umbrella chart at
 	// ChartPath whose version should be updated. The values of both fields should
@@ -375,12 +375,12 @@ type HelmChartDependencyUpdate struct {
 	// match the values of these two fields to your Warehouse; match them to the
 	// Chart.yaml. This is a required field.
 	//
-	//+kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:MinLength=1
 	Name string `json:"name" protobuf:"bytes,2,opt,name=name"`
 	// ChartPath is the path to an umbrella chart.
 	//
-	//+kubebuilder:validation:MinLength=1
-	//+kubebuilder:validation:Pattern=^[\w-\.]+(/[\w-\.]+)*$
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:Pattern=^[\w-\.]+(/[\w-\.]+)*$
 	ChartPath string `json:"chartPath" protobuf:"bytes,3,opt,name=chartPath"`
 }
 
@@ -390,15 +390,15 @@ type ArgoCDAppUpdate struct {
 	// AppName specifies the name of an Argo CD Application resource to be
 	// updated.
 	//
-	//+kubebuilder:validation:MinLength=1
-	//+kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
 	AppName string `json:"appName" protobuf:"bytes,1,opt,name=appName"`
 	// AppNamespace specifies the namespace of an Argo CD Application resource to
 	// be updated. If left unspecified, the namespace of this Application resource
 	// will use the value of ARGOCD_NAMESPACE or "argocd"
 	//
-	//+kubebuilder:validation:Optional
-	//+kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
+	// +kubebuilder:validation:Optional
+	// +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$
 	AppNamespace string `json:"appNamespace,omitempty" protobuf:"bytes,2,opt,name=appNamespace"`
 	// SourceUpdates describes updates to be applied to various sources of the
 	// specified Argo CD Application resource.
@@ -417,7 +417,7 @@ type ArgoCDSourceUpdate struct {
 	// Warehouse; match them to the Application source you wish to update. This is
 	// a required field.
 	//
-	//+kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:MinLength=1
 	RepoURL string `json:"repoURL" protobuf:"bytes,1,opt,name=repoURL"`
 	// Chart along with the RepoURL field identifies which of an Argo CD
 	// Application's sources this update is intended for. Note: As of Argo CD 2.6,
@@ -427,7 +427,7 @@ type ArgoCDSourceUpdate struct {
 	// the source. i.e. Do not match the values of these two fields to your
 	// Warehouse; match them to the Application source you wish to update.
 	//
-	//+kubebuilder:validation:Optional
+	// +kubebuilder:validation:Optional
 	Chart string `json:"chart,omitempty" protobuf:"bytes,2,opt,name=chart"`
 	// UpdateTargetRevision is a bool indicating whether the source should be
 	// updated such that its TargetRevision field points at the most recently git
@@ -447,7 +447,7 @@ type ArgoCDKustomize struct {
 	// Images describes how specific image versions can be incorporated into an
 	// Argo CD Application's Kustomize parameters.
 	//
-	//+kubebuilder:validation:MinItems=1
+	// +kubebuilder:validation:MinItems=1
 	Images []ArgoCDKustomizeImageUpdate `json:"images" protobuf:"bytes,1,rep,name=images"`
 }
 
@@ -457,7 +457,7 @@ type ArgoCDHelm struct {
 	// Images describes how specific image versions can be incorporated into an
 	// Argo CD Application's Helm parameters.
 	//
-	//+kubebuilder:validation:MinItems=1
+	// +kubebuilder:validation:MinItems=1
 	Images []ArgoCDHelmImageUpdate `json:"images" protobuf:"bytes,1,rep,name=images"`
 }
 
@@ -466,12 +466,12 @@ type ArgoCDHelm struct {
 type ArgoCDKustomizeImageUpdate struct {
 	// Image specifies a container image (without tag). This is a required field.
 	//
-	//+kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:MinLength=1
 	Image string `json:"image" protobuf:"bytes,1,opt,name=image"`
 	// UseDigest specifies whether the image's digest should be used instead of
 	// its tag.
 	//
-	//+kubebuilder:validation:Optional
+	// +kubebuilder:validation:Optional
 	UseDigest bool `json:"useDigest" protobuf:"varint,2,opt,name=useDigest"`
 }
 
@@ -480,12 +480,12 @@ type ArgoCDKustomizeImageUpdate struct {
 type ArgoCDHelmImageUpdate struct {
 	// Image specifies a container image (without tag). This is a required field.
 	//
-	//+kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:MinLength=1
 	Image string `json:"image" protobuf:"bytes,1,opt,name=image"`
 	// Key specifies a key within an Argo CD Application's Helm parameters that is
 	// to be updated. This is a required field.
 	//
-	//+kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:MinLength=1
 	Key string `json:"key" protobuf:"bytes,2,opt,name=key"`
 	// Value specifies the new value for the specified key in the Argo CD
 	// Application's Helm parameters. Valid values are:
@@ -666,7 +666,7 @@ type ArgoCDAppSyncStatus struct {
 	Revisions []string           `json:"revisions,omitempty" protobuf:"bytes,3,rep,name=revisions"`
 }
 
-//+kubebuilder:object:root=true
+// +kubebuilder:object:root=true
 
 // StageList is a list of Stage resources.
 type StageList struct {
@@ -691,7 +691,7 @@ type Verification struct {
 	// should be created to verify a Stage's current Freight is fit to be promoted
 	// downstream.
 	AnalysisTemplates []AnalysisTemplateReference `json:"analysisTemplates,omitempty" protobuf:"bytes,1,rep,name=analysisTemplates"`
-	// AnalysisRunMetadata is contains optional metadata that should be applied to
+	// AnalysisRunMetadata contains optional metadata that should be applied to
 	// all AnalysisRuns.
 	AnalysisRunMetadata *AnalysisRunMetadata `json:"analysisRunMetadata,omitempty" protobuf:"bytes,2,opt,name=analysisRunMetadata"`
 	// Args lists arguments that should be added to all AnalysisRuns.
@@ -703,7 +703,7 @@ type AnalysisTemplateReference struct {
 	// Name is the name of the AnalysisTemplate in the same project/namespace as
 	// the Stage.
 	//
-	//+kubebuilder:validation:Required
+	// +kubebuilder:validation:Required
 	Name string `json:"name" protobuf:"bytes,1,opt,name=name"`
 }
 
@@ -720,11 +720,11 @@ type AnalysisRunMetadata struct {
 type AnalysisRunArgument struct {
 	// Name is the name of the argument.
 	//
-	//+kubebuilder:validation:Required
+	// +kubebuilder:validation:Required
 	Name string `json:"name" protobuf:"bytes,1,opt,name=name"`
 	// Value is the value of the argument.
 	//
-	//+kubebuilder:validation:Required
+	// +kubebuilder:validation:Required
 	Value string `json:"value,omitempty" protobuf:"bytes,2,opt,name=value"`
 }
 
diff --git a/api/v1alpha1/warehouse_types.go b/api/v1alpha1/warehouse_types.go
index c9ee70ec..3d817640 100644
--- a/api/v1alpha1/warehouse_types.go
+++ b/api/v1alpha1/warehouse_types.go
@@ -22,10 +22,10 @@ const (
 	ImageSelectionStrategySemVer      ImageSelectionStrategy = "SemVer"
 )
 
-//+kubebuilder:object:root=true
-//+kubebuilder:subresource:status
-//+kubebuilder:printcolumn:name=Shard,type=string,JSONPath=`.spec.shard`
-//+kubebuilder:printcolumn:name=Age,type=date,JSONPath=`.metadata.creationTimestamp`
+// +kubebuilder:object:root=true
+// +kubebuilder:subresource:status
+// +kubebuilder:printcolumn:name=Shard,type=string,JSONPath=`.spec.shard`
+// +kubebuilder:printcolumn:name=Age,type=date,JSONPath=`.metadata.creationTimestamp`
 
 // Warehouse is a source of Freight.
 type Warehouse struct {
@@ -33,8 +33,8 @@ type Warehouse struct {
 	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
 	// Spec describes sources of artifacts.
 	//
-	//+kubebuilder:validation:Required
-	Spec *WarehouseSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"`
+	// +kubebuilder:validation:Required
+	Spec WarehouseSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"`
 	// Status describes the Warehouse's most recently observed state.
 	Status WarehouseStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
 }
@@ -58,7 +58,7 @@ type WarehouseSpec struct {
 	// Subscriptions describes sources of artifacts to be included in Freight
 	// produced by this Warehouse.
 	//
-	//+kubebuilder:validation:MinItems=1
+	// +kubebuilder:validation:MinItems=1
 	Subscriptions []RepoSubscription `json:"subscriptions" protobuf:"bytes,1,rep,name=subscriptions"`
 }
 
@@ -77,8 +77,8 @@ type RepoSubscription struct {
 type GitSubscription struct {
 	// URL is the repository's URL. This is a required field.
 	//
-	//+kubebuilder:validation:MinLength=1
-	//+kubebuilder:validation:Pattern=`^https?://(\w+([\.-]\w+)*@)?\w+([\.-]\w+)*(:[\d]+)?(/.*)?$`
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:Pattern=`^https?://(\w+([\.-]\w+)*@)?\w+([\.-]\w+)*(:[\d]+)?(/.*)?$`
 	RepoURL string `json:"repoURL" protobuf:"bytes,1,opt,name=repoURL"`
 	// CommitSelectionStrategy specifies the rules for how to identify the newest
 	// commit of interest in the repository specified by the RepoURL field. This
@@ -94,8 +94,8 @@ type GitSubscription struct {
 	// CommitSelectionStrategy is NewestFromBranch or unspecified), the
 	// subscription is implicitly to the repository's default branch.
 	//
-	//+kubebuilder:validation:MinLength=1
-	//+kubebuilder:validation:Pattern=`^\w+([-/]\w+)*$`
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:Pattern=`^\w+([-/]\w+)*$`
 	Branch string `json:"branch,omitempty" protobuf:"bytes,3,opt,name=branch"`
 	// SemverConstraint specifies constraints on what new tagged commits are
 	// considered in determining the newest commit of interest. The value in this
@@ -105,14 +105,14 @@ type GitSubscription struct {
 	// should be taken with leaving this field unspecified, as it can lead to the
 	// unanticipated rollout of breaking changes.
 	//
-	//+kubebuilder:validation:Optional
+	// +kubebuilder:validation:Optional
 	SemverConstraint string `json:"semverConstraint,omitempty" protobuf:"bytes,4,opt,name=semverConstraint"`
 	// AllowTags is a regular expression that can optionally be used to limit the
 	// tags that are considered in determining the newest commit of interest. The
 	// value in this field only has any effect when the CommitSelectionStrategy is
 	// Lexical, NewestTag, or SemVer. This field is optional.
 	//
-	//+kubebuilder:validation:Optional
+	// +kubebuilder:validation:Optional
 	AllowTags string `json:"allowTags,omitempty" protobuf:"bytes,5,opt,name=allowTags"`
 	// IgnoreTags is a list of tags that must be ignored when determining the
 	// newest commit of interest. No regular expressions or glob patterns are
@@ -120,7 +120,7 @@ type GitSubscription struct {
 	// CommitSelectionStrategy is Lexical, NewestTag, or SemVer. This field is
 	// optional.
 	//
-	//+kubebuilder:validation:Optional
+	// +kubebuilder:validation:Optional
 	IgnoreTags []string `json:"ignoreTags,omitempty" protobuf:"bytes,6,rep,name=ignoreTags"`
 	// InsecureSkipTLSVerify specifies whether certificate verification errors
 	// should be ignored when connecting to the repository. This should be enabled
@@ -138,7 +138,7 @@ type GitSubscription struct {
 	// Paths selected by IncludePaths may be unselected by ExcludePaths. This
 	// is a useful method for including a broad set of paths and then excluding a
 	// subset of them.
-	//+kubebuilder:validation:Optional
+	// +kubebuilder:validation:Optional
 	IncludePaths []string `json:"includePaths,omitempty" protobuf:"bytes,8,rep,name=includePaths"`
 	// ExcludePaths is a list of selectors that designate paths in the repository
 	// that should NOT trigger the production of new Freight when changes are
@@ -153,7 +153,7 @@ type GitSubscription struct {
 	// Paths selected by IncludePaths may be unselected by ExcludePaths. This
 	// is a useful method for including a broad set of paths and then excluding a
 	// subset of them.
-	//+kubebuilder:validation:Optional
+	// +kubebuilder:validation:Optional
 	ExcludePaths []string `json:"excludePaths,omitempty" protobuf:"bytes,9,rep,name=excludePaths"`
 }
 
@@ -162,16 +162,16 @@ type ImageSubscription struct {
 	// RepoURL specifies the URL of the image repository to subscribe to. The
 	// value in this field MUST NOT include an image tag. This field is required.
 	//
-	//+kubebuilder:validation:MinLength=1
-	//+kubebuilder:validation:Pattern=`^(\w+([\.-]\w+)*(:[\d]+)?/)?(\w+([\.-]\w+)*)(/\w+([\.-]\w+)*)*$`
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:Pattern=`^(\w+([\.-]\w+)*(:[\d]+)?/)?(\w+([\.-]\w+)*)(/\w+([\.-]\w+)*)*$`
 	RepoURL string `json:"repoURL" protobuf:"bytes,1,opt,name=repoURL"`
 	// GitRepoURL optionally specifies the URL of a Git repository that contains
 	// the source code for the image repository referenced by the RepoURL field.
 	// When this is specified, Kargo MAY be able to infer and link to the exact
 	// revision of that source code that was used to build the image.
 	//
-	//+kubebuilder:validation:Optional
-	//+kubebuilder:validation:Pattern=`^https?://(\w+([\.-]\w+)*@)?\w+([\.-]\w+)*(:[\d]+)?(/.*)?$`
+	// +kubebuilder:validation:Optional
+	// +kubebuilder:validation:Pattern=`^https?://(\w+([\.-]\w+)*@)?\w+([\.-]\w+)*(:[\d]+)?(/.*)?$`
 	GitRepoURL string `json:"gitRepoURL,omitempty" protobuf:"bytes,2,opt,name=gitRepoURL"`
 	// ImageSelectionStrategy specifies the rules for how to identify the newest version
 	// of the image specified by the RepoURL field. This field is optional. When
@@ -191,19 +191,19 @@ type ImageSubscription struct {
 	// changes. Refer to Image Updater documentation for more details.
 	// More info: https://github.com/masterminds/semver#checking-version-constraints
 	//
-	//+kubebuilder:validation:Optional
+	// +kubebuilder:validation:Optional
 	SemverConstraint string `json:"semverConstraint,omitempty" protobuf:"bytes,4,opt,name=semverConstraint"`
 	// AllowTags is a regular expression that can optionally be used to limit the
 	// image tags that are considered in determining the newest version of an
 	// image. This field is optional.
 	//
-	//+kubebuilder:validation:Optional
+	// +kubebuilder:validation:Optional
 	AllowTags string `json:"allowTags,omitempty" protobuf:"bytes,5,opt,name=allowTags"`
 	// IgnoreTags is a list of tags that must be ignored when determining the
 	// newest version of an image. No regular expressions or glob patterns are
 	// supported yet. This field is optional.
 	//
-	//+kubebuilder:validation:Optional
+	// +kubebuilder:validation:Optional
 	IgnoreTags []string `json:"ignoreTags,omitempty" protobuf:"bytes,6,rep,name=ignoreTags"`
 	// Platform is a string of the form <os>/<arch> that limits the tags that can
 	// be considered when searching for new versions of an image. This field is
@@ -214,7 +214,7 @@ type ImageSubscription struct {
 	// OS/architecture than the Kargo controller. At present this is uncommon, but
 	// not unheard of.
 	//
-	//+kubebuilder:validation:Optional
+	// +kubebuilder:validation:Optional
 	Platform string `json:"platform,omitempty" protobuf:"bytes,7,opt,name=platform"`
 	// InsecureSkipTLSVerify specifies whether certificate verification errors
 	// should be ignored when connecting to the repository. This should be enabled
@@ -233,8 +233,8 @@ type ChartSubscription struct {
 	// a specific chart and the Name field MUST NOT be used. The RepoURL field is
 	// required.
 	//
-	//+kubebuilder:validation:MinLength=1
-	//+kubebuilder:validation:Pattern=`^(((https?)|(oci))://)([\w\d\.\-]+)(:[\d]+)?(/.*)*$`
+	// +kubebuilder:validation:MinLength=1
+	// +kubebuilder:validation:Pattern=`^(((https?)|(oci))://)([\w\d\.\-]+)(:[\d]+)?(/.*)*$`
 	RepoURL string `json:"repoURL" protobuf:"bytes,1,opt,name=repoURL"`
 	// Name specifies the name of a Helm chart to subscribe to within a classic
 	// chart repository specified by the RepoURL field. This field is required
@@ -248,7 +248,7 @@ type ChartSubscription struct {
 	// lead to the unanticipated rollout of breaking changes.
 	// More info: https://github.com/masterminds/semver#checking-version-constraints
 	//
-	//+kubebuilder:validation:Optional
+	// +kubebuilder:validation:Optional
 	SemverConstraint string `json:"semverConstraint,omitempty" protobuf:"bytes,3,opt,name=semverConstraint"`
 }
 
@@ -269,7 +269,7 @@ type WarehouseStatus struct {
 	LastFreight *FreightReference `json:"lastFreight,omitempty" protobuf:"bytes,5,opt,name=lastFreight"`
 }
 
-//+kubebuilder:object:root=true
+// +kubebuilder:object:root=true
 
 // WarehouseList is a list of Warehouse resources.
 type WarehouseList struct {
diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go
index 1b68c328..def7ff4d 100644
--- a/api/v1alpha1/zz_generated.deepcopy.go
+++ b/api/v1alpha1/zz_generated.deepcopy.go
@@ -861,11 +861,7 @@ func (in *Promotion) DeepCopyInto(out *Promotion) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	if in.Spec != nil {
-		in, out := &in.Spec, &out.Spec
-		*out = new(PromotionSpec)
-		**out = **in
-	}
+	out.Spec = in.Spec
 	in.Status.DeepCopyInto(&out.Status)
 }
 
@@ -1081,11 +1077,7 @@ func (in *Stage) DeepCopyInto(out *Stage) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	if in.Spec != nil {
-		in, out := &in.Spec, &out.Spec
-		*out = new(StageSpec)
-		(*in).DeepCopyInto(*out)
-	}
+	in.Spec.DeepCopyInto(&out.Spec)
 	in.Status.DeepCopyInto(&out.Status)
 }
 
@@ -1142,11 +1134,7 @@ func (in *StageList) DeepCopyObject() runtime.Object {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *StageSpec) DeepCopyInto(out *StageSpec) {
 	*out = *in
-	if in.Subscriptions != nil {
-		in, out := &in.Subscriptions, &out.Subscriptions
-		*out = new(Subscriptions)
-		(*in).DeepCopyInto(*out)
-	}
+	in.Subscriptions.DeepCopyInto(&out.Subscriptions)
 	if in.PromotionMechanisms != nil {
 		in, out := &in.PromotionMechanisms, &out.PromotionMechanisms
 		*out = new(PromotionMechanisms)
@@ -1345,11 +1333,7 @@ func (in *Warehouse) DeepCopyInto(out *Warehouse) {
 	*out = *in
 	out.TypeMeta = in.TypeMeta
 	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
-	if in.Spec != nil {
-		in, out := &in.Spec, &out.Spec
-		*out = new(WarehouseSpec)
-		(*in).DeepCopyInto(*out)
-	}
+	in.Spec.DeepCopyInto(&out.Spec)
 	in.Status.DeepCopyInto(&out.Status)
 }
 
diff --git a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml
index 2c3787d5..e37b5cb5 100644
--- a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml
+++ b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml
@@ -503,7 +503,7 @@ spec:
                 properties:
                   analysisRunMetadata:
                     description: |-
-                      AnalysisRunMetadata is contains optional metadata that should be applied to
+                      AnalysisRunMetadata contains optional metadata that should be applied to
                       all AnalysisRuns.
                     properties:
                       annotations:
diff --git a/internal/api/promote_to_stage_subscribers_v1alpha1.go b/internal/api/promote_to_stage_subscribers_v1alpha1.go
index 08ef153a..8f4dd668 100644
--- a/internal/api/promote_to_stage_subscribers_v1alpha1.go
+++ b/internal/api/promote_to_stage_subscribers_v1alpha1.go
@@ -168,9 +168,6 @@ func (s *server) findStageSubscribers(ctx context.Context, stage *kargoapi.Stage
 	var subscribers []kargoapi.Stage
 	for _, s := range allStages.Items {
 		s := s
-		if s.Spec.Subscriptions == nil {
-			continue
-		}
 		for _, upstream := range s.Spec.Subscriptions.UpstreamStages {
 			if upstream.Name != stage.Name {
 				continue
diff --git a/internal/api/query_freights_v1alpha1.go b/internal/api/query_freights_v1alpha1.go
index 439c2f60..899b414c 100644
--- a/internal/api/query_freights_v1alpha1.go
+++ b/internal/api/query_freights_v1alpha1.go
@@ -80,7 +80,7 @@ func (s *server) QueryFreight(
 			ctx,
 			project,
 			stageName,
-			*stage.Spec.Subscriptions,
+			stage.Spec.Subscriptions,
 		)
 		if err != nil {
 			return nil, fmt.Errorf("get available freight for stage: %w", err)
diff --git a/internal/controller/promotions/promoqueues.go b/internal/controller/promotions/promoqueues.go
index 1f066aa6..5592cee6 100644
--- a/internal/controller/promotions/promoqueues.go
+++ b/internal/controller/promotions/promoqueues.go
@@ -49,7 +49,7 @@ func (pqs *promoQueues) initializeQueues(ctx context.Context, promos kargoapi.Pr
 	logger := logging.LoggerFromContext(ctx)
 	for _, promo := range promos.Items {
 		promo := promo // This is to sidestep implicit memory aliasing in this for loop
-		if promo.Status.Phase.IsTerminal() || promo.Spec == nil {
+		if promo.Status.Phase.IsTerminal() || len(promo.Spec.Stage) == 0 {
 			continue
 		}
 		stage := types.NamespacedName{
@@ -86,11 +86,11 @@ func (pqs *promoQueues) initializeQueues(ctx context.Context, promos kargoapi.Pr
 	}
 }
 
-// tryBegin tries to mark the given Pending promotion as the active one so it can reconcile.
+// tryBegin tries to mark the given Pending promotion as the active one, so it can reconcile.
 // Returns true if the promo is already active or became active as a result of this call.
 // Returns false if it should not reconcile (another promo is active, or next in line).
 func (pqs *promoQueues) tryBegin(ctx context.Context, promo *kargoapi.Promotion) bool {
-	if promo == nil || promo.Spec == nil {
+	if promo == nil || len(promo.Spec.Stage) == 0 {
 		return false
 	}
 	stageKey := types.NamespacedName{
@@ -104,7 +104,7 @@ func (pqs *promoQueues) tryBegin(ctx context.Context, promo *kargoapi.Promotion)
 
 	pq, ok := pqs.pendingPromoQueuesByStage[stageKey]
 	if !ok {
-		// PriorityQueue for the stage has not been been initialized
+		// PriorityQueue for the stage has not been initialized
 		pq = newPriorityQueue()
 		pqs.pendingPromoQueuesByStage[stageKey] = pq
 	}
@@ -122,7 +122,7 @@ func (pqs *promoQueues) tryBegin(ctx context.Context, promo *kargoapi.Promotion)
 	}
 	if activePromoName == "" {
 		// If we get here, the Stage does not have any active Promotions Running against it.
-		// Now check if it this promo is the one that should run next.
+		// Now check if it is this promo is the one that should run next.
 		// NOTE: first will never be empty because of the push call above
 		first := pq.Peek()
 		if first.GetNamespace() == promo.Namespace && first.GetName() == promo.Name {
diff --git a/internal/controller/stages/stages.go b/internal/controller/stages/stages.go
index a63ab8ef..d97f6e2e 100644
--- a/internal/controller/stages/stages.go
+++ b/internal/controller/stages/stages.go
@@ -907,8 +907,7 @@ func (r *reconciler) syncNormalStage(
 	}
 
 	// Stop here if we have no chance of finding any Freight to promote.
-	if stage.Spec.Subscriptions == nil ||
-		(stage.Spec.Subscriptions.Warehouse == "" && len(stage.Spec.Subscriptions.UpstreamStages) == 0) {
+	if stage.Spec.Subscriptions.Warehouse == "" && len(stage.Spec.Subscriptions.UpstreamStages) == 0 {
 		logger.Warn(
 			"Stage has no subscriptions. This may indicate an issue with resource" +
 				"validation logic.",
diff --git a/internal/kargo/kargo.go b/internal/kargo/kargo.go
index 4824a061..69903855 100644
--- a/internal/kargo/kargo.go
+++ b/internal/kargo/kargo.go
@@ -54,7 +54,7 @@ func NewPromotion(
 			Namespace:   stage.Namespace,
 			Annotations: annotations,
 		},
-		Spec: &kargoapi.PromotionSpec{
+		Spec: kargoapi.PromotionSpec{
 			Stage:   stage.Name,
 			Freight: freight,
 		},
diff --git a/internal/kubeclient/indexer.go b/internal/kubeclient/indexer.go
index 53d26aee..8c21a962 100644
--- a/internal/kubeclient/indexer.go
+++ b/internal/kubeclient/indexer.go
@@ -219,8 +219,7 @@ func indexRunningPromotionsByArgoCDApplications(
 			return nil
 		}
 
-		if stage.Spec == nil || stage.Spec.PromotionMechanisms == nil ||
-			len(stage.Spec.PromotionMechanisms.ArgoCDAppUpdates) == 0 {
+		if stage.Spec.PromotionMechanisms == nil || len(stage.Spec.PromotionMechanisms.ArgoCDAppUpdates) == 0 {
 			// If the Stage has no Argo CD Application promotion mechanisms,
 			// then we have nothing to index.
 			return nil
diff --git a/internal/webhook/promotion/webhook.go b/internal/webhook/promotion/webhook.go
index 69b3c174..3f010ee3 100644
--- a/internal/webhook/promotion/webhook.go
+++ b/internal/webhook/promotion/webhook.go
@@ -245,7 +245,7 @@ func (w *webhook) ValidateUpdate(
 	}
 
 	// PromotionSpecs are meant to be immutable
-	if *promo.Spec != *(oldObj.(*kargoapi.Promotion).Spec) { // nolint: forcetypeassert
+	if promo.Spec != (oldObj.(*kargoapi.Promotion).Spec) { // nolint: forcetypeassert
 		return nil, apierrors.NewInvalid(
 			promotionGroupKind,
 			promo.Name,
diff --git a/internal/webhook/stage/webhook.go b/internal/webhook/stage/webhook.go
index adbbdfa1..fefedf7a 100644
--- a/internal/webhook/stage/webhook.go
+++ b/internal/webhook/stage/webhook.go
@@ -181,7 +181,7 @@ func (w *webhook) ValidateDelete(
 func (w *webhook) validateCreateOrUpdate(
 	s *kargoapi.Stage,
 ) (admission.Warnings, error) {
-	if errs := w.validateSpecFn(field.NewPath("spec"), s.Spec); len(errs) > 0 {
+	if errs := w.validateSpecFn(field.NewPath("spec"), &s.Spec); len(errs) > 0 {
 		return nil, apierrors.NewInvalid(stageGroupKind, s.Name, errs)
 	}
 	return nil, nil
@@ -194,12 +194,13 @@ func (w *webhook) validateSpec(
 	if spec == nil { // nil spec is caught by declarative validations
 		return nil
 	}
-	errs := w.validateSubs(f.Child("subscriptions"), spec.Subscriptions)
+	errs := w.validateSubs(f.Child("subscriptions"), &spec.Subscriptions)
 	return append(
 		errs,
 		w.validatePromotionMechanisms(
 			f.Child("promotionMechanisms"),
-			spec.PromotionMechanisms)...,
+			spec.PromotionMechanisms,
+		)...,
 	)
 }
 
diff --git a/internal/webhook/warehouse/webhook.go b/internal/webhook/warehouse/webhook.go
index 39a5e4ec..61263af3 100644
--- a/internal/webhook/warehouse/webhook.go
+++ b/internal/webhook/warehouse/webhook.go
@@ -115,7 +115,7 @@ func (w *webhook) validateCreateOrUpdate(
 	warehouse *kargoapi.Warehouse,
 ) (admission.Warnings, error) {
 	if errs :=
-		w.validateSpecFn(field.NewPath("spec"), warehouse.Spec); len(errs) > 0 {
+		w.validateSpecFn(field.NewPath("spec"), &warehouse.Spec); len(errs) > 0 {
 		return nil, apierrors.NewInvalid(warehouseGroupKind, warehouse.Name, errs)
 	}
 	return nil, nil
diff --git a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json
index 56462368..9071a339 100644
--- a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json
+++ b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json
@@ -383,7 +383,7 @@
           "description": "Verification describes how to verify a Stage's current Freight is fit for\npromotion downstream.",
           "properties": {
             "analysisRunMetadata": {
-              "description": "AnalysisRunMetadata is contains optional metadata that should be applied to\nall AnalysisRuns.",
+              "description": "AnalysisRunMetadata contains optional metadata that should be applied to\nall AnalysisRuns.",
               "properties": {
                 "annotations": {
                   "additionalProperties": {
diff --git a/ui/src/gen/v1alpha1/generated_pb.ts b/ui/src/gen/v1alpha1/generated_pb.ts
index 671d6116..02bddbc8 100644
--- a/ui/src/gen/v1alpha1/generated_pb.ts
+++ b/ui/src/gen/v1alpha1/generated_pb.ts
@@ -3475,7 +3475,7 @@ export class Verification extends Message<Verification> {
   analysisTemplates: AnalysisTemplateReference[] = [];
 
   /**
-   * AnalysisRunMetadata is contains optional metadata that should be applied to
+   * AnalysisRunMetadata contains optional metadata that should be applied to
    * all AnalysisRuns.
    *
    * @generated from field: optional github.com.akuity.kargo.api.v1alpha1.AnalysisRunMetadata analysisRunMetadata = 2;


Test patch:
diff --git a/internal/api/promote_to_stage_subscribers_v1alpha1_test.go b/internal/api/promote_to_stage_subscribers_v1alpha1_test.go
index bad6d64c..bfbdf07a 100644
--- a/internal/api/promote_to_stage_subscribers_v1alpha1_test.go
+++ b/internal/api/promote_to_stage_subscribers_v1alpha1_test.go
@@ -145,8 +145,8 @@ func TestPromoteToStageSubscribers(t *testing.T) {
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
 					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{
-							Subscriptions: &kargoapi.Subscriptions{
+						Spec: kargoapi.StageSpec{
+							Subscriptions: kargoapi.Subscriptions{
 								UpstreamStages: []kargoapi.StageSubscription{
 									{
 										Name: "fake-upstream-stage",
@@ -191,8 +191,8 @@ func TestPromoteToStageSubscribers(t *testing.T) {
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
 					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{
-							Subscriptions: &kargoapi.Subscriptions{
+						Spec: kargoapi.StageSpec{
+							Subscriptions: kargoapi.Subscriptions{
 								UpstreamStages: []kargoapi.StageSubscription{
 									{
 										Name: "fake-upstream-stage",
@@ -241,8 +241,8 @@ func TestPromoteToStageSubscribers(t *testing.T) {
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
 					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{
-							Subscriptions: &kargoapi.Subscriptions{
+						Spec: kargoapi.StageSpec{
+							Subscriptions: kargoapi.Subscriptions{
 								UpstreamStages: []kargoapi.StageSubscription{
 									{
 										Name: "fake-upstream-stage",
@@ -294,8 +294,8 @@ func TestPromoteToStageSubscribers(t *testing.T) {
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
 					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{
-							Subscriptions: &kargoapi.Subscriptions{
+						Spec: kargoapi.StageSpec{
+							Subscriptions: kargoapi.Subscriptions{
 								UpstreamStages: []kargoapi.StageSubscription{
 									{
 										Name: "fake-upstream-stage",
@@ -349,8 +349,8 @@ func TestPromoteToStageSubscribers(t *testing.T) {
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
 					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{
-							Subscriptions: &kargoapi.Subscriptions{
+						Spec: kargoapi.StageSpec{
+							Subscriptions: kargoapi.Subscriptions{
 								UpstreamStages: []kargoapi.StageSubscription{
 									{
 										Name: "fake-upstream-stage",
@@ -408,8 +408,8 @@ func TestPromoteToStageSubscribers(t *testing.T) {
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
 					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{
-							Subscriptions: &kargoapi.Subscriptions{
+						Spec: kargoapi.StageSpec{
+							Subscriptions: kargoapi.Subscriptions{
 								UpstreamStages: []kargoapi.StageSubscription{
 									{
 										Name: "fake-upstream-stage",
@@ -474,8 +474,8 @@ func TestPromoteToStageSubscribers(t *testing.T) {
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
 					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{
-							Subscriptions: &kargoapi.Subscriptions{
+						Spec: kargoapi.StageSpec{
+							Subscriptions: kargoapi.Subscriptions{
 								UpstreamStages: []kargoapi.StageSubscription{
 									{
 										Name: "fake-upstream-stage",
@@ -501,7 +501,7 @@ func TestPromoteToStageSubscribers(t *testing.T) {
 				) ([]kargoapi.Stage, error) {
 					return []kargoapi.Stage{
 						{
-							Spec: &kargoapi.StageSpec{
+							Spec: kargoapi.StageSpec{
 								PromotionMechanisms: &kargoapi.PromotionMechanisms{},
 							},
 						},
@@ -554,8 +554,8 @@ func TestPromoteToStageSubscribers(t *testing.T) {
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
 					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{
-							Subscriptions: &kargoapi.Subscriptions{
+						Spec: kargoapi.StageSpec{
+							Subscriptions: kargoapi.Subscriptions{
 								UpstreamStages: []kargoapi.StageSubscription{
 									{
 										Name: "fake-upstream-stage",
@@ -581,7 +581,7 @@ func TestPromoteToStageSubscribers(t *testing.T) {
 				) ([]kargoapi.Stage, error) {
 					return []kargoapi.Stage{
 						{
-							Spec: &kargoapi.StageSpec{
+							Spec: kargoapi.StageSpec{
 								PromotionMechanisms: &kargoapi.PromotionMechanisms{},
 							},
 						},
diff --git a/internal/api/promote_to_stage_v1alpha1_test.go b/internal/api/promote_to_stage_v1alpha1_test.go
index 771a4d22..4a57dd8d 100644
--- a/internal/api/promote_to_stage_v1alpha1_test.go
+++ b/internal/api/promote_to_stage_v1alpha1_test.go
@@ -146,8 +146,8 @@ func TestPromoteToStage(t *testing.T) {
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
 					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{
-							Subscriptions: &kargoapi.Subscriptions{
+						Spec: kargoapi.StageSpec{
+							Subscriptions: kargoapi.Subscriptions{
 								UpstreamStages: []kargoapi.StageSubscription{
 									{
 										Name: "fake-upstream-stage",
@@ -192,8 +192,8 @@ func TestPromoteToStage(t *testing.T) {
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
 					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{
-							Subscriptions: &kargoapi.Subscriptions{
+						Spec: kargoapi.StageSpec{
+							Subscriptions: kargoapi.Subscriptions{
 								UpstreamStages: []kargoapi.StageSubscription{
 									{
 										Name: "fake-upstream-stage",
@@ -242,8 +242,8 @@ func TestPromoteToStage(t *testing.T) {
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
 					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{
-							Subscriptions: &kargoapi.Subscriptions{
+						Spec: kargoapi.StageSpec{
+							Subscriptions: kargoapi.Subscriptions{
 								UpstreamStages: []kargoapi.StageSubscription{
 									{
 										Name: "fake-upstream-stage",
@@ -295,8 +295,8 @@ func TestPromoteToStage(t *testing.T) {
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
 					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{
-							Subscriptions: &kargoapi.Subscriptions{
+						Spec: kargoapi.StageSpec{
+							Subscriptions: kargoapi.Subscriptions{
 								UpstreamStages: []kargoapi.StageSubscription{
 									{
 										Name: "fake-upstream-stage",
@@ -355,8 +355,8 @@ func TestPromoteToStage(t *testing.T) {
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
 					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{
-							Subscriptions: &kargoapi.Subscriptions{
+						Spec: kargoapi.StageSpec{
+							Subscriptions: kargoapi.Subscriptions{
 								UpstreamStages: []kargoapi.StageSubscription{
 									{
 										Name: "fake-upstream-stage",
@@ -420,8 +420,8 @@ func TestPromoteToStage(t *testing.T) {
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
 					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{
-							Subscriptions: &kargoapi.Subscriptions{
+						Spec: kargoapi.StageSpec{
+							Subscriptions: kargoapi.Subscriptions{
 								UpstreamStages: []kargoapi.StageSubscription{
 									{
 										Name: "fake-upstream-stage",
diff --git a/internal/api/query_freights_v1alpha1_test.go b/internal/api/query_freights_v1alpha1_test.go
index 7516dfad..cc6b7a22 100644
--- a/internal/api/query_freights_v1alpha1_test.go
+++ b/internal/api/query_freights_v1alpha1_test.go
@@ -161,11 +161,7 @@ func TestQueryFreight(t *testing.T) {
 					client.Client,
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
-					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{
-							Subscriptions: &kargoapi.Subscriptions{},
-						},
-					}, nil
+					return &kargoapi.Stage{}, nil
 				},
 				getAvailableFreightForStageFn: func(
 					context.Context,
diff --git a/internal/controller/promotion/argocd_test.go b/internal/controller/promotion/argocd_test.go
index 090ec8a5..05b5c562 100644
--- a/internal/controller/promotion/argocd_test.go
+++ b/internal/controller/promotion/argocd_test.go
@@ -55,7 +55,7 @@ func TestArgoCDPromote(t *testing.T) {
 			name:      "no updates",
 			promoMech: &argoCDMechanism{},
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
 				},
 			},
@@ -74,7 +74,7 @@ func TestArgoCDPromote(t *testing.T) {
 			name:      "argo cd integration disabled",
 			promoMech: &argoCDMechanism{},
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{
 						ArgoCDAppUpdates: []kargoapi.ArgoCDAppUpdate{
 							{},
@@ -110,7 +110,7 @@ func TestArgoCDPromote(t *testing.T) {
 				},
 			},
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{
 						ArgoCDAppUpdates: []kargoapi.ArgoCDAppUpdate{
 							{},
@@ -150,7 +150,7 @@ func TestArgoCDPromote(t *testing.T) {
 				},
 			},
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{
 						ArgoCDAppUpdates: []kargoapi.ArgoCDAppUpdate{
 							{},
@@ -182,7 +182,7 @@ func TestArgoCDPromote(t *testing.T) {
 				},
 			},
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{
 						ArgoCDAppUpdates: []kargoapi.ArgoCDAppUpdate{
 							{},
@@ -215,7 +215,7 @@ func TestArgoCDPromote(t *testing.T) {
 				},
 			},
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{
 						ArgoCDAppUpdates: []kargoapi.ArgoCDAppUpdate{
 							{},
@@ -256,7 +256,7 @@ func TestArgoCDPromote(t *testing.T) {
 				},
 			},
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{
 						ArgoCDAppUpdates: []kargoapi.ArgoCDAppUpdate{
 							{},
@@ -312,7 +312,7 @@ func TestArgoCDPromote(t *testing.T) {
 				},
 			},
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{
 						ArgoCDAppUpdates: []kargoapi.ArgoCDAppUpdate{
 							{},
@@ -346,7 +346,7 @@ func TestArgoCDPromote(t *testing.T) {
 				},
 			},
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{
 						ArgoCDAppUpdates: []kargoapi.ArgoCDAppUpdate{
 							{},
@@ -378,7 +378,7 @@ func TestArgoCDPromote(t *testing.T) {
 				},
 			},
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{
 						ArgoCDAppUpdates: []kargoapi.ArgoCDAppUpdate{
 							{},
diff --git a/internal/controller/promotion/composite_test.go b/internal/controller/promotion/composite_test.go
index 7a1e42fc..e3ccc507 100644
--- a/internal/controller/promotion/composite_test.go
+++ b/internal/controller/promotion/composite_test.go
@@ -126,7 +126,7 @@ func TestCompositePromote(t *testing.T) {
 			promoStatus, newFreightOut, err := testCase.promoMech.Promote(
 				context.Background(),
 				&kargoapi.Stage{
-					Spec: &kargoapi.StageSpec{
+					Spec: kargoapi.StageSpec{
 						PromotionMechanisms: &kargoapi.PromotionMechanisms{},
 					},
 				},
diff --git a/internal/controller/promotion/git_test.go b/internal/controller/promotion/git_test.go
index 6e136e3a..0c4b8275 100644
--- a/internal/controller/promotion/git_test.go
+++ b/internal/controller/promotion/git_test.go
@@ -141,7 +141,7 @@ func TestGitPromote(t *testing.T) {
 			status, newFreightOut, err := testCase.promoMech.Promote(
 				context.Background(),
 				&kargoapi.Stage{
-					Spec: &kargoapi.StageSpec{
+					Spec: kargoapi.StageSpec{
 						PromotionMechanisms: &kargoapi.PromotionMechanisms{},
 					},
 				},
diff --git a/internal/controller/promotions/promoqueues_test.go b/internal/controller/promotions/promoqueues_test.go
index ce9ea498..80b34450 100644
--- a/internal/controller/promotions/promoqueues_test.go
+++ b/internal/controller/promotions/promoqueues_test.go
@@ -57,7 +57,7 @@ func newPromo(namespace, name, stage string,
 			Name:              name,
 			Namespace:         namespace,
 		},
-		Spec: &kargoapi.PromotionSpec{
+		Spec: kargoapi.PromotionSpec{
 			Stage: stage,
 		},
 		Status: kargoapi.PromotionStatus{
diff --git a/internal/controller/promotions/promotions_test.go b/internal/controller/promotions/promotions_test.go
index 463d39ff..be360a05 100644
--- a/internal/controller/promotions/promotions_test.go
+++ b/internal/controller/promotions/promotions_test.go
@@ -155,9 +155,7 @@ func TestReconcile(t *testing.T) {
 			r := newFakeReconciler(t, recorder, tc.promos...)
 			promoteWasCalled := false
 			r.getStageFn = func(context.Context, client.Client, types.NamespacedName) (*kargoapi.Stage, error) {
-				return &kargoapi.Stage{
-					Spec: &kargoapi.StageSpec{},
-				}, nil
+				return &kargoapi.Stage{}, nil
 			}
 			r.promoteFn = func(ctx context.Context, p v1alpha1.Promotion,
 				f *v1alpha1.Freight) (*kargoapi.PromotionStatus, error) {
diff --git a/internal/controller/stages/stages_test.go b/internal/controller/stages/stages_test.go
index ec2cbc80..7316cfd8 100644
--- a/internal/controller/stages/stages_test.go
+++ b/internal/controller/stages/stages_test.go
@@ -92,8 +92,8 @@ func TestSyncControlFlowStage(t *testing.T) {
 		{
 			name: "error listing Freight from Warehouse",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
-					Subscriptions: &kargoapi.Subscriptions{
+				Spec: kargoapi.StageSpec{
+					Subscriptions: kargoapi.Subscriptions{
 						Warehouse: "fake-warehouse",
 					},
 				},
@@ -130,8 +130,8 @@ func TestSyncControlFlowStage(t *testing.T) {
 		{
 			name: "error listing Freight verified in upstream Stages",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
-					Subscriptions: &kargoapi.Subscriptions{
+				Spec: kargoapi.StageSpec{
+					Subscriptions: kargoapi.Subscriptions{
 						UpstreamStages: []kargoapi.StageSubscription{
 							{Name: "fake-stage"},
 						},
@@ -174,8 +174,8 @@ func TestSyncControlFlowStage(t *testing.T) {
 		{
 			name: "error marking Freight as verified in Stage",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
-					Subscriptions: &kargoapi.Subscriptions{
+				Spec: kargoapi.StageSpec{
+					Subscriptions: kargoapi.Subscriptions{
 						Warehouse: "fake-warehouse",
 					},
 				},
@@ -225,8 +225,8 @@ func TestSyncControlFlowStage(t *testing.T) {
 				ObjectMeta: metav1.ObjectMeta{
 					Generation: 42,
 				},
-				Spec: &kargoapi.StageSpec{
-					Subscriptions: &kargoapi.Subscriptions{
+				Spec: kargoapi.StageSpec{
+					Subscriptions: kargoapi.Subscriptions{
 						Warehouse: "fake-warehouse",
 					},
 				},
@@ -377,7 +377,7 @@ func TestSyncNormalStage(t *testing.T) {
 						kargoapi.AnnotationKeyReverify: "fake-id",
 					},
 				},
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
 					Verification:        &kargoapi.Verification{},
 				},
@@ -447,7 +447,7 @@ func TestSyncNormalStage(t *testing.T) {
 						kargoapi.AnnotationKeyReverify: "wrong-fake-analysis-run",
 					},
 				},
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
 					Verification:        &kargoapi.Verification{},
 				},
@@ -500,7 +500,7 @@ func TestSyncNormalStage(t *testing.T) {
 		{
 			name: "error starting verification",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
 					Verification:        &kargoapi.Verification{},
 				},
@@ -582,7 +582,7 @@ func TestSyncNormalStage(t *testing.T) {
 		{
 			name: "retryable error starting verification",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
 					Verification:        &kargoapi.Verification{},
 				},
@@ -642,7 +642,7 @@ func TestSyncNormalStage(t *testing.T) {
 		{
 			name: "error checking verification result",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
 					Verification:        &kargoapi.Verification{},
 				},
@@ -721,7 +721,7 @@ func TestSyncNormalStage(t *testing.T) {
 		{
 			name: "retryable error checking verification result",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
 					Verification:        &kargoapi.Verification{},
 				},
@@ -792,7 +792,7 @@ func TestSyncNormalStage(t *testing.T) {
 						kargoapi.AnnotationKeyAbort: "fake-id",
 					},
 				},
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
 					Verification:        &kargoapi.Verification{},
 				},
@@ -889,7 +889,7 @@ func TestSyncNormalStage(t *testing.T) {
 						kargoapi.AnnotationKeyAbort: "fake-id",
 					},
 				},
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
 					Verification:        &kargoapi.Verification{},
 				},
@@ -977,7 +977,7 @@ func TestSyncNormalStage(t *testing.T) {
 		{
 			name: "error marking Freight as verified in Stage",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
 				},
 				Status: kargoapi.StageStatus{
@@ -1017,8 +1017,8 @@ func TestSyncNormalStage(t *testing.T) {
 		{
 			name: "error checking if auto-promotion is permitted",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
-					Subscriptions: &kargoapi.Subscriptions{
+				Spec: kargoapi.StageSpec{
+					Subscriptions: kargoapi.Subscriptions{
 						Warehouse: "fake-warehouse",
 					},
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
@@ -1083,8 +1083,8 @@ func TestSyncNormalStage(t *testing.T) {
 		{
 			name: "auto-promotion is not permitted",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
-					Subscriptions: &kargoapi.Subscriptions{
+				Spec: kargoapi.StageSpec{
+					Subscriptions: kargoapi.Subscriptions{
 						Warehouse: "fake-warehouse",
 					},
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
@@ -1143,8 +1143,8 @@ func TestSyncNormalStage(t *testing.T) {
 		{
 			name: "error getting latest Freight",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
-					Subscriptions: &kargoapi.Subscriptions{
+				Spec: kargoapi.StageSpec{
+					Subscriptions: kargoapi.Subscriptions{
 						Warehouse: "fake-warehouse",
 					},
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
@@ -1216,8 +1216,8 @@ func TestSyncNormalStage(t *testing.T) {
 		{
 			name: "no Freight found",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
-					Subscriptions: &kargoapi.Subscriptions{
+				Spec: kargoapi.StageSpec{
+					Subscriptions: kargoapi.Subscriptions{
 						Warehouse: "fake-warehouse",
 					},
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
@@ -1273,8 +1273,8 @@ func TestSyncNormalStage(t *testing.T) {
 		{
 			name: "Stage already has latest Freight",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
-					Subscriptions: &kargoapi.Subscriptions{
+				Spec: kargoapi.StageSpec{
+					Subscriptions: kargoapi.Subscriptions{
 						Warehouse: "fake-warehouse",
 					},
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
@@ -1333,8 +1333,8 @@ func TestSyncNormalStage(t *testing.T) {
 		{
 			name: "Promotion already exists",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
-					Subscriptions: &kargoapi.Subscriptions{
+				Spec: kargoapi.StageSpec{
+					Subscriptions: kargoapi.Subscriptions{
 						Warehouse: "fake-warehouse",
 					},
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
@@ -1405,8 +1405,8 @@ func TestSyncNormalStage(t *testing.T) {
 		{
 			name: "error creating Promotion",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
-					Subscriptions: &kargoapi.Subscriptions{
+				Spec: kargoapi.StageSpec{
+					Subscriptions: kargoapi.Subscriptions{
 						Warehouse: "fake-warehouse",
 					},
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
@@ -1500,8 +1500,8 @@ func TestSyncNormalStage(t *testing.T) {
 					Generation: 42,
 					Name:       "fake-stage",
 				},
-				Spec: &kargoapi.StageSpec{
-					Subscriptions: &kargoapi.Subscriptions{
+				Spec: kargoapi.StageSpec{
+					Subscriptions: kargoapi.Subscriptions{
 						Warehouse: "fake-warehouse",
 					},
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
@@ -1632,8 +1632,8 @@ func TestSyncNormalStage(t *testing.T) {
 				ObjectMeta: metav1.ObjectMeta{
 					Generation: 42,
 				},
-				Spec: &kargoapi.StageSpec{
-					Subscriptions: &kargoapi.Subscriptions{
+				Spec: kargoapi.StageSpec{
+					Subscriptions: kargoapi.Subscriptions{
 						Warehouse: "fake-warehouse",
 					},
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{},
@@ -2390,13 +2390,13 @@ func TestGetLatestAvailableFreight(t *testing.T) {
 	now := time.Now().UTC()
 	testCases := []struct {
 		name       string
-		subs       *kargoapi.Subscriptions
+		subs       kargoapi.Subscriptions
 		reconciler *reconciler
 		assertions func(*testing.T, *kargoapi.Freight, error)
 	}{
 		{
 			name: "error getting latest Freight from Warehouse",
-			subs: &kargoapi.Subscriptions{
+			subs: kargoapi.Subscriptions{
 				Warehouse: "fake-warehouse",
 			},
 			reconciler: &reconciler{
@@ -2416,7 +2416,7 @@ func TestGetLatestAvailableFreight(t *testing.T) {
 		},
 		{
 			name: "found no Freight from Warehouse",
-			subs: &kargoapi.Subscriptions{
+			subs: kargoapi.Subscriptions{
 				Warehouse: "fake-warehouse",
 			},
 			reconciler: &reconciler{
@@ -2435,7 +2435,7 @@ func TestGetLatestAvailableFreight(t *testing.T) {
 		},
 		{
 			name: "success getting latest Freight from Warehouse",
-			subs: &kargoapi.Subscriptions{
+			subs: kargoapi.Subscriptions{
 				Warehouse: "fake-warehouse",
 			},
 			reconciler: &reconciler{
@@ -2454,7 +2454,7 @@ func TestGetLatestAvailableFreight(t *testing.T) {
 		},
 		{
 			name: "error getting latest Freight verified in upstream Stages",
-			subs: &kargoapi.Subscriptions{
+			subs: kargoapi.Subscriptions{
 				UpstreamStages: []kargoapi.StageSubscription{{}},
 			},
 			reconciler: &reconciler{
@@ -2478,7 +2478,7 @@ func TestGetLatestAvailableFreight(t *testing.T) {
 		},
 		{
 			name: "error getting latest Freight approved for Stage",
-			subs: &kargoapi.Subscriptions{
+			subs: kargoapi.Subscriptions{
 				UpstreamStages: []kargoapi.StageSubscription{{}},
 			},
 			reconciler: &reconciler{
@@ -2509,7 +2509,7 @@ func TestGetLatestAvailableFreight(t *testing.T) {
 		},
 		{
 			name: "found no suitable Freight",
-			subs: &kargoapi.Subscriptions{
+			subs: kargoapi.Subscriptions{
 				UpstreamStages: []kargoapi.StageSubscription{{}},
 			},
 			reconciler: &reconciler{
@@ -2535,7 +2535,7 @@ func TestGetLatestAvailableFreight(t *testing.T) {
 		},
 		{
 			name: "only found latest Freight verified in upstream Stages",
-			subs: &kargoapi.Subscriptions{
+			subs: kargoapi.Subscriptions{
 				UpstreamStages: []kargoapi.StageSubscription{{}},
 			},
 			reconciler: &reconciler{
@@ -2561,7 +2561,7 @@ func TestGetLatestAvailableFreight(t *testing.T) {
 		},
 		{
 			name: "only found latest Freight approved for Stage",
-			subs: &kargoapi.Subscriptions{
+			subs: kargoapi.Subscriptions{
 				UpstreamStages: []kargoapi.StageSubscription{{}},
 			},
 			reconciler: &reconciler{
@@ -2587,7 +2587,7 @@ func TestGetLatestAvailableFreight(t *testing.T) {
 		},
 		{
 			name: "latest verified Freight is newer than latest approved Freight",
-			subs: &kargoapi.Subscriptions{
+			subs: kargoapi.Subscriptions{
 				UpstreamStages: []kargoapi.StageSubscription{{}},
 			},
 			reconciler: &reconciler{
@@ -2628,7 +2628,7 @@ func TestGetLatestAvailableFreight(t *testing.T) {
 		},
 		{
 			name: "latest approved Freight is newer than latest verified Freight",
-			subs: &kargoapi.Subscriptions{
+			subs: kargoapi.Subscriptions{
 				UpstreamStages: []kargoapi.StageSubscription{{}},
 			},
 			reconciler: &reconciler{
@@ -2674,7 +2674,7 @@ func TestGetLatestAvailableFreight(t *testing.T) {
 				context.Background(),
 				"fake-namespace",
 				&kargoapi.Stage{
-					Spec: &kargoapi.StageSpec{
+					Spec: kargoapi.StageSpec{
 						Subscriptions: testCase.subs,
 					},
 				},
diff --git a/internal/controller/stages/verification_test.go b/internal/controller/stages/verification_test.go
index 4ff7bd4f..ed709e3b 100644
--- a/internal/controller/stages/verification_test.go
+++ b/internal/controller/stages/verification_test.go
@@ -114,7 +114,7 @@ func TestStartVerification(t *testing.T) {
 						kargoapi.AnnotationKeyReverify: "fake-id",
 					},
 				},
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Verification: &kargoapi.Verification{
 						AnalysisTemplates: []kargoapi.AnalysisTemplateReference{{}},
 					},
@@ -192,7 +192,7 @@ func TestStartVerification(t *testing.T) {
 		{
 			name: "error getting AnalysisTemplate",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Verification: &kargoapi.Verification{
 						AnalysisTemplates: []kargoapi.AnalysisTemplateReference{{}},
 					},
@@ -234,7 +234,7 @@ func TestStartVerification(t *testing.T) {
 		{
 			name: "AnalysisTemplate not found",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Verification: &kargoapi.Verification{
 						AnalysisTemplates: []kargoapi.AnalysisTemplateReference{{}},
 					},
@@ -276,7 +276,7 @@ func TestStartVerification(t *testing.T) {
 		{
 			name: "error getting Freight",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Verification: &kargoapi.Verification{
 						AnalysisTemplates: []kargoapi.AnalysisTemplateReference{{}},
 					},
@@ -325,7 +325,7 @@ func TestStartVerification(t *testing.T) {
 		{
 			name: "Freight not found",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Verification: &kargoapi.Verification{
 						AnalysisTemplates: []kargoapi.AnalysisTemplateReference{{}},
 					},
@@ -374,7 +374,7 @@ func TestStartVerification(t *testing.T) {
 		{
 			name: "error building AnalysisRun",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Verification: &kargoapi.Verification{
 						AnalysisTemplates: []kargoapi.AnalysisTemplateReference{{}},
 					},
@@ -429,7 +429,7 @@ func TestStartVerification(t *testing.T) {
 		{
 			name: "error creating AnalysisRun",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Verification: &kargoapi.Verification{
 						AnalysisTemplates: []kargoapi.AnalysisTemplateReference{{}},
 					},
@@ -492,7 +492,7 @@ func TestStartVerification(t *testing.T) {
 		{
 			name: "validation error creating AnalysisRun",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Verification: &kargoapi.Verification{
 						AnalysisTemplates: []kargoapi.AnalysisTemplateReference{{}},
 					},
@@ -556,7 +556,7 @@ func TestStartVerification(t *testing.T) {
 		{
 			name: "success",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Verification: &kargoapi.Verification{
 						AnalysisTemplates: []kargoapi.AnalysisTemplateReference{{}},
 					},
@@ -970,7 +970,7 @@ func TestBuildAnalysisRun(t *testing.T) {
 					Name:      "fake-stage",
 					Namespace: "fake-namespace",
 				},
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Verification: &kargoapi.Verification{
 						AnalysisRunMetadata: &kargoapi.AnalysisRunMetadata{
 							Labels: map[string]string{
@@ -1062,7 +1062,7 @@ func TestBuildAnalysisRun(t *testing.T) {
 				},
 			},
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Verification: &kargoapi.Verification{},
 				},
 				Status: kargoapi.StageStatus{
@@ -1087,7 +1087,7 @@ func TestBuildAnalysisRun(t *testing.T) {
 			name:       "Flattens multiple templates",
 			reconciler: &reconciler{},
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Verification: &kargoapi.Verification{},
 				},
 				Status: kargoapi.StageStatus{
@@ -1151,7 +1151,7 @@ func TestBuildAnalysisRun(t *testing.T) {
 			name:       "Merges flattened template args with stage args",
 			reconciler: &reconciler{},
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Verification: &kargoapi.Verification{
 						Args: []kargoapi.AnalysisRunArgument{
 							{
@@ -1200,7 +1200,7 @@ func TestBuildAnalysisRun(t *testing.T) {
 			name:       "Sets owner reference to Freight",
 			reconciler: &reconciler{},
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Verification: &kargoapi.Verification{},
 				},
 				Status: kargoapi.StageStatus{
@@ -1242,7 +1242,7 @@ func TestBuildAnalysisRun(t *testing.T) {
 						}).String(),
 					},
 				},
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Verification: &kargoapi.Verification{},
 				},
 				Status: kargoapi.StageStatus{
@@ -1287,7 +1287,7 @@ func TestBuildAnalysisRun(t *testing.T) {
 						}).String(),
 					},
 				},
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Verification: &kargoapi.Verification{},
 				},
 				Status: kargoapi.StageStatus{
diff --git a/internal/controller/warehouses/git_test.go b/internal/controller/warehouses/git_test.go
index b8dc9576..9be543b5 100644
--- a/internal/controller/warehouses/git_test.go
+++ b/internal/controller/warehouses/git_test.go
@@ -759,6 +759,126 @@ func TestMatchesPathsFilters(t *testing.T) {
 				require.ErrorContains(t, err, "syntax error in pattern")
 			},
 		},
+		{
+			name:         "success unmatching mix1",
+			includePaths: []string{"path3", regexPrefix + "nonexistent", globPrefix + "nonexistent"},
+			excludePaths: []string{regexPrefix + "nonexistent", "*/?helpers.tpl", globPrefix + "nonexistent"},
+			diffs:        []string{"path1/values.yaml", "path2/_helpers.tpl"},
+			assertions: func(t *testing.T, matchFound bool, err error) {
+				require.NoError(t, err)
+				require.Equal(t, false, matchFound)
+			},
+		},
+		{
+			name:         "success unmatching mix2",
+			includePaths: []string{"path1", regexPrefix + "[_-]", globPrefix + "nonexistent"},
+			excludePaths: []string{
+				regexPrefix + "nonexistent",
+				"path1",
+				"path1",
+				globPrefix + "*.tpl",
+				globPrefix + "*/*.tpl",
+				globPrefix + "*.tpl",
+				"path1",
+			},
+			diffs: []string{"path1/values.yaml", "path2/_helpers.tpl", "path2/ingress.yaml"},
+			assertions: func(t *testing.T, matchFound bool, err error) {
+				require.NoError(t, err)
+				require.Equal(t, false, matchFound)
+			},
+		},
+		{
+			name: "success unmatching mix3",
+			includePaths: []string{
+				"path1/f",
+				regexpPrefix + "path[1-3]",
+				globPrefix + "file*",
+			},
+			excludePaths: []string{
+				regexPrefix + "\\d",
+				"yaml",
+				globPrefix + "*.tpl",
+				globPrefix + "*.tpl",
+				"nonexistent",
+			},
+			diffs: []string{"path1/file1", "path2/file2", "path3/file3"},
+			assertions: func(t *testing.T, matchFound bool, err error) {
+				require.NoError(t, err)
+				require.Equal(t, false, matchFound)
+			},
+		},
+		{
+			name:         "success unmatching mix2; no config",
+			includePaths: []string{},
+			excludePaths: []string{},
+			diffs:        []string{},
+			assertions: func(t *testing.T, matchFound bool, err error) {
+				require.NoError(t, err)
+				require.Equal(t, false, matchFound)
+			},
+		},
+		{
+			name: "success matching mix1",
+			includePaths: []string{
+				"path1",
+				regexPrefix + "[_-]",
+				globPrefix + "nonexistent",
+				regexPrefix + "no",
+				globPrefix + "*/*/*/abe/*",
+			},
+			excludePaths: []string{
+				regexPrefix + "nonexistent",
+				"path1",
+				"path1",
+				globPrefix + "*.tpl",
+				globPrefix + "*/*.tpl",
+				globPrefix + "*.tpl",
+				regexpPrefix + ".*q",
+			},
+			diffs: []string{
+				"path1/values.yaml",
+				"path2/_helpers.tpl",
+				"abc",
+				"abb",
+				"aba",
+				"abz",
+				"aby",
+				"abx",
+				"abw",
+				"abv",
+				"abu",
+				"path3/abc/abd/abe/deployment.yaml",
+				"path4.txt",
+			},
+			assertions: func(t *testing.T, matchFound bool, err error) {
+				require.NoError(t, err)
+				require.Equal(t, true, matchFound)
+			},
+		},
+		{
+			name: "success matching mix3; no includePaths",
+			excludePaths: []string{
+				regexpPrefix + "ab[cbazxwvu]",
+				"helpers.tpl",
+				globPrefix + "path*/*"},
+			diffs: []string{
+				"path1/values.yaml",
+				"path2/_helpers.tpl",
+				"abc",
+				"abb",
+				"aba",
+				"abz",
+				"aby",
+				"abx",
+				"abw",
+				"abv",
+				"abu",
+			},
+			assertions: func(t *testing.T, matchFound bool, err error) {
+				require.NoError(t, err)
+				require.Equal(t, true, matchFound)
+			},
+		},
 	}
 	for _, testCase := range testCases {
 		t.Run(testCase.name, func(t *testing.T) {
diff --git a/internal/controller/warehouses/warehouses_test.go b/internal/controller/warehouses/warehouses_test.go
index 10740497..3dcbdb3e 100644
--- a/internal/controller/warehouses/warehouses_test.go
+++ b/internal/controller/warehouses/warehouses_test.go
@@ -45,9 +45,7 @@ func TestNewReconciler(t *testing.T) {
 func TestSyncWarehouse(t *testing.T) {
 	scheme := k8sruntime.NewScheme()
 	require.NoError(t, kargoapi.SchemeBuilder.AddToScheme(scheme))
-	testWarehouse := &kargoapi.Warehouse{
-		Spec: &kargoapi.WarehouseSpec{},
-	}
+	testWarehouse := &kargoapi.Warehouse{}
 	testCases := []struct {
 		name       string
 		reconciler *reconciler
@@ -360,7 +358,6 @@ func TestGetLatestFreightFromRepos(t *testing.T) {
 						Namespace: "fake-namespace",
 						Name:      testWarehouseName,
 					},
-					Spec: &kargoapi.WarehouseSpec{},
 				},
 			)
 			testCase.assertions(t, freight, err)
diff --git a/internal/kubeclient/indexer_test.go b/internal/kubeclient/indexer_test.go
index fd48f103..0ceb9f33 100644
--- a/internal/kubeclient/indexer_test.go
+++ b/internal/kubeclient/indexer_test.go
@@ -129,7 +129,7 @@ func TestIndexStagesByApp(t *testing.T) {
 						kargoapi.ShardLabelKey: "another-shard",
 					},
 				},
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{
 						ArgoCDAppUpdates: []kargoapi.ArgoCDAppUpdate{
 							{
@@ -153,7 +153,7 @@ func TestIndexStagesByApp(t *testing.T) {
 						kargoapi.ShardLabelKey: testShardName,
 					},
 				},
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{
 						ArgoCDAppUpdates: []kargoapi.ArgoCDAppUpdate{
 							{
@@ -178,7 +178,7 @@ func TestIndexStagesByApp(t *testing.T) {
 			name:                "Stage is unlabeled and this is not the default controller",
 			controllerShardName: testShardName,
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{
 						ArgoCDAppUpdates: []kargoapi.ArgoCDAppUpdate{
 							{
@@ -197,7 +197,7 @@ func TestIndexStagesByApp(t *testing.T) {
 			name:                "Stage is unlabeled and this is the default controller",
 			controllerShardName: "",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{
 						ArgoCDAppUpdates: []kargoapi.ArgoCDAppUpdate{
 							{
@@ -236,7 +236,7 @@ func TestIndexPromotionsByStage(t *testing.T) {
 	}{
 		"empty predicates/terminal phase": {
 			input: &kargoapi.Promotion{
-				Spec: &kargoapi.PromotionSpec{
+				Spec: kargoapi.PromotionSpec{
 					Stage: "fake-stage",
 				},
 				Status: kargoapi.PromotionStatus{
@@ -247,7 +247,7 @@ func TestIndexPromotionsByStage(t *testing.T) {
 		},
 		"empty predicates/non-terminal phase": {
 			input: &kargoapi.Promotion{
-				Spec: &kargoapi.PromotionSpec{
+				Spec: kargoapi.PromotionSpec{
 					Stage: "fake-stage",
 				},
 				Status: kargoapi.PromotionStatus{
@@ -258,7 +258,7 @@ func TestIndexPromotionsByStage(t *testing.T) {
 		},
 		"isPromotionPhaseNonTerminal excludes Promotions in terminal phases": {
 			input: &kargoapi.Promotion{
-				Spec: &kargoapi.PromotionSpec{
+				Spec: kargoapi.PromotionSpec{
 					Stage: "fake-stage",
 				},
 				Status: kargoapi.PromotionStatus{
@@ -272,7 +272,7 @@ func TestIndexPromotionsByStage(t *testing.T) {
 		},
 		"isPromotionPhaseNonTerminal selects Promotions in non-terminal phases": {
 			input: &kargoapi.Promotion{
-				Spec: &kargoapi.PromotionSpec{
+				Spec: kargoapi.PromotionSpec{
 					Stage: "fake-stage",
 				},
 				Status: kargoapi.PromotionStatus{
@@ -349,7 +349,7 @@ func TestIndexRunningPromotionsByArgoCDApplications(t *testing.T) {
 				ObjectMeta: metav1.ObjectMeta{
 					Namespace: "fake-namespace",
 				},
-				Spec: &kargoapi.PromotionSpec{
+				Spec: kargoapi.PromotionSpec{
 					Stage: "fake-stage",
 				},
 				Status: kargoapi.PromotionStatus{
@@ -369,7 +369,7 @@ func TestIndexRunningPromotionsByArgoCDApplications(t *testing.T) {
 				ObjectMeta: metav1.ObjectMeta{
 					Namespace: "fake-namespace",
 				},
-				Spec: &kargoapi.PromotionSpec{
+				Spec: kargoapi.PromotionSpec{
 					Stage: "fake-stage",
 				},
 				Status: kargoapi.PromotionStatus{
@@ -381,7 +381,7 @@ func TestIndexRunningPromotionsByArgoCDApplications(t *testing.T) {
 					Name:      "fake-stage",
 					Namespace: "fake-namespace",
 				},
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					PromotionMechanisms: &kargoapi.PromotionMechanisms{
 						ArgoCDAppUpdates: []kargoapi.ArgoCDAppUpdate{
 							{
@@ -406,7 +406,7 @@ func TestIndexRunningPromotionsByArgoCDApplications(t *testing.T) {
 				ObjectMeta: metav1.ObjectMeta{
 					Namespace: "fake-namespace",
 				},
-				Spec: &kargoapi.PromotionSpec{
+				Spec: kargoapi.PromotionSpec{
 					Stage: "fake-stage",
 				},
 				Status: kargoapi.PromotionStatus{
@@ -520,8 +520,8 @@ func TestIndexStagesByUpstreamStages(t *testing.T) {
 		{
 			name: "Stage has no upstream Stages",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
-					Subscriptions: &kargoapi.Subscriptions{},
+				Spec: kargoapi.StageSpec{
+					Subscriptions: kargoapi.Subscriptions{},
 				},
 			},
 			expected: nil,
@@ -529,8 +529,8 @@ func TestIndexStagesByUpstreamStages(t *testing.T) {
 		{
 			name: "Stage has upstream stages",
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
-					Subscriptions: &kargoapi.Subscriptions{
+				Spec: kargoapi.StageSpec{
+					Subscriptions: kargoapi.Subscriptions{
 						UpstreamStages: []kargoapi.StageSubscription{
 							{
 								Name: "fake-stage",
diff --git a/internal/webhook/promotion/webhook_test.go b/internal/webhook/promotion/webhook_test.go
index cf7e66f3..02773777 100644
--- a/internal/webhook/promotion/webhook_test.go
+++ b/internal/webhook/promotion/webhook_test.go
@@ -95,9 +95,7 @@ func TestDefault(t *testing.T) {
 					client.Client,
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
-					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{},
-					}, nil
+					return &kargoapi.Stage{}, nil
 				},
 			},
 			assertions: func(t *testing.T, _ *kargoapi.Promotion, err error) {
@@ -117,7 +115,7 @@ func TestDefault(t *testing.T) {
 					types.NamespacedName,
 				) (*kargoapi.Stage, error) {
 					return &kargoapi.Stage{
-						Spec: &kargoapi.StageSpec{
+						Spec: kargoapi.StageSpec{
 							PromotionMechanisms: &kargoapi.PromotionMechanisms{},
 							Shard:               "fake-shard",
 						},
@@ -134,7 +132,7 @@ func TestDefault(t *testing.T) {
 	for _, testCase := range testCases {
 		t.Run(testCase.name, func(t *testing.T) {
 			promo := &kargoapi.Promotion{
-				Spec: &kargoapi.PromotionSpec{
+				Spec: kargoapi.PromotionSpec{
 					Stage: "fake-stage",
 				},
 			}
@@ -266,7 +264,7 @@ func TestValidateCreate(t *testing.T) {
 			_, err := testCase.webhook.ValidateCreate(
 				ctx,
 				&kargoapi.Promotion{
-					Spec: &kargoapi.PromotionSpec{
+					Spec: kargoapi.PromotionSpec{
 						Freight: "fake-freight",
 					},
 				},
@@ -309,7 +307,7 @@ func TestValidateUpdate(t *testing.T) {
 						Name:      "fake-name",
 						Namespace: "fake-namespace",
 					},
-					Spec: &kargoapi.PromotionSpec{
+					Spec: kargoapi.PromotionSpec{
 						Stage:   "fake-stage",
 						Freight: "fake-freight",
 					},
@@ -336,7 +334,7 @@ func TestValidateUpdate(t *testing.T) {
 						Name:      "fake-name",
 						Namespace: "fake-namespace",
 					},
-					Spec: &kargoapi.PromotionSpec{
+					Spec: kargoapi.PromotionSpec{
 						Stage:   "fake-stage",
 						Freight: "fake-freight",
 					},
@@ -508,7 +506,7 @@ func TestAuthorize(t *testing.T) {
 							Name:      "fake-promotion",
 							Namespace: "fake-namespace",
 						},
-						Spec: &kargoapi.PromotionSpec{
+						Spec: kargoapi.PromotionSpec{
 							Stage: "fake-stage",
 						},
 					},
diff --git a/internal/webhook/stage/webhook_test.go b/internal/webhook/stage/webhook_test.go
index 860afadf..0a551d0e 100644
--- a/internal/webhook/stage/webhook_test.go
+++ b/internal/webhook/stage/webhook_test.go
@@ -61,9 +61,7 @@ func TestDefault(t *testing.T) {
 					Operation: admissionv1.Create,
 				},
 			},
-			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{},
-			},
+			stage: &kargoapi.Stage{},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
 				require.Empty(t, stage.Labels)
@@ -84,7 +82,7 @@ func TestDefault(t *testing.T) {
 				},
 			},
 			stage: &kargoapi.Stage{
-				Spec: &kargoapi.StageSpec{
+				Spec: kargoapi.StageSpec{
 					Shard: testShardName,
 				},
 			},
@@ -113,7 +111,6 @@ func TestDefault(t *testing.T) {
 						kargoapi.ShardLabelKey: testShardName,
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -147,7 +144,6 @@ func TestDefault(t *testing.T) {
 						kargoapi.AnnotationKeyReverify: "fake-id",
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -191,7 +187,6 @@ func TestDefault(t *testing.T) {
 						}).String(),
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -235,7 +230,6 @@ func TestDefault(t *testing.T) {
 						}).String(),
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -286,7 +280,6 @@ func TestDefault(t *testing.T) {
 						}).String(),
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -337,7 +330,6 @@ func TestDefault(t *testing.T) {
 						}).String(),
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -376,7 +368,6 @@ func TestDefault(t *testing.T) {
 						kargoapi.AnnotationKeyReverify: "",
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -412,7 +403,6 @@ func TestDefault(t *testing.T) {
 						}).String(),
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -460,7 +450,6 @@ func TestDefault(t *testing.T) {
 						}).String(),
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -497,7 +486,6 @@ func TestDefault(t *testing.T) {
 						kargoapi.AnnotationKeyAbort: "fake-id",
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -541,7 +529,6 @@ func TestDefault(t *testing.T) {
 						}).String(),
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -585,7 +572,6 @@ func TestDefault(t *testing.T) {
 						}).String(),
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -636,7 +622,6 @@ func TestDefault(t *testing.T) {
 						}).String(),
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -687,7 +672,6 @@ func TestDefault(t *testing.T) {
 						}).String(),
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -726,7 +710,6 @@ func TestDefault(t *testing.T) {
 						kargoapi.AnnotationKeyAbort: "",
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -762,7 +745,6 @@ func TestDefault(t *testing.T) {
 						}).String(),
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -810,7 +792,6 @@ func TestDefault(t *testing.T) {
 						}).String(),
 					},
 				},
-				Spec: &kargoapi.StageSpec{},
 			},
 			assertions: func(t *testing.T, stage *kargoapi.Stage, err error) {
 				require.NoError(t, err)
@@ -1043,7 +1024,7 @@ func TestValidateSpec(t *testing.T) {
 			name: "invalid",
 			spec: &kargoapi.StageSpec{
 				// Has two conflicting types of subs...
-				Subscriptions: &kargoapi.Subscriptions{
+				Subscriptions: kargoapi.Subscriptions{
 					Warehouse: "test-warehouse",
 					UpstreamStages: []kargoapi.StageSubscription{
 						{},
@@ -1061,7 +1042,7 @@ func TestValidateSpec(t *testing.T) {
 						{
 							Type:     field.ErrorTypeInvalid,
 							Field:    "spec.subscriptions",
-							BadValue: spec.Subscriptions,
+							BadValue: &spec.Subscriptions,
 							Detail: "exactly one of spec.subscriptions.warehouse or " +
 								"spec.subscriptions.upstreamStages must be defined",
 						},
@@ -1082,9 +1063,9 @@ func TestValidateSpec(t *testing.T) {
 		{
 			name: "valid",
 			spec: &kargoapi.StageSpec{
-				// Nil subs and promo mechanisms are caught by declarative validation,
-				// so for the purposes of this test, leaving those completely undefined
-				// should surface no errors.
+				Subscriptions: kargoapi.Subscriptions{
+					Warehouse: "test-warehouse",
+				},
 			},
 			assertions: func(t *testing.T, _ *kargoapi.StageSpec, errs field.ErrorList) {
 				require.Nil(t, errs)
diff --git a/internal/webhook/warehouse/webhook_test.go b/internal/webhook/warehouse/webhook_test.go
index 88a2533f..6c8e9b27 100644
--- a/internal/webhook/warehouse/webhook_test.go
+++ b/internal/webhook/warehouse/webhook_test.go
@@ -32,9 +32,7 @@ func TestDefault(t *testing.T) {
 	w := &webhook{}
 
 	t.Run("shard stays default when not specified at all", func(t *testing.T) {
-		warehouse := &kargoapi.Warehouse{
-			Spec: &kargoapi.WarehouseSpec{},
-		}
+		warehouse := &kargoapi.Warehouse{}
 		err := w.Default(context.Background(), warehouse)
 		require.NoError(t, err)
 		require.Empty(t, warehouse.Labels)
@@ -43,7 +41,7 @@ func TestDefault(t *testing.T) {
 
 	t.Run("sync shard label to non-empty shard field", func(t *testing.T) {
 		warehouse := &kargoapi.Warehouse{
-			Spec: &kargoapi.WarehouseSpec{
+			Spec: kargoapi.WarehouseSpec{
 				Shard: testShardName,
 			},
 		}
@@ -60,7 +58,6 @@ func TestDefault(t *testing.T) {
 					kargoapi.ShardLabelKey: testShardName,
 				},
 			},
-			Spec: &kargoapi.WarehouseSpec{},
 		}
 		err := w.Default(context.Background(), warehouse)
 		require.NoError(t, err)
@@ -246,7 +243,7 @@ func TestValidateCreateOrUpdate(t *testing.T) {
 func TestValidateSpec(t *testing.T) {
 	testCases := []struct {
 		name       string
-		spec       *kargoapi.WarehouseSpec
+		spec       kargoapi.WarehouseSpec
 		assertions func(*testing.T, *kargoapi.WarehouseSpec, field.ErrorList)
 	}{
 		{
@@ -257,7 +254,7 @@ func TestValidateSpec(t *testing.T) {
 		},
 		{
 			name: "invalid",
-			spec: &kargoapi.WarehouseSpec{
+			spec: kargoapi.WarehouseSpec{
 				Subscriptions: []kargoapi.RepoSubscription{
 					{
 						Git: &kargoapi.GitSubscription{
@@ -320,7 +317,7 @@ func TestValidateSpec(t *testing.T) {
 		},
 		{
 			name: "valid",
-			spec: &kargoapi.WarehouseSpec{
+			spec: kargoapi.WarehouseSpec{
 				// Nil subs are caught by declarative validation, so for the purposes of
 				// this test, leaving that completely undefined should surface no
 				// errors.
@@ -332,13 +329,14 @@ func TestValidateSpec(t *testing.T) {
 	}
 	w := &webhook{}
 	for _, testCase := range testCases {
+		testCase := testCase
 		t.Run(testCase.name, func(t *testing.T) {
 			testCase.assertions(
 				t,
-				testCase.spec,
+				&testCase.spec,
 				w.validateSpec(
 					field.NewPath("spec"),
-					testCase.spec,
+					&testCase.spec,
 				),
 			)
 		})