Repository: kurtosis-tech/kurtosis
Pull request #782 (2023-06-27 10:45:20)

refactor: Remove render template endpoint on APIC
## Description:
Remove render template endpoint on APIC. This does not affect any of the CLI commands, neither Starlark

## Is this change user facing?
NO
<!-- If yes, please add the "user facing" label to the PR -->
<!-- If yes, don't forget to include docs changes where relevant -->

## References (if applicable):
<!-- Add relevant Github Issues, Discord threads, or other helpful information. -->



Patch:
diff --git a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go
index 5ec0de9ea..9daa310e8 100644
--- a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go
+++ b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go
@@ -2511,111 +2511,6 @@ func (x *StoreFilesArtifactFromServiceResponse) GetUuid() string {
 	return ""
 }
 
-type RenderTemplatesToFilesArtifactArgs struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// A map of template and its data by the path of the file relative to the root of the files artifact it will be rendered into.
-	TemplatesAndDataByDestinationRelFilepath map[string]*RenderTemplatesToFilesArtifactArgs_TemplateAndData `protobuf:"bytes,1,rep,name=templates_and_data_by_destination_rel_filepath,json=templatesAndDataByDestinationRelFilepath,proto3" json:"templates_and_data_by_destination_rel_filepath,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
-	// Name of the files artifact
-	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
-}
-
-func (x *RenderTemplatesToFilesArtifactArgs) Reset() {
-	*x = RenderTemplatesToFilesArtifactArgs{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_api_container_service_proto_msgTypes[35]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *RenderTemplatesToFilesArtifactArgs) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*RenderTemplatesToFilesArtifactArgs) ProtoMessage() {}
-
-func (x *RenderTemplatesToFilesArtifactArgs) ProtoReflect() protoreflect.Message {
-	mi := &file_api_container_service_proto_msgTypes[35]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use RenderTemplatesToFilesArtifactArgs.ProtoReflect.Descriptor instead.
-func (*RenderTemplatesToFilesArtifactArgs) Descriptor() ([]byte, []int) {
-	return file_api_container_service_proto_rawDescGZIP(), []int{35}
-}
-
-func (x *RenderTemplatesToFilesArtifactArgs) GetTemplatesAndDataByDestinationRelFilepath() map[string]*RenderTemplatesToFilesArtifactArgs_TemplateAndData {
-	if x != nil {
-		return x.TemplatesAndDataByDestinationRelFilepath
-	}
-	return nil
-}
-
-func (x *RenderTemplatesToFilesArtifactArgs) GetName() string {
-	if x != nil {
-		return x.Name
-	}
-	return ""
-}
-
-type RenderTemplatesToFilesArtifactResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// UUID of the files artifact, for use when referencing it in the future
-	Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
-}
-
-func (x *RenderTemplatesToFilesArtifactResponse) Reset() {
-	*x = RenderTemplatesToFilesArtifactResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_api_container_service_proto_msgTypes[36]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *RenderTemplatesToFilesArtifactResponse) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*RenderTemplatesToFilesArtifactResponse) ProtoMessage() {}
-
-func (x *RenderTemplatesToFilesArtifactResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_container_service_proto_msgTypes[36]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use RenderTemplatesToFilesArtifactResponse.ProtoReflect.Descriptor instead.
-func (*RenderTemplatesToFilesArtifactResponse) Descriptor() ([]byte, []int) {
-	return file_api_container_service_proto_rawDescGZIP(), []int{36}
-}
-
-func (x *RenderTemplatesToFilesArtifactResponse) GetUuid() string {
-	if x != nil {
-		return x.Uuid
-	}
-	return ""
-}
-
 type FilesArtifactNameAndUuid struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -2630,7 +2525,7 @@ type FilesArtifactNameAndUuid struct {
 func (x *FilesArtifactNameAndUuid) Reset() {
 	*x = FilesArtifactNameAndUuid{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_container_service_proto_msgTypes[37]
+		mi := &file_api_container_service_proto_msgTypes[35]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2643,7 +2538,7 @@ func (x *FilesArtifactNameAndUuid) String() string {
 func (*FilesArtifactNameAndUuid) ProtoMessage() {}
 
 func (x *FilesArtifactNameAndUuid) ProtoReflect() protoreflect.Message {
-	mi := &file_api_container_service_proto_msgTypes[37]
+	mi := &file_api_container_service_proto_msgTypes[35]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2656,7 +2551,7 @@ func (x *FilesArtifactNameAndUuid) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FilesArtifactNameAndUuid.ProtoReflect.Descriptor instead.
 func (*FilesArtifactNameAndUuid) Descriptor() ([]byte, []int) {
-	return file_api_container_service_proto_rawDescGZIP(), []int{37}
+	return file_api_container_service_proto_rawDescGZIP(), []int{35}
 }
 
 func (x *FilesArtifactNameAndUuid) GetFileName() string {
@@ -2684,7 +2579,7 @@ type ListFilesArtifactNamesAndUuidsResponse struct {
 func (x *ListFilesArtifactNamesAndUuidsResponse) Reset() {
 	*x = ListFilesArtifactNamesAndUuidsResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_api_container_service_proto_msgTypes[38]
+		mi := &file_api_container_service_proto_msgTypes[36]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2697,7 +2592,7 @@ func (x *ListFilesArtifactNamesAndUuidsResponse) String() string {
 func (*ListFilesArtifactNamesAndUuidsResponse) ProtoMessage() {}
 
 func (x *ListFilesArtifactNamesAndUuidsResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_api_container_service_proto_msgTypes[38]
+	mi := &file_api_container_service_proto_msgTypes[36]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2710,7 +2605,7 @@ func (x *ListFilesArtifactNamesAndUuidsResponse) ProtoReflect() protoreflect.Mes
 
 // Deprecated: Use ListFilesArtifactNamesAndUuidsResponse.ProtoReflect.Descriptor instead.
 func (*ListFilesArtifactNamesAndUuidsResponse) Descriptor() ([]byte, []int) {
-	return file_api_container_service_proto_rawDescGZIP(), []int{38}
+	return file_api_container_service_proto_rawDescGZIP(), []int{36}
 }
 
 func (x *ListFilesArtifactNamesAndUuidsResponse) GetFileNamesAndUuids() []*FilesArtifactNameAndUuid {
@@ -2720,64 +2615,6 @@ func (x *ListFilesArtifactNamesAndUuidsResponse) GetFileNamesAndUuids() []*Files
 	return nil
 }
 
-// An object representing the template and the data that needs to be inserted
-type RenderTemplatesToFilesArtifactArgs_TemplateAndData struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	// A string representation of the template file
-	Template string `protobuf:"bytes,1,opt,name=template,proto3" json:"template,omitempty"`
-	// A json string representation of the data to be written to template
-	DataAsJson string `protobuf:"bytes,2,opt,name=data_as_json,json=dataAsJson,proto3" json:"data_as_json,omitempty"`
-}
-
-func (x *RenderTemplatesToFilesArtifactArgs_TemplateAndData) Reset() {
-	*x = RenderTemplatesToFilesArtifactArgs_TemplateAndData{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_api_container_service_proto_msgTypes[43]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *RenderTemplatesToFilesArtifactArgs_TemplateAndData) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*RenderTemplatesToFilesArtifactArgs_TemplateAndData) ProtoMessage() {}
-
-func (x *RenderTemplatesToFilesArtifactArgs_TemplateAndData) ProtoReflect() protoreflect.Message {
-	mi := &file_api_container_service_proto_msgTypes[43]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use RenderTemplatesToFilesArtifactArgs_TemplateAndData.ProtoReflect.Descriptor instead.
-func (*RenderTemplatesToFilesArtifactArgs_TemplateAndData) Descriptor() ([]byte, []int) {
-	return file_api_container_service_proto_rawDescGZIP(), []int{35, 0}
-}
-
-func (x *RenderTemplatesToFilesArtifactArgs_TemplateAndData) GetTemplate() string {
-	if x != nil {
-		return x.Template
-	}
-	return ""
-}
-
-func (x *RenderTemplatesToFilesArtifactArgs_TemplateAndData) GetDataAsJson() string {
-	if x != nil {
-		return x.DataAsJson
-	}
-	return ""
-}
-
 var File_api_container_service_proto protoreflect.FileDescriptor
 
 var file_api_container_service_proto_rawDesc = []byte{
@@ -3166,185 +3003,140 @@ var file_api_container_service_proto_rawDesc = []byte{
 	0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65,
 	0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a,
 	0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69,
-	0x64, 0x22, 0xf6, 0x03, 0x0a, 0x22, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70,
-	0x6c, 0x61, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69,
-	0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0xc5, 0x01, 0x0a, 0x2e, 0x74, 0x65, 0x6d,
-	0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f,
-	0x62, 0x79, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72,
-	0x65, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28,
-	0x0b, 0x32, 0x63, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
-	0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70,
-	0x6c, 0x61, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69,
-	0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74,
-	0x65, 0x73, 0x41, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x61, 0x42, 0x79, 0x44, 0x65, 0x73, 0x74, 0x69,
-	0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74,
-	0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x28, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
-	0x73, 0x41, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x61, 0x42, 0x79, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68,
-	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
-	0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x4f, 0x0a, 0x0f, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65,
-	0x41, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c,
-	0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c,
-	0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x61, 0x73, 0x5f, 0x6a,
-	0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x41,
-	0x73, 0x4a, 0x73, 0x6f, 0x6e, 0x1a, 0xa2, 0x01, 0x0a, 0x2d, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61,
-	0x74, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x61, 0x42, 0x79, 0x44, 0x65, 0x73, 0x74,
-	0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x70, 0x61,
-	0x74, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x5b, 0x0a, 0x05, 0x76, 0x61, 0x6c,
-	0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63,
-	0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6e,
-	0x64, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x46, 0x69,
-	0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x2e,
-	0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52,
-	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3c, 0x0a, 0x26, 0x52, 0x65,
-	0x6e, 0x64, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x46,
-	0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x52, 0x0a, 0x18, 0x46, 0x69, 0x6c, 0x65,
-	0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64,
-	0x55, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65,
-	0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x86, 0x01, 0x0a,
-	0x26, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61,
-	0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f,
-	0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x73, 0x18,
-	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74,
-	0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41,
-	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75,
-	0x69, 0x64, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64,
-	0x55, 0x75, 0x69, 0x64, 0x73, 0x2a, 0x33, 0x0a, 0x13, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69,
-	0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x1c, 0x0a, 0x18,
-	0x55, 0x53, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53,
-	0x5f, 0x43, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x32, 0x85, 0x0f, 0x0a, 0x13, 0x41,
-	0x70, 0x69, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x12, 0x6d, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72,
-	0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f,
-	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53,
-	0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67,
-	0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
-	0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75,
-	0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30,
-	0x01, 0x12, 0x59, 0x0a, 0x15, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x6c,
-	0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69,
+	0x64, 0x22, 0x52, 0x0a, 0x18, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61,
+	0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a,
+	0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c,
+	0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c,
+	0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x86, 0x01, 0x0a, 0x26, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69,
+	0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73,
+	0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x5c, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61,
+	0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b,
+	0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61,
+	0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74,
+	0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x11, 0x66, 0x69, 0x6c,
+	0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x2a, 0x33,
+	0x0a, 0x13, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72,
+	0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x1c, 0x0a, 0x18, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x4e, 0x53,
+	0x54, 0x52, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x49, 0x4e,
+	0x47, 0x10, 0x00, 0x32, 0xee, 0x0d, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x43, 0x6f, 0x6e, 0x74, 0x61,
+	0x69, 0x6e, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6d, 0x0a, 0x11, 0x52,
+	0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74,
+	0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
+	0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b,
+	0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69,
 	0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53,
-	0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b,
-	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x12,
+	0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x59, 0x0a, 0x15, 0x55, 0x70,
+	0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b,
+	0x61, 0x67, 0x65, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+	0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64,
+	0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
+	0x79, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72,
+	0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x29, 0x2e, 0x61, 0x70,
+	0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e,
 	0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61,
-	0x67, 0x65, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
-	0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61,
-	0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e,
-	0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70,
-	0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5b, 0x0a,
-	0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61,
-	0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69,
-	0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73,
-	0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
-	0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8d, 0x01, 0x0a, 0x2a, 0x47,
+	0x67, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c,
+	0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69,
+	0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74,
+	0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72,
+	0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f,
+	0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65,
+	0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x00, 0x12, 0x8d, 0x01, 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74,
+	0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c,
+	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65,
+	0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x45, 0x2e, 0x61, 0x70, 0x69,
+	0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47,
 	0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73,
 	0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64,
-	0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
-	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
-	0x79, 0x1a, 0x45, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
-	0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e,
-	0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65,
-	0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0b, 0x45, 0x78,
-	0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f,
-	0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78,
-	0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e,
-	0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70,
-	0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x22, 0x57, 0x61, 0x69, 0x74, 0x46,
+	0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0b, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61,
+	0x6e, 0x64, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+	0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61,
+	0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43,
+	0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
+	0x12, 0x79, 0x0a, 0x22, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47,
+	0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61,
+	0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46,
 	0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e,
-	0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x39, 0x2e,
-	0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70,
-	0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74,
-	0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69,
-	0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
-	0x22, 0x00, 0x12, 0x7b, 0x0a, 0x23, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74,
-	0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61,
-	0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f,
-	0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61,
-	0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64,
-	0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74,
-	0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12,
-	0x73, 0x0a, 0x13, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72,
-	0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e,
-	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61,
-	0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72,
-	0x67, 0x73, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
-	0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c,
-	0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x15, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69,
-	0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e,
-	0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70,
-	0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68,
-	0x75, 0x6e, 0x6b, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
-	0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69,
-	0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x79, 0x0a, 0x15, 0x44, 0x6f, 0x77, 0x6e, 0x6c,
-	0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74,
-	0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
-	0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c,
-	0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x30,
-	0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61,
-	0x70, 0x69, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73,
-	0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x22, 0x00, 0x12, 0x71, 0x0a, 0x17, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69,
-	0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x56, 0x32, 0x12, 0x2c, 0x2e,
-	0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70,
-	0x69, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41,
-	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x24, 0x2e, 0x61, 0x70,
+	0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67,
+	0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x23, 0x57,
+	0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e,
+	0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69,
+	0x74, 0x79, 0x12, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+	0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74,
+	0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76,
+	0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16,
+	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x73, 0x0a, 0x13, 0x55, 0x70, 0x6c, 0x6f,
+	0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12,
+	0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f,
+	0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41,
+	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2e, 0x2e, 0x61, 0x70,
 	0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e,
-	0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e,
-	0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x79, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65,
-	0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c,
-	0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61,
-	0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73,
-	0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x30, 0x2e, 0x61,
+	0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66,
+	0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a,
+	0x15, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69,
+	0x66, 0x61, 0x63, 0x74, 0x56, 0x32, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61,
+	0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x2e, 0x2e, 0x61,
 	0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69,
-	0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72,
-	0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
-	0x12, 0x91, 0x01, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41,
-	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
-	0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65,
-	0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x38, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63,
-	0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f,
-	0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46,
-	0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x22, 0x00, 0x12, 0x94, 0x01, 0x0a, 0x1e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54,
-	0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41,
-	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x35, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f,
-	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6e, 0x64,
-	0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c,
-	0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x39,
-	0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61,
-	0x70, 0x69, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74,
-	0x65, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63,
-	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x1e, 0x4c,
-	0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74,
-	0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x12, 0x16, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74,
-	0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69,
-	0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73,
-	0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x22, 0x00, 0x42, 0x52, 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
-	0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2d, 0x74, 0x65, 0x63, 0x68, 0x2f, 0x6b,
-	0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x6c, 0x61,
-	0x6e, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73,
-	0x5f, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x62, 0x69,
-	0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69,
+	0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01,
+	0x12, 0x79, 0x0a, 0x15, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65,
+	0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f,
+	0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x6f,
+	0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66,
+	0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x6f, 0x77, 0x6e,
+	0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63,
+	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x17, 0x44,
+	0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69,
+	0x66, 0x61, 0x63, 0x74, 0x56, 0x32, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e,
+	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c,
+	0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74,
+	0x41, 0x72, 0x67, 0x73, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61,
+	0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65,
+	0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x79,
+	0x0a, 0x15, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41,
+	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72,
+	0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63,
+	0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74,
+	0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57,
+	0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1d, 0x53, 0x74,
+	0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74,
+	0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x34, 0x2e, 0x61, 0x70,
+	0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e,
+	0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61,
+	0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67,
+	0x73, 0x1a, 0x38, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
+	0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73,
+	0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a,
+	0x1e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61,
+	0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x12,
+	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74,
+	0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d,
+	0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x42, 0x52, 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
+	0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2d, 0x74, 0x65, 0x63, 0x68,
+	0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f,
+	0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73,
+	0x69, 0x73, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x70, 0x69, 0x5f,
+	0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -3360,7 +3152,7 @@ func file_api_container_service_proto_rawDescGZIP() []byte {
 }
 
 var file_api_container_service_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
-var file_api_container_service_proto_msgTypes = make([]protoimpl.MessageInfo, 45)
+var file_api_container_service_proto_msgTypes = make([]protoimpl.MessageInfo, 41)
 var file_api_container_service_proto_goTypes = []interface{}{
 	(KurtosisFeatureFlag)(0),                                   // 0: api_container_api.KurtosisFeatureFlag
 	(Port_TransportProtocol)(0),                                // 1: api_container_api.Port.TransportProtocol
@@ -3399,22 +3191,18 @@ var file_api_container_service_proto_goTypes = []interface{}{
 	(*StoreWebFilesArtifactResponse)(nil),                      // 34: api_container_api.StoreWebFilesArtifactResponse
 	(*StoreFilesArtifactFromServiceArgs)(nil),                  // 35: api_container_api.StoreFilesArtifactFromServiceArgs
 	(*StoreFilesArtifactFromServiceResponse)(nil),              // 36: api_container_api.StoreFilesArtifactFromServiceResponse
-	(*RenderTemplatesToFilesArtifactArgs)(nil),                 // 37: api_container_api.RenderTemplatesToFilesArtifactArgs
-	(*RenderTemplatesToFilesArtifactResponse)(nil),             // 38: api_container_api.RenderTemplatesToFilesArtifactResponse
-	(*FilesArtifactNameAndUuid)(nil),                           // 39: api_container_api.FilesArtifactNameAndUuid
-	(*ListFilesArtifactNamesAndUuidsResponse)(nil),             // 40: api_container_api.ListFilesArtifactNamesAndUuidsResponse
-	nil, // 41: api_container_api.ServiceInfo.PrivatePortsEntry
-	nil, // 42: api_container_api.ServiceInfo.MaybePublicPortsEntry
-	nil, // 43: api_container_api.GetServicesArgs.ServiceIdentifiersEntry
-	nil, // 44: api_container_api.GetServicesResponse.ServiceInfoEntry
-	(*RenderTemplatesToFilesArtifactArgs_TemplateAndData)(nil), // 45: api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData
-	nil,                   // 46: api_container_api.RenderTemplatesToFilesArtifactArgs.TemplatesAndDataByDestinationRelFilepathEntry
-	(*emptypb.Empty)(nil), // 47: google.protobuf.Empty
+	(*FilesArtifactNameAndUuid)(nil),                           // 37: api_container_api.FilesArtifactNameAndUuid
+	(*ListFilesArtifactNamesAndUuidsResponse)(nil),             // 38: api_container_api.ListFilesArtifactNamesAndUuidsResponse
+	nil,                   // 39: api_container_api.ServiceInfo.PrivatePortsEntry
+	nil,                   // 40: api_container_api.ServiceInfo.MaybePublicPortsEntry
+	nil,                   // 41: api_container_api.GetServicesArgs.ServiceIdentifiersEntry
+	nil,                   // 42: api_container_api.GetServicesResponse.ServiceInfoEntry
+	(*emptypb.Empty)(nil), // 43: google.protobuf.Empty
 }
 var file_api_container_service_proto_depIdxs = []int32{
 	1,  // 0: api_container_api.Port.transport_protocol:type_name -> api_container_api.Port.TransportProtocol
-	41, // 1: api_container_api.ServiceInfo.private_ports:type_name -> api_container_api.ServiceInfo.PrivatePortsEntry
-	42, // 2: api_container_api.ServiceInfo.maybe_public_ports:type_name -> api_container_api.ServiceInfo.MaybePublicPortsEntry
+	39, // 1: api_container_api.ServiceInfo.private_ports:type_name -> api_container_api.ServiceInfo.PrivatePortsEntry
+	40, // 2: api_container_api.ServiceInfo.maybe_public_ports:type_name -> api_container_api.ServiceInfo.MaybePublicPortsEntry
 	0,  // 3: api_container_api.RunStarlarkScriptArgs.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag
 	0,  // 4: api_container_api.RunStarlarkPackageArgs.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag
 	9,  // 5: api_container_api.StarlarkRunResponseLine.instruction:type_name -> api_container_api.StarlarkInstruction
@@ -3428,53 +3216,49 @@ var file_api_container_service_proto_depIdxs = []int32{
 	14, // 13: api_container_api.StarlarkError.interpretation_error:type_name -> api_container_api.StarlarkInterpretationError
 	15, // 14: api_container_api.StarlarkError.validation_error:type_name -> api_container_api.StarlarkValidationError
 	16, // 15: api_container_api.StarlarkError.execution_error:type_name -> api_container_api.StarlarkExecutionError
-	43, // 16: api_container_api.GetServicesArgs.service_identifiers:type_name -> api_container_api.GetServicesArgs.ServiceIdentifiersEntry
-	44, // 17: api_container_api.GetServicesResponse.service_info:type_name -> api_container_api.GetServicesResponse.ServiceInfoEntry
+	41, // 16: api_container_api.GetServicesArgs.service_identifiers:type_name -> api_container_api.GetServicesArgs.ServiceIdentifiersEntry
+	42, // 17: api_container_api.GetServicesResponse.service_info:type_name -> api_container_api.GetServicesResponse.ServiceInfoEntry
 	21, // 18: api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse.allIdentifiers:type_name -> api_container_api.ServiceIdentifiers
 	28, // 19: api_container_api.StreamedDataChunk.metadata:type_name -> api_container_api.DataChunkMetadata
-	46, // 20: api_container_api.RenderTemplatesToFilesArtifactArgs.templates_and_data_by_destination_rel_filepath:type_name -> api_container_api.RenderTemplatesToFilesArtifactArgs.TemplatesAndDataByDestinationRelFilepathEntry
-	39, // 21: api_container_api.ListFilesArtifactNamesAndUuidsResponse.file_names_and_uuids:type_name -> api_container_api.FilesArtifactNameAndUuid
-	2,  // 22: api_container_api.ServiceInfo.PrivatePortsEntry.value:type_name -> api_container_api.Port
-	2,  // 23: api_container_api.ServiceInfo.MaybePublicPortsEntry.value:type_name -> api_container_api.Port
-	3,  // 24: api_container_api.GetServicesResponse.ServiceInfoEntry.value:type_name -> api_container_api.ServiceInfo
-	45, // 25: api_container_api.RenderTemplatesToFilesArtifactArgs.TemplatesAndDataByDestinationRelFilepathEntry.value:type_name -> api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData
-	5,  // 26: api_container_api.ApiContainerService.RunStarlarkScript:input_type -> api_container_api.RunStarlarkScriptArgs
-	27, // 27: api_container_api.ApiContainerService.UploadStarlarkPackage:input_type -> api_container_api.StreamedDataChunk
-	6,  // 28: api_container_api.ApiContainerService.RunStarlarkPackage:input_type -> api_container_api.RunStarlarkPackageArgs
-	19, // 29: api_container_api.ApiContainerService.GetServices:input_type -> api_container_api.GetServicesArgs
-	47, // 30: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:input_type -> google.protobuf.Empty
-	23, // 31: api_container_api.ApiContainerService.ExecCommand:input_type -> api_container_api.ExecCommandArgs
-	25, // 32: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:input_type -> api_container_api.WaitForHttpGetEndpointAvailabilityArgs
-	26, // 33: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:input_type -> api_container_api.WaitForHttpPostEndpointAvailabilityArgs
-	29, // 34: api_container_api.ApiContainerService.UploadFilesArtifact:input_type -> api_container_api.UploadFilesArtifactArgs
-	27, // 35: api_container_api.ApiContainerService.UploadFilesArtifactV2:input_type -> api_container_api.StreamedDataChunk
-	31, // 36: api_container_api.ApiContainerService.DownloadFilesArtifact:input_type -> api_container_api.DownloadFilesArtifactArgs
-	31, // 37: api_container_api.ApiContainerService.DownloadFilesArtifactV2:input_type -> api_container_api.DownloadFilesArtifactArgs
-	33, // 38: api_container_api.ApiContainerService.StoreWebFilesArtifact:input_type -> api_container_api.StoreWebFilesArtifactArgs
-	35, // 39: api_container_api.ApiContainerService.StoreFilesArtifactFromService:input_type -> api_container_api.StoreFilesArtifactFromServiceArgs
-	37, // 40: api_container_api.ApiContainerService.RenderTemplatesToFilesArtifact:input_type -> api_container_api.RenderTemplatesToFilesArtifactArgs
-	47, // 41: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:input_type -> google.protobuf.Empty
-	7,  // 42: api_container_api.ApiContainerService.RunStarlarkScript:output_type -> api_container_api.StarlarkRunResponseLine
-	47, // 43: api_container_api.ApiContainerService.UploadStarlarkPackage:output_type -> google.protobuf.Empty
-	7,  // 44: api_container_api.ApiContainerService.RunStarlarkPackage:output_type -> api_container_api.StarlarkRunResponseLine
-	20, // 45: api_container_api.ApiContainerService.GetServices:output_type -> api_container_api.GetServicesResponse
-	22, // 46: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:output_type -> api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse
-	24, // 47: api_container_api.ApiContainerService.ExecCommand:output_type -> api_container_api.ExecCommandResponse
-	47, // 48: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:output_type -> google.protobuf.Empty
-	47, // 49: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:output_type -> google.protobuf.Empty
-	30, // 50: api_container_api.ApiContainerService.UploadFilesArtifact:output_type -> api_container_api.UploadFilesArtifactResponse
-	30, // 51: api_container_api.ApiContainerService.UploadFilesArtifactV2:output_type -> api_container_api.UploadFilesArtifactResponse
-	32, // 52: api_container_api.ApiContainerService.DownloadFilesArtifact:output_type -> api_container_api.DownloadFilesArtifactResponse
-	27, // 53: api_container_api.ApiContainerService.DownloadFilesArtifactV2:output_type -> api_container_api.StreamedDataChunk
-	34, // 54: api_container_api.ApiContainerService.StoreWebFilesArtifact:output_type -> api_container_api.StoreWebFilesArtifactResponse
-	36, // 55: api_container_api.ApiContainerService.StoreFilesArtifactFromService:output_type -> api_container_api.StoreFilesArtifactFromServiceResponse
-	38, // 56: api_container_api.ApiContainerService.RenderTemplatesToFilesArtifact:output_type -> api_container_api.RenderTemplatesToFilesArtifactResponse
-	40, // 57: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:output_type -> api_container_api.ListFilesArtifactNamesAndUuidsResponse
-	42, // [42:58] is the sub-list for method output_type
-	26, // [26:42] is the sub-list for method input_type
-	26, // [26:26] is the sub-list for extension type_name
-	26, // [26:26] is the sub-list for extension extendee
-	0,  // [0:26] is the sub-list for field type_name
+	37, // 20: api_container_api.ListFilesArtifactNamesAndUuidsResponse.file_names_and_uuids:type_name -> api_container_api.FilesArtifactNameAndUuid
+	2,  // 21: api_container_api.ServiceInfo.PrivatePortsEntry.value:type_name -> api_container_api.Port
+	2,  // 22: api_container_api.ServiceInfo.MaybePublicPortsEntry.value:type_name -> api_container_api.Port
+	3,  // 23: api_container_api.GetServicesResponse.ServiceInfoEntry.value:type_name -> api_container_api.ServiceInfo
+	5,  // 24: api_container_api.ApiContainerService.RunStarlarkScript:input_type -> api_container_api.RunStarlarkScriptArgs
+	27, // 25: api_container_api.ApiContainerService.UploadStarlarkPackage:input_type -> api_container_api.StreamedDataChunk
+	6,  // 26: api_container_api.ApiContainerService.RunStarlarkPackage:input_type -> api_container_api.RunStarlarkPackageArgs
+	19, // 27: api_container_api.ApiContainerService.GetServices:input_type -> api_container_api.GetServicesArgs
+	43, // 28: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:input_type -> google.protobuf.Empty
+	23, // 29: api_container_api.ApiContainerService.ExecCommand:input_type -> api_container_api.ExecCommandArgs
+	25, // 30: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:input_type -> api_container_api.WaitForHttpGetEndpointAvailabilityArgs
+	26, // 31: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:input_type -> api_container_api.WaitForHttpPostEndpointAvailabilityArgs
+	29, // 32: api_container_api.ApiContainerService.UploadFilesArtifact:input_type -> api_container_api.UploadFilesArtifactArgs
+	27, // 33: api_container_api.ApiContainerService.UploadFilesArtifactV2:input_type -> api_container_api.StreamedDataChunk
+	31, // 34: api_container_api.ApiContainerService.DownloadFilesArtifact:input_type -> api_container_api.DownloadFilesArtifactArgs
+	31, // 35: api_container_api.ApiContainerService.DownloadFilesArtifactV2:input_type -> api_container_api.DownloadFilesArtifactArgs
+	33, // 36: api_container_api.ApiContainerService.StoreWebFilesArtifact:input_type -> api_container_api.StoreWebFilesArtifactArgs
+	35, // 37: api_container_api.ApiContainerService.StoreFilesArtifactFromService:input_type -> api_container_api.StoreFilesArtifactFromServiceArgs
+	43, // 38: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:input_type -> google.protobuf.Empty
+	7,  // 39: api_container_api.ApiContainerService.RunStarlarkScript:output_type -> api_container_api.StarlarkRunResponseLine
+	43, // 40: api_container_api.ApiContainerService.UploadStarlarkPackage:output_type -> google.protobuf.Empty
+	7,  // 41: api_container_api.ApiContainerService.RunStarlarkPackage:output_type -> api_container_api.StarlarkRunResponseLine
+	20, // 42: api_container_api.ApiContainerService.GetServices:output_type -> api_container_api.GetServicesResponse
+	22, // 43: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:output_type -> api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse
+	24, // 44: api_container_api.ApiContainerService.ExecCommand:output_type -> api_container_api.ExecCommandResponse
+	43, // 45: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:output_type -> google.protobuf.Empty
+	43, // 46: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:output_type -> google.protobuf.Empty
+	30, // 47: api_container_api.ApiContainerService.UploadFilesArtifact:output_type -> api_container_api.UploadFilesArtifactResponse
+	30, // 48: api_container_api.ApiContainerService.UploadFilesArtifactV2:output_type -> api_container_api.UploadFilesArtifactResponse
+	32, // 49: api_container_api.ApiContainerService.DownloadFilesArtifact:output_type -> api_container_api.DownloadFilesArtifactResponse
+	27, // 50: api_container_api.ApiContainerService.DownloadFilesArtifactV2:output_type -> api_container_api.StreamedDataChunk
+	34, // 51: api_container_api.ApiContainerService.StoreWebFilesArtifact:output_type -> api_container_api.StoreWebFilesArtifactResponse
+	36, // 52: api_container_api.ApiContainerService.StoreFilesArtifactFromService:output_type -> api_container_api.StoreFilesArtifactFromServiceResponse
+	38, // 53: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:output_type -> api_container_api.ListFilesArtifactNamesAndUuidsResponse
+	39, // [39:54] is the sub-list for method output_type
+	24, // [24:39] is the sub-list for method input_type
+	24, // [24:24] is the sub-list for extension type_name
+	24, // [24:24] is the sub-list for extension extendee
+	0,  // [0:24] is the sub-list for field type_name
 }
 
 func init() { file_api_container_service_proto_init() }
@@ -3904,30 +3688,6 @@ func file_api_container_service_proto_init() {
 			}
 		}
 		file_api_container_service_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*RenderTemplatesToFilesArtifactArgs); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_api_container_service_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*RenderTemplatesToFilesArtifactResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_api_container_service_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FilesArtifactNameAndUuid); i {
 			case 0:
 				return &v.state
@@ -3939,7 +3699,7 @@ func file_api_container_service_proto_init() {
 				return nil
 			}
 		}
-		file_api_container_service_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
+		file_api_container_service_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ListFilesArtifactNamesAndUuidsResponse); i {
 			case 0:
 				return &v.state
@@ -3951,18 +3711,6 @@ func file_api_container_service_proto_init() {
 				return nil
 			}
 		}
-		file_api_container_service_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*RenderTemplatesToFilesArtifactArgs_TemplateAndData); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 	}
 	file_api_container_service_proto_msgTypes[2].OneofWrappers = []interface{}{}
 	file_api_container_service_proto_msgTypes[3].OneofWrappers = []interface{}{}
@@ -3991,7 +3739,7 @@ func file_api_container_service_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_api_container_service_proto_rawDesc,
 			NumEnums:      2,
-			NumMessages:   45,
+			NumMessages:   41,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc.pb.go b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc.pb.go
index 0baa6498a..49ec64a61 100644
--- a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc.pb.go
+++ b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc.pb.go
@@ -34,7 +34,6 @@ const (
 	ApiContainerService_DownloadFilesArtifactV2_FullMethodName                    = "/api_container_api.ApiContainerService/DownloadFilesArtifactV2"
 	ApiContainerService_StoreWebFilesArtifact_FullMethodName                      = "/api_container_api.ApiContainerService/StoreWebFilesArtifact"
 	ApiContainerService_StoreFilesArtifactFromService_FullMethodName              = "/api_container_api.ApiContainerService/StoreFilesArtifactFromService"
-	ApiContainerService_RenderTemplatesToFilesArtifact_FullMethodName             = "/api_container_api.ApiContainerService/RenderTemplatesToFilesArtifact"
 	ApiContainerService_ListFilesArtifactNamesAndUuids_FullMethodName             = "/api_container_api.ApiContainerService/ListFilesArtifactNamesAndUuids"
 )
 
@@ -74,8 +73,6 @@ type ApiContainerServiceClient interface {
 	StoreWebFilesArtifact(ctx context.Context, in *StoreWebFilesArtifactArgs, opts ...grpc.CallOption) (*StoreWebFilesArtifactResponse, error)
 	// Tells the API container to copy a files artifact from a service to the Kurtosis File System
 	StoreFilesArtifactFromService(ctx context.Context, in *StoreFilesArtifactFromServiceArgs, opts ...grpc.CallOption) (*StoreFilesArtifactFromServiceResponse, error)
-	// Renders the templates and their data to a files artifact in the Kurtosis File System
-	RenderTemplatesToFilesArtifact(ctx context.Context, in *RenderTemplatesToFilesArtifactArgs, opts ...grpc.CallOption) (*RenderTemplatesToFilesArtifactResponse, error)
 	ListFilesArtifactNamesAndUuids(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListFilesArtifactNamesAndUuidsResponse, error)
 }
 
@@ -332,15 +329,6 @@ func (c *apiContainerServiceClient) StoreFilesArtifactFromService(ctx context.Co
 	return out, nil
 }
 
-func (c *apiContainerServiceClient) RenderTemplatesToFilesArtifact(ctx context.Context, in *RenderTemplatesToFilesArtifactArgs, opts ...grpc.CallOption) (*RenderTemplatesToFilesArtifactResponse, error) {
-	out := new(RenderTemplatesToFilesArtifactResponse)
-	err := c.cc.Invoke(ctx, ApiContainerService_RenderTemplatesToFilesArtifact_FullMethodName, in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
 func (c *apiContainerServiceClient) ListFilesArtifactNamesAndUuids(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListFilesArtifactNamesAndUuidsResponse, error) {
 	out := new(ListFilesArtifactNamesAndUuidsResponse)
 	err := c.cc.Invoke(ctx, ApiContainerService_ListFilesArtifactNamesAndUuids_FullMethodName, in, out, opts...)
@@ -386,8 +374,6 @@ type ApiContainerServiceServer interface {
 	StoreWebFilesArtifact(context.Context, *StoreWebFilesArtifactArgs) (*StoreWebFilesArtifactResponse, error)
 	// Tells the API container to copy a files artifact from a service to the Kurtosis File System
 	StoreFilesArtifactFromService(context.Context, *StoreFilesArtifactFromServiceArgs) (*StoreFilesArtifactFromServiceResponse, error)
-	// Renders the templates and their data to a files artifact in the Kurtosis File System
-	RenderTemplatesToFilesArtifact(context.Context, *RenderTemplatesToFilesArtifactArgs) (*RenderTemplatesToFilesArtifactResponse, error)
 	ListFilesArtifactNamesAndUuids(context.Context, *emptypb.Empty) (*ListFilesArtifactNamesAndUuidsResponse, error)
 }
 
@@ -437,9 +423,6 @@ func (UnimplementedApiContainerServiceServer) StoreWebFilesArtifact(context.Cont
 func (UnimplementedApiContainerServiceServer) StoreFilesArtifactFromService(context.Context, *StoreFilesArtifactFromServiceArgs) (*StoreFilesArtifactFromServiceResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method StoreFilesArtifactFromService not implemented")
 }
-func (UnimplementedApiContainerServiceServer) RenderTemplatesToFilesArtifact(context.Context, *RenderTemplatesToFilesArtifactArgs) (*RenderTemplatesToFilesArtifactResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method RenderTemplatesToFilesArtifact not implemented")
-}
 func (UnimplementedApiContainerServiceServer) ListFilesArtifactNamesAndUuids(context.Context, *emptypb.Empty) (*ListFilesArtifactNamesAndUuidsResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method ListFilesArtifactNamesAndUuids not implemented")
 }
@@ -732,24 +715,6 @@ func _ApiContainerService_StoreFilesArtifactFromService_Handler(srv interface{},
 	return interceptor(ctx, in, info, handler)
 }
 
-func _ApiContainerService_RenderTemplatesToFilesArtifact_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(RenderTemplatesToFilesArtifactArgs)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(ApiContainerServiceServer).RenderTemplatesToFilesArtifact(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: ApiContainerService_RenderTemplatesToFilesArtifact_FullMethodName,
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(ApiContainerServiceServer).RenderTemplatesToFilesArtifact(ctx, req.(*RenderTemplatesToFilesArtifactArgs))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
 func _ApiContainerService_ListFilesArtifactNamesAndUuids_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(emptypb.Empty)
 	if err := dec(in); err != nil {
@@ -811,10 +776,6 @@ var ApiContainerService_ServiceDesc = grpc.ServiceDesc{
 			MethodName: "StoreFilesArtifactFromService",
 			Handler:    _ApiContainerService_StoreFilesArtifactFromService_Handler,
 		},
-		{
-			MethodName: "RenderTemplatesToFilesArtifact",
-			Handler:    _ApiContainerService_RenderTemplatesToFilesArtifact_Handler,
-		},
 		{
 			MethodName: "ListFilesArtifactNamesAndUuids",
 			Handler:    _ApiContainerService_ListFilesArtifactNamesAndUuids_Handler,
diff --git a/api/golang/core/lib/binding_constructors/binding_constructors.go b/api/golang/core/lib/binding_constructors/binding_constructors.go
index 8ae5f3aba..731b68a0b 100644
--- a/api/golang/core/lib/binding_constructors/binding_constructors.go
+++ b/api/golang/core/lib/binding_constructors/binding_constructors.go
@@ -365,22 +365,3 @@ func DownloadFilesArtifactArgs(fileIdentifier string) *kurtosis_core_rpc_api_bin
 		Identifier: fileIdentifier,
 	}
 }
-
-// ==============================================================================================
-//
-//	Render Templates To Files Artifact
-//
-// ==============================================================================================
-
-func NewTemplateAndData(template string, dataAsJson string) *kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData {
-	return &kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData{
-		Template:   template,
-		DataAsJson: dataAsJson,
-	}
-}
-
-func NewRenderTemplatesToFilesArtifactResponse(filesArtifactUuid string) *kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactResponse {
-	return &kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactResponse{
-		Uuid: filesArtifactUuid,
-	}
-}
diff --git a/api/protobuf/core/api_container_service.proto b/api/protobuf/core/api_container_service.proto
index db5d0381b..a4d1e4d95 100644
--- a/api/protobuf/core/api_container_service.proto
+++ b/api/protobuf/core/api_container_service.proto
@@ -54,9 +54,6 @@ service ApiContainerService {
   // Tells the API container to copy a files artifact from a service to the Kurtosis File System
   rpc StoreFilesArtifactFromService(StoreFilesArtifactFromServiceArgs) returns (StoreFilesArtifactFromServiceResponse) {}
 
-  // Renders the templates and their data to a files artifact in the Kurtosis File System
-  rpc RenderTemplatesToFilesArtifact(RenderTemplatesToFilesArtifactArgs) returns (RenderTemplatesToFilesArtifactResponse) {}
-
   rpc ListFilesArtifactNamesAndUuids(google.protobuf.Empty) returns (ListFilesArtifactNamesAndUuidsResponse) {}
 }
 
@@ -440,33 +437,6 @@ message StoreFilesArtifactFromServiceResponse {
   string uuid = 1;
 }
 
-// ==============================================================================================
-//                               Render Templates To Files Artifact
-// ==============================================================================================
-
-message RenderTemplatesToFilesArtifactArgs {
-  // An object representing the template and the data that needs to be inserted
-  message TemplateAndData {
-    // A string representation of the template file
-    string template = 1;
-
-    // A json string representation of the data to be written to template
-    string data_as_json = 2;
-  }
-
-  // A map of template and its data by the path of the file relative to the root of the files artifact it will be rendered into.
-  map <string, TemplateAndData> templates_and_data_by_destination_rel_filepath = 1;
-
-  // Name of the files artifact
-  string name = 2;
-}
-
-message RenderTemplatesToFilesArtifactResponse {
-  // UUID of the files artifact, for use when referencing it in the future
-  string uuid = 1;
-}
-
-
 // ==============================================================================================
 //                               List Files Artifact Names And Uuids
 // ==============================================================================================
diff --git a/api/rust/src/api_container_api.rs b/api/rust/src/api_container_api.rs
index c622a7fc1..1dfea7921 100644
--- a/api/rust/src/api_container_api.rs
+++ b/api/rust/src/api_container_api.rs
@@ -536,40 +536,6 @@ pub struct StoreFilesArtifactFromServiceResponse {
 }
 #[allow(clippy::derive_partial_eq_without_eq)]
 #[derive(Clone, PartialEq, ::prost::Message)]
-pub struct RenderTemplatesToFilesArtifactArgs {
-    /// A map of template and its data by the path of the file relative to the root of the files artifact it will be rendered into.
-    #[prost(map = "string, message", tag = "1")]
-    pub templates_and_data_by_destination_rel_filepath: ::std::collections::HashMap<
-        ::prost::alloc::string::String,
-        render_templates_to_files_artifact_args::TemplateAndData,
-    >,
-    /// Name of the files artifact
-    #[prost(string, tag = "2")]
-    pub name: ::prost::alloc::string::String,
-}
-/// Nested message and enum types in `RenderTemplatesToFilesArtifactArgs`.
-pub mod render_templates_to_files_artifact_args {
-    /// An object representing the template and the data that needs to be inserted
-    #[allow(clippy::derive_partial_eq_without_eq)]
-    #[derive(Clone, PartialEq, ::prost::Message)]
-    pub struct TemplateAndData {
-        /// A string representation of the template file
-        #[prost(string, tag = "1")]
-        pub template: ::prost::alloc::string::String,
-        /// A json string representation of the data to be written to template
-        #[prost(string, tag = "2")]
-        pub data_as_json: ::prost::alloc::string::String,
-    }
-}
-#[allow(clippy::derive_partial_eq_without_eq)]
-#[derive(Clone, PartialEq, ::prost::Message)]
-pub struct RenderTemplatesToFilesArtifactResponse {
-    /// UUID of the files artifact, for use when referencing it in the future
-    #[prost(string, tag = "1")]
-    pub uuid: ::prost::alloc::string::String,
-}
-#[allow(clippy::derive_partial_eq_without_eq)]
-#[derive(Clone, PartialEq, ::prost::Message)]
 pub struct FilesArtifactNameAndUuid {
     /// A string representing the name of the file
     #[prost(string, tag = "1")]
@@ -1125,37 +1091,6 @@ pub mod api_container_service_client {
                 );
             self.inner.unary(req, path, codec).await
         }
-        /// Renders the templates and their data to a files artifact in the Kurtosis File System
-        pub async fn render_templates_to_files_artifact(
-            &mut self,
-            request: impl tonic::IntoRequest<super::RenderTemplatesToFilesArtifactArgs>,
-        ) -> std::result::Result<
-            tonic::Response<super::RenderTemplatesToFilesArtifactResponse>,
-            tonic::Status,
-        > {
-            self.inner
-                .ready()
-                .await
-                .map_err(|e| {
-                    tonic::Status::new(
-                        tonic::Code::Unknown,
-                        format!("Service was not ready: {}", e.into()),
-                    )
-                })?;
-            let codec = tonic::codec::ProstCodec::default();
-            let path = http::uri::PathAndQuery::from_static(
-                "/api_container_api.ApiContainerService/RenderTemplatesToFilesArtifact",
-            );
-            let mut req = request.into_request();
-            req.extensions_mut()
-                .insert(
-                    GrpcMethod::new(
-                        "api_container_api.ApiContainerService",
-                        "RenderTemplatesToFilesArtifact",
-                    ),
-                );
-            self.inner.unary(req, path, codec).await
-        }
         pub async fn list_files_artifact_names_and_uuids(
             &mut self,
             request: impl tonic::IntoRequest<()>,
@@ -1320,14 +1255,6 @@ pub mod api_container_service_server {
             tonic::Response<super::StoreFilesArtifactFromServiceResponse>,
             tonic::Status,
         >;
-        /// Renders the templates and their data to a files artifact in the Kurtosis File System
-        async fn render_templates_to_files_artifact(
-            &self,
-            request: tonic::Request<super::RenderTemplatesToFilesArtifactArgs>,
-        ) -> std::result::Result<
-            tonic::Response<super::RenderTemplatesToFilesArtifactResponse>,
-            tonic::Status,
-        >;
         async fn list_files_artifact_names_and_uuids(
             &self,
             request: tonic::Request<()>,
@@ -2094,57 +2021,6 @@ pub mod api_container_service_server {
                     };
                     Box::pin(fut)
                 }
-                "/api_container_api.ApiContainerService/RenderTemplatesToFilesArtifact" => {
-                    #[allow(non_camel_case_types)]
-                    struct RenderTemplatesToFilesArtifactSvc<T: ApiContainerService>(
-                        pub Arc<T>,
-                    );
-                    impl<
-                        T: ApiContainerService,
-                    > tonic::server::UnaryService<
-                        super::RenderTemplatesToFilesArtifactArgs,
-                    > for RenderTemplatesToFilesArtifactSvc<T> {
-                        type Response = super::RenderTemplatesToFilesArtifactResponse;
-                        type Future = BoxFuture<
-                            tonic::Response<Self::Response>,
-                            tonic::Status,
-                        >;
-                        fn call(
-                            &mut self,
-                            request: tonic::Request<
-                                super::RenderTemplatesToFilesArtifactArgs,
-                            >,
-                        ) -> Self::Future {
-                            let inner = Arc::clone(&self.0);
-                            let fut = async move {
-                                (*inner).render_templates_to_files_artifact(request).await
-                            };
-                            Box::pin(fut)
-                        }
-                    }
-                    let accept_compression_encodings = self.accept_compression_encodings;
-                    let send_compression_encodings = self.send_compression_encodings;
-                    let max_decoding_message_size = self.max_decoding_message_size;
-                    let max_encoding_message_size = self.max_encoding_message_size;
-                    let inner = self.inner.clone();
-                    let fut = async move {
-                        let inner = inner.0;
-                        let method = RenderTemplatesToFilesArtifactSvc(inner);
-                        let codec = tonic::codec::ProstCodec::default();
-                        let mut grpc = tonic::server::Grpc::new(codec)
-                            .apply_compression_config(
-                                accept_compression_encodings,
-                                send_compression_encodings,
-                            )
-                            .apply_max_message_size_config(
-                                max_decoding_message_size,
-                                max_encoding_message_size,
-                            );
-                        let res = grpc.unary(method, req).await;
-                        Ok(res)
-                    };
-                    Box::pin(fut)
-                }
                 "/api_container_api.ApiContainerService/ListFilesArtifactNamesAndUuids" => {
                     #[allow(non_camel_case_types)]
                     struct ListFilesArtifactNamesAndUuidsSvc<T: ApiContainerService>(
diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_pb.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_pb.d.ts
index d28bfc96c..3372ab2b1 100644
--- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_pb.d.ts
+++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_pb.d.ts
@@ -22,7 +22,6 @@ interface IApiContainerServiceService extends grpc.ServiceDefinition<grpc.Untype
   downloadFilesArtifactV2: grpc.MethodDefinition<api_container_service_pb.DownloadFilesArtifactArgs, api_container_service_pb.StreamedDataChunk>;
   storeWebFilesArtifact: grpc.MethodDefinition<api_container_service_pb.StoreWebFilesArtifactArgs, api_container_service_pb.StoreWebFilesArtifactResponse>;
   storeFilesArtifactFromService: grpc.MethodDefinition<api_container_service_pb.StoreFilesArtifactFromServiceArgs, api_container_service_pb.StoreFilesArtifactFromServiceResponse>;
-  renderTemplatesToFilesArtifact: grpc.MethodDefinition<api_container_service_pb.RenderTemplatesToFilesArtifactArgs, api_container_service_pb.RenderTemplatesToFilesArtifactResponse>;
   listFilesArtifactNamesAndUuids: grpc.MethodDefinition<google_protobuf_empty_pb.Empty, api_container_service_pb.ListFilesArtifactNamesAndUuidsResponse>;
 }
 
@@ -43,7 +42,6 @@ export interface IApiContainerServiceServer extends grpc.UntypedServiceImplement
   downloadFilesArtifactV2: grpc.handleServerStreamingCall<api_container_service_pb.DownloadFilesArtifactArgs, api_container_service_pb.StreamedDataChunk>;
   storeWebFilesArtifact: grpc.handleUnaryCall<api_container_service_pb.StoreWebFilesArtifactArgs, api_container_service_pb.StoreWebFilesArtifactResponse>;
   storeFilesArtifactFromService: grpc.handleUnaryCall<api_container_service_pb.StoreFilesArtifactFromServiceArgs, api_container_service_pb.StoreFilesArtifactFromServiceResponse>;
-  renderTemplatesToFilesArtifact: grpc.handleUnaryCall<api_container_service_pb.RenderTemplatesToFilesArtifactArgs, api_container_service_pb.RenderTemplatesToFilesArtifactResponse>;
   listFilesArtifactNamesAndUuids: grpc.handleUnaryCall<google_protobuf_empty_pb.Empty, api_container_service_pb.ListFilesArtifactNamesAndUuidsResponse>;
 }
 
@@ -88,9 +86,6 @@ export class ApiContainerServiceClient extends grpc.Client {
   storeFilesArtifactFromService(argument: api_container_service_pb.StoreFilesArtifactFromServiceArgs, callback: grpc.requestCallback<api_container_service_pb.StoreFilesArtifactFromServiceResponse>): grpc.ClientUnaryCall;
   storeFilesArtifactFromService(argument: api_container_service_pb.StoreFilesArtifactFromServiceArgs, metadataOrOptions: grpc.Metadata | grpc.CallOptions | null, callback: grpc.requestCallback<api_container_service_pb.StoreFilesArtifactFromServiceResponse>): grpc.ClientUnaryCall;
   storeFilesArtifactFromService(argument: api_container_service_pb.StoreFilesArtifactFromServiceArgs, metadata: grpc.Metadata | null, options: grpc.CallOptions | null, callback: grpc.requestCallback<api_container_service_pb.StoreFilesArtifactFromServiceResponse>): grpc.ClientUnaryCall;
-  renderTemplatesToFilesArtifact(argument: api_container_service_pb.RenderTemplatesToFilesArtifactArgs, callback: grpc.requestCallback<api_container_service_pb.RenderTemplatesToFilesArtifactResponse>): grpc.ClientUnaryCall;
-  renderTemplatesToFilesArtifact(argument: api_container_service_pb.RenderTemplatesToFilesArtifactArgs, metadataOrOptions: grpc.Metadata | grpc.CallOptions | null, callback: grpc.requestCallback<api_container_service_pb.RenderTemplatesToFilesArtifactResponse>): grpc.ClientUnaryCall;
-  renderTemplatesToFilesArtifact(argument: api_container_service_pb.RenderTemplatesToFilesArtifactArgs, metadata: grpc.Metadata | null, options: grpc.CallOptions | null, callback: grpc.requestCallback<api_container_service_pb.RenderTemplatesToFilesArtifactResponse>): grpc.ClientUnaryCall;
   listFilesArtifactNamesAndUuids(argument: google_protobuf_empty_pb.Empty, callback: grpc.requestCallback<api_container_service_pb.ListFilesArtifactNamesAndUuidsResponse>): grpc.ClientUnaryCall;
   listFilesArtifactNamesAndUuids(argument: google_protobuf_empty_pb.Empty, metadataOrOptions: grpc.Metadata | grpc.CallOptions | null, callback: grpc.requestCallback<api_container_service_pb.ListFilesArtifactNamesAndUuidsResponse>): grpc.ClientUnaryCall;
   listFilesArtifactNamesAndUuids(argument: google_protobuf_empty_pb.Empty, metadata: grpc.Metadata | null, options: grpc.CallOptions | null, callback: grpc.requestCallback<api_container_service_pb.ListFilesArtifactNamesAndUuidsResponse>): grpc.ClientUnaryCall;
diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_pb.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_pb.js
index 01598b275..f23f2dc89 100644
--- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_pb.js
+++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_pb.js
@@ -93,28 +93,6 @@ function deserialize_api_container_api_ListFilesArtifactNamesAndUuidsResponse(bu
   return api_container_service_pb.ListFilesArtifactNamesAndUuidsResponse.deserializeBinary(new Uint8Array(buffer_arg));
 }
 
-function serialize_api_container_api_RenderTemplatesToFilesArtifactArgs(arg) {
-  if (!(arg instanceof api_container_service_pb.RenderTemplatesToFilesArtifactArgs)) {
-    throw new Error('Expected argument of type api_container_api.RenderTemplatesToFilesArtifactArgs');
-  }
-  return Buffer.from(arg.serializeBinary());
-}
-
-function deserialize_api_container_api_RenderTemplatesToFilesArtifactArgs(buffer_arg) {
-  return api_container_service_pb.RenderTemplatesToFilesArtifactArgs.deserializeBinary(new Uint8Array(buffer_arg));
-}
-
-function serialize_api_container_api_RenderTemplatesToFilesArtifactResponse(arg) {
-  if (!(arg instanceof api_container_service_pb.RenderTemplatesToFilesArtifactResponse)) {
-    throw new Error('Expected argument of type api_container_api.RenderTemplatesToFilesArtifactResponse');
-  }
-  return Buffer.from(arg.serializeBinary());
-}
-
-function deserialize_api_container_api_RenderTemplatesToFilesArtifactResponse(buffer_arg) {
-  return api_container_service_pb.RenderTemplatesToFilesArtifactResponse.deserializeBinary(new Uint8Array(buffer_arg));
-}
-
 function serialize_api_container_api_RunStarlarkPackageArgs(arg) {
   if (!(arg instanceof api_container_service_pb.RunStarlarkPackageArgs)) {
     throw new Error('Expected argument of type api_container_api.RunStarlarkPackageArgs');
@@ -432,18 +410,6 @@ storeFilesArtifactFromService: {
     responseSerialize: serialize_api_container_api_StoreFilesArtifactFromServiceResponse,
     responseDeserialize: deserialize_api_container_api_StoreFilesArtifactFromServiceResponse,
   },
-  // Renders the templates and their data to a files artifact in the Kurtosis File System
-renderTemplatesToFilesArtifact: {
-    path: '/api_container_api.ApiContainerService/RenderTemplatesToFilesArtifact',
-    requestStream: false,
-    responseStream: false,
-    requestType: api_container_service_pb.RenderTemplatesToFilesArtifactArgs,
-    responseType: api_container_service_pb.RenderTemplatesToFilesArtifactResponse,
-    requestSerialize: serialize_api_container_api_RenderTemplatesToFilesArtifactArgs,
-    requestDeserialize: deserialize_api_container_api_RenderTemplatesToFilesArtifactArgs,
-    responseSerialize: serialize_api_container_api_RenderTemplatesToFilesArtifactResponse,
-    responseDeserialize: deserialize_api_container_api_RenderTemplatesToFilesArtifactResponse,
-  },
   listFilesArtifactNamesAndUuids: {
     path: '/api_container_api.ApiContainerService/ListFilesArtifactNamesAndUuids',
     requestStream: false,
diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_web_pb.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_web_pb.d.ts
index 0ac9f4260..352c5e6bd 100644
--- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_web_pb.d.ts
+++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_web_pb.d.ts
@@ -87,13 +87,6 @@ export class ApiContainerServiceClient {
                response: api_container_service_pb.StoreFilesArtifactFromServiceResponse) => void
   ): grpcWeb.ClientReadableStream<api_container_service_pb.StoreFilesArtifactFromServiceResponse>;
 
-  renderTemplatesToFilesArtifact(
-    request: api_container_service_pb.RenderTemplatesToFilesArtifactArgs,
-    metadata: grpcWeb.Metadata | undefined,
-    callback: (err: grpcWeb.RpcError,
-               response: api_container_service_pb.RenderTemplatesToFilesArtifactResponse) => void
-  ): grpcWeb.ClientReadableStream<api_container_service_pb.RenderTemplatesToFilesArtifactResponse>;
-
   listFilesArtifactNamesAndUuids(
     request: google_protobuf_empty_pb.Empty,
     metadata: grpcWeb.Metadata | undefined,
@@ -168,11 +161,6 @@ export class ApiContainerServicePromiseClient {
     metadata?: grpcWeb.Metadata
   ): Promise<api_container_service_pb.StoreFilesArtifactFromServiceResponse>;
 
-  renderTemplatesToFilesArtifact(
-    request: api_container_service_pb.RenderTemplatesToFilesArtifactArgs,
-    metadata?: grpcWeb.Metadata
-  ): Promise<api_container_service_pb.RenderTemplatesToFilesArtifactResponse>;
-
   listFilesArtifactNamesAndUuids(
     request: google_protobuf_empty_pb.Empty,
     metadata?: grpcWeb.Metadata
diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_web_pb.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_web_pb.js
index 8acbc7c29..6fc8da29c 100644
--- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_web_pb.js
+++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_web_pb.js
@@ -793,67 +793,6 @@ proto.api_container_api.ApiContainerServicePromiseClient.prototype.storeFilesArt
 };
 
 
-/**
- * @const
- * @type {!grpc.web.MethodDescriptor<
- *   !proto.api_container_api.RenderTemplatesToFilesArtifactArgs,
- *   !proto.api_container_api.RenderTemplatesToFilesArtifactResponse>}
- */
-const methodDescriptor_ApiContainerService_RenderTemplatesToFilesArtifact = new grpc.web.MethodDescriptor(
-  '/api_container_api.ApiContainerService/RenderTemplatesToFilesArtifact',
-  grpc.web.MethodType.UNARY,
-  proto.api_container_api.RenderTemplatesToFilesArtifactArgs,
-  proto.api_container_api.RenderTemplatesToFilesArtifactResponse,
-  /**
-   * @param {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs} request
-   * @return {!Uint8Array}
-   */
-  function(request) {
-    return request.serializeBinary();
-  },
-  proto.api_container_api.RenderTemplatesToFilesArtifactResponse.deserializeBinary
-);
-
-
-/**
- * @param {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs} request The
- *     request proto
- * @param {?Object<string, string>} metadata User defined
- *     call metadata
- * @param {function(?grpc.web.RpcError, ?proto.api_container_api.RenderTemplatesToFilesArtifactResponse)}
- *     callback The callback function(error, response)
- * @return {!grpc.web.ClientReadableStream<!proto.api_container_api.RenderTemplatesToFilesArtifactResponse>|undefined}
- *     The XHR Node Readable Stream
- */
-proto.api_container_api.ApiContainerServiceClient.prototype.renderTemplatesToFilesArtifact =
-    function(request, metadata, callback) {
-  return this.client_.rpcCall(this.hostname_ +
-      '/api_container_api.ApiContainerService/RenderTemplatesToFilesArtifact',
-      request,
-      metadata || {},
-      methodDescriptor_ApiContainerService_RenderTemplatesToFilesArtifact,
-      callback);
-};
-
-
-/**
- * @param {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs} request The
- *     request proto
- * @param {?Object<string, string>=} metadata User defined
- *     call metadata
- * @return {!Promise<!proto.api_container_api.RenderTemplatesToFilesArtifactResponse>}
- *     Promise that resolves to the response
- */
-proto.api_container_api.ApiContainerServicePromiseClient.prototype.renderTemplatesToFilesArtifact =
-    function(request, metadata) {
-  return this.client_.unaryCall(this.hostname_ +
-      '/api_container_api.ApiContainerService/RenderTemplatesToFilesArtifact',
-      request,
-      metadata || {},
-      methodDescriptor_ApiContainerService_RenderTemplatesToFilesArtifact);
-};
-
-
 /**
  * @const
  * @type {!grpc.web.MethodDescriptor<
diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts
index 4f5c8cbbe..25a2f546b 100644
--- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts
+++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts
@@ -1022,69 +1022,6 @@ export namespace StoreFilesArtifactFromServiceResponse {
   }
 }
 
-export class RenderTemplatesToFilesArtifactArgs extends jspb.Message {
-  getTemplatesAndDataByDestinationRelFilepathMap(): jspb.Map<string, RenderTemplatesToFilesArtifactArgs.TemplateAndData>;
-  clearTemplatesAndDataByDestinationRelFilepathMap(): RenderTemplatesToFilesArtifactArgs;
-
-  getName(): string;
-  setName(value: string): RenderTemplatesToFilesArtifactArgs;
-
-  serializeBinary(): Uint8Array;
-  toObject(includeInstance?: boolean): RenderTemplatesToFilesArtifactArgs.AsObject;
-  static toObject(includeInstance: boolean, msg: RenderTemplatesToFilesArtifactArgs): RenderTemplatesToFilesArtifactArgs.AsObject;
-  static serializeBinaryToWriter(message: RenderTemplatesToFilesArtifactArgs, writer: jspb.BinaryWriter): void;
-  static deserializeBinary(bytes: Uint8Array): RenderTemplatesToFilesArtifactArgs;
-  static deserializeBinaryFromReader(message: RenderTemplatesToFilesArtifactArgs, reader: jspb.BinaryReader): RenderTemplatesToFilesArtifactArgs;
-}
-
-export namespace RenderTemplatesToFilesArtifactArgs {
-  export type AsObject = {
-    templatesAndDataByDestinationRelFilepathMap: Array<[string, RenderTemplatesToFilesArtifactArgs.TemplateAndData.AsObject]>,
-    name: string,
-  }
-
-  export class TemplateAndData extends jspb.Message {
-    getTemplate(): string;
-    setTemplate(value: string): TemplateAndData;
-
-    getDataAsJson(): string;
-    setDataAsJson(value: string): TemplateAndData;
-
-    serializeBinary(): Uint8Array;
-    toObject(includeInstance?: boolean): TemplateAndData.AsObject;
-    static toObject(includeInstance: boolean, msg: TemplateAndData): TemplateAndData.AsObject;
-    static serializeBinaryToWriter(message: TemplateAndData, writer: jspb.BinaryWriter): void;
-    static deserializeBinary(bytes: Uint8Array): TemplateAndData;
-    static deserializeBinaryFromReader(message: TemplateAndData, reader: jspb.BinaryReader): TemplateAndData;
-  }
-
-  export namespace TemplateAndData {
-    export type AsObject = {
-      template: string,
-      dataAsJson: string,
-    }
-  }
-
-}
-
-export class RenderTemplatesToFilesArtifactResponse extends jspb.Message {
-  getUuid(): string;
-  setUuid(value: string): RenderTemplatesToFilesArtifactResponse;
-
-  serializeBinary(): Uint8Array;
-  toObject(includeInstance?: boolean): RenderTemplatesToFilesArtifactResponse.AsObject;
-  static toObject(includeInstance: boolean, msg: RenderTemplatesToFilesArtifactResponse): RenderTemplatesToFilesArtifactResponse.AsObject;
-  static serializeBinaryToWriter(message: RenderTemplatesToFilesArtifactResponse, writer: jspb.BinaryWriter): void;
-  static deserializeBinary(bytes: Uint8Array): RenderTemplatesToFilesArtifactResponse;
-  static deserializeBinaryFromReader(message: RenderTemplatesToFilesArtifactResponse, reader: jspb.BinaryReader): RenderTemplatesToFilesArtifactResponse;
-}
-
-export namespace RenderTemplatesToFilesArtifactResponse {
-  export type AsObject = {
-    uuid: string,
-  }
-}
-
 export class FilesArtifactNameAndUuid extends jspb.Message {
   getFilename(): string;
   setFilename(value: string): FilesArtifactNameAndUuid;
diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js
index a12bde060..49956ec2a 100644
--- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js
+++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js
@@ -36,9 +36,6 @@ goog.exportSymbol('proto.api_container_api.KurtosisFeatureFlag', null, global);
 goog.exportSymbol('proto.api_container_api.ListFilesArtifactNamesAndUuidsResponse', null, global);
 goog.exportSymbol('proto.api_container_api.Port', null, global);
 goog.exportSymbol('proto.api_container_api.Port.TransportProtocol', null, global);
-goog.exportSymbol('proto.api_container_api.RenderTemplatesToFilesArtifactArgs', null, global);
-goog.exportSymbol('proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData', null, global);
-goog.exportSymbol('proto.api_container_api.RenderTemplatesToFilesArtifactResponse', null, global);
 goog.exportSymbol('proto.api_container_api.RunStarlarkPackageArgs', null, global);
 goog.exportSymbol('proto.api_container_api.RunStarlarkPackageArgs.StarlarkPackageContentCase', null, global);
 goog.exportSymbol('proto.api_container_api.RunStarlarkScriptArgs', null, global);
@@ -803,69 +800,6 @@ if (goog.DEBUG && !COMPILED) {
    */
   proto.api_container_api.StoreFilesArtifactFromServiceResponse.displayName = 'proto.api_container_api.StoreFilesArtifactFromServiceResponse';
 }
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
-};
-goog.inherits(proto.api_container_api.RenderTemplatesToFilesArtifactArgs, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  /**
-   * @public
-   * @override
-   */
-  proto.api_container_api.RenderTemplatesToFilesArtifactArgs.displayName = 'proto.api_container_api.RenderTemplatesToFilesArtifactArgs';
-}
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
-};
-goog.inherits(proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  /**
-   * @public
-   * @override
-   */
-  proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.displayName = 'proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData';
-}
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactResponse = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
-};
-goog.inherits(proto.api_container_api.RenderTemplatesToFilesArtifactResponse, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  /**
-   * @public
-   * @override
-   */
-  proto.api_container_api.RenderTemplatesToFilesArtifactResponse.displayName = 'proto.api_container_api.RenderTemplatesToFilesArtifactResponse';
-}
 /**
  * Generated by JsPbCodeGenerator.
  * @param {Array=} opt_data Optional initial data array, typically from a
@@ -8160,459 +8094,6 @@ proto.api_container_api.StoreFilesArtifactFromServiceResponse.prototype.setUuid
 
 
 
-if (jspb.Message.GENERATE_TO_OBJECT) {
-/**
- * Creates an object representation of this proto.
- * Field names that are reserved in JavaScript and will be renamed to pb_name.
- * Optional fields that are not set will be set to undefined.
- * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
- * For the list of reserved names please see:
- *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
- * @param {boolean=} opt_includeInstance Deprecated. whether to include the
- *     JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @return {!Object}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.prototype.toObject = function(opt_includeInstance) {
-  return proto.api_container_api.RenderTemplatesToFilesArtifactArgs.toObject(opt_includeInstance, this);
-};
-
-
-/**
- * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Deprecated. Whether to include
- *     the JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @param {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs} msg The msg instance to transform.
- * @return {!Object}
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.toObject = function(includeInstance, msg) {
-  var f, obj = {
-    templatesAndDataByDestinationRelFilepathMap: (f = msg.getTemplatesAndDataByDestinationRelFilepathMap()) ? f.toObject(includeInstance, proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.toObject) : [],
-    name: jspb.Message.getFieldWithDefault(msg, 2, "")
-  };
-
-  if (includeInstance) {
-    obj.$jspbMessageInstance = msg;
-  }
-  return obj;
-};
-}
-
-
-/**
- * Deserializes binary data (in protobuf wire format).
- * @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.deserializeBinary = function(bytes) {
-  var reader = new jspb.BinaryReader(bytes);
-  var msg = new proto.api_container_api.RenderTemplatesToFilesArtifactArgs;
-  return proto.api_container_api.RenderTemplatesToFilesArtifactArgs.deserializeBinaryFromReader(msg, reader);
-};
-
-
-/**
- * Deserializes binary data (in protobuf wire format) from the
- * given reader into the given message object.
- * @param {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs} msg The message object to deserialize into.
- * @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.deserializeBinaryFromReader = function(msg, reader) {
-  while (reader.nextField()) {
-    if (reader.isEndGroup()) {
-      break;
-    }
-    var field = reader.getFieldNumber();
-    switch (field) {
-    case 1:
-      var value = msg.getTemplatesAndDataByDestinationRelFilepathMap();
-      reader.readMessage(value, function(message, reader) {
-        jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.deserializeBinaryFromReader, "", new proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData());
-         });
-      break;
-    case 2:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setName(value);
-      break;
-    default:
-      reader.skipField();
-      break;
-    }
-  }
-  return msg;
-};
-
-
-/**
- * Serializes the message to binary data (in protobuf wire format).
- * @return {!Uint8Array}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.prototype.serializeBinary = function() {
-  var writer = new jspb.BinaryWriter();
-  proto.api_container_api.RenderTemplatesToFilesArtifactArgs.serializeBinaryToWriter(this, writer);
-  return writer.getResultBuffer();
-};
-
-
-/**
- * Serializes the given message to binary data (in protobuf wire
- * format), writing to the given BinaryWriter.
- * @param {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs} message
- * @param {!jspb.BinaryWriter} writer
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.serializeBinaryToWriter = function(message, writer) {
-  var f = undefined;
-  f = message.getTemplatesAndDataByDestinationRelFilepathMap(true);
-  if (f && f.getLength() > 0) {
-    f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.serializeBinaryToWriter);
-  }
-  f = message.getName();
-  if (f.length > 0) {
-    writer.writeString(
-      2,
-      f
-    );
-  }
-};
-
-
-
-
-
-if (jspb.Message.GENERATE_TO_OBJECT) {
-/**
- * Creates an object representation of this proto.
- * Field names that are reserved in JavaScript and will be renamed to pb_name.
- * Optional fields that are not set will be set to undefined.
- * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
- * For the list of reserved names please see:
- *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
- * @param {boolean=} opt_includeInstance Deprecated. whether to include the
- *     JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @return {!Object}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.prototype.toObject = function(opt_includeInstance) {
-  return proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.toObject(opt_includeInstance, this);
-};
-
-
-/**
- * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Deprecated. Whether to include
- *     the JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @param {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData} msg The msg instance to transform.
- * @return {!Object}
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.toObject = function(includeInstance, msg) {
-  var f, obj = {
-    template: jspb.Message.getFieldWithDefault(msg, 1, ""),
-    dataAsJson: jspb.Message.getFieldWithDefault(msg, 2, "")
-  };
-
-  if (includeInstance) {
-    obj.$jspbMessageInstance = msg;
-  }
-  return obj;
-};
-}
-
-
-/**
- * Deserializes binary data (in protobuf wire format).
- * @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.deserializeBinary = function(bytes) {
-  var reader = new jspb.BinaryReader(bytes);
-  var msg = new proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData;
-  return proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.deserializeBinaryFromReader(msg, reader);
-};
-
-
-/**
- * Deserializes binary data (in protobuf wire format) from the
- * given reader into the given message object.
- * @param {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData} msg The message object to deserialize into.
- * @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.deserializeBinaryFromReader = function(msg, reader) {
-  while (reader.nextField()) {
-    if (reader.isEndGroup()) {
-      break;
-    }
-    var field = reader.getFieldNumber();
-    switch (field) {
-    case 1:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setTemplate(value);
-      break;
-    case 2:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setDataAsJson(value);
-      break;
-    default:
-      reader.skipField();
-      break;
-    }
-  }
-  return msg;
-};
-
-
-/**
- * Serializes the message to binary data (in protobuf wire format).
- * @return {!Uint8Array}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.prototype.serializeBinary = function() {
-  var writer = new jspb.BinaryWriter();
-  proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.serializeBinaryToWriter(this, writer);
-  return writer.getResultBuffer();
-};
-
-
-/**
- * Serializes the given message to binary data (in protobuf wire
- * format), writing to the given BinaryWriter.
- * @param {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData} message
- * @param {!jspb.BinaryWriter} writer
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.serializeBinaryToWriter = function(message, writer) {
-  var f = undefined;
-  f = message.getTemplate();
-  if (f.length > 0) {
-    writer.writeString(
-      1,
-      f
-    );
-  }
-  f = message.getDataAsJson();
-  if (f.length > 0) {
-    writer.writeString(
-      2,
-      f
-    );
-  }
-};
-
-
-/**
- * optional string template = 1;
- * @return {string}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.prototype.getTemplate = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData} returns this
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.prototype.setTemplate = function(value) {
-  return jspb.Message.setProto3StringField(this, 1, value);
-};
-
-
-/**
- * optional string data_as_json = 2;
- * @return {string}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.prototype.getDataAsJson = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData} returns this
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData.prototype.setDataAsJson = function(value) {
-  return jspb.Message.setProto3StringField(this, 2, value);
-};
-
-
-/**
- * map<string, TemplateAndData> templates_and_data_by_destination_rel_filepath = 1;
- * @param {boolean=} opt_noLazyCreate Do not create the map if
- * empty, instead returning `undefined`
- * @return {!jspb.Map<string,!proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData>}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.prototype.getTemplatesAndDataByDestinationRelFilepathMap = function(opt_noLazyCreate) {
-  return /** @type {!jspb.Map<string,!proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData>} */ (
-      jspb.Message.getMapField(this, 1, opt_noLazyCreate,
-      proto.api_container_api.RenderTemplatesToFilesArtifactArgs.TemplateAndData));
-};
-
-
-/**
- * Clears values from the map. The map will be non-null.
- * @return {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs} returns this
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.prototype.clearTemplatesAndDataByDestinationRelFilepathMap = function() {
-  this.getTemplatesAndDataByDestinationRelFilepathMap().clear();
-  return this;};
-
-
-/**
- * optional string name = 2;
- * @return {string}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.prototype.getName = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.api_container_api.RenderTemplatesToFilesArtifactArgs} returns this
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactArgs.prototype.setName = function(value) {
-  return jspb.Message.setProto3StringField(this, 2, value);
-};
-
-
-
-
-
-if (jspb.Message.GENERATE_TO_OBJECT) {
-/**
- * Creates an object representation of this proto.
- * Field names that are reserved in JavaScript and will be renamed to pb_name.
- * Optional fields that are not set will be set to undefined.
- * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
- * For the list of reserved names please see:
- *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
- * @param {boolean=} opt_includeInstance Deprecated. whether to include the
- *     JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @return {!Object}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactResponse.prototype.toObject = function(opt_includeInstance) {
-  return proto.api_container_api.RenderTemplatesToFilesArtifactResponse.toObject(opt_includeInstance, this);
-};
-
-
-/**
- * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Deprecated. Whether to include
- *     the JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @param {!proto.api_container_api.RenderTemplatesToFilesArtifactResponse} msg The msg instance to transform.
- * @return {!Object}
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactResponse.toObject = function(includeInstance, msg) {
-  var f, obj = {
-    uuid: jspb.Message.getFieldWithDefault(msg, 1, "")
-  };
-
-  if (includeInstance) {
-    obj.$jspbMessageInstance = msg;
-  }
-  return obj;
-};
-}
-
-
-/**
- * Deserializes binary data (in protobuf wire format).
- * @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.api_container_api.RenderTemplatesToFilesArtifactResponse}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactResponse.deserializeBinary = function(bytes) {
-  var reader = new jspb.BinaryReader(bytes);
-  var msg = new proto.api_container_api.RenderTemplatesToFilesArtifactResponse;
-  return proto.api_container_api.RenderTemplatesToFilesArtifactResponse.deserializeBinaryFromReader(msg, reader);
-};
-
-
-/**
- * Deserializes binary data (in protobuf wire format) from the
- * given reader into the given message object.
- * @param {!proto.api_container_api.RenderTemplatesToFilesArtifactResponse} msg The message object to deserialize into.
- * @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.api_container_api.RenderTemplatesToFilesArtifactResponse}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactResponse.deserializeBinaryFromReader = function(msg, reader) {
-  while (reader.nextField()) {
-    if (reader.isEndGroup()) {
-      break;
-    }
-    var field = reader.getFieldNumber();
-    switch (field) {
-    case 1:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setUuid(value);
-      break;
-    default:
-      reader.skipField();
-      break;
-    }
-  }
-  return msg;
-};
-
-
-/**
- * Serializes the message to binary data (in protobuf wire format).
- * @return {!Uint8Array}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactResponse.prototype.serializeBinary = function() {
-  var writer = new jspb.BinaryWriter();
-  proto.api_container_api.RenderTemplatesToFilesArtifactResponse.serializeBinaryToWriter(this, writer);
-  return writer.getResultBuffer();
-};
-
-
-/**
- * Serializes the given message to binary data (in protobuf wire
- * format), writing to the given BinaryWriter.
- * @param {!proto.api_container_api.RenderTemplatesToFilesArtifactResponse} message
- * @param {!jspb.BinaryWriter} writer
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactResponse.serializeBinaryToWriter = function(message, writer) {
-  var f = undefined;
-  f = message.getUuid();
-  if (f.length > 0) {
-    writer.writeString(
-      1,
-      f
-    );
-  }
-};
-
-
-/**
- * optional string uuid = 1;
- * @return {string}
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactResponse.prototype.getUuid = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.api_container_api.RenderTemplatesToFilesArtifactResponse} returns this
- */
-proto.api_container_api.RenderTemplatesToFilesArtifactResponse.prototype.setUuid = function(value) {
-  return jspb.Message.setProto3StringField(this, 1, value);
-};
-
-
-
-
-
 if (jspb.Message.GENERATE_TO_OBJECT) {
 /**
  * Creates an object representation of this proto.
diff --git a/api/typescript/src/core/lib/constructor_calls.ts b/api/typescript/src/core/lib/constructor_calls.ts
index c8c36187d..1f5a82be4 100644
--- a/api/typescript/src/core/lib/constructor_calls.ts
+++ b/api/typescript/src/core/lib/constructor_calls.ts
@@ -14,11 +14,9 @@ import {
     UploadFilesArtifactArgs,
     ServiceInfo,
     GetServicesResponse,
-    RenderTemplatesToFilesArtifactArgs,
     DownloadFilesArtifactArgs,
 } from '../kurtosis_core_rpc_api_bindings/api_container_service_pb';
 import { ServiceName } from './services/service';
-import TemplateAndData = RenderTemplatesToFilesArtifactArgs.TemplateAndData;
 
 // ==============================================================================================
 //                           Shared Objects (Used By Multiple Endpoints)
@@ -144,18 +142,3 @@ export function newUploadFilesArtifactArgs(data: Uint8Array, name: string) : Upl
     result.setName(name)
     return result
 }
-
-// ==============================================================================================
-//                                      Render Templates
-// ==============================================================================================
-export function newTemplateAndData(template: string, templateData: string) : TemplateAndData {
-    const templateAndData : TemplateAndData = new TemplateAndData()
-    templateAndData.setDataAsJson(templateData)
-    templateAndData.setTemplate(template)
-    return templateAndData
-}
-
-export function newRenderTemplatesToFilesArtifactArgs() : RenderTemplatesToFilesArtifactArgs {
-    const renderTemplatesToFilesArtifactArgs : RenderTemplatesToFilesArtifactArgs = new RenderTemplatesToFilesArtifactArgs()
-    return renderTemplatesToFilesArtifactArgs
-}
diff --git a/cli/cli/kurtosis_gateway/server/api_container_gateway/api_container_gateway_service_server.go b/cli/cli/kurtosis_gateway/server/api_container_gateway/api_container_gateway_service_server.go
index 9e576a99b..f7f53b14d 100644
--- a/cli/cli/kurtosis_gateway/server/api_container_gateway/api_container_gateway_service_server.go
+++ b/cli/cli/kurtosis_gateway/server/api_container_gateway/api_container_gateway_service_server.go
@@ -204,15 +204,6 @@ func (service *ApiContainerGatewayServiceServer) DownloadFilesArtifactV2(args *k
 	return nil
 }
 
-func (service *ApiContainerGatewayServiceServer) RenderTemplatesToFilesArtifact(ctx context.Context, args *kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs) (*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactResponse, error) {
-	remoteApiContainerResponse, err := service.remoteApiContainerClient.RenderTemplatesToFilesArtifact(ctx, args)
-	if err != nil {
-		return nil, stacktrace.Propagate(err, errorCallingRemoteApiContainerFromGateway)
-	}
-
-	return remoteApiContainerResponse, nil
-}
-
 func (service *ApiContainerGatewayServiceServer) UploadStarlarkPackage(server kurtosis_core_rpc_api_bindings.ApiContainerService_UploadStarlarkPackageServer) error {
 	client, err := service.remoteApiContainerClient.UploadStarlarkPackage(server.Context())
 	if err != nil {
diff --git a/core/server/api_container/server/api_container_service.go b/core/server/api_container/server/api_container_service.go
index a607024dd..feadc6ac7 100644
--- a/core/server/api_container/server/api_container_service.go
+++ b/core/server/api_container/server/api_container_service.go
@@ -404,16 +404,6 @@ func (apicService ApiContainerService) StoreFilesArtifactFromService(ctx context
 	return response, nil
 }
 
-func (apicService ApiContainerService) RenderTemplatesToFilesArtifact(ctx context.Context, args *kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs) (*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactResponse, error) {
-	templatesAndDataByDestinationRelFilepath := args.TemplatesAndDataByDestinationRelFilepath
-	filesArtifactUuid, err := apicService.serviceNetwork.RenderTemplates(templatesAndDataByDestinationRelFilepath, args.Name)
-	if err != nil {
-		return nil, stacktrace.Propagate(err, "An error occurred while rendering templates to files artifact")
-	}
-	response := binding_constructors.NewRenderTemplatesToFilesArtifactResponse(string(filesArtifactUuid))
-	return response, nil
-}
-
 func (apicService ApiContainerService) ListFilesArtifactNamesAndUuids(_ context.Context, _ *emptypb.Empty) (*kurtosis_core_rpc_api_bindings.ListFilesArtifactNamesAndUuidsResponse, error) {
 	filesArtifactsNamesAndUuids := apicService.filesArtifactStore.GetFileNamesAndUuids()
 	var filesArtifactNamesAndUuids []*kurtosis_core_rpc_api_bindings.FilesArtifactNameAndUuid
diff --git a/core/server/api_container/server/service_network/default_service_network.go b/core/server/api_container/server/service_network/default_service_network.go
index 62bdec80f..4f1fe3a2a 100644
--- a/core/server/api_container/server/service_network/default_service_network.go
+++ b/core/server/api_container/server/service_network/default_service_network.go
@@ -9,9 +9,9 @@ import (
 	"bytes"
 	"compress/gzip"
 	"context"
-	"encoding/json"
 	"fmt"
 	"github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/exec_result"
+	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network/render_templates"
 	"io"
 	"net"
 	"net/http"
@@ -19,7 +19,6 @@ import (
 	"path"
 	"strings"
 	"sync"
-	"text/template"
 	"time"
 
 	"github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings"
@@ -43,8 +42,7 @@ const (
 	minMemoryLimit              uint64 = 6 // Docker doesn't allow memory limits less than 6 megabytes
 	defaultMemoryAllocMegabytes uint64 = 0
 
-	folderPermissionForRenderedTemplates = 0755
-	tempDirForRenderedTemplatesPrefix    = "temp-dir-for-rendered-templates-"
+	tempDirForRenderedTemplatesPrefix = "temp-dir-for-rendered-templates-"
 
 	enforceMaxFileSizeLimit = false
 
@@ -937,7 +935,7 @@ func (network *DefaultServiceNetwork) GetServiceRegistration(serviceName service
 	return registration, true
 }
 
-func (network *DefaultServiceNetwork) RenderTemplates(templatesAndDataByDestinationRelFilepath map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData, artifactName string) (enclave_data_directory.FilesArtifactUUID, error) {
+func (network *DefaultServiceNetwork) RenderTemplates(templatesAndDataByDestinationRelFilepath map[string]*render_templates.TemplateData, artifactName string) (enclave_data_directory.FilesArtifactUUID, error) {
 	filesArtifactUuid, err := network.renderTemplatesUnlocked(templatesAndDataByDestinationRelFilepath, artifactName)
 	if err != nil {
 		return "", stacktrace.Propagate(err, "There was an error in rendering templates to disk")
@@ -1569,7 +1567,7 @@ func (network *DefaultServiceNetwork) createSidecarAndAddToMap(ctx context.Conte
 }
 
 // This method is not thread safe. Only call this from a method where there is a mutex lock on the network.
-func (network *DefaultServiceNetwork) renderTemplatesUnlocked(templatesAndDataByDestinationRelFilepath map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData, artifactName string) (enclave_data_directory.FilesArtifactUUID, error) {
+func (network *DefaultServiceNetwork) renderTemplatesUnlocked(templatesAndDataByDestinationRelFilepath map[string]*render_templates.TemplateData, artifactName string) (enclave_data_directory.FilesArtifactUUID, error) {
 	tempDirForRenderedTemplates, err := os.MkdirTemp("", tempDirForRenderedTemplatesPrefix)
 	if err != nil {
 		return "", stacktrace.Propagate(err, "An error occurred while creating a temp dir for rendered templates '%v'", tempDirForRenderedTemplates)
@@ -1577,26 +1575,9 @@ func (network *DefaultServiceNetwork) renderTemplatesUnlocked(templatesAndDataBy
 	defer os.RemoveAll(tempDirForRenderedTemplates)
 
 	for destinationRelFilepath, templateAndData := range templatesAndDataByDestinationRelFilepath {
-		templateAsAString := templateAndData.Template
-		templateDataAsJson := templateAndData.DataAsJson
-
-		templateDataJsonAsBytes := []byte(templateDataAsJson)
-		templateDataJsonReader := bytes.NewReader(templateDataJsonAsBytes)
-
-		// We don't use standard json.Unmarshal as that converts large integers to floats
-		// Using this custom decoder we get the json.Number representation which is closer to other json implementations
-		// This talks about the issue further https://github.com/square/go-jose/issues/351#issuecomment-847193900
-		decoder := json.NewDecoder(templateDataJsonReader)
-		decoder.UseNumber()
-
-		var templateData interface{}
-		if err = decoder.Decode(&templateData); err != nil {
-			return "", stacktrace.Propagate(err, "An error occurred while decoding the template data json '%v' for file '%v'", templateDataAsJson, destinationRelFilepath)
-		}
-
-		destinationFilepath := path.Join(tempDirForRenderedTemplates, destinationRelFilepath)
-		if err = renderTemplateToFile(templateAsAString, templateData, destinationFilepath); err != nil {
-			return "", stacktrace.Propagate(err, "There was an error in rendering template for file '%v'", destinationRelFilepath)
+		destinationAbsoluteFilePath := path.Join(tempDirForRenderedTemplates, destinationRelFilepath)
+		if err := templateAndData.RenderToFile(destinationAbsoluteFilePath); err != nil {
+			return "", stacktrace.Propagate(err, "There was an error in rendering template for file '%s'", destinationRelFilepath)
 		}
 	}
 
@@ -1746,30 +1727,6 @@ func (network *DefaultServiceNetwork) getServiceLogs(
 	return serviceLogs, nil
 }
 
-func renderTemplateToFile(templateAsAString string, templateData interface{}, destinationFilepath string) error {
-	parsedTemplate, err := template.New(path.Base(destinationFilepath)).Parse(templateAsAString)
-	if err != nil {
-		return stacktrace.Propagate(err, "An error occurred in parsing the template string '%v'", destinationFilepath)
-	}
-
-	// Creat all parent directories to account for nesting
-	destinationFileDir := path.Dir(destinationFilepath)
-	if err = os.MkdirAll(destinationFileDir, folderPermissionForRenderedTemplates); err != nil {
-		return stacktrace.Propagate(err, "There was an error in creating the parent directory '%v' to write the file '%v' into.", destinationFileDir, destinationFilepath)
-	}
-
-	renderedTemplateFile, err := os.Create(destinationFilepath)
-	if err != nil {
-		return stacktrace.Propagate(err, "An error occurred while creating temporary file to render template into for file '%v'.", destinationFilepath)
-	}
-	defer renderedTemplateFile.Close()
-
-	if err = parsedTemplate.Execute(renderedTemplateFile, templateData); err != nil {
-		return stacktrace.Propagate(err, "An error occurred while writing the rendered template to destination '%v'", destinationFilepath)
-	}
-	return nil
-}
-
 func waitUntilAllTCPAndUDPPortsAreOpen(
 	ipAddr net.IP,
 	ports map[string]*port_spec.PortSpec,
diff --git a/core/server/api_container/server/service_network/mock_service_network.go b/core/server/api_container/server/service_network/mock_service_network.go
index b80473f88..59415d1d6 100644
--- a/core/server/api_container/server/service_network/mock_service_network.go
+++ b/core/server/api_container/server/service_network/mock_service_network.go
@@ -16,6 +16,8 @@ import (
 
 	partition_topology "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network/partition_topology"
 
+	render_templates "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network/render_templates"
+
 	service "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service"
 
 	service_network_types "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network/service_network_types"
@@ -654,21 +656,21 @@ func (_c *MockServiceNetwork_RemoveService_Call) RunAndReturn(run func(context.C
 }
 
 // RenderTemplates provides a mock function with given fields: templatesAndDataByDestinationRelFilepath, artifactName
-func (_m *MockServiceNetwork) RenderTemplates(templatesAndDataByDestinationRelFilepath map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData, artifactName string) (enclave_data_directory.FilesArtifactUUID, error) {
+func (_m *MockServiceNetwork) RenderTemplates(templatesAndDataByDestinationRelFilepath map[string]*render_templates.TemplateData, artifactName string) (enclave_data_directory.FilesArtifactUUID, error) {
 	ret := _m.Called(templatesAndDataByDestinationRelFilepath, artifactName)
 
 	var r0 enclave_data_directory.FilesArtifactUUID
 	var r1 error
-	if rf, ok := ret.Get(0).(func(map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData, string) (enclave_data_directory.FilesArtifactUUID, error)); ok {
+	if rf, ok := ret.Get(0).(func(map[string]*render_templates.TemplateData, string) (enclave_data_directory.FilesArtifactUUID, error)); ok {
 		return rf(templatesAndDataByDestinationRelFilepath, artifactName)
 	}
-	if rf, ok := ret.Get(0).(func(map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData, string) enclave_data_directory.FilesArtifactUUID); ok {
+	if rf, ok := ret.Get(0).(func(map[string]*render_templates.TemplateData, string) enclave_data_directory.FilesArtifactUUID); ok {
 		r0 = rf(templatesAndDataByDestinationRelFilepath, artifactName)
 	} else {
 		r0 = ret.Get(0).(enclave_data_directory.FilesArtifactUUID)
 	}
 
-	if rf, ok := ret.Get(1).(func(map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData, string) error); ok {
+	if rf, ok := ret.Get(1).(func(map[string]*render_templates.TemplateData, string) error); ok {
 		r1 = rf(templatesAndDataByDestinationRelFilepath, artifactName)
 	} else {
 		r1 = ret.Error(1)
@@ -683,15 +685,15 @@ type MockServiceNetwork_RenderTemplates_Call struct {
 }
 
 // RenderTemplates is a helper method to define mock.On call
-//   - templatesAndDataByDestinationRelFilepath map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData
+//   - templatesAndDataByDestinationRelFilepath map[string]*render_templates.TemplateData
 //   - artifactName string
 func (_e *MockServiceNetwork_Expecter) RenderTemplates(templatesAndDataByDestinationRelFilepath interface{}, artifactName interface{}) *MockServiceNetwork_RenderTemplates_Call {
 	return &MockServiceNetwork_RenderTemplates_Call{Call: _e.mock.On("RenderTemplates", templatesAndDataByDestinationRelFilepath, artifactName)}
 }
 
-func (_c *MockServiceNetwork_RenderTemplates_Call) Run(run func(templatesAndDataByDestinationRelFilepath map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData, artifactName string)) *MockServiceNetwork_RenderTemplates_Call {
+func (_c *MockServiceNetwork_RenderTemplates_Call) Run(run func(templatesAndDataByDestinationRelFilepath map[string]*render_templates.TemplateData, artifactName string)) *MockServiceNetwork_RenderTemplates_Call {
 	_c.Call.Run(func(args mock.Arguments) {
-		run(args[0].(map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData), args[1].(string))
+		run(args[0].(map[string]*render_templates.TemplateData), args[1].(string))
 	})
 	return _c
 }
@@ -701,7 +703,7 @@ func (_c *MockServiceNetwork_RenderTemplates_Call) Return(_a0 enclave_data_direc
 	return _c
 }
 
-func (_c *MockServiceNetwork_RenderTemplates_Call) RunAndReturn(run func(map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData, string) (enclave_data_directory.FilesArtifactUUID, error)) *MockServiceNetwork_RenderTemplates_Call {
+func (_c *MockServiceNetwork_RenderTemplates_Call) RunAndReturn(run func(map[string]*render_templates.TemplateData, string) (enclave_data_directory.FilesArtifactUUID, error)) *MockServiceNetwork_RenderTemplates_Call {
 	_c.Call.Return(run)
 	return _c
 }
diff --git a/core/server/api_container/server/service_network/mock_service_network_custom.go b/core/server/api_container/server/service_network/mock_service_network_custom.go
index 7f6882dcc..1312f848e 100644
--- a/core/server/api_container/server/service_network/mock_service_network_custom.go
+++ b/core/server/api_container/server/service_network/mock_service_network_custom.go
@@ -4,6 +4,7 @@ import (
 	"context"
 	"fmt"
 	"github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/exec_result"
+	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network/render_templates"
 	"net"
 	"net/http"
 
@@ -149,7 +150,7 @@ func (m *MockServiceNetworkCustom) GetServiceRegistration(serviceName service.Se
 	return serviceRegistration, found
 }
 
-func (m *MockServiceNetworkCustom) RenderTemplates(_ map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData, _ string) (enclave_data_directory.FilesArtifactUUID, error) {
+func (m *MockServiceNetworkCustom) RenderTemplates(_ map[string]*render_templates.TemplateData, _ string) (enclave_data_directory.FilesArtifactUUID, error) {
 	panic(unimplementedMsg)
 }
 
diff --git a/core/server/api_container/server/service_network/render_templates/template_data.go b/core/server/api_container/server/service_network/render_templates/template_data.go
new file mode 100644
index 000000000..73f3413db
--- /dev/null
+++ b/core/server/api_container/server/service_network/render_templates/template_data.go
@@ -0,0 +1,105 @@
+package render_templates
+
+import (
+	"bytes"
+	"crypto/md5"
+	"encoding/json"
+	"fmt"
+	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_instruction/shared_helpers/magic_string_helper"
+	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/runtime_value_store"
+	"github.com/kurtosis-tech/stacktrace"
+	"os"
+	"path"
+	"text/template"
+)
+
+const (
+	templateNamePrefix                   = "kurtosis-template-"
+	folderPermissionForRenderedTemplates = 0755
+)
+
+type TemplateData struct {
+	template *template.Template
+
+	dataAsSerializedJson string
+}
+
+func CreateTemplateData(templateString string, dataAsSerializedJson string) (*TemplateData, error) {
+	templateName, err := generateUniqueTemplateName(templateString)
+	if err != nil {
+		return nil, stacktrace.Propagate(err, "Error generating unique template name")
+	}
+	parsedTemplate, err := template.New(templateName).Parse(templateString)
+	if err != nil {
+		return nil, stacktrace.Propagate(err, "An error occurred parsing the template string '%s'", templateString)
+	}
+
+	return &TemplateData{
+		template:             parsedTemplate,
+		dataAsSerializedJson: dataAsSerializedJson,
+	}, nil
+}
+
+func (templateData *TemplateData) ReplaceRuntimeValues(runtimeValueStore *runtime_value_store.RuntimeValueStore) error {
+	dataAsSerializedJsonWithRuntimeValues, err := magic_string_helper.ReplaceRuntimeValueInString(templateData.dataAsSerializedJson, runtimeValueStore)
+	if err != nil {
+		return stacktrace.Propagate(
+			err,
+			"An error occurred while replacing runtime values in JSON data '%s'",
+			templateData.dataAsSerializedJson,
+		)
+	}
+	templateData.dataAsSerializedJson = dataAsSerializedJsonWithRuntimeValues
+	return nil
+}
+
+func (templateData *TemplateData) RenderToFile(destinationAbsoluteFilePath string) error {
+	decodedData, err := decodeJsonString(templateData.dataAsSerializedJson)
+	if err != nil {
+		return stacktrace.Propagate(err, "There was an error decoding the data as a JSON string: '%s'", templateData.dataAsSerializedJson)
+	}
+
+	// Create all parent directories to account for nesting
+	destinationFileDir := path.Dir(destinationAbsoluteFilePath)
+	if err := os.MkdirAll(destinationFileDir, folderPermissionForRenderedTemplates); err != nil {
+		return stacktrace.Propagate(err, "There was an error in creating the parent directory '%s' to write the file '%s' into.", destinationFileDir, destinationAbsoluteFilePath)
+	}
+
+	renderedTemplateFile, err := os.Create(destinationAbsoluteFilePath)
+	if err != nil {
+		return stacktrace.Propagate(err, "An error occurred while creating temporary file to render template into for file '%s'.", destinationAbsoluteFilePath)
+	}
+	defer renderedTemplateFile.Close()
+
+	if err = templateData.template.Execute(renderedTemplateFile, decodedData); err != nil {
+		return stacktrace.Propagate(err, "An error occurred while writing the rendered template to destination '%s'", destinationAbsoluteFilePath)
+	}
+	return nil
+}
+
+func decodeJsonString(dataAsSerializedJson string) (interface{}, error) {
+	dataAsSerializedJsonBytes := []byte(dataAsSerializedJson)
+	dataJsonReader := bytes.NewReader(dataAsSerializedJsonBytes)
+
+	// We don't use standard json.Unmarshal as that converts large integers to floats
+	// Using this custom decoder we get the json.Number representation which is closer to other json implementations
+	// This talks about the issue further https://github.com/square/go-jose/issues/351#issuecomment-847193900
+	decoder := json.NewDecoder(dataJsonReader)
+	decoder.UseNumber()
+
+	var decodedData interface{}
+	if err := decoder.Decode(&decodedData); err != nil {
+		return nil, stacktrace.Propagate(err, "An error occurred while decoding the template data json '%s'", dataAsSerializedJson)
+	}
+	return decodedData, nil
+}
+
+func generateUniqueTemplateName(templateString string) (string, error) {
+	md5Hash := md5.New()
+	if _, err := md5Hash.Write([]byte(templateString)); err != nil {
+		return "", stacktrace.Propagate(err, "Unable to hash content of template '%s'", templateString)
+	}
+	templateStringHash := md5Hash.Sum(nil)
+	templateName := fmt.Sprintf("%s%s", templateNamePrefix, templateStringHash)
+	return templateName, nil
+}
diff --git a/core/server/api_container/server/service_network/service_network.go b/core/server/api_container/server/service_network/service_network.go
index 0e2b81d02..dc683ed9b 100644
--- a/core/server/api_container/server/service_network/service_network.go
+++ b/core/server/api_container/server/service_network/service_network.go
@@ -6,6 +6,7 @@ import (
 	"github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/exec_result"
 	"github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service"
 	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network/partition_topology"
+	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network/render_templates"
 	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network/service_network_types"
 	"github.com/kurtosis-tech/kurtosis/core/server/commons/enclave_data_directory"
 	"net/http"
@@ -105,7 +106,7 @@ type ServiceNetwork interface {
 
 	GetServiceRegistration(serviceName service.ServiceName) (*service.ServiceRegistration, bool)
 
-	RenderTemplates(templatesAndDataByDestinationRelFilepath map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData, artifactName string) (enclave_data_directory.FilesArtifactUUID, error)
+	RenderTemplates(templatesAndDataByDestinationRelFilepath map[string]*render_templates.TemplateData, artifactName string) (enclave_data_directory.FilesArtifactUUID, error)
 
 	UploadFilesArtifact(data []byte, artifactName string) (enclave_data_directory.FilesArtifactUUID, error)
 
diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/render_templates/render_templates.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/render_templates/render_templates.go
index c10b831f0..d81e192f7 100644
--- a/core/server/api_container/server/startosis_engine/kurtosis_instruction/render_templates/render_templates.go
+++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/render_templates/render_templates.go
@@ -4,10 +4,8 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
-	"github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings"
-	"github.com/kurtosis-tech/kurtosis/api/golang/core/lib/binding_constructors"
 	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network"
-	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_instruction/shared_helpers/magic_string_helper"
+	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network/render_templates"
 	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework"
 	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/builtin_argument"
 	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/kurtosis_plan_instruction"
@@ -76,7 +74,7 @@ type RenderTemplatesCapabilities struct {
 	serviceNetwork service_network.ServiceNetwork
 
 	artifactName                      string
-	templatesAndDataByDestRelFilepath map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData
+	templatesAndDataByDestRelFilepath map[string]*render_templates.TemplateData
 
 	runtimeValueStore *runtime_value_store.RuntimeValueStore
 }
@@ -117,14 +115,10 @@ func (builtin *RenderTemplatesCapabilities) Validate(_ *builtin_argument.Argumen
 }
 
 func (builtin *RenderTemplatesCapabilities) Execute(_ context.Context, _ *builtin_argument.ArgumentValuesSet) (string, error) {
-	for relFilePath := range builtin.templatesAndDataByDestRelFilepath {
-		templateStr := builtin.templatesAndDataByDestRelFilepath[relFilePath].Template
-		dataAsJson := builtin.templatesAndDataByDestRelFilepath[relFilePath].DataAsJson
-		dataAsJsonWithRuntimeValueReplaced, err := magic_string_helper.ReplaceRuntimeValueInString(dataAsJson, builtin.runtimeValueStore)
-		if err != nil {
-			return "", stacktrace.Propagate(err, "An error occurred while replacing IP address with place holder in the render_template instruction for target '%v'", relFilePath)
+	for _, templateData := range builtin.templatesAndDataByDestRelFilepath {
+		if err := templateData.ReplaceRuntimeValues(builtin.runtimeValueStore); err != nil {
+			return "", stacktrace.Propagate(err, "An error occurred replacing runtime values for render_template instruction")
 		}
-		builtin.templatesAndDataByDestRelFilepath[relFilePath] = binding_constructors.NewTemplateAndData(templateStr, dataAsJsonWithRuntimeValueReplaced)
 	}
 
 	artifactUUID, err := builtin.serviceNetwork.RenderTemplates(builtin.templatesAndDataByDestRelFilepath, builtin.artifactName)
@@ -135,8 +129,8 @@ func (builtin *RenderTemplatesCapabilities) Execute(_ context.Context, _ *builti
 	return instructionResult, nil
 }
 
-func parseTemplatesAndData(templatesAndData *starlark.Dict) (map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData, *startosis_errors.InterpretationError) {
-	templateAndDataByDestRelFilepath := make(map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData)
+func parseTemplatesAndData(templatesAndData *starlark.Dict) (map[string]*render_templates.TemplateData, *startosis_errors.InterpretationError) {
+	templateAndDataByDestRelFilepath := make(map[string]*render_templates.TemplateData)
 	for _, relPathInFilesArtifactKey := range templatesAndData.Keys() {
 		relPathInFilesArtifactStr, castErr := kurtosis_types.SafeCastToString(relPathInFilesArtifactKey, fmt.Sprintf("%v.key:%v", templatesAndDataArgName, relPathInFilesArtifactKey))
 		if castErr != nil {
@@ -183,7 +177,10 @@ func parseTemplatesAndData(templatesAndData *starlark.Dict) (map[string]*kurtosi
 			return nil, startosis_errors.NewInterpretationError("Template data for file '%v', '%v' isn't valid JSON", relPathInFilesArtifactStr, templateDataJSONStrValue)
 		}
 		// end Massive Hack
-		templateAndData := binding_constructors.NewTemplateAndData(templateStr, string(templateDataJson))
+		templateAndData, err := render_templates.CreateTemplateData(templateStr, string(templateDataJson))
+		if err != nil {
+			return nil, startosis_errors.NewInterpretationError("An error occurred creating the template. Make sure the it is a valid template string.")
+		}
 		templateAndDataByDestRelFilepath[relPathInFilesArtifactStr] = templateAndData
 	}
 	return templateAndDataByDestRelFilepath, nil


Test patch:
diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/render_templates/render_templates_test.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/render_templates/render_templates_test.go
index f9bd462a0..ac1057823 100644
--- a/core/server/api_container/server/startosis_engine/kurtosis_instruction/render_templates/render_templates_test.go
+++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/render_templates/render_templates_test.go
@@ -1,8 +1,7 @@
 package render_templates
 
 import (
-	"github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings"
-	"github.com/kurtosis-tech/kurtosis/api/golang/core/lib/binding_constructors"
+	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network/render_templates"
 	"github.com/stretchr/testify/require"
 	"go.starlark.net/starlark"
 	"go.starlark.net/starlarkstruct"
@@ -24,8 +23,9 @@ func TestParseTemplatesAndData_SimpleCaseStruct(t *testing.T) {
 	err := input.SetKey(starlark.String("/foo/bar"), starlarkstruct.FromStringDict(starlarkstruct.Default, templateDataStrDict))
 	require.Nil(t, err)
 
-	expectedTemplateAndData := binding_constructors.NewTemplateAndData(template, `{"Boolean":true,"LargeFloat":1231231243.43,"Name":"John","UnixTs":1257894000}`)
-	expectedOutput := map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData{
+	expectedTemplateAndData, err := render_templates.CreateTemplateData(template, `{"Boolean":true,"LargeFloat":1231231243.43,"Name":"John","UnixTs":1257894000}`)
+	require.Nil(t, err)
+	expectedOutput := map[string]*render_templates.TemplateData{
 		"/foo/bar": expectedTemplateAndData,
 	}
 
@@ -52,8 +52,9 @@ func TestParseTemplatesAndData_SimpleCaseDict(t *testing.T) {
 	err = input.SetKey(starlark.String("/foo/bar"), starlarkstruct.FromStringDict(starlarkstruct.Default, templateDataStrDict))
 	require.Nil(t, err)
 
-	expectedTemplateAndData := binding_constructors.NewTemplateAndData(template, `{"Boolean":true,"LargeFloat":1231231243.43,"Name":"John","UnixTs":1257894000}`)
-	expectedOutput := map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData{
+	expectedTemplateAndData, err := render_templates.CreateTemplateData(template, `{"Boolean":true,"LargeFloat":1231231243.43,"Name":"John","UnixTs":1257894000}`)
+	require.Nil(t, err)
+	expectedOutput := map[string]*render_templates.TemplateData{
 		"/foo/bar": expectedTemplateAndData,
 	}
 
diff --git a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/render_multiple_templates_framework_test.go b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/render_multiple_templates_framework_test.go
index bb2573112..929100ed0 100644
--- a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/render_multiple_templates_framework_test.go
+++ b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/render_multiple_templates_framework_test.go
@@ -2,9 +2,8 @@ package test_engine
 
 import (
 	"fmt"
-	"github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings"
-	"github.com/kurtosis-tech/kurtosis/api/golang/core/lib/binding_constructors"
 	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network"
+	render_templates2 "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network/render_templates"
 	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_instruction/render_templates"
 	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/kurtosis_plan_instruction"
 	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/runtime_value_store"
@@ -35,10 +34,14 @@ func newRenderMultipleTemplatesTestCase(t *testing.T) *renderMultipleTemplatesTe
 
 	// We expect double quotes for the serialized JSON, for some reasons... See arg_parser.encodeStarlarkObjectAsJSON
 	data1WithDoubleQuote := fmt.Sprintf("%q", renderTemplate_MultipleTemplates_1_data)
+	templateData1, err := render_templates2.CreateTemplateData(renderTemplate_MultipleTemplates_1_template, data1WithDoubleQuote)
+	require.Nil(t, err)
 	data2WithDoubleQuote := fmt.Sprintf("%q", renderTemplate_MultipleTemplates_2_data)
-	templatesAndData := map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData{
-		renderTemplate_MultipleTemplates_1_filePath: binding_constructors.NewTemplateAndData(renderTemplate_MultipleTemplates_1_template, data1WithDoubleQuote),
-		renderTemplate_MultipleTemplates_2_filePath: binding_constructors.NewTemplateAndData(renderTemplate_MultipleTemplates_2_template, data2WithDoubleQuote),
+	templateData2, err := render_templates2.CreateTemplateData(renderTemplate_MultipleTemplates_2_template, data2WithDoubleQuote)
+	require.Nil(t, err)
+	templatesAndData := map[string]*render_templates2.TemplateData{
+		renderTemplate_MultipleTemplates_1_filePath: templateData1,
+		renderTemplate_MultipleTemplates_2_filePath: templateData2,
 	}
 
 	serviceNetwork.EXPECT().GetUniqueNameForFileArtifact().Times(1).Return(
diff --git a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/render_single_templates_framework_test.go b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/render_single_templates_framework_test.go
index d1e1bc769..c308378db 100644
--- a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/render_single_templates_framework_test.go
+++ b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/render_single_templates_framework_test.go
@@ -2,9 +2,8 @@ package test_engine
 
 import (
 	"fmt"
-	"github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings"
-	"github.com/kurtosis-tech/kurtosis/api/golang/core/lib/binding_constructors"
 	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network"
+	render_templates2 "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network/render_templates"
 	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_instruction/render_templates"
 	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/kurtosis_plan_instruction"
 	"github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/runtime_value_store"
@@ -29,8 +28,10 @@ func newRenderSingleTemplateTestCase(t *testing.T) *renderSingleTemplateTestCase
 	serviceNetwork := service_network.NewMockServiceNetwork(t)
 	// We expect double quotes for the serialized JSON, for some reasons... See arg_parser.encodeStarlarkObjectAsJSON
 	dataWithDoubleQuote := fmt.Sprintf("%q", renderTemplate_SingleTemplate_data)
-	templateAndData := map[string]*kurtosis_core_rpc_api_bindings.RenderTemplatesToFilesArtifactArgs_TemplateAndData{
-		renderTemplate_SingleTemplate_filePath: binding_constructors.NewTemplateAndData(renderTemplate_SingleTemplate_template, dataWithDoubleQuote),
+	templateData, err := render_templates2.CreateTemplateData(renderTemplate_SingleTemplate_template, dataWithDoubleQuote)
+	require.Nil(t, err)
+	templateAndData := map[string]*render_templates2.TemplateData{
+		renderTemplate_SingleTemplate_filePath: templateData,
 	}
 
 	serviceNetwork.EXPECT().RenderTemplates(templateAndData, TestArtifactName).Times(1).Return(TestArtifactUuid, nil)