# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: test_platform/execution/param.proto
"""Generated protocol buffer code."""
from chromite.third_party.google.protobuf.internal import builder as _builder
from chromite.third_party.google.protobuf import descriptor as _descriptor
from chromite.third_party.google.protobuf import descriptor_pool as _descriptor_pool
from chromite.third_party.google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()


from chromite.api.gen.chromiumos.build.api import container_metadata_pb2 as chromiumos_dot_build_dot_api_dot_container__metadata__pb2


DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#test_platform/execution/param.proto\x12\x17test_platform.execution\x1a-chromiumos/build/api/container_metadata.proto\"\xac\x01\n\x05Param\x12\x16\n\x0eupload_crashes\x18\x01 \x01(\x08\x12\x43\n\x12\x63ontainer_metadata\x18\x02 \x01(\x0b\x32\'.chromiumos.build.api.ContainerMetadata\x12\x46\n\x14\x63ontainer_image_info\x18\x08 \x01(\x0b\x32(.chromiumos.build.api.ContainerImageInfoBCZAgo.chromium.org/chromiumos/infra/proto/go/test_platform/executionb\x06proto3')

_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'test_platform.execution.param_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:

  DESCRIPTOR._options = None
  DESCRIPTOR._serialized_options = b'ZAgo.chromium.org/chromiumos/infra/proto/go/test_platform/execution'
  _PARAM._serialized_start=112
  _PARAM._serialized_end=284
# @@protoc_insertion_point(module_scope)
