// WARNING: This file is machine generated by fidlgen.

// fidl_experiment = output_index_json

#include <fidl/test.unknowninteractions/cpp/natural_types.h>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"

::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse::Storage_ test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.__reserved)};
}

::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse::Storage_ test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.__reserved)};
}

::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse::Storage_ test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.__reserved)};
}

::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest::Storage_ test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest::Storage_ test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse::Storage_ test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.__reserved)};
}

::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest::Storage_ test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest::Storage_ test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse::Storage_ test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.__reserved)};
}

::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest::Storage_ test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse::Storage_ test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.__reserved)};
}

::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse::Storage_ test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.__reserved)};
}

::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse::Storage_ test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.__reserved)};
}

::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse::Storage_ test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.__reserved)};
}

::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse::Storage_ test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.__reserved)};
}

::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse::Storage_ test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse::Storage_ test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest::Storage_ test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest::Storage_ test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse::Storage_ test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest::Storage_ test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest::Storage_ test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse::Storage_ test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest::Storage_ test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse::Storage_ test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse::Storage_ test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse::Storage_ test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse::Storage_ test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse::Storage_ test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse::CloneStorage_() const {
  return Storage_{
      ::fidl::internal::NaturalClone(storage_.some_field)};
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse::Storage_> test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult::Storage_> test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult::Storage_> test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse::Storage_> test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult::Storage_> test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult::Storage_> test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult::Storage_> test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult::Storage_> test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse::Storage_> test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult::Storage_> test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult::Storage_> test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult::Storage_> test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    case 3:
      return std::make_shared<Storage_>(
          std::in_place_index<3>,
          ::fidl::internal::NaturalClone(std::get<3>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::Storage_> test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    case 3:
      return std::make_shared<Storage_>(
          std::in_place_index<3>,
          ::fidl::internal::NaturalClone(std::get<3>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse::Storage_> test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::Storage_> test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    case 3:
      return std::make_shared<Storage_>(
          std::in_place_index<3>,
          ::fidl::internal::NaturalClone(std::get<3>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::Storage_> test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    case 3:
      return std::make_shared<Storage_>(
          std::in_place_index<3>,
          ::fidl::internal::NaturalClone(std::get<3>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest::Storage_> test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest::Storage_> test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse::Storage_> test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult::Storage_> test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult::Storage_> test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse::Storage_> test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult::Storage_> test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult::Storage_> test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest::Storage_> test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest::Storage_> test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse::Storage_> test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult::Storage_> test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult::Storage_> test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse::Storage_> test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult::Storage_> test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult::Storage_> test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest::Storage_> test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse::Storage_> test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult::Storage_> test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult::Storage_> test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse::Storage_> test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult::Storage_> test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult::Storage_> test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult::Storage_> test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult::Storage_> test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse::Storage_> test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult::Storage_> test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult::Storage_> test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::Storage_> test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    case 3:
      return std::make_shared<Storage_>(
          std::in_place_index<3>,
          ::fidl::internal::NaturalClone(std::get<3>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::Storage_> test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    case 3:
      return std::make_shared<Storage_>(
          std::in_place_index<3>,
          ::fidl::internal::NaturalClone(std::get<3>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse::Storage_> test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::Storage_> test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    case 3:
      return std::make_shared<Storage_>(
          std::in_place_index<3>,
          ::fidl::internal::NaturalClone(std::get<3>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::Storage_> test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    case 3:
      return std::make_shared<Storage_>(
          std::in_place_index<3>,
          ::fidl::internal::NaturalClone(std::get<3>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse::Storage_> test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult::Storage_> test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult::Storage_> test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse::Storage_> test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult::Storage_> test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult::Storage_> test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse::Storage_> test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult::Storage_> test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult::Storage_> test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse::Storage_> test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult::Storage_> test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

std::shared_ptr<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult::Storage_> test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult::CloneStorage_() const {
  const Storage_& storage = *storage_;
  switch (storage_->index()) {
    case 1:
      return std::make_shared<Storage_>(
          std::in_place_index<1>,
          ::fidl::internal::NaturalClone(std::get<1>(storage)));
    case 2:
      return std::make_shared<Storage_>(
          std::in_place_index<2>,
          ::fidl::internal::NaturalClone(std::get<2>(storage)));
    default:
      return std::make_shared<Storage_>();
  }
}

#pragma clang diagnostic pop
