adding samples
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0f245e8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+node_modules
+target
+bazel-*
+generated
diff --git a/menu-feed/go/app b/menu-feed/go/app
new file mode 100755
index 0000000..eb6dfb6
--- /dev/null
+++ b/menu-feed/go/app
Binary files differ
diff --git a/menu-feed/go/feed.go b/menu-feed/go/feed.go
new file mode 100644
index 0000000..2f5e0f7
--- /dev/null
+++ b/menu-feed/go/feed.go
@@ -0,0 +1,135 @@
+/*
+Menu feed example used in
+https://developers.google.com/maps-booking/verticals/dining/guides/tutorials/tutorial-menu-feed-protos#go.
+*
+*/
+package main
+
+import (
+	pb "feed/app/generated/food/menu/v1/proto"
+	"fmt"
+
+	localized_text "google.golang.org/genproto/googleapis/type/localized_text"
+	money "google.golang.org/genproto/googleapis/type/money"
+	"google.golang.org/protobuf/encoding/protojson"
+	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+)
+
+func main() {
+
+	//create a menu component
+	menu := &pb.Menu{
+		MenuId:      "menu1",
+		MerchantIds: []string{"dining-1"},
+		DisplayName: &pb.TextField{
+			Text: []*localized_text.LocalizedText{{
+				Text:         "Menu",
+				LanguageCode: "en-us",
+			}},
+		},
+		Language: "en-us",
+		LastMerchantUpdateTime: &timestamppb.Timestamp{
+			Seconds: 1633621547,
+		},
+	}
+
+	//create a menu section component
+	section := &pb.MenuSection{
+		MenuSectionId: "appetizers",
+		DisplayName: &pb.TextField{
+			Text: []*localized_text.LocalizedText{{
+				Text:         "Lunch Appetizers",
+				LanguageCode: "en-us",
+			}},
+		},
+		MenuItemIds: []string{"breadsticks-sauce"},
+	}
+
+	//create a menu item component
+	item := &pb.MenuItem{
+		MenuItemId: "breadsticks-sauce",
+		DisplayName: &pb.TextField{
+			Text: []*localized_text.LocalizedText{{
+				Text:         "Breadsticks & Sauce",
+				LanguageCode: "en-us",
+			}},
+		},
+		Description: &pb.TextField{
+			Text: []*localized_text.LocalizedText{{
+				Text:         "Breakfast basket w/ side of tomato sauce (size 6 or 12)",
+				LanguageCode: "en-us",
+			}},
+		},
+		Pricing: &pb.MenuItem_MenuItemOptionSet_{
+			MenuItemOptionSet: &pb.MenuItem_MenuItemOptionSet{
+				MenuItemOptionIds: []string{"breadstick-sm", "breadstick-lg"},
+			},
+		},
+	}
+	imageUris := []string{
+		"http://www.example.com/photos/breadsticks.jpg",
+		"http://www.example.com/photos/sauce.jpg",
+	}
+	for _, uri := range imageUris {
+		image := &pb.Image{
+			Uri: uri,
+		}
+		item.Images = append(item.Images, image)
+	}
+
+	//create a menu item option
+	option := &pb.MenuItemOption{
+		MenuItemOptionId: "breadstick-sm",
+		Value: &pb.MenuItemOptionProperty{
+			PropertyType: pb.MenuItemOptionProperty_SIZE,
+			Value: &pb.MenuItemOptionProperty_TextVal{
+				TextVal: &pb.TextField{
+					Text: []*localized_text.LocalizedText{{
+						Text:         "Small",
+						LanguageCode: "en-us",
+					}},
+				},
+			},
+		},
+		OfferSet: &pb.OfferSet{
+			Offers: []*pb.Offer{{
+				Price: &money.Money{
+					CurrencyCode: "USD",
+					Units:        8,
+					Nanos:        0,
+				},
+			}},
+		},
+	}
+
+	//create feed
+	feed := &pb.FoodMenuFeed{
+		Data: []*pb.MenuComponent{{
+			Type: &pb.MenuComponent_Menu{
+				Menu: menu,
+			},
+		},
+			{
+				Type: &pb.MenuComponent_Section{
+					Section: section,
+				},
+			},
+			{
+				Type: &pb.MenuComponent_Item{
+					Item: item,
+				},
+			},
+			{
+				Type: &pb.MenuComponent_Option{
+					Option: option,
+				},
+			}},
+	}
+
+	marshalOptions := protojson.MarshalOptions{
+		UseProtoNames: true,
+	}
+	jsonBytes, _ := marshalOptions.Marshal(feed)
+	fmt.Printf("message = %s", string(jsonBytes))
+}
+
diff --git a/menu-feed/go/go.mod b/menu-feed/go/go.mod
new file mode 100644
index 0000000..732a65e
--- /dev/null
+++ b/menu-feed/go/go.mod
@@ -0,0 +1,8 @@
+module feed/app
+
+go 1.21
+
+require (
+	google.golang.org/genproto v0.0.0-20230323212658-478b75c54725
+	google.golang.org/protobuf v1.30.0
+)
diff --git a/menu-feed/go/go.sum b/menu-feed/go/go.sum
new file mode 100644
index 0000000..5a5c4ef
--- /dev/null
+++ b/menu-feed/go/go.sum
@@ -0,0 +1,10 @@
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto v0.0.0-20230323212658-478b75c54725 h1:VmCWItVXcKboEMCwZaWge+1JLiTCQSngZeINF+wzO+g=
+google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
+google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
diff --git a/menu-feed/java/pom.xml b/menu-feed/java/pom.xml
new file mode 100644
index 0000000..f056542
--- /dev/null
+++ b/menu-feed/java/pom.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.example</groupId>
+    <artifactId>feed</artifactId>
+    <version>1.0.0</version>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>11.0</java.version>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+        <protobuf.version>3.22.0</protobuf.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+            <version>4.12</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+            <version>${protobuf.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java-util</artifactId>
+            <version>${protobuf.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>3.2.2</version>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <addClasspath>true</addClasspath>
+                            <mainClass>com.example.Feed</mainClass>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <mainClass>com.example.Feed</mainClass>
+                        </manifest>
+                    </archive>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
+                        <phase>package</phase> <!-- bind to the packaging phase -->
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/menu-feed/java/src/main/java/com/example/Feed.java b/menu-feed/java/src/main/java/com/example/Feed.java
new file mode 100644
index 0000000..a689d81
--- /dev/null
+++ b/menu-feed/java/src/main/java/com/example/Feed.java
@@ -0,0 +1,106 @@
+package com.example;
+
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.google.protobuf.Timestamp;
+import com.google.type.Money;
+import com.google.protobuf.util.JsonFormat;
+import com.google.type.LocalizedText;
+import food.menu.v1.FoodMenu.FoodMenuFeed;
+import food.menu.v1.FoodMenu.Menu;
+import food.menu.v1.FoodMenu.MenuComponent;
+import food.menu.v1.FoodMenu.MenuItem;
+import food.menu.v1.FoodMenu.MenuSection;
+import food.menu.v1.FoodMenu.TextField;
+import food.menu.v1.FoodMenu.MenuItemOption;
+import food.menu.v1.FoodMenu.MenuItemOptionProperty;
+import food.menu.v1.FoodMenu.OfferSet;
+import food.menu.v1.FoodMenu.Offer;
+
+/**
+ * Menu feed example used in
+ *
+ * <p>https://developers.google.com/maps-booking/verticals/dining/guides/tutorials/tutorial-menu-feed-protos#java.
+ */
+public class Feed {
+
+  public static void main(String[] args) throws InvalidProtocolBufferException {
+    Feed feed = new Feed();
+    feed.createMenuFeed();
+  }
+
+  public void createMenuFeed() throws InvalidProtocolBufferException {
+
+    Menu.Builder menu =
+        Menu.newBuilder()
+            .setMenuId("menu1")
+            .addMerchantIds("dining-1")
+            .setDisplayName(
+                TextField.newBuilder()
+                    .addText(LocalizedText.newBuilder().setText("Menu").setLanguageCode("en-us")))
+            .setLanguage("en-us")
+            .setLastMerchantUpdateTime(Timestamp.newBuilder().setSeconds(1633621547));
+
+    MenuSection.Builder section =
+        MenuSection.newBuilder()
+            .setMenuSectionId("appetizers")
+            .setDisplayName(
+                TextField.newBuilder()
+                    .addText(
+                        LocalizedText.newBuilder()
+                            .setText("Lunch Appetizers")
+                            .setLanguageCode("en-us")))
+            .addMenuItemIds("breadsticks-sauce");
+
+    MenuItem.Builder item =
+        MenuItem.newBuilder()
+            .setMenuItemId("breadsticks-sauce")
+            .setDisplayName(
+                TextField.newBuilder()
+                    .addText(
+                        LocalizedText.newBuilder()
+                            .setText("Breadsticks & Sauce")
+                            .setLanguageCode("en-us")))
+            .setDescription(
+                TextField.newBuilder()
+                    .addText(
+                        LocalizedText.newBuilder()
+                            .setText("Breadsticks & Sauce")
+                            .setLanguageCode("en-us")));
+
+    MenuItemOption.Builder option =
+        MenuItemOption.newBuilder()
+          .setMenuItemOptionId("breadstick-sm")
+          .setValue(
+              MenuItemOptionProperty.newBuilder()
+                .setPropertyType(MenuItemOptionProperty.PropertyType.SIZE)
+                .setTextVal(TextField.newBuilder()
+                    .addText(
+                        LocalizedText.newBuilder()
+                            .setText("Small")
+                            .setLanguageCode("en-us"))))
+          .setOfferSet(
+              OfferSet.newBuilder()
+                .addOffers(
+                    Offer.newBuilder()
+                      .setPrice(
+                          Money.newBuilder()
+                            .setCurrencyCode("USD")
+                            .setUnits(8)
+                            .setNanos(0))));
+
+    FoodMenuFeed.Builder foodMenuFeed =
+        FoodMenuFeed.newBuilder()
+            .addData(MenuComponent.newBuilder().setMenu(menu))
+            .addData(MenuComponent.newBuilder().setSection(section))
+            .addData(MenuComponent.newBuilder().setItem(item))
+            .addData(MenuComponent.newBuilder().setOption(option));
+
+    String feedJSON =
+        JsonFormat.printer()
+            .omittingInsignificantWhitespace()
+            .preservingProtoFieldNames()
+            .print(foodMenuFeed);
+
+    System.out.println(feedJSON);
+  }
+}
diff --git a/menu-feed/java/src/main/java/com/google/type/LocalizedText.java b/menu-feed/java/src/main/java/com/google/type/LocalizedText.java
new file mode 100644
index 0000000..716ed77
--- /dev/null
+++ b/menu-feed/java/src/main/java/com/google/type/LocalizedText.java
@@ -0,0 +1,728 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: localized_text.proto
+
+package com.google.type;
+
+/**
+ * <pre>
+ * Localized variant of a text in a particular language.
+ * </pre>
+ *
+ * Protobuf type {@code google.type.LocalizedText}
+ */
+public final class LocalizedText extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:google.type.LocalizedText)
+    LocalizedTextOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use LocalizedText.newBuilder() to construct.
+  private LocalizedText(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private LocalizedText() {
+    text_ = "";
+    languageCode_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new LocalizedText();
+  }
+
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.google.type.LocalizedTextProto.internal_static_google_type_LocalizedText_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.google.type.LocalizedTextProto.internal_static_google_type_LocalizedText_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.google.type.LocalizedText.class, com.google.type.LocalizedText.Builder.class);
+  }
+
+  public static final int TEXT_FIELD_NUMBER = 1;
+  @SuppressWarnings("serial")
+  private volatile java.lang.Object text_ = "";
+  /**
+   * <pre>
+   * Localized string in the language corresponding to `language_code' below.
+   * </pre>
+   *
+   * <code>string text = 1;</code>
+   * @return The text.
+   */
+  @java.lang.Override
+  public java.lang.String getText() {
+    java.lang.Object ref = text_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      text_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * Localized string in the language corresponding to `language_code' below.
+   * </pre>
+   *
+   * <code>string text = 1;</code>
+   * @return The bytes for text.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getTextBytes() {
+    java.lang.Object ref = text_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      text_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int LANGUAGE_CODE_FIELD_NUMBER = 2;
+  @SuppressWarnings("serial")
+  private volatile java.lang.Object languageCode_ = "";
+  /**
+   * <pre>
+   * The text's BCP-47 language code, such as "en-US" or "sr-Latn".
+   *
+   * For more information, see
+   * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+   * </pre>
+   *
+   * <code>string language_code = 2;</code>
+   * @return The languageCode.
+   */
+  @java.lang.Override
+  public java.lang.String getLanguageCode() {
+    java.lang.Object ref = languageCode_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      languageCode_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * The text's BCP-47 language code, such as "en-US" or "sr-Latn".
+   *
+   * For more information, see
+   * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+   * </pre>
+   *
+   * <code>string language_code = 2;</code>
+   * @return The bytes for languageCode.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getLanguageCodeBytes() {
+    java.lang.Object ref = languageCode_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      languageCode_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(text_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, text_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(languageCode_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, languageCode_);
+    }
+    getUnknownFields().writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(text_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, text_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(languageCode_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, languageCode_);
+    }
+    size += getUnknownFields().getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.google.type.LocalizedText)) {
+      return super.equals(obj);
+    }
+    com.google.type.LocalizedText other = (com.google.type.LocalizedText) obj;
+
+    if (!getText()
+        .equals(other.getText())) return false;
+    if (!getLanguageCode()
+        .equals(other.getLanguageCode())) return false;
+    if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + TEXT_FIELD_NUMBER;
+    hash = (53 * hash) + getText().hashCode();
+    hash = (37 * hash) + LANGUAGE_CODE_FIELD_NUMBER;
+    hash = (53 * hash) + getLanguageCode().hashCode();
+    hash = (29 * hash) + getUnknownFields().hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.google.type.LocalizedText parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.google.type.LocalizedText parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.google.type.LocalizedText parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.google.type.LocalizedText parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.google.type.LocalizedText parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.google.type.LocalizedText parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.google.type.LocalizedText parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.google.type.LocalizedText parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.google.type.LocalizedText parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.google.type.LocalizedText parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.google.type.LocalizedText parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.google.type.LocalizedText parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.google.type.LocalizedText prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * Localized variant of a text in a particular language.
+   * </pre>
+   *
+   * Protobuf type {@code google.type.LocalizedText}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:google.type.LocalizedText)
+      com.google.type.LocalizedTextOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.type.LocalizedTextProto.internal_static_google_type_LocalizedText_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.type.LocalizedTextProto.internal_static_google_type_LocalizedText_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.google.type.LocalizedText.class, com.google.type.LocalizedText.Builder.class);
+    }
+
+    // Construct using com.google.type.LocalizedText.newBuilder()
+    private Builder() {
+
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      bitField0_ = 0;
+      text_ = "";
+      languageCode_ = "";
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.google.type.LocalizedTextProto.internal_static_google_type_LocalizedText_descriptor;
+    }
+
+    @java.lang.Override
+    public com.google.type.LocalizedText getDefaultInstanceForType() {
+      return com.google.type.LocalizedText.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.google.type.LocalizedText build() {
+      com.google.type.LocalizedText result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.google.type.LocalizedText buildPartial() {
+      com.google.type.LocalizedText result = new com.google.type.LocalizedText(this);
+      if (bitField0_ != 0) { buildPartial0(result); }
+      onBuilt();
+      return result;
+    }
+
+    private void buildPartial0(com.google.type.LocalizedText result) {
+      int from_bitField0_ = bitField0_;
+      if (((from_bitField0_ & 0x00000001) != 0)) {
+        result.text_ = text_;
+      }
+      if (((from_bitField0_ & 0x00000002) != 0)) {
+        result.languageCode_ = languageCode_;
+      }
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.google.type.LocalizedText) {
+        return mergeFrom((com.google.type.LocalizedText)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.google.type.LocalizedText other) {
+      if (other == com.google.type.LocalizedText.getDefaultInstance()) return this;
+      if (!other.getText().isEmpty()) {
+        text_ = other.text_;
+        bitField0_ |= 0x00000001;
+        onChanged();
+      }
+      if (!other.getLanguageCode().isEmpty()) {
+        languageCode_ = other.languageCode_;
+        bitField0_ |= 0x00000002;
+        onChanged();
+      }
+      this.mergeUnknownFields(other.getUnknownFields());
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              text_ = input.readStringRequireUtf8();
+              bitField0_ |= 0x00000001;
+              break;
+            } // case 10
+            case 18: {
+              languageCode_ = input.readStringRequireUtf8();
+              bitField0_ |= 0x00000002;
+              break;
+            } // case 18
+            default: {
+              if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                done = true; // was an endgroup tag
+              }
+              break;
+            } // default:
+          } // switch (tag)
+        } // while (!done)
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.unwrapIOException();
+      } finally {
+        onChanged();
+      } // finally
+      return this;
+    }
+    private int bitField0_;
+
+    private java.lang.Object text_ = "";
+    /**
+     * <pre>
+     * Localized string in the language corresponding to `language_code' below.
+     * </pre>
+     *
+     * <code>string text = 1;</code>
+     * @return The text.
+     */
+    public java.lang.String getText() {
+      java.lang.Object ref = text_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        text_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <pre>
+     * Localized string in the language corresponding to `language_code' below.
+     * </pre>
+     *
+     * <code>string text = 1;</code>
+     * @return The bytes for text.
+     */
+    public com.google.protobuf.ByteString
+        getTextBytes() {
+      java.lang.Object ref = text_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        text_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <pre>
+     * Localized string in the language corresponding to `language_code' below.
+     * </pre>
+     *
+     * <code>string text = 1;</code>
+     * @param value The text to set.
+     * @return This builder for chaining.
+     */
+    public Builder setText(
+        java.lang.String value) {
+      if (value == null) { throw new NullPointerException(); }
+      text_ = value;
+      bitField0_ |= 0x00000001;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * Localized string in the language corresponding to `language_code' below.
+     * </pre>
+     *
+     * <code>string text = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearText() {
+      text_ = getDefaultInstance().getText();
+      bitField0_ = (bitField0_ & ~0x00000001);
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * Localized string in the language corresponding to `language_code' below.
+     * </pre>
+     *
+     * <code>string text = 1;</code>
+     * @param value The bytes for text to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTextBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) { throw new NullPointerException(); }
+      checkByteStringIsUtf8(value);
+      text_ = value;
+      bitField0_ |= 0x00000001;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object languageCode_ = "";
+    /**
+     * <pre>
+     * The text's BCP-47 language code, such as "en-US" or "sr-Latn".
+     *
+     * For more information, see
+     * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+     * </pre>
+     *
+     * <code>string language_code = 2;</code>
+     * @return The languageCode.
+     */
+    public java.lang.String getLanguageCode() {
+      java.lang.Object ref = languageCode_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        languageCode_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <pre>
+     * The text's BCP-47 language code, such as "en-US" or "sr-Latn".
+     *
+     * For more information, see
+     * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+     * </pre>
+     *
+     * <code>string language_code = 2;</code>
+     * @return The bytes for languageCode.
+     */
+    public com.google.protobuf.ByteString
+        getLanguageCodeBytes() {
+      java.lang.Object ref = languageCode_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        languageCode_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <pre>
+     * The text's BCP-47 language code, such as "en-US" or "sr-Latn".
+     *
+     * For more information, see
+     * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+     * </pre>
+     *
+     * <code>string language_code = 2;</code>
+     * @param value The languageCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setLanguageCode(
+        java.lang.String value) {
+      if (value == null) { throw new NullPointerException(); }
+      languageCode_ = value;
+      bitField0_ |= 0x00000002;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The text's BCP-47 language code, such as "en-US" or "sr-Latn".
+     *
+     * For more information, see
+     * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+     * </pre>
+     *
+     * <code>string language_code = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearLanguageCode() {
+      languageCode_ = getDefaultInstance().getLanguageCode();
+      bitField0_ = (bitField0_ & ~0x00000002);
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The text's BCP-47 language code, such as "en-US" or "sr-Latn".
+     *
+     * For more information, see
+     * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+     * </pre>
+     *
+     * <code>string language_code = 2;</code>
+     * @param value The bytes for languageCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setLanguageCodeBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) { throw new NullPointerException(); }
+      checkByteStringIsUtf8(value);
+      languageCode_ = value;
+      bitField0_ |= 0x00000002;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:google.type.LocalizedText)
+  }
+
+  // @@protoc_insertion_point(class_scope:google.type.LocalizedText)
+  private static final com.google.type.LocalizedText DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.google.type.LocalizedText();
+  }
+
+  public static com.google.type.LocalizedText getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<LocalizedText>
+      PARSER = new com.google.protobuf.AbstractParser<LocalizedText>() {
+    @java.lang.Override
+    public LocalizedText parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      Builder builder = newBuilder();
+      try {
+        builder.mergeFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(builder.buildPartial());
+      } catch (com.google.protobuf.UninitializedMessageException e) {
+        throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(e)
+            .setUnfinishedMessage(builder.buildPartial());
+      }
+      return builder.buildPartial();
+    }
+  };
+
+  public static com.google.protobuf.Parser<LocalizedText> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<LocalizedText> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.type.LocalizedText getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/menu-feed/java/src/main/java/com/google/type/LocalizedTextOrBuilder.java b/menu-feed/java/src/main/java/com/google/type/LocalizedTextOrBuilder.java
new file mode 100644
index 0000000..4d4a2c0
--- /dev/null
+++ b/menu-feed/java/src/main/java/com/google/type/LocalizedTextOrBuilder.java
@@ -0,0 +1,55 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: localized_text.proto
+
+package com.google.type;
+
+public interface LocalizedTextOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:google.type.LocalizedText)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * Localized string in the language corresponding to `language_code' below.
+   * </pre>
+   *
+   * <code>string text = 1;</code>
+   * @return The text.
+   */
+  java.lang.String getText();
+  /**
+   * <pre>
+   * Localized string in the language corresponding to `language_code' below.
+   * </pre>
+   *
+   * <code>string text = 1;</code>
+   * @return The bytes for text.
+   */
+  com.google.protobuf.ByteString
+      getTextBytes();
+
+  /**
+   * <pre>
+   * The text's BCP-47 language code, such as "en-US" or "sr-Latn".
+   *
+   * For more information, see
+   * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+   * </pre>
+   *
+   * <code>string language_code = 2;</code>
+   * @return The languageCode.
+   */
+  java.lang.String getLanguageCode();
+  /**
+   * <pre>
+   * The text's BCP-47 language code, such as "en-US" or "sr-Latn".
+   *
+   * For more information, see
+   * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+   * </pre>
+   *
+   * <code>string language_code = 2;</code>
+   * @return The bytes for languageCode.
+   */
+  com.google.protobuf.ByteString
+      getLanguageCodeBytes();
+}
diff --git a/menu-feed/java/src/main/java/com/google/type/LocalizedTextProto.java b/menu-feed/java/src/main/java/com/google/type/LocalizedTextProto.java
new file mode 100644
index 0000000..6d8137f
--- /dev/null
+++ b/menu-feed/java/src/main/java/com/google/type/LocalizedTextProto.java
@@ -0,0 +1,51 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: localized_text.proto
+
+package com.google.type;
+
+public final class LocalizedTextProto {
+  private LocalizedTextProto() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_type_LocalizedText_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_google_type_LocalizedText_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static  com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\024localized_text.proto\022\013google.type\"4\n\rL" +
+      "ocalizedText\022\014\n\004text\030\001 \001(\t\022\025\n\rlanguage_c" +
+      "ode\030\002 \001(\tBz\n\017com.google.typeB\022LocalizedT" +
+      "extProtoP\001ZHgoogle.golang.org/genproto/g" +
+      "oogleapis/type/localized_text;localized_" +
+      "text\370\001\001\242\002\003GTPb\006proto3"
+    };
+    descriptor = com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        });
+    internal_static_google_type_LocalizedText_descriptor =
+      getDescriptor().getMessageTypes().get(0);
+    internal_static_google_type_LocalizedText_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_google_type_LocalizedText_descriptor,
+        new java.lang.String[] { "Text", "LanguageCode", });
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/menu-feed/java/src/main/java/com/google/type/Money.java b/menu-feed/java/src/main/java/com/google/type/Money.java
new file mode 100644
index 0000000..c921feb
--- /dev/null
+++ b/menu-feed/java/src/main/java/com/google/type/Money.java
@@ -0,0 +1,732 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: money.proto
+
+package com.google.type;
+
+/**
+ * <pre>
+ * Represents an amount of money with its currency type.
+ * </pre>
+ *
+ * Protobuf type {@code google.type.Money}
+ */
+public final class Money extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:google.type.Money)
+    MoneyOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use Money.newBuilder() to construct.
+  private Money(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private Money() {
+    currencyCode_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new Money();
+  }
+
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.google.type.MoneyProto.internal_static_google_type_Money_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.google.type.MoneyProto.internal_static_google_type_Money_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.google.type.Money.class, com.google.type.Money.Builder.class);
+  }
+
+  public static final int CURRENCY_CODE_FIELD_NUMBER = 1;
+  @SuppressWarnings("serial")
+  private volatile java.lang.Object currencyCode_ = "";
+  /**
+   * <pre>
+   * The three-letter currency code defined in ISO 4217.
+   * </pre>
+   *
+   * <code>string currency_code = 1;</code>
+   * @return The currencyCode.
+   */
+  @java.lang.Override
+  public java.lang.String getCurrencyCode() {
+    java.lang.Object ref = currencyCode_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      currencyCode_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * The three-letter currency code defined in ISO 4217.
+   * </pre>
+   *
+   * <code>string currency_code = 1;</code>
+   * @return The bytes for currencyCode.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getCurrencyCodeBytes() {
+    java.lang.Object ref = currencyCode_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      currencyCode_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int UNITS_FIELD_NUMBER = 2;
+  private long units_ = 0L;
+  /**
+   * <pre>
+   * The whole units of the amount.
+   * For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
+   * </pre>
+   *
+   * <code>int64 units = 2;</code>
+   * @return The units.
+   */
+  @java.lang.Override
+  public long getUnits() {
+    return units_;
+  }
+
+  public static final int NANOS_FIELD_NUMBER = 3;
+  private int nanos_ = 0;
+  /**
+   * <pre>
+   * Number of nano (10^-9) units of the amount.
+   * The value must be between -999,999,999 and +999,999,999 inclusive.
+   * If `units` is positive, `nanos` must be positive or zero.
+   * If `units` is zero, `nanos` can be positive, zero, or negative.
+   * If `units` is negative, `nanos` must be negative or zero.
+   * For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
+   * </pre>
+   *
+   * <code>int32 nanos = 3;</code>
+   * @return The nanos.
+   */
+  @java.lang.Override
+  public int getNanos() {
+    return nanos_;
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(currencyCode_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, currencyCode_);
+    }
+    if (units_ != 0L) {
+      output.writeInt64(2, units_);
+    }
+    if (nanos_ != 0) {
+      output.writeInt32(3, nanos_);
+    }
+    getUnknownFields().writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(currencyCode_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, currencyCode_);
+    }
+    if (units_ != 0L) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt64Size(2, units_);
+    }
+    if (nanos_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt32Size(3, nanos_);
+    }
+    size += getUnknownFields().getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.google.type.Money)) {
+      return super.equals(obj);
+    }
+    com.google.type.Money other = (com.google.type.Money) obj;
+
+    if (!getCurrencyCode()
+        .equals(other.getCurrencyCode())) return false;
+    if (getUnits()
+        != other.getUnits()) return false;
+    if (getNanos()
+        != other.getNanos()) return false;
+    if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + CURRENCY_CODE_FIELD_NUMBER;
+    hash = (53 * hash) + getCurrencyCode().hashCode();
+    hash = (37 * hash) + UNITS_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+        getUnits());
+    hash = (37 * hash) + NANOS_FIELD_NUMBER;
+    hash = (53 * hash) + getNanos();
+    hash = (29 * hash) + getUnknownFields().hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.google.type.Money parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.google.type.Money parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.google.type.Money parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.google.type.Money parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.google.type.Money parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.google.type.Money parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.google.type.Money parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.google.type.Money parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.google.type.Money parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.google.type.Money parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.google.type.Money parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.google.type.Money parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.google.type.Money prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * Represents an amount of money with its currency type.
+   * </pre>
+   *
+   * Protobuf type {@code google.type.Money}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:google.type.Money)
+      com.google.type.MoneyOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.type.MoneyProto.internal_static_google_type_Money_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.type.MoneyProto.internal_static_google_type_Money_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.google.type.Money.class, com.google.type.Money.Builder.class);
+    }
+
+    // Construct using com.google.type.Money.newBuilder()
+    private Builder() {
+
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      bitField0_ = 0;
+      currencyCode_ = "";
+      units_ = 0L;
+      nanos_ = 0;
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.google.type.MoneyProto.internal_static_google_type_Money_descriptor;
+    }
+
+    @java.lang.Override
+    public com.google.type.Money getDefaultInstanceForType() {
+      return com.google.type.Money.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.google.type.Money build() {
+      com.google.type.Money result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.google.type.Money buildPartial() {
+      com.google.type.Money result = new com.google.type.Money(this);
+      if (bitField0_ != 0) { buildPartial0(result); }
+      onBuilt();
+      return result;
+    }
+
+    private void buildPartial0(com.google.type.Money result) {
+      int from_bitField0_ = bitField0_;
+      if (((from_bitField0_ & 0x00000001) != 0)) {
+        result.currencyCode_ = currencyCode_;
+      }
+      if (((from_bitField0_ & 0x00000002) != 0)) {
+        result.units_ = units_;
+      }
+      if (((from_bitField0_ & 0x00000004) != 0)) {
+        result.nanos_ = nanos_;
+      }
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.google.type.Money) {
+        return mergeFrom((com.google.type.Money)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.google.type.Money other) {
+      if (other == com.google.type.Money.getDefaultInstance()) return this;
+      if (!other.getCurrencyCode().isEmpty()) {
+        currencyCode_ = other.currencyCode_;
+        bitField0_ |= 0x00000001;
+        onChanged();
+      }
+      if (other.getUnits() != 0L) {
+        setUnits(other.getUnits());
+      }
+      if (other.getNanos() != 0) {
+        setNanos(other.getNanos());
+      }
+      this.mergeUnknownFields(other.getUnknownFields());
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              currencyCode_ = input.readStringRequireUtf8();
+              bitField0_ |= 0x00000001;
+              break;
+            } // case 10
+            case 16: {
+              units_ = input.readInt64();
+              bitField0_ |= 0x00000002;
+              break;
+            } // case 16
+            case 24: {
+              nanos_ = input.readInt32();
+              bitField0_ |= 0x00000004;
+              break;
+            } // case 24
+            default: {
+              if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                done = true; // was an endgroup tag
+              }
+              break;
+            } // default:
+          } // switch (tag)
+        } // while (!done)
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.unwrapIOException();
+      } finally {
+        onChanged();
+      } // finally
+      return this;
+    }
+    private int bitField0_;
+
+    private java.lang.Object currencyCode_ = "";
+    /**
+     * <pre>
+     * The three-letter currency code defined in ISO 4217.
+     * </pre>
+     *
+     * <code>string currency_code = 1;</code>
+     * @return The currencyCode.
+     */
+    public java.lang.String getCurrencyCode() {
+      java.lang.Object ref = currencyCode_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        currencyCode_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <pre>
+     * The three-letter currency code defined in ISO 4217.
+     * </pre>
+     *
+     * <code>string currency_code = 1;</code>
+     * @return The bytes for currencyCode.
+     */
+    public com.google.protobuf.ByteString
+        getCurrencyCodeBytes() {
+      java.lang.Object ref = currencyCode_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        currencyCode_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <pre>
+     * The three-letter currency code defined in ISO 4217.
+     * </pre>
+     *
+     * <code>string currency_code = 1;</code>
+     * @param value The currencyCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCurrencyCode(
+        java.lang.String value) {
+      if (value == null) { throw new NullPointerException(); }
+      currencyCode_ = value;
+      bitField0_ |= 0x00000001;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The three-letter currency code defined in ISO 4217.
+     * </pre>
+     *
+     * <code>string currency_code = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearCurrencyCode() {
+      currencyCode_ = getDefaultInstance().getCurrencyCode();
+      bitField0_ = (bitField0_ & ~0x00000001);
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The three-letter currency code defined in ISO 4217.
+     * </pre>
+     *
+     * <code>string currency_code = 1;</code>
+     * @param value The bytes for currencyCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCurrencyCodeBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) { throw new NullPointerException(); }
+      checkByteStringIsUtf8(value);
+      currencyCode_ = value;
+      bitField0_ |= 0x00000001;
+      onChanged();
+      return this;
+    }
+
+    private long units_ ;
+    /**
+     * <pre>
+     * The whole units of the amount.
+     * For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
+     * </pre>
+     *
+     * <code>int64 units = 2;</code>
+     * @return The units.
+     */
+    @java.lang.Override
+    public long getUnits() {
+      return units_;
+    }
+    /**
+     * <pre>
+     * The whole units of the amount.
+     * For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
+     * </pre>
+     *
+     * <code>int64 units = 2;</code>
+     * @param value The units to set.
+     * @return This builder for chaining.
+     */
+    public Builder setUnits(long value) {
+
+      units_ = value;
+      bitField0_ |= 0x00000002;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The whole units of the amount.
+     * For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
+     * </pre>
+     *
+     * <code>int64 units = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearUnits() {
+      bitField0_ = (bitField0_ & ~0x00000002);
+      units_ = 0L;
+      onChanged();
+      return this;
+    }
+
+    private int nanos_ ;
+    /**
+     * <pre>
+     * Number of nano (10^-9) units of the amount.
+     * The value must be between -999,999,999 and +999,999,999 inclusive.
+     * If `units` is positive, `nanos` must be positive or zero.
+     * If `units` is zero, `nanos` can be positive, zero, or negative.
+     * If `units` is negative, `nanos` must be negative or zero.
+     * For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
+     * </pre>
+     *
+     * <code>int32 nanos = 3;</code>
+     * @return The nanos.
+     */
+    @java.lang.Override
+    public int getNanos() {
+      return nanos_;
+    }
+    /**
+     * <pre>
+     * Number of nano (10^-9) units of the amount.
+     * The value must be between -999,999,999 and +999,999,999 inclusive.
+     * If `units` is positive, `nanos` must be positive or zero.
+     * If `units` is zero, `nanos` can be positive, zero, or negative.
+     * If `units` is negative, `nanos` must be negative or zero.
+     * For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
+     * </pre>
+     *
+     * <code>int32 nanos = 3;</code>
+     * @param value The nanos to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNanos(int value) {
+
+      nanos_ = value;
+      bitField0_ |= 0x00000004;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * Number of nano (10^-9) units of the amount.
+     * The value must be between -999,999,999 and +999,999,999 inclusive.
+     * If `units` is positive, `nanos` must be positive or zero.
+     * If `units` is zero, `nanos` can be positive, zero, or negative.
+     * If `units` is negative, `nanos` must be negative or zero.
+     * For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
+     * </pre>
+     *
+     * <code>int32 nanos = 3;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearNanos() {
+      bitField0_ = (bitField0_ & ~0x00000004);
+      nanos_ = 0;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:google.type.Money)
+  }
+
+  // @@protoc_insertion_point(class_scope:google.type.Money)
+  private static final com.google.type.Money DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.google.type.Money();
+  }
+
+  public static com.google.type.Money getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<Money>
+      PARSER = new com.google.protobuf.AbstractParser<Money>() {
+    @java.lang.Override
+    public Money parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      Builder builder = newBuilder();
+      try {
+        builder.mergeFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(builder.buildPartial());
+      } catch (com.google.protobuf.UninitializedMessageException e) {
+        throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(e)
+            .setUnfinishedMessage(builder.buildPartial());
+      }
+      return builder.buildPartial();
+    }
+  };
+
+  public static com.google.protobuf.Parser<Money> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<Money> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.type.Money getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/menu-feed/java/src/main/java/com/google/type/MoneyOrBuilder.java b/menu-feed/java/src/main/java/com/google/type/MoneyOrBuilder.java
new file mode 100644
index 0000000..ed05c1e
--- /dev/null
+++ b/menu-feed/java/src/main/java/com/google/type/MoneyOrBuilder.java
@@ -0,0 +1,55 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: money.proto
+
+package com.google.type;
+
+public interface MoneyOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:google.type.Money)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * The three-letter currency code defined in ISO 4217.
+   * </pre>
+   *
+   * <code>string currency_code = 1;</code>
+   * @return The currencyCode.
+   */
+  java.lang.String getCurrencyCode();
+  /**
+   * <pre>
+   * The three-letter currency code defined in ISO 4217.
+   * </pre>
+   *
+   * <code>string currency_code = 1;</code>
+   * @return The bytes for currencyCode.
+   */
+  com.google.protobuf.ByteString
+      getCurrencyCodeBytes();
+
+  /**
+   * <pre>
+   * The whole units of the amount.
+   * For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
+   * </pre>
+   *
+   * <code>int64 units = 2;</code>
+   * @return The units.
+   */
+  long getUnits();
+
+  /**
+   * <pre>
+   * Number of nano (10^-9) units of the amount.
+   * The value must be between -999,999,999 and +999,999,999 inclusive.
+   * If `units` is positive, `nanos` must be positive or zero.
+   * If `units` is zero, `nanos` can be positive, zero, or negative.
+   * If `units` is negative, `nanos` must be negative or zero.
+   * For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
+   * </pre>
+   *
+   * <code>int32 nanos = 3;</code>
+   * @return The nanos.
+   */
+  int getNanos();
+}
diff --git a/menu-feed/java/src/main/java/com/google/type/MoneyProto.java b/menu-feed/java/src/main/java/com/google/type/MoneyProto.java
new file mode 100644
index 0000000..24fe444
--- /dev/null
+++ b/menu-feed/java/src/main/java/com/google/type/MoneyProto.java
@@ -0,0 +1,50 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: money.proto
+
+package com.google.type;
+
+public final class MoneyProto {
+  private MoneyProto() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_type_Money_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_google_type_Money_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static  com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\013money.proto\022\013google.type\"<\n\005Money\022\025\n\rc" +
+      "urrency_code\030\001 \001(\t\022\r\n\005units\030\002 \001(\003\022\r\n\005nan" +
+      "os\030\003 \001(\005B`\n\017com.google.typeB\nMoneyProtoP" +
+      "\001Z6google.golang.org/genproto/googleapis" +
+      "/type/money;money\370\001\001\242\002\003GTPb\006proto3"
+    };
+    descriptor = com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        });
+    internal_static_google_type_Money_descriptor =
+      getDescriptor().getMessageTypes().get(0);
+    internal_static_google_type_Money_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_google_type_Money_descriptor,
+        new java.lang.String[] { "CurrencyCode", "Units", "Nanos", });
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/menu-feed/java/src/main/java/food/menu/v1/FoodMenu.java b/menu-feed/java/src/main/java/food/menu/v1/FoodMenu.java
new file mode 100644
index 0000000..4a0936d
--- /dev/null
+++ b/menu-feed/java/src/main/java/food/menu/v1/FoodMenu.java
@@ -0,0 +1,26852 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: food_menu.proto
+
+package food.menu.v1;
+
+public final class FoodMenu {
+  private FoodMenu() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+  /**
+   * <pre>
+   * Indicates a dietary restriction or guideline adhered to during
+   * food preparation.
+   * </pre>
+   *
+   * Protobuf enum {@code food.menu.v1.DietaryRestriction}
+   */
+  public enum DietaryRestriction
+      implements com.google.protobuf.ProtocolMessageEnum {
+    /**
+     * <pre>
+     * Do not use. The dietary restriction is not explicitly specified.
+     * </pre>
+     *
+     * <code>DIET_UNSPECIFIED = 0;</code>
+     */
+    DIET_UNSPECIFIED(0),
+    /**
+     * <code>DIET_DIABETIC = 1;</code>
+     */
+    DIET_DIABETIC(1),
+    /**
+     * <code>DIET_GLUTEN_FREE = 2;</code>
+     */
+    DIET_GLUTEN_FREE(2),
+    /**
+     * <code>DIET_HALAL = 3;</code>
+     */
+    DIET_HALAL(3),
+    /**
+     * <code>DIET_HINDU = 4;</code>
+     */
+    DIET_HINDU(4),
+    /**
+     * <code>DIET_KOSHER = 5;</code>
+     */
+    DIET_KOSHER(5),
+    /**
+     * <code>DIET_LOW_CALORIE = 6;</code>
+     */
+    DIET_LOW_CALORIE(6),
+    /**
+     * <code>DIET_LOW_FAT = 7;</code>
+     */
+    DIET_LOW_FAT(7),
+    /**
+     * <code>DIET_LOW_LACTOSE = 8;</code>
+     */
+    DIET_LOW_LACTOSE(8),
+    /**
+     * <code>DIET_LOW_SALT = 9;</code>
+     */
+    DIET_LOW_SALT(9),
+    /**
+     * <code>DIET_VEGAN = 10;</code>
+     */
+    DIET_VEGAN(10),
+    /**
+     * <code>DIET_VEGETARIAN = 11;</code>
+     */
+    DIET_VEGETARIAN(11),
+    UNRECOGNIZED(-1),
+    ;
+
+    /**
+     * <pre>
+     * Do not use. The dietary restriction is not explicitly specified.
+     * </pre>
+     *
+     * <code>DIET_UNSPECIFIED = 0;</code>
+     */
+    public static final int DIET_UNSPECIFIED_VALUE = 0;
+    /**
+     * <code>DIET_DIABETIC = 1;</code>
+     */
+    public static final int DIET_DIABETIC_VALUE = 1;
+    /**
+     * <code>DIET_GLUTEN_FREE = 2;</code>
+     */
+    public static final int DIET_GLUTEN_FREE_VALUE = 2;
+    /**
+     * <code>DIET_HALAL = 3;</code>
+     */
+    public static final int DIET_HALAL_VALUE = 3;
+    /**
+     * <code>DIET_HINDU = 4;</code>
+     */
+    public static final int DIET_HINDU_VALUE = 4;
+    /**
+     * <code>DIET_KOSHER = 5;</code>
+     */
+    public static final int DIET_KOSHER_VALUE = 5;
+    /**
+     * <code>DIET_LOW_CALORIE = 6;</code>
+     */
+    public static final int DIET_LOW_CALORIE_VALUE = 6;
+    /**
+     * <code>DIET_LOW_FAT = 7;</code>
+     */
+    public static final int DIET_LOW_FAT_VALUE = 7;
+    /**
+     * <code>DIET_LOW_LACTOSE = 8;</code>
+     */
+    public static final int DIET_LOW_LACTOSE_VALUE = 8;
+    /**
+     * <code>DIET_LOW_SALT = 9;</code>
+     */
+    public static final int DIET_LOW_SALT_VALUE = 9;
+    /**
+     * <code>DIET_VEGAN = 10;</code>
+     */
+    public static final int DIET_VEGAN_VALUE = 10;
+    /**
+     * <code>DIET_VEGETARIAN = 11;</code>
+     */
+    public static final int DIET_VEGETARIAN_VALUE = 11;
+
+
+    public final int getNumber() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalArgumentException(
+            "Can't get the number of an unknown enum value.");
+      }
+      return value;
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
+    public static DietaryRestriction valueOf(int value) {
+      return forNumber(value);
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     */
+    public static DietaryRestriction forNumber(int value) {
+      switch (value) {
+        case 0: return DIET_UNSPECIFIED;
+        case 1: return DIET_DIABETIC;
+        case 2: return DIET_GLUTEN_FREE;
+        case 3: return DIET_HALAL;
+        case 4: return DIET_HINDU;
+        case 5: return DIET_KOSHER;
+        case 6: return DIET_LOW_CALORIE;
+        case 7: return DIET_LOW_FAT;
+        case 8: return DIET_LOW_LACTOSE;
+        case 9: return DIET_LOW_SALT;
+        case 10: return DIET_VEGAN;
+        case 11: return DIET_VEGETARIAN;
+        default: return null;
+      }
+    }
+
+    public static com.google.protobuf.Internal.EnumLiteMap<DietaryRestriction>
+        internalGetValueMap() {
+      return internalValueMap;
+    }
+    private static final com.google.protobuf.Internal.EnumLiteMap<
+        DietaryRestriction> internalValueMap =
+          new com.google.protobuf.Internal.EnumLiteMap<DietaryRestriction>() {
+            public DietaryRestriction findValueByNumber(int number) {
+              return DietaryRestriction.forNumber(number);
+            }
+          };
+
+    public final com.google.protobuf.Descriptors.EnumValueDescriptor
+        getValueDescriptor() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalStateException(
+            "Can't get the descriptor of an unrecognized enum value.");
+      }
+      return getDescriptor().getValues().get(ordinal());
+    }
+    public final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptorForType() {
+      return getDescriptor();
+    }
+    public static final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.getDescriptor().getEnumTypes().get(0);
+    }
+
+    private static final DietaryRestriction[] VALUES = values();
+
+    public static DietaryRestriction valueOf(
+        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+      if (desc.getType() != getDescriptor()) {
+        throw new java.lang.IllegalArgumentException(
+          "EnumValueDescriptor is not for this type.");
+      }
+      if (desc.getIndex() == -1) {
+        return UNRECOGNIZED;
+      }
+      return VALUES[desc.getIndex()];
+    }
+
+    private final int value;
+
+    private DietaryRestriction(int value) {
+      this.value = value;
+    }
+
+    // @@protoc_insertion_point(enum_scope:food.menu.v1.DietaryRestriction)
+  }
+
+  /**
+   * <pre>
+   * Allergen type derived from GS1: http://gs1.org/voc/AllergenTypeCode
+   * </pre>
+   *
+   * Protobuf enum {@code food.menu.v1.AllergenTypeCode}
+   */
+  public enum AllergenTypeCode
+      implements com.google.protobuf.ProtocolMessageEnum {
+    /**
+     * <pre>
+     * Do not use. The allergen type code is not explicitly specified.
+     * </pre>
+     *
+     * <code>ALLERGEN_TYPE_CODE_UNSPECIFIED = 0;</code>
+     */
+    ALLERGEN_TYPE_CODE_UNSPECIFIED(0),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_ALMONDS = 1;</code>
+     */
+    ALLERGEN_TYPE_CODE_ALMONDS(1),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_ALPHA_ISOMETHYL_IONONE = 2;</code>
+     */
+    ALLERGEN_TYPE_CODE_ALPHA_ISOMETHYL_IONONE(2),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_ALCOHOL = 3;</code>
+     */
+    ALLERGEN_TYPE_CODE_ALCOHOL(3),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_AMYL_CINNAMAL = 4;</code>
+     */
+    ALLERGEN_TYPE_CODE_AMYL_CINNAMAL(4),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_ANISE_ALCOHOL = 5;</code>
+     */
+    ALLERGEN_TYPE_CODE_ANISE_ALCOHOL(5),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_BARLEY = 6;</code>
+     */
+    ALLERGEN_TYPE_CODE_BARLEY(6),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_BENZYL_ALCOHOL = 7;</code>
+     */
+    ALLERGEN_TYPE_CODE_BENZYL_ALCOHOL(7),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_BENZYL_BENZOATE = 8;</code>
+     */
+    ALLERGEN_TYPE_CODE_BENZYL_BENZOATE(8),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_BENZYL_CINNAMATE = 9;</code>
+     */
+    ALLERGEN_TYPE_CODE_BENZYL_CINNAMATE(9),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_BENZYL_SALICYLATE = 10;</code>
+     */
+    ALLERGEN_TYPE_CODE_BENZYL_SALICYLATE(10),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_BRAZIL_NUTS = 11;</code>
+     */
+    ALLERGEN_TYPE_CODE_BRAZIL_NUTS(11),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_BUTYLPHENYL_METHYLPROPIONATE = 12;</code>
+     */
+    ALLERGEN_TYPE_CODE_BUTYLPHENYL_METHYLPROPIONATE(12),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CARROTS = 13;</code>
+     */
+    ALLERGEN_TYPE_CODE_CARROTS(13),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CASHEW_NUTS = 14;</code>
+     */
+    ALLERGEN_TYPE_CODE_CASHEW_NUTS(14),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CELERY = 15;</code>
+     */
+    ALLERGEN_TYPE_CODE_CELERY(15),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CEREALS_CONTAINING_GLUTEN = 16;</code>
+     */
+    ALLERGEN_TYPE_CODE_CEREALS_CONTAINING_GLUTEN(16),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CINNAMAL = 17;</code>
+     */
+    ALLERGEN_TYPE_CODE_CINNAMAL(17),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CINNAMYL_ALCOHOL = 18;</code>
+     */
+    ALLERGEN_TYPE_CODE_CINNAMYL_ALCOHOL(18),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CITRAL = 19;</code>
+     */
+    ALLERGEN_TYPE_CODE_CITRAL(19),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CITRONELLOL = 20;</code>
+     */
+    ALLERGEN_TYPE_CODE_CITRONELLOL(20),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_COCOA = 21;</code>
+     */
+    ALLERGEN_TYPE_CODE_COCOA(21),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CORIANDER = 22;</code>
+     */
+    ALLERGEN_TYPE_CODE_CORIANDER(22),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CORN = 23;</code>
+     */
+    ALLERGEN_TYPE_CODE_CORN(23),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_COUMARIN = 24;</code>
+     */
+    ALLERGEN_TYPE_CODE_COUMARIN(24),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CRUSTACEANS = 25;</code>
+     */
+    ALLERGEN_TYPE_CODE_CRUSTACEANS(25),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_EGGS = 26;</code>
+     */
+    ALLERGEN_TYPE_CODE_EGGS(26),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_EUGENOL = 27;</code>
+     */
+    ALLERGEN_TYPE_CODE_EUGENOL(27),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_EVERNIA_FURFURACEA = 28;</code>
+     */
+    ALLERGEN_TYPE_CODE_EVERNIA_FURFURACEA(28),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_EVERNIA_PRUNASTRI = 29;</code>
+     */
+    ALLERGEN_TYPE_CODE_EVERNIA_PRUNASTRI(29),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_FARNESOL = 30;</code>
+     */
+    ALLERGEN_TYPE_CODE_FARNESOL(30),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_FISH = 31;</code>
+     */
+    ALLERGEN_TYPE_CODE_FISH(31),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_GERANIOL = 32;</code>
+     */
+    ALLERGEN_TYPE_CODE_GERANIOL(32),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_GLUTEN = 33;</code>
+     */
+    ALLERGEN_TYPE_CODE_GLUTEN(33),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_HAZELNUTS = 34;</code>
+     */
+    ALLERGEN_TYPE_CODE_HAZELNUTS(34),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_HEXYL_CINNAMAL = 35;</code>
+     */
+    ALLERGEN_TYPE_CODE_HEXYL_CINNAMAL(35),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_HYDROXYCITRONELLAL = 36;</code>
+     */
+    ALLERGEN_TYPE_CODE_HYDROXYCITRONELLAL(36),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_HYDROXYISOHEXYL_3_CYCLOHEXENE_CARBOXALDEHYDE_ISOEUGENOL_LIMONENE_LINAL = 37;</code>
+     */
+    ALLERGEN_TYPE_CODE_HYDROXYISOHEXYL_3_CYCLOHEXENE_CARBOXALDEHYDE_ISOEUGENOL_LIMONENE_LINAL(37),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_KAMUT = 38;</code>
+     */
+    ALLERGEN_TYPE_CODE_KAMUT(38),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_LACTOSE = 39;</code>
+     */
+    ALLERGEN_TYPE_CODE_LACTOSE(39),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_LUPINE = 40;</code>
+     */
+    ALLERGEN_TYPE_CODE_LUPINE(40),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_MACADAMIA_NUTS = 41;</code>
+     */
+    ALLERGEN_TYPE_CODE_MACADAMIA_NUTS(41),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_METHYL_2_OCTYNOATE = 42;</code>
+     */
+    ALLERGEN_TYPE_CODE_METHYL_2_OCTYNOATE(42),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_MILK = 43;</code>
+     */
+    ALLERGEN_TYPE_CODE_MILK(43),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_MOLLUSCS = 44;</code>
+     */
+    ALLERGEN_TYPE_CODE_MOLLUSCS(44),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_MUSTARD = 45;</code>
+     */
+    ALLERGEN_TYPE_CODE_MUSTARD(45),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_NO_DECLARED_ALLERGENS = 46;</code>
+     */
+    ALLERGEN_TYPE_CODE_NO_DECLARED_ALLERGENS(46),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_OAT = 47;</code>
+     */
+    ALLERGEN_TYPE_CODE_OAT(47),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_PEANUTS = 48;</code>
+     */
+    ALLERGEN_TYPE_CODE_PEANUTS(48),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_PEAS = 49;</code>
+     */
+    ALLERGEN_TYPE_CODE_PEAS(49),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_PECAN_NUTS = 50;</code>
+     */
+    ALLERGEN_TYPE_CODE_PECAN_NUTS(50),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_PISTACHIOS = 51;</code>
+     */
+    ALLERGEN_TYPE_CODE_PISTACHIOS(51),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_POD_FRUITS = 52;</code>
+     */
+    ALLERGEN_TYPE_CODE_POD_FRUITS(52),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_QUEENSLAND_NUTS = 53;</code>
+     */
+    ALLERGEN_TYPE_CODE_QUEENSLAND_NUTS(53),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_RYE = 54;</code>
+     */
+    ALLERGEN_TYPE_CODE_RYE(54),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_SESAME_SEEDS = 55;</code>
+     */
+    ALLERGEN_TYPE_CODE_SESAME_SEEDS(55),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_SOYBEANS = 56;</code>
+     */
+    ALLERGEN_TYPE_CODE_SOYBEANS(56),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_SPELT = 57;</code>
+     */
+    ALLERGEN_TYPE_CODE_SPELT(57),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_SULPHUR_DIOXIDE = 58;</code>
+     */
+    ALLERGEN_TYPE_CODE_SULPHUR_DIOXIDE(58),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_TREE_NUTS = 59;</code>
+     */
+    ALLERGEN_TYPE_CODE_TREE_NUTS(59),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_TREE_NUT_TRACES = 60;</code>
+     */
+    ALLERGEN_TYPE_CODE_TREE_NUT_TRACES(60),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_WALNUTS = 61;</code>
+     */
+    ALLERGEN_TYPE_CODE_WALNUTS(61),
+    /**
+     * <code>ALLERGEN_TYPE_CODE_WHEAT = 62;</code>
+     */
+    ALLERGEN_TYPE_CODE_WHEAT(62),
+    UNRECOGNIZED(-1),
+    ;
+
+    /**
+     * <pre>
+     * Do not use. The allergen type code is not explicitly specified.
+     * </pre>
+     *
+     * <code>ALLERGEN_TYPE_CODE_UNSPECIFIED = 0;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_UNSPECIFIED_VALUE = 0;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_ALMONDS = 1;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_ALMONDS_VALUE = 1;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_ALPHA_ISOMETHYL_IONONE = 2;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_ALPHA_ISOMETHYL_IONONE_VALUE = 2;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_ALCOHOL = 3;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_ALCOHOL_VALUE = 3;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_AMYL_CINNAMAL = 4;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_AMYL_CINNAMAL_VALUE = 4;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_ANISE_ALCOHOL = 5;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_ANISE_ALCOHOL_VALUE = 5;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_BARLEY = 6;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_BARLEY_VALUE = 6;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_BENZYL_ALCOHOL = 7;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_BENZYL_ALCOHOL_VALUE = 7;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_BENZYL_BENZOATE = 8;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_BENZYL_BENZOATE_VALUE = 8;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_BENZYL_CINNAMATE = 9;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_BENZYL_CINNAMATE_VALUE = 9;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_BENZYL_SALICYLATE = 10;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_BENZYL_SALICYLATE_VALUE = 10;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_BRAZIL_NUTS = 11;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_BRAZIL_NUTS_VALUE = 11;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_BUTYLPHENYL_METHYLPROPIONATE = 12;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_BUTYLPHENYL_METHYLPROPIONATE_VALUE = 12;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CARROTS = 13;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_CARROTS_VALUE = 13;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CASHEW_NUTS = 14;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_CASHEW_NUTS_VALUE = 14;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CELERY = 15;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_CELERY_VALUE = 15;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CEREALS_CONTAINING_GLUTEN = 16;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_CEREALS_CONTAINING_GLUTEN_VALUE = 16;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CINNAMAL = 17;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_CINNAMAL_VALUE = 17;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CINNAMYL_ALCOHOL = 18;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_CINNAMYL_ALCOHOL_VALUE = 18;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CITRAL = 19;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_CITRAL_VALUE = 19;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CITRONELLOL = 20;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_CITRONELLOL_VALUE = 20;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_COCOA = 21;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_COCOA_VALUE = 21;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CORIANDER = 22;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_CORIANDER_VALUE = 22;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CORN = 23;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_CORN_VALUE = 23;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_COUMARIN = 24;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_COUMARIN_VALUE = 24;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_CRUSTACEANS = 25;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_CRUSTACEANS_VALUE = 25;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_EGGS = 26;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_EGGS_VALUE = 26;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_EUGENOL = 27;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_EUGENOL_VALUE = 27;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_EVERNIA_FURFURACEA = 28;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_EVERNIA_FURFURACEA_VALUE = 28;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_EVERNIA_PRUNASTRI = 29;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_EVERNIA_PRUNASTRI_VALUE = 29;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_FARNESOL = 30;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_FARNESOL_VALUE = 30;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_FISH = 31;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_FISH_VALUE = 31;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_GERANIOL = 32;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_GERANIOL_VALUE = 32;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_GLUTEN = 33;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_GLUTEN_VALUE = 33;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_HAZELNUTS = 34;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_HAZELNUTS_VALUE = 34;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_HEXYL_CINNAMAL = 35;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_HEXYL_CINNAMAL_VALUE = 35;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_HYDROXYCITRONELLAL = 36;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_HYDROXYCITRONELLAL_VALUE = 36;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_HYDROXYISOHEXYL_3_CYCLOHEXENE_CARBOXALDEHYDE_ISOEUGENOL_LIMONENE_LINAL = 37;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_HYDROXYISOHEXYL_3_CYCLOHEXENE_CARBOXALDEHYDE_ISOEUGENOL_LIMONENE_LINAL_VALUE = 37;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_KAMUT = 38;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_KAMUT_VALUE = 38;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_LACTOSE = 39;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_LACTOSE_VALUE = 39;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_LUPINE = 40;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_LUPINE_VALUE = 40;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_MACADAMIA_NUTS = 41;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_MACADAMIA_NUTS_VALUE = 41;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_METHYL_2_OCTYNOATE = 42;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_METHYL_2_OCTYNOATE_VALUE = 42;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_MILK = 43;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_MILK_VALUE = 43;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_MOLLUSCS = 44;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_MOLLUSCS_VALUE = 44;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_MUSTARD = 45;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_MUSTARD_VALUE = 45;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_NO_DECLARED_ALLERGENS = 46;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_NO_DECLARED_ALLERGENS_VALUE = 46;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_OAT = 47;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_OAT_VALUE = 47;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_PEANUTS = 48;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_PEANUTS_VALUE = 48;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_PEAS = 49;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_PEAS_VALUE = 49;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_PECAN_NUTS = 50;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_PECAN_NUTS_VALUE = 50;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_PISTACHIOS = 51;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_PISTACHIOS_VALUE = 51;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_POD_FRUITS = 52;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_POD_FRUITS_VALUE = 52;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_QUEENSLAND_NUTS = 53;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_QUEENSLAND_NUTS_VALUE = 53;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_RYE = 54;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_RYE_VALUE = 54;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_SESAME_SEEDS = 55;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_SESAME_SEEDS_VALUE = 55;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_SOYBEANS = 56;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_SOYBEANS_VALUE = 56;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_SPELT = 57;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_SPELT_VALUE = 57;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_SULPHUR_DIOXIDE = 58;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_SULPHUR_DIOXIDE_VALUE = 58;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_TREE_NUTS = 59;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_TREE_NUTS_VALUE = 59;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_TREE_NUT_TRACES = 60;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_TREE_NUT_TRACES_VALUE = 60;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_WALNUTS = 61;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_WALNUTS_VALUE = 61;
+    /**
+     * <code>ALLERGEN_TYPE_CODE_WHEAT = 62;</code>
+     */
+    public static final int ALLERGEN_TYPE_CODE_WHEAT_VALUE = 62;
+
+
+    public final int getNumber() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalArgumentException(
+            "Can't get the number of an unknown enum value.");
+      }
+      return value;
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
+    public static AllergenTypeCode valueOf(int value) {
+      return forNumber(value);
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     */
+    public static AllergenTypeCode forNumber(int value) {
+      switch (value) {
+        case 0: return ALLERGEN_TYPE_CODE_UNSPECIFIED;
+        case 1: return ALLERGEN_TYPE_CODE_ALMONDS;
+        case 2: return ALLERGEN_TYPE_CODE_ALPHA_ISOMETHYL_IONONE;
+        case 3: return ALLERGEN_TYPE_CODE_ALCOHOL;
+        case 4: return ALLERGEN_TYPE_CODE_AMYL_CINNAMAL;
+        case 5: return ALLERGEN_TYPE_CODE_ANISE_ALCOHOL;
+        case 6: return ALLERGEN_TYPE_CODE_BARLEY;
+        case 7: return ALLERGEN_TYPE_CODE_BENZYL_ALCOHOL;
+        case 8: return ALLERGEN_TYPE_CODE_BENZYL_BENZOATE;
+        case 9: return ALLERGEN_TYPE_CODE_BENZYL_CINNAMATE;
+        case 10: return ALLERGEN_TYPE_CODE_BENZYL_SALICYLATE;
+        case 11: return ALLERGEN_TYPE_CODE_BRAZIL_NUTS;
+        case 12: return ALLERGEN_TYPE_CODE_BUTYLPHENYL_METHYLPROPIONATE;
+        case 13: return ALLERGEN_TYPE_CODE_CARROTS;
+        case 14: return ALLERGEN_TYPE_CODE_CASHEW_NUTS;
+        case 15: return ALLERGEN_TYPE_CODE_CELERY;
+        case 16: return ALLERGEN_TYPE_CODE_CEREALS_CONTAINING_GLUTEN;
+        case 17: return ALLERGEN_TYPE_CODE_CINNAMAL;
+        case 18: return ALLERGEN_TYPE_CODE_CINNAMYL_ALCOHOL;
+        case 19: return ALLERGEN_TYPE_CODE_CITRAL;
+        case 20: return ALLERGEN_TYPE_CODE_CITRONELLOL;
+        case 21: return ALLERGEN_TYPE_CODE_COCOA;
+        case 22: return ALLERGEN_TYPE_CODE_CORIANDER;
+        case 23: return ALLERGEN_TYPE_CODE_CORN;
+        case 24: return ALLERGEN_TYPE_CODE_COUMARIN;
+        case 25: return ALLERGEN_TYPE_CODE_CRUSTACEANS;
+        case 26: return ALLERGEN_TYPE_CODE_EGGS;
+        case 27: return ALLERGEN_TYPE_CODE_EUGENOL;
+        case 28: return ALLERGEN_TYPE_CODE_EVERNIA_FURFURACEA;
+        case 29: return ALLERGEN_TYPE_CODE_EVERNIA_PRUNASTRI;
+        case 30: return ALLERGEN_TYPE_CODE_FARNESOL;
+        case 31: return ALLERGEN_TYPE_CODE_FISH;
+        case 32: return ALLERGEN_TYPE_CODE_GERANIOL;
+        case 33: return ALLERGEN_TYPE_CODE_GLUTEN;
+        case 34: return ALLERGEN_TYPE_CODE_HAZELNUTS;
+        case 35: return ALLERGEN_TYPE_CODE_HEXYL_CINNAMAL;
+        case 36: return ALLERGEN_TYPE_CODE_HYDROXYCITRONELLAL;
+        case 37: return ALLERGEN_TYPE_CODE_HYDROXYISOHEXYL_3_CYCLOHEXENE_CARBOXALDEHYDE_ISOEUGENOL_LIMONENE_LINAL;
+        case 38: return ALLERGEN_TYPE_CODE_KAMUT;
+        case 39: return ALLERGEN_TYPE_CODE_LACTOSE;
+        case 40: return ALLERGEN_TYPE_CODE_LUPINE;
+        case 41: return ALLERGEN_TYPE_CODE_MACADAMIA_NUTS;
+        case 42: return ALLERGEN_TYPE_CODE_METHYL_2_OCTYNOATE;
+        case 43: return ALLERGEN_TYPE_CODE_MILK;
+        case 44: return ALLERGEN_TYPE_CODE_MOLLUSCS;
+        case 45: return ALLERGEN_TYPE_CODE_MUSTARD;
+        case 46: return ALLERGEN_TYPE_CODE_NO_DECLARED_ALLERGENS;
+        case 47: return ALLERGEN_TYPE_CODE_OAT;
+        case 48: return ALLERGEN_TYPE_CODE_PEANUTS;
+        case 49: return ALLERGEN_TYPE_CODE_PEAS;
+        case 50: return ALLERGEN_TYPE_CODE_PECAN_NUTS;
+        case 51: return ALLERGEN_TYPE_CODE_PISTACHIOS;
+        case 52: return ALLERGEN_TYPE_CODE_POD_FRUITS;
+        case 53: return ALLERGEN_TYPE_CODE_QUEENSLAND_NUTS;
+        case 54: return ALLERGEN_TYPE_CODE_RYE;
+        case 55: return ALLERGEN_TYPE_CODE_SESAME_SEEDS;
+        case 56: return ALLERGEN_TYPE_CODE_SOYBEANS;
+        case 57: return ALLERGEN_TYPE_CODE_SPELT;
+        case 58: return ALLERGEN_TYPE_CODE_SULPHUR_DIOXIDE;
+        case 59: return ALLERGEN_TYPE_CODE_TREE_NUTS;
+        case 60: return ALLERGEN_TYPE_CODE_TREE_NUT_TRACES;
+        case 61: return ALLERGEN_TYPE_CODE_WALNUTS;
+        case 62: return ALLERGEN_TYPE_CODE_WHEAT;
+        default: return null;
+      }
+    }
+
+    public static com.google.protobuf.Internal.EnumLiteMap<AllergenTypeCode>
+        internalGetValueMap() {
+      return internalValueMap;
+    }
+    private static final com.google.protobuf.Internal.EnumLiteMap<
+        AllergenTypeCode> internalValueMap =
+          new com.google.protobuf.Internal.EnumLiteMap<AllergenTypeCode>() {
+            public AllergenTypeCode findValueByNumber(int number) {
+              return AllergenTypeCode.forNumber(number);
+            }
+          };
+
+    public final com.google.protobuf.Descriptors.EnumValueDescriptor
+        getValueDescriptor() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalStateException(
+            "Can't get the descriptor of an unrecognized enum value.");
+      }
+      return getDescriptor().getValues().get(ordinal());
+    }
+    public final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptorForType() {
+      return getDescriptor();
+    }
+    public static final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.getDescriptor().getEnumTypes().get(1);
+    }
+
+    private static final AllergenTypeCode[] VALUES = values();
+
+    public static AllergenTypeCode valueOf(
+        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+      if (desc.getType() != getDescriptor()) {
+        throw new java.lang.IllegalArgumentException(
+          "EnumValueDescriptor is not for this type.");
+      }
+      if (desc.getIndex() == -1) {
+        return UNRECOGNIZED;
+      }
+      return VALUES[desc.getIndex()];
+    }
+
+    private final int value;
+
+    private AllergenTypeCode(int value) {
+      this.value = value;
+    }
+
+    // @@protoc_insertion_point(enum_scope:food.menu.v1.AllergenTypeCode)
+  }
+
+  /**
+   * Protobuf enum {@code food.menu.v1.NutritionValueUnit}
+   */
+  public enum NutritionValueUnit
+      implements com.google.protobuf.ProtocolMessageEnum {
+    /**
+     * <pre>
+     * Do not use. The nutrition value unit is not explicitly set.
+     * </pre>
+     *
+     * <code>NUTRITION_VALUE_UNIT_UNSPECIFIED = 0;</code>
+     */
+    NUTRITION_VALUE_UNIT_UNSPECIFIED(0),
+    /**
+     * <pre>
+     * Units used to express the amount of energy in a menu item.
+     * </pre>
+     *
+     * <code>ENERGY_CALORIES = 1;</code>
+     */
+    ENERGY_CALORIES(1),
+    /**
+     * <code>ENERGY_KILOJOULES = 2;</code>
+     */
+    ENERGY_KILOJOULES(2),
+    /**
+     * <pre>
+     * Units used to express the amount in weight a substance is present in the
+     * menu item.
+     * </pre>
+     *
+     * <code>WEIGHT_MILLIGRAMS = 3;</code>
+     */
+    WEIGHT_MILLIGRAMS(3),
+    /**
+     * <code>WEIGHT_GRAMS = 4;</code>
+     */
+    WEIGHT_GRAMS(4),
+    UNRECOGNIZED(-1),
+    ;
+
+    /**
+     * <pre>
+     * Do not use. The nutrition value unit is not explicitly set.
+     * </pre>
+     *
+     * <code>NUTRITION_VALUE_UNIT_UNSPECIFIED = 0;</code>
+     */
+    public static final int NUTRITION_VALUE_UNIT_UNSPECIFIED_VALUE = 0;
+    /**
+     * <pre>
+     * Units used to express the amount of energy in a menu item.
+     * </pre>
+     *
+     * <code>ENERGY_CALORIES = 1;</code>
+     */
+    public static final int ENERGY_CALORIES_VALUE = 1;
+    /**
+     * <code>ENERGY_KILOJOULES = 2;</code>
+     */
+    public static final int ENERGY_KILOJOULES_VALUE = 2;
+    /**
+     * <pre>
+     * Units used to express the amount in weight a substance is present in the
+     * menu item.
+     * </pre>
+     *
+     * <code>WEIGHT_MILLIGRAMS = 3;</code>
+     */
+    public static final int WEIGHT_MILLIGRAMS_VALUE = 3;
+    /**
+     * <code>WEIGHT_GRAMS = 4;</code>
+     */
+    public static final int WEIGHT_GRAMS_VALUE = 4;
+
+
+    public final int getNumber() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalArgumentException(
+            "Can't get the number of an unknown enum value.");
+      }
+      return value;
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
+    public static NutritionValueUnit valueOf(int value) {
+      return forNumber(value);
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     */
+    public static NutritionValueUnit forNumber(int value) {
+      switch (value) {
+        case 0: return NUTRITION_VALUE_UNIT_UNSPECIFIED;
+        case 1: return ENERGY_CALORIES;
+        case 2: return ENERGY_KILOJOULES;
+        case 3: return WEIGHT_MILLIGRAMS;
+        case 4: return WEIGHT_GRAMS;
+        default: return null;
+      }
+    }
+
+    public static com.google.protobuf.Internal.EnumLiteMap<NutritionValueUnit>
+        internalGetValueMap() {
+      return internalValueMap;
+    }
+    private static final com.google.protobuf.Internal.EnumLiteMap<
+        NutritionValueUnit> internalValueMap =
+          new com.google.protobuf.Internal.EnumLiteMap<NutritionValueUnit>() {
+            public NutritionValueUnit findValueByNumber(int number) {
+              return NutritionValueUnit.forNumber(number);
+            }
+          };
+
+    public final com.google.protobuf.Descriptors.EnumValueDescriptor
+        getValueDescriptor() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalStateException(
+            "Can't get the descriptor of an unrecognized enum value.");
+      }
+      return getDescriptor().getValues().get(ordinal());
+    }
+    public final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptorForType() {
+      return getDescriptor();
+    }
+    public static final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.getDescriptor().getEnumTypes().get(2);
+    }
+
+    private static final NutritionValueUnit[] VALUES = values();
+
+    public static NutritionValueUnit valueOf(
+        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+      if (desc.getType() != getDescriptor()) {
+        throw new java.lang.IllegalArgumentException(
+          "EnumValueDescriptor is not for this type.");
+      }
+      if (desc.getIndex() == -1) {
+        return UNRECOGNIZED;
+      }
+      return VALUES[desc.getIndex()];
+    }
+
+    private final int value;
+
+    private NutritionValueUnit(int value) {
+      this.value = value;
+    }
+
+    // @@protoc_insertion_point(enum_scope:food.menu.v1.NutritionValueUnit)
+  }
+
+  /**
+   * <pre>
+   * Indicates the level of containment a food item has of a certain attribute,
+   * such as allergens or additives.
+   * </pre>
+   *
+   * Protobuf enum {@code food.menu.v1.ContainmentLevelCode}
+   */
+  public enum ContainmentLevelCode
+      implements com.google.protobuf.ProtocolMessageEnum {
+    /**
+     * <pre>
+     * Do not use. The containment level code is not explicitly specified.
+     * </pre>
+     *
+     * <code>CONTAINMENT_LEVEL_CODE_UNSPECIFIED = 0;</code>
+     */
+    CONTAINMENT_LEVEL_CODE_UNSPECIFIED(0),
+    /**
+     * <code>CONTAINMENT_LEVEL_CODE_CONTAINS = 1;</code>
+     */
+    CONTAINMENT_LEVEL_CODE_CONTAINS(1),
+    /**
+     * <code>CONTAINMENT_LEVEL_CODE_DOES_NOT_CONTAIN = 2;</code>
+     */
+    CONTAINMENT_LEVEL_CODE_DOES_NOT_CONTAIN(2),
+    /**
+     * <code>CONTAINMENT_LEVEL_CODE_MAY_CONTAIN = 3;</code>
+     */
+    CONTAINMENT_LEVEL_CODE_MAY_CONTAIN(3),
+    UNRECOGNIZED(-1),
+    ;
+
+    /**
+     * <pre>
+     * Do not use. The containment level code is not explicitly specified.
+     * </pre>
+     *
+     * <code>CONTAINMENT_LEVEL_CODE_UNSPECIFIED = 0;</code>
+     */
+    public static final int CONTAINMENT_LEVEL_CODE_UNSPECIFIED_VALUE = 0;
+    /**
+     * <code>CONTAINMENT_LEVEL_CODE_CONTAINS = 1;</code>
+     */
+    public static final int CONTAINMENT_LEVEL_CODE_CONTAINS_VALUE = 1;
+    /**
+     * <code>CONTAINMENT_LEVEL_CODE_DOES_NOT_CONTAIN = 2;</code>
+     */
+    public static final int CONTAINMENT_LEVEL_CODE_DOES_NOT_CONTAIN_VALUE = 2;
+    /**
+     * <code>CONTAINMENT_LEVEL_CODE_MAY_CONTAIN = 3;</code>
+     */
+    public static final int CONTAINMENT_LEVEL_CODE_MAY_CONTAIN_VALUE = 3;
+
+
+    public final int getNumber() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalArgumentException(
+            "Can't get the number of an unknown enum value.");
+      }
+      return value;
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
+    public static ContainmentLevelCode valueOf(int value) {
+      return forNumber(value);
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     */
+    public static ContainmentLevelCode forNumber(int value) {
+      switch (value) {
+        case 0: return CONTAINMENT_LEVEL_CODE_UNSPECIFIED;
+        case 1: return CONTAINMENT_LEVEL_CODE_CONTAINS;
+        case 2: return CONTAINMENT_LEVEL_CODE_DOES_NOT_CONTAIN;
+        case 3: return CONTAINMENT_LEVEL_CODE_MAY_CONTAIN;
+        default: return null;
+      }
+    }
+
+    public static com.google.protobuf.Internal.EnumLiteMap<ContainmentLevelCode>
+        internalGetValueMap() {
+      return internalValueMap;
+    }
+    private static final com.google.protobuf.Internal.EnumLiteMap<
+        ContainmentLevelCode> internalValueMap =
+          new com.google.protobuf.Internal.EnumLiteMap<ContainmentLevelCode>() {
+            public ContainmentLevelCode findValueByNumber(int number) {
+              return ContainmentLevelCode.forNumber(number);
+            }
+          };
+
+    public final com.google.protobuf.Descriptors.EnumValueDescriptor
+        getValueDescriptor() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalStateException(
+            "Can't get the descriptor of an unrecognized enum value.");
+      }
+      return getDescriptor().getValues().get(ordinal());
+    }
+    public final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptorForType() {
+      return getDescriptor();
+    }
+    public static final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.getDescriptor().getEnumTypes().get(3);
+    }
+
+    private static final ContainmentLevelCode[] VALUES = values();
+
+    public static ContainmentLevelCode valueOf(
+        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+      if (desc.getType() != getDescriptor()) {
+        throw new java.lang.IllegalArgumentException(
+          "EnumValueDescriptor is not for this type.");
+      }
+      if (desc.getIndex() == -1) {
+        return UNRECOGNIZED;
+      }
+      return VALUES[desc.getIndex()];
+    }
+
+    private final int value;
+
+    private ContainmentLevelCode(int value) {
+      this.value = value;
+    }
+
+    // @@protoc_insertion_point(enum_scope:food.menu.v1.ContainmentLevelCode)
+  }
+
+  /**
+   * <pre>
+   * Indicates how to properly deposit a food item or bottle.
+   * </pre>
+   *
+   * Protobuf enum {@code food.menu.v1.DepositCode}
+   */
+  public enum DepositCode
+      implements com.google.protobuf.ProtocolMessageEnum {
+    /**
+     * <pre>
+     * Do not use. The deposite code is not explicitly specified.
+     * </pre>
+     *
+     * <code>DEPOSIT_CODE_UNSPECIFIED = 0;</code>
+     */
+    DEPOSIT_CODE_UNSPECIFIED(0),
+    /**
+     * <code>DEPOSIT_CODE_REUSABLE = 1;</code>
+     */
+    DEPOSIT_CODE_REUSABLE(1),
+    /**
+     * <code>DEPOSIT_CODE_RECYCLABLE = 2;</code>
+     */
+    DEPOSIT_CODE_RECYCLABLE(2),
+    UNRECOGNIZED(-1),
+    ;
+
+    /**
+     * <pre>
+     * Do not use. The deposite code is not explicitly specified.
+     * </pre>
+     *
+     * <code>DEPOSIT_CODE_UNSPECIFIED = 0;</code>
+     */
+    public static final int DEPOSIT_CODE_UNSPECIFIED_VALUE = 0;
+    /**
+     * <code>DEPOSIT_CODE_REUSABLE = 1;</code>
+     */
+    public static final int DEPOSIT_CODE_REUSABLE_VALUE = 1;
+    /**
+     * <code>DEPOSIT_CODE_RECYCLABLE = 2;</code>
+     */
+    public static final int DEPOSIT_CODE_RECYCLABLE_VALUE = 2;
+
+
+    public final int getNumber() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalArgumentException(
+            "Can't get the number of an unknown enum value.");
+      }
+      return value;
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
+    public static DepositCode valueOf(int value) {
+      return forNumber(value);
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     */
+    public static DepositCode forNumber(int value) {
+      switch (value) {
+        case 0: return DEPOSIT_CODE_UNSPECIFIED;
+        case 1: return DEPOSIT_CODE_REUSABLE;
+        case 2: return DEPOSIT_CODE_RECYCLABLE;
+        default: return null;
+      }
+    }
+
+    public static com.google.protobuf.Internal.EnumLiteMap<DepositCode>
+        internalGetValueMap() {
+      return internalValueMap;
+    }
+    private static final com.google.protobuf.Internal.EnumLiteMap<
+        DepositCode> internalValueMap =
+          new com.google.protobuf.Internal.EnumLiteMap<DepositCode>() {
+            public DepositCode findValueByNumber(int number) {
+              return DepositCode.forNumber(number);
+            }
+          };
+
+    public final com.google.protobuf.Descriptors.EnumValueDescriptor
+        getValueDescriptor() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalStateException(
+            "Can't get the descriptor of an unrecognized enum value.");
+      }
+      return getDescriptor().getValues().get(ordinal());
+    }
+    public final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptorForType() {
+      return getDescriptor();
+    }
+    public static final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.getDescriptor().getEnumTypes().get(4);
+    }
+
+    private static final DepositCode[] VALUES = values();
+
+    public static DepositCode valueOf(
+        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+      if (desc.getType() != getDescriptor()) {
+        throw new java.lang.IllegalArgumentException(
+          "EnumValueDescriptor is not for this type.");
+      }
+      if (desc.getIndex() == -1) {
+        return UNRECOGNIZED;
+      }
+      return VALUES[desc.getIndex()];
+    }
+
+    private final int value;
+
+    private DepositCode(int value) {
+      this.value = value;
+    }
+
+    // @@protoc_insertion_point(enum_scope:food.menu.v1.DepositCode)
+  }
+
+  public interface FoodMenuFeedOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.FoodMenuFeed)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+     */
+    java.util.List<food.menu.v1.FoodMenu.MenuComponent> 
+        getDataList();
+    /**
+     * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+     */
+    food.menu.v1.FoodMenu.MenuComponent getData(int index);
+    /**
+     * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+     */
+    int getDataCount();
+    /**
+     * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+     */
+    java.util.List<? extends food.menu.v1.FoodMenu.MenuComponentOrBuilder> 
+        getDataOrBuilderList();
+    /**
+     * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+     */
+    food.menu.v1.FoodMenu.MenuComponentOrBuilder getDataOrBuilder(
+        int index);
+  }
+  /**
+   * Protobuf type {@code food.menu.v1.FoodMenuFeed}
+   */
+  public static final class FoodMenuFeed extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.FoodMenuFeed)
+      FoodMenuFeedOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use FoodMenuFeed.newBuilder() to construct.
+    private FoodMenuFeed(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private FoodMenuFeed() {
+      data_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new FoodMenuFeed();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_FoodMenuFeed_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_FoodMenuFeed_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.FoodMenuFeed.class, food.menu.v1.FoodMenu.FoodMenuFeed.Builder.class);
+    }
+
+    public static final int DATA_FIELD_NUMBER = 1;
+    @SuppressWarnings("serial")
+    private java.util.List<food.menu.v1.FoodMenu.MenuComponent> data_;
+    /**
+     * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<food.menu.v1.FoodMenu.MenuComponent> getDataList() {
+      return data_;
+    }
+    /**
+     * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends food.menu.v1.FoodMenu.MenuComponentOrBuilder> 
+        getDataOrBuilderList() {
+      return data_;
+    }
+    /**
+     * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+     */
+    @java.lang.Override
+    public int getDataCount() {
+      return data_.size();
+    }
+    /**
+     * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuComponent getData(int index) {
+      return data_.get(index);
+    }
+    /**
+     * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuComponentOrBuilder getDataOrBuilder(
+        int index) {
+      return data_.get(index);
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      for (int i = 0; i < data_.size(); i++) {
+        output.writeMessage(1, data_.get(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      for (int i = 0; i < data_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, data_.get(i));
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.FoodMenuFeed)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.FoodMenuFeed other = (food.menu.v1.FoodMenu.FoodMenuFeed) obj;
+
+      if (!getDataList()
+          .equals(other.getDataList())) return false;
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (getDataCount() > 0) {
+        hash = (37 * hash) + DATA_FIELD_NUMBER;
+        hash = (53 * hash) + getDataList().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.FoodMenuFeed parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.FoodMenuFeed parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.FoodMenuFeed parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.FoodMenuFeed parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.FoodMenuFeed parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.FoodMenuFeed parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.FoodMenuFeed parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.FoodMenuFeed parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.FoodMenuFeed parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.FoodMenuFeed parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.FoodMenuFeed parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.FoodMenuFeed parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.FoodMenuFeed prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code food.menu.v1.FoodMenuFeed}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.FoodMenuFeed)
+        food.menu.v1.FoodMenu.FoodMenuFeedOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_FoodMenuFeed_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_FoodMenuFeed_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.FoodMenuFeed.class, food.menu.v1.FoodMenu.FoodMenuFeed.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.FoodMenuFeed.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        if (dataBuilder_ == null) {
+          data_ = java.util.Collections.emptyList();
+        } else {
+          data_ = null;
+          dataBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_FoodMenuFeed_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.FoodMenuFeed getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.FoodMenuFeed.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.FoodMenuFeed build() {
+        food.menu.v1.FoodMenu.FoodMenuFeed result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.FoodMenuFeed buildPartial() {
+        food.menu.v1.FoodMenu.FoodMenuFeed result = new food.menu.v1.FoodMenu.FoodMenuFeed(this);
+        buildPartialRepeatedFields(result);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartialRepeatedFields(food.menu.v1.FoodMenu.FoodMenuFeed result) {
+        if (dataBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            data_ = java.util.Collections.unmodifiableList(data_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.data_ = data_;
+        } else {
+          result.data_ = dataBuilder_.build();
+        }
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.FoodMenuFeed result) {
+        int from_bitField0_ = bitField0_;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.FoodMenuFeed) {
+          return mergeFrom((food.menu.v1.FoodMenu.FoodMenuFeed)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.FoodMenuFeed other) {
+        if (other == food.menu.v1.FoodMenu.FoodMenuFeed.getDefaultInstance()) return this;
+        if (dataBuilder_ == null) {
+          if (!other.data_.isEmpty()) {
+            if (data_.isEmpty()) {
+              data_ = other.data_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureDataIsMutable();
+              data_.addAll(other.data_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.data_.isEmpty()) {
+            if (dataBuilder_.isEmpty()) {
+              dataBuilder_.dispose();
+              dataBuilder_ = null;
+              data_ = other.data_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              dataBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getDataFieldBuilder() : null;
+            } else {
+              dataBuilder_.addAllMessages(other.data_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                food.menu.v1.FoodMenu.MenuComponent m =
+                    input.readMessage(
+                        food.menu.v1.FoodMenu.MenuComponent.parser(),
+                        extensionRegistry);
+                if (dataBuilder_ == null) {
+                  ensureDataIsMutable();
+                  data_.add(m);
+                } else {
+                  dataBuilder_.addMessage(m);
+                }
+                break;
+              } // case 10
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int bitField0_;
+
+      private java.util.List<food.menu.v1.FoodMenu.MenuComponent> data_ =
+        java.util.Collections.emptyList();
+      private void ensureDataIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          data_ = new java.util.ArrayList<food.menu.v1.FoodMenu.MenuComponent>(data_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          food.menu.v1.FoodMenu.MenuComponent, food.menu.v1.FoodMenu.MenuComponent.Builder, food.menu.v1.FoodMenu.MenuComponentOrBuilder> dataBuilder_;
+
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public java.util.List<food.menu.v1.FoodMenu.MenuComponent> getDataList() {
+        if (dataBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(data_);
+        } else {
+          return dataBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public int getDataCount() {
+        if (dataBuilder_ == null) {
+          return data_.size();
+        } else {
+          return dataBuilder_.getCount();
+        }
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.MenuComponent getData(int index) {
+        if (dataBuilder_ == null) {
+          return data_.get(index);
+        } else {
+          return dataBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public Builder setData(
+          int index, food.menu.v1.FoodMenu.MenuComponent value) {
+        if (dataBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDataIsMutable();
+          data_.set(index, value);
+          onChanged();
+        } else {
+          dataBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public Builder setData(
+          int index, food.menu.v1.FoodMenu.MenuComponent.Builder builderForValue) {
+        if (dataBuilder_ == null) {
+          ensureDataIsMutable();
+          data_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          dataBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public Builder addData(food.menu.v1.FoodMenu.MenuComponent value) {
+        if (dataBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDataIsMutable();
+          data_.add(value);
+          onChanged();
+        } else {
+          dataBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public Builder addData(
+          int index, food.menu.v1.FoodMenu.MenuComponent value) {
+        if (dataBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDataIsMutable();
+          data_.add(index, value);
+          onChanged();
+        } else {
+          dataBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public Builder addData(
+          food.menu.v1.FoodMenu.MenuComponent.Builder builderForValue) {
+        if (dataBuilder_ == null) {
+          ensureDataIsMutable();
+          data_.add(builderForValue.build());
+          onChanged();
+        } else {
+          dataBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public Builder addData(
+          int index, food.menu.v1.FoodMenu.MenuComponent.Builder builderForValue) {
+        if (dataBuilder_ == null) {
+          ensureDataIsMutable();
+          data_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          dataBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public Builder addAllData(
+          java.lang.Iterable<? extends food.menu.v1.FoodMenu.MenuComponent> values) {
+        if (dataBuilder_ == null) {
+          ensureDataIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, data_);
+          onChanged();
+        } else {
+          dataBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public Builder clearData() {
+        if (dataBuilder_ == null) {
+          data_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          dataBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public Builder removeData(int index) {
+        if (dataBuilder_ == null) {
+          ensureDataIsMutable();
+          data_.remove(index);
+          onChanged();
+        } else {
+          dataBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.MenuComponent.Builder getDataBuilder(
+          int index) {
+        return getDataFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.MenuComponentOrBuilder getDataOrBuilder(
+          int index) {
+        if (dataBuilder_ == null) {
+          return data_.get(index);  } else {
+          return dataBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public java.util.List<? extends food.menu.v1.FoodMenu.MenuComponentOrBuilder> 
+           getDataOrBuilderList() {
+        if (dataBuilder_ != null) {
+          return dataBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(data_);
+        }
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.MenuComponent.Builder addDataBuilder() {
+        return getDataFieldBuilder().addBuilder(
+            food.menu.v1.FoodMenu.MenuComponent.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.MenuComponent.Builder addDataBuilder(
+          int index) {
+        return getDataFieldBuilder().addBuilder(
+            index, food.menu.v1.FoodMenu.MenuComponent.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .food.menu.v1.MenuComponent data = 1;</code>
+       */
+      public java.util.List<food.menu.v1.FoodMenu.MenuComponent.Builder> 
+           getDataBuilderList() {
+        return getDataFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          food.menu.v1.FoodMenu.MenuComponent, food.menu.v1.FoodMenu.MenuComponent.Builder, food.menu.v1.FoodMenu.MenuComponentOrBuilder> 
+          getDataFieldBuilder() {
+        if (dataBuilder_ == null) {
+          dataBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              food.menu.v1.FoodMenu.MenuComponent, food.menu.v1.FoodMenu.MenuComponent.Builder, food.menu.v1.FoodMenu.MenuComponentOrBuilder>(
+                  data_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          data_ = null;
+        }
+        return dataBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.FoodMenuFeed)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.FoodMenuFeed)
+    private static final food.menu.v1.FoodMenu.FoodMenuFeed DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.FoodMenuFeed();
+    }
+
+    public static food.menu.v1.FoodMenu.FoodMenuFeed getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<FoodMenuFeed>
+        PARSER = new com.google.protobuf.AbstractParser<FoodMenuFeed>() {
+      @java.lang.Override
+      public FoodMenuFeed parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<FoodMenuFeed> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<FoodMenuFeed> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.FoodMenuFeed getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface MenuComponentOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.MenuComponent)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>.food.menu.v1.Menu menu = 1;</code>
+     * @return Whether the menu field is set.
+     */
+    boolean hasMenu();
+    /**
+     * <code>.food.menu.v1.Menu menu = 1;</code>
+     * @return The menu.
+     */
+    food.menu.v1.FoodMenu.Menu getMenu();
+    /**
+     * <code>.food.menu.v1.Menu menu = 1;</code>
+     */
+    food.menu.v1.FoodMenu.MenuOrBuilder getMenuOrBuilder();
+
+    /**
+     * <code>.food.menu.v1.MenuSection section = 2;</code>
+     * @return Whether the section field is set.
+     */
+    boolean hasSection();
+    /**
+     * <code>.food.menu.v1.MenuSection section = 2;</code>
+     * @return The section.
+     */
+    food.menu.v1.FoodMenu.MenuSection getSection();
+    /**
+     * <code>.food.menu.v1.MenuSection section = 2;</code>
+     */
+    food.menu.v1.FoodMenu.MenuSectionOrBuilder getSectionOrBuilder();
+
+    /**
+     * <code>.food.menu.v1.MenuItem item = 3;</code>
+     * @return Whether the item field is set.
+     */
+    boolean hasItem();
+    /**
+     * <code>.food.menu.v1.MenuItem item = 3;</code>
+     * @return The item.
+     */
+    food.menu.v1.FoodMenu.MenuItem getItem();
+    /**
+     * <code>.food.menu.v1.MenuItem item = 3;</code>
+     */
+    food.menu.v1.FoodMenu.MenuItemOrBuilder getItemOrBuilder();
+
+    /**
+     * <code>.food.menu.v1.MenuItemOption option = 4;</code>
+     * @return Whether the option field is set.
+     */
+    boolean hasOption();
+    /**
+     * <code>.food.menu.v1.MenuItemOption option = 4;</code>
+     * @return The option.
+     */
+    food.menu.v1.FoodMenu.MenuItemOption getOption();
+    /**
+     * <code>.food.menu.v1.MenuItemOption option = 4;</code>
+     */
+    food.menu.v1.FoodMenu.MenuItemOptionOrBuilder getOptionOrBuilder();
+
+    food.menu.v1.FoodMenu.MenuComponent.TypeCase getTypeCase();
+  }
+  /**
+   * Protobuf type {@code food.menu.v1.MenuComponent}
+   */
+  public static final class MenuComponent extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.MenuComponent)
+      MenuComponentOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use MenuComponent.newBuilder() to construct.
+    private MenuComponent(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private MenuComponent() {
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new MenuComponent();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuComponent_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuComponent_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.MenuComponent.class, food.menu.v1.FoodMenu.MenuComponent.Builder.class);
+    }
+
+    private int typeCase_ = 0;
+    @SuppressWarnings("serial")
+    private java.lang.Object type_;
+    public enum TypeCase
+        implements com.google.protobuf.Internal.EnumLite,
+            com.google.protobuf.AbstractMessage.InternalOneOfEnum {
+      MENU(1),
+      SECTION(2),
+      ITEM(3),
+      OPTION(4),
+      TYPE_NOT_SET(0);
+      private final int value;
+      private TypeCase(int value) {
+        this.value = value;
+      }
+      /**
+       * @param value The number of the enum to look for.
+       * @return The enum associated with the given number.
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
+      public static TypeCase valueOf(int value) {
+        return forNumber(value);
+      }
+
+      public static TypeCase forNumber(int value) {
+        switch (value) {
+          case 1: return MENU;
+          case 2: return SECTION;
+          case 3: return ITEM;
+          case 4: return OPTION;
+          case 0: return TYPE_NOT_SET;
+          default: return null;
+        }
+      }
+      public int getNumber() {
+        return this.value;
+      }
+    };
+
+    public TypeCase
+    getTypeCase() {
+      return TypeCase.forNumber(
+          typeCase_);
+    }
+
+    public static final int MENU_FIELD_NUMBER = 1;
+    /**
+     * <code>.food.menu.v1.Menu menu = 1;</code>
+     * @return Whether the menu field is set.
+     */
+    @java.lang.Override
+    public boolean hasMenu() {
+      return typeCase_ == 1;
+    }
+    /**
+     * <code>.food.menu.v1.Menu menu = 1;</code>
+     * @return The menu.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.Menu getMenu() {
+      if (typeCase_ == 1) {
+         return (food.menu.v1.FoodMenu.Menu) type_;
+      }
+      return food.menu.v1.FoodMenu.Menu.getDefaultInstance();
+    }
+    /**
+     * <code>.food.menu.v1.Menu menu = 1;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuOrBuilder getMenuOrBuilder() {
+      if (typeCase_ == 1) {
+         return (food.menu.v1.FoodMenu.Menu) type_;
+      }
+      return food.menu.v1.FoodMenu.Menu.getDefaultInstance();
+    }
+
+    public static final int SECTION_FIELD_NUMBER = 2;
+    /**
+     * <code>.food.menu.v1.MenuSection section = 2;</code>
+     * @return Whether the section field is set.
+     */
+    @java.lang.Override
+    public boolean hasSection() {
+      return typeCase_ == 2;
+    }
+    /**
+     * <code>.food.menu.v1.MenuSection section = 2;</code>
+     * @return The section.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuSection getSection() {
+      if (typeCase_ == 2) {
+         return (food.menu.v1.FoodMenu.MenuSection) type_;
+      }
+      return food.menu.v1.FoodMenu.MenuSection.getDefaultInstance();
+    }
+    /**
+     * <code>.food.menu.v1.MenuSection section = 2;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuSectionOrBuilder getSectionOrBuilder() {
+      if (typeCase_ == 2) {
+         return (food.menu.v1.FoodMenu.MenuSection) type_;
+      }
+      return food.menu.v1.FoodMenu.MenuSection.getDefaultInstance();
+    }
+
+    public static final int ITEM_FIELD_NUMBER = 3;
+    /**
+     * <code>.food.menu.v1.MenuItem item = 3;</code>
+     * @return Whether the item field is set.
+     */
+    @java.lang.Override
+    public boolean hasItem() {
+      return typeCase_ == 3;
+    }
+    /**
+     * <code>.food.menu.v1.MenuItem item = 3;</code>
+     * @return The item.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuItem getItem() {
+      if (typeCase_ == 3) {
+         return (food.menu.v1.FoodMenu.MenuItem) type_;
+      }
+      return food.menu.v1.FoodMenu.MenuItem.getDefaultInstance();
+    }
+    /**
+     * <code>.food.menu.v1.MenuItem item = 3;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuItemOrBuilder getItemOrBuilder() {
+      if (typeCase_ == 3) {
+         return (food.menu.v1.FoodMenu.MenuItem) type_;
+      }
+      return food.menu.v1.FoodMenu.MenuItem.getDefaultInstance();
+    }
+
+    public static final int OPTION_FIELD_NUMBER = 4;
+    /**
+     * <code>.food.menu.v1.MenuItemOption option = 4;</code>
+     * @return Whether the option field is set.
+     */
+    @java.lang.Override
+    public boolean hasOption() {
+      return typeCase_ == 4;
+    }
+    /**
+     * <code>.food.menu.v1.MenuItemOption option = 4;</code>
+     * @return The option.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuItemOption getOption() {
+      if (typeCase_ == 4) {
+         return (food.menu.v1.FoodMenu.MenuItemOption) type_;
+      }
+      return food.menu.v1.FoodMenu.MenuItemOption.getDefaultInstance();
+    }
+    /**
+     * <code>.food.menu.v1.MenuItemOption option = 4;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuItemOptionOrBuilder getOptionOrBuilder() {
+      if (typeCase_ == 4) {
+         return (food.menu.v1.FoodMenu.MenuItemOption) type_;
+      }
+      return food.menu.v1.FoodMenu.MenuItemOption.getDefaultInstance();
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (typeCase_ == 1) {
+        output.writeMessage(1, (food.menu.v1.FoodMenu.Menu) type_);
+      }
+      if (typeCase_ == 2) {
+        output.writeMessage(2, (food.menu.v1.FoodMenu.MenuSection) type_);
+      }
+      if (typeCase_ == 3) {
+        output.writeMessage(3, (food.menu.v1.FoodMenu.MenuItem) type_);
+      }
+      if (typeCase_ == 4) {
+        output.writeMessage(4, (food.menu.v1.FoodMenu.MenuItemOption) type_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (typeCase_ == 1) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, (food.menu.v1.FoodMenu.Menu) type_);
+      }
+      if (typeCase_ == 2) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, (food.menu.v1.FoodMenu.MenuSection) type_);
+      }
+      if (typeCase_ == 3) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, (food.menu.v1.FoodMenu.MenuItem) type_);
+      }
+      if (typeCase_ == 4) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, (food.menu.v1.FoodMenu.MenuItemOption) type_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.MenuComponent)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.MenuComponent other = (food.menu.v1.FoodMenu.MenuComponent) obj;
+
+      if (!getTypeCase().equals(other.getTypeCase())) return false;
+      switch (typeCase_) {
+        case 1:
+          if (!getMenu()
+              .equals(other.getMenu())) return false;
+          break;
+        case 2:
+          if (!getSection()
+              .equals(other.getSection())) return false;
+          break;
+        case 3:
+          if (!getItem()
+              .equals(other.getItem())) return false;
+          break;
+        case 4:
+          if (!getOption()
+              .equals(other.getOption())) return false;
+          break;
+        case 0:
+        default:
+      }
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      switch (typeCase_) {
+        case 1:
+          hash = (37 * hash) + MENU_FIELD_NUMBER;
+          hash = (53 * hash) + getMenu().hashCode();
+          break;
+        case 2:
+          hash = (37 * hash) + SECTION_FIELD_NUMBER;
+          hash = (53 * hash) + getSection().hashCode();
+          break;
+        case 3:
+          hash = (37 * hash) + ITEM_FIELD_NUMBER;
+          hash = (53 * hash) + getItem().hashCode();
+          break;
+        case 4:
+          hash = (37 * hash) + OPTION_FIELD_NUMBER;
+          hash = (53 * hash) + getOption().hashCode();
+          break;
+        case 0:
+        default:
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.MenuComponent parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuComponent parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuComponent parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuComponent parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuComponent parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuComponent parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuComponent parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuComponent parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuComponent parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuComponent parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuComponent parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuComponent parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.MenuComponent prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code food.menu.v1.MenuComponent}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.MenuComponent)
+        food.menu.v1.FoodMenu.MenuComponentOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuComponent_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuComponent_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.MenuComponent.class, food.menu.v1.FoodMenu.MenuComponent.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.MenuComponent.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        if (menuBuilder_ != null) {
+          menuBuilder_.clear();
+        }
+        if (sectionBuilder_ != null) {
+          sectionBuilder_.clear();
+        }
+        if (itemBuilder_ != null) {
+          itemBuilder_.clear();
+        }
+        if (optionBuilder_ != null) {
+          optionBuilder_.clear();
+        }
+        typeCase_ = 0;
+        type_ = null;
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuComponent_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuComponent getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.MenuComponent.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuComponent build() {
+        food.menu.v1.FoodMenu.MenuComponent result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuComponent buildPartial() {
+        food.menu.v1.FoodMenu.MenuComponent result = new food.menu.v1.FoodMenu.MenuComponent(this);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        buildPartialOneofs(result);
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.MenuComponent result) {
+        int from_bitField0_ = bitField0_;
+      }
+
+      private void buildPartialOneofs(food.menu.v1.FoodMenu.MenuComponent result) {
+        result.typeCase_ = typeCase_;
+        result.type_ = this.type_;
+        if (typeCase_ == 1 &&
+            menuBuilder_ != null) {
+          result.type_ = menuBuilder_.build();
+        }
+        if (typeCase_ == 2 &&
+            sectionBuilder_ != null) {
+          result.type_ = sectionBuilder_.build();
+        }
+        if (typeCase_ == 3 &&
+            itemBuilder_ != null) {
+          result.type_ = itemBuilder_.build();
+        }
+        if (typeCase_ == 4 &&
+            optionBuilder_ != null) {
+          result.type_ = optionBuilder_.build();
+        }
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.MenuComponent) {
+          return mergeFrom((food.menu.v1.FoodMenu.MenuComponent)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.MenuComponent other) {
+        if (other == food.menu.v1.FoodMenu.MenuComponent.getDefaultInstance()) return this;
+        switch (other.getTypeCase()) {
+          case MENU: {
+            mergeMenu(other.getMenu());
+            break;
+          }
+          case SECTION: {
+            mergeSection(other.getSection());
+            break;
+          }
+          case ITEM: {
+            mergeItem(other.getItem());
+            break;
+          }
+          case OPTION: {
+            mergeOption(other.getOption());
+            break;
+          }
+          case TYPE_NOT_SET: {
+            break;
+          }
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                input.readMessage(
+                    getMenuFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                typeCase_ = 1;
+                break;
+              } // case 10
+              case 18: {
+                input.readMessage(
+                    getSectionFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                typeCase_ = 2;
+                break;
+              } // case 18
+              case 26: {
+                input.readMessage(
+                    getItemFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                typeCase_ = 3;
+                break;
+              } // case 26
+              case 34: {
+                input.readMessage(
+                    getOptionFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                typeCase_ = 4;
+                break;
+              } // case 34
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int typeCase_ = 0;
+      private java.lang.Object type_;
+      public TypeCase
+          getTypeCase() {
+        return TypeCase.forNumber(
+            typeCase_);
+      }
+
+      public Builder clearType() {
+        typeCase_ = 0;
+        type_ = null;
+        onChanged();
+        return this;
+      }
+
+      private int bitField0_;
+
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.Menu, food.menu.v1.FoodMenu.Menu.Builder, food.menu.v1.FoodMenu.MenuOrBuilder> menuBuilder_;
+      /**
+       * <code>.food.menu.v1.Menu menu = 1;</code>
+       * @return Whether the menu field is set.
+       */
+      @java.lang.Override
+      public boolean hasMenu() {
+        return typeCase_ == 1;
+      }
+      /**
+       * <code>.food.menu.v1.Menu menu = 1;</code>
+       * @return The menu.
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Menu getMenu() {
+        if (menuBuilder_ == null) {
+          if (typeCase_ == 1) {
+            return (food.menu.v1.FoodMenu.Menu) type_;
+          }
+          return food.menu.v1.FoodMenu.Menu.getDefaultInstance();
+        } else {
+          if (typeCase_ == 1) {
+            return menuBuilder_.getMessage();
+          }
+          return food.menu.v1.FoodMenu.Menu.getDefaultInstance();
+        }
+      }
+      /**
+       * <code>.food.menu.v1.Menu menu = 1;</code>
+       */
+      public Builder setMenu(food.menu.v1.FoodMenu.Menu value) {
+        if (menuBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          type_ = value;
+          onChanged();
+        } else {
+          menuBuilder_.setMessage(value);
+        }
+        typeCase_ = 1;
+        return this;
+      }
+      /**
+       * <code>.food.menu.v1.Menu menu = 1;</code>
+       */
+      public Builder setMenu(
+          food.menu.v1.FoodMenu.Menu.Builder builderForValue) {
+        if (menuBuilder_ == null) {
+          type_ = builderForValue.build();
+          onChanged();
+        } else {
+          menuBuilder_.setMessage(builderForValue.build());
+        }
+        typeCase_ = 1;
+        return this;
+      }
+      /**
+       * <code>.food.menu.v1.Menu menu = 1;</code>
+       */
+      public Builder mergeMenu(food.menu.v1.FoodMenu.Menu value) {
+        if (menuBuilder_ == null) {
+          if (typeCase_ == 1 &&
+              type_ != food.menu.v1.FoodMenu.Menu.getDefaultInstance()) {
+            type_ = food.menu.v1.FoodMenu.Menu.newBuilder((food.menu.v1.FoodMenu.Menu) type_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            type_ = value;
+          }
+          onChanged();
+        } else {
+          if (typeCase_ == 1) {
+            menuBuilder_.mergeFrom(value);
+          } else {
+            menuBuilder_.setMessage(value);
+          }
+        }
+        typeCase_ = 1;
+        return this;
+      }
+      /**
+       * <code>.food.menu.v1.Menu menu = 1;</code>
+       */
+      public Builder clearMenu() {
+        if (menuBuilder_ == null) {
+          if (typeCase_ == 1) {
+            typeCase_ = 0;
+            type_ = null;
+            onChanged();
+          }
+        } else {
+          if (typeCase_ == 1) {
+            typeCase_ = 0;
+            type_ = null;
+          }
+          menuBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>.food.menu.v1.Menu menu = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.Menu.Builder getMenuBuilder() {
+        return getMenuFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.food.menu.v1.Menu menu = 1;</code>
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuOrBuilder getMenuOrBuilder() {
+        if ((typeCase_ == 1) && (menuBuilder_ != null)) {
+          return menuBuilder_.getMessageOrBuilder();
+        } else {
+          if (typeCase_ == 1) {
+            return (food.menu.v1.FoodMenu.Menu) type_;
+          }
+          return food.menu.v1.FoodMenu.Menu.getDefaultInstance();
+        }
+      }
+      /**
+       * <code>.food.menu.v1.Menu menu = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.Menu, food.menu.v1.FoodMenu.Menu.Builder, food.menu.v1.FoodMenu.MenuOrBuilder> 
+          getMenuFieldBuilder() {
+        if (menuBuilder_ == null) {
+          if (!(typeCase_ == 1)) {
+            type_ = food.menu.v1.FoodMenu.Menu.getDefaultInstance();
+          }
+          menuBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.Menu, food.menu.v1.FoodMenu.Menu.Builder, food.menu.v1.FoodMenu.MenuOrBuilder>(
+                  (food.menu.v1.FoodMenu.Menu) type_,
+                  getParentForChildren(),
+                  isClean());
+          type_ = null;
+        }
+        typeCase_ = 1;
+        onChanged();
+        return menuBuilder_;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.MenuSection, food.menu.v1.FoodMenu.MenuSection.Builder, food.menu.v1.FoodMenu.MenuSectionOrBuilder> sectionBuilder_;
+      /**
+       * <code>.food.menu.v1.MenuSection section = 2;</code>
+       * @return Whether the section field is set.
+       */
+      @java.lang.Override
+      public boolean hasSection() {
+        return typeCase_ == 2;
+      }
+      /**
+       * <code>.food.menu.v1.MenuSection section = 2;</code>
+       * @return The section.
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuSection getSection() {
+        if (sectionBuilder_ == null) {
+          if (typeCase_ == 2) {
+            return (food.menu.v1.FoodMenu.MenuSection) type_;
+          }
+          return food.menu.v1.FoodMenu.MenuSection.getDefaultInstance();
+        } else {
+          if (typeCase_ == 2) {
+            return sectionBuilder_.getMessage();
+          }
+          return food.menu.v1.FoodMenu.MenuSection.getDefaultInstance();
+        }
+      }
+      /**
+       * <code>.food.menu.v1.MenuSection section = 2;</code>
+       */
+      public Builder setSection(food.menu.v1.FoodMenu.MenuSection value) {
+        if (sectionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          type_ = value;
+          onChanged();
+        } else {
+          sectionBuilder_.setMessage(value);
+        }
+        typeCase_ = 2;
+        return this;
+      }
+      /**
+       * <code>.food.menu.v1.MenuSection section = 2;</code>
+       */
+      public Builder setSection(
+          food.menu.v1.FoodMenu.MenuSection.Builder builderForValue) {
+        if (sectionBuilder_ == null) {
+          type_ = builderForValue.build();
+          onChanged();
+        } else {
+          sectionBuilder_.setMessage(builderForValue.build());
+        }
+        typeCase_ = 2;
+        return this;
+      }
+      /**
+       * <code>.food.menu.v1.MenuSection section = 2;</code>
+       */
+      public Builder mergeSection(food.menu.v1.FoodMenu.MenuSection value) {
+        if (sectionBuilder_ == null) {
+          if (typeCase_ == 2 &&
+              type_ != food.menu.v1.FoodMenu.MenuSection.getDefaultInstance()) {
+            type_ = food.menu.v1.FoodMenu.MenuSection.newBuilder((food.menu.v1.FoodMenu.MenuSection) type_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            type_ = value;
+          }
+          onChanged();
+        } else {
+          if (typeCase_ == 2) {
+            sectionBuilder_.mergeFrom(value);
+          } else {
+            sectionBuilder_.setMessage(value);
+          }
+        }
+        typeCase_ = 2;
+        return this;
+      }
+      /**
+       * <code>.food.menu.v1.MenuSection section = 2;</code>
+       */
+      public Builder clearSection() {
+        if (sectionBuilder_ == null) {
+          if (typeCase_ == 2) {
+            typeCase_ = 0;
+            type_ = null;
+            onChanged();
+          }
+        } else {
+          if (typeCase_ == 2) {
+            typeCase_ = 0;
+            type_ = null;
+          }
+          sectionBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>.food.menu.v1.MenuSection section = 2;</code>
+       */
+      public food.menu.v1.FoodMenu.MenuSection.Builder getSectionBuilder() {
+        return getSectionFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.food.menu.v1.MenuSection section = 2;</code>
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuSectionOrBuilder getSectionOrBuilder() {
+        if ((typeCase_ == 2) && (sectionBuilder_ != null)) {
+          return sectionBuilder_.getMessageOrBuilder();
+        } else {
+          if (typeCase_ == 2) {
+            return (food.menu.v1.FoodMenu.MenuSection) type_;
+          }
+          return food.menu.v1.FoodMenu.MenuSection.getDefaultInstance();
+        }
+      }
+      /**
+       * <code>.food.menu.v1.MenuSection section = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.MenuSection, food.menu.v1.FoodMenu.MenuSection.Builder, food.menu.v1.FoodMenu.MenuSectionOrBuilder> 
+          getSectionFieldBuilder() {
+        if (sectionBuilder_ == null) {
+          if (!(typeCase_ == 2)) {
+            type_ = food.menu.v1.FoodMenu.MenuSection.getDefaultInstance();
+          }
+          sectionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.MenuSection, food.menu.v1.FoodMenu.MenuSection.Builder, food.menu.v1.FoodMenu.MenuSectionOrBuilder>(
+                  (food.menu.v1.FoodMenu.MenuSection) type_,
+                  getParentForChildren(),
+                  isClean());
+          type_ = null;
+        }
+        typeCase_ = 2;
+        onChanged();
+        return sectionBuilder_;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.MenuItem, food.menu.v1.FoodMenu.MenuItem.Builder, food.menu.v1.FoodMenu.MenuItemOrBuilder> itemBuilder_;
+      /**
+       * <code>.food.menu.v1.MenuItem item = 3;</code>
+       * @return Whether the item field is set.
+       */
+      @java.lang.Override
+      public boolean hasItem() {
+        return typeCase_ == 3;
+      }
+      /**
+       * <code>.food.menu.v1.MenuItem item = 3;</code>
+       * @return The item.
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItem getItem() {
+        if (itemBuilder_ == null) {
+          if (typeCase_ == 3) {
+            return (food.menu.v1.FoodMenu.MenuItem) type_;
+          }
+          return food.menu.v1.FoodMenu.MenuItem.getDefaultInstance();
+        } else {
+          if (typeCase_ == 3) {
+            return itemBuilder_.getMessage();
+          }
+          return food.menu.v1.FoodMenu.MenuItem.getDefaultInstance();
+        }
+      }
+      /**
+       * <code>.food.menu.v1.MenuItem item = 3;</code>
+       */
+      public Builder setItem(food.menu.v1.FoodMenu.MenuItem value) {
+        if (itemBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          type_ = value;
+          onChanged();
+        } else {
+          itemBuilder_.setMessage(value);
+        }
+        typeCase_ = 3;
+        return this;
+      }
+      /**
+       * <code>.food.menu.v1.MenuItem item = 3;</code>
+       */
+      public Builder setItem(
+          food.menu.v1.FoodMenu.MenuItem.Builder builderForValue) {
+        if (itemBuilder_ == null) {
+          type_ = builderForValue.build();
+          onChanged();
+        } else {
+          itemBuilder_.setMessage(builderForValue.build());
+        }
+        typeCase_ = 3;
+        return this;
+      }
+      /**
+       * <code>.food.menu.v1.MenuItem item = 3;</code>
+       */
+      public Builder mergeItem(food.menu.v1.FoodMenu.MenuItem value) {
+        if (itemBuilder_ == null) {
+          if (typeCase_ == 3 &&
+              type_ != food.menu.v1.FoodMenu.MenuItem.getDefaultInstance()) {
+            type_ = food.menu.v1.FoodMenu.MenuItem.newBuilder((food.menu.v1.FoodMenu.MenuItem) type_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            type_ = value;
+          }
+          onChanged();
+        } else {
+          if (typeCase_ == 3) {
+            itemBuilder_.mergeFrom(value);
+          } else {
+            itemBuilder_.setMessage(value);
+          }
+        }
+        typeCase_ = 3;
+        return this;
+      }
+      /**
+       * <code>.food.menu.v1.MenuItem item = 3;</code>
+       */
+      public Builder clearItem() {
+        if (itemBuilder_ == null) {
+          if (typeCase_ == 3) {
+            typeCase_ = 0;
+            type_ = null;
+            onChanged();
+          }
+        } else {
+          if (typeCase_ == 3) {
+            typeCase_ = 0;
+            type_ = null;
+          }
+          itemBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>.food.menu.v1.MenuItem item = 3;</code>
+       */
+      public food.menu.v1.FoodMenu.MenuItem.Builder getItemBuilder() {
+        return getItemFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.food.menu.v1.MenuItem item = 3;</code>
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItemOrBuilder getItemOrBuilder() {
+        if ((typeCase_ == 3) && (itemBuilder_ != null)) {
+          return itemBuilder_.getMessageOrBuilder();
+        } else {
+          if (typeCase_ == 3) {
+            return (food.menu.v1.FoodMenu.MenuItem) type_;
+          }
+          return food.menu.v1.FoodMenu.MenuItem.getDefaultInstance();
+        }
+      }
+      /**
+       * <code>.food.menu.v1.MenuItem item = 3;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.MenuItem, food.menu.v1.FoodMenu.MenuItem.Builder, food.menu.v1.FoodMenu.MenuItemOrBuilder> 
+          getItemFieldBuilder() {
+        if (itemBuilder_ == null) {
+          if (!(typeCase_ == 3)) {
+            type_ = food.menu.v1.FoodMenu.MenuItem.getDefaultInstance();
+          }
+          itemBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.MenuItem, food.menu.v1.FoodMenu.MenuItem.Builder, food.menu.v1.FoodMenu.MenuItemOrBuilder>(
+                  (food.menu.v1.FoodMenu.MenuItem) type_,
+                  getParentForChildren(),
+                  isClean());
+          type_ = null;
+        }
+        typeCase_ = 3;
+        onChanged();
+        return itemBuilder_;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.MenuItemOption, food.menu.v1.FoodMenu.MenuItemOption.Builder, food.menu.v1.FoodMenu.MenuItemOptionOrBuilder> optionBuilder_;
+      /**
+       * <code>.food.menu.v1.MenuItemOption option = 4;</code>
+       * @return Whether the option field is set.
+       */
+      @java.lang.Override
+      public boolean hasOption() {
+        return typeCase_ == 4;
+      }
+      /**
+       * <code>.food.menu.v1.MenuItemOption option = 4;</code>
+       * @return The option.
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItemOption getOption() {
+        if (optionBuilder_ == null) {
+          if (typeCase_ == 4) {
+            return (food.menu.v1.FoodMenu.MenuItemOption) type_;
+          }
+          return food.menu.v1.FoodMenu.MenuItemOption.getDefaultInstance();
+        } else {
+          if (typeCase_ == 4) {
+            return optionBuilder_.getMessage();
+          }
+          return food.menu.v1.FoodMenu.MenuItemOption.getDefaultInstance();
+        }
+      }
+      /**
+       * <code>.food.menu.v1.MenuItemOption option = 4;</code>
+       */
+      public Builder setOption(food.menu.v1.FoodMenu.MenuItemOption value) {
+        if (optionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          type_ = value;
+          onChanged();
+        } else {
+          optionBuilder_.setMessage(value);
+        }
+        typeCase_ = 4;
+        return this;
+      }
+      /**
+       * <code>.food.menu.v1.MenuItemOption option = 4;</code>
+       */
+      public Builder setOption(
+          food.menu.v1.FoodMenu.MenuItemOption.Builder builderForValue) {
+        if (optionBuilder_ == null) {
+          type_ = builderForValue.build();
+          onChanged();
+        } else {
+          optionBuilder_.setMessage(builderForValue.build());
+        }
+        typeCase_ = 4;
+        return this;
+      }
+      /**
+       * <code>.food.menu.v1.MenuItemOption option = 4;</code>
+       */
+      public Builder mergeOption(food.menu.v1.FoodMenu.MenuItemOption value) {
+        if (optionBuilder_ == null) {
+          if (typeCase_ == 4 &&
+              type_ != food.menu.v1.FoodMenu.MenuItemOption.getDefaultInstance()) {
+            type_ = food.menu.v1.FoodMenu.MenuItemOption.newBuilder((food.menu.v1.FoodMenu.MenuItemOption) type_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            type_ = value;
+          }
+          onChanged();
+        } else {
+          if (typeCase_ == 4) {
+            optionBuilder_.mergeFrom(value);
+          } else {
+            optionBuilder_.setMessage(value);
+          }
+        }
+        typeCase_ = 4;
+        return this;
+      }
+      /**
+       * <code>.food.menu.v1.MenuItemOption option = 4;</code>
+       */
+      public Builder clearOption() {
+        if (optionBuilder_ == null) {
+          if (typeCase_ == 4) {
+            typeCase_ = 0;
+            type_ = null;
+            onChanged();
+          }
+        } else {
+          if (typeCase_ == 4) {
+            typeCase_ = 0;
+            type_ = null;
+          }
+          optionBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>.food.menu.v1.MenuItemOption option = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.MenuItemOption.Builder getOptionBuilder() {
+        return getOptionFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.food.menu.v1.MenuItemOption option = 4;</code>
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItemOptionOrBuilder getOptionOrBuilder() {
+        if ((typeCase_ == 4) && (optionBuilder_ != null)) {
+          return optionBuilder_.getMessageOrBuilder();
+        } else {
+          if (typeCase_ == 4) {
+            return (food.menu.v1.FoodMenu.MenuItemOption) type_;
+          }
+          return food.menu.v1.FoodMenu.MenuItemOption.getDefaultInstance();
+        }
+      }
+      /**
+       * <code>.food.menu.v1.MenuItemOption option = 4;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.MenuItemOption, food.menu.v1.FoodMenu.MenuItemOption.Builder, food.menu.v1.FoodMenu.MenuItemOptionOrBuilder> 
+          getOptionFieldBuilder() {
+        if (optionBuilder_ == null) {
+          if (!(typeCase_ == 4)) {
+            type_ = food.menu.v1.FoodMenu.MenuItemOption.getDefaultInstance();
+          }
+          optionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.MenuItemOption, food.menu.v1.FoodMenu.MenuItemOption.Builder, food.menu.v1.FoodMenu.MenuItemOptionOrBuilder>(
+                  (food.menu.v1.FoodMenu.MenuItemOption) type_,
+                  getParentForChildren(),
+                  isClean());
+          type_ = null;
+        }
+        typeCase_ = 4;
+        onChanged();
+        return optionBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.MenuComponent)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.MenuComponent)
+    private static final food.menu.v1.FoodMenu.MenuComponent DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.MenuComponent();
+    }
+
+    public static food.menu.v1.FoodMenu.MenuComponent getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<MenuComponent>
+        PARSER = new com.google.protobuf.AbstractParser<MenuComponent>() {
+      @java.lang.Override
+      public MenuComponent parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<MenuComponent> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<MenuComponent> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuComponent getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface MenuOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.Menu)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * An opaque string from a partner which uniquely identifies the Menu within
+     * the partner feed.
+     * Required.
+     * </pre>
+     *
+     * <code>string menu_id = 1;</code>
+     * @return The menuId.
+     */
+    java.lang.String getMenuId();
+    /**
+     * <pre>
+     * An opaque string from a partner which uniquely identifies the Menu within
+     * the partner feed.
+     * Required.
+     * </pre>
+     *
+     * <code>string menu_id = 1;</code>
+     * @return The bytes for menuId.
+     */
+    com.google.protobuf.ByteString
+        getMenuIdBytes();
+
+    /**
+     * <pre>
+     * The merchants to whom the menu apply.
+     * Note: This field is repeated so chain restaurants can share the same menu
+     * across multiple locations, each of which is a separate merchant.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated string merchant_ids = 2;</code>
+     * @return A list containing the merchantIds.
+     */
+    java.util.List<java.lang.String>
+        getMerchantIdsList();
+    /**
+     * <pre>
+     * The merchants to whom the menu apply.
+     * Note: This field is repeated so chain restaurants can share the same menu
+     * across multiple locations, each of which is a separate merchant.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated string merchant_ids = 2;</code>
+     * @return The count of merchantIds.
+     */
+    int getMerchantIdsCount();
+    /**
+     * <pre>
+     * The merchants to whom the menu apply.
+     * Note: This field is repeated so chain restaurants can share the same menu
+     * across multiple locations, each of which is a separate merchant.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated string merchant_ids = 2;</code>
+     * @param index The index of the element to return.
+     * @return The merchantIds at the given index.
+     */
+    java.lang.String getMerchantIds(int index);
+    /**
+     * <pre>
+     * The merchants to whom the menu apply.
+     * Note: This field is repeated so chain restaurants can share the same menu
+     * across multiple locations, each of which is a separate merchant.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated string merchant_ids = 2;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the merchantIds at the given index.
+     */
+    com.google.protobuf.ByteString
+        getMerchantIdsBytes(int index);
+
+    /**
+     * <pre>
+     * The name that can identify the Menu when a user is browsing the menu.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 3;</code>
+     * @return Whether the displayName field is set.
+     */
+    boolean hasDisplayName();
+    /**
+     * <pre>
+     * The name that can identify the Menu when a user is browsing the menu.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 3;</code>
+     * @return The displayName.
+     */
+    food.menu.v1.FoodMenu.TextField getDisplayName();
+    /**
+     * <pre>
+     * The name that can identify the Menu when a user is browsing the menu.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 3;</code>
+     */
+    food.menu.v1.FoodMenu.TextFieldOrBuilder getDisplayNameOrBuilder();
+
+    /**
+     * <pre>
+     * The default language code associated with the text labels contained in the
+     * menu. Expects BCP-47 language code, such as "en-US" or "sr-Latn".
+     *
+     * For more information, see
+     * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+     * Optional.
+     * </pre>
+     *
+     * <code>string language = 4;</code>
+     * @return The language.
+     */
+    java.lang.String getLanguage();
+    /**
+     * <pre>
+     * The default language code associated with the text labels contained in the
+     * menu. Expects BCP-47 language code, such as "en-US" or "sr-Latn".
+     *
+     * For more information, see
+     * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+     * Optional.
+     * </pre>
+     *
+     * <code>string language = 4;</code>
+     * @return The bytes for language.
+     */
+    com.google.protobuf.ByteString
+        getLanguageBytes();
+
+    /**
+     * <pre>
+     * Disclaimer to be shown to the user for the menu. For example, nutritional
+     * information disclosure and allergen disclosure.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.Disclaimer disclaimer = 5;</code>
+     * @return Whether the disclaimer field is set.
+     */
+    boolean hasDisclaimer();
+    /**
+     * <pre>
+     * Disclaimer to be shown to the user for the menu. For example, nutritional
+     * information disclosure and allergen disclosure.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.Disclaimer disclaimer = 5;</code>
+     * @return The disclaimer.
+     */
+    food.menu.v1.FoodMenu.Disclaimer getDisclaimer();
+    /**
+     * <pre>
+     * Disclaimer to be shown to the user for the menu. For example, nutritional
+     * information disclosure and allergen disclosure.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.Disclaimer disclaimer = 5;</code>
+     */
+    food.menu.v1.FoodMenu.DisclaimerOrBuilder getDisclaimerOrBuilder();
+
+    /**
+     * <pre>
+     * IDs of items contained within this menu. Expects first-level menu items
+     * only.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_item_ids = 6;</code>
+     * @return A list containing the menuItemIds.
+     */
+    java.util.List<java.lang.String>
+        getMenuItemIdsList();
+    /**
+     * <pre>
+     * IDs of items contained within this menu. Expects first-level menu items
+     * only.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_item_ids = 6;</code>
+     * @return The count of menuItemIds.
+     */
+    int getMenuItemIdsCount();
+    /**
+     * <pre>
+     * IDs of items contained within this menu. Expects first-level menu items
+     * only.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_item_ids = 6;</code>
+     * @param index The index of the element to return.
+     * @return The menuItemIds at the given index.
+     */
+    java.lang.String getMenuItemIds(int index);
+    /**
+     * <pre>
+     * IDs of items contained within this menu. Expects first-level menu items
+     * only.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_item_ids = 6;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the menuItemIds at the given index.
+     */
+    com.google.protobuf.ByteString
+        getMenuItemIdsBytes(int index);
+
+    /**
+     * <pre>
+     * IDs of sections contained within this menu. Expects first-level menu
+     * sections only.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_section_ids = 7;</code>
+     * @return A list containing the menuSectionIds.
+     */
+    java.util.List<java.lang.String>
+        getMenuSectionIdsList();
+    /**
+     * <pre>
+     * IDs of sections contained within this menu. Expects first-level menu
+     * sections only.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_section_ids = 7;</code>
+     * @return The count of menuSectionIds.
+     */
+    int getMenuSectionIdsCount();
+    /**
+     * <pre>
+     * IDs of sections contained within this menu. Expects first-level menu
+     * sections only.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_section_ids = 7;</code>
+     * @param index The index of the element to return.
+     * @return The menuSectionIds at the given index.
+     */
+    java.lang.String getMenuSectionIds(int index);
+    /**
+     * <pre>
+     * IDs of sections contained within this menu. Expects first-level menu
+     * sections only.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_section_ids = 7;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the menuSectionIds at the given index.
+     */
+    com.google.protobuf.ByteString
+        getMenuSectionIdsBytes(int index);
+
+    /**
+     * <pre>
+     * Timestamp when this Menu or any of its contents was last updated by the
+     * restaurant; i.e. a date to be associated with the phrase “accurate as of
+     * date”.
+     * Optional.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp last_merchant_update_time = 8;</code>
+     * @return Whether the lastMerchantUpdateTime field is set.
+     */
+    boolean hasLastMerchantUpdateTime();
+    /**
+     * <pre>
+     * Timestamp when this Menu or any of its contents was last updated by the
+     * restaurant; i.e. a date to be associated with the phrase “accurate as of
+     * date”.
+     * Optional.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp last_merchant_update_time = 8;</code>
+     * @return The lastMerchantUpdateTime.
+     */
+    com.google.protobuf.Timestamp getLastMerchantUpdateTime();
+    /**
+     * <pre>
+     * Timestamp when this Menu or any of its contents was last updated by the
+     * restaurant; i.e. a date to be associated with the phrase “accurate as of
+     * date”.
+     * Optional.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp last_merchant_update_time = 8;</code>
+     */
+    com.google.protobuf.TimestampOrBuilder getLastMerchantUpdateTimeOrBuilder();
+  }
+  /**
+   * <pre>
+   * Top-level catalog of food items offered by a Food establishment. Menu
+   * contains a list of merchant ids and the menu that apply to those merchants.
+   * A Menu can be used to represent single merchant with the menu, or multiple
+   * merchants (typically chain restaurants) with the menus.
+   * </pre>
+   *
+   * Protobuf type {@code food.menu.v1.Menu}
+   */
+  public static final class Menu extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.Menu)
+      MenuOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use Menu.newBuilder() to construct.
+    private Menu(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private Menu() {
+      menuId_ = "";
+      merchantIds_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+      language_ = "";
+      menuItemIds_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+      menuSectionIds_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new Menu();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Menu_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Menu_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.Menu.class, food.menu.v1.FoodMenu.Menu.Builder.class);
+    }
+
+    public static final int MENU_ID_FIELD_NUMBER = 1;
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object menuId_ = "";
+    /**
+     * <pre>
+     * An opaque string from a partner which uniquely identifies the Menu within
+     * the partner feed.
+     * Required.
+     * </pre>
+     *
+     * <code>string menu_id = 1;</code>
+     * @return The menuId.
+     */
+    @java.lang.Override
+    public java.lang.String getMenuId() {
+      java.lang.Object ref = menuId_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        menuId_ = s;
+        return s;
+      }
+    }
+    /**
+     * <pre>
+     * An opaque string from a partner which uniquely identifies the Menu within
+     * the partner feed.
+     * Required.
+     * </pre>
+     *
+     * <code>string menu_id = 1;</code>
+     * @return The bytes for menuId.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getMenuIdBytes() {
+      java.lang.Object ref = menuId_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        menuId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int MERCHANT_IDS_FIELD_NUMBER = 2;
+    @SuppressWarnings("serial")
+    private com.google.protobuf.LazyStringArrayList merchantIds_ =
+        com.google.protobuf.LazyStringArrayList.emptyList();
+    /**
+     * <pre>
+     * The merchants to whom the menu apply.
+     * Note: This field is repeated so chain restaurants can share the same menu
+     * across multiple locations, each of which is a separate merchant.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated string merchant_ids = 2;</code>
+     * @return A list containing the merchantIds.
+     */
+    public com.google.protobuf.ProtocolStringList
+        getMerchantIdsList() {
+      return merchantIds_;
+    }
+    /**
+     * <pre>
+     * The merchants to whom the menu apply.
+     * Note: This field is repeated so chain restaurants can share the same menu
+     * across multiple locations, each of which is a separate merchant.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated string merchant_ids = 2;</code>
+     * @return The count of merchantIds.
+     */
+    public int getMerchantIdsCount() {
+      return merchantIds_.size();
+    }
+    /**
+     * <pre>
+     * The merchants to whom the menu apply.
+     * Note: This field is repeated so chain restaurants can share the same menu
+     * across multiple locations, each of which is a separate merchant.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated string merchant_ids = 2;</code>
+     * @param index The index of the element to return.
+     * @return The merchantIds at the given index.
+     */
+    public java.lang.String getMerchantIds(int index) {
+      return merchantIds_.get(index);
+    }
+    /**
+     * <pre>
+     * The merchants to whom the menu apply.
+     * Note: This field is repeated so chain restaurants can share the same menu
+     * across multiple locations, each of which is a separate merchant.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated string merchant_ids = 2;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the merchantIds at the given index.
+     */
+    public com.google.protobuf.ByteString
+        getMerchantIdsBytes(int index) {
+      return merchantIds_.getByteString(index);
+    }
+
+    public static final int DISPLAY_NAME_FIELD_NUMBER = 3;
+    private food.menu.v1.FoodMenu.TextField displayName_;
+    /**
+     * <pre>
+     * The name that can identify the Menu when a user is browsing the menu.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 3;</code>
+     * @return Whether the displayName field is set.
+     */
+    @java.lang.Override
+    public boolean hasDisplayName() {
+      return displayName_ != null;
+    }
+    /**
+     * <pre>
+     * The name that can identify the Menu when a user is browsing the menu.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 3;</code>
+     * @return The displayName.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextField getDisplayName() {
+      return displayName_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : displayName_;
+    }
+    /**
+     * <pre>
+     * The name that can identify the Menu when a user is browsing the menu.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 3;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextFieldOrBuilder getDisplayNameOrBuilder() {
+      return displayName_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : displayName_;
+    }
+
+    public static final int LANGUAGE_FIELD_NUMBER = 4;
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object language_ = "";
+    /**
+     * <pre>
+     * The default language code associated with the text labels contained in the
+     * menu. Expects BCP-47 language code, such as "en-US" or "sr-Latn".
+     *
+     * For more information, see
+     * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+     * Optional.
+     * </pre>
+     *
+     * <code>string language = 4;</code>
+     * @return The language.
+     */
+    @java.lang.Override
+    public java.lang.String getLanguage() {
+      java.lang.Object ref = language_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        language_ = s;
+        return s;
+      }
+    }
+    /**
+     * <pre>
+     * The default language code associated with the text labels contained in the
+     * menu. Expects BCP-47 language code, such as "en-US" or "sr-Latn".
+     *
+     * For more information, see
+     * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+     * Optional.
+     * </pre>
+     *
+     * <code>string language = 4;</code>
+     * @return The bytes for language.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getLanguageBytes() {
+      java.lang.Object ref = language_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        language_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int DISCLAIMER_FIELD_NUMBER = 5;
+    private food.menu.v1.FoodMenu.Disclaimer disclaimer_;
+    /**
+     * <pre>
+     * Disclaimer to be shown to the user for the menu. For example, nutritional
+     * information disclosure and allergen disclosure.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.Disclaimer disclaimer = 5;</code>
+     * @return Whether the disclaimer field is set.
+     */
+    @java.lang.Override
+    public boolean hasDisclaimer() {
+      return disclaimer_ != null;
+    }
+    /**
+     * <pre>
+     * Disclaimer to be shown to the user for the menu. For example, nutritional
+     * information disclosure and allergen disclosure.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.Disclaimer disclaimer = 5;</code>
+     * @return The disclaimer.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.Disclaimer getDisclaimer() {
+      return disclaimer_ == null ? food.menu.v1.FoodMenu.Disclaimer.getDefaultInstance() : disclaimer_;
+    }
+    /**
+     * <pre>
+     * Disclaimer to be shown to the user for the menu. For example, nutritional
+     * information disclosure and allergen disclosure.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.Disclaimer disclaimer = 5;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.DisclaimerOrBuilder getDisclaimerOrBuilder() {
+      return disclaimer_ == null ? food.menu.v1.FoodMenu.Disclaimer.getDefaultInstance() : disclaimer_;
+    }
+
+    public static final int MENU_ITEM_IDS_FIELD_NUMBER = 6;
+    @SuppressWarnings("serial")
+    private com.google.protobuf.LazyStringArrayList menuItemIds_ =
+        com.google.protobuf.LazyStringArrayList.emptyList();
+    /**
+     * <pre>
+     * IDs of items contained within this menu. Expects first-level menu items
+     * only.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_item_ids = 6;</code>
+     * @return A list containing the menuItemIds.
+     */
+    public com.google.protobuf.ProtocolStringList
+        getMenuItemIdsList() {
+      return menuItemIds_;
+    }
+    /**
+     * <pre>
+     * IDs of items contained within this menu. Expects first-level menu items
+     * only.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_item_ids = 6;</code>
+     * @return The count of menuItemIds.
+     */
+    public int getMenuItemIdsCount() {
+      return menuItemIds_.size();
+    }
+    /**
+     * <pre>
+     * IDs of items contained within this menu. Expects first-level menu items
+     * only.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_item_ids = 6;</code>
+     * @param index The index of the element to return.
+     * @return The menuItemIds at the given index.
+     */
+    public java.lang.String getMenuItemIds(int index) {
+      return menuItemIds_.get(index);
+    }
+    /**
+     * <pre>
+     * IDs of items contained within this menu. Expects first-level menu items
+     * only.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_item_ids = 6;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the menuItemIds at the given index.
+     */
+    public com.google.protobuf.ByteString
+        getMenuItemIdsBytes(int index) {
+      return menuItemIds_.getByteString(index);
+    }
+
+    public static final int MENU_SECTION_IDS_FIELD_NUMBER = 7;
+    @SuppressWarnings("serial")
+    private com.google.protobuf.LazyStringArrayList menuSectionIds_ =
+        com.google.protobuf.LazyStringArrayList.emptyList();
+    /**
+     * <pre>
+     * IDs of sections contained within this menu. Expects first-level menu
+     * sections only.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_section_ids = 7;</code>
+     * @return A list containing the menuSectionIds.
+     */
+    public com.google.protobuf.ProtocolStringList
+        getMenuSectionIdsList() {
+      return menuSectionIds_;
+    }
+    /**
+     * <pre>
+     * IDs of sections contained within this menu. Expects first-level menu
+     * sections only.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_section_ids = 7;</code>
+     * @return The count of menuSectionIds.
+     */
+    public int getMenuSectionIdsCount() {
+      return menuSectionIds_.size();
+    }
+    /**
+     * <pre>
+     * IDs of sections contained within this menu. Expects first-level menu
+     * sections only.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_section_ids = 7;</code>
+     * @param index The index of the element to return.
+     * @return The menuSectionIds at the given index.
+     */
+    public java.lang.String getMenuSectionIds(int index) {
+      return menuSectionIds_.get(index);
+    }
+    /**
+     * <pre>
+     * IDs of sections contained within this menu. Expects first-level menu
+     * sections only.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_section_ids = 7;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the menuSectionIds at the given index.
+     */
+    public com.google.protobuf.ByteString
+        getMenuSectionIdsBytes(int index) {
+      return menuSectionIds_.getByteString(index);
+    }
+
+    public static final int LAST_MERCHANT_UPDATE_TIME_FIELD_NUMBER = 8;
+    private com.google.protobuf.Timestamp lastMerchantUpdateTime_;
+    /**
+     * <pre>
+     * Timestamp when this Menu or any of its contents was last updated by the
+     * restaurant; i.e. a date to be associated with the phrase “accurate as of
+     * date”.
+     * Optional.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp last_merchant_update_time = 8;</code>
+     * @return Whether the lastMerchantUpdateTime field is set.
+     */
+    @java.lang.Override
+    public boolean hasLastMerchantUpdateTime() {
+      return lastMerchantUpdateTime_ != null;
+    }
+    /**
+     * <pre>
+     * Timestamp when this Menu or any of its contents was last updated by the
+     * restaurant; i.e. a date to be associated with the phrase “accurate as of
+     * date”.
+     * Optional.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp last_merchant_update_time = 8;</code>
+     * @return The lastMerchantUpdateTime.
+     */
+    @java.lang.Override
+    public com.google.protobuf.Timestamp getLastMerchantUpdateTime() {
+      return lastMerchantUpdateTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : lastMerchantUpdateTime_;
+    }
+    /**
+     * <pre>
+     * Timestamp when this Menu or any of its contents was last updated by the
+     * restaurant; i.e. a date to be associated with the phrase “accurate as of
+     * date”.
+     * Optional.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp last_merchant_update_time = 8;</code>
+     */
+    @java.lang.Override
+    public com.google.protobuf.TimestampOrBuilder getLastMerchantUpdateTimeOrBuilder() {
+      return lastMerchantUpdateTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : lastMerchantUpdateTime_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(menuId_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, menuId_);
+      }
+      for (int i = 0; i < merchantIds_.size(); i++) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, merchantIds_.getRaw(i));
+      }
+      if (displayName_ != null) {
+        output.writeMessage(3, getDisplayName());
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(language_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 4, language_);
+      }
+      if (disclaimer_ != null) {
+        output.writeMessage(5, getDisclaimer());
+      }
+      for (int i = 0; i < menuItemIds_.size(); i++) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 6, menuItemIds_.getRaw(i));
+      }
+      for (int i = 0; i < menuSectionIds_.size(); i++) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 7, menuSectionIds_.getRaw(i));
+      }
+      if (lastMerchantUpdateTime_ != null) {
+        output.writeMessage(8, getLastMerchantUpdateTime());
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(menuId_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, menuId_);
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < merchantIds_.size(); i++) {
+          dataSize += computeStringSizeNoTag(merchantIds_.getRaw(i));
+        }
+        size += dataSize;
+        size += 1 * getMerchantIdsList().size();
+      }
+      if (displayName_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, getDisplayName());
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(language_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, language_);
+      }
+      if (disclaimer_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(5, getDisclaimer());
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < menuItemIds_.size(); i++) {
+          dataSize += computeStringSizeNoTag(menuItemIds_.getRaw(i));
+        }
+        size += dataSize;
+        size += 1 * getMenuItemIdsList().size();
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < menuSectionIds_.size(); i++) {
+          dataSize += computeStringSizeNoTag(menuSectionIds_.getRaw(i));
+        }
+        size += dataSize;
+        size += 1 * getMenuSectionIdsList().size();
+      }
+      if (lastMerchantUpdateTime_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(8, getLastMerchantUpdateTime());
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.Menu)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.Menu other = (food.menu.v1.FoodMenu.Menu) obj;
+
+      if (!getMenuId()
+          .equals(other.getMenuId())) return false;
+      if (!getMerchantIdsList()
+          .equals(other.getMerchantIdsList())) return false;
+      if (hasDisplayName() != other.hasDisplayName()) return false;
+      if (hasDisplayName()) {
+        if (!getDisplayName()
+            .equals(other.getDisplayName())) return false;
+      }
+      if (!getLanguage()
+          .equals(other.getLanguage())) return false;
+      if (hasDisclaimer() != other.hasDisclaimer()) return false;
+      if (hasDisclaimer()) {
+        if (!getDisclaimer()
+            .equals(other.getDisclaimer())) return false;
+      }
+      if (!getMenuItemIdsList()
+          .equals(other.getMenuItemIdsList())) return false;
+      if (!getMenuSectionIdsList()
+          .equals(other.getMenuSectionIdsList())) return false;
+      if (hasLastMerchantUpdateTime() != other.hasLastMerchantUpdateTime()) return false;
+      if (hasLastMerchantUpdateTime()) {
+        if (!getLastMerchantUpdateTime()
+            .equals(other.getLastMerchantUpdateTime())) return false;
+      }
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + MENU_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getMenuId().hashCode();
+      if (getMerchantIdsCount() > 0) {
+        hash = (37 * hash) + MERCHANT_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getMerchantIdsList().hashCode();
+      }
+      if (hasDisplayName()) {
+        hash = (37 * hash) + DISPLAY_NAME_FIELD_NUMBER;
+        hash = (53 * hash) + getDisplayName().hashCode();
+      }
+      hash = (37 * hash) + LANGUAGE_FIELD_NUMBER;
+      hash = (53 * hash) + getLanguage().hashCode();
+      if (hasDisclaimer()) {
+        hash = (37 * hash) + DISCLAIMER_FIELD_NUMBER;
+        hash = (53 * hash) + getDisclaimer().hashCode();
+      }
+      if (getMenuItemIdsCount() > 0) {
+        hash = (37 * hash) + MENU_ITEM_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getMenuItemIdsList().hashCode();
+      }
+      if (getMenuSectionIdsCount() > 0) {
+        hash = (37 * hash) + MENU_SECTION_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getMenuSectionIdsList().hashCode();
+      }
+      if (hasLastMerchantUpdateTime()) {
+        hash = (37 * hash) + LAST_MERCHANT_UPDATE_TIME_FIELD_NUMBER;
+        hash = (53 * hash) + getLastMerchantUpdateTime().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.Menu parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Menu parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Menu parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Menu parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Menu parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Menu parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Menu parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Menu parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Menu parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Menu parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Menu parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Menu parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.Menu prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * Top-level catalog of food items offered by a Food establishment. Menu
+     * contains a list of merchant ids and the menu that apply to those merchants.
+     * A Menu can be used to represent single merchant with the menu, or multiple
+     * merchants (typically chain restaurants) with the menus.
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.Menu}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.Menu)
+        food.menu.v1.FoodMenu.MenuOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Menu_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Menu_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.Menu.class, food.menu.v1.FoodMenu.Menu.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.Menu.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        menuId_ = "";
+        merchantIds_ =
+            com.google.protobuf.LazyStringArrayList.emptyList();
+        displayName_ = null;
+        if (displayNameBuilder_ != null) {
+          displayNameBuilder_.dispose();
+          displayNameBuilder_ = null;
+        }
+        language_ = "";
+        disclaimer_ = null;
+        if (disclaimerBuilder_ != null) {
+          disclaimerBuilder_.dispose();
+          disclaimerBuilder_ = null;
+        }
+        menuItemIds_ =
+            com.google.protobuf.LazyStringArrayList.emptyList();
+        menuSectionIds_ =
+            com.google.protobuf.LazyStringArrayList.emptyList();
+        lastMerchantUpdateTime_ = null;
+        if (lastMerchantUpdateTimeBuilder_ != null) {
+          lastMerchantUpdateTimeBuilder_.dispose();
+          lastMerchantUpdateTimeBuilder_ = null;
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Menu_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Menu getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.Menu.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Menu build() {
+        food.menu.v1.FoodMenu.Menu result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Menu buildPartial() {
+        food.menu.v1.FoodMenu.Menu result = new food.menu.v1.FoodMenu.Menu(this);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.Menu result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.menuId_ = menuId_;
+        }
+        if (((from_bitField0_ & 0x00000002) != 0)) {
+          merchantIds_.makeImmutable();
+          result.merchantIds_ = merchantIds_;
+        }
+        if (((from_bitField0_ & 0x00000004) != 0)) {
+          result.displayName_ = displayNameBuilder_ == null
+              ? displayName_
+              : displayNameBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000008) != 0)) {
+          result.language_ = language_;
+        }
+        if (((from_bitField0_ & 0x00000010) != 0)) {
+          result.disclaimer_ = disclaimerBuilder_ == null
+              ? disclaimer_
+              : disclaimerBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000020) != 0)) {
+          menuItemIds_.makeImmutable();
+          result.menuItemIds_ = menuItemIds_;
+        }
+        if (((from_bitField0_ & 0x00000040) != 0)) {
+          menuSectionIds_.makeImmutable();
+          result.menuSectionIds_ = menuSectionIds_;
+        }
+        if (((from_bitField0_ & 0x00000080) != 0)) {
+          result.lastMerchantUpdateTime_ = lastMerchantUpdateTimeBuilder_ == null
+              ? lastMerchantUpdateTime_
+              : lastMerchantUpdateTimeBuilder_.build();
+        }
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.Menu) {
+          return mergeFrom((food.menu.v1.FoodMenu.Menu)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.Menu other) {
+        if (other == food.menu.v1.FoodMenu.Menu.getDefaultInstance()) return this;
+        if (!other.getMenuId().isEmpty()) {
+          menuId_ = other.menuId_;
+          bitField0_ |= 0x00000001;
+          onChanged();
+        }
+        if (!other.merchantIds_.isEmpty()) {
+          if (merchantIds_.isEmpty()) {
+            merchantIds_ = other.merchantIds_;
+            bitField0_ |= 0x00000002;
+          } else {
+            ensureMerchantIdsIsMutable();
+            merchantIds_.addAll(other.merchantIds_);
+          }
+          onChanged();
+        }
+        if (other.hasDisplayName()) {
+          mergeDisplayName(other.getDisplayName());
+        }
+        if (!other.getLanguage().isEmpty()) {
+          language_ = other.language_;
+          bitField0_ |= 0x00000008;
+          onChanged();
+        }
+        if (other.hasDisclaimer()) {
+          mergeDisclaimer(other.getDisclaimer());
+        }
+        if (!other.menuItemIds_.isEmpty()) {
+          if (menuItemIds_.isEmpty()) {
+            menuItemIds_ = other.menuItemIds_;
+            bitField0_ |= 0x00000020;
+          } else {
+            ensureMenuItemIdsIsMutable();
+            menuItemIds_.addAll(other.menuItemIds_);
+          }
+          onChanged();
+        }
+        if (!other.menuSectionIds_.isEmpty()) {
+          if (menuSectionIds_.isEmpty()) {
+            menuSectionIds_ = other.menuSectionIds_;
+            bitField0_ |= 0x00000040;
+          } else {
+            ensureMenuSectionIdsIsMutable();
+            menuSectionIds_.addAll(other.menuSectionIds_);
+          }
+          onChanged();
+        }
+        if (other.hasLastMerchantUpdateTime()) {
+          mergeLastMerchantUpdateTime(other.getLastMerchantUpdateTime());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                menuId_ = input.readStringRequireUtf8();
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 10
+              case 18: {
+                java.lang.String s = input.readStringRequireUtf8();
+                ensureMerchantIdsIsMutable();
+                merchantIds_.add(s);
+                break;
+              } // case 18
+              case 26: {
+                input.readMessage(
+                    getDisplayNameFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000004;
+                break;
+              } // case 26
+              case 34: {
+                language_ = input.readStringRequireUtf8();
+                bitField0_ |= 0x00000008;
+                break;
+              } // case 34
+              case 42: {
+                input.readMessage(
+                    getDisclaimerFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000010;
+                break;
+              } // case 42
+              case 50: {
+                java.lang.String s = input.readStringRequireUtf8();
+                ensureMenuItemIdsIsMutable();
+                menuItemIds_.add(s);
+                break;
+              } // case 50
+              case 58: {
+                java.lang.String s = input.readStringRequireUtf8();
+                ensureMenuSectionIdsIsMutable();
+                menuSectionIds_.add(s);
+                break;
+              } // case 58
+              case 66: {
+                input.readMessage(
+                    getLastMerchantUpdateTimeFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000080;
+                break;
+              } // case 66
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int bitField0_;
+
+      private java.lang.Object menuId_ = "";
+      /**
+       * <pre>
+       * An opaque string from a partner which uniquely identifies the Menu within
+       * the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_id = 1;</code>
+       * @return The menuId.
+       */
+      public java.lang.String getMenuId() {
+        java.lang.Object ref = menuId_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          menuId_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <pre>
+       * An opaque string from a partner which uniquely identifies the Menu within
+       * the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_id = 1;</code>
+       * @return The bytes for menuId.
+       */
+      public com.google.protobuf.ByteString
+          getMenuIdBytes() {
+        java.lang.Object ref = menuId_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          menuId_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <pre>
+       * An opaque string from a partner which uniquely identifies the Menu within
+       * the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_id = 1;</code>
+       * @param value The menuId to set.
+       * @return This builder for chaining.
+       */
+      public Builder setMenuId(
+          java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        menuId_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * An opaque string from a partner which uniquely identifies the Menu within
+       * the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_id = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearMenuId() {
+        menuId_ = getDefaultInstance().getMenuId();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * An opaque string from a partner which uniquely identifies the Menu within
+       * the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_id = 1;</code>
+       * @param value The bytes for menuId to set.
+       * @return This builder for chaining.
+       */
+      public Builder setMenuIdBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) { throw new NullPointerException(); }
+        checkByteStringIsUtf8(value);
+        menuId_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+
+      private com.google.protobuf.LazyStringArrayList merchantIds_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+      private void ensureMerchantIdsIsMutable() {
+        if (!merchantIds_.isModifiable()) {
+          merchantIds_ = new com.google.protobuf.LazyStringArrayList(merchantIds_);
+        }
+        bitField0_ |= 0x00000002;
+      }
+      /**
+       * <pre>
+       * The merchants to whom the menu apply.
+       * Note: This field is repeated so chain restaurants can share the same menu
+       * across multiple locations, each of which is a separate merchant.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string merchant_ids = 2;</code>
+       * @return A list containing the merchantIds.
+       */
+      public com.google.protobuf.ProtocolStringList
+          getMerchantIdsList() {
+        merchantIds_.makeImmutable();
+        return merchantIds_;
+      }
+      /**
+       * <pre>
+       * The merchants to whom the menu apply.
+       * Note: This field is repeated so chain restaurants can share the same menu
+       * across multiple locations, each of which is a separate merchant.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string merchant_ids = 2;</code>
+       * @return The count of merchantIds.
+       */
+      public int getMerchantIdsCount() {
+        return merchantIds_.size();
+      }
+      /**
+       * <pre>
+       * The merchants to whom the menu apply.
+       * Note: This field is repeated so chain restaurants can share the same menu
+       * across multiple locations, each of which is a separate merchant.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string merchant_ids = 2;</code>
+       * @param index The index of the element to return.
+       * @return The merchantIds at the given index.
+       */
+      public java.lang.String getMerchantIds(int index) {
+        return merchantIds_.get(index);
+      }
+      /**
+       * <pre>
+       * The merchants to whom the menu apply.
+       * Note: This field is repeated so chain restaurants can share the same menu
+       * across multiple locations, each of which is a separate merchant.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string merchant_ids = 2;</code>
+       * @param index The index of the value to return.
+       * @return The bytes of the merchantIds at the given index.
+       */
+      public com.google.protobuf.ByteString
+          getMerchantIdsBytes(int index) {
+        return merchantIds_.getByteString(index);
+      }
+      /**
+       * <pre>
+       * The merchants to whom the menu apply.
+       * Note: This field is repeated so chain restaurants can share the same menu
+       * across multiple locations, each of which is a separate merchant.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string merchant_ids = 2;</code>
+       * @param index The index to set the value at.
+       * @param value The merchantIds to set.
+       * @return This builder for chaining.
+       */
+      public Builder setMerchantIds(
+          int index, java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        ensureMerchantIdsIsMutable();
+        merchantIds_.set(index, value);
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The merchants to whom the menu apply.
+       * Note: This field is repeated so chain restaurants can share the same menu
+       * across multiple locations, each of which is a separate merchant.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string merchant_ids = 2;</code>
+       * @param value The merchantIds to add.
+       * @return This builder for chaining.
+       */
+      public Builder addMerchantIds(
+          java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        ensureMerchantIdsIsMutable();
+        merchantIds_.add(value);
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The merchants to whom the menu apply.
+       * Note: This field is repeated so chain restaurants can share the same menu
+       * across multiple locations, each of which is a separate merchant.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string merchant_ids = 2;</code>
+       * @param values The merchantIds to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllMerchantIds(
+          java.lang.Iterable<java.lang.String> values) {
+        ensureMerchantIdsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, merchantIds_);
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The merchants to whom the menu apply.
+       * Note: This field is repeated so chain restaurants can share the same menu
+       * across multiple locations, each of which is a separate merchant.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string merchant_ids = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearMerchantIds() {
+        merchantIds_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000002);;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The merchants to whom the menu apply.
+       * Note: This field is repeated so chain restaurants can share the same menu
+       * across multiple locations, each of which is a separate merchant.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string merchant_ids = 2;</code>
+       * @param value The bytes of the merchantIds to add.
+       * @return This builder for chaining.
+       */
+      public Builder addMerchantIdsBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) { throw new NullPointerException(); }
+        checkByteStringIsUtf8(value);
+        ensureMerchantIdsIsMutable();
+        merchantIds_.add(value);
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+
+      private food.menu.v1.FoodMenu.TextField displayName_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> displayNameBuilder_;
+      /**
+       * <pre>
+       * The name that can identify the Menu when a user is browsing the menu.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 3;</code>
+       * @return Whether the displayName field is set.
+       */
+      public boolean hasDisplayName() {
+        return ((bitField0_ & 0x00000004) != 0);
+      }
+      /**
+       * <pre>
+       * The name that can identify the Menu when a user is browsing the menu.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 3;</code>
+       * @return The displayName.
+       */
+      public food.menu.v1.FoodMenu.TextField getDisplayName() {
+        if (displayNameBuilder_ == null) {
+          return displayName_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : displayName_;
+        } else {
+          return displayNameBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * The name that can identify the Menu when a user is browsing the menu.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 3;</code>
+       */
+      public Builder setDisplayName(food.menu.v1.FoodMenu.TextField value) {
+        if (displayNameBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          displayName_ = value;
+        } else {
+          displayNameBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The name that can identify the Menu when a user is browsing the menu.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 3;</code>
+       */
+      public Builder setDisplayName(
+          food.menu.v1.FoodMenu.TextField.Builder builderForValue) {
+        if (displayNameBuilder_ == null) {
+          displayName_ = builderForValue.build();
+        } else {
+          displayNameBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The name that can identify the Menu when a user is browsing the menu.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 3;</code>
+       */
+      public Builder mergeDisplayName(food.menu.v1.FoodMenu.TextField value) {
+        if (displayNameBuilder_ == null) {
+          if (((bitField0_ & 0x00000004) != 0) &&
+            displayName_ != null &&
+            displayName_ != food.menu.v1.FoodMenu.TextField.getDefaultInstance()) {
+            getDisplayNameBuilder().mergeFrom(value);
+          } else {
+            displayName_ = value;
+          }
+        } else {
+          displayNameBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The name that can identify the Menu when a user is browsing the menu.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 3;</code>
+       */
+      public Builder clearDisplayName() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        displayName_ = null;
+        if (displayNameBuilder_ != null) {
+          displayNameBuilder_.dispose();
+          displayNameBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The name that can identify the Menu when a user is browsing the menu.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 3;</code>
+       */
+      public food.menu.v1.FoodMenu.TextField.Builder getDisplayNameBuilder() {
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return getDisplayNameFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * The name that can identify the Menu when a user is browsing the menu.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 3;</code>
+       */
+      public food.menu.v1.FoodMenu.TextFieldOrBuilder getDisplayNameOrBuilder() {
+        if (displayNameBuilder_ != null) {
+          return displayNameBuilder_.getMessageOrBuilder();
+        } else {
+          return displayName_ == null ?
+              food.menu.v1.FoodMenu.TextField.getDefaultInstance() : displayName_;
+        }
+      }
+      /**
+       * <pre>
+       * The name that can identify the Menu when a user is browsing the menu.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 3;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> 
+          getDisplayNameFieldBuilder() {
+        if (displayNameBuilder_ == null) {
+          displayNameBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder>(
+                  getDisplayName(),
+                  getParentForChildren(),
+                  isClean());
+          displayName_ = null;
+        }
+        return displayNameBuilder_;
+      }
+
+      private java.lang.Object language_ = "";
+      /**
+       * <pre>
+       * The default language code associated with the text labels contained in the
+       * menu. Expects BCP-47 language code, such as "en-US" or "sr-Latn".
+       *
+       * For more information, see
+       * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+       * Optional.
+       * </pre>
+       *
+       * <code>string language = 4;</code>
+       * @return The language.
+       */
+      public java.lang.String getLanguage() {
+        java.lang.Object ref = language_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          language_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <pre>
+       * The default language code associated with the text labels contained in the
+       * menu. Expects BCP-47 language code, such as "en-US" or "sr-Latn".
+       *
+       * For more information, see
+       * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+       * Optional.
+       * </pre>
+       *
+       * <code>string language = 4;</code>
+       * @return The bytes for language.
+       */
+      public com.google.protobuf.ByteString
+          getLanguageBytes() {
+        java.lang.Object ref = language_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          language_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <pre>
+       * The default language code associated with the text labels contained in the
+       * menu. Expects BCP-47 language code, such as "en-US" or "sr-Latn".
+       *
+       * For more information, see
+       * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+       * Optional.
+       * </pre>
+       *
+       * <code>string language = 4;</code>
+       * @param value The language to set.
+       * @return This builder for chaining.
+       */
+      public Builder setLanguage(
+          java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        language_ = value;
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The default language code associated with the text labels contained in the
+       * menu. Expects BCP-47 language code, such as "en-US" or "sr-Latn".
+       *
+       * For more information, see
+       * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+       * Optional.
+       * </pre>
+       *
+       * <code>string language = 4;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearLanguage() {
+        language_ = getDefaultInstance().getLanguage();
+        bitField0_ = (bitField0_ & ~0x00000008);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The default language code associated with the text labels contained in the
+       * menu. Expects BCP-47 language code, such as "en-US" or "sr-Latn".
+       *
+       * For more information, see
+       * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+       * Optional.
+       * </pre>
+       *
+       * <code>string language = 4;</code>
+       * @param value The bytes for language to set.
+       * @return This builder for chaining.
+       */
+      public Builder setLanguageBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) { throw new NullPointerException(); }
+        checkByteStringIsUtf8(value);
+        language_ = value;
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+
+      private food.menu.v1.FoodMenu.Disclaimer disclaimer_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.Disclaimer, food.menu.v1.FoodMenu.Disclaimer.Builder, food.menu.v1.FoodMenu.DisclaimerOrBuilder> disclaimerBuilder_;
+      /**
+       * <pre>
+       * Disclaimer to be shown to the user for the menu. For example, nutritional
+       * information disclosure and allergen disclosure.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.Disclaimer disclaimer = 5;</code>
+       * @return Whether the disclaimer field is set.
+       */
+      public boolean hasDisclaimer() {
+        return ((bitField0_ & 0x00000010) != 0);
+      }
+      /**
+       * <pre>
+       * Disclaimer to be shown to the user for the menu. For example, nutritional
+       * information disclosure and allergen disclosure.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.Disclaimer disclaimer = 5;</code>
+       * @return The disclaimer.
+       */
+      public food.menu.v1.FoodMenu.Disclaimer getDisclaimer() {
+        if (disclaimerBuilder_ == null) {
+          return disclaimer_ == null ? food.menu.v1.FoodMenu.Disclaimer.getDefaultInstance() : disclaimer_;
+        } else {
+          return disclaimerBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * Disclaimer to be shown to the user for the menu. For example, nutritional
+       * information disclosure and allergen disclosure.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.Disclaimer disclaimer = 5;</code>
+       */
+      public Builder setDisclaimer(food.menu.v1.FoodMenu.Disclaimer value) {
+        if (disclaimerBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          disclaimer_ = value;
+        } else {
+          disclaimerBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000010;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Disclaimer to be shown to the user for the menu. For example, nutritional
+       * information disclosure and allergen disclosure.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.Disclaimer disclaimer = 5;</code>
+       */
+      public Builder setDisclaimer(
+          food.menu.v1.FoodMenu.Disclaimer.Builder builderForValue) {
+        if (disclaimerBuilder_ == null) {
+          disclaimer_ = builderForValue.build();
+        } else {
+          disclaimerBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000010;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Disclaimer to be shown to the user for the menu. For example, nutritional
+       * information disclosure and allergen disclosure.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.Disclaimer disclaimer = 5;</code>
+       */
+      public Builder mergeDisclaimer(food.menu.v1.FoodMenu.Disclaimer value) {
+        if (disclaimerBuilder_ == null) {
+          if (((bitField0_ & 0x00000010) != 0) &&
+            disclaimer_ != null &&
+            disclaimer_ != food.menu.v1.FoodMenu.Disclaimer.getDefaultInstance()) {
+            getDisclaimerBuilder().mergeFrom(value);
+          } else {
+            disclaimer_ = value;
+          }
+        } else {
+          disclaimerBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000010;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Disclaimer to be shown to the user for the menu. For example, nutritional
+       * information disclosure and allergen disclosure.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.Disclaimer disclaimer = 5;</code>
+       */
+      public Builder clearDisclaimer() {
+        bitField0_ = (bitField0_ & ~0x00000010);
+        disclaimer_ = null;
+        if (disclaimerBuilder_ != null) {
+          disclaimerBuilder_.dispose();
+          disclaimerBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Disclaimer to be shown to the user for the menu. For example, nutritional
+       * information disclosure and allergen disclosure.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.Disclaimer disclaimer = 5;</code>
+       */
+      public food.menu.v1.FoodMenu.Disclaimer.Builder getDisclaimerBuilder() {
+        bitField0_ |= 0x00000010;
+        onChanged();
+        return getDisclaimerFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Disclaimer to be shown to the user for the menu. For example, nutritional
+       * information disclosure and allergen disclosure.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.Disclaimer disclaimer = 5;</code>
+       */
+      public food.menu.v1.FoodMenu.DisclaimerOrBuilder getDisclaimerOrBuilder() {
+        if (disclaimerBuilder_ != null) {
+          return disclaimerBuilder_.getMessageOrBuilder();
+        } else {
+          return disclaimer_ == null ?
+              food.menu.v1.FoodMenu.Disclaimer.getDefaultInstance() : disclaimer_;
+        }
+      }
+      /**
+       * <pre>
+       * Disclaimer to be shown to the user for the menu. For example, nutritional
+       * information disclosure and allergen disclosure.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.Disclaimer disclaimer = 5;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.Disclaimer, food.menu.v1.FoodMenu.Disclaimer.Builder, food.menu.v1.FoodMenu.DisclaimerOrBuilder> 
+          getDisclaimerFieldBuilder() {
+        if (disclaimerBuilder_ == null) {
+          disclaimerBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.Disclaimer, food.menu.v1.FoodMenu.Disclaimer.Builder, food.menu.v1.FoodMenu.DisclaimerOrBuilder>(
+                  getDisclaimer(),
+                  getParentForChildren(),
+                  isClean());
+          disclaimer_ = null;
+        }
+        return disclaimerBuilder_;
+      }
+
+      private com.google.protobuf.LazyStringArrayList menuItemIds_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+      private void ensureMenuItemIdsIsMutable() {
+        if (!menuItemIds_.isModifiable()) {
+          menuItemIds_ = new com.google.protobuf.LazyStringArrayList(menuItemIds_);
+        }
+        bitField0_ |= 0x00000020;
+      }
+      /**
+       * <pre>
+       * IDs of items contained within this menu. Expects first-level menu items
+       * only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @return A list containing the menuItemIds.
+       */
+      public com.google.protobuf.ProtocolStringList
+          getMenuItemIdsList() {
+        menuItemIds_.makeImmutable();
+        return menuItemIds_;
+      }
+      /**
+       * <pre>
+       * IDs of items contained within this menu. Expects first-level menu items
+       * only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @return The count of menuItemIds.
+       */
+      public int getMenuItemIdsCount() {
+        return menuItemIds_.size();
+      }
+      /**
+       * <pre>
+       * IDs of items contained within this menu. Expects first-level menu items
+       * only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @param index The index of the element to return.
+       * @return The menuItemIds at the given index.
+       */
+      public java.lang.String getMenuItemIds(int index) {
+        return menuItemIds_.get(index);
+      }
+      /**
+       * <pre>
+       * IDs of items contained within this menu. Expects first-level menu items
+       * only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @param index The index of the value to return.
+       * @return The bytes of the menuItemIds at the given index.
+       */
+      public com.google.protobuf.ByteString
+          getMenuItemIdsBytes(int index) {
+        return menuItemIds_.getByteString(index);
+      }
+      /**
+       * <pre>
+       * IDs of items contained within this menu. Expects first-level menu items
+       * only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @param index The index to set the value at.
+       * @param value The menuItemIds to set.
+       * @return This builder for chaining.
+       */
+      public Builder setMenuItemIds(
+          int index, java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        ensureMenuItemIdsIsMutable();
+        menuItemIds_.set(index, value);
+        bitField0_ |= 0x00000020;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * IDs of items contained within this menu. Expects first-level menu items
+       * only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @param value The menuItemIds to add.
+       * @return This builder for chaining.
+       */
+      public Builder addMenuItemIds(
+          java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        ensureMenuItemIdsIsMutable();
+        menuItemIds_.add(value);
+        bitField0_ |= 0x00000020;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * IDs of items contained within this menu. Expects first-level menu items
+       * only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @param values The menuItemIds to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllMenuItemIds(
+          java.lang.Iterable<java.lang.String> values) {
+        ensureMenuItemIdsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, menuItemIds_);
+        bitField0_ |= 0x00000020;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * IDs of items contained within this menu. Expects first-level menu items
+       * only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearMenuItemIds() {
+        menuItemIds_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000020);;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * IDs of items contained within this menu. Expects first-level menu items
+       * only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @param value The bytes of the menuItemIds to add.
+       * @return This builder for chaining.
+       */
+      public Builder addMenuItemIdsBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) { throw new NullPointerException(); }
+        checkByteStringIsUtf8(value);
+        ensureMenuItemIdsIsMutable();
+        menuItemIds_.add(value);
+        bitField0_ |= 0x00000020;
+        onChanged();
+        return this;
+      }
+
+      private com.google.protobuf.LazyStringArrayList menuSectionIds_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+      private void ensureMenuSectionIdsIsMutable() {
+        if (!menuSectionIds_.isModifiable()) {
+          menuSectionIds_ = new com.google.protobuf.LazyStringArrayList(menuSectionIds_);
+        }
+        bitField0_ |= 0x00000040;
+      }
+      /**
+       * <pre>
+       * IDs of sections contained within this menu. Expects first-level menu
+       * sections only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @return A list containing the menuSectionIds.
+       */
+      public com.google.protobuf.ProtocolStringList
+          getMenuSectionIdsList() {
+        menuSectionIds_.makeImmutable();
+        return menuSectionIds_;
+      }
+      /**
+       * <pre>
+       * IDs of sections contained within this menu. Expects first-level menu
+       * sections only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @return The count of menuSectionIds.
+       */
+      public int getMenuSectionIdsCount() {
+        return menuSectionIds_.size();
+      }
+      /**
+       * <pre>
+       * IDs of sections contained within this menu. Expects first-level menu
+       * sections only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @param index The index of the element to return.
+       * @return The menuSectionIds at the given index.
+       */
+      public java.lang.String getMenuSectionIds(int index) {
+        return menuSectionIds_.get(index);
+      }
+      /**
+       * <pre>
+       * IDs of sections contained within this menu. Expects first-level menu
+       * sections only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @param index The index of the value to return.
+       * @return The bytes of the menuSectionIds at the given index.
+       */
+      public com.google.protobuf.ByteString
+          getMenuSectionIdsBytes(int index) {
+        return menuSectionIds_.getByteString(index);
+      }
+      /**
+       * <pre>
+       * IDs of sections contained within this menu. Expects first-level menu
+       * sections only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @param index The index to set the value at.
+       * @param value The menuSectionIds to set.
+       * @return This builder for chaining.
+       */
+      public Builder setMenuSectionIds(
+          int index, java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        ensureMenuSectionIdsIsMutable();
+        menuSectionIds_.set(index, value);
+        bitField0_ |= 0x00000040;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * IDs of sections contained within this menu. Expects first-level menu
+       * sections only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @param value The menuSectionIds to add.
+       * @return This builder for chaining.
+       */
+      public Builder addMenuSectionIds(
+          java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        ensureMenuSectionIdsIsMutable();
+        menuSectionIds_.add(value);
+        bitField0_ |= 0x00000040;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * IDs of sections contained within this menu. Expects first-level menu
+       * sections only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @param values The menuSectionIds to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllMenuSectionIds(
+          java.lang.Iterable<java.lang.String> values) {
+        ensureMenuSectionIdsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, menuSectionIds_);
+        bitField0_ |= 0x00000040;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * IDs of sections contained within this menu. Expects first-level menu
+       * sections only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearMenuSectionIds() {
+        menuSectionIds_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000040);;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * IDs of sections contained within this menu. Expects first-level menu
+       * sections only.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @param value The bytes of the menuSectionIds to add.
+       * @return This builder for chaining.
+       */
+      public Builder addMenuSectionIdsBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) { throw new NullPointerException(); }
+        checkByteStringIsUtf8(value);
+        ensureMenuSectionIdsIsMutable();
+        menuSectionIds_.add(value);
+        bitField0_ |= 0x00000040;
+        onChanged();
+        return this;
+      }
+
+      private com.google.protobuf.Timestamp lastMerchantUpdateTime_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> lastMerchantUpdateTimeBuilder_;
+      /**
+       * <pre>
+       * Timestamp when this Menu or any of its contents was last updated by the
+       * restaurant; i.e. a date to be associated with the phrase “accurate as of
+       * date”.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.protobuf.Timestamp last_merchant_update_time = 8;</code>
+       * @return Whether the lastMerchantUpdateTime field is set.
+       */
+      public boolean hasLastMerchantUpdateTime() {
+        return ((bitField0_ & 0x00000080) != 0);
+      }
+      /**
+       * <pre>
+       * Timestamp when this Menu or any of its contents was last updated by the
+       * restaurant; i.e. a date to be associated with the phrase “accurate as of
+       * date”.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.protobuf.Timestamp last_merchant_update_time = 8;</code>
+       * @return The lastMerchantUpdateTime.
+       */
+      public com.google.protobuf.Timestamp getLastMerchantUpdateTime() {
+        if (lastMerchantUpdateTimeBuilder_ == null) {
+          return lastMerchantUpdateTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : lastMerchantUpdateTime_;
+        } else {
+          return lastMerchantUpdateTimeBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * Timestamp when this Menu or any of its contents was last updated by the
+       * restaurant; i.e. a date to be associated with the phrase “accurate as of
+       * date”.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.protobuf.Timestamp last_merchant_update_time = 8;</code>
+       */
+      public Builder setLastMerchantUpdateTime(com.google.protobuf.Timestamp value) {
+        if (lastMerchantUpdateTimeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          lastMerchantUpdateTime_ = value;
+        } else {
+          lastMerchantUpdateTimeBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000080;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Timestamp when this Menu or any of its contents was last updated by the
+       * restaurant; i.e. a date to be associated with the phrase “accurate as of
+       * date”.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.protobuf.Timestamp last_merchant_update_time = 8;</code>
+       */
+      public Builder setLastMerchantUpdateTime(
+          com.google.protobuf.Timestamp.Builder builderForValue) {
+        if (lastMerchantUpdateTimeBuilder_ == null) {
+          lastMerchantUpdateTime_ = builderForValue.build();
+        } else {
+          lastMerchantUpdateTimeBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000080;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Timestamp when this Menu or any of its contents was last updated by the
+       * restaurant; i.e. a date to be associated with the phrase “accurate as of
+       * date”.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.protobuf.Timestamp last_merchant_update_time = 8;</code>
+       */
+      public Builder mergeLastMerchantUpdateTime(com.google.protobuf.Timestamp value) {
+        if (lastMerchantUpdateTimeBuilder_ == null) {
+          if (((bitField0_ & 0x00000080) != 0) &&
+            lastMerchantUpdateTime_ != null &&
+            lastMerchantUpdateTime_ != com.google.protobuf.Timestamp.getDefaultInstance()) {
+            getLastMerchantUpdateTimeBuilder().mergeFrom(value);
+          } else {
+            lastMerchantUpdateTime_ = value;
+          }
+        } else {
+          lastMerchantUpdateTimeBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000080;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Timestamp when this Menu or any of its contents was last updated by the
+       * restaurant; i.e. a date to be associated with the phrase “accurate as of
+       * date”.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.protobuf.Timestamp last_merchant_update_time = 8;</code>
+       */
+      public Builder clearLastMerchantUpdateTime() {
+        bitField0_ = (bitField0_ & ~0x00000080);
+        lastMerchantUpdateTime_ = null;
+        if (lastMerchantUpdateTimeBuilder_ != null) {
+          lastMerchantUpdateTimeBuilder_.dispose();
+          lastMerchantUpdateTimeBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Timestamp when this Menu or any of its contents was last updated by the
+       * restaurant; i.e. a date to be associated with the phrase “accurate as of
+       * date”.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.protobuf.Timestamp last_merchant_update_time = 8;</code>
+       */
+      public com.google.protobuf.Timestamp.Builder getLastMerchantUpdateTimeBuilder() {
+        bitField0_ |= 0x00000080;
+        onChanged();
+        return getLastMerchantUpdateTimeFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Timestamp when this Menu or any of its contents was last updated by the
+       * restaurant; i.e. a date to be associated with the phrase “accurate as of
+       * date”.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.protobuf.Timestamp last_merchant_update_time = 8;</code>
+       */
+      public com.google.protobuf.TimestampOrBuilder getLastMerchantUpdateTimeOrBuilder() {
+        if (lastMerchantUpdateTimeBuilder_ != null) {
+          return lastMerchantUpdateTimeBuilder_.getMessageOrBuilder();
+        } else {
+          return lastMerchantUpdateTime_ == null ?
+              com.google.protobuf.Timestamp.getDefaultInstance() : lastMerchantUpdateTime_;
+        }
+      }
+      /**
+       * <pre>
+       * Timestamp when this Menu or any of its contents was last updated by the
+       * restaurant; i.e. a date to be associated with the phrase “accurate as of
+       * date”.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.protobuf.Timestamp last_merchant_update_time = 8;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> 
+          getLastMerchantUpdateTimeFieldBuilder() {
+        if (lastMerchantUpdateTimeBuilder_ == null) {
+          lastMerchantUpdateTimeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder>(
+                  getLastMerchantUpdateTime(),
+                  getParentForChildren(),
+                  isClean());
+          lastMerchantUpdateTime_ = null;
+        }
+        return lastMerchantUpdateTimeBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.Menu)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.Menu)
+    private static final food.menu.v1.FoodMenu.Menu DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.Menu();
+    }
+
+    public static food.menu.v1.FoodMenu.Menu getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Menu>
+        PARSER = new com.google.protobuf.AbstractParser<Menu>() {
+      @java.lang.Override
+      public Menu parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<Menu> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Menu> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.Menu getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface MenuSectionOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.MenuSection)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * An opaque string from an partner which uniquely identifies the MenuSection
+     * within the partner feed.
+     * Required.
+     * </pre>
+     *
+     * <code>string menu_section_id = 1;</code>
+     * @return The menuSectionId.
+     */
+    java.lang.String getMenuSectionId();
+    /**
+     * <pre>
+     * An opaque string from an partner which uniquely identifies the MenuSection
+     * within the partner feed.
+     * Required.
+     * </pre>
+     *
+     * <code>string menu_section_id = 1;</code>
+     * @return The bytes for menuSectionId.
+     */
+    com.google.protobuf.ByteString
+        getMenuSectionIdBytes();
+
+    /**
+     * <pre>
+     * The name that can identify the MenuSection when a user is browsing the
+     * menu.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 2;</code>
+     * @return Whether the displayName field is set.
+     */
+    boolean hasDisplayName();
+    /**
+     * <pre>
+     * The name that can identify the MenuSection when a user is browsing the
+     * menu.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 2;</code>
+     * @return The displayName.
+     */
+    food.menu.v1.FoodMenu.TextField getDisplayName();
+    /**
+     * <pre>
+     * The name that can identify the MenuSection when a user is browsing the
+     * menu.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 2;</code>
+     */
+    food.menu.v1.FoodMenu.TextFieldOrBuilder getDisplayNameOrBuilder();
+
+    /**
+     * <pre>
+     * A description of the menu section.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 3;</code>
+     * @return Whether the description field is set.
+     */
+    boolean hasDescription();
+    /**
+     * <pre>
+     * A description of the menu section.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 3;</code>
+     * @return The description.
+     */
+    food.menu.v1.FoodMenu.TextField getDescription();
+    /**
+     * <pre>
+     * A description of the menu section.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 3;</code>
+     */
+    food.menu.v1.FoodMenu.TextFieldOrBuilder getDescriptionOrBuilder();
+
+    /**
+     * <pre>
+     * Image(s) of the menu section.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    java.util.List<food.menu.v1.FoodMenu.Image> 
+        getImagesList();
+    /**
+     * <pre>
+     * Image(s) of the menu section.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    food.menu.v1.FoodMenu.Image getImages(int index);
+    /**
+     * <pre>
+     * Image(s) of the menu section.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    int getImagesCount();
+    /**
+     * <pre>
+     * Image(s) of the menu section.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    java.util.List<? extends food.menu.v1.FoodMenu.ImageOrBuilder> 
+        getImagesOrBuilderList();
+    /**
+     * <pre>
+     * Image(s) of the menu section.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    food.menu.v1.FoodMenu.ImageOrBuilder getImagesOrBuilder(
+        int index);
+
+    /**
+     * <pre>
+     * IDs of MenuItem entities that correspond to this MenuSection entity. A
+     * section is expected to have at least 1 item if it does not contain any
+     * sub-sections.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_item_ids = 6;</code>
+     * @return A list containing the menuItemIds.
+     */
+    java.util.List<java.lang.String>
+        getMenuItemIdsList();
+    /**
+     * <pre>
+     * IDs of MenuItem entities that correspond to this MenuSection entity. A
+     * section is expected to have at least 1 item if it does not contain any
+     * sub-sections.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_item_ids = 6;</code>
+     * @return The count of menuItemIds.
+     */
+    int getMenuItemIdsCount();
+    /**
+     * <pre>
+     * IDs of MenuItem entities that correspond to this MenuSection entity. A
+     * section is expected to have at least 1 item if it does not contain any
+     * sub-sections.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_item_ids = 6;</code>
+     * @param index The index of the element to return.
+     * @return The menuItemIds at the given index.
+     */
+    java.lang.String getMenuItemIds(int index);
+    /**
+     * <pre>
+     * IDs of MenuItem entities that correspond to this MenuSection entity. A
+     * section is expected to have at least 1 item if it does not contain any
+     * sub-sections.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_item_ids = 6;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the menuItemIds at the given index.
+     */
+    com.google.protobuf.ByteString
+        getMenuItemIdsBytes(int index);
+
+    /**
+     * <pre>
+     * Child MenuSections (sub-sections) that correspond to this MenuSection
+     * entity.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_section_ids = 7;</code>
+     * @return A list containing the menuSectionIds.
+     */
+    java.util.List<java.lang.String>
+        getMenuSectionIdsList();
+    /**
+     * <pre>
+     * Child MenuSections (sub-sections) that correspond to this MenuSection
+     * entity.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_section_ids = 7;</code>
+     * @return The count of menuSectionIds.
+     */
+    int getMenuSectionIdsCount();
+    /**
+     * <pre>
+     * Child MenuSections (sub-sections) that correspond to this MenuSection
+     * entity.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_section_ids = 7;</code>
+     * @param index The index of the element to return.
+     * @return The menuSectionIds at the given index.
+     */
+    java.lang.String getMenuSectionIds(int index);
+    /**
+     * <pre>
+     * Child MenuSections (sub-sections) that correspond to this MenuSection
+     * entity.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_section_ids = 7;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the menuSectionIds at the given index.
+     */
+    com.google.protobuf.ByteString
+        getMenuSectionIdsBytes(int index);
+  }
+  /**
+   * <pre>
+   * A menu section is a grouping of items on a menu. Separate MenuSections are
+   * usually created for each logical grouping of items on a menu. For example,
+   * meal course type (Appetizer, Main, Dessert) and food categories (Burgers,
+   * Drinks) are typical sections.
+   * </pre>
+   *
+   * Protobuf type {@code food.menu.v1.MenuSection}
+   */
+  public static final class MenuSection extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.MenuSection)
+      MenuSectionOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use MenuSection.newBuilder() to construct.
+    private MenuSection(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private MenuSection() {
+      menuSectionId_ = "";
+      images_ = java.util.Collections.emptyList();
+      menuItemIds_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+      menuSectionIds_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new MenuSection();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuSection_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuSection_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.MenuSection.class, food.menu.v1.FoodMenu.MenuSection.Builder.class);
+    }
+
+    public static final int MENU_SECTION_ID_FIELD_NUMBER = 1;
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object menuSectionId_ = "";
+    /**
+     * <pre>
+     * An opaque string from an partner which uniquely identifies the MenuSection
+     * within the partner feed.
+     * Required.
+     * </pre>
+     *
+     * <code>string menu_section_id = 1;</code>
+     * @return The menuSectionId.
+     */
+    @java.lang.Override
+    public java.lang.String getMenuSectionId() {
+      java.lang.Object ref = menuSectionId_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        menuSectionId_ = s;
+        return s;
+      }
+    }
+    /**
+     * <pre>
+     * An opaque string from an partner which uniquely identifies the MenuSection
+     * within the partner feed.
+     * Required.
+     * </pre>
+     *
+     * <code>string menu_section_id = 1;</code>
+     * @return The bytes for menuSectionId.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getMenuSectionIdBytes() {
+      java.lang.Object ref = menuSectionId_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        menuSectionId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int DISPLAY_NAME_FIELD_NUMBER = 2;
+    private food.menu.v1.FoodMenu.TextField displayName_;
+    /**
+     * <pre>
+     * The name that can identify the MenuSection when a user is browsing the
+     * menu.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 2;</code>
+     * @return Whether the displayName field is set.
+     */
+    @java.lang.Override
+    public boolean hasDisplayName() {
+      return displayName_ != null;
+    }
+    /**
+     * <pre>
+     * The name that can identify the MenuSection when a user is browsing the
+     * menu.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 2;</code>
+     * @return The displayName.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextField getDisplayName() {
+      return displayName_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : displayName_;
+    }
+    /**
+     * <pre>
+     * The name that can identify the MenuSection when a user is browsing the
+     * menu.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 2;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextFieldOrBuilder getDisplayNameOrBuilder() {
+      return displayName_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : displayName_;
+    }
+
+    public static final int DESCRIPTION_FIELD_NUMBER = 3;
+    private food.menu.v1.FoodMenu.TextField description_;
+    /**
+     * <pre>
+     * A description of the menu section.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 3;</code>
+     * @return Whether the description field is set.
+     */
+    @java.lang.Override
+    public boolean hasDescription() {
+      return description_ != null;
+    }
+    /**
+     * <pre>
+     * A description of the menu section.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 3;</code>
+     * @return The description.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextField getDescription() {
+      return description_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : description_;
+    }
+    /**
+     * <pre>
+     * A description of the menu section.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 3;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextFieldOrBuilder getDescriptionOrBuilder() {
+      return description_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : description_;
+    }
+
+    public static final int IMAGES_FIELD_NUMBER = 4;
+    @SuppressWarnings("serial")
+    private java.util.List<food.menu.v1.FoodMenu.Image> images_;
+    /**
+     * <pre>
+     * Image(s) of the menu section.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    @java.lang.Override
+    public java.util.List<food.menu.v1.FoodMenu.Image> getImagesList() {
+      return images_;
+    }
+    /**
+     * <pre>
+     * Image(s) of the menu section.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends food.menu.v1.FoodMenu.ImageOrBuilder> 
+        getImagesOrBuilderList() {
+      return images_;
+    }
+    /**
+     * <pre>
+     * Image(s) of the menu section.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    @java.lang.Override
+    public int getImagesCount() {
+      return images_.size();
+    }
+    /**
+     * <pre>
+     * Image(s) of the menu section.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.Image getImages(int index) {
+      return images_.get(index);
+    }
+    /**
+     * <pre>
+     * Image(s) of the menu section.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.ImageOrBuilder getImagesOrBuilder(
+        int index) {
+      return images_.get(index);
+    }
+
+    public static final int MENU_ITEM_IDS_FIELD_NUMBER = 6;
+    @SuppressWarnings("serial")
+    private com.google.protobuf.LazyStringArrayList menuItemIds_ =
+        com.google.protobuf.LazyStringArrayList.emptyList();
+    /**
+     * <pre>
+     * IDs of MenuItem entities that correspond to this MenuSection entity. A
+     * section is expected to have at least 1 item if it does not contain any
+     * sub-sections.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_item_ids = 6;</code>
+     * @return A list containing the menuItemIds.
+     */
+    public com.google.protobuf.ProtocolStringList
+        getMenuItemIdsList() {
+      return menuItemIds_;
+    }
+    /**
+     * <pre>
+     * IDs of MenuItem entities that correspond to this MenuSection entity. A
+     * section is expected to have at least 1 item if it does not contain any
+     * sub-sections.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_item_ids = 6;</code>
+     * @return The count of menuItemIds.
+     */
+    public int getMenuItemIdsCount() {
+      return menuItemIds_.size();
+    }
+    /**
+     * <pre>
+     * IDs of MenuItem entities that correspond to this MenuSection entity. A
+     * section is expected to have at least 1 item if it does not contain any
+     * sub-sections.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_item_ids = 6;</code>
+     * @param index The index of the element to return.
+     * @return The menuItemIds at the given index.
+     */
+    public java.lang.String getMenuItemIds(int index) {
+      return menuItemIds_.get(index);
+    }
+    /**
+     * <pre>
+     * IDs of MenuItem entities that correspond to this MenuSection entity. A
+     * section is expected to have at least 1 item if it does not contain any
+     * sub-sections.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_item_ids = 6;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the menuItemIds at the given index.
+     */
+    public com.google.protobuf.ByteString
+        getMenuItemIdsBytes(int index) {
+      return menuItemIds_.getByteString(index);
+    }
+
+    public static final int MENU_SECTION_IDS_FIELD_NUMBER = 7;
+    @SuppressWarnings("serial")
+    private com.google.protobuf.LazyStringArrayList menuSectionIds_ =
+        com.google.protobuf.LazyStringArrayList.emptyList();
+    /**
+     * <pre>
+     * Child MenuSections (sub-sections) that correspond to this MenuSection
+     * entity.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_section_ids = 7;</code>
+     * @return A list containing the menuSectionIds.
+     */
+    public com.google.protobuf.ProtocolStringList
+        getMenuSectionIdsList() {
+      return menuSectionIds_;
+    }
+    /**
+     * <pre>
+     * Child MenuSections (sub-sections) that correspond to this MenuSection
+     * entity.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_section_ids = 7;</code>
+     * @return The count of menuSectionIds.
+     */
+    public int getMenuSectionIdsCount() {
+      return menuSectionIds_.size();
+    }
+    /**
+     * <pre>
+     * Child MenuSections (sub-sections) that correspond to this MenuSection
+     * entity.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_section_ids = 7;</code>
+     * @param index The index of the element to return.
+     * @return The menuSectionIds at the given index.
+     */
+    public java.lang.String getMenuSectionIds(int index) {
+      return menuSectionIds_.get(index);
+    }
+    /**
+     * <pre>
+     * Child MenuSections (sub-sections) that correspond to this MenuSection
+     * entity.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated string menu_section_ids = 7;</code>
+     * @param index The index of the value to return.
+     * @return The bytes of the menuSectionIds at the given index.
+     */
+    public com.google.protobuf.ByteString
+        getMenuSectionIdsBytes(int index) {
+      return menuSectionIds_.getByteString(index);
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(menuSectionId_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, menuSectionId_);
+      }
+      if (displayName_ != null) {
+        output.writeMessage(2, getDisplayName());
+      }
+      if (description_ != null) {
+        output.writeMessage(3, getDescription());
+      }
+      for (int i = 0; i < images_.size(); i++) {
+        output.writeMessage(4, images_.get(i));
+      }
+      for (int i = 0; i < menuItemIds_.size(); i++) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 6, menuItemIds_.getRaw(i));
+      }
+      for (int i = 0; i < menuSectionIds_.size(); i++) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 7, menuSectionIds_.getRaw(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(menuSectionId_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, menuSectionId_);
+      }
+      if (displayName_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getDisplayName());
+      }
+      if (description_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, getDescription());
+      }
+      for (int i = 0; i < images_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, images_.get(i));
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < menuItemIds_.size(); i++) {
+          dataSize += computeStringSizeNoTag(menuItemIds_.getRaw(i));
+        }
+        size += dataSize;
+        size += 1 * getMenuItemIdsList().size();
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < menuSectionIds_.size(); i++) {
+          dataSize += computeStringSizeNoTag(menuSectionIds_.getRaw(i));
+        }
+        size += dataSize;
+        size += 1 * getMenuSectionIdsList().size();
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.MenuSection)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.MenuSection other = (food.menu.v1.FoodMenu.MenuSection) obj;
+
+      if (!getMenuSectionId()
+          .equals(other.getMenuSectionId())) return false;
+      if (hasDisplayName() != other.hasDisplayName()) return false;
+      if (hasDisplayName()) {
+        if (!getDisplayName()
+            .equals(other.getDisplayName())) return false;
+      }
+      if (hasDescription() != other.hasDescription()) return false;
+      if (hasDescription()) {
+        if (!getDescription()
+            .equals(other.getDescription())) return false;
+      }
+      if (!getImagesList()
+          .equals(other.getImagesList())) return false;
+      if (!getMenuItemIdsList()
+          .equals(other.getMenuItemIdsList())) return false;
+      if (!getMenuSectionIdsList()
+          .equals(other.getMenuSectionIdsList())) return false;
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + MENU_SECTION_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getMenuSectionId().hashCode();
+      if (hasDisplayName()) {
+        hash = (37 * hash) + DISPLAY_NAME_FIELD_NUMBER;
+        hash = (53 * hash) + getDisplayName().hashCode();
+      }
+      if (hasDescription()) {
+        hash = (37 * hash) + DESCRIPTION_FIELD_NUMBER;
+        hash = (53 * hash) + getDescription().hashCode();
+      }
+      if (getImagesCount() > 0) {
+        hash = (37 * hash) + IMAGES_FIELD_NUMBER;
+        hash = (53 * hash) + getImagesList().hashCode();
+      }
+      if (getMenuItemIdsCount() > 0) {
+        hash = (37 * hash) + MENU_ITEM_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getMenuItemIdsList().hashCode();
+      }
+      if (getMenuSectionIdsCount() > 0) {
+        hash = (37 * hash) + MENU_SECTION_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getMenuSectionIdsList().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.MenuSection parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuSection parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuSection parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuSection parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuSection parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuSection parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuSection parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuSection parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuSection parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuSection parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuSection parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuSection parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.MenuSection prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * A menu section is a grouping of items on a menu. Separate MenuSections are
+     * usually created for each logical grouping of items on a menu. For example,
+     * meal course type (Appetizer, Main, Dessert) and food categories (Burgers,
+     * Drinks) are typical sections.
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.MenuSection}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.MenuSection)
+        food.menu.v1.FoodMenu.MenuSectionOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuSection_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuSection_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.MenuSection.class, food.menu.v1.FoodMenu.MenuSection.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.MenuSection.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        menuSectionId_ = "";
+        displayName_ = null;
+        if (displayNameBuilder_ != null) {
+          displayNameBuilder_.dispose();
+          displayNameBuilder_ = null;
+        }
+        description_ = null;
+        if (descriptionBuilder_ != null) {
+          descriptionBuilder_.dispose();
+          descriptionBuilder_ = null;
+        }
+        if (imagesBuilder_ == null) {
+          images_ = java.util.Collections.emptyList();
+        } else {
+          images_ = null;
+          imagesBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000008);
+        menuItemIds_ =
+            com.google.protobuf.LazyStringArrayList.emptyList();
+        menuSectionIds_ =
+            com.google.protobuf.LazyStringArrayList.emptyList();
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuSection_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuSection getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.MenuSection.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuSection build() {
+        food.menu.v1.FoodMenu.MenuSection result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuSection buildPartial() {
+        food.menu.v1.FoodMenu.MenuSection result = new food.menu.v1.FoodMenu.MenuSection(this);
+        buildPartialRepeatedFields(result);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartialRepeatedFields(food.menu.v1.FoodMenu.MenuSection result) {
+        if (imagesBuilder_ == null) {
+          if (((bitField0_ & 0x00000008) != 0)) {
+            images_ = java.util.Collections.unmodifiableList(images_);
+            bitField0_ = (bitField0_ & ~0x00000008);
+          }
+          result.images_ = images_;
+        } else {
+          result.images_ = imagesBuilder_.build();
+        }
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.MenuSection result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.menuSectionId_ = menuSectionId_;
+        }
+        if (((from_bitField0_ & 0x00000002) != 0)) {
+          result.displayName_ = displayNameBuilder_ == null
+              ? displayName_
+              : displayNameBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000004) != 0)) {
+          result.description_ = descriptionBuilder_ == null
+              ? description_
+              : descriptionBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000010) != 0)) {
+          menuItemIds_.makeImmutable();
+          result.menuItemIds_ = menuItemIds_;
+        }
+        if (((from_bitField0_ & 0x00000020) != 0)) {
+          menuSectionIds_.makeImmutable();
+          result.menuSectionIds_ = menuSectionIds_;
+        }
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.MenuSection) {
+          return mergeFrom((food.menu.v1.FoodMenu.MenuSection)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.MenuSection other) {
+        if (other == food.menu.v1.FoodMenu.MenuSection.getDefaultInstance()) return this;
+        if (!other.getMenuSectionId().isEmpty()) {
+          menuSectionId_ = other.menuSectionId_;
+          bitField0_ |= 0x00000001;
+          onChanged();
+        }
+        if (other.hasDisplayName()) {
+          mergeDisplayName(other.getDisplayName());
+        }
+        if (other.hasDescription()) {
+          mergeDescription(other.getDescription());
+        }
+        if (imagesBuilder_ == null) {
+          if (!other.images_.isEmpty()) {
+            if (images_.isEmpty()) {
+              images_ = other.images_;
+              bitField0_ = (bitField0_ & ~0x00000008);
+            } else {
+              ensureImagesIsMutable();
+              images_.addAll(other.images_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.images_.isEmpty()) {
+            if (imagesBuilder_.isEmpty()) {
+              imagesBuilder_.dispose();
+              imagesBuilder_ = null;
+              images_ = other.images_;
+              bitField0_ = (bitField0_ & ~0x00000008);
+              imagesBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getImagesFieldBuilder() : null;
+            } else {
+              imagesBuilder_.addAllMessages(other.images_);
+            }
+          }
+        }
+        if (!other.menuItemIds_.isEmpty()) {
+          if (menuItemIds_.isEmpty()) {
+            menuItemIds_ = other.menuItemIds_;
+            bitField0_ |= 0x00000010;
+          } else {
+            ensureMenuItemIdsIsMutable();
+            menuItemIds_.addAll(other.menuItemIds_);
+          }
+          onChanged();
+        }
+        if (!other.menuSectionIds_.isEmpty()) {
+          if (menuSectionIds_.isEmpty()) {
+            menuSectionIds_ = other.menuSectionIds_;
+            bitField0_ |= 0x00000020;
+          } else {
+            ensureMenuSectionIdsIsMutable();
+            menuSectionIds_.addAll(other.menuSectionIds_);
+          }
+          onChanged();
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                menuSectionId_ = input.readStringRequireUtf8();
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 10
+              case 18: {
+                input.readMessage(
+                    getDisplayNameFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000002;
+                break;
+              } // case 18
+              case 26: {
+                input.readMessage(
+                    getDescriptionFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000004;
+                break;
+              } // case 26
+              case 34: {
+                food.menu.v1.FoodMenu.Image m =
+                    input.readMessage(
+                        food.menu.v1.FoodMenu.Image.parser(),
+                        extensionRegistry);
+                if (imagesBuilder_ == null) {
+                  ensureImagesIsMutable();
+                  images_.add(m);
+                } else {
+                  imagesBuilder_.addMessage(m);
+                }
+                break;
+              } // case 34
+              case 50: {
+                java.lang.String s = input.readStringRequireUtf8();
+                ensureMenuItemIdsIsMutable();
+                menuItemIds_.add(s);
+                break;
+              } // case 50
+              case 58: {
+                java.lang.String s = input.readStringRequireUtf8();
+                ensureMenuSectionIdsIsMutable();
+                menuSectionIds_.add(s);
+                break;
+              } // case 58
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int bitField0_;
+
+      private java.lang.Object menuSectionId_ = "";
+      /**
+       * <pre>
+       * An opaque string from an partner which uniquely identifies the MenuSection
+       * within the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_section_id = 1;</code>
+       * @return The menuSectionId.
+       */
+      public java.lang.String getMenuSectionId() {
+        java.lang.Object ref = menuSectionId_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          menuSectionId_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <pre>
+       * An opaque string from an partner which uniquely identifies the MenuSection
+       * within the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_section_id = 1;</code>
+       * @return The bytes for menuSectionId.
+       */
+      public com.google.protobuf.ByteString
+          getMenuSectionIdBytes() {
+        java.lang.Object ref = menuSectionId_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          menuSectionId_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <pre>
+       * An opaque string from an partner which uniquely identifies the MenuSection
+       * within the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_section_id = 1;</code>
+       * @param value The menuSectionId to set.
+       * @return This builder for chaining.
+       */
+      public Builder setMenuSectionId(
+          java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        menuSectionId_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * An opaque string from an partner which uniquely identifies the MenuSection
+       * within the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_section_id = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearMenuSectionId() {
+        menuSectionId_ = getDefaultInstance().getMenuSectionId();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * An opaque string from an partner which uniquely identifies the MenuSection
+       * within the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_section_id = 1;</code>
+       * @param value The bytes for menuSectionId to set.
+       * @return This builder for chaining.
+       */
+      public Builder setMenuSectionIdBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) { throw new NullPointerException(); }
+        checkByteStringIsUtf8(value);
+        menuSectionId_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+
+      private food.menu.v1.FoodMenu.TextField displayName_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> displayNameBuilder_;
+      /**
+       * <pre>
+       * The name that can identify the MenuSection when a user is browsing the
+       * menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       * @return Whether the displayName field is set.
+       */
+      public boolean hasDisplayName() {
+        return ((bitField0_ & 0x00000002) != 0);
+      }
+      /**
+       * <pre>
+       * The name that can identify the MenuSection when a user is browsing the
+       * menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       * @return The displayName.
+       */
+      public food.menu.v1.FoodMenu.TextField getDisplayName() {
+        if (displayNameBuilder_ == null) {
+          return displayName_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : displayName_;
+        } else {
+          return displayNameBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * The name that can identify the MenuSection when a user is browsing the
+       * menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       */
+      public Builder setDisplayName(food.menu.v1.FoodMenu.TextField value) {
+        if (displayNameBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          displayName_ = value;
+        } else {
+          displayNameBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The name that can identify the MenuSection when a user is browsing the
+       * menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       */
+      public Builder setDisplayName(
+          food.menu.v1.FoodMenu.TextField.Builder builderForValue) {
+        if (displayNameBuilder_ == null) {
+          displayName_ = builderForValue.build();
+        } else {
+          displayNameBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The name that can identify the MenuSection when a user is browsing the
+       * menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       */
+      public Builder mergeDisplayName(food.menu.v1.FoodMenu.TextField value) {
+        if (displayNameBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) != 0) &&
+            displayName_ != null &&
+            displayName_ != food.menu.v1.FoodMenu.TextField.getDefaultInstance()) {
+            getDisplayNameBuilder().mergeFrom(value);
+          } else {
+            displayName_ = value;
+          }
+        } else {
+          displayNameBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The name that can identify the MenuSection when a user is browsing the
+       * menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       */
+      public Builder clearDisplayName() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        displayName_ = null;
+        if (displayNameBuilder_ != null) {
+          displayNameBuilder_.dispose();
+          displayNameBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The name that can identify the MenuSection when a user is browsing the
+       * menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       */
+      public food.menu.v1.FoodMenu.TextField.Builder getDisplayNameBuilder() {
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return getDisplayNameFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * The name that can identify the MenuSection when a user is browsing the
+       * menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       */
+      public food.menu.v1.FoodMenu.TextFieldOrBuilder getDisplayNameOrBuilder() {
+        if (displayNameBuilder_ != null) {
+          return displayNameBuilder_.getMessageOrBuilder();
+        } else {
+          return displayName_ == null ?
+              food.menu.v1.FoodMenu.TextField.getDefaultInstance() : displayName_;
+        }
+      }
+      /**
+       * <pre>
+       * The name that can identify the MenuSection when a user is browsing the
+       * menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> 
+          getDisplayNameFieldBuilder() {
+        if (displayNameBuilder_ == null) {
+          displayNameBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder>(
+                  getDisplayName(),
+                  getParentForChildren(),
+                  isClean());
+          displayName_ = null;
+        }
+        return displayNameBuilder_;
+      }
+
+      private food.menu.v1.FoodMenu.TextField description_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> descriptionBuilder_;
+      /**
+       * <pre>
+       * A description of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       * @return Whether the description field is set.
+       */
+      public boolean hasDescription() {
+        return ((bitField0_ & 0x00000004) != 0);
+      }
+      /**
+       * <pre>
+       * A description of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       * @return The description.
+       */
+      public food.menu.v1.FoodMenu.TextField getDescription() {
+        if (descriptionBuilder_ == null) {
+          return description_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : description_;
+        } else {
+          return descriptionBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * A description of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       */
+      public Builder setDescription(food.menu.v1.FoodMenu.TextField value) {
+        if (descriptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          description_ = value;
+        } else {
+          descriptionBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * A description of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       */
+      public Builder setDescription(
+          food.menu.v1.FoodMenu.TextField.Builder builderForValue) {
+        if (descriptionBuilder_ == null) {
+          description_ = builderForValue.build();
+        } else {
+          descriptionBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * A description of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       */
+      public Builder mergeDescription(food.menu.v1.FoodMenu.TextField value) {
+        if (descriptionBuilder_ == null) {
+          if (((bitField0_ & 0x00000004) != 0) &&
+            description_ != null &&
+            description_ != food.menu.v1.FoodMenu.TextField.getDefaultInstance()) {
+            getDescriptionBuilder().mergeFrom(value);
+          } else {
+            description_ = value;
+          }
+        } else {
+          descriptionBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * A description of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       */
+      public Builder clearDescription() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        description_ = null;
+        if (descriptionBuilder_ != null) {
+          descriptionBuilder_.dispose();
+          descriptionBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * A description of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       */
+      public food.menu.v1.FoodMenu.TextField.Builder getDescriptionBuilder() {
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return getDescriptionFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * A description of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       */
+      public food.menu.v1.FoodMenu.TextFieldOrBuilder getDescriptionOrBuilder() {
+        if (descriptionBuilder_ != null) {
+          return descriptionBuilder_.getMessageOrBuilder();
+        } else {
+          return description_ == null ?
+              food.menu.v1.FoodMenu.TextField.getDefaultInstance() : description_;
+        }
+      }
+      /**
+       * <pre>
+       * A description of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> 
+          getDescriptionFieldBuilder() {
+        if (descriptionBuilder_ == null) {
+          descriptionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder>(
+                  getDescription(),
+                  getParentForChildren(),
+                  isClean());
+          description_ = null;
+        }
+        return descriptionBuilder_;
+      }
+
+      private java.util.List<food.menu.v1.FoodMenu.Image> images_ =
+        java.util.Collections.emptyList();
+      private void ensureImagesIsMutable() {
+        if (!((bitField0_ & 0x00000008) != 0)) {
+          images_ = new java.util.ArrayList<food.menu.v1.FoodMenu.Image>(images_);
+          bitField0_ |= 0x00000008;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          food.menu.v1.FoodMenu.Image, food.menu.v1.FoodMenu.Image.Builder, food.menu.v1.FoodMenu.ImageOrBuilder> imagesBuilder_;
+
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public java.util.List<food.menu.v1.FoodMenu.Image> getImagesList() {
+        if (imagesBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(images_);
+        } else {
+          return imagesBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public int getImagesCount() {
+        if (imagesBuilder_ == null) {
+          return images_.size();
+        } else {
+          return imagesBuilder_.getCount();
+        }
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.Image getImages(int index) {
+        if (imagesBuilder_ == null) {
+          return images_.get(index);
+        } else {
+          return imagesBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder setImages(
+          int index, food.menu.v1.FoodMenu.Image value) {
+        if (imagesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureImagesIsMutable();
+          images_.set(index, value);
+          onChanged();
+        } else {
+          imagesBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder setImages(
+          int index, food.menu.v1.FoodMenu.Image.Builder builderForValue) {
+        if (imagesBuilder_ == null) {
+          ensureImagesIsMutable();
+          images_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          imagesBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder addImages(food.menu.v1.FoodMenu.Image value) {
+        if (imagesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureImagesIsMutable();
+          images_.add(value);
+          onChanged();
+        } else {
+          imagesBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder addImages(
+          int index, food.menu.v1.FoodMenu.Image value) {
+        if (imagesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureImagesIsMutable();
+          images_.add(index, value);
+          onChanged();
+        } else {
+          imagesBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder addImages(
+          food.menu.v1.FoodMenu.Image.Builder builderForValue) {
+        if (imagesBuilder_ == null) {
+          ensureImagesIsMutable();
+          images_.add(builderForValue.build());
+          onChanged();
+        } else {
+          imagesBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder addImages(
+          int index, food.menu.v1.FoodMenu.Image.Builder builderForValue) {
+        if (imagesBuilder_ == null) {
+          ensureImagesIsMutable();
+          images_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          imagesBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder addAllImages(
+          java.lang.Iterable<? extends food.menu.v1.FoodMenu.Image> values) {
+        if (imagesBuilder_ == null) {
+          ensureImagesIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, images_);
+          onChanged();
+        } else {
+          imagesBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder clearImages() {
+        if (imagesBuilder_ == null) {
+          images_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000008);
+          onChanged();
+        } else {
+          imagesBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder removeImages(int index) {
+        if (imagesBuilder_ == null) {
+          ensureImagesIsMutable();
+          images_.remove(index);
+          onChanged();
+        } else {
+          imagesBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.Image.Builder getImagesBuilder(
+          int index) {
+        return getImagesFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.ImageOrBuilder getImagesOrBuilder(
+          int index) {
+        if (imagesBuilder_ == null) {
+          return images_.get(index);  } else {
+          return imagesBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public java.util.List<? extends food.menu.v1.FoodMenu.ImageOrBuilder> 
+           getImagesOrBuilderList() {
+        if (imagesBuilder_ != null) {
+          return imagesBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(images_);
+        }
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.Image.Builder addImagesBuilder() {
+        return getImagesFieldBuilder().addBuilder(
+            food.menu.v1.FoodMenu.Image.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.Image.Builder addImagesBuilder(
+          int index) {
+        return getImagesFieldBuilder().addBuilder(
+            index, food.menu.v1.FoodMenu.Image.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu section.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public java.util.List<food.menu.v1.FoodMenu.Image.Builder> 
+           getImagesBuilderList() {
+        return getImagesFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          food.menu.v1.FoodMenu.Image, food.menu.v1.FoodMenu.Image.Builder, food.menu.v1.FoodMenu.ImageOrBuilder> 
+          getImagesFieldBuilder() {
+        if (imagesBuilder_ == null) {
+          imagesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              food.menu.v1.FoodMenu.Image, food.menu.v1.FoodMenu.Image.Builder, food.menu.v1.FoodMenu.ImageOrBuilder>(
+                  images_,
+                  ((bitField0_ & 0x00000008) != 0),
+                  getParentForChildren(),
+                  isClean());
+          images_ = null;
+        }
+        return imagesBuilder_;
+      }
+
+      private com.google.protobuf.LazyStringArrayList menuItemIds_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+      private void ensureMenuItemIdsIsMutable() {
+        if (!menuItemIds_.isModifiable()) {
+          menuItemIds_ = new com.google.protobuf.LazyStringArrayList(menuItemIds_);
+        }
+        bitField0_ |= 0x00000010;
+      }
+      /**
+       * <pre>
+       * IDs of MenuItem entities that correspond to this MenuSection entity. A
+       * section is expected to have at least 1 item if it does not contain any
+       * sub-sections.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @return A list containing the menuItemIds.
+       */
+      public com.google.protobuf.ProtocolStringList
+          getMenuItemIdsList() {
+        menuItemIds_.makeImmutable();
+        return menuItemIds_;
+      }
+      /**
+       * <pre>
+       * IDs of MenuItem entities that correspond to this MenuSection entity. A
+       * section is expected to have at least 1 item if it does not contain any
+       * sub-sections.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @return The count of menuItemIds.
+       */
+      public int getMenuItemIdsCount() {
+        return menuItemIds_.size();
+      }
+      /**
+       * <pre>
+       * IDs of MenuItem entities that correspond to this MenuSection entity. A
+       * section is expected to have at least 1 item if it does not contain any
+       * sub-sections.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @param index The index of the element to return.
+       * @return The menuItemIds at the given index.
+       */
+      public java.lang.String getMenuItemIds(int index) {
+        return menuItemIds_.get(index);
+      }
+      /**
+       * <pre>
+       * IDs of MenuItem entities that correspond to this MenuSection entity. A
+       * section is expected to have at least 1 item if it does not contain any
+       * sub-sections.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @param index The index of the value to return.
+       * @return The bytes of the menuItemIds at the given index.
+       */
+      public com.google.protobuf.ByteString
+          getMenuItemIdsBytes(int index) {
+        return menuItemIds_.getByteString(index);
+      }
+      /**
+       * <pre>
+       * IDs of MenuItem entities that correspond to this MenuSection entity. A
+       * section is expected to have at least 1 item if it does not contain any
+       * sub-sections.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @param index The index to set the value at.
+       * @param value The menuItemIds to set.
+       * @return This builder for chaining.
+       */
+      public Builder setMenuItemIds(
+          int index, java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        ensureMenuItemIdsIsMutable();
+        menuItemIds_.set(index, value);
+        bitField0_ |= 0x00000010;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * IDs of MenuItem entities that correspond to this MenuSection entity. A
+       * section is expected to have at least 1 item if it does not contain any
+       * sub-sections.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @param value The menuItemIds to add.
+       * @return This builder for chaining.
+       */
+      public Builder addMenuItemIds(
+          java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        ensureMenuItemIdsIsMutable();
+        menuItemIds_.add(value);
+        bitField0_ |= 0x00000010;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * IDs of MenuItem entities that correspond to this MenuSection entity. A
+       * section is expected to have at least 1 item if it does not contain any
+       * sub-sections.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @param values The menuItemIds to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllMenuItemIds(
+          java.lang.Iterable<java.lang.String> values) {
+        ensureMenuItemIdsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, menuItemIds_);
+        bitField0_ |= 0x00000010;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * IDs of MenuItem entities that correspond to this MenuSection entity. A
+       * section is expected to have at least 1 item if it does not contain any
+       * sub-sections.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearMenuItemIds() {
+        menuItemIds_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000010);;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * IDs of MenuItem entities that correspond to this MenuSection entity. A
+       * section is expected to have at least 1 item if it does not contain any
+       * sub-sections.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_item_ids = 6;</code>
+       * @param value The bytes of the menuItemIds to add.
+       * @return This builder for chaining.
+       */
+      public Builder addMenuItemIdsBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) { throw new NullPointerException(); }
+        checkByteStringIsUtf8(value);
+        ensureMenuItemIdsIsMutable();
+        menuItemIds_.add(value);
+        bitField0_ |= 0x00000010;
+        onChanged();
+        return this;
+      }
+
+      private com.google.protobuf.LazyStringArrayList menuSectionIds_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+      private void ensureMenuSectionIdsIsMutable() {
+        if (!menuSectionIds_.isModifiable()) {
+          menuSectionIds_ = new com.google.protobuf.LazyStringArrayList(menuSectionIds_);
+        }
+        bitField0_ |= 0x00000020;
+      }
+      /**
+       * <pre>
+       * Child MenuSections (sub-sections) that correspond to this MenuSection
+       * entity.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @return A list containing the menuSectionIds.
+       */
+      public com.google.protobuf.ProtocolStringList
+          getMenuSectionIdsList() {
+        menuSectionIds_.makeImmutable();
+        return menuSectionIds_;
+      }
+      /**
+       * <pre>
+       * Child MenuSections (sub-sections) that correspond to this MenuSection
+       * entity.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @return The count of menuSectionIds.
+       */
+      public int getMenuSectionIdsCount() {
+        return menuSectionIds_.size();
+      }
+      /**
+       * <pre>
+       * Child MenuSections (sub-sections) that correspond to this MenuSection
+       * entity.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @param index The index of the element to return.
+       * @return The menuSectionIds at the given index.
+       */
+      public java.lang.String getMenuSectionIds(int index) {
+        return menuSectionIds_.get(index);
+      }
+      /**
+       * <pre>
+       * Child MenuSections (sub-sections) that correspond to this MenuSection
+       * entity.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @param index The index of the value to return.
+       * @return The bytes of the menuSectionIds at the given index.
+       */
+      public com.google.protobuf.ByteString
+          getMenuSectionIdsBytes(int index) {
+        return menuSectionIds_.getByteString(index);
+      }
+      /**
+       * <pre>
+       * Child MenuSections (sub-sections) that correspond to this MenuSection
+       * entity.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @param index The index to set the value at.
+       * @param value The menuSectionIds to set.
+       * @return This builder for chaining.
+       */
+      public Builder setMenuSectionIds(
+          int index, java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        ensureMenuSectionIdsIsMutable();
+        menuSectionIds_.set(index, value);
+        bitField0_ |= 0x00000020;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Child MenuSections (sub-sections) that correspond to this MenuSection
+       * entity.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @param value The menuSectionIds to add.
+       * @return This builder for chaining.
+       */
+      public Builder addMenuSectionIds(
+          java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        ensureMenuSectionIdsIsMutable();
+        menuSectionIds_.add(value);
+        bitField0_ |= 0x00000020;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Child MenuSections (sub-sections) that correspond to this MenuSection
+       * entity.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @param values The menuSectionIds to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllMenuSectionIds(
+          java.lang.Iterable<java.lang.String> values) {
+        ensureMenuSectionIdsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, menuSectionIds_);
+        bitField0_ |= 0x00000020;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Child MenuSections (sub-sections) that correspond to this MenuSection
+       * entity.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearMenuSectionIds() {
+        menuSectionIds_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000020);;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Child MenuSections (sub-sections) that correspond to this MenuSection
+       * entity.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated string menu_section_ids = 7;</code>
+       * @param value The bytes of the menuSectionIds to add.
+       * @return This builder for chaining.
+       */
+      public Builder addMenuSectionIdsBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) { throw new NullPointerException(); }
+        checkByteStringIsUtf8(value);
+        ensureMenuSectionIdsIsMutable();
+        menuSectionIds_.add(value);
+        bitField0_ |= 0x00000020;
+        onChanged();
+        return this;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.MenuSection)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.MenuSection)
+    private static final food.menu.v1.FoodMenu.MenuSection DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.MenuSection();
+    }
+
+    public static food.menu.v1.FoodMenu.MenuSection getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<MenuSection>
+        PARSER = new com.google.protobuf.AbstractParser<MenuSection>() {
+      @java.lang.Override
+      public MenuSection parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<MenuSection> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<MenuSection> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuSection getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface MenuItemOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.MenuItem)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * An opaque string from an partner which uniquely identifies the MenuItem
+     * within the partner feed.
+     * Required.
+     * </pre>
+     *
+     * <code>string menu_item_id = 1;</code>
+     * @return The menuItemId.
+     */
+    java.lang.String getMenuItemId();
+    /**
+     * <pre>
+     * An opaque string from an partner which uniquely identifies the MenuItem
+     * within the partner feed.
+     * Required.
+     * </pre>
+     *
+     * <code>string menu_item_id = 1;</code>
+     * @return The bytes for menuItemId.
+     */
+    com.google.protobuf.ByteString
+        getMenuItemIdBytes();
+
+    /**
+     * <pre>
+     * The name that can identify the MenuItem when a user is browsing the menu.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 2;</code>
+     * @return Whether the displayName field is set.
+     */
+    boolean hasDisplayName();
+    /**
+     * <pre>
+     * The name that can identify the MenuItem when a user is browsing the menu.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 2;</code>
+     * @return The displayName.
+     */
+    food.menu.v1.FoodMenu.TextField getDisplayName();
+    /**
+     * <pre>
+     * The name that can identify the MenuItem when a user is browsing the menu.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 2;</code>
+     */
+    food.menu.v1.FoodMenu.TextFieldOrBuilder getDisplayNameOrBuilder();
+
+    /**
+     * <pre>
+     * A description of the menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 3;</code>
+     * @return Whether the description field is set.
+     */
+    boolean hasDescription();
+    /**
+     * <pre>
+     * A description of the menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 3;</code>
+     * @return The description.
+     */
+    food.menu.v1.FoodMenu.TextField getDescription();
+    /**
+     * <pre>
+     * A description of the menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 3;</code>
+     */
+    food.menu.v1.FoodMenu.TextFieldOrBuilder getDescriptionOrBuilder();
+
+    /**
+     * <pre>
+     * Image(s) of the menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    java.util.List<food.menu.v1.FoodMenu.Image> 
+        getImagesList();
+    /**
+     * <pre>
+     * Image(s) of the menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    food.menu.v1.FoodMenu.Image getImages(int index);
+    /**
+     * <pre>
+     * Image(s) of the menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    int getImagesCount();
+    /**
+     * <pre>
+     * Image(s) of the menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    java.util.List<? extends food.menu.v1.FoodMenu.ImageOrBuilder> 
+        getImagesOrBuilderList();
+    /**
+     * <pre>
+     * Image(s) of the menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    food.menu.v1.FoodMenu.ImageOrBuilder getImagesOrBuilder(
+        int index);
+
+    /**
+     * <pre>
+     * Available offers to purchase this food item.
+     * </pre>
+     *
+     * <code>.food.menu.v1.OfferSet offer_set = 6;</code>
+     * @return Whether the offerSet field is set.
+     */
+    boolean hasOfferSet();
+    /**
+     * <pre>
+     * Available offers to purchase this food item.
+     * </pre>
+     *
+     * <code>.food.menu.v1.OfferSet offer_set = 6;</code>
+     * @return The offerSet.
+     */
+    food.menu.v1.FoodMenu.OfferSet getOfferSet();
+    /**
+     * <pre>
+     * Available offers to purchase this food item.
+     * </pre>
+     *
+     * <code>.food.menu.v1.OfferSet offer_set = 6;</code>
+     */
+    food.menu.v1.FoodMenu.OfferSetOrBuilder getOfferSetOrBuilder();
+
+    /**
+     * <pre>
+     * Available options for this menu item.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItem.MenuItemOptionSet menu_item_option_set = 7;</code>
+     * @return Whether the menuItemOptionSet field is set.
+     */
+    boolean hasMenuItemOptionSet();
+    /**
+     * <pre>
+     * Available options for this menu item.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItem.MenuItemOptionSet menu_item_option_set = 7;</code>
+     * @return The menuItemOptionSet.
+     */
+    food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet getMenuItemOptionSet();
+    /**
+     * <pre>
+     * Available options for this menu item.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItem.MenuItemOptionSet menu_item_option_set = 7;</code>
+     */
+    food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSetOrBuilder getMenuItemOptionSetOrBuilder();
+
+    /**
+     * <pre>
+     * Attributes about this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemAttributes item_attributes = 8;</code>
+     * @return Whether the itemAttributes field is set.
+     */
+    boolean hasItemAttributes();
+    /**
+     * <pre>
+     * Attributes about this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemAttributes item_attributes = 8;</code>
+     * @return The itemAttributes.
+     */
+    food.menu.v1.FoodMenu.MenuItemAttributes getItemAttributes();
+    /**
+     * <pre>
+     * Attributes about this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemAttributes item_attributes = 8;</code>
+     */
+    food.menu.v1.FoodMenu.MenuItemAttributesOrBuilder getItemAttributesOrBuilder();
+
+    food.menu.v1.FoodMenu.MenuItem.PricingCase getPricingCase();
+  }
+  /**
+   * <pre>
+   * Represents a single food or drink item offered by a Food establishment.
+   * </pre>
+   *
+   * Protobuf type {@code food.menu.v1.MenuItem}
+   */
+  public static final class MenuItem extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.MenuItem)
+      MenuItemOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use MenuItem.newBuilder() to construct.
+    private MenuItem(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private MenuItem() {
+      menuItemId_ = "";
+      images_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new MenuItem();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItem_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItem_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.MenuItem.class, food.menu.v1.FoodMenu.MenuItem.Builder.class);
+    }
+
+    public interface MenuItemOptionSetOrBuilder extends
+        // @@protoc_insertion_point(interface_extends:food.menu.v1.MenuItem.MenuItemOptionSet)
+        com.google.protobuf.MessageOrBuilder {
+
+      /**
+       * <pre>
+       * IDs of menu item options that are applicable to this menu item.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string menu_item_option_ids = 1;</code>
+       * @return A list containing the menuItemOptionIds.
+       */
+      java.util.List<java.lang.String>
+          getMenuItemOptionIdsList();
+      /**
+       * <pre>
+       * IDs of menu item options that are applicable to this menu item.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string menu_item_option_ids = 1;</code>
+       * @return The count of menuItemOptionIds.
+       */
+      int getMenuItemOptionIdsCount();
+      /**
+       * <pre>
+       * IDs of menu item options that are applicable to this menu item.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string menu_item_option_ids = 1;</code>
+       * @param index The index of the element to return.
+       * @return The menuItemOptionIds at the given index.
+       */
+      java.lang.String getMenuItemOptionIds(int index);
+      /**
+       * <pre>
+       * IDs of menu item options that are applicable to this menu item.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string menu_item_option_ids = 1;</code>
+       * @param index The index of the value to return.
+       * @return The bytes of the menuItemOptionIds at the given index.
+       */
+      com.google.protobuf.ByteString
+          getMenuItemOptionIdsBytes(int index);
+    }
+    /**
+     * <pre>
+     * Container that specifies a list of options available on an item.
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.MenuItem.MenuItemOptionSet}
+     */
+    public static final class MenuItemOptionSet extends
+        com.google.protobuf.GeneratedMessageV3 implements
+        // @@protoc_insertion_point(message_implements:food.menu.v1.MenuItem.MenuItemOptionSet)
+        MenuItemOptionSetOrBuilder {
+    private static final long serialVersionUID = 0L;
+      // Use MenuItemOptionSet.newBuilder() to construct.
+      private MenuItemOptionSet(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+        super(builder);
+      }
+      private MenuItemOptionSet() {
+        menuItemOptionIds_ =
+            com.google.protobuf.LazyStringArrayList.emptyList();
+      }
+
+      @java.lang.Override
+      @SuppressWarnings({"unused"})
+      protected java.lang.Object newInstance(
+          UnusedPrivateParameter unused) {
+        return new MenuItemOptionSet();
+      }
+
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItem_MenuItemOptionSet_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItem_MenuItemOptionSet_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.class, food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.Builder.class);
+      }
+
+      public static final int MENU_ITEM_OPTION_IDS_FIELD_NUMBER = 1;
+      @SuppressWarnings("serial")
+      private com.google.protobuf.LazyStringArrayList menuItemOptionIds_ =
+          com.google.protobuf.LazyStringArrayList.emptyList();
+      /**
+       * <pre>
+       * IDs of menu item options that are applicable to this menu item.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string menu_item_option_ids = 1;</code>
+       * @return A list containing the menuItemOptionIds.
+       */
+      public com.google.protobuf.ProtocolStringList
+          getMenuItemOptionIdsList() {
+        return menuItemOptionIds_;
+      }
+      /**
+       * <pre>
+       * IDs of menu item options that are applicable to this menu item.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string menu_item_option_ids = 1;</code>
+       * @return The count of menuItemOptionIds.
+       */
+      public int getMenuItemOptionIdsCount() {
+        return menuItemOptionIds_.size();
+      }
+      /**
+       * <pre>
+       * IDs of menu item options that are applicable to this menu item.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string menu_item_option_ids = 1;</code>
+       * @param index The index of the element to return.
+       * @return The menuItemOptionIds at the given index.
+       */
+      public java.lang.String getMenuItemOptionIds(int index) {
+        return menuItemOptionIds_.get(index);
+      }
+      /**
+       * <pre>
+       * IDs of menu item options that are applicable to this menu item.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated string menu_item_option_ids = 1;</code>
+       * @param index The index of the value to return.
+       * @return The bytes of the menuItemOptionIds at the given index.
+       */
+      public com.google.protobuf.ByteString
+          getMenuItemOptionIdsBytes(int index) {
+        return menuItemOptionIds_.getByteString(index);
+      }
+
+      private byte memoizedIsInitialized = -1;
+      @java.lang.Override
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized == 1) return true;
+        if (isInitialized == 0) return false;
+
+        memoizedIsInitialized = 1;
+        return true;
+      }
+
+      @java.lang.Override
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        for (int i = 0; i < menuItemOptionIds_.size(); i++) {
+          com.google.protobuf.GeneratedMessageV3.writeString(output, 1, menuItemOptionIds_.getRaw(i));
+        }
+        getUnknownFields().writeTo(output);
+      }
+
+      @java.lang.Override
+      public int getSerializedSize() {
+        int size = memoizedSize;
+        if (size != -1) return size;
+
+        size = 0;
+        {
+          int dataSize = 0;
+          for (int i = 0; i < menuItemOptionIds_.size(); i++) {
+            dataSize += computeStringSizeNoTag(menuItemOptionIds_.getRaw(i));
+          }
+          size += dataSize;
+          size += 1 * getMenuItemOptionIdsList().size();
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSize = size;
+        return size;
+      }
+
+      @java.lang.Override
+      public boolean equals(final java.lang.Object obj) {
+        if (obj == this) {
+         return true;
+        }
+        if (!(obj instanceof food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet)) {
+          return super.equals(obj);
+        }
+        food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet other = (food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet) obj;
+
+        if (!getMenuItemOptionIdsList()
+            .equals(other.getMenuItemOptionIdsList())) return false;
+        if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+        return true;
+      }
+
+      @java.lang.Override
+      public int hashCode() {
+        if (memoizedHashCode != 0) {
+          return memoizedHashCode;
+        }
+        int hash = 41;
+        hash = (19 * hash) + getDescriptor().hashCode();
+        if (getMenuItemOptionIdsCount() > 0) {
+          hash = (37 * hash) + MENU_ITEM_OPTION_IDS_FIELD_NUMBER;
+          hash = (53 * hash) + getMenuItemOptionIdsList().hashCode();
+        }
+        hash = (29 * hash) + getUnknownFields().hashCode();
+        memoizedHashCode = hash;
+        return hash;
+      }
+
+      public static food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet parseFrom(
+          java.nio.ByteBuffer data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+      }
+      public static food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet parseFrom(
+          java.nio.ByteBuffer data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+      }
+      public static food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+      }
+      public static food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+      }
+      public static food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+      }
+      public static food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+      }
+      public static food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input);
+      }
+      public static food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input, extensionRegistry);
+      }
+      public static food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseDelimitedWithIOException(PARSER, input);
+      }
+      public static food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+      }
+      public static food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input);
+      }
+      public static food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input, extensionRegistry);
+      }
+
+      @java.lang.Override
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder() {
+        return DEFAULT_INSTANCE.toBuilder();
+      }
+      public static Builder newBuilder(food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet prototype) {
+        return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+      }
+      @java.lang.Override
+      public Builder toBuilder() {
+        return this == DEFAULT_INSTANCE
+            ? new Builder() : new Builder().mergeFrom(this);
+      }
+
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      /**
+       * <pre>
+       * Container that specifies a list of options available on an item.
+       * </pre>
+       *
+       * Protobuf type {@code food.menu.v1.MenuItem.MenuItemOptionSet}
+       */
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+          // @@protoc_insertion_point(builder_implements:food.menu.v1.MenuItem.MenuItemOptionSet)
+          food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSetOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItem_MenuItemOptionSet_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItem_MenuItemOptionSet_fieldAccessorTable
+              .ensureFieldAccessorsInitialized(
+                  food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.class, food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.Builder.class);
+        }
+
+        // Construct using food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.newBuilder()
+        private Builder() {
+
+        }
+
+        private Builder(
+            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+          super(parent);
+
+        }
+        @java.lang.Override
+        public Builder clear() {
+          super.clear();
+          bitField0_ = 0;
+          menuItemOptionIds_ =
+              com.google.protobuf.LazyStringArrayList.emptyList();
+          return this;
+        }
+
+        @java.lang.Override
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItem_MenuItemOptionSet_descriptor;
+        }
+
+        @java.lang.Override
+        public food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet getDefaultInstanceForType() {
+          return food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.getDefaultInstance();
+        }
+
+        @java.lang.Override
+        public food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet build() {
+          food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+
+        @java.lang.Override
+        public food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet buildPartial() {
+          food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet result = new food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet(this);
+          if (bitField0_ != 0) { buildPartial0(result); }
+          onBuilt();
+          return result;
+        }
+
+        private void buildPartial0(food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet result) {
+          int from_bitField0_ = bitField0_;
+          if (((from_bitField0_ & 0x00000001) != 0)) {
+            menuItemOptionIds_.makeImmutable();
+            result.menuItemOptionIds_ = menuItemOptionIds_;
+          }
+        }
+
+        @java.lang.Override
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet) {
+            return mergeFrom((food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+
+        public Builder mergeFrom(food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet other) {
+          if (other == food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.getDefaultInstance()) return this;
+          if (!other.menuItemOptionIds_.isEmpty()) {
+            if (menuItemOptionIds_.isEmpty()) {
+              menuItemOptionIds_ = other.menuItemOptionIds_;
+              bitField0_ |= 0x00000001;
+            } else {
+              ensureMenuItemOptionIdsIsMutable();
+              menuItemOptionIds_.addAll(other.menuItemOptionIds_);
+            }
+            onChanged();
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          onChanged();
+          return this;
+        }
+
+        @java.lang.Override
+        public final boolean isInitialized() {
+          return true;
+        }
+
+        @java.lang.Override
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          if (extensionRegistry == null) {
+            throw new java.lang.NullPointerException();
+          }
+          try {
+            boolean done = false;
+            while (!done) {
+              int tag = input.readTag();
+              switch (tag) {
+                case 0:
+                  done = true;
+                  break;
+                case 10: {
+                  java.lang.String s = input.readStringRequireUtf8();
+                  ensureMenuItemOptionIdsIsMutable();
+                  menuItemOptionIds_.add(s);
+                  break;
+                } // case 10
+                default: {
+                  if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                    done = true; // was an endgroup tag
+                  }
+                  break;
+                } // default:
+              } // switch (tag)
+            } // while (!done)
+          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+            throw e.unwrapIOException();
+          } finally {
+            onChanged();
+          } // finally
+          return this;
+        }
+        private int bitField0_;
+
+        private com.google.protobuf.LazyStringArrayList menuItemOptionIds_ =
+            com.google.protobuf.LazyStringArrayList.emptyList();
+        private void ensureMenuItemOptionIdsIsMutable() {
+          if (!menuItemOptionIds_.isModifiable()) {
+            menuItemOptionIds_ = new com.google.protobuf.LazyStringArrayList(menuItemOptionIds_);
+          }
+          bitField0_ |= 0x00000001;
+        }
+        /**
+         * <pre>
+         * IDs of menu item options that are applicable to this menu item.
+         * Required.
+         * </pre>
+         *
+         * <code>repeated string menu_item_option_ids = 1;</code>
+         * @return A list containing the menuItemOptionIds.
+         */
+        public com.google.protobuf.ProtocolStringList
+            getMenuItemOptionIdsList() {
+          menuItemOptionIds_.makeImmutable();
+          return menuItemOptionIds_;
+        }
+        /**
+         * <pre>
+         * IDs of menu item options that are applicable to this menu item.
+         * Required.
+         * </pre>
+         *
+         * <code>repeated string menu_item_option_ids = 1;</code>
+         * @return The count of menuItemOptionIds.
+         */
+        public int getMenuItemOptionIdsCount() {
+          return menuItemOptionIds_.size();
+        }
+        /**
+         * <pre>
+         * IDs of menu item options that are applicable to this menu item.
+         * Required.
+         * </pre>
+         *
+         * <code>repeated string menu_item_option_ids = 1;</code>
+         * @param index The index of the element to return.
+         * @return The menuItemOptionIds at the given index.
+         */
+        public java.lang.String getMenuItemOptionIds(int index) {
+          return menuItemOptionIds_.get(index);
+        }
+        /**
+         * <pre>
+         * IDs of menu item options that are applicable to this menu item.
+         * Required.
+         * </pre>
+         *
+         * <code>repeated string menu_item_option_ids = 1;</code>
+         * @param index The index of the value to return.
+         * @return The bytes of the menuItemOptionIds at the given index.
+         */
+        public com.google.protobuf.ByteString
+            getMenuItemOptionIdsBytes(int index) {
+          return menuItemOptionIds_.getByteString(index);
+        }
+        /**
+         * <pre>
+         * IDs of menu item options that are applicable to this menu item.
+         * Required.
+         * </pre>
+         *
+         * <code>repeated string menu_item_option_ids = 1;</code>
+         * @param index The index to set the value at.
+         * @param value The menuItemOptionIds to set.
+         * @return This builder for chaining.
+         */
+        public Builder setMenuItemOptionIds(
+            int index, java.lang.String value) {
+          if (value == null) { throw new NullPointerException(); }
+          ensureMenuItemOptionIdsIsMutable();
+          menuItemOptionIds_.set(index, value);
+          bitField0_ |= 0x00000001;
+          onChanged();
+          return this;
+        }
+        /**
+         * <pre>
+         * IDs of menu item options that are applicable to this menu item.
+         * Required.
+         * </pre>
+         *
+         * <code>repeated string menu_item_option_ids = 1;</code>
+         * @param value The menuItemOptionIds to add.
+         * @return This builder for chaining.
+         */
+        public Builder addMenuItemOptionIds(
+            java.lang.String value) {
+          if (value == null) { throw new NullPointerException(); }
+          ensureMenuItemOptionIdsIsMutable();
+          menuItemOptionIds_.add(value);
+          bitField0_ |= 0x00000001;
+          onChanged();
+          return this;
+        }
+        /**
+         * <pre>
+         * IDs of menu item options that are applicable to this menu item.
+         * Required.
+         * </pre>
+         *
+         * <code>repeated string menu_item_option_ids = 1;</code>
+         * @param values The menuItemOptionIds to add.
+         * @return This builder for chaining.
+         */
+        public Builder addAllMenuItemOptionIds(
+            java.lang.Iterable<java.lang.String> values) {
+          ensureMenuItemOptionIdsIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, menuItemOptionIds_);
+          bitField0_ |= 0x00000001;
+          onChanged();
+          return this;
+        }
+        /**
+         * <pre>
+         * IDs of menu item options that are applicable to this menu item.
+         * Required.
+         * </pre>
+         *
+         * <code>repeated string menu_item_option_ids = 1;</code>
+         * @return This builder for chaining.
+         */
+        public Builder clearMenuItemOptionIds() {
+          menuItemOptionIds_ =
+            com.google.protobuf.LazyStringArrayList.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);;
+          onChanged();
+          return this;
+        }
+        /**
+         * <pre>
+         * IDs of menu item options that are applicable to this menu item.
+         * Required.
+         * </pre>
+         *
+         * <code>repeated string menu_item_option_ids = 1;</code>
+         * @param value The bytes of the menuItemOptionIds to add.
+         * @return This builder for chaining.
+         */
+        public Builder addMenuItemOptionIdsBytes(
+            com.google.protobuf.ByteString value) {
+          if (value == null) { throw new NullPointerException(); }
+          checkByteStringIsUtf8(value);
+          ensureMenuItemOptionIdsIsMutable();
+          menuItemOptionIds_.add(value);
+          bitField0_ |= 0x00000001;
+          onChanged();
+          return this;
+        }
+        @java.lang.Override
+        public final Builder setUnknownFields(
+            final com.google.protobuf.UnknownFieldSet unknownFields) {
+          return super.setUnknownFields(unknownFields);
+        }
+
+        @java.lang.Override
+        public final Builder mergeUnknownFields(
+            final com.google.protobuf.UnknownFieldSet unknownFields) {
+          return super.mergeUnknownFields(unknownFields);
+        }
+
+
+        // @@protoc_insertion_point(builder_scope:food.menu.v1.MenuItem.MenuItemOptionSet)
+      }
+
+      // @@protoc_insertion_point(class_scope:food.menu.v1.MenuItem.MenuItemOptionSet)
+      private static final food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet DEFAULT_INSTANCE;
+      static {
+        DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet();
+      }
+
+      public static food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet getDefaultInstance() {
+        return DEFAULT_INSTANCE;
+      }
+
+      private static final com.google.protobuf.Parser<MenuItemOptionSet>
+          PARSER = new com.google.protobuf.AbstractParser<MenuItemOptionSet>() {
+        @java.lang.Override
+        public MenuItemOptionSet parsePartialFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          Builder builder = newBuilder();
+          try {
+            builder.mergeFrom(input, extensionRegistry);
+          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+            throw e.setUnfinishedMessage(builder.buildPartial());
+          } catch (com.google.protobuf.UninitializedMessageException e) {
+            throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+          } catch (java.io.IOException e) {
+            throw new com.google.protobuf.InvalidProtocolBufferException(e)
+                .setUnfinishedMessage(builder.buildPartial());
+          }
+          return builder.buildPartial();
+        }
+      };
+
+      public static com.google.protobuf.Parser<MenuItemOptionSet> parser() {
+        return PARSER;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Parser<MenuItemOptionSet> getParserForType() {
+        return PARSER;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet getDefaultInstanceForType() {
+        return DEFAULT_INSTANCE;
+      }
+
+    }
+
+    private int pricingCase_ = 0;
+    @SuppressWarnings("serial")
+    private java.lang.Object pricing_;
+    public enum PricingCase
+        implements com.google.protobuf.Internal.EnumLite,
+            com.google.protobuf.AbstractMessage.InternalOneOfEnum {
+      OFFER_SET(6),
+      MENU_ITEM_OPTION_SET(7),
+      PRICING_NOT_SET(0);
+      private final int value;
+      private PricingCase(int value) {
+        this.value = value;
+      }
+      /**
+       * @param value The number of the enum to look for.
+       * @return The enum associated with the given number.
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
+      public static PricingCase valueOf(int value) {
+        return forNumber(value);
+      }
+
+      public static PricingCase forNumber(int value) {
+        switch (value) {
+          case 6: return OFFER_SET;
+          case 7: return MENU_ITEM_OPTION_SET;
+          case 0: return PRICING_NOT_SET;
+          default: return null;
+        }
+      }
+      public int getNumber() {
+        return this.value;
+      }
+    };
+
+    public PricingCase
+    getPricingCase() {
+      return PricingCase.forNumber(
+          pricingCase_);
+    }
+
+    public static final int MENU_ITEM_ID_FIELD_NUMBER = 1;
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object menuItemId_ = "";
+    /**
+     * <pre>
+     * An opaque string from an partner which uniquely identifies the MenuItem
+     * within the partner feed.
+     * Required.
+     * </pre>
+     *
+     * <code>string menu_item_id = 1;</code>
+     * @return The menuItemId.
+     */
+    @java.lang.Override
+    public java.lang.String getMenuItemId() {
+      java.lang.Object ref = menuItemId_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        menuItemId_ = s;
+        return s;
+      }
+    }
+    /**
+     * <pre>
+     * An opaque string from an partner which uniquely identifies the MenuItem
+     * within the partner feed.
+     * Required.
+     * </pre>
+     *
+     * <code>string menu_item_id = 1;</code>
+     * @return The bytes for menuItemId.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getMenuItemIdBytes() {
+      java.lang.Object ref = menuItemId_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        menuItemId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int DISPLAY_NAME_FIELD_NUMBER = 2;
+    private food.menu.v1.FoodMenu.TextField displayName_;
+    /**
+     * <pre>
+     * The name that can identify the MenuItem when a user is browsing the menu.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 2;</code>
+     * @return Whether the displayName field is set.
+     */
+    @java.lang.Override
+    public boolean hasDisplayName() {
+      return displayName_ != null;
+    }
+    /**
+     * <pre>
+     * The name that can identify the MenuItem when a user is browsing the menu.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 2;</code>
+     * @return The displayName.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextField getDisplayName() {
+      return displayName_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : displayName_;
+    }
+    /**
+     * <pre>
+     * The name that can identify the MenuItem when a user is browsing the menu.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField display_name = 2;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextFieldOrBuilder getDisplayNameOrBuilder() {
+      return displayName_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : displayName_;
+    }
+
+    public static final int DESCRIPTION_FIELD_NUMBER = 3;
+    private food.menu.v1.FoodMenu.TextField description_;
+    /**
+     * <pre>
+     * A description of the menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 3;</code>
+     * @return Whether the description field is set.
+     */
+    @java.lang.Override
+    public boolean hasDescription() {
+      return description_ != null;
+    }
+    /**
+     * <pre>
+     * A description of the menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 3;</code>
+     * @return The description.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextField getDescription() {
+      return description_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : description_;
+    }
+    /**
+     * <pre>
+     * A description of the menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 3;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextFieldOrBuilder getDescriptionOrBuilder() {
+      return description_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : description_;
+    }
+
+    public static final int IMAGES_FIELD_NUMBER = 4;
+    @SuppressWarnings("serial")
+    private java.util.List<food.menu.v1.FoodMenu.Image> images_;
+    /**
+     * <pre>
+     * Image(s) of the menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    @java.lang.Override
+    public java.util.List<food.menu.v1.FoodMenu.Image> getImagesList() {
+      return images_;
+    }
+    /**
+     * <pre>
+     * Image(s) of the menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends food.menu.v1.FoodMenu.ImageOrBuilder> 
+        getImagesOrBuilderList() {
+      return images_;
+    }
+    /**
+     * <pre>
+     * Image(s) of the menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    @java.lang.Override
+    public int getImagesCount() {
+      return images_.size();
+    }
+    /**
+     * <pre>
+     * Image(s) of the menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.Image getImages(int index) {
+      return images_.get(index);
+    }
+    /**
+     * <pre>
+     * Image(s) of the menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Image images = 4;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.ImageOrBuilder getImagesOrBuilder(
+        int index) {
+      return images_.get(index);
+    }
+
+    public static final int OFFER_SET_FIELD_NUMBER = 6;
+    /**
+     * <pre>
+     * Available offers to purchase this food item.
+     * </pre>
+     *
+     * <code>.food.menu.v1.OfferSet offer_set = 6;</code>
+     * @return Whether the offerSet field is set.
+     */
+    @java.lang.Override
+    public boolean hasOfferSet() {
+      return pricingCase_ == 6;
+    }
+    /**
+     * <pre>
+     * Available offers to purchase this food item.
+     * </pre>
+     *
+     * <code>.food.menu.v1.OfferSet offer_set = 6;</code>
+     * @return The offerSet.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.OfferSet getOfferSet() {
+      if (pricingCase_ == 6) {
+         return (food.menu.v1.FoodMenu.OfferSet) pricing_;
+      }
+      return food.menu.v1.FoodMenu.OfferSet.getDefaultInstance();
+    }
+    /**
+     * <pre>
+     * Available offers to purchase this food item.
+     * </pre>
+     *
+     * <code>.food.menu.v1.OfferSet offer_set = 6;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.OfferSetOrBuilder getOfferSetOrBuilder() {
+      if (pricingCase_ == 6) {
+         return (food.menu.v1.FoodMenu.OfferSet) pricing_;
+      }
+      return food.menu.v1.FoodMenu.OfferSet.getDefaultInstance();
+    }
+
+    public static final int MENU_ITEM_OPTION_SET_FIELD_NUMBER = 7;
+    /**
+     * <pre>
+     * Available options for this menu item.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItem.MenuItemOptionSet menu_item_option_set = 7;</code>
+     * @return Whether the menuItemOptionSet field is set.
+     */
+    @java.lang.Override
+    public boolean hasMenuItemOptionSet() {
+      return pricingCase_ == 7;
+    }
+    /**
+     * <pre>
+     * Available options for this menu item.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItem.MenuItemOptionSet menu_item_option_set = 7;</code>
+     * @return The menuItemOptionSet.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet getMenuItemOptionSet() {
+      if (pricingCase_ == 7) {
+         return (food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet) pricing_;
+      }
+      return food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.getDefaultInstance();
+    }
+    /**
+     * <pre>
+     * Available options for this menu item.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItem.MenuItemOptionSet menu_item_option_set = 7;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSetOrBuilder getMenuItemOptionSetOrBuilder() {
+      if (pricingCase_ == 7) {
+         return (food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet) pricing_;
+      }
+      return food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.getDefaultInstance();
+    }
+
+    public static final int ITEM_ATTRIBUTES_FIELD_NUMBER = 8;
+    private food.menu.v1.FoodMenu.MenuItemAttributes itemAttributes_;
+    /**
+     * <pre>
+     * Attributes about this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemAttributes item_attributes = 8;</code>
+     * @return Whether the itemAttributes field is set.
+     */
+    @java.lang.Override
+    public boolean hasItemAttributes() {
+      return itemAttributes_ != null;
+    }
+    /**
+     * <pre>
+     * Attributes about this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemAttributes item_attributes = 8;</code>
+     * @return The itemAttributes.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuItemAttributes getItemAttributes() {
+      return itemAttributes_ == null ? food.menu.v1.FoodMenu.MenuItemAttributes.getDefaultInstance() : itemAttributes_;
+    }
+    /**
+     * <pre>
+     * Attributes about this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemAttributes item_attributes = 8;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuItemAttributesOrBuilder getItemAttributesOrBuilder() {
+      return itemAttributes_ == null ? food.menu.v1.FoodMenu.MenuItemAttributes.getDefaultInstance() : itemAttributes_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(menuItemId_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, menuItemId_);
+      }
+      if (displayName_ != null) {
+        output.writeMessage(2, getDisplayName());
+      }
+      if (description_ != null) {
+        output.writeMessage(3, getDescription());
+      }
+      for (int i = 0; i < images_.size(); i++) {
+        output.writeMessage(4, images_.get(i));
+      }
+      if (pricingCase_ == 6) {
+        output.writeMessage(6, (food.menu.v1.FoodMenu.OfferSet) pricing_);
+      }
+      if (pricingCase_ == 7) {
+        output.writeMessage(7, (food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet) pricing_);
+      }
+      if (itemAttributes_ != null) {
+        output.writeMessage(8, getItemAttributes());
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(menuItemId_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, menuItemId_);
+      }
+      if (displayName_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getDisplayName());
+      }
+      if (description_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, getDescription());
+      }
+      for (int i = 0; i < images_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, images_.get(i));
+      }
+      if (pricingCase_ == 6) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(6, (food.menu.v1.FoodMenu.OfferSet) pricing_);
+      }
+      if (pricingCase_ == 7) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(7, (food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet) pricing_);
+      }
+      if (itemAttributes_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(8, getItemAttributes());
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.MenuItem)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.MenuItem other = (food.menu.v1.FoodMenu.MenuItem) obj;
+
+      if (!getMenuItemId()
+          .equals(other.getMenuItemId())) return false;
+      if (hasDisplayName() != other.hasDisplayName()) return false;
+      if (hasDisplayName()) {
+        if (!getDisplayName()
+            .equals(other.getDisplayName())) return false;
+      }
+      if (hasDescription() != other.hasDescription()) return false;
+      if (hasDescription()) {
+        if (!getDescription()
+            .equals(other.getDescription())) return false;
+      }
+      if (!getImagesList()
+          .equals(other.getImagesList())) return false;
+      if (hasItemAttributes() != other.hasItemAttributes()) return false;
+      if (hasItemAttributes()) {
+        if (!getItemAttributes()
+            .equals(other.getItemAttributes())) return false;
+      }
+      if (!getPricingCase().equals(other.getPricingCase())) return false;
+      switch (pricingCase_) {
+        case 6:
+          if (!getOfferSet()
+              .equals(other.getOfferSet())) return false;
+          break;
+        case 7:
+          if (!getMenuItemOptionSet()
+              .equals(other.getMenuItemOptionSet())) return false;
+          break;
+        case 0:
+        default:
+      }
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + MENU_ITEM_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getMenuItemId().hashCode();
+      if (hasDisplayName()) {
+        hash = (37 * hash) + DISPLAY_NAME_FIELD_NUMBER;
+        hash = (53 * hash) + getDisplayName().hashCode();
+      }
+      if (hasDescription()) {
+        hash = (37 * hash) + DESCRIPTION_FIELD_NUMBER;
+        hash = (53 * hash) + getDescription().hashCode();
+      }
+      if (getImagesCount() > 0) {
+        hash = (37 * hash) + IMAGES_FIELD_NUMBER;
+        hash = (53 * hash) + getImagesList().hashCode();
+      }
+      if (hasItemAttributes()) {
+        hash = (37 * hash) + ITEM_ATTRIBUTES_FIELD_NUMBER;
+        hash = (53 * hash) + getItemAttributes().hashCode();
+      }
+      switch (pricingCase_) {
+        case 6:
+          hash = (37 * hash) + OFFER_SET_FIELD_NUMBER;
+          hash = (53 * hash) + getOfferSet().hashCode();
+          break;
+        case 7:
+          hash = (37 * hash) + MENU_ITEM_OPTION_SET_FIELD_NUMBER;
+          hash = (53 * hash) + getMenuItemOptionSet().hashCode();
+          break;
+        case 0:
+        default:
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.MenuItem parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuItem parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItem parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuItem parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItem parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuItem parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItem parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuItem parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItem parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuItem parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItem parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuItem parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.MenuItem prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * Represents a single food or drink item offered by a Food establishment.
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.MenuItem}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.MenuItem)
+        food.menu.v1.FoodMenu.MenuItemOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItem_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItem_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.MenuItem.class, food.menu.v1.FoodMenu.MenuItem.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.MenuItem.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        menuItemId_ = "";
+        displayName_ = null;
+        if (displayNameBuilder_ != null) {
+          displayNameBuilder_.dispose();
+          displayNameBuilder_ = null;
+        }
+        description_ = null;
+        if (descriptionBuilder_ != null) {
+          descriptionBuilder_.dispose();
+          descriptionBuilder_ = null;
+        }
+        if (imagesBuilder_ == null) {
+          images_ = java.util.Collections.emptyList();
+        } else {
+          images_ = null;
+          imagesBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000008);
+        if (offerSetBuilder_ != null) {
+          offerSetBuilder_.clear();
+        }
+        if (menuItemOptionSetBuilder_ != null) {
+          menuItemOptionSetBuilder_.clear();
+        }
+        itemAttributes_ = null;
+        if (itemAttributesBuilder_ != null) {
+          itemAttributesBuilder_.dispose();
+          itemAttributesBuilder_ = null;
+        }
+        pricingCase_ = 0;
+        pricing_ = null;
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItem_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItem getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.MenuItem.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItem build() {
+        food.menu.v1.FoodMenu.MenuItem result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItem buildPartial() {
+        food.menu.v1.FoodMenu.MenuItem result = new food.menu.v1.FoodMenu.MenuItem(this);
+        buildPartialRepeatedFields(result);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        buildPartialOneofs(result);
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartialRepeatedFields(food.menu.v1.FoodMenu.MenuItem result) {
+        if (imagesBuilder_ == null) {
+          if (((bitField0_ & 0x00000008) != 0)) {
+            images_ = java.util.Collections.unmodifiableList(images_);
+            bitField0_ = (bitField0_ & ~0x00000008);
+          }
+          result.images_ = images_;
+        } else {
+          result.images_ = imagesBuilder_.build();
+        }
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.MenuItem result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.menuItemId_ = menuItemId_;
+        }
+        if (((from_bitField0_ & 0x00000002) != 0)) {
+          result.displayName_ = displayNameBuilder_ == null
+              ? displayName_
+              : displayNameBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000004) != 0)) {
+          result.description_ = descriptionBuilder_ == null
+              ? description_
+              : descriptionBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000040) != 0)) {
+          result.itemAttributes_ = itemAttributesBuilder_ == null
+              ? itemAttributes_
+              : itemAttributesBuilder_.build();
+        }
+      }
+
+      private void buildPartialOneofs(food.menu.v1.FoodMenu.MenuItem result) {
+        result.pricingCase_ = pricingCase_;
+        result.pricing_ = this.pricing_;
+        if (pricingCase_ == 6 &&
+            offerSetBuilder_ != null) {
+          result.pricing_ = offerSetBuilder_.build();
+        }
+        if (pricingCase_ == 7 &&
+            menuItemOptionSetBuilder_ != null) {
+          result.pricing_ = menuItemOptionSetBuilder_.build();
+        }
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.MenuItem) {
+          return mergeFrom((food.menu.v1.FoodMenu.MenuItem)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.MenuItem other) {
+        if (other == food.menu.v1.FoodMenu.MenuItem.getDefaultInstance()) return this;
+        if (!other.getMenuItemId().isEmpty()) {
+          menuItemId_ = other.menuItemId_;
+          bitField0_ |= 0x00000001;
+          onChanged();
+        }
+        if (other.hasDisplayName()) {
+          mergeDisplayName(other.getDisplayName());
+        }
+        if (other.hasDescription()) {
+          mergeDescription(other.getDescription());
+        }
+        if (imagesBuilder_ == null) {
+          if (!other.images_.isEmpty()) {
+            if (images_.isEmpty()) {
+              images_ = other.images_;
+              bitField0_ = (bitField0_ & ~0x00000008);
+            } else {
+              ensureImagesIsMutable();
+              images_.addAll(other.images_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.images_.isEmpty()) {
+            if (imagesBuilder_.isEmpty()) {
+              imagesBuilder_.dispose();
+              imagesBuilder_ = null;
+              images_ = other.images_;
+              bitField0_ = (bitField0_ & ~0x00000008);
+              imagesBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getImagesFieldBuilder() : null;
+            } else {
+              imagesBuilder_.addAllMessages(other.images_);
+            }
+          }
+        }
+        if (other.hasItemAttributes()) {
+          mergeItemAttributes(other.getItemAttributes());
+        }
+        switch (other.getPricingCase()) {
+          case OFFER_SET: {
+            mergeOfferSet(other.getOfferSet());
+            break;
+          }
+          case MENU_ITEM_OPTION_SET: {
+            mergeMenuItemOptionSet(other.getMenuItemOptionSet());
+            break;
+          }
+          case PRICING_NOT_SET: {
+            break;
+          }
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                menuItemId_ = input.readStringRequireUtf8();
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 10
+              case 18: {
+                input.readMessage(
+                    getDisplayNameFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000002;
+                break;
+              } // case 18
+              case 26: {
+                input.readMessage(
+                    getDescriptionFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000004;
+                break;
+              } // case 26
+              case 34: {
+                food.menu.v1.FoodMenu.Image m =
+                    input.readMessage(
+                        food.menu.v1.FoodMenu.Image.parser(),
+                        extensionRegistry);
+                if (imagesBuilder_ == null) {
+                  ensureImagesIsMutable();
+                  images_.add(m);
+                } else {
+                  imagesBuilder_.addMessage(m);
+                }
+                break;
+              } // case 34
+              case 50: {
+                input.readMessage(
+                    getOfferSetFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                pricingCase_ = 6;
+                break;
+              } // case 50
+              case 58: {
+                input.readMessage(
+                    getMenuItemOptionSetFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                pricingCase_ = 7;
+                break;
+              } // case 58
+              case 66: {
+                input.readMessage(
+                    getItemAttributesFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000040;
+                break;
+              } // case 66
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int pricingCase_ = 0;
+      private java.lang.Object pricing_;
+      public PricingCase
+          getPricingCase() {
+        return PricingCase.forNumber(
+            pricingCase_);
+      }
+
+      public Builder clearPricing() {
+        pricingCase_ = 0;
+        pricing_ = null;
+        onChanged();
+        return this;
+      }
+
+      private int bitField0_;
+
+      private java.lang.Object menuItemId_ = "";
+      /**
+       * <pre>
+       * An opaque string from an partner which uniquely identifies the MenuItem
+       * within the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_item_id = 1;</code>
+       * @return The menuItemId.
+       */
+      public java.lang.String getMenuItemId() {
+        java.lang.Object ref = menuItemId_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          menuItemId_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <pre>
+       * An opaque string from an partner which uniquely identifies the MenuItem
+       * within the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_item_id = 1;</code>
+       * @return The bytes for menuItemId.
+       */
+      public com.google.protobuf.ByteString
+          getMenuItemIdBytes() {
+        java.lang.Object ref = menuItemId_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          menuItemId_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <pre>
+       * An opaque string from an partner which uniquely identifies the MenuItem
+       * within the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_item_id = 1;</code>
+       * @param value The menuItemId to set.
+       * @return This builder for chaining.
+       */
+      public Builder setMenuItemId(
+          java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        menuItemId_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * An opaque string from an partner which uniquely identifies the MenuItem
+       * within the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_item_id = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearMenuItemId() {
+        menuItemId_ = getDefaultInstance().getMenuItemId();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * An opaque string from an partner which uniquely identifies the MenuItem
+       * within the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_item_id = 1;</code>
+       * @param value The bytes for menuItemId to set.
+       * @return This builder for chaining.
+       */
+      public Builder setMenuItemIdBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) { throw new NullPointerException(); }
+        checkByteStringIsUtf8(value);
+        menuItemId_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+
+      private food.menu.v1.FoodMenu.TextField displayName_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> displayNameBuilder_;
+      /**
+       * <pre>
+       * The name that can identify the MenuItem when a user is browsing the menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       * @return Whether the displayName field is set.
+       */
+      public boolean hasDisplayName() {
+        return ((bitField0_ & 0x00000002) != 0);
+      }
+      /**
+       * <pre>
+       * The name that can identify the MenuItem when a user is browsing the menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       * @return The displayName.
+       */
+      public food.menu.v1.FoodMenu.TextField getDisplayName() {
+        if (displayNameBuilder_ == null) {
+          return displayName_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : displayName_;
+        } else {
+          return displayNameBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * The name that can identify the MenuItem when a user is browsing the menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       */
+      public Builder setDisplayName(food.menu.v1.FoodMenu.TextField value) {
+        if (displayNameBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          displayName_ = value;
+        } else {
+          displayNameBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The name that can identify the MenuItem when a user is browsing the menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       */
+      public Builder setDisplayName(
+          food.menu.v1.FoodMenu.TextField.Builder builderForValue) {
+        if (displayNameBuilder_ == null) {
+          displayName_ = builderForValue.build();
+        } else {
+          displayNameBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The name that can identify the MenuItem when a user is browsing the menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       */
+      public Builder mergeDisplayName(food.menu.v1.FoodMenu.TextField value) {
+        if (displayNameBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) != 0) &&
+            displayName_ != null &&
+            displayName_ != food.menu.v1.FoodMenu.TextField.getDefaultInstance()) {
+            getDisplayNameBuilder().mergeFrom(value);
+          } else {
+            displayName_ = value;
+          }
+        } else {
+          displayNameBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The name that can identify the MenuItem when a user is browsing the menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       */
+      public Builder clearDisplayName() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        displayName_ = null;
+        if (displayNameBuilder_ != null) {
+          displayNameBuilder_.dispose();
+          displayNameBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The name that can identify the MenuItem when a user is browsing the menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       */
+      public food.menu.v1.FoodMenu.TextField.Builder getDisplayNameBuilder() {
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return getDisplayNameFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * The name that can identify the MenuItem when a user is browsing the menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       */
+      public food.menu.v1.FoodMenu.TextFieldOrBuilder getDisplayNameOrBuilder() {
+        if (displayNameBuilder_ != null) {
+          return displayNameBuilder_.getMessageOrBuilder();
+        } else {
+          return displayName_ == null ?
+              food.menu.v1.FoodMenu.TextField.getDefaultInstance() : displayName_;
+        }
+      }
+      /**
+       * <pre>
+       * The name that can identify the MenuItem when a user is browsing the menu.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField display_name = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> 
+          getDisplayNameFieldBuilder() {
+        if (displayNameBuilder_ == null) {
+          displayNameBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder>(
+                  getDisplayName(),
+                  getParentForChildren(),
+                  isClean());
+          displayName_ = null;
+        }
+        return displayNameBuilder_;
+      }
+
+      private food.menu.v1.FoodMenu.TextField description_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> descriptionBuilder_;
+      /**
+       * <pre>
+       * A description of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       * @return Whether the description field is set.
+       */
+      public boolean hasDescription() {
+        return ((bitField0_ & 0x00000004) != 0);
+      }
+      /**
+       * <pre>
+       * A description of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       * @return The description.
+       */
+      public food.menu.v1.FoodMenu.TextField getDescription() {
+        if (descriptionBuilder_ == null) {
+          return description_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : description_;
+        } else {
+          return descriptionBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * A description of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       */
+      public Builder setDescription(food.menu.v1.FoodMenu.TextField value) {
+        if (descriptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          description_ = value;
+        } else {
+          descriptionBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * A description of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       */
+      public Builder setDescription(
+          food.menu.v1.FoodMenu.TextField.Builder builderForValue) {
+        if (descriptionBuilder_ == null) {
+          description_ = builderForValue.build();
+        } else {
+          descriptionBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * A description of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       */
+      public Builder mergeDescription(food.menu.v1.FoodMenu.TextField value) {
+        if (descriptionBuilder_ == null) {
+          if (((bitField0_ & 0x00000004) != 0) &&
+            description_ != null &&
+            description_ != food.menu.v1.FoodMenu.TextField.getDefaultInstance()) {
+            getDescriptionBuilder().mergeFrom(value);
+          } else {
+            description_ = value;
+          }
+        } else {
+          descriptionBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * A description of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       */
+      public Builder clearDescription() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        description_ = null;
+        if (descriptionBuilder_ != null) {
+          descriptionBuilder_.dispose();
+          descriptionBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * A description of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       */
+      public food.menu.v1.FoodMenu.TextField.Builder getDescriptionBuilder() {
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return getDescriptionFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * A description of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       */
+      public food.menu.v1.FoodMenu.TextFieldOrBuilder getDescriptionOrBuilder() {
+        if (descriptionBuilder_ != null) {
+          return descriptionBuilder_.getMessageOrBuilder();
+        } else {
+          return description_ == null ?
+              food.menu.v1.FoodMenu.TextField.getDefaultInstance() : description_;
+        }
+      }
+      /**
+       * <pre>
+       * A description of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 3;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> 
+          getDescriptionFieldBuilder() {
+        if (descriptionBuilder_ == null) {
+          descriptionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder>(
+                  getDescription(),
+                  getParentForChildren(),
+                  isClean());
+          description_ = null;
+        }
+        return descriptionBuilder_;
+      }
+
+      private java.util.List<food.menu.v1.FoodMenu.Image> images_ =
+        java.util.Collections.emptyList();
+      private void ensureImagesIsMutable() {
+        if (!((bitField0_ & 0x00000008) != 0)) {
+          images_ = new java.util.ArrayList<food.menu.v1.FoodMenu.Image>(images_);
+          bitField0_ |= 0x00000008;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          food.menu.v1.FoodMenu.Image, food.menu.v1.FoodMenu.Image.Builder, food.menu.v1.FoodMenu.ImageOrBuilder> imagesBuilder_;
+
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public java.util.List<food.menu.v1.FoodMenu.Image> getImagesList() {
+        if (imagesBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(images_);
+        } else {
+          return imagesBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public int getImagesCount() {
+        if (imagesBuilder_ == null) {
+          return images_.size();
+        } else {
+          return imagesBuilder_.getCount();
+        }
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.Image getImages(int index) {
+        if (imagesBuilder_ == null) {
+          return images_.get(index);
+        } else {
+          return imagesBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder setImages(
+          int index, food.menu.v1.FoodMenu.Image value) {
+        if (imagesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureImagesIsMutable();
+          images_.set(index, value);
+          onChanged();
+        } else {
+          imagesBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder setImages(
+          int index, food.menu.v1.FoodMenu.Image.Builder builderForValue) {
+        if (imagesBuilder_ == null) {
+          ensureImagesIsMutable();
+          images_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          imagesBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder addImages(food.menu.v1.FoodMenu.Image value) {
+        if (imagesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureImagesIsMutable();
+          images_.add(value);
+          onChanged();
+        } else {
+          imagesBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder addImages(
+          int index, food.menu.v1.FoodMenu.Image value) {
+        if (imagesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureImagesIsMutable();
+          images_.add(index, value);
+          onChanged();
+        } else {
+          imagesBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder addImages(
+          food.menu.v1.FoodMenu.Image.Builder builderForValue) {
+        if (imagesBuilder_ == null) {
+          ensureImagesIsMutable();
+          images_.add(builderForValue.build());
+          onChanged();
+        } else {
+          imagesBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder addImages(
+          int index, food.menu.v1.FoodMenu.Image.Builder builderForValue) {
+        if (imagesBuilder_ == null) {
+          ensureImagesIsMutable();
+          images_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          imagesBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder addAllImages(
+          java.lang.Iterable<? extends food.menu.v1.FoodMenu.Image> values) {
+        if (imagesBuilder_ == null) {
+          ensureImagesIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, images_);
+          onChanged();
+        } else {
+          imagesBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder clearImages() {
+        if (imagesBuilder_ == null) {
+          images_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000008);
+          onChanged();
+        } else {
+          imagesBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public Builder removeImages(int index) {
+        if (imagesBuilder_ == null) {
+          ensureImagesIsMutable();
+          images_.remove(index);
+          onChanged();
+        } else {
+          imagesBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.Image.Builder getImagesBuilder(
+          int index) {
+        return getImagesFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.ImageOrBuilder getImagesOrBuilder(
+          int index) {
+        if (imagesBuilder_ == null) {
+          return images_.get(index);  } else {
+          return imagesBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public java.util.List<? extends food.menu.v1.FoodMenu.ImageOrBuilder> 
+           getImagesOrBuilderList() {
+        if (imagesBuilder_ != null) {
+          return imagesBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(images_);
+        }
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.Image.Builder addImagesBuilder() {
+        return getImagesFieldBuilder().addBuilder(
+            food.menu.v1.FoodMenu.Image.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.Image.Builder addImagesBuilder(
+          int index) {
+        return getImagesFieldBuilder().addBuilder(
+            index, food.menu.v1.FoodMenu.Image.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * Image(s) of the menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Image images = 4;</code>
+       */
+      public java.util.List<food.menu.v1.FoodMenu.Image.Builder> 
+           getImagesBuilderList() {
+        return getImagesFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          food.menu.v1.FoodMenu.Image, food.menu.v1.FoodMenu.Image.Builder, food.menu.v1.FoodMenu.ImageOrBuilder> 
+          getImagesFieldBuilder() {
+        if (imagesBuilder_ == null) {
+          imagesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              food.menu.v1.FoodMenu.Image, food.menu.v1.FoodMenu.Image.Builder, food.menu.v1.FoodMenu.ImageOrBuilder>(
+                  images_,
+                  ((bitField0_ & 0x00000008) != 0),
+                  getParentForChildren(),
+                  isClean());
+          images_ = null;
+        }
+        return imagesBuilder_;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.OfferSet, food.menu.v1.FoodMenu.OfferSet.Builder, food.menu.v1.FoodMenu.OfferSetOrBuilder> offerSetBuilder_;
+      /**
+       * <pre>
+       * Available offers to purchase this food item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 6;</code>
+       * @return Whether the offerSet field is set.
+       */
+      @java.lang.Override
+      public boolean hasOfferSet() {
+        return pricingCase_ == 6;
+      }
+      /**
+       * <pre>
+       * Available offers to purchase this food item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 6;</code>
+       * @return The offerSet.
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.OfferSet getOfferSet() {
+        if (offerSetBuilder_ == null) {
+          if (pricingCase_ == 6) {
+            return (food.menu.v1.FoodMenu.OfferSet) pricing_;
+          }
+          return food.menu.v1.FoodMenu.OfferSet.getDefaultInstance();
+        } else {
+          if (pricingCase_ == 6) {
+            return offerSetBuilder_.getMessage();
+          }
+          return food.menu.v1.FoodMenu.OfferSet.getDefaultInstance();
+        }
+      }
+      /**
+       * <pre>
+       * Available offers to purchase this food item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 6;</code>
+       */
+      public Builder setOfferSet(food.menu.v1.FoodMenu.OfferSet value) {
+        if (offerSetBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          pricing_ = value;
+          onChanged();
+        } else {
+          offerSetBuilder_.setMessage(value);
+        }
+        pricingCase_ = 6;
+        return this;
+      }
+      /**
+       * <pre>
+       * Available offers to purchase this food item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 6;</code>
+       */
+      public Builder setOfferSet(
+          food.menu.v1.FoodMenu.OfferSet.Builder builderForValue) {
+        if (offerSetBuilder_ == null) {
+          pricing_ = builderForValue.build();
+          onChanged();
+        } else {
+          offerSetBuilder_.setMessage(builderForValue.build());
+        }
+        pricingCase_ = 6;
+        return this;
+      }
+      /**
+       * <pre>
+       * Available offers to purchase this food item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 6;</code>
+       */
+      public Builder mergeOfferSet(food.menu.v1.FoodMenu.OfferSet value) {
+        if (offerSetBuilder_ == null) {
+          if (pricingCase_ == 6 &&
+              pricing_ != food.menu.v1.FoodMenu.OfferSet.getDefaultInstance()) {
+            pricing_ = food.menu.v1.FoodMenu.OfferSet.newBuilder((food.menu.v1.FoodMenu.OfferSet) pricing_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            pricing_ = value;
+          }
+          onChanged();
+        } else {
+          if (pricingCase_ == 6) {
+            offerSetBuilder_.mergeFrom(value);
+          } else {
+            offerSetBuilder_.setMessage(value);
+          }
+        }
+        pricingCase_ = 6;
+        return this;
+      }
+      /**
+       * <pre>
+       * Available offers to purchase this food item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 6;</code>
+       */
+      public Builder clearOfferSet() {
+        if (offerSetBuilder_ == null) {
+          if (pricingCase_ == 6) {
+            pricingCase_ = 0;
+            pricing_ = null;
+            onChanged();
+          }
+        } else {
+          if (pricingCase_ == 6) {
+            pricingCase_ = 0;
+            pricing_ = null;
+          }
+          offerSetBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Available offers to purchase this food item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 6;</code>
+       */
+      public food.menu.v1.FoodMenu.OfferSet.Builder getOfferSetBuilder() {
+        return getOfferSetFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Available offers to purchase this food item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 6;</code>
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.OfferSetOrBuilder getOfferSetOrBuilder() {
+        if ((pricingCase_ == 6) && (offerSetBuilder_ != null)) {
+          return offerSetBuilder_.getMessageOrBuilder();
+        } else {
+          if (pricingCase_ == 6) {
+            return (food.menu.v1.FoodMenu.OfferSet) pricing_;
+          }
+          return food.menu.v1.FoodMenu.OfferSet.getDefaultInstance();
+        }
+      }
+      /**
+       * <pre>
+       * Available offers to purchase this food item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 6;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.OfferSet, food.menu.v1.FoodMenu.OfferSet.Builder, food.menu.v1.FoodMenu.OfferSetOrBuilder> 
+          getOfferSetFieldBuilder() {
+        if (offerSetBuilder_ == null) {
+          if (!(pricingCase_ == 6)) {
+            pricing_ = food.menu.v1.FoodMenu.OfferSet.getDefaultInstance();
+          }
+          offerSetBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.OfferSet, food.menu.v1.FoodMenu.OfferSet.Builder, food.menu.v1.FoodMenu.OfferSetOrBuilder>(
+                  (food.menu.v1.FoodMenu.OfferSet) pricing_,
+                  getParentForChildren(),
+                  isClean());
+          pricing_ = null;
+        }
+        pricingCase_ = 6;
+        onChanged();
+        return offerSetBuilder_;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet, food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.Builder, food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSetOrBuilder> menuItemOptionSetBuilder_;
+      /**
+       * <pre>
+       * Available options for this menu item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItem.MenuItemOptionSet menu_item_option_set = 7;</code>
+       * @return Whether the menuItemOptionSet field is set.
+       */
+      @java.lang.Override
+      public boolean hasMenuItemOptionSet() {
+        return pricingCase_ == 7;
+      }
+      /**
+       * <pre>
+       * Available options for this menu item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItem.MenuItemOptionSet menu_item_option_set = 7;</code>
+       * @return The menuItemOptionSet.
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet getMenuItemOptionSet() {
+        if (menuItemOptionSetBuilder_ == null) {
+          if (pricingCase_ == 7) {
+            return (food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet) pricing_;
+          }
+          return food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.getDefaultInstance();
+        } else {
+          if (pricingCase_ == 7) {
+            return menuItemOptionSetBuilder_.getMessage();
+          }
+          return food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.getDefaultInstance();
+        }
+      }
+      /**
+       * <pre>
+       * Available options for this menu item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItem.MenuItemOptionSet menu_item_option_set = 7;</code>
+       */
+      public Builder setMenuItemOptionSet(food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet value) {
+        if (menuItemOptionSetBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          pricing_ = value;
+          onChanged();
+        } else {
+          menuItemOptionSetBuilder_.setMessage(value);
+        }
+        pricingCase_ = 7;
+        return this;
+      }
+      /**
+       * <pre>
+       * Available options for this menu item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItem.MenuItemOptionSet menu_item_option_set = 7;</code>
+       */
+      public Builder setMenuItemOptionSet(
+          food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.Builder builderForValue) {
+        if (menuItemOptionSetBuilder_ == null) {
+          pricing_ = builderForValue.build();
+          onChanged();
+        } else {
+          menuItemOptionSetBuilder_.setMessage(builderForValue.build());
+        }
+        pricingCase_ = 7;
+        return this;
+      }
+      /**
+       * <pre>
+       * Available options for this menu item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItem.MenuItemOptionSet menu_item_option_set = 7;</code>
+       */
+      public Builder mergeMenuItemOptionSet(food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet value) {
+        if (menuItemOptionSetBuilder_ == null) {
+          if (pricingCase_ == 7 &&
+              pricing_ != food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.getDefaultInstance()) {
+            pricing_ = food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.newBuilder((food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet) pricing_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            pricing_ = value;
+          }
+          onChanged();
+        } else {
+          if (pricingCase_ == 7) {
+            menuItemOptionSetBuilder_.mergeFrom(value);
+          } else {
+            menuItemOptionSetBuilder_.setMessage(value);
+          }
+        }
+        pricingCase_ = 7;
+        return this;
+      }
+      /**
+       * <pre>
+       * Available options for this menu item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItem.MenuItemOptionSet menu_item_option_set = 7;</code>
+       */
+      public Builder clearMenuItemOptionSet() {
+        if (menuItemOptionSetBuilder_ == null) {
+          if (pricingCase_ == 7) {
+            pricingCase_ = 0;
+            pricing_ = null;
+            onChanged();
+          }
+        } else {
+          if (pricingCase_ == 7) {
+            pricingCase_ = 0;
+            pricing_ = null;
+          }
+          menuItemOptionSetBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Available options for this menu item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItem.MenuItemOptionSet menu_item_option_set = 7;</code>
+       */
+      public food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.Builder getMenuItemOptionSetBuilder() {
+        return getMenuItemOptionSetFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Available options for this menu item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItem.MenuItemOptionSet menu_item_option_set = 7;</code>
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSetOrBuilder getMenuItemOptionSetOrBuilder() {
+        if ((pricingCase_ == 7) && (menuItemOptionSetBuilder_ != null)) {
+          return menuItemOptionSetBuilder_.getMessageOrBuilder();
+        } else {
+          if (pricingCase_ == 7) {
+            return (food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet) pricing_;
+          }
+          return food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.getDefaultInstance();
+        }
+      }
+      /**
+       * <pre>
+       * Available options for this menu item.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItem.MenuItemOptionSet menu_item_option_set = 7;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet, food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.Builder, food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSetOrBuilder> 
+          getMenuItemOptionSetFieldBuilder() {
+        if (menuItemOptionSetBuilder_ == null) {
+          if (!(pricingCase_ == 7)) {
+            pricing_ = food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.getDefaultInstance();
+          }
+          menuItemOptionSetBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet, food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet.Builder, food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSetOrBuilder>(
+                  (food.menu.v1.FoodMenu.MenuItem.MenuItemOptionSet) pricing_,
+                  getParentForChildren(),
+                  isClean());
+          pricing_ = null;
+        }
+        pricingCase_ = 7;
+        onChanged();
+        return menuItemOptionSetBuilder_;
+      }
+
+      private food.menu.v1.FoodMenu.MenuItemAttributes itemAttributes_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.MenuItemAttributes, food.menu.v1.FoodMenu.MenuItemAttributes.Builder, food.menu.v1.FoodMenu.MenuItemAttributesOrBuilder> itemAttributesBuilder_;
+      /**
+       * <pre>
+       * Attributes about this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 8;</code>
+       * @return Whether the itemAttributes field is set.
+       */
+      public boolean hasItemAttributes() {
+        return ((bitField0_ & 0x00000040) != 0);
+      }
+      /**
+       * <pre>
+       * Attributes about this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 8;</code>
+       * @return The itemAttributes.
+       */
+      public food.menu.v1.FoodMenu.MenuItemAttributes getItemAttributes() {
+        if (itemAttributesBuilder_ == null) {
+          return itemAttributes_ == null ? food.menu.v1.FoodMenu.MenuItemAttributes.getDefaultInstance() : itemAttributes_;
+        } else {
+          return itemAttributesBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * Attributes about this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 8;</code>
+       */
+      public Builder setItemAttributes(food.menu.v1.FoodMenu.MenuItemAttributes value) {
+        if (itemAttributesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          itemAttributes_ = value;
+        } else {
+          itemAttributesBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000040;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Attributes about this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 8;</code>
+       */
+      public Builder setItemAttributes(
+          food.menu.v1.FoodMenu.MenuItemAttributes.Builder builderForValue) {
+        if (itemAttributesBuilder_ == null) {
+          itemAttributes_ = builderForValue.build();
+        } else {
+          itemAttributesBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000040;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Attributes about this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 8;</code>
+       */
+      public Builder mergeItemAttributes(food.menu.v1.FoodMenu.MenuItemAttributes value) {
+        if (itemAttributesBuilder_ == null) {
+          if (((bitField0_ & 0x00000040) != 0) &&
+            itemAttributes_ != null &&
+            itemAttributes_ != food.menu.v1.FoodMenu.MenuItemAttributes.getDefaultInstance()) {
+            getItemAttributesBuilder().mergeFrom(value);
+          } else {
+            itemAttributes_ = value;
+          }
+        } else {
+          itemAttributesBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000040;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Attributes about this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 8;</code>
+       */
+      public Builder clearItemAttributes() {
+        bitField0_ = (bitField0_ & ~0x00000040);
+        itemAttributes_ = null;
+        if (itemAttributesBuilder_ != null) {
+          itemAttributesBuilder_.dispose();
+          itemAttributesBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Attributes about this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 8;</code>
+       */
+      public food.menu.v1.FoodMenu.MenuItemAttributes.Builder getItemAttributesBuilder() {
+        bitField0_ |= 0x00000040;
+        onChanged();
+        return getItemAttributesFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Attributes about this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 8;</code>
+       */
+      public food.menu.v1.FoodMenu.MenuItemAttributesOrBuilder getItemAttributesOrBuilder() {
+        if (itemAttributesBuilder_ != null) {
+          return itemAttributesBuilder_.getMessageOrBuilder();
+        } else {
+          return itemAttributes_ == null ?
+              food.menu.v1.FoodMenu.MenuItemAttributes.getDefaultInstance() : itemAttributes_;
+        }
+      }
+      /**
+       * <pre>
+       * Attributes about this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 8;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.MenuItemAttributes, food.menu.v1.FoodMenu.MenuItemAttributes.Builder, food.menu.v1.FoodMenu.MenuItemAttributesOrBuilder> 
+          getItemAttributesFieldBuilder() {
+        if (itemAttributesBuilder_ == null) {
+          itemAttributesBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.MenuItemAttributes, food.menu.v1.FoodMenu.MenuItemAttributes.Builder, food.menu.v1.FoodMenu.MenuItemAttributesOrBuilder>(
+                  getItemAttributes(),
+                  getParentForChildren(),
+                  isClean());
+          itemAttributes_ = null;
+        }
+        return itemAttributesBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.MenuItem)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.MenuItem)
+    private static final food.menu.v1.FoodMenu.MenuItem DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.MenuItem();
+    }
+
+    public static food.menu.v1.FoodMenu.MenuItem getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<MenuItem>
+        PARSER = new com.google.protobuf.AbstractParser<MenuItem>() {
+      @java.lang.Override
+      public MenuItem parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<MenuItem> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<MenuItem> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuItem getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface MenuItemOptionOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.MenuItemOption)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * An opaque string from an partner which uniquely identifies the
+     * MenuItemOption within the partner feed.
+     * Required.
+     * </pre>
+     *
+     * <code>string menu_item_option_id = 9;</code>
+     * @return The menuItemOptionId.
+     */
+    java.lang.String getMenuItemOptionId();
+    /**
+     * <pre>
+     * An opaque string from an partner which uniquely identifies the
+     * MenuItemOption within the partner feed.
+     * Required.
+     * </pre>
+     *
+     * <code>string menu_item_option_id = 9;</code>
+     * @return The bytes for menuItemOptionId.
+     */
+    com.google.protobuf.ByteString
+        getMenuItemOptionIdBytes();
+
+    /**
+     * <pre>
+     * Option property and value e.g. Size: Small.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemOptionProperty value = 2;</code>
+     * @return Whether the value field is set.
+     */
+    boolean hasValue();
+    /**
+     * <pre>
+     * Option property and value e.g. Size: Small.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemOptionProperty value = 2;</code>
+     * @return The value.
+     */
+    food.menu.v1.FoodMenu.MenuItemOptionProperty getValue();
+    /**
+     * <pre>
+     * Option property and value e.g. Size: Small.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemOptionProperty value = 2;</code>
+     */
+    food.menu.v1.FoodMenu.MenuItemOptionPropertyOrBuilder getValueOrBuilder();
+
+    /**
+     * <pre>
+     * Available offers to purchase this menu item option.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.OfferSet offer_set = 4;</code>
+     * @return Whether the offerSet field is set.
+     */
+    boolean hasOfferSet();
+    /**
+     * <pre>
+     * Available offers to purchase this menu item option.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.OfferSet offer_set = 4;</code>
+     * @return The offerSet.
+     */
+    food.menu.v1.FoodMenu.OfferSet getOfferSet();
+    /**
+     * <pre>
+     * Available offers to purchase this menu item option.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.OfferSet offer_set = 4;</code>
+     */
+    food.menu.v1.FoodMenu.OfferSetOrBuilder getOfferSetOrBuilder();
+
+    /**
+     * <pre>
+     * Attributes about this menu item option.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemAttributes item_attributes = 5;</code>
+     * @return Whether the itemAttributes field is set.
+     */
+    boolean hasItemAttributes();
+    /**
+     * <pre>
+     * Attributes about this menu item option.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemAttributes item_attributes = 5;</code>
+     * @return The itemAttributes.
+     */
+    food.menu.v1.FoodMenu.MenuItemAttributes getItemAttributes();
+    /**
+     * <pre>
+     * Attributes about this menu item option.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemAttributes item_attributes = 5;</code>
+     */
+    food.menu.v1.FoodMenu.MenuItemAttributesOrBuilder getItemAttributesOrBuilder();
+  }
+  /**
+   * <pre>
+   * Describes choices that a user would be required to make when selecting a
+   * dish / combo. The user must select an option, otherwise the order is
+   * considered invalid (e.g. the user must choose small, medium, or large for a
+   * pizza).
+   * </pre>
+   *
+   * Protobuf type {@code food.menu.v1.MenuItemOption}
+   */
+  public static final class MenuItemOption extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.MenuItemOption)
+      MenuItemOptionOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use MenuItemOption.newBuilder() to construct.
+    private MenuItemOption(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private MenuItemOption() {
+      menuItemOptionId_ = "";
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new MenuItemOption();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItemOption_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItemOption_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.MenuItemOption.class, food.menu.v1.FoodMenu.MenuItemOption.Builder.class);
+    }
+
+    public static final int MENU_ITEM_OPTION_ID_FIELD_NUMBER = 9;
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object menuItemOptionId_ = "";
+    /**
+     * <pre>
+     * An opaque string from an partner which uniquely identifies the
+     * MenuItemOption within the partner feed.
+     * Required.
+     * </pre>
+     *
+     * <code>string menu_item_option_id = 9;</code>
+     * @return The menuItemOptionId.
+     */
+    @java.lang.Override
+    public java.lang.String getMenuItemOptionId() {
+      java.lang.Object ref = menuItemOptionId_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        menuItemOptionId_ = s;
+        return s;
+      }
+    }
+    /**
+     * <pre>
+     * An opaque string from an partner which uniquely identifies the
+     * MenuItemOption within the partner feed.
+     * Required.
+     * </pre>
+     *
+     * <code>string menu_item_option_id = 9;</code>
+     * @return The bytes for menuItemOptionId.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getMenuItemOptionIdBytes() {
+      java.lang.Object ref = menuItemOptionId_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        menuItemOptionId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int VALUE_FIELD_NUMBER = 2;
+    private food.menu.v1.FoodMenu.MenuItemOptionProperty value_;
+    /**
+     * <pre>
+     * Option property and value e.g. Size: Small.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemOptionProperty value = 2;</code>
+     * @return Whether the value field is set.
+     */
+    @java.lang.Override
+    public boolean hasValue() {
+      return value_ != null;
+    }
+    /**
+     * <pre>
+     * Option property and value e.g. Size: Small.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemOptionProperty value = 2;</code>
+     * @return The value.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuItemOptionProperty getValue() {
+      return value_ == null ? food.menu.v1.FoodMenu.MenuItemOptionProperty.getDefaultInstance() : value_;
+    }
+    /**
+     * <pre>
+     * Option property and value e.g. Size: Small.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemOptionProperty value = 2;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuItemOptionPropertyOrBuilder getValueOrBuilder() {
+      return value_ == null ? food.menu.v1.FoodMenu.MenuItemOptionProperty.getDefaultInstance() : value_;
+    }
+
+    public static final int OFFER_SET_FIELD_NUMBER = 4;
+    private food.menu.v1.FoodMenu.OfferSet offerSet_;
+    /**
+     * <pre>
+     * Available offers to purchase this menu item option.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.OfferSet offer_set = 4;</code>
+     * @return Whether the offerSet field is set.
+     */
+    @java.lang.Override
+    public boolean hasOfferSet() {
+      return offerSet_ != null;
+    }
+    /**
+     * <pre>
+     * Available offers to purchase this menu item option.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.OfferSet offer_set = 4;</code>
+     * @return The offerSet.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.OfferSet getOfferSet() {
+      return offerSet_ == null ? food.menu.v1.FoodMenu.OfferSet.getDefaultInstance() : offerSet_;
+    }
+    /**
+     * <pre>
+     * Available offers to purchase this menu item option.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.OfferSet offer_set = 4;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.OfferSetOrBuilder getOfferSetOrBuilder() {
+      return offerSet_ == null ? food.menu.v1.FoodMenu.OfferSet.getDefaultInstance() : offerSet_;
+    }
+
+    public static final int ITEM_ATTRIBUTES_FIELD_NUMBER = 5;
+    private food.menu.v1.FoodMenu.MenuItemAttributes itemAttributes_;
+    /**
+     * <pre>
+     * Attributes about this menu item option.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemAttributes item_attributes = 5;</code>
+     * @return Whether the itemAttributes field is set.
+     */
+    @java.lang.Override
+    public boolean hasItemAttributes() {
+      return itemAttributes_ != null;
+    }
+    /**
+     * <pre>
+     * Attributes about this menu item option.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemAttributes item_attributes = 5;</code>
+     * @return The itemAttributes.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuItemAttributes getItemAttributes() {
+      return itemAttributes_ == null ? food.menu.v1.FoodMenu.MenuItemAttributes.getDefaultInstance() : itemAttributes_;
+    }
+    /**
+     * <pre>
+     * Attributes about this menu item option.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemAttributes item_attributes = 5;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuItemAttributesOrBuilder getItemAttributesOrBuilder() {
+      return itemAttributes_ == null ? food.menu.v1.FoodMenu.MenuItemAttributes.getDefaultInstance() : itemAttributes_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (value_ != null) {
+        output.writeMessage(2, getValue());
+      }
+      if (offerSet_ != null) {
+        output.writeMessage(4, getOfferSet());
+      }
+      if (itemAttributes_ != null) {
+        output.writeMessage(5, getItemAttributes());
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(menuItemOptionId_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 9, menuItemOptionId_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (value_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getValue());
+      }
+      if (offerSet_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, getOfferSet());
+      }
+      if (itemAttributes_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(5, getItemAttributes());
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(menuItemOptionId_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(9, menuItemOptionId_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.MenuItemOption)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.MenuItemOption other = (food.menu.v1.FoodMenu.MenuItemOption) obj;
+
+      if (!getMenuItemOptionId()
+          .equals(other.getMenuItemOptionId())) return false;
+      if (hasValue() != other.hasValue()) return false;
+      if (hasValue()) {
+        if (!getValue()
+            .equals(other.getValue())) return false;
+      }
+      if (hasOfferSet() != other.hasOfferSet()) return false;
+      if (hasOfferSet()) {
+        if (!getOfferSet()
+            .equals(other.getOfferSet())) return false;
+      }
+      if (hasItemAttributes() != other.hasItemAttributes()) return false;
+      if (hasItemAttributes()) {
+        if (!getItemAttributes()
+            .equals(other.getItemAttributes())) return false;
+      }
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + MENU_ITEM_OPTION_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getMenuItemOptionId().hashCode();
+      if (hasValue()) {
+        hash = (37 * hash) + VALUE_FIELD_NUMBER;
+        hash = (53 * hash) + getValue().hashCode();
+      }
+      if (hasOfferSet()) {
+        hash = (37 * hash) + OFFER_SET_FIELD_NUMBER;
+        hash = (53 * hash) + getOfferSet().hashCode();
+      }
+      if (hasItemAttributes()) {
+        hash = (37 * hash) + ITEM_ATTRIBUTES_FIELD_NUMBER;
+        hash = (53 * hash) + getItemAttributes().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.MenuItemOption parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOption parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOption parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOption parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOption parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOption parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOption parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOption parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOption parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOption parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOption parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOption parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.MenuItemOption prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * Describes choices that a user would be required to make when selecting a
+     * dish / combo. The user must select an option, otherwise the order is
+     * considered invalid (e.g. the user must choose small, medium, or large for a
+     * pizza).
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.MenuItemOption}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.MenuItemOption)
+        food.menu.v1.FoodMenu.MenuItemOptionOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItemOption_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItemOption_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.MenuItemOption.class, food.menu.v1.FoodMenu.MenuItemOption.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.MenuItemOption.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        menuItemOptionId_ = "";
+        value_ = null;
+        if (valueBuilder_ != null) {
+          valueBuilder_.dispose();
+          valueBuilder_ = null;
+        }
+        offerSet_ = null;
+        if (offerSetBuilder_ != null) {
+          offerSetBuilder_.dispose();
+          offerSetBuilder_ = null;
+        }
+        itemAttributes_ = null;
+        if (itemAttributesBuilder_ != null) {
+          itemAttributesBuilder_.dispose();
+          itemAttributesBuilder_ = null;
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItemOption_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItemOption getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.MenuItemOption.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItemOption build() {
+        food.menu.v1.FoodMenu.MenuItemOption result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItemOption buildPartial() {
+        food.menu.v1.FoodMenu.MenuItemOption result = new food.menu.v1.FoodMenu.MenuItemOption(this);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.MenuItemOption result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.menuItemOptionId_ = menuItemOptionId_;
+        }
+        if (((from_bitField0_ & 0x00000002) != 0)) {
+          result.value_ = valueBuilder_ == null
+              ? value_
+              : valueBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000004) != 0)) {
+          result.offerSet_ = offerSetBuilder_ == null
+              ? offerSet_
+              : offerSetBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000008) != 0)) {
+          result.itemAttributes_ = itemAttributesBuilder_ == null
+              ? itemAttributes_
+              : itemAttributesBuilder_.build();
+        }
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.MenuItemOption) {
+          return mergeFrom((food.menu.v1.FoodMenu.MenuItemOption)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.MenuItemOption other) {
+        if (other == food.menu.v1.FoodMenu.MenuItemOption.getDefaultInstance()) return this;
+        if (!other.getMenuItemOptionId().isEmpty()) {
+          menuItemOptionId_ = other.menuItemOptionId_;
+          bitField0_ |= 0x00000001;
+          onChanged();
+        }
+        if (other.hasValue()) {
+          mergeValue(other.getValue());
+        }
+        if (other.hasOfferSet()) {
+          mergeOfferSet(other.getOfferSet());
+        }
+        if (other.hasItemAttributes()) {
+          mergeItemAttributes(other.getItemAttributes());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 18: {
+                input.readMessage(
+                    getValueFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000002;
+                break;
+              } // case 18
+              case 34: {
+                input.readMessage(
+                    getOfferSetFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000004;
+                break;
+              } // case 34
+              case 42: {
+                input.readMessage(
+                    getItemAttributesFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000008;
+                break;
+              } // case 42
+              case 74: {
+                menuItemOptionId_ = input.readStringRequireUtf8();
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 74
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int bitField0_;
+
+      private java.lang.Object menuItemOptionId_ = "";
+      /**
+       * <pre>
+       * An opaque string from an partner which uniquely identifies the
+       * MenuItemOption within the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_item_option_id = 9;</code>
+       * @return The menuItemOptionId.
+       */
+      public java.lang.String getMenuItemOptionId() {
+        java.lang.Object ref = menuItemOptionId_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          menuItemOptionId_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <pre>
+       * An opaque string from an partner which uniquely identifies the
+       * MenuItemOption within the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_item_option_id = 9;</code>
+       * @return The bytes for menuItemOptionId.
+       */
+      public com.google.protobuf.ByteString
+          getMenuItemOptionIdBytes() {
+        java.lang.Object ref = menuItemOptionId_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          menuItemOptionId_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <pre>
+       * An opaque string from an partner which uniquely identifies the
+       * MenuItemOption within the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_item_option_id = 9;</code>
+       * @param value The menuItemOptionId to set.
+       * @return This builder for chaining.
+       */
+      public Builder setMenuItemOptionId(
+          java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        menuItemOptionId_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * An opaque string from an partner which uniquely identifies the
+       * MenuItemOption within the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_item_option_id = 9;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearMenuItemOptionId() {
+        menuItemOptionId_ = getDefaultInstance().getMenuItemOptionId();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * An opaque string from an partner which uniquely identifies the
+       * MenuItemOption within the partner feed.
+       * Required.
+       * </pre>
+       *
+       * <code>string menu_item_option_id = 9;</code>
+       * @param value The bytes for menuItemOptionId to set.
+       * @return This builder for chaining.
+       */
+      public Builder setMenuItemOptionIdBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) { throw new NullPointerException(); }
+        checkByteStringIsUtf8(value);
+        menuItemOptionId_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+
+      private food.menu.v1.FoodMenu.MenuItemOptionProperty value_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.MenuItemOptionProperty, food.menu.v1.FoodMenu.MenuItemOptionProperty.Builder, food.menu.v1.FoodMenu.MenuItemOptionPropertyOrBuilder> valueBuilder_;
+      /**
+       * <pre>
+       * Option property and value e.g. Size: Small.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty value = 2;</code>
+       * @return Whether the value field is set.
+       */
+      public boolean hasValue() {
+        return ((bitField0_ & 0x00000002) != 0);
+      }
+      /**
+       * <pre>
+       * Option property and value e.g. Size: Small.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty value = 2;</code>
+       * @return The value.
+       */
+      public food.menu.v1.FoodMenu.MenuItemOptionProperty getValue() {
+        if (valueBuilder_ == null) {
+          return value_ == null ? food.menu.v1.FoodMenu.MenuItemOptionProperty.getDefaultInstance() : value_;
+        } else {
+          return valueBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * Option property and value e.g. Size: Small.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty value = 2;</code>
+       */
+      public Builder setValue(food.menu.v1.FoodMenu.MenuItemOptionProperty value) {
+        if (valueBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          value_ = value;
+        } else {
+          valueBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Option property and value e.g. Size: Small.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty value = 2;</code>
+       */
+      public Builder setValue(
+          food.menu.v1.FoodMenu.MenuItemOptionProperty.Builder builderForValue) {
+        if (valueBuilder_ == null) {
+          value_ = builderForValue.build();
+        } else {
+          valueBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Option property and value e.g. Size: Small.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty value = 2;</code>
+       */
+      public Builder mergeValue(food.menu.v1.FoodMenu.MenuItemOptionProperty value) {
+        if (valueBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) != 0) &&
+            value_ != null &&
+            value_ != food.menu.v1.FoodMenu.MenuItemOptionProperty.getDefaultInstance()) {
+            getValueBuilder().mergeFrom(value);
+          } else {
+            value_ = value;
+          }
+        } else {
+          valueBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Option property and value e.g. Size: Small.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty value = 2;</code>
+       */
+      public Builder clearValue() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        value_ = null;
+        if (valueBuilder_ != null) {
+          valueBuilder_.dispose();
+          valueBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Option property and value e.g. Size: Small.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty value = 2;</code>
+       */
+      public food.menu.v1.FoodMenu.MenuItemOptionProperty.Builder getValueBuilder() {
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return getValueFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Option property and value e.g. Size: Small.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty value = 2;</code>
+       */
+      public food.menu.v1.FoodMenu.MenuItemOptionPropertyOrBuilder getValueOrBuilder() {
+        if (valueBuilder_ != null) {
+          return valueBuilder_.getMessageOrBuilder();
+        } else {
+          return value_ == null ?
+              food.menu.v1.FoodMenu.MenuItemOptionProperty.getDefaultInstance() : value_;
+        }
+      }
+      /**
+       * <pre>
+       * Option property and value e.g. Size: Small.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty value = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.MenuItemOptionProperty, food.menu.v1.FoodMenu.MenuItemOptionProperty.Builder, food.menu.v1.FoodMenu.MenuItemOptionPropertyOrBuilder> 
+          getValueFieldBuilder() {
+        if (valueBuilder_ == null) {
+          valueBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.MenuItemOptionProperty, food.menu.v1.FoodMenu.MenuItemOptionProperty.Builder, food.menu.v1.FoodMenu.MenuItemOptionPropertyOrBuilder>(
+                  getValue(),
+                  getParentForChildren(),
+                  isClean());
+          value_ = null;
+        }
+        return valueBuilder_;
+      }
+
+      private food.menu.v1.FoodMenu.OfferSet offerSet_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.OfferSet, food.menu.v1.FoodMenu.OfferSet.Builder, food.menu.v1.FoodMenu.OfferSetOrBuilder> offerSetBuilder_;
+      /**
+       * <pre>
+       * Available offers to purchase this menu item option.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 4;</code>
+       * @return Whether the offerSet field is set.
+       */
+      public boolean hasOfferSet() {
+        return ((bitField0_ & 0x00000004) != 0);
+      }
+      /**
+       * <pre>
+       * Available offers to purchase this menu item option.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 4;</code>
+       * @return The offerSet.
+       */
+      public food.menu.v1.FoodMenu.OfferSet getOfferSet() {
+        if (offerSetBuilder_ == null) {
+          return offerSet_ == null ? food.menu.v1.FoodMenu.OfferSet.getDefaultInstance() : offerSet_;
+        } else {
+          return offerSetBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * Available offers to purchase this menu item option.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 4;</code>
+       */
+      public Builder setOfferSet(food.menu.v1.FoodMenu.OfferSet value) {
+        if (offerSetBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          offerSet_ = value;
+        } else {
+          offerSetBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Available offers to purchase this menu item option.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 4;</code>
+       */
+      public Builder setOfferSet(
+          food.menu.v1.FoodMenu.OfferSet.Builder builderForValue) {
+        if (offerSetBuilder_ == null) {
+          offerSet_ = builderForValue.build();
+        } else {
+          offerSetBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Available offers to purchase this menu item option.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 4;</code>
+       */
+      public Builder mergeOfferSet(food.menu.v1.FoodMenu.OfferSet value) {
+        if (offerSetBuilder_ == null) {
+          if (((bitField0_ & 0x00000004) != 0) &&
+            offerSet_ != null &&
+            offerSet_ != food.menu.v1.FoodMenu.OfferSet.getDefaultInstance()) {
+            getOfferSetBuilder().mergeFrom(value);
+          } else {
+            offerSet_ = value;
+          }
+        } else {
+          offerSetBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Available offers to purchase this menu item option.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 4;</code>
+       */
+      public Builder clearOfferSet() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        offerSet_ = null;
+        if (offerSetBuilder_ != null) {
+          offerSetBuilder_.dispose();
+          offerSetBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Available offers to purchase this menu item option.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.OfferSet.Builder getOfferSetBuilder() {
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return getOfferSetFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Available offers to purchase this menu item option.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.OfferSetOrBuilder getOfferSetOrBuilder() {
+        if (offerSetBuilder_ != null) {
+          return offerSetBuilder_.getMessageOrBuilder();
+        } else {
+          return offerSet_ == null ?
+              food.menu.v1.FoodMenu.OfferSet.getDefaultInstance() : offerSet_;
+        }
+      }
+      /**
+       * <pre>
+       * Available offers to purchase this menu item option.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.OfferSet offer_set = 4;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.OfferSet, food.menu.v1.FoodMenu.OfferSet.Builder, food.menu.v1.FoodMenu.OfferSetOrBuilder> 
+          getOfferSetFieldBuilder() {
+        if (offerSetBuilder_ == null) {
+          offerSetBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.OfferSet, food.menu.v1.FoodMenu.OfferSet.Builder, food.menu.v1.FoodMenu.OfferSetOrBuilder>(
+                  getOfferSet(),
+                  getParentForChildren(),
+                  isClean());
+          offerSet_ = null;
+        }
+        return offerSetBuilder_;
+      }
+
+      private food.menu.v1.FoodMenu.MenuItemAttributes itemAttributes_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.MenuItemAttributes, food.menu.v1.FoodMenu.MenuItemAttributes.Builder, food.menu.v1.FoodMenu.MenuItemAttributesOrBuilder> itemAttributesBuilder_;
+      /**
+       * <pre>
+       * Attributes about this menu item option.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 5;</code>
+       * @return Whether the itemAttributes field is set.
+       */
+      public boolean hasItemAttributes() {
+        return ((bitField0_ & 0x00000008) != 0);
+      }
+      /**
+       * <pre>
+       * Attributes about this menu item option.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 5;</code>
+       * @return The itemAttributes.
+       */
+      public food.menu.v1.FoodMenu.MenuItemAttributes getItemAttributes() {
+        if (itemAttributesBuilder_ == null) {
+          return itemAttributes_ == null ? food.menu.v1.FoodMenu.MenuItemAttributes.getDefaultInstance() : itemAttributes_;
+        } else {
+          return itemAttributesBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * Attributes about this menu item option.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 5;</code>
+       */
+      public Builder setItemAttributes(food.menu.v1.FoodMenu.MenuItemAttributes value) {
+        if (itemAttributesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          itemAttributes_ = value;
+        } else {
+          itemAttributesBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Attributes about this menu item option.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 5;</code>
+       */
+      public Builder setItemAttributes(
+          food.menu.v1.FoodMenu.MenuItemAttributes.Builder builderForValue) {
+        if (itemAttributesBuilder_ == null) {
+          itemAttributes_ = builderForValue.build();
+        } else {
+          itemAttributesBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Attributes about this menu item option.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 5;</code>
+       */
+      public Builder mergeItemAttributes(food.menu.v1.FoodMenu.MenuItemAttributes value) {
+        if (itemAttributesBuilder_ == null) {
+          if (((bitField0_ & 0x00000008) != 0) &&
+            itemAttributes_ != null &&
+            itemAttributes_ != food.menu.v1.FoodMenu.MenuItemAttributes.getDefaultInstance()) {
+            getItemAttributesBuilder().mergeFrom(value);
+          } else {
+            itemAttributes_ = value;
+          }
+        } else {
+          itemAttributesBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Attributes about this menu item option.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 5;</code>
+       */
+      public Builder clearItemAttributes() {
+        bitField0_ = (bitField0_ & ~0x00000008);
+        itemAttributes_ = null;
+        if (itemAttributesBuilder_ != null) {
+          itemAttributesBuilder_.dispose();
+          itemAttributesBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Attributes about this menu item option.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 5;</code>
+       */
+      public food.menu.v1.FoodMenu.MenuItemAttributes.Builder getItemAttributesBuilder() {
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return getItemAttributesFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Attributes about this menu item option.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 5;</code>
+       */
+      public food.menu.v1.FoodMenu.MenuItemAttributesOrBuilder getItemAttributesOrBuilder() {
+        if (itemAttributesBuilder_ != null) {
+          return itemAttributesBuilder_.getMessageOrBuilder();
+        } else {
+          return itemAttributes_ == null ?
+              food.menu.v1.FoodMenu.MenuItemAttributes.getDefaultInstance() : itemAttributes_;
+        }
+      }
+      /**
+       * <pre>
+       * Attributes about this menu item option.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemAttributes item_attributes = 5;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.MenuItemAttributes, food.menu.v1.FoodMenu.MenuItemAttributes.Builder, food.menu.v1.FoodMenu.MenuItemAttributesOrBuilder> 
+          getItemAttributesFieldBuilder() {
+        if (itemAttributesBuilder_ == null) {
+          itemAttributesBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.MenuItemAttributes, food.menu.v1.FoodMenu.MenuItemAttributes.Builder, food.menu.v1.FoodMenu.MenuItemAttributesOrBuilder>(
+                  getItemAttributes(),
+                  getParentForChildren(),
+                  isClean());
+          itemAttributes_ = null;
+        }
+        return itemAttributesBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.MenuItemOption)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.MenuItemOption)
+    private static final food.menu.v1.FoodMenu.MenuItemOption DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.MenuItemOption();
+    }
+
+    public static food.menu.v1.FoodMenu.MenuItemOption getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<MenuItemOption>
+        PARSER = new com.google.protobuf.AbstractParser<MenuItemOption>() {
+      @java.lang.Override
+      public MenuItemOption parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<MenuItemOption> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<MenuItemOption> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuItemOption getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface MenuItemAttributesOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.MenuItemAttributes)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * Number of servings available in a given menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional int32 number_of_servings = 1;</code>
+     * @return Whether the numberOfServings field is set.
+     */
+    boolean hasNumberOfServings();
+    /**
+     * <pre>
+     * Number of servings available in a given menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional int32 number_of_servings = 1;</code>
+     * @return The numberOfServings.
+     */
+    int getNumberOfServings();
+
+    /**
+     * <pre>
+     * Describes all the nutritional information of the item, e.g. calories, fat
+     * content.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation nutrition_information = 2;</code>
+     * @return Whether the nutritionInformation field is set.
+     */
+    boolean hasNutritionInformation();
+    /**
+     * <pre>
+     * Describes all the nutritional information of the item, e.g. calories, fat
+     * content.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation nutrition_information = 2;</code>
+     * @return The nutritionInformation.
+     */
+    food.menu.v1.FoodMenu.NutritionInformation getNutritionInformation();
+    /**
+     * <pre>
+     * Describes all the nutritional information of the item, e.g. calories, fat
+     * content.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation nutrition_information = 2;</code>
+     */
+    food.menu.v1.FoodMenu.NutritionInformationOrBuilder getNutritionInformationOrBuilder();
+
+    /**
+     * <pre>
+     * The dietary restrictions that this menu item complies with.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+     * @return A list containing the suitableDiets.
+     */
+    java.util.List<food.menu.v1.FoodMenu.DietaryRestriction> getSuitableDietsList();
+    /**
+     * <pre>
+     * The dietary restrictions that this menu item complies with.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+     * @return The count of suitableDiets.
+     */
+    int getSuitableDietsCount();
+    /**
+     * <pre>
+     * The dietary restrictions that this menu item complies with.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+     * @param index The index of the element to return.
+     * @return The suitableDiets at the given index.
+     */
+    food.menu.v1.FoodMenu.DietaryRestriction getSuitableDiets(int index);
+    /**
+     * <pre>
+     * The dietary restrictions that this menu item complies with.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+     * @return A list containing the enum numeric values on the wire for suitableDiets.
+     */
+    java.util.List<java.lang.Integer>
+    getSuitableDietsValueList();
+    /**
+     * <pre>
+     * The dietary restrictions that this menu item complies with.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+     * @param index The index of the value to return.
+     * @return The enum numeric value on the wire of suitableDiets at the given index.
+     */
+    int getSuitableDietsValue(int index);
+
+    /**
+     * <pre>
+     * Additives of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+     */
+    java.util.List<food.menu.v1.FoodMenu.Additive> 
+        getAdditiveList();
+    /**
+     * <pre>
+     * Additives of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+     */
+    food.menu.v1.FoodMenu.Additive getAdditive(int index);
+    /**
+     * <pre>
+     * Additives of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+     */
+    int getAdditiveCount();
+    /**
+     * <pre>
+     * Additives of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+     */
+    java.util.List<? extends food.menu.v1.FoodMenu.AdditiveOrBuilder> 
+        getAdditiveOrBuilderList();
+    /**
+     * <pre>
+     * Additives of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+     */
+    food.menu.v1.FoodMenu.AdditiveOrBuilder getAdditiveOrBuilder(
+        int index);
+
+    /**
+     * <pre>
+     * Allergens of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+     */
+    java.util.List<food.menu.v1.FoodMenu.Allergen> 
+        getAllergenList();
+    /**
+     * <pre>
+     * Allergens of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+     */
+    food.menu.v1.FoodMenu.Allergen getAllergen(int index);
+    /**
+     * <pre>
+     * Allergens of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+     */
+    int getAllergenCount();
+    /**
+     * <pre>
+     * Allergens of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+     */
+    java.util.List<? extends food.menu.v1.FoodMenu.AllergenOrBuilder> 
+        getAllergenOrBuilderList();
+    /**
+     * <pre>
+     * Allergens of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+     */
+    food.menu.v1.FoodMenu.AllergenOrBuilder getAllergenOrBuilder(
+        int index);
+
+    /**
+     * <pre>
+     * Packaging and recycling information of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.DepositInfo packaging_deposit_info = 6;</code>
+     * @return Whether the packagingDepositInfo field is set.
+     */
+    boolean hasPackagingDepositInfo();
+    /**
+     * <pre>
+     * Packaging and recycling information of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.DepositInfo packaging_deposit_info = 6;</code>
+     * @return The packagingDepositInfo.
+     */
+    food.menu.v1.FoodMenu.DepositInfo getPackagingDepositInfo();
+    /**
+     * <pre>
+     * Packaging and recycling information of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.DepositInfo packaging_deposit_info = 6;</code>
+     */
+    food.menu.v1.FoodMenu.DepositInfoOrBuilder getPackagingDepositInfoOrBuilder();
+  }
+  /**
+   * <pre>
+   * Describes attributes about a particular menu item or option.
+   * </pre>
+   *
+   * Protobuf type {@code food.menu.v1.MenuItemAttributes}
+   */
+  public static final class MenuItemAttributes extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.MenuItemAttributes)
+      MenuItemAttributesOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use MenuItemAttributes.newBuilder() to construct.
+    private MenuItemAttributes(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private MenuItemAttributes() {
+      suitableDiets_ = java.util.Collections.emptyList();
+      additive_ = java.util.Collections.emptyList();
+      allergen_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new MenuItemAttributes();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItemAttributes_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItemAttributes_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.MenuItemAttributes.class, food.menu.v1.FoodMenu.MenuItemAttributes.Builder.class);
+    }
+
+    private int bitField0_;
+    public static final int NUMBER_OF_SERVINGS_FIELD_NUMBER = 1;
+    private int numberOfServings_ = 0;
+    /**
+     * <pre>
+     * Number of servings available in a given menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional int32 number_of_servings = 1;</code>
+     * @return Whether the numberOfServings field is set.
+     */
+    @java.lang.Override
+    public boolean hasNumberOfServings() {
+      return ((bitField0_ & 0x00000001) != 0);
+    }
+    /**
+     * <pre>
+     * Number of servings available in a given menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional int32 number_of_servings = 1;</code>
+     * @return The numberOfServings.
+     */
+    @java.lang.Override
+    public int getNumberOfServings() {
+      return numberOfServings_;
+    }
+
+    public static final int NUTRITION_INFORMATION_FIELD_NUMBER = 2;
+    private food.menu.v1.FoodMenu.NutritionInformation nutritionInformation_;
+    /**
+     * <pre>
+     * Describes all the nutritional information of the item, e.g. calories, fat
+     * content.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation nutrition_information = 2;</code>
+     * @return Whether the nutritionInformation field is set.
+     */
+    @java.lang.Override
+    public boolean hasNutritionInformation() {
+      return nutritionInformation_ != null;
+    }
+    /**
+     * <pre>
+     * Describes all the nutritional information of the item, e.g. calories, fat
+     * content.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation nutrition_information = 2;</code>
+     * @return The nutritionInformation.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.NutritionInformation getNutritionInformation() {
+      return nutritionInformation_ == null ? food.menu.v1.FoodMenu.NutritionInformation.getDefaultInstance() : nutritionInformation_;
+    }
+    /**
+     * <pre>
+     * Describes all the nutritional information of the item, e.g. calories, fat
+     * content.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation nutrition_information = 2;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.NutritionInformationOrBuilder getNutritionInformationOrBuilder() {
+      return nutritionInformation_ == null ? food.menu.v1.FoodMenu.NutritionInformation.getDefaultInstance() : nutritionInformation_;
+    }
+
+    public static final int SUITABLE_DIETS_FIELD_NUMBER = 3;
+    @SuppressWarnings("serial")
+    private java.util.List<java.lang.Integer> suitableDiets_;
+    private static final com.google.protobuf.Internal.ListAdapter.Converter<
+        java.lang.Integer, food.menu.v1.FoodMenu.DietaryRestriction> suitableDiets_converter_ =
+            new com.google.protobuf.Internal.ListAdapter.Converter<
+                java.lang.Integer, food.menu.v1.FoodMenu.DietaryRestriction>() {
+              public food.menu.v1.FoodMenu.DietaryRestriction convert(java.lang.Integer from) {
+                food.menu.v1.FoodMenu.DietaryRestriction result = food.menu.v1.FoodMenu.DietaryRestriction.forNumber(from);
+                return result == null ? food.menu.v1.FoodMenu.DietaryRestriction.UNRECOGNIZED : result;
+              }
+            };
+    /**
+     * <pre>
+     * The dietary restrictions that this menu item complies with.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+     * @return A list containing the suitableDiets.
+     */
+    @java.lang.Override
+    public java.util.List<food.menu.v1.FoodMenu.DietaryRestriction> getSuitableDietsList() {
+      return new com.google.protobuf.Internal.ListAdapter<
+          java.lang.Integer, food.menu.v1.FoodMenu.DietaryRestriction>(suitableDiets_, suitableDiets_converter_);
+    }
+    /**
+     * <pre>
+     * The dietary restrictions that this menu item complies with.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+     * @return The count of suitableDiets.
+     */
+    @java.lang.Override
+    public int getSuitableDietsCount() {
+      return suitableDiets_.size();
+    }
+    /**
+     * <pre>
+     * The dietary restrictions that this menu item complies with.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+     * @param index The index of the element to return.
+     * @return The suitableDiets at the given index.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.DietaryRestriction getSuitableDiets(int index) {
+      return suitableDiets_converter_.convert(suitableDiets_.get(index));
+    }
+    /**
+     * <pre>
+     * The dietary restrictions that this menu item complies with.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+     * @return A list containing the enum numeric values on the wire for suitableDiets.
+     */
+    @java.lang.Override
+    public java.util.List<java.lang.Integer>
+    getSuitableDietsValueList() {
+      return suitableDiets_;
+    }
+    /**
+     * <pre>
+     * The dietary restrictions that this menu item complies with.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+     * @param index The index of the value to return.
+     * @return The enum numeric value on the wire of suitableDiets at the given index.
+     */
+    @java.lang.Override
+    public int getSuitableDietsValue(int index) {
+      return suitableDiets_.get(index);
+    }
+    private int suitableDietsMemoizedSerializedSize;
+
+    public static final int ADDITIVE_FIELD_NUMBER = 4;
+    @SuppressWarnings("serial")
+    private java.util.List<food.menu.v1.FoodMenu.Additive> additive_;
+    /**
+     * <pre>
+     * Additives of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+     */
+    @java.lang.Override
+    public java.util.List<food.menu.v1.FoodMenu.Additive> getAdditiveList() {
+      return additive_;
+    }
+    /**
+     * <pre>
+     * Additives of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends food.menu.v1.FoodMenu.AdditiveOrBuilder> 
+        getAdditiveOrBuilderList() {
+      return additive_;
+    }
+    /**
+     * <pre>
+     * Additives of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+     */
+    @java.lang.Override
+    public int getAdditiveCount() {
+      return additive_.size();
+    }
+    /**
+     * <pre>
+     * Additives of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.Additive getAdditive(int index) {
+      return additive_.get(index);
+    }
+    /**
+     * <pre>
+     * Additives of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.AdditiveOrBuilder getAdditiveOrBuilder(
+        int index) {
+      return additive_.get(index);
+    }
+
+    public static final int ALLERGEN_FIELD_NUMBER = 5;
+    @SuppressWarnings("serial")
+    private java.util.List<food.menu.v1.FoodMenu.Allergen> allergen_;
+    /**
+     * <pre>
+     * Allergens of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+     */
+    @java.lang.Override
+    public java.util.List<food.menu.v1.FoodMenu.Allergen> getAllergenList() {
+      return allergen_;
+    }
+    /**
+     * <pre>
+     * Allergens of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends food.menu.v1.FoodMenu.AllergenOrBuilder> 
+        getAllergenOrBuilderList() {
+      return allergen_;
+    }
+    /**
+     * <pre>
+     * Allergens of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+     */
+    @java.lang.Override
+    public int getAllergenCount() {
+      return allergen_.size();
+    }
+    /**
+     * <pre>
+     * Allergens of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.Allergen getAllergen(int index) {
+      return allergen_.get(index);
+    }
+    /**
+     * <pre>
+     * Allergens of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.AllergenOrBuilder getAllergenOrBuilder(
+        int index) {
+      return allergen_.get(index);
+    }
+
+    public static final int PACKAGING_DEPOSIT_INFO_FIELD_NUMBER = 6;
+    private food.menu.v1.FoodMenu.DepositInfo packagingDepositInfo_;
+    /**
+     * <pre>
+     * Packaging and recycling information of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.DepositInfo packaging_deposit_info = 6;</code>
+     * @return Whether the packagingDepositInfo field is set.
+     */
+    @java.lang.Override
+    public boolean hasPackagingDepositInfo() {
+      return packagingDepositInfo_ != null;
+    }
+    /**
+     * <pre>
+     * Packaging and recycling information of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.DepositInfo packaging_deposit_info = 6;</code>
+     * @return The packagingDepositInfo.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.DepositInfo getPackagingDepositInfo() {
+      return packagingDepositInfo_ == null ? food.menu.v1.FoodMenu.DepositInfo.getDefaultInstance() : packagingDepositInfo_;
+    }
+    /**
+     * <pre>
+     * Packaging and recycling information of this menu item.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.DepositInfo packaging_deposit_info = 6;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.DepositInfoOrBuilder getPackagingDepositInfoOrBuilder() {
+      return packagingDepositInfo_ == null ? food.menu.v1.FoodMenu.DepositInfo.getDefaultInstance() : packagingDepositInfo_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) != 0)) {
+        output.writeInt32(1, numberOfServings_);
+      }
+      if (nutritionInformation_ != null) {
+        output.writeMessage(2, getNutritionInformation());
+      }
+      if (getSuitableDietsList().size() > 0) {
+        output.writeUInt32NoTag(26);
+        output.writeUInt32NoTag(suitableDietsMemoizedSerializedSize);
+      }
+      for (int i = 0; i < suitableDiets_.size(); i++) {
+        output.writeEnumNoTag(suitableDiets_.get(i));
+      }
+      for (int i = 0; i < additive_.size(); i++) {
+        output.writeMessage(4, additive_.get(i));
+      }
+      for (int i = 0; i < allergen_.size(); i++) {
+        output.writeMessage(5, allergen_.get(i));
+      }
+      if (packagingDepositInfo_ != null) {
+        output.writeMessage(6, getPackagingDepositInfo());
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) != 0)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(1, numberOfServings_);
+      }
+      if (nutritionInformation_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getNutritionInformation());
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < suitableDiets_.size(); i++) {
+          dataSize += com.google.protobuf.CodedOutputStream
+            .computeEnumSizeNoTag(suitableDiets_.get(i));
+        }
+        size += dataSize;
+        if (!getSuitableDietsList().isEmpty()) {  size += 1;
+          size += com.google.protobuf.CodedOutputStream
+            .computeUInt32SizeNoTag(dataSize);
+        }suitableDietsMemoizedSerializedSize = dataSize;
+      }
+      for (int i = 0; i < additive_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, additive_.get(i));
+      }
+      for (int i = 0; i < allergen_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(5, allergen_.get(i));
+      }
+      if (packagingDepositInfo_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(6, getPackagingDepositInfo());
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.MenuItemAttributes)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.MenuItemAttributes other = (food.menu.v1.FoodMenu.MenuItemAttributes) obj;
+
+      if (hasNumberOfServings() != other.hasNumberOfServings()) return false;
+      if (hasNumberOfServings()) {
+        if (getNumberOfServings()
+            != other.getNumberOfServings()) return false;
+      }
+      if (hasNutritionInformation() != other.hasNutritionInformation()) return false;
+      if (hasNutritionInformation()) {
+        if (!getNutritionInformation()
+            .equals(other.getNutritionInformation())) return false;
+      }
+      if (!suitableDiets_.equals(other.suitableDiets_)) return false;
+      if (!getAdditiveList()
+          .equals(other.getAdditiveList())) return false;
+      if (!getAllergenList()
+          .equals(other.getAllergenList())) return false;
+      if (hasPackagingDepositInfo() != other.hasPackagingDepositInfo()) return false;
+      if (hasPackagingDepositInfo()) {
+        if (!getPackagingDepositInfo()
+            .equals(other.getPackagingDepositInfo())) return false;
+      }
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasNumberOfServings()) {
+        hash = (37 * hash) + NUMBER_OF_SERVINGS_FIELD_NUMBER;
+        hash = (53 * hash) + getNumberOfServings();
+      }
+      if (hasNutritionInformation()) {
+        hash = (37 * hash) + NUTRITION_INFORMATION_FIELD_NUMBER;
+        hash = (53 * hash) + getNutritionInformation().hashCode();
+      }
+      if (getSuitableDietsCount() > 0) {
+        hash = (37 * hash) + SUITABLE_DIETS_FIELD_NUMBER;
+        hash = (53 * hash) + suitableDiets_.hashCode();
+      }
+      if (getAdditiveCount() > 0) {
+        hash = (37 * hash) + ADDITIVE_FIELD_NUMBER;
+        hash = (53 * hash) + getAdditiveList().hashCode();
+      }
+      if (getAllergenCount() > 0) {
+        hash = (37 * hash) + ALLERGEN_FIELD_NUMBER;
+        hash = (53 * hash) + getAllergenList().hashCode();
+      }
+      if (hasPackagingDepositInfo()) {
+        hash = (37 * hash) + PACKAGING_DEPOSIT_INFO_FIELD_NUMBER;
+        hash = (53 * hash) + getPackagingDepositInfo().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.MenuItemAttributes parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemAttributes parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemAttributes parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemAttributes parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemAttributes parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemAttributes parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemAttributes parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemAttributes parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemAttributes parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemAttributes parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemAttributes parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemAttributes parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.MenuItemAttributes prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * Describes attributes about a particular menu item or option.
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.MenuItemAttributes}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.MenuItemAttributes)
+        food.menu.v1.FoodMenu.MenuItemAttributesOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItemAttributes_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItemAttributes_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.MenuItemAttributes.class, food.menu.v1.FoodMenu.MenuItemAttributes.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.MenuItemAttributes.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        numberOfServings_ = 0;
+        nutritionInformation_ = null;
+        if (nutritionInformationBuilder_ != null) {
+          nutritionInformationBuilder_.dispose();
+          nutritionInformationBuilder_ = null;
+        }
+        suitableDiets_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000004);
+        if (additiveBuilder_ == null) {
+          additive_ = java.util.Collections.emptyList();
+        } else {
+          additive_ = null;
+          additiveBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000008);
+        if (allergenBuilder_ == null) {
+          allergen_ = java.util.Collections.emptyList();
+        } else {
+          allergen_ = null;
+          allergenBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000010);
+        packagingDepositInfo_ = null;
+        if (packagingDepositInfoBuilder_ != null) {
+          packagingDepositInfoBuilder_.dispose();
+          packagingDepositInfoBuilder_ = null;
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItemAttributes_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItemAttributes getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.MenuItemAttributes.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItemAttributes build() {
+        food.menu.v1.FoodMenu.MenuItemAttributes result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItemAttributes buildPartial() {
+        food.menu.v1.FoodMenu.MenuItemAttributes result = new food.menu.v1.FoodMenu.MenuItemAttributes(this);
+        buildPartialRepeatedFields(result);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartialRepeatedFields(food.menu.v1.FoodMenu.MenuItemAttributes result) {
+        if (((bitField0_ & 0x00000004) != 0)) {
+          suitableDiets_ = java.util.Collections.unmodifiableList(suitableDiets_);
+          bitField0_ = (bitField0_ & ~0x00000004);
+        }
+        result.suitableDiets_ = suitableDiets_;
+        if (additiveBuilder_ == null) {
+          if (((bitField0_ & 0x00000008) != 0)) {
+            additive_ = java.util.Collections.unmodifiableList(additive_);
+            bitField0_ = (bitField0_ & ~0x00000008);
+          }
+          result.additive_ = additive_;
+        } else {
+          result.additive_ = additiveBuilder_.build();
+        }
+        if (allergenBuilder_ == null) {
+          if (((bitField0_ & 0x00000010) != 0)) {
+            allergen_ = java.util.Collections.unmodifiableList(allergen_);
+            bitField0_ = (bitField0_ & ~0x00000010);
+          }
+          result.allergen_ = allergen_;
+        } else {
+          result.allergen_ = allergenBuilder_.build();
+        }
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.MenuItemAttributes result) {
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.numberOfServings_ = numberOfServings_;
+          to_bitField0_ |= 0x00000001;
+        }
+        if (((from_bitField0_ & 0x00000002) != 0)) {
+          result.nutritionInformation_ = nutritionInformationBuilder_ == null
+              ? nutritionInformation_
+              : nutritionInformationBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000020) != 0)) {
+          result.packagingDepositInfo_ = packagingDepositInfoBuilder_ == null
+              ? packagingDepositInfo_
+              : packagingDepositInfoBuilder_.build();
+        }
+        result.bitField0_ |= to_bitField0_;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.MenuItemAttributes) {
+          return mergeFrom((food.menu.v1.FoodMenu.MenuItemAttributes)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.MenuItemAttributes other) {
+        if (other == food.menu.v1.FoodMenu.MenuItemAttributes.getDefaultInstance()) return this;
+        if (other.hasNumberOfServings()) {
+          setNumberOfServings(other.getNumberOfServings());
+        }
+        if (other.hasNutritionInformation()) {
+          mergeNutritionInformation(other.getNutritionInformation());
+        }
+        if (!other.suitableDiets_.isEmpty()) {
+          if (suitableDiets_.isEmpty()) {
+            suitableDiets_ = other.suitableDiets_;
+            bitField0_ = (bitField0_ & ~0x00000004);
+          } else {
+            ensureSuitableDietsIsMutable();
+            suitableDiets_.addAll(other.suitableDiets_);
+          }
+          onChanged();
+        }
+        if (additiveBuilder_ == null) {
+          if (!other.additive_.isEmpty()) {
+            if (additive_.isEmpty()) {
+              additive_ = other.additive_;
+              bitField0_ = (bitField0_ & ~0x00000008);
+            } else {
+              ensureAdditiveIsMutable();
+              additive_.addAll(other.additive_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.additive_.isEmpty()) {
+            if (additiveBuilder_.isEmpty()) {
+              additiveBuilder_.dispose();
+              additiveBuilder_ = null;
+              additive_ = other.additive_;
+              bitField0_ = (bitField0_ & ~0x00000008);
+              additiveBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getAdditiveFieldBuilder() : null;
+            } else {
+              additiveBuilder_.addAllMessages(other.additive_);
+            }
+          }
+        }
+        if (allergenBuilder_ == null) {
+          if (!other.allergen_.isEmpty()) {
+            if (allergen_.isEmpty()) {
+              allergen_ = other.allergen_;
+              bitField0_ = (bitField0_ & ~0x00000010);
+            } else {
+              ensureAllergenIsMutable();
+              allergen_.addAll(other.allergen_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.allergen_.isEmpty()) {
+            if (allergenBuilder_.isEmpty()) {
+              allergenBuilder_.dispose();
+              allergenBuilder_ = null;
+              allergen_ = other.allergen_;
+              bitField0_ = (bitField0_ & ~0x00000010);
+              allergenBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getAllergenFieldBuilder() : null;
+            } else {
+              allergenBuilder_.addAllMessages(other.allergen_);
+            }
+          }
+        }
+        if (other.hasPackagingDepositInfo()) {
+          mergePackagingDepositInfo(other.getPackagingDepositInfo());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 8: {
+                numberOfServings_ = input.readInt32();
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 8
+              case 18: {
+                input.readMessage(
+                    getNutritionInformationFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000002;
+                break;
+              } // case 18
+              case 24: {
+                int tmpRaw = input.readEnum();
+                ensureSuitableDietsIsMutable();
+                suitableDiets_.add(tmpRaw);
+                break;
+              } // case 24
+              case 26: {
+                int length = input.readRawVarint32();
+                int oldLimit = input.pushLimit(length);
+                while(input.getBytesUntilLimit() > 0) {
+                  int tmpRaw = input.readEnum();
+                  ensureSuitableDietsIsMutable();
+                  suitableDiets_.add(tmpRaw);
+                }
+                input.popLimit(oldLimit);
+                break;
+              } // case 26
+              case 34: {
+                food.menu.v1.FoodMenu.Additive m =
+                    input.readMessage(
+                        food.menu.v1.FoodMenu.Additive.parser(),
+                        extensionRegistry);
+                if (additiveBuilder_ == null) {
+                  ensureAdditiveIsMutable();
+                  additive_.add(m);
+                } else {
+                  additiveBuilder_.addMessage(m);
+                }
+                break;
+              } // case 34
+              case 42: {
+                food.menu.v1.FoodMenu.Allergen m =
+                    input.readMessage(
+                        food.menu.v1.FoodMenu.Allergen.parser(),
+                        extensionRegistry);
+                if (allergenBuilder_ == null) {
+                  ensureAllergenIsMutable();
+                  allergen_.add(m);
+                } else {
+                  allergenBuilder_.addMessage(m);
+                }
+                break;
+              } // case 42
+              case 50: {
+                input.readMessage(
+                    getPackagingDepositInfoFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000020;
+                break;
+              } // case 50
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int bitField0_;
+
+      private int numberOfServings_ ;
+      /**
+       * <pre>
+       * Number of servings available in a given menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional int32 number_of_servings = 1;</code>
+       * @return Whether the numberOfServings field is set.
+       */
+      @java.lang.Override
+      public boolean hasNumberOfServings() {
+        return ((bitField0_ & 0x00000001) != 0);
+      }
+      /**
+       * <pre>
+       * Number of servings available in a given menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional int32 number_of_servings = 1;</code>
+       * @return The numberOfServings.
+       */
+      @java.lang.Override
+      public int getNumberOfServings() {
+        return numberOfServings_;
+      }
+      /**
+       * <pre>
+       * Number of servings available in a given menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional int32 number_of_servings = 1;</code>
+       * @param value The numberOfServings to set.
+       * @return This builder for chaining.
+       */
+      public Builder setNumberOfServings(int value) {
+
+        numberOfServings_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Number of servings available in a given menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional int32 number_of_servings = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearNumberOfServings() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        numberOfServings_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private food.menu.v1.FoodMenu.NutritionInformation nutritionInformation_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.NutritionInformation, food.menu.v1.FoodMenu.NutritionInformation.Builder, food.menu.v1.FoodMenu.NutritionInformationOrBuilder> nutritionInformationBuilder_;
+      /**
+       * <pre>
+       * Describes all the nutritional information of the item, e.g. calories, fat
+       * content.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation nutrition_information = 2;</code>
+       * @return Whether the nutritionInformation field is set.
+       */
+      public boolean hasNutritionInformation() {
+        return ((bitField0_ & 0x00000002) != 0);
+      }
+      /**
+       * <pre>
+       * Describes all the nutritional information of the item, e.g. calories, fat
+       * content.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation nutrition_information = 2;</code>
+       * @return The nutritionInformation.
+       */
+      public food.menu.v1.FoodMenu.NutritionInformation getNutritionInformation() {
+        if (nutritionInformationBuilder_ == null) {
+          return nutritionInformation_ == null ? food.menu.v1.FoodMenu.NutritionInformation.getDefaultInstance() : nutritionInformation_;
+        } else {
+          return nutritionInformationBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * Describes all the nutritional information of the item, e.g. calories, fat
+       * content.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation nutrition_information = 2;</code>
+       */
+      public Builder setNutritionInformation(food.menu.v1.FoodMenu.NutritionInformation value) {
+        if (nutritionInformationBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          nutritionInformation_ = value;
+        } else {
+          nutritionInformationBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Describes all the nutritional information of the item, e.g. calories, fat
+       * content.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation nutrition_information = 2;</code>
+       */
+      public Builder setNutritionInformation(
+          food.menu.v1.FoodMenu.NutritionInformation.Builder builderForValue) {
+        if (nutritionInformationBuilder_ == null) {
+          nutritionInformation_ = builderForValue.build();
+        } else {
+          nutritionInformationBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Describes all the nutritional information of the item, e.g. calories, fat
+       * content.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation nutrition_information = 2;</code>
+       */
+      public Builder mergeNutritionInformation(food.menu.v1.FoodMenu.NutritionInformation value) {
+        if (nutritionInformationBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) != 0) &&
+            nutritionInformation_ != null &&
+            nutritionInformation_ != food.menu.v1.FoodMenu.NutritionInformation.getDefaultInstance()) {
+            getNutritionInformationBuilder().mergeFrom(value);
+          } else {
+            nutritionInformation_ = value;
+          }
+        } else {
+          nutritionInformationBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Describes all the nutritional information of the item, e.g. calories, fat
+       * content.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation nutrition_information = 2;</code>
+       */
+      public Builder clearNutritionInformation() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        nutritionInformation_ = null;
+        if (nutritionInformationBuilder_ != null) {
+          nutritionInformationBuilder_.dispose();
+          nutritionInformationBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Describes all the nutritional information of the item, e.g. calories, fat
+       * content.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation nutrition_information = 2;</code>
+       */
+      public food.menu.v1.FoodMenu.NutritionInformation.Builder getNutritionInformationBuilder() {
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return getNutritionInformationFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Describes all the nutritional information of the item, e.g. calories, fat
+       * content.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation nutrition_information = 2;</code>
+       */
+      public food.menu.v1.FoodMenu.NutritionInformationOrBuilder getNutritionInformationOrBuilder() {
+        if (nutritionInformationBuilder_ != null) {
+          return nutritionInformationBuilder_.getMessageOrBuilder();
+        } else {
+          return nutritionInformation_ == null ?
+              food.menu.v1.FoodMenu.NutritionInformation.getDefaultInstance() : nutritionInformation_;
+        }
+      }
+      /**
+       * <pre>
+       * Describes all the nutritional information of the item, e.g. calories, fat
+       * content.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation nutrition_information = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.NutritionInformation, food.menu.v1.FoodMenu.NutritionInformation.Builder, food.menu.v1.FoodMenu.NutritionInformationOrBuilder> 
+          getNutritionInformationFieldBuilder() {
+        if (nutritionInformationBuilder_ == null) {
+          nutritionInformationBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.NutritionInformation, food.menu.v1.FoodMenu.NutritionInformation.Builder, food.menu.v1.FoodMenu.NutritionInformationOrBuilder>(
+                  getNutritionInformation(),
+                  getParentForChildren(),
+                  isClean());
+          nutritionInformation_ = null;
+        }
+        return nutritionInformationBuilder_;
+      }
+
+      private java.util.List<java.lang.Integer> suitableDiets_ =
+        java.util.Collections.emptyList();
+      private void ensureSuitableDietsIsMutable() {
+        if (!((bitField0_ & 0x00000004) != 0)) {
+          suitableDiets_ = new java.util.ArrayList<java.lang.Integer>(suitableDiets_);
+          bitField0_ |= 0x00000004;
+        }
+      }
+      /**
+       * <pre>
+       * The dietary restrictions that this menu item complies with.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+       * @return A list containing the suitableDiets.
+       */
+      public java.util.List<food.menu.v1.FoodMenu.DietaryRestriction> getSuitableDietsList() {
+        return new com.google.protobuf.Internal.ListAdapter<
+            java.lang.Integer, food.menu.v1.FoodMenu.DietaryRestriction>(suitableDiets_, suitableDiets_converter_);
+      }
+      /**
+       * <pre>
+       * The dietary restrictions that this menu item complies with.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+       * @return The count of suitableDiets.
+       */
+      public int getSuitableDietsCount() {
+        return suitableDiets_.size();
+      }
+      /**
+       * <pre>
+       * The dietary restrictions that this menu item complies with.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+       * @param index The index of the element to return.
+       * @return The suitableDiets at the given index.
+       */
+      public food.menu.v1.FoodMenu.DietaryRestriction getSuitableDiets(int index) {
+        return suitableDiets_converter_.convert(suitableDiets_.get(index));
+      }
+      /**
+       * <pre>
+       * The dietary restrictions that this menu item complies with.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+       * @param index The index to set the value at.
+       * @param value The suitableDiets to set.
+       * @return This builder for chaining.
+       */
+      public Builder setSuitableDiets(
+          int index, food.menu.v1.FoodMenu.DietaryRestriction value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureSuitableDietsIsMutable();
+        suitableDiets_.set(index, value.getNumber());
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The dietary restrictions that this menu item complies with.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+       * @param value The suitableDiets to add.
+       * @return This builder for chaining.
+       */
+      public Builder addSuitableDiets(food.menu.v1.FoodMenu.DietaryRestriction value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureSuitableDietsIsMutable();
+        suitableDiets_.add(value.getNumber());
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The dietary restrictions that this menu item complies with.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+       * @param values The suitableDiets to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllSuitableDiets(
+          java.lang.Iterable<? extends food.menu.v1.FoodMenu.DietaryRestriction> values) {
+        ensureSuitableDietsIsMutable();
+        for (food.menu.v1.FoodMenu.DietaryRestriction value : values) {
+          suitableDiets_.add(value.getNumber());
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The dietary restrictions that this menu item complies with.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearSuitableDiets() {
+        suitableDiets_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000004);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The dietary restrictions that this menu item complies with.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+       * @return A list containing the enum numeric values on the wire for suitableDiets.
+       */
+      public java.util.List<java.lang.Integer>
+      getSuitableDietsValueList() {
+        return java.util.Collections.unmodifiableList(suitableDiets_);
+      }
+      /**
+       * <pre>
+       * The dietary restrictions that this menu item complies with.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+       * @param index The index of the value to return.
+       * @return The enum numeric value on the wire of suitableDiets at the given index.
+       */
+      public int getSuitableDietsValue(int index) {
+        return suitableDiets_.get(index);
+      }
+      /**
+       * <pre>
+       * The dietary restrictions that this menu item complies with.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+       * @param index The index to set the value at.
+       * @param value The enum numeric value on the wire for suitableDiets to set.
+       * @return This builder for chaining.
+       */
+      public Builder setSuitableDietsValue(
+          int index, int value) {
+        ensureSuitableDietsIsMutable();
+        suitableDiets_.set(index, value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The dietary restrictions that this menu item complies with.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+       * @param value The enum numeric value on the wire for suitableDiets to add.
+       * @return This builder for chaining.
+       */
+      public Builder addSuitableDietsValue(int value) {
+        ensureSuitableDietsIsMutable();
+        suitableDiets_.add(value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The dietary restrictions that this menu item complies with.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.DietaryRestriction suitable_diets = 3;</code>
+       * @param values The enum numeric values on the wire for suitableDiets to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllSuitableDietsValue(
+          java.lang.Iterable<java.lang.Integer> values) {
+        ensureSuitableDietsIsMutable();
+        for (int value : values) {
+          suitableDiets_.add(value);
+        }
+        onChanged();
+        return this;
+      }
+
+      private java.util.List<food.menu.v1.FoodMenu.Additive> additive_ =
+        java.util.Collections.emptyList();
+      private void ensureAdditiveIsMutable() {
+        if (!((bitField0_ & 0x00000008) != 0)) {
+          additive_ = new java.util.ArrayList<food.menu.v1.FoodMenu.Additive>(additive_);
+          bitField0_ |= 0x00000008;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          food.menu.v1.FoodMenu.Additive, food.menu.v1.FoodMenu.Additive.Builder, food.menu.v1.FoodMenu.AdditiveOrBuilder> additiveBuilder_;
+
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public java.util.List<food.menu.v1.FoodMenu.Additive> getAdditiveList() {
+        if (additiveBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(additive_);
+        } else {
+          return additiveBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public int getAdditiveCount() {
+        if (additiveBuilder_ == null) {
+          return additive_.size();
+        } else {
+          return additiveBuilder_.getCount();
+        }
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.Additive getAdditive(int index) {
+        if (additiveBuilder_ == null) {
+          return additive_.get(index);
+        } else {
+          return additiveBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public Builder setAdditive(
+          int index, food.menu.v1.FoodMenu.Additive value) {
+        if (additiveBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureAdditiveIsMutable();
+          additive_.set(index, value);
+          onChanged();
+        } else {
+          additiveBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public Builder setAdditive(
+          int index, food.menu.v1.FoodMenu.Additive.Builder builderForValue) {
+        if (additiveBuilder_ == null) {
+          ensureAdditiveIsMutable();
+          additive_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          additiveBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public Builder addAdditive(food.menu.v1.FoodMenu.Additive value) {
+        if (additiveBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureAdditiveIsMutable();
+          additive_.add(value);
+          onChanged();
+        } else {
+          additiveBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public Builder addAdditive(
+          int index, food.menu.v1.FoodMenu.Additive value) {
+        if (additiveBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureAdditiveIsMutable();
+          additive_.add(index, value);
+          onChanged();
+        } else {
+          additiveBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public Builder addAdditive(
+          food.menu.v1.FoodMenu.Additive.Builder builderForValue) {
+        if (additiveBuilder_ == null) {
+          ensureAdditiveIsMutable();
+          additive_.add(builderForValue.build());
+          onChanged();
+        } else {
+          additiveBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public Builder addAdditive(
+          int index, food.menu.v1.FoodMenu.Additive.Builder builderForValue) {
+        if (additiveBuilder_ == null) {
+          ensureAdditiveIsMutable();
+          additive_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          additiveBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public Builder addAllAdditive(
+          java.lang.Iterable<? extends food.menu.v1.FoodMenu.Additive> values) {
+        if (additiveBuilder_ == null) {
+          ensureAdditiveIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, additive_);
+          onChanged();
+        } else {
+          additiveBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public Builder clearAdditive() {
+        if (additiveBuilder_ == null) {
+          additive_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000008);
+          onChanged();
+        } else {
+          additiveBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public Builder removeAdditive(int index) {
+        if (additiveBuilder_ == null) {
+          ensureAdditiveIsMutable();
+          additive_.remove(index);
+          onChanged();
+        } else {
+          additiveBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.Additive.Builder getAdditiveBuilder(
+          int index) {
+        return getAdditiveFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.AdditiveOrBuilder getAdditiveOrBuilder(
+          int index) {
+        if (additiveBuilder_ == null) {
+          return additive_.get(index);  } else {
+          return additiveBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public java.util.List<? extends food.menu.v1.FoodMenu.AdditiveOrBuilder> 
+           getAdditiveOrBuilderList() {
+        if (additiveBuilder_ != null) {
+          return additiveBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(additive_);
+        }
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.Additive.Builder addAdditiveBuilder() {
+        return getAdditiveFieldBuilder().addBuilder(
+            food.menu.v1.FoodMenu.Additive.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.Additive.Builder addAdditiveBuilder(
+          int index) {
+        return getAdditiveFieldBuilder().addBuilder(
+            index, food.menu.v1.FoodMenu.Additive.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * Additives of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Additive additive = 4;</code>
+       */
+      public java.util.List<food.menu.v1.FoodMenu.Additive.Builder> 
+           getAdditiveBuilderList() {
+        return getAdditiveFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          food.menu.v1.FoodMenu.Additive, food.menu.v1.FoodMenu.Additive.Builder, food.menu.v1.FoodMenu.AdditiveOrBuilder> 
+          getAdditiveFieldBuilder() {
+        if (additiveBuilder_ == null) {
+          additiveBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              food.menu.v1.FoodMenu.Additive, food.menu.v1.FoodMenu.Additive.Builder, food.menu.v1.FoodMenu.AdditiveOrBuilder>(
+                  additive_,
+                  ((bitField0_ & 0x00000008) != 0),
+                  getParentForChildren(),
+                  isClean());
+          additive_ = null;
+        }
+        return additiveBuilder_;
+      }
+
+      private java.util.List<food.menu.v1.FoodMenu.Allergen> allergen_ =
+        java.util.Collections.emptyList();
+      private void ensureAllergenIsMutable() {
+        if (!((bitField0_ & 0x00000010) != 0)) {
+          allergen_ = new java.util.ArrayList<food.menu.v1.FoodMenu.Allergen>(allergen_);
+          bitField0_ |= 0x00000010;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          food.menu.v1.FoodMenu.Allergen, food.menu.v1.FoodMenu.Allergen.Builder, food.menu.v1.FoodMenu.AllergenOrBuilder> allergenBuilder_;
+
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public java.util.List<food.menu.v1.FoodMenu.Allergen> getAllergenList() {
+        if (allergenBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(allergen_);
+        } else {
+          return allergenBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public int getAllergenCount() {
+        if (allergenBuilder_ == null) {
+          return allergen_.size();
+        } else {
+          return allergenBuilder_.getCount();
+        }
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public food.menu.v1.FoodMenu.Allergen getAllergen(int index) {
+        if (allergenBuilder_ == null) {
+          return allergen_.get(index);
+        } else {
+          return allergenBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public Builder setAllergen(
+          int index, food.menu.v1.FoodMenu.Allergen value) {
+        if (allergenBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureAllergenIsMutable();
+          allergen_.set(index, value);
+          onChanged();
+        } else {
+          allergenBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public Builder setAllergen(
+          int index, food.menu.v1.FoodMenu.Allergen.Builder builderForValue) {
+        if (allergenBuilder_ == null) {
+          ensureAllergenIsMutable();
+          allergen_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          allergenBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public Builder addAllergen(food.menu.v1.FoodMenu.Allergen value) {
+        if (allergenBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureAllergenIsMutable();
+          allergen_.add(value);
+          onChanged();
+        } else {
+          allergenBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public Builder addAllergen(
+          int index, food.menu.v1.FoodMenu.Allergen value) {
+        if (allergenBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureAllergenIsMutable();
+          allergen_.add(index, value);
+          onChanged();
+        } else {
+          allergenBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public Builder addAllergen(
+          food.menu.v1.FoodMenu.Allergen.Builder builderForValue) {
+        if (allergenBuilder_ == null) {
+          ensureAllergenIsMutable();
+          allergen_.add(builderForValue.build());
+          onChanged();
+        } else {
+          allergenBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public Builder addAllergen(
+          int index, food.menu.v1.FoodMenu.Allergen.Builder builderForValue) {
+        if (allergenBuilder_ == null) {
+          ensureAllergenIsMutable();
+          allergen_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          allergenBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public Builder addAllAllergen(
+          java.lang.Iterable<? extends food.menu.v1.FoodMenu.Allergen> values) {
+        if (allergenBuilder_ == null) {
+          ensureAllergenIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, allergen_);
+          onChanged();
+        } else {
+          allergenBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public Builder clearAllergen() {
+        if (allergenBuilder_ == null) {
+          allergen_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000010);
+          onChanged();
+        } else {
+          allergenBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public Builder removeAllergen(int index) {
+        if (allergenBuilder_ == null) {
+          ensureAllergenIsMutable();
+          allergen_.remove(index);
+          onChanged();
+        } else {
+          allergenBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public food.menu.v1.FoodMenu.Allergen.Builder getAllergenBuilder(
+          int index) {
+        return getAllergenFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public food.menu.v1.FoodMenu.AllergenOrBuilder getAllergenOrBuilder(
+          int index) {
+        if (allergenBuilder_ == null) {
+          return allergen_.get(index);  } else {
+          return allergenBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public java.util.List<? extends food.menu.v1.FoodMenu.AllergenOrBuilder> 
+           getAllergenOrBuilderList() {
+        if (allergenBuilder_ != null) {
+          return allergenBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(allergen_);
+        }
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public food.menu.v1.FoodMenu.Allergen.Builder addAllergenBuilder() {
+        return getAllergenFieldBuilder().addBuilder(
+            food.menu.v1.FoodMenu.Allergen.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public food.menu.v1.FoodMenu.Allergen.Builder addAllergenBuilder(
+          int index) {
+        return getAllergenFieldBuilder().addBuilder(
+            index, food.menu.v1.FoodMenu.Allergen.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * Allergens of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Allergen allergen = 5;</code>
+       */
+      public java.util.List<food.menu.v1.FoodMenu.Allergen.Builder> 
+           getAllergenBuilderList() {
+        return getAllergenFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          food.menu.v1.FoodMenu.Allergen, food.menu.v1.FoodMenu.Allergen.Builder, food.menu.v1.FoodMenu.AllergenOrBuilder> 
+          getAllergenFieldBuilder() {
+        if (allergenBuilder_ == null) {
+          allergenBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              food.menu.v1.FoodMenu.Allergen, food.menu.v1.FoodMenu.Allergen.Builder, food.menu.v1.FoodMenu.AllergenOrBuilder>(
+                  allergen_,
+                  ((bitField0_ & 0x00000010) != 0),
+                  getParentForChildren(),
+                  isClean());
+          allergen_ = null;
+        }
+        return allergenBuilder_;
+      }
+
+      private food.menu.v1.FoodMenu.DepositInfo packagingDepositInfo_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.DepositInfo, food.menu.v1.FoodMenu.DepositInfo.Builder, food.menu.v1.FoodMenu.DepositInfoOrBuilder> packagingDepositInfoBuilder_;
+      /**
+       * <pre>
+       * Packaging and recycling information of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.DepositInfo packaging_deposit_info = 6;</code>
+       * @return Whether the packagingDepositInfo field is set.
+       */
+      public boolean hasPackagingDepositInfo() {
+        return ((bitField0_ & 0x00000020) != 0);
+      }
+      /**
+       * <pre>
+       * Packaging and recycling information of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.DepositInfo packaging_deposit_info = 6;</code>
+       * @return The packagingDepositInfo.
+       */
+      public food.menu.v1.FoodMenu.DepositInfo getPackagingDepositInfo() {
+        if (packagingDepositInfoBuilder_ == null) {
+          return packagingDepositInfo_ == null ? food.menu.v1.FoodMenu.DepositInfo.getDefaultInstance() : packagingDepositInfo_;
+        } else {
+          return packagingDepositInfoBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * Packaging and recycling information of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.DepositInfo packaging_deposit_info = 6;</code>
+       */
+      public Builder setPackagingDepositInfo(food.menu.v1.FoodMenu.DepositInfo value) {
+        if (packagingDepositInfoBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          packagingDepositInfo_ = value;
+        } else {
+          packagingDepositInfoBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000020;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Packaging and recycling information of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.DepositInfo packaging_deposit_info = 6;</code>
+       */
+      public Builder setPackagingDepositInfo(
+          food.menu.v1.FoodMenu.DepositInfo.Builder builderForValue) {
+        if (packagingDepositInfoBuilder_ == null) {
+          packagingDepositInfo_ = builderForValue.build();
+        } else {
+          packagingDepositInfoBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000020;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Packaging and recycling information of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.DepositInfo packaging_deposit_info = 6;</code>
+       */
+      public Builder mergePackagingDepositInfo(food.menu.v1.FoodMenu.DepositInfo value) {
+        if (packagingDepositInfoBuilder_ == null) {
+          if (((bitField0_ & 0x00000020) != 0) &&
+            packagingDepositInfo_ != null &&
+            packagingDepositInfo_ != food.menu.v1.FoodMenu.DepositInfo.getDefaultInstance()) {
+            getPackagingDepositInfoBuilder().mergeFrom(value);
+          } else {
+            packagingDepositInfo_ = value;
+          }
+        } else {
+          packagingDepositInfoBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000020;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Packaging and recycling information of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.DepositInfo packaging_deposit_info = 6;</code>
+       */
+      public Builder clearPackagingDepositInfo() {
+        bitField0_ = (bitField0_ & ~0x00000020);
+        packagingDepositInfo_ = null;
+        if (packagingDepositInfoBuilder_ != null) {
+          packagingDepositInfoBuilder_.dispose();
+          packagingDepositInfoBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Packaging and recycling information of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.DepositInfo packaging_deposit_info = 6;</code>
+       */
+      public food.menu.v1.FoodMenu.DepositInfo.Builder getPackagingDepositInfoBuilder() {
+        bitField0_ |= 0x00000020;
+        onChanged();
+        return getPackagingDepositInfoFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Packaging and recycling information of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.DepositInfo packaging_deposit_info = 6;</code>
+       */
+      public food.menu.v1.FoodMenu.DepositInfoOrBuilder getPackagingDepositInfoOrBuilder() {
+        if (packagingDepositInfoBuilder_ != null) {
+          return packagingDepositInfoBuilder_.getMessageOrBuilder();
+        } else {
+          return packagingDepositInfo_ == null ?
+              food.menu.v1.FoodMenu.DepositInfo.getDefaultInstance() : packagingDepositInfo_;
+        }
+      }
+      /**
+       * <pre>
+       * Packaging and recycling information of this menu item.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.DepositInfo packaging_deposit_info = 6;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.DepositInfo, food.menu.v1.FoodMenu.DepositInfo.Builder, food.menu.v1.FoodMenu.DepositInfoOrBuilder> 
+          getPackagingDepositInfoFieldBuilder() {
+        if (packagingDepositInfoBuilder_ == null) {
+          packagingDepositInfoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.DepositInfo, food.menu.v1.FoodMenu.DepositInfo.Builder, food.menu.v1.FoodMenu.DepositInfoOrBuilder>(
+                  getPackagingDepositInfo(),
+                  getParentForChildren(),
+                  isClean());
+          packagingDepositInfo_ = null;
+        }
+        return packagingDepositInfoBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.MenuItemAttributes)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.MenuItemAttributes)
+    private static final food.menu.v1.FoodMenu.MenuItemAttributes DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.MenuItemAttributes();
+    }
+
+    public static food.menu.v1.FoodMenu.MenuItemAttributes getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<MenuItemAttributes>
+        PARSER = new com.google.protobuf.AbstractParser<MenuItemAttributes>() {
+      @java.lang.Override
+      public MenuItemAttributes parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<MenuItemAttributes> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<MenuItemAttributes> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuItemAttributes getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface OfferSetOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.OfferSet)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * List of possible offers.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+     */
+    java.util.List<food.menu.v1.FoodMenu.Offer> 
+        getOffersList();
+    /**
+     * <pre>
+     * List of possible offers.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+     */
+    food.menu.v1.FoodMenu.Offer getOffers(int index);
+    /**
+     * <pre>
+     * List of possible offers.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+     */
+    int getOffersCount();
+    /**
+     * <pre>
+     * List of possible offers.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+     */
+    java.util.List<? extends food.menu.v1.FoodMenu.OfferOrBuilder> 
+        getOffersOrBuilderList();
+    /**
+     * <pre>
+     * List of possible offers.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+     */
+    food.menu.v1.FoodMenu.OfferOrBuilder getOffersOrBuilder(
+        int index);
+  }
+  /**
+   * <pre>
+   * Container for a list of offers available on a menu item / option.
+   * Only one offer should be applicable/valid at one particular time.
+   * For example, a drink can have 2 offers where one is applicable in the morning
+   * while the other is applicable in the evening during happy hours.
+   * </pre>
+   *
+   * Protobuf type {@code food.menu.v1.OfferSet}
+   */
+  public static final class OfferSet extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.OfferSet)
+      OfferSetOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use OfferSet.newBuilder() to construct.
+    private OfferSet(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private OfferSet() {
+      offers_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new OfferSet();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_OfferSet_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_OfferSet_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.OfferSet.class, food.menu.v1.FoodMenu.OfferSet.Builder.class);
+    }
+
+    public static final int OFFERS_FIELD_NUMBER = 1;
+    @SuppressWarnings("serial")
+    private java.util.List<food.menu.v1.FoodMenu.Offer> offers_;
+    /**
+     * <pre>
+     * List of possible offers.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<food.menu.v1.FoodMenu.Offer> getOffersList() {
+      return offers_;
+    }
+    /**
+     * <pre>
+     * List of possible offers.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends food.menu.v1.FoodMenu.OfferOrBuilder> 
+        getOffersOrBuilderList() {
+      return offers_;
+    }
+    /**
+     * <pre>
+     * List of possible offers.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+     */
+    @java.lang.Override
+    public int getOffersCount() {
+      return offers_.size();
+    }
+    /**
+     * <pre>
+     * List of possible offers.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.Offer getOffers(int index) {
+      return offers_.get(index);
+    }
+    /**
+     * <pre>
+     * List of possible offers.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.OfferOrBuilder getOffersOrBuilder(
+        int index) {
+      return offers_.get(index);
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      for (int i = 0; i < offers_.size(); i++) {
+        output.writeMessage(1, offers_.get(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      for (int i = 0; i < offers_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, offers_.get(i));
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.OfferSet)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.OfferSet other = (food.menu.v1.FoodMenu.OfferSet) obj;
+
+      if (!getOffersList()
+          .equals(other.getOffersList())) return false;
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (getOffersCount() > 0) {
+        hash = (37 * hash) + OFFERS_FIELD_NUMBER;
+        hash = (53 * hash) + getOffersList().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.OfferSet parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.OfferSet parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.OfferSet parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.OfferSet parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.OfferSet parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.OfferSet parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.OfferSet parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.OfferSet parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.OfferSet parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.OfferSet parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.OfferSet parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.OfferSet parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.OfferSet prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * Container for a list of offers available on a menu item / option.
+     * Only one offer should be applicable/valid at one particular time.
+     * For example, a drink can have 2 offers where one is applicable in the morning
+     * while the other is applicable in the evening during happy hours.
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.OfferSet}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.OfferSet)
+        food.menu.v1.FoodMenu.OfferSetOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_OfferSet_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_OfferSet_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.OfferSet.class, food.menu.v1.FoodMenu.OfferSet.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.OfferSet.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        if (offersBuilder_ == null) {
+          offers_ = java.util.Collections.emptyList();
+        } else {
+          offers_ = null;
+          offersBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_OfferSet_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.OfferSet getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.OfferSet.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.OfferSet build() {
+        food.menu.v1.FoodMenu.OfferSet result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.OfferSet buildPartial() {
+        food.menu.v1.FoodMenu.OfferSet result = new food.menu.v1.FoodMenu.OfferSet(this);
+        buildPartialRepeatedFields(result);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartialRepeatedFields(food.menu.v1.FoodMenu.OfferSet result) {
+        if (offersBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            offers_ = java.util.Collections.unmodifiableList(offers_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.offers_ = offers_;
+        } else {
+          result.offers_ = offersBuilder_.build();
+        }
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.OfferSet result) {
+        int from_bitField0_ = bitField0_;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.OfferSet) {
+          return mergeFrom((food.menu.v1.FoodMenu.OfferSet)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.OfferSet other) {
+        if (other == food.menu.v1.FoodMenu.OfferSet.getDefaultInstance()) return this;
+        if (offersBuilder_ == null) {
+          if (!other.offers_.isEmpty()) {
+            if (offers_.isEmpty()) {
+              offers_ = other.offers_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureOffersIsMutable();
+              offers_.addAll(other.offers_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.offers_.isEmpty()) {
+            if (offersBuilder_.isEmpty()) {
+              offersBuilder_.dispose();
+              offersBuilder_ = null;
+              offers_ = other.offers_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              offersBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getOffersFieldBuilder() : null;
+            } else {
+              offersBuilder_.addAllMessages(other.offers_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                food.menu.v1.FoodMenu.Offer m =
+                    input.readMessage(
+                        food.menu.v1.FoodMenu.Offer.parser(),
+                        extensionRegistry);
+                if (offersBuilder_ == null) {
+                  ensureOffersIsMutable();
+                  offers_.add(m);
+                } else {
+                  offersBuilder_.addMessage(m);
+                }
+                break;
+              } // case 10
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int bitField0_;
+
+      private java.util.List<food.menu.v1.FoodMenu.Offer> offers_ =
+        java.util.Collections.emptyList();
+      private void ensureOffersIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          offers_ = new java.util.ArrayList<food.menu.v1.FoodMenu.Offer>(offers_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          food.menu.v1.FoodMenu.Offer, food.menu.v1.FoodMenu.Offer.Builder, food.menu.v1.FoodMenu.OfferOrBuilder> offersBuilder_;
+
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public java.util.List<food.menu.v1.FoodMenu.Offer> getOffersList() {
+        if (offersBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(offers_);
+        } else {
+          return offersBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public int getOffersCount() {
+        if (offersBuilder_ == null) {
+          return offers_.size();
+        } else {
+          return offersBuilder_.getCount();
+        }
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.Offer getOffers(int index) {
+        if (offersBuilder_ == null) {
+          return offers_.get(index);
+        } else {
+          return offersBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public Builder setOffers(
+          int index, food.menu.v1.FoodMenu.Offer value) {
+        if (offersBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureOffersIsMutable();
+          offers_.set(index, value);
+          onChanged();
+        } else {
+          offersBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public Builder setOffers(
+          int index, food.menu.v1.FoodMenu.Offer.Builder builderForValue) {
+        if (offersBuilder_ == null) {
+          ensureOffersIsMutable();
+          offers_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          offersBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public Builder addOffers(food.menu.v1.FoodMenu.Offer value) {
+        if (offersBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureOffersIsMutable();
+          offers_.add(value);
+          onChanged();
+        } else {
+          offersBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public Builder addOffers(
+          int index, food.menu.v1.FoodMenu.Offer value) {
+        if (offersBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureOffersIsMutable();
+          offers_.add(index, value);
+          onChanged();
+        } else {
+          offersBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public Builder addOffers(
+          food.menu.v1.FoodMenu.Offer.Builder builderForValue) {
+        if (offersBuilder_ == null) {
+          ensureOffersIsMutable();
+          offers_.add(builderForValue.build());
+          onChanged();
+        } else {
+          offersBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public Builder addOffers(
+          int index, food.menu.v1.FoodMenu.Offer.Builder builderForValue) {
+        if (offersBuilder_ == null) {
+          ensureOffersIsMutable();
+          offers_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          offersBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public Builder addAllOffers(
+          java.lang.Iterable<? extends food.menu.v1.FoodMenu.Offer> values) {
+        if (offersBuilder_ == null) {
+          ensureOffersIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, offers_);
+          onChanged();
+        } else {
+          offersBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public Builder clearOffers() {
+        if (offersBuilder_ == null) {
+          offers_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          offersBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public Builder removeOffers(int index) {
+        if (offersBuilder_ == null) {
+          ensureOffersIsMutable();
+          offers_.remove(index);
+          onChanged();
+        } else {
+          offersBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.Offer.Builder getOffersBuilder(
+          int index) {
+        return getOffersFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.OfferOrBuilder getOffersOrBuilder(
+          int index) {
+        if (offersBuilder_ == null) {
+          return offers_.get(index);  } else {
+          return offersBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public java.util.List<? extends food.menu.v1.FoodMenu.OfferOrBuilder> 
+           getOffersOrBuilderList() {
+        if (offersBuilder_ != null) {
+          return offersBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(offers_);
+        }
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.Offer.Builder addOffersBuilder() {
+        return getOffersFieldBuilder().addBuilder(
+            food.menu.v1.FoodMenu.Offer.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.Offer.Builder addOffersBuilder(
+          int index) {
+        return getOffersFieldBuilder().addBuilder(
+            index, food.menu.v1.FoodMenu.Offer.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * List of possible offers.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .food.menu.v1.Offer offers = 1;</code>
+       */
+      public java.util.List<food.menu.v1.FoodMenu.Offer.Builder> 
+           getOffersBuilderList() {
+        return getOffersFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          food.menu.v1.FoodMenu.Offer, food.menu.v1.FoodMenu.Offer.Builder, food.menu.v1.FoodMenu.OfferOrBuilder> 
+          getOffersFieldBuilder() {
+        if (offersBuilder_ == null) {
+          offersBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              food.menu.v1.FoodMenu.Offer, food.menu.v1.FoodMenu.Offer.Builder, food.menu.v1.FoodMenu.OfferOrBuilder>(
+                  offers_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          offers_ = null;
+        }
+        return offersBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.OfferSet)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.OfferSet)
+    private static final food.menu.v1.FoodMenu.OfferSet DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.OfferSet();
+    }
+
+    public static food.menu.v1.FoodMenu.OfferSet getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<OfferSet>
+        PARSER = new com.google.protobuf.AbstractParser<OfferSet>() {
+      @java.lang.Override
+      public OfferSet parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<OfferSet> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<OfferSet> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.OfferSet getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface OfferOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.Offer)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * Monetary value of the menu item/option on sale. Can be 0 to represent free.
+     * Required.
+     * </pre>
+     *
+     * <code>.google.type.Money price = 1;</code>
+     * @return Whether the price field is set.
+     */
+    boolean hasPrice();
+    /**
+     * <pre>
+     * Monetary value of the menu item/option on sale. Can be 0 to represent free.
+     * Required.
+     * </pre>
+     *
+     * <code>.google.type.Money price = 1;</code>
+     * @return The price.
+     */
+    com.google.type.Money getPrice();
+    /**
+     * <pre>
+     * Monetary value of the menu item/option on sale. Can be 0 to represent free.
+     * Required.
+     * </pre>
+     *
+     * <code>.google.type.Money price = 1;</code>
+     */
+    com.google.type.MoneyOrBuilder getPriceOrBuilder();
+  }
+  /**
+   * <pre>
+   * Represents pricing and availability information for MenuItems and
+   * MenuItemOptions.
+   * </pre>
+   *
+   * Protobuf type {@code food.menu.v1.Offer}
+   */
+  public static final class Offer extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.Offer)
+      OfferOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use Offer.newBuilder() to construct.
+    private Offer(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private Offer() {
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new Offer();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Offer_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Offer_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.Offer.class, food.menu.v1.FoodMenu.Offer.Builder.class);
+    }
+
+    public static final int PRICE_FIELD_NUMBER = 1;
+    private com.google.type.Money price_;
+    /**
+     * <pre>
+     * Monetary value of the menu item/option on sale. Can be 0 to represent free.
+     * Required.
+     * </pre>
+     *
+     * <code>.google.type.Money price = 1;</code>
+     * @return Whether the price field is set.
+     */
+    @java.lang.Override
+    public boolean hasPrice() {
+      return price_ != null;
+    }
+    /**
+     * <pre>
+     * Monetary value of the menu item/option on sale. Can be 0 to represent free.
+     * Required.
+     * </pre>
+     *
+     * <code>.google.type.Money price = 1;</code>
+     * @return The price.
+     */
+    @java.lang.Override
+    public com.google.type.Money getPrice() {
+      return price_ == null ? com.google.type.Money.getDefaultInstance() : price_;
+    }
+    /**
+     * <pre>
+     * Monetary value of the menu item/option on sale. Can be 0 to represent free.
+     * Required.
+     * </pre>
+     *
+     * <code>.google.type.Money price = 1;</code>
+     */
+    @java.lang.Override
+    public com.google.type.MoneyOrBuilder getPriceOrBuilder() {
+      return price_ == null ? com.google.type.Money.getDefaultInstance() : price_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (price_ != null) {
+        output.writeMessage(1, getPrice());
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (price_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, getPrice());
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.Offer)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.Offer other = (food.menu.v1.FoodMenu.Offer) obj;
+
+      if (hasPrice() != other.hasPrice()) return false;
+      if (hasPrice()) {
+        if (!getPrice()
+            .equals(other.getPrice())) return false;
+      }
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasPrice()) {
+        hash = (37 * hash) + PRICE_FIELD_NUMBER;
+        hash = (53 * hash) + getPrice().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.Offer parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Offer parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Offer parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Offer parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Offer parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Offer parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Offer parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Offer parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Offer parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Offer parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Offer parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Offer parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.Offer prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * Represents pricing and availability information for MenuItems and
+     * MenuItemOptions.
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.Offer}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.Offer)
+        food.menu.v1.FoodMenu.OfferOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Offer_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Offer_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.Offer.class, food.menu.v1.FoodMenu.Offer.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.Offer.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        price_ = null;
+        if (priceBuilder_ != null) {
+          priceBuilder_.dispose();
+          priceBuilder_ = null;
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Offer_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Offer getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.Offer.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Offer build() {
+        food.menu.v1.FoodMenu.Offer result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Offer buildPartial() {
+        food.menu.v1.FoodMenu.Offer result = new food.menu.v1.FoodMenu.Offer(this);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.Offer result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.price_ = priceBuilder_ == null
+              ? price_
+              : priceBuilder_.build();
+        }
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.Offer) {
+          return mergeFrom((food.menu.v1.FoodMenu.Offer)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.Offer other) {
+        if (other == food.menu.v1.FoodMenu.Offer.getDefaultInstance()) return this;
+        if (other.hasPrice()) {
+          mergePrice(other.getPrice());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                input.readMessage(
+                    getPriceFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 10
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int bitField0_;
+
+      private com.google.type.Money price_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          com.google.type.Money, com.google.type.Money.Builder, com.google.type.MoneyOrBuilder> priceBuilder_;
+      /**
+       * <pre>
+       * Monetary value of the menu item/option on sale. Can be 0 to represent free.
+       * Required.
+       * </pre>
+       *
+       * <code>.google.type.Money price = 1;</code>
+       * @return Whether the price field is set.
+       */
+      public boolean hasPrice() {
+        return ((bitField0_ & 0x00000001) != 0);
+      }
+      /**
+       * <pre>
+       * Monetary value of the menu item/option on sale. Can be 0 to represent free.
+       * Required.
+       * </pre>
+       *
+       * <code>.google.type.Money price = 1;</code>
+       * @return The price.
+       */
+      public com.google.type.Money getPrice() {
+        if (priceBuilder_ == null) {
+          return price_ == null ? com.google.type.Money.getDefaultInstance() : price_;
+        } else {
+          return priceBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * Monetary value of the menu item/option on sale. Can be 0 to represent free.
+       * Required.
+       * </pre>
+       *
+       * <code>.google.type.Money price = 1;</code>
+       */
+      public Builder setPrice(com.google.type.Money value) {
+        if (priceBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          price_ = value;
+        } else {
+          priceBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Monetary value of the menu item/option on sale. Can be 0 to represent free.
+       * Required.
+       * </pre>
+       *
+       * <code>.google.type.Money price = 1;</code>
+       */
+      public Builder setPrice(
+          com.google.type.Money.Builder builderForValue) {
+        if (priceBuilder_ == null) {
+          price_ = builderForValue.build();
+        } else {
+          priceBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Monetary value of the menu item/option on sale. Can be 0 to represent free.
+       * Required.
+       * </pre>
+       *
+       * <code>.google.type.Money price = 1;</code>
+       */
+      public Builder mergePrice(com.google.type.Money value) {
+        if (priceBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0) &&
+            price_ != null &&
+            price_ != com.google.type.Money.getDefaultInstance()) {
+            getPriceBuilder().mergeFrom(value);
+          } else {
+            price_ = value;
+          }
+        } else {
+          priceBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Monetary value of the menu item/option on sale. Can be 0 to represent free.
+       * Required.
+       * </pre>
+       *
+       * <code>.google.type.Money price = 1;</code>
+       */
+      public Builder clearPrice() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        price_ = null;
+        if (priceBuilder_ != null) {
+          priceBuilder_.dispose();
+          priceBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Monetary value of the menu item/option on sale. Can be 0 to represent free.
+       * Required.
+       * </pre>
+       *
+       * <code>.google.type.Money price = 1;</code>
+       */
+      public com.google.type.Money.Builder getPriceBuilder() {
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return getPriceFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Monetary value of the menu item/option on sale. Can be 0 to represent free.
+       * Required.
+       * </pre>
+       *
+       * <code>.google.type.Money price = 1;</code>
+       */
+      public com.google.type.MoneyOrBuilder getPriceOrBuilder() {
+        if (priceBuilder_ != null) {
+          return priceBuilder_.getMessageOrBuilder();
+        } else {
+          return price_ == null ?
+              com.google.type.Money.getDefaultInstance() : price_;
+        }
+      }
+      /**
+       * <pre>
+       * Monetary value of the menu item/option on sale. Can be 0 to represent free.
+       * Required.
+       * </pre>
+       *
+       * <code>.google.type.Money price = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          com.google.type.Money, com.google.type.Money.Builder, com.google.type.MoneyOrBuilder> 
+          getPriceFieldBuilder() {
+        if (priceBuilder_ == null) {
+          priceBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              com.google.type.Money, com.google.type.Money.Builder, com.google.type.MoneyOrBuilder>(
+                  getPrice(),
+                  getParentForChildren(),
+                  isClean());
+          price_ = null;
+        }
+        return priceBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.Offer)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.Offer)
+    private static final food.menu.v1.FoodMenu.Offer DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.Offer();
+    }
+
+    public static food.menu.v1.FoodMenu.Offer getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Offer>
+        PARSER = new com.google.protobuf.AbstractParser<Offer>() {
+      @java.lang.Override
+      public Offer parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<Offer> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Offer> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.Offer getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface DisclaimerOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.Disclaimer)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * Body of the disclaimer text to be shown to the user.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField text = 1;</code>
+     * @return Whether the text field is set.
+     */
+    boolean hasText();
+    /**
+     * <pre>
+     * Body of the disclaimer text to be shown to the user.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField text = 1;</code>
+     * @return The text.
+     */
+    food.menu.v1.FoodMenu.TextField getText();
+    /**
+     * <pre>
+     * Body of the disclaimer text to be shown to the user.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField text = 1;</code>
+     */
+    food.menu.v1.FoodMenu.TextFieldOrBuilder getTextOrBuilder();
+
+    /**
+     * <pre>
+     * URL containing more information about the disclaimer.
+     * Optional.
+     * </pre>
+     *
+     * <code>string uri = 2;</code>
+     * @return The uri.
+     */
+    java.lang.String getUri();
+    /**
+     * <pre>
+     * URL containing more information about the disclaimer.
+     * Optional.
+     * </pre>
+     *
+     * <code>string uri = 2;</code>
+     * @return The bytes for uri.
+     */
+    com.google.protobuf.ByteString
+        getUriBytes();
+  }
+  /**
+   * <pre>
+   * Partner provided disclaimer shown to the user. Contains a text disclaimer
+   * along with an optional URL for more information.
+   * Some example include: associated medical risks/warnings, any additional
+   * fees/gratutity, etc.
+   * </pre>
+   *
+   * Protobuf type {@code food.menu.v1.Disclaimer}
+   */
+  public static final class Disclaimer extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.Disclaimer)
+      DisclaimerOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use Disclaimer.newBuilder() to construct.
+    private Disclaimer(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private Disclaimer() {
+      uri_ = "";
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new Disclaimer();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Disclaimer_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Disclaimer_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.Disclaimer.class, food.menu.v1.FoodMenu.Disclaimer.Builder.class);
+    }
+
+    public static final int TEXT_FIELD_NUMBER = 1;
+    private food.menu.v1.FoodMenu.TextField text_;
+    /**
+     * <pre>
+     * Body of the disclaimer text to be shown to the user.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField text = 1;</code>
+     * @return Whether the text field is set.
+     */
+    @java.lang.Override
+    public boolean hasText() {
+      return text_ != null;
+    }
+    /**
+     * <pre>
+     * Body of the disclaimer text to be shown to the user.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField text = 1;</code>
+     * @return The text.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextField getText() {
+      return text_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : text_;
+    }
+    /**
+     * <pre>
+     * Body of the disclaimer text to be shown to the user.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField text = 1;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextFieldOrBuilder getTextOrBuilder() {
+      return text_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : text_;
+    }
+
+    public static final int URI_FIELD_NUMBER = 2;
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object uri_ = "";
+    /**
+     * <pre>
+     * URL containing more information about the disclaimer.
+     * Optional.
+     * </pre>
+     *
+     * <code>string uri = 2;</code>
+     * @return The uri.
+     */
+    @java.lang.Override
+    public java.lang.String getUri() {
+      java.lang.Object ref = uri_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        uri_ = s;
+        return s;
+      }
+    }
+    /**
+     * <pre>
+     * URL containing more information about the disclaimer.
+     * Optional.
+     * </pre>
+     *
+     * <code>string uri = 2;</code>
+     * @return The bytes for uri.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getUriBytes() {
+      java.lang.Object ref = uri_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        uri_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (text_ != null) {
+        output.writeMessage(1, getText());
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uri_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, uri_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (text_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, getText());
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uri_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, uri_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.Disclaimer)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.Disclaimer other = (food.menu.v1.FoodMenu.Disclaimer) obj;
+
+      if (hasText() != other.hasText()) return false;
+      if (hasText()) {
+        if (!getText()
+            .equals(other.getText())) return false;
+      }
+      if (!getUri()
+          .equals(other.getUri())) return false;
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasText()) {
+        hash = (37 * hash) + TEXT_FIELD_NUMBER;
+        hash = (53 * hash) + getText().hashCode();
+      }
+      hash = (37 * hash) + URI_FIELD_NUMBER;
+      hash = (53 * hash) + getUri().hashCode();
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.Disclaimer parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Disclaimer parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Disclaimer parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Disclaimer parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Disclaimer parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Disclaimer parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Disclaimer parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Disclaimer parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Disclaimer parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Disclaimer parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Disclaimer parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Disclaimer parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.Disclaimer prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * Partner provided disclaimer shown to the user. Contains a text disclaimer
+     * along with an optional URL for more information.
+     * Some example include: associated medical risks/warnings, any additional
+     * fees/gratutity, etc.
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.Disclaimer}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.Disclaimer)
+        food.menu.v1.FoodMenu.DisclaimerOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Disclaimer_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Disclaimer_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.Disclaimer.class, food.menu.v1.FoodMenu.Disclaimer.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.Disclaimer.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        text_ = null;
+        if (textBuilder_ != null) {
+          textBuilder_.dispose();
+          textBuilder_ = null;
+        }
+        uri_ = "";
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Disclaimer_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Disclaimer getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.Disclaimer.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Disclaimer build() {
+        food.menu.v1.FoodMenu.Disclaimer result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Disclaimer buildPartial() {
+        food.menu.v1.FoodMenu.Disclaimer result = new food.menu.v1.FoodMenu.Disclaimer(this);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.Disclaimer result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.text_ = textBuilder_ == null
+              ? text_
+              : textBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000002) != 0)) {
+          result.uri_ = uri_;
+        }
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.Disclaimer) {
+          return mergeFrom((food.menu.v1.FoodMenu.Disclaimer)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.Disclaimer other) {
+        if (other == food.menu.v1.FoodMenu.Disclaimer.getDefaultInstance()) return this;
+        if (other.hasText()) {
+          mergeText(other.getText());
+        }
+        if (!other.getUri().isEmpty()) {
+          uri_ = other.uri_;
+          bitField0_ |= 0x00000002;
+          onChanged();
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                input.readMessage(
+                    getTextFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 10
+              case 18: {
+                uri_ = input.readStringRequireUtf8();
+                bitField0_ |= 0x00000002;
+                break;
+              } // case 18
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int bitField0_;
+
+      private food.menu.v1.FoodMenu.TextField text_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> textBuilder_;
+      /**
+       * <pre>
+       * Body of the disclaimer text to be shown to the user.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text = 1;</code>
+       * @return Whether the text field is set.
+       */
+      public boolean hasText() {
+        return ((bitField0_ & 0x00000001) != 0);
+      }
+      /**
+       * <pre>
+       * Body of the disclaimer text to be shown to the user.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text = 1;</code>
+       * @return The text.
+       */
+      public food.menu.v1.FoodMenu.TextField getText() {
+        if (textBuilder_ == null) {
+          return text_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : text_;
+        } else {
+          return textBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * Body of the disclaimer text to be shown to the user.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text = 1;</code>
+       */
+      public Builder setText(food.menu.v1.FoodMenu.TextField value) {
+        if (textBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          text_ = value;
+        } else {
+          textBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Body of the disclaimer text to be shown to the user.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text = 1;</code>
+       */
+      public Builder setText(
+          food.menu.v1.FoodMenu.TextField.Builder builderForValue) {
+        if (textBuilder_ == null) {
+          text_ = builderForValue.build();
+        } else {
+          textBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Body of the disclaimer text to be shown to the user.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text = 1;</code>
+       */
+      public Builder mergeText(food.menu.v1.FoodMenu.TextField value) {
+        if (textBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0) &&
+            text_ != null &&
+            text_ != food.menu.v1.FoodMenu.TextField.getDefaultInstance()) {
+            getTextBuilder().mergeFrom(value);
+          } else {
+            text_ = value;
+          }
+        } else {
+          textBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Body of the disclaimer text to be shown to the user.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text = 1;</code>
+       */
+      public Builder clearText() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        text_ = null;
+        if (textBuilder_ != null) {
+          textBuilder_.dispose();
+          textBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Body of the disclaimer text to be shown to the user.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.TextField.Builder getTextBuilder() {
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return getTextFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Body of the disclaimer text to be shown to the user.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.TextFieldOrBuilder getTextOrBuilder() {
+        if (textBuilder_ != null) {
+          return textBuilder_.getMessageOrBuilder();
+        } else {
+          return text_ == null ?
+              food.menu.v1.FoodMenu.TextField.getDefaultInstance() : text_;
+        }
+      }
+      /**
+       * <pre>
+       * Body of the disclaimer text to be shown to the user.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> 
+          getTextFieldBuilder() {
+        if (textBuilder_ == null) {
+          textBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder>(
+                  getText(),
+                  getParentForChildren(),
+                  isClean());
+          text_ = null;
+        }
+        return textBuilder_;
+      }
+
+      private java.lang.Object uri_ = "";
+      /**
+       * <pre>
+       * URL containing more information about the disclaimer.
+       * Optional.
+       * </pre>
+       *
+       * <code>string uri = 2;</code>
+       * @return The uri.
+       */
+      public java.lang.String getUri() {
+        java.lang.Object ref = uri_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          uri_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <pre>
+       * URL containing more information about the disclaimer.
+       * Optional.
+       * </pre>
+       *
+       * <code>string uri = 2;</code>
+       * @return The bytes for uri.
+       */
+      public com.google.protobuf.ByteString
+          getUriBytes() {
+        java.lang.Object ref = uri_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          uri_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <pre>
+       * URL containing more information about the disclaimer.
+       * Optional.
+       * </pre>
+       *
+       * <code>string uri = 2;</code>
+       * @param value The uri to set.
+       * @return This builder for chaining.
+       */
+      public Builder setUri(
+          java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        uri_ = value;
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * URL containing more information about the disclaimer.
+       * Optional.
+       * </pre>
+       *
+       * <code>string uri = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearUri() {
+        uri_ = getDefaultInstance().getUri();
+        bitField0_ = (bitField0_ & ~0x00000002);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * URL containing more information about the disclaimer.
+       * Optional.
+       * </pre>
+       *
+       * <code>string uri = 2;</code>
+       * @param value The bytes for uri to set.
+       * @return This builder for chaining.
+       */
+      public Builder setUriBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) { throw new NullPointerException(); }
+        checkByteStringIsUtf8(value);
+        uri_ = value;
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.Disclaimer)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.Disclaimer)
+    private static final food.menu.v1.FoodMenu.Disclaimer DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.Disclaimer();
+    }
+
+    public static food.menu.v1.FoodMenu.Disclaimer getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Disclaimer>
+        PARSER = new com.google.protobuf.AbstractParser<Disclaimer>() {
+      @java.lang.Override
+      public Disclaimer parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<Disclaimer> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Disclaimer> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.Disclaimer getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface TextFieldOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.TextField)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * Per-locale text values.
+     *
+     * If there is only one desired locale support, then the language_code within
+     * each text is not required to be set and the language will be inferred from
+     * the default language of the menu.
+     *
+     * If there are multiple texts across different locales, then the
+     * language_code must be set for each text. The first text in the list is
+     * considered the preferred representation.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .google.type.LocalizedText text = 1;</code>
+     */
+    java.util.List<com.google.type.LocalizedText> 
+        getTextList();
+    /**
+     * <pre>
+     * Per-locale text values.
+     *
+     * If there is only one desired locale support, then the language_code within
+     * each text is not required to be set and the language will be inferred from
+     * the default language of the menu.
+     *
+     * If there are multiple texts across different locales, then the
+     * language_code must be set for each text. The first text in the list is
+     * considered the preferred representation.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .google.type.LocalizedText text = 1;</code>
+     */
+    com.google.type.LocalizedText getText(int index);
+    /**
+     * <pre>
+     * Per-locale text values.
+     *
+     * If there is only one desired locale support, then the language_code within
+     * each text is not required to be set and the language will be inferred from
+     * the default language of the menu.
+     *
+     * If there are multiple texts across different locales, then the
+     * language_code must be set for each text. The first text in the list is
+     * considered the preferred representation.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .google.type.LocalizedText text = 1;</code>
+     */
+    int getTextCount();
+    /**
+     * <pre>
+     * Per-locale text values.
+     *
+     * If there is only one desired locale support, then the language_code within
+     * each text is not required to be set and the language will be inferred from
+     * the default language of the menu.
+     *
+     * If there are multiple texts across different locales, then the
+     * language_code must be set for each text. The first text in the list is
+     * considered the preferred representation.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .google.type.LocalizedText text = 1;</code>
+     */
+    java.util.List<? extends com.google.type.LocalizedTextOrBuilder> 
+        getTextOrBuilderList();
+    /**
+     * <pre>
+     * Per-locale text values.
+     *
+     * If there is only one desired locale support, then the language_code within
+     * each text is not required to be set and the language will be inferred from
+     * the default language of the menu.
+     *
+     * If there are multiple texts across different locales, then the
+     * language_code must be set for each text. The first text in the list is
+     * considered the preferred representation.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .google.type.LocalizedText text = 1;</code>
+     */
+    com.google.type.LocalizedTextOrBuilder getTextOrBuilder(
+        int index);
+  }
+  /**
+   * <pre>
+   * A text payload that contains one or more localized values.
+   * </pre>
+   *
+   * Protobuf type {@code food.menu.v1.TextField}
+   */
+  public static final class TextField extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.TextField)
+      TextFieldOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use TextField.newBuilder() to construct.
+    private TextField(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private TextField() {
+      text_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new TextField();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_TextField_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_TextField_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.TextField.class, food.menu.v1.FoodMenu.TextField.Builder.class);
+    }
+
+    public static final int TEXT_FIELD_NUMBER = 1;
+    @SuppressWarnings("serial")
+    private java.util.List<com.google.type.LocalizedText> text_;
+    /**
+     * <pre>
+     * Per-locale text values.
+     *
+     * If there is only one desired locale support, then the language_code within
+     * each text is not required to be set and the language will be inferred from
+     * the default language of the menu.
+     *
+     * If there are multiple texts across different locales, then the
+     * language_code must be set for each text. The first text in the list is
+     * considered the preferred representation.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .google.type.LocalizedText text = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<com.google.type.LocalizedText> getTextList() {
+      return text_;
+    }
+    /**
+     * <pre>
+     * Per-locale text values.
+     *
+     * If there is only one desired locale support, then the language_code within
+     * each text is not required to be set and the language will be inferred from
+     * the default language of the menu.
+     *
+     * If there are multiple texts across different locales, then the
+     * language_code must be set for each text. The first text in the list is
+     * considered the preferred representation.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .google.type.LocalizedText text = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends com.google.type.LocalizedTextOrBuilder> 
+        getTextOrBuilderList() {
+      return text_;
+    }
+    /**
+     * <pre>
+     * Per-locale text values.
+     *
+     * If there is only one desired locale support, then the language_code within
+     * each text is not required to be set and the language will be inferred from
+     * the default language of the menu.
+     *
+     * If there are multiple texts across different locales, then the
+     * language_code must be set for each text. The first text in the list is
+     * considered the preferred representation.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .google.type.LocalizedText text = 1;</code>
+     */
+    @java.lang.Override
+    public int getTextCount() {
+      return text_.size();
+    }
+    /**
+     * <pre>
+     * Per-locale text values.
+     *
+     * If there is only one desired locale support, then the language_code within
+     * each text is not required to be set and the language will be inferred from
+     * the default language of the menu.
+     *
+     * If there are multiple texts across different locales, then the
+     * language_code must be set for each text. The first text in the list is
+     * considered the preferred representation.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .google.type.LocalizedText text = 1;</code>
+     */
+    @java.lang.Override
+    public com.google.type.LocalizedText getText(int index) {
+      return text_.get(index);
+    }
+    /**
+     * <pre>
+     * Per-locale text values.
+     *
+     * If there is only one desired locale support, then the language_code within
+     * each text is not required to be set and the language will be inferred from
+     * the default language of the menu.
+     *
+     * If there are multiple texts across different locales, then the
+     * language_code must be set for each text. The first text in the list is
+     * considered the preferred representation.
+     * Required.
+     * </pre>
+     *
+     * <code>repeated .google.type.LocalizedText text = 1;</code>
+     */
+    @java.lang.Override
+    public com.google.type.LocalizedTextOrBuilder getTextOrBuilder(
+        int index) {
+      return text_.get(index);
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      for (int i = 0; i < text_.size(); i++) {
+        output.writeMessage(1, text_.get(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      for (int i = 0; i < text_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, text_.get(i));
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.TextField)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.TextField other = (food.menu.v1.FoodMenu.TextField) obj;
+
+      if (!getTextList()
+          .equals(other.getTextList())) return false;
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (getTextCount() > 0) {
+        hash = (37 * hash) + TEXT_FIELD_NUMBER;
+        hash = (53 * hash) + getTextList().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.TextField parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.TextField parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.TextField parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.TextField parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.TextField parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.TextField parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.TextField parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.TextField parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.TextField parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.TextField parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.TextField parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.TextField parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.TextField prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * A text payload that contains one or more localized values.
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.TextField}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.TextField)
+        food.menu.v1.FoodMenu.TextFieldOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_TextField_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_TextField_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.TextField.class, food.menu.v1.FoodMenu.TextField.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.TextField.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        if (textBuilder_ == null) {
+          text_ = java.util.Collections.emptyList();
+        } else {
+          text_ = null;
+          textBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_TextField_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.TextField getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.TextField.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.TextField build() {
+        food.menu.v1.FoodMenu.TextField result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.TextField buildPartial() {
+        food.menu.v1.FoodMenu.TextField result = new food.menu.v1.FoodMenu.TextField(this);
+        buildPartialRepeatedFields(result);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartialRepeatedFields(food.menu.v1.FoodMenu.TextField result) {
+        if (textBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            text_ = java.util.Collections.unmodifiableList(text_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.text_ = text_;
+        } else {
+          result.text_ = textBuilder_.build();
+        }
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.TextField result) {
+        int from_bitField0_ = bitField0_;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.TextField) {
+          return mergeFrom((food.menu.v1.FoodMenu.TextField)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.TextField other) {
+        if (other == food.menu.v1.FoodMenu.TextField.getDefaultInstance()) return this;
+        if (textBuilder_ == null) {
+          if (!other.text_.isEmpty()) {
+            if (text_.isEmpty()) {
+              text_ = other.text_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureTextIsMutable();
+              text_.addAll(other.text_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.text_.isEmpty()) {
+            if (textBuilder_.isEmpty()) {
+              textBuilder_.dispose();
+              textBuilder_ = null;
+              text_ = other.text_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              textBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getTextFieldBuilder() : null;
+            } else {
+              textBuilder_.addAllMessages(other.text_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                com.google.type.LocalizedText m =
+                    input.readMessage(
+                        com.google.type.LocalizedText.parser(),
+                        extensionRegistry);
+                if (textBuilder_ == null) {
+                  ensureTextIsMutable();
+                  text_.add(m);
+                } else {
+                  textBuilder_.addMessage(m);
+                }
+                break;
+              } // case 10
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int bitField0_;
+
+      private java.util.List<com.google.type.LocalizedText> text_ =
+        java.util.Collections.emptyList();
+      private void ensureTextIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          text_ = new java.util.ArrayList<com.google.type.LocalizedText>(text_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          com.google.type.LocalizedText, com.google.type.LocalizedText.Builder, com.google.type.LocalizedTextOrBuilder> textBuilder_;
+
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public java.util.List<com.google.type.LocalizedText> getTextList() {
+        if (textBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(text_);
+        } else {
+          return textBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public int getTextCount() {
+        if (textBuilder_ == null) {
+          return text_.size();
+        } else {
+          return textBuilder_.getCount();
+        }
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public com.google.type.LocalizedText getText(int index) {
+        if (textBuilder_ == null) {
+          return text_.get(index);
+        } else {
+          return textBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public Builder setText(
+          int index, com.google.type.LocalizedText value) {
+        if (textBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureTextIsMutable();
+          text_.set(index, value);
+          onChanged();
+        } else {
+          textBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public Builder setText(
+          int index, com.google.type.LocalizedText.Builder builderForValue) {
+        if (textBuilder_ == null) {
+          ensureTextIsMutable();
+          text_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          textBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public Builder addText(com.google.type.LocalizedText value) {
+        if (textBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureTextIsMutable();
+          text_.add(value);
+          onChanged();
+        } else {
+          textBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public Builder addText(
+          int index, com.google.type.LocalizedText value) {
+        if (textBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureTextIsMutable();
+          text_.add(index, value);
+          onChanged();
+        } else {
+          textBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public Builder addText(
+          com.google.type.LocalizedText.Builder builderForValue) {
+        if (textBuilder_ == null) {
+          ensureTextIsMutable();
+          text_.add(builderForValue.build());
+          onChanged();
+        } else {
+          textBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public Builder addText(
+          int index, com.google.type.LocalizedText.Builder builderForValue) {
+        if (textBuilder_ == null) {
+          ensureTextIsMutable();
+          text_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          textBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public Builder addAllText(
+          java.lang.Iterable<? extends com.google.type.LocalizedText> values) {
+        if (textBuilder_ == null) {
+          ensureTextIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, text_);
+          onChanged();
+        } else {
+          textBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public Builder clearText() {
+        if (textBuilder_ == null) {
+          text_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          textBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public Builder removeText(int index) {
+        if (textBuilder_ == null) {
+          ensureTextIsMutable();
+          text_.remove(index);
+          onChanged();
+        } else {
+          textBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public com.google.type.LocalizedText.Builder getTextBuilder(
+          int index) {
+        return getTextFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public com.google.type.LocalizedTextOrBuilder getTextOrBuilder(
+          int index) {
+        if (textBuilder_ == null) {
+          return text_.get(index);  } else {
+          return textBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public java.util.List<? extends com.google.type.LocalizedTextOrBuilder> 
+           getTextOrBuilderList() {
+        if (textBuilder_ != null) {
+          return textBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(text_);
+        }
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public com.google.type.LocalizedText.Builder addTextBuilder() {
+        return getTextFieldBuilder().addBuilder(
+            com.google.type.LocalizedText.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public com.google.type.LocalizedText.Builder addTextBuilder(
+          int index) {
+        return getTextFieldBuilder().addBuilder(
+            index, com.google.type.LocalizedText.getDefaultInstance());
+      }
+      /**
+       * <pre>
+       * Per-locale text values.
+       *
+       * If there is only one desired locale support, then the language_code within
+       * each text is not required to be set and the language will be inferred from
+       * the default language of the menu.
+       *
+       * If there are multiple texts across different locales, then the
+       * language_code must be set for each text. The first text in the list is
+       * considered the preferred representation.
+       * Required.
+       * </pre>
+       *
+       * <code>repeated .google.type.LocalizedText text = 1;</code>
+       */
+      public java.util.List<com.google.type.LocalizedText.Builder> 
+           getTextBuilderList() {
+        return getTextFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          com.google.type.LocalizedText, com.google.type.LocalizedText.Builder, com.google.type.LocalizedTextOrBuilder> 
+          getTextFieldBuilder() {
+        if (textBuilder_ == null) {
+          textBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              com.google.type.LocalizedText, com.google.type.LocalizedText.Builder, com.google.type.LocalizedTextOrBuilder>(
+                  text_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          text_ = null;
+        }
+        return textBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.TextField)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.TextField)
+    private static final food.menu.v1.FoodMenu.TextField DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.TextField();
+    }
+
+    public static food.menu.v1.FoodMenu.TextField getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<TextField>
+        PARSER = new com.google.protobuf.AbstractParser<TextField>() {
+      @java.lang.Override
+      public TextField parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<TextField> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<TextField> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextField getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface ImageOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.Image)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * URL containing the raw pixels of the image.
+     * Required.
+     * </pre>
+     *
+     * <code>string uri = 1;</code>
+     * @return The uri.
+     */
+    java.lang.String getUri();
+    /**
+     * <pre>
+     * URL containing the raw pixels of the image.
+     * Required.
+     * </pre>
+     *
+     * <code>string uri = 1;</code>
+     * @return The bytes for uri.
+     */
+    com.google.protobuf.ByteString
+        getUriBytes();
+  }
+  /**
+   * <pre>
+   * Represents an image associated with a menu entity.
+   * </pre>
+   *
+   * Protobuf type {@code food.menu.v1.Image}
+   */
+  public static final class Image extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.Image)
+      ImageOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use Image.newBuilder() to construct.
+    private Image(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private Image() {
+      uri_ = "";
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new Image();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Image_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Image_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.Image.class, food.menu.v1.FoodMenu.Image.Builder.class);
+    }
+
+    public static final int URI_FIELD_NUMBER = 1;
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object uri_ = "";
+    /**
+     * <pre>
+     * URL containing the raw pixels of the image.
+     * Required.
+     * </pre>
+     *
+     * <code>string uri = 1;</code>
+     * @return The uri.
+     */
+    @java.lang.Override
+    public java.lang.String getUri() {
+      java.lang.Object ref = uri_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        uri_ = s;
+        return s;
+      }
+    }
+    /**
+     * <pre>
+     * URL containing the raw pixels of the image.
+     * Required.
+     * </pre>
+     *
+     * <code>string uri = 1;</code>
+     * @return The bytes for uri.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getUriBytes() {
+      java.lang.Object ref = uri_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        uri_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uri_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, uri_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uri_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, uri_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.Image)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.Image other = (food.menu.v1.FoodMenu.Image) obj;
+
+      if (!getUri()
+          .equals(other.getUri())) return false;
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + URI_FIELD_NUMBER;
+      hash = (53 * hash) + getUri().hashCode();
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.Image parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Image parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Image parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Image parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Image parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Image parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Image parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Image parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Image parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Image parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Image parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Image parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.Image prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * Represents an image associated with a menu entity.
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.Image}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.Image)
+        food.menu.v1.FoodMenu.ImageOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Image_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Image_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.Image.class, food.menu.v1.FoodMenu.Image.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.Image.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        uri_ = "";
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Image_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Image getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.Image.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Image build() {
+        food.menu.v1.FoodMenu.Image result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Image buildPartial() {
+        food.menu.v1.FoodMenu.Image result = new food.menu.v1.FoodMenu.Image(this);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.Image result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.uri_ = uri_;
+        }
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.Image) {
+          return mergeFrom((food.menu.v1.FoodMenu.Image)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.Image other) {
+        if (other == food.menu.v1.FoodMenu.Image.getDefaultInstance()) return this;
+        if (!other.getUri().isEmpty()) {
+          uri_ = other.uri_;
+          bitField0_ |= 0x00000001;
+          onChanged();
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                uri_ = input.readStringRequireUtf8();
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 10
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int bitField0_;
+
+      private java.lang.Object uri_ = "";
+      /**
+       * <pre>
+       * URL containing the raw pixels of the image.
+       * Required.
+       * </pre>
+       *
+       * <code>string uri = 1;</code>
+       * @return The uri.
+       */
+      public java.lang.String getUri() {
+        java.lang.Object ref = uri_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          uri_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <pre>
+       * URL containing the raw pixels of the image.
+       * Required.
+       * </pre>
+       *
+       * <code>string uri = 1;</code>
+       * @return The bytes for uri.
+       */
+      public com.google.protobuf.ByteString
+          getUriBytes() {
+        java.lang.Object ref = uri_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          uri_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <pre>
+       * URL containing the raw pixels of the image.
+       * Required.
+       * </pre>
+       *
+       * <code>string uri = 1;</code>
+       * @param value The uri to set.
+       * @return This builder for chaining.
+       */
+      public Builder setUri(
+          java.lang.String value) {
+        if (value == null) { throw new NullPointerException(); }
+        uri_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * URL containing the raw pixels of the image.
+       * Required.
+       * </pre>
+       *
+       * <code>string uri = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearUri() {
+        uri_ = getDefaultInstance().getUri();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * URL containing the raw pixels of the image.
+       * Required.
+       * </pre>
+       *
+       * <code>string uri = 1;</code>
+       * @param value The bytes for uri to set.
+       * @return This builder for chaining.
+       */
+      public Builder setUriBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) { throw new NullPointerException(); }
+        checkByteStringIsUtf8(value);
+        uri_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.Image)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.Image)
+    private static final food.menu.v1.FoodMenu.Image DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.Image();
+    }
+
+    public static food.menu.v1.FoodMenu.Image getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Image>
+        PARSER = new com.google.protobuf.AbstractParser<Image>() {
+      @java.lang.Override
+      public Image parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<Image> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Image> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.Image getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface MenuItemOptionPropertyOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.MenuItemOptionProperty)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * The type of this option property.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemOptionProperty.PropertyType property_type = 1;</code>
+     * @return The enum numeric value on the wire for propertyType.
+     */
+    int getPropertyTypeValue();
+    /**
+     * <pre>
+     * The type of this option property.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemOptionProperty.PropertyType property_type = 1;</code>
+     * @return The propertyType.
+     */
+    food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyType getPropertyType();
+
+    /**
+     * <pre>
+     * A well-defined value for the option property. Currently only expected
+     * if the property_type is PIZZA_SIDE.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemOptionProperty.PropertyValue property_val = 2;</code>
+     * @return Whether the propertyVal field is set.
+     */
+    boolean hasPropertyVal();
+    /**
+     * <pre>
+     * A well-defined value for the option property. Currently only expected
+     * if the property_type is PIZZA_SIDE.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemOptionProperty.PropertyValue property_val = 2;</code>
+     * @return The enum numeric value on the wire for propertyVal.
+     */
+    int getPropertyValValue();
+    /**
+     * <pre>
+     * A well-defined value for the option property. Currently only expected
+     * if the property_type is PIZZA_SIDE.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemOptionProperty.PropertyValue property_val = 2;</code>
+     * @return The propertyVal.
+     */
+    food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyValue getPropertyVal();
+
+    /**
+     * <pre>
+     * A free-form text for the value of the property. Expected for
+     * property_type OPTION and SIZE.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField text_val = 3;</code>
+     * @return Whether the textVal field is set.
+     */
+    boolean hasTextVal();
+    /**
+     * <pre>
+     * A free-form text for the value of the property. Expected for
+     * property_type OPTION and SIZE.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField text_val = 3;</code>
+     * @return The textVal.
+     */
+    food.menu.v1.FoodMenu.TextField getTextVal();
+    /**
+     * <pre>
+     * A free-form text for the value of the property. Expected for
+     * property_type OPTION and SIZE.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField text_val = 3;</code>
+     */
+    food.menu.v1.FoodMenu.TextFieldOrBuilder getTextValOrBuilder();
+
+    food.menu.v1.FoodMenu.MenuItemOptionProperty.ValueCase getValueCase();
+  }
+  /**
+   * <pre>
+   * Describes the property of a menu item option and its value.
+   * </pre>
+   *
+   * Protobuf type {@code food.menu.v1.MenuItemOptionProperty}
+   */
+  public static final class MenuItemOptionProperty extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.MenuItemOptionProperty)
+      MenuItemOptionPropertyOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use MenuItemOptionProperty.newBuilder() to construct.
+    private MenuItemOptionProperty(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private MenuItemOptionProperty() {
+      propertyType_ = 0;
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new MenuItemOptionProperty();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItemOptionProperty_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItemOptionProperty_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.MenuItemOptionProperty.class, food.menu.v1.FoodMenu.MenuItemOptionProperty.Builder.class);
+    }
+
+    /**
+     * <pre>
+     * Types of property that the option is for.
+     * </pre>
+     *
+     * Protobuf enum {@code food.menu.v1.MenuItemOptionProperty.PropertyType}
+     */
+    public enum PropertyType
+        implements com.google.protobuf.ProtocolMessageEnum {
+      /**
+       * <pre>
+       * Do not use. The property type is not explicitly specified.
+       * </pre>
+       *
+       * <code>UNKNOWN_PROPERTY_TYPE = 0;</code>
+       */
+      UNKNOWN_PROPERTY_TYPE(0),
+      /**
+       * <pre>
+       * A generic menu item option property, which is not one of the more
+       * specific types below. Use this if the property is not of type
+       * SIZE or PIZZA_SIDE.
+       * </pre>
+       *
+       * <code>OPTION = 1;</code>
+       */
+      OPTION(1),
+      /**
+       * <pre>
+       * Denotes the menu item option property of size (e.g. small, medium, or
+       * large).
+       * </pre>
+       *
+       * <code>SIZE = 2;</code>
+       */
+      SIZE(2),
+      /**
+       * <pre>
+       * Property specific to pizzas. For example: this MenuItemOption is only
+       * valid for a portion/whole pizza, such as mushroom toppings on the left
+       * side, right side, or whole pizza).
+       * </pre>
+       *
+       * <code>PIZZA_SIDE = 3;</code>
+       */
+      PIZZA_SIDE(3),
+      UNRECOGNIZED(-1),
+      ;
+
+      /**
+       * <pre>
+       * Do not use. The property type is not explicitly specified.
+       * </pre>
+       *
+       * <code>UNKNOWN_PROPERTY_TYPE = 0;</code>
+       */
+      public static final int UNKNOWN_PROPERTY_TYPE_VALUE = 0;
+      /**
+       * <pre>
+       * A generic menu item option property, which is not one of the more
+       * specific types below. Use this if the property is not of type
+       * SIZE or PIZZA_SIDE.
+       * </pre>
+       *
+       * <code>OPTION = 1;</code>
+       */
+      public static final int OPTION_VALUE = 1;
+      /**
+       * <pre>
+       * Denotes the menu item option property of size (e.g. small, medium, or
+       * large).
+       * </pre>
+       *
+       * <code>SIZE = 2;</code>
+       */
+      public static final int SIZE_VALUE = 2;
+      /**
+       * <pre>
+       * Property specific to pizzas. For example: this MenuItemOption is only
+       * valid for a portion/whole pizza, such as mushroom toppings on the left
+       * side, right side, or whole pizza).
+       * </pre>
+       *
+       * <code>PIZZA_SIDE = 3;</code>
+       */
+      public static final int PIZZA_SIDE_VALUE = 3;
+
+
+      public final int getNumber() {
+        if (this == UNRECOGNIZED) {
+          throw new java.lang.IllegalArgumentException(
+              "Can't get the number of an unknown enum value.");
+        }
+        return value;
+      }
+
+      /**
+       * @param value The numeric wire value of the corresponding enum entry.
+       * @return The enum associated with the given numeric wire value.
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
+      public static PropertyType valueOf(int value) {
+        return forNumber(value);
+      }
+
+      /**
+       * @param value The numeric wire value of the corresponding enum entry.
+       * @return The enum associated with the given numeric wire value.
+       */
+      public static PropertyType forNumber(int value) {
+        switch (value) {
+          case 0: return UNKNOWN_PROPERTY_TYPE;
+          case 1: return OPTION;
+          case 2: return SIZE;
+          case 3: return PIZZA_SIDE;
+          default: return null;
+        }
+      }
+
+      public static com.google.protobuf.Internal.EnumLiteMap<PropertyType>
+          internalGetValueMap() {
+        return internalValueMap;
+      }
+      private static final com.google.protobuf.Internal.EnumLiteMap<
+          PropertyType> internalValueMap =
+            new com.google.protobuf.Internal.EnumLiteMap<PropertyType>() {
+              public PropertyType findValueByNumber(int number) {
+                return PropertyType.forNumber(number);
+              }
+            };
+
+      public final com.google.protobuf.Descriptors.EnumValueDescriptor
+          getValueDescriptor() {
+        if (this == UNRECOGNIZED) {
+          throw new java.lang.IllegalStateException(
+              "Can't get the descriptor of an unrecognized enum value.");
+        }
+        return getDescriptor().getValues().get(ordinal());
+      }
+      public final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptorForType() {
+        return getDescriptor();
+      }
+      public static final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.MenuItemOptionProperty.getDescriptor().getEnumTypes().get(0);
+      }
+
+      private static final PropertyType[] VALUES = values();
+
+      public static PropertyType valueOf(
+          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+        if (desc.getType() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "EnumValueDescriptor is not for this type.");
+        }
+        if (desc.getIndex() == -1) {
+          return UNRECOGNIZED;
+        }
+        return VALUES[desc.getIndex()];
+      }
+
+      private final int value;
+
+      private PropertyType(int value) {
+        this.value = value;
+      }
+
+      // @@protoc_insertion_point(enum_scope:food.menu.v1.MenuItemOptionProperty.PropertyType)
+    }
+
+    /**
+     * <pre>
+     * Well-defined values for the option property.
+     * </pre>
+     *
+     * Protobuf enum {@code food.menu.v1.MenuItemOptionProperty.PropertyValue}
+     */
+    public enum PropertyValue
+        implements com.google.protobuf.ProtocolMessageEnum {
+      /**
+       * <pre>
+       * Do not use. The property value is not explicitly specified.
+       * </pre>
+       *
+       * <code>UNKNOWN_PROPERTY_VALUE = 0;</code>
+       */
+      UNKNOWN_PROPERTY_VALUE(0),
+      /**
+       * <pre>
+       * The MenuItemOption applies only to the left side of a pizza.
+       * </pre>
+       *
+       * <code>PIZZA_SIDE_LEFT = 1;</code>
+       */
+      PIZZA_SIDE_LEFT(1),
+      /**
+       * <pre>
+       * The MenuItemOption applies only to the right side of a pizza.
+       * </pre>
+       *
+       * <code>PIZZA_SIDE_RIGHT = 2;</code>
+       */
+      PIZZA_SIDE_RIGHT(2),
+      /**
+       * <pre>
+       * The MenuItemOption applies to the entire pizza.
+       * </pre>
+       *
+       * <code>PIZZA_SIDE_WHOLE = 3;</code>
+       */
+      PIZZA_SIDE_WHOLE(3),
+      UNRECOGNIZED(-1),
+      ;
+
+      /**
+       * <pre>
+       * Do not use. The property value is not explicitly specified.
+       * </pre>
+       *
+       * <code>UNKNOWN_PROPERTY_VALUE = 0;</code>
+       */
+      public static final int UNKNOWN_PROPERTY_VALUE_VALUE = 0;
+      /**
+       * <pre>
+       * The MenuItemOption applies only to the left side of a pizza.
+       * </pre>
+       *
+       * <code>PIZZA_SIDE_LEFT = 1;</code>
+       */
+      public static final int PIZZA_SIDE_LEFT_VALUE = 1;
+      /**
+       * <pre>
+       * The MenuItemOption applies only to the right side of a pizza.
+       * </pre>
+       *
+       * <code>PIZZA_SIDE_RIGHT = 2;</code>
+       */
+      public static final int PIZZA_SIDE_RIGHT_VALUE = 2;
+      /**
+       * <pre>
+       * The MenuItemOption applies to the entire pizza.
+       * </pre>
+       *
+       * <code>PIZZA_SIDE_WHOLE = 3;</code>
+       */
+      public static final int PIZZA_SIDE_WHOLE_VALUE = 3;
+
+
+      public final int getNumber() {
+        if (this == UNRECOGNIZED) {
+          throw new java.lang.IllegalArgumentException(
+              "Can't get the number of an unknown enum value.");
+        }
+        return value;
+      }
+
+      /**
+       * @param value The numeric wire value of the corresponding enum entry.
+       * @return The enum associated with the given numeric wire value.
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
+      public static PropertyValue valueOf(int value) {
+        return forNumber(value);
+      }
+
+      /**
+       * @param value The numeric wire value of the corresponding enum entry.
+       * @return The enum associated with the given numeric wire value.
+       */
+      public static PropertyValue forNumber(int value) {
+        switch (value) {
+          case 0: return UNKNOWN_PROPERTY_VALUE;
+          case 1: return PIZZA_SIDE_LEFT;
+          case 2: return PIZZA_SIDE_RIGHT;
+          case 3: return PIZZA_SIDE_WHOLE;
+          default: return null;
+        }
+      }
+
+      public static com.google.protobuf.Internal.EnumLiteMap<PropertyValue>
+          internalGetValueMap() {
+        return internalValueMap;
+      }
+      private static final com.google.protobuf.Internal.EnumLiteMap<
+          PropertyValue> internalValueMap =
+            new com.google.protobuf.Internal.EnumLiteMap<PropertyValue>() {
+              public PropertyValue findValueByNumber(int number) {
+                return PropertyValue.forNumber(number);
+              }
+            };
+
+      public final com.google.protobuf.Descriptors.EnumValueDescriptor
+          getValueDescriptor() {
+        if (this == UNRECOGNIZED) {
+          throw new java.lang.IllegalStateException(
+              "Can't get the descriptor of an unrecognized enum value.");
+        }
+        return getDescriptor().getValues().get(ordinal());
+      }
+      public final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptorForType() {
+        return getDescriptor();
+      }
+      public static final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.MenuItemOptionProperty.getDescriptor().getEnumTypes().get(1);
+      }
+
+      private static final PropertyValue[] VALUES = values();
+
+      public static PropertyValue valueOf(
+          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+        if (desc.getType() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "EnumValueDescriptor is not for this type.");
+        }
+        if (desc.getIndex() == -1) {
+          return UNRECOGNIZED;
+        }
+        return VALUES[desc.getIndex()];
+      }
+
+      private final int value;
+
+      private PropertyValue(int value) {
+        this.value = value;
+      }
+
+      // @@protoc_insertion_point(enum_scope:food.menu.v1.MenuItemOptionProperty.PropertyValue)
+    }
+
+    private int valueCase_ = 0;
+    @SuppressWarnings("serial")
+    private java.lang.Object value_;
+    public enum ValueCase
+        implements com.google.protobuf.Internal.EnumLite,
+            com.google.protobuf.AbstractMessage.InternalOneOfEnum {
+      PROPERTY_VAL(2),
+      TEXT_VAL(3),
+      VALUE_NOT_SET(0);
+      private final int value;
+      private ValueCase(int value) {
+        this.value = value;
+      }
+      /**
+       * @param value The number of the enum to look for.
+       * @return The enum associated with the given number.
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
+      public static ValueCase valueOf(int value) {
+        return forNumber(value);
+      }
+
+      public static ValueCase forNumber(int value) {
+        switch (value) {
+          case 2: return PROPERTY_VAL;
+          case 3: return TEXT_VAL;
+          case 0: return VALUE_NOT_SET;
+          default: return null;
+        }
+      }
+      public int getNumber() {
+        return this.value;
+      }
+    };
+
+    public ValueCase
+    getValueCase() {
+      return ValueCase.forNumber(
+          valueCase_);
+    }
+
+    public static final int PROPERTY_TYPE_FIELD_NUMBER = 1;
+    private int propertyType_ = 0;
+    /**
+     * <pre>
+     * The type of this option property.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemOptionProperty.PropertyType property_type = 1;</code>
+     * @return The enum numeric value on the wire for propertyType.
+     */
+    @java.lang.Override public int getPropertyTypeValue() {
+      return propertyType_;
+    }
+    /**
+     * <pre>
+     * The type of this option property.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemOptionProperty.PropertyType property_type = 1;</code>
+     * @return The propertyType.
+     */
+    @java.lang.Override public food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyType getPropertyType() {
+      food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyType result = food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyType.forNumber(propertyType_);
+      return result == null ? food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyType.UNRECOGNIZED : result;
+    }
+
+    public static final int PROPERTY_VAL_FIELD_NUMBER = 2;
+    /**
+     * <pre>
+     * A well-defined value for the option property. Currently only expected
+     * if the property_type is PIZZA_SIDE.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemOptionProperty.PropertyValue property_val = 2;</code>
+     * @return Whether the propertyVal field is set.
+     */
+    public boolean hasPropertyVal() {
+      return valueCase_ == 2;
+    }
+    /**
+     * <pre>
+     * A well-defined value for the option property. Currently only expected
+     * if the property_type is PIZZA_SIDE.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemOptionProperty.PropertyValue property_val = 2;</code>
+     * @return The enum numeric value on the wire for propertyVal.
+     */
+    public int getPropertyValValue() {
+      if (valueCase_ == 2) {
+        return (java.lang.Integer) value_;
+      }
+      return 0;
+    }
+    /**
+     * <pre>
+     * A well-defined value for the option property. Currently only expected
+     * if the property_type is PIZZA_SIDE.
+     * </pre>
+     *
+     * <code>.food.menu.v1.MenuItemOptionProperty.PropertyValue property_val = 2;</code>
+     * @return The propertyVal.
+     */
+    public food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyValue getPropertyVal() {
+      if (valueCase_ == 2) {
+        food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyValue result = food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyValue.forNumber(
+            (java.lang.Integer) value_);
+        return result == null ? food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyValue.UNRECOGNIZED : result;
+      }
+      return food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyValue.UNKNOWN_PROPERTY_VALUE;
+    }
+
+    public static final int TEXT_VAL_FIELD_NUMBER = 3;
+    /**
+     * <pre>
+     * A free-form text for the value of the property. Expected for
+     * property_type OPTION and SIZE.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField text_val = 3;</code>
+     * @return Whether the textVal field is set.
+     */
+    @java.lang.Override
+    public boolean hasTextVal() {
+      return valueCase_ == 3;
+    }
+    /**
+     * <pre>
+     * A free-form text for the value of the property. Expected for
+     * property_type OPTION and SIZE.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField text_val = 3;</code>
+     * @return The textVal.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextField getTextVal() {
+      if (valueCase_ == 3) {
+         return (food.menu.v1.FoodMenu.TextField) value_;
+      }
+      return food.menu.v1.FoodMenu.TextField.getDefaultInstance();
+    }
+    /**
+     * <pre>
+     * A free-form text for the value of the property. Expected for
+     * property_type OPTION and SIZE.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField text_val = 3;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextFieldOrBuilder getTextValOrBuilder() {
+      if (valueCase_ == 3) {
+         return (food.menu.v1.FoodMenu.TextField) value_;
+      }
+      return food.menu.v1.FoodMenu.TextField.getDefaultInstance();
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (propertyType_ != food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyType.UNKNOWN_PROPERTY_TYPE.getNumber()) {
+        output.writeEnum(1, propertyType_);
+      }
+      if (valueCase_ == 2) {
+        output.writeEnum(2, ((java.lang.Integer) value_));
+      }
+      if (valueCase_ == 3) {
+        output.writeMessage(3, (food.menu.v1.FoodMenu.TextField) value_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (propertyType_ != food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyType.UNKNOWN_PROPERTY_TYPE.getNumber()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(1, propertyType_);
+      }
+      if (valueCase_ == 2) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(2, ((java.lang.Integer) value_));
+      }
+      if (valueCase_ == 3) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, (food.menu.v1.FoodMenu.TextField) value_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.MenuItemOptionProperty)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.MenuItemOptionProperty other = (food.menu.v1.FoodMenu.MenuItemOptionProperty) obj;
+
+      if (propertyType_ != other.propertyType_) return false;
+      if (!getValueCase().equals(other.getValueCase())) return false;
+      switch (valueCase_) {
+        case 2:
+          if (getPropertyValValue()
+              != other.getPropertyValValue()) return false;
+          break;
+        case 3:
+          if (!getTextVal()
+              .equals(other.getTextVal())) return false;
+          break;
+        case 0:
+        default:
+      }
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + PROPERTY_TYPE_FIELD_NUMBER;
+      hash = (53 * hash) + propertyType_;
+      switch (valueCase_) {
+        case 2:
+          hash = (37 * hash) + PROPERTY_VAL_FIELD_NUMBER;
+          hash = (53 * hash) + getPropertyValValue();
+          break;
+        case 3:
+          hash = (37 * hash) + TEXT_VAL_FIELD_NUMBER;
+          hash = (53 * hash) + getTextVal().hashCode();
+          break;
+        case 0:
+        default:
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.MenuItemOptionProperty parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOptionProperty parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOptionProperty parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOptionProperty parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOptionProperty parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOptionProperty parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOptionProperty parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOptionProperty parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOptionProperty parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOptionProperty parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOptionProperty parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.MenuItemOptionProperty parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.MenuItemOptionProperty prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * Describes the property of a menu item option and its value.
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.MenuItemOptionProperty}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.MenuItemOptionProperty)
+        food.menu.v1.FoodMenu.MenuItemOptionPropertyOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItemOptionProperty_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItemOptionProperty_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.MenuItemOptionProperty.class, food.menu.v1.FoodMenu.MenuItemOptionProperty.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.MenuItemOptionProperty.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        propertyType_ = 0;
+        if (textValBuilder_ != null) {
+          textValBuilder_.clear();
+        }
+        valueCase_ = 0;
+        value_ = null;
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_MenuItemOptionProperty_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItemOptionProperty getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.MenuItemOptionProperty.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItemOptionProperty build() {
+        food.menu.v1.FoodMenu.MenuItemOptionProperty result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItemOptionProperty buildPartial() {
+        food.menu.v1.FoodMenu.MenuItemOptionProperty result = new food.menu.v1.FoodMenu.MenuItemOptionProperty(this);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        buildPartialOneofs(result);
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.MenuItemOptionProperty result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.propertyType_ = propertyType_;
+        }
+      }
+
+      private void buildPartialOneofs(food.menu.v1.FoodMenu.MenuItemOptionProperty result) {
+        result.valueCase_ = valueCase_;
+        result.value_ = this.value_;
+        if (valueCase_ == 3 &&
+            textValBuilder_ != null) {
+          result.value_ = textValBuilder_.build();
+        }
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.MenuItemOptionProperty) {
+          return mergeFrom((food.menu.v1.FoodMenu.MenuItemOptionProperty)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.MenuItemOptionProperty other) {
+        if (other == food.menu.v1.FoodMenu.MenuItemOptionProperty.getDefaultInstance()) return this;
+        if (other.propertyType_ != 0) {
+          setPropertyTypeValue(other.getPropertyTypeValue());
+        }
+        switch (other.getValueCase()) {
+          case PROPERTY_VAL: {
+            setPropertyValValue(other.getPropertyValValue());
+            break;
+          }
+          case TEXT_VAL: {
+            mergeTextVal(other.getTextVal());
+            break;
+          }
+          case VALUE_NOT_SET: {
+            break;
+          }
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 8: {
+                propertyType_ = input.readEnum();
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 8
+              case 16: {
+                int rawValue = input.readEnum();
+                valueCase_ = 2;
+                value_ = rawValue;
+                break;
+              } // case 16
+              case 26: {
+                input.readMessage(
+                    getTextValFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                valueCase_ = 3;
+                break;
+              } // case 26
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int valueCase_ = 0;
+      private java.lang.Object value_;
+      public ValueCase
+          getValueCase() {
+        return ValueCase.forNumber(
+            valueCase_);
+      }
+
+      public Builder clearValue() {
+        valueCase_ = 0;
+        value_ = null;
+        onChanged();
+        return this;
+      }
+
+      private int bitField0_;
+
+      private int propertyType_ = 0;
+      /**
+       * <pre>
+       * The type of this option property.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty.PropertyType property_type = 1;</code>
+       * @return The enum numeric value on the wire for propertyType.
+       */
+      @java.lang.Override public int getPropertyTypeValue() {
+        return propertyType_;
+      }
+      /**
+       * <pre>
+       * The type of this option property.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty.PropertyType property_type = 1;</code>
+       * @param value The enum numeric value on the wire for propertyType to set.
+       * @return This builder for chaining.
+       */
+      public Builder setPropertyTypeValue(int value) {
+        propertyType_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The type of this option property.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty.PropertyType property_type = 1;</code>
+       * @return The propertyType.
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyType getPropertyType() {
+        food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyType result = food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyType.forNumber(propertyType_);
+        return result == null ? food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyType.UNRECOGNIZED : result;
+      }
+      /**
+       * <pre>
+       * The type of this option property.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty.PropertyType property_type = 1;</code>
+       * @param value The propertyType to set.
+       * @return This builder for chaining.
+       */
+      public Builder setPropertyType(food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyType value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        bitField0_ |= 0x00000001;
+        propertyType_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The type of this option property.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty.PropertyType property_type = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearPropertyType() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        propertyType_ = 0;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <pre>
+       * A well-defined value for the option property. Currently only expected
+       * if the property_type is PIZZA_SIDE.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty.PropertyValue property_val = 2;</code>
+       * @return Whether the propertyVal field is set.
+       */
+      @java.lang.Override
+      public boolean hasPropertyVal() {
+        return valueCase_ == 2;
+      }
+      /**
+       * <pre>
+       * A well-defined value for the option property. Currently only expected
+       * if the property_type is PIZZA_SIDE.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty.PropertyValue property_val = 2;</code>
+       * @return The enum numeric value on the wire for propertyVal.
+       */
+      @java.lang.Override
+      public int getPropertyValValue() {
+        if (valueCase_ == 2) {
+          return ((java.lang.Integer) value_).intValue();
+        }
+        return 0;
+      }
+      /**
+       * <pre>
+       * A well-defined value for the option property. Currently only expected
+       * if the property_type is PIZZA_SIDE.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty.PropertyValue property_val = 2;</code>
+       * @param value The enum numeric value on the wire for propertyVal to set.
+       * @return This builder for chaining.
+       */
+      public Builder setPropertyValValue(int value) {
+        valueCase_ = 2;
+        value_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * A well-defined value for the option property. Currently only expected
+       * if the property_type is PIZZA_SIDE.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty.PropertyValue property_val = 2;</code>
+       * @return The propertyVal.
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyValue getPropertyVal() {
+        if (valueCase_ == 2) {
+          food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyValue result = food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyValue.forNumber(
+              (java.lang.Integer) value_);
+          return result == null ? food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyValue.UNRECOGNIZED : result;
+        }
+        return food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyValue.UNKNOWN_PROPERTY_VALUE;
+      }
+      /**
+       * <pre>
+       * A well-defined value for the option property. Currently only expected
+       * if the property_type is PIZZA_SIDE.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty.PropertyValue property_val = 2;</code>
+       * @param value The propertyVal to set.
+       * @return This builder for chaining.
+       */
+      public Builder setPropertyVal(food.menu.v1.FoodMenu.MenuItemOptionProperty.PropertyValue value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        valueCase_ = 2;
+        value_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * A well-defined value for the option property. Currently only expected
+       * if the property_type is PIZZA_SIDE.
+       * </pre>
+       *
+       * <code>.food.menu.v1.MenuItemOptionProperty.PropertyValue property_val = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearPropertyVal() {
+        if (valueCase_ == 2) {
+          valueCase_ = 0;
+          value_ = null;
+          onChanged();
+        }
+        return this;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> textValBuilder_;
+      /**
+       * <pre>
+       * A free-form text for the value of the property. Expected for
+       * property_type OPTION and SIZE.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text_val = 3;</code>
+       * @return Whether the textVal field is set.
+       */
+      @java.lang.Override
+      public boolean hasTextVal() {
+        return valueCase_ == 3;
+      }
+      /**
+       * <pre>
+       * A free-form text for the value of the property. Expected for
+       * property_type OPTION and SIZE.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text_val = 3;</code>
+       * @return The textVal.
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.TextField getTextVal() {
+        if (textValBuilder_ == null) {
+          if (valueCase_ == 3) {
+            return (food.menu.v1.FoodMenu.TextField) value_;
+          }
+          return food.menu.v1.FoodMenu.TextField.getDefaultInstance();
+        } else {
+          if (valueCase_ == 3) {
+            return textValBuilder_.getMessage();
+          }
+          return food.menu.v1.FoodMenu.TextField.getDefaultInstance();
+        }
+      }
+      /**
+       * <pre>
+       * A free-form text for the value of the property. Expected for
+       * property_type OPTION and SIZE.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text_val = 3;</code>
+       */
+      public Builder setTextVal(food.menu.v1.FoodMenu.TextField value) {
+        if (textValBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          value_ = value;
+          onChanged();
+        } else {
+          textValBuilder_.setMessage(value);
+        }
+        valueCase_ = 3;
+        return this;
+      }
+      /**
+       * <pre>
+       * A free-form text for the value of the property. Expected for
+       * property_type OPTION and SIZE.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text_val = 3;</code>
+       */
+      public Builder setTextVal(
+          food.menu.v1.FoodMenu.TextField.Builder builderForValue) {
+        if (textValBuilder_ == null) {
+          value_ = builderForValue.build();
+          onChanged();
+        } else {
+          textValBuilder_.setMessage(builderForValue.build());
+        }
+        valueCase_ = 3;
+        return this;
+      }
+      /**
+       * <pre>
+       * A free-form text for the value of the property. Expected for
+       * property_type OPTION and SIZE.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text_val = 3;</code>
+       */
+      public Builder mergeTextVal(food.menu.v1.FoodMenu.TextField value) {
+        if (textValBuilder_ == null) {
+          if (valueCase_ == 3 &&
+              value_ != food.menu.v1.FoodMenu.TextField.getDefaultInstance()) {
+            value_ = food.menu.v1.FoodMenu.TextField.newBuilder((food.menu.v1.FoodMenu.TextField) value_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            value_ = value;
+          }
+          onChanged();
+        } else {
+          if (valueCase_ == 3) {
+            textValBuilder_.mergeFrom(value);
+          } else {
+            textValBuilder_.setMessage(value);
+          }
+        }
+        valueCase_ = 3;
+        return this;
+      }
+      /**
+       * <pre>
+       * A free-form text for the value of the property. Expected for
+       * property_type OPTION and SIZE.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text_val = 3;</code>
+       */
+      public Builder clearTextVal() {
+        if (textValBuilder_ == null) {
+          if (valueCase_ == 3) {
+            valueCase_ = 0;
+            value_ = null;
+            onChanged();
+          }
+        } else {
+          if (valueCase_ == 3) {
+            valueCase_ = 0;
+            value_ = null;
+          }
+          textValBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <pre>
+       * A free-form text for the value of the property. Expected for
+       * property_type OPTION and SIZE.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text_val = 3;</code>
+       */
+      public food.menu.v1.FoodMenu.TextField.Builder getTextValBuilder() {
+        return getTextValFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * A free-form text for the value of the property. Expected for
+       * property_type OPTION and SIZE.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text_val = 3;</code>
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.TextFieldOrBuilder getTextValOrBuilder() {
+        if ((valueCase_ == 3) && (textValBuilder_ != null)) {
+          return textValBuilder_.getMessageOrBuilder();
+        } else {
+          if (valueCase_ == 3) {
+            return (food.menu.v1.FoodMenu.TextField) value_;
+          }
+          return food.menu.v1.FoodMenu.TextField.getDefaultInstance();
+        }
+      }
+      /**
+       * <pre>
+       * A free-form text for the value of the property. Expected for
+       * property_type OPTION and SIZE.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField text_val = 3;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> 
+          getTextValFieldBuilder() {
+        if (textValBuilder_ == null) {
+          if (!(valueCase_ == 3)) {
+            value_ = food.menu.v1.FoodMenu.TextField.getDefaultInstance();
+          }
+          textValBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder>(
+                  (food.menu.v1.FoodMenu.TextField) value_,
+                  getParentForChildren(),
+                  isClean());
+          value_ = null;
+        }
+        valueCase_ = 3;
+        onChanged();
+        return textValBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.MenuItemOptionProperty)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.MenuItemOptionProperty)
+    private static final food.menu.v1.FoodMenu.MenuItemOptionProperty DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.MenuItemOptionProperty();
+    }
+
+    public static food.menu.v1.FoodMenu.MenuItemOptionProperty getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<MenuItemOptionProperty>
+        PARSER = new com.google.protobuf.AbstractParser<MenuItemOptionProperty>() {
+      @java.lang.Override
+      public MenuItemOptionProperty parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<MenuItemOptionProperty> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<MenuItemOptionProperty> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.MenuItemOptionProperty getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface NutritionInformationOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.NutritionInformation)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * The amount of nutritional energy of the serving of food. Can be defined
+     * in Calories or kilojoules.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation.NutritionValue energy = 1;</code>
+     * @return Whether the energy field is set.
+     */
+    boolean hasEnergy();
+    /**
+     * <pre>
+     * The amount of nutritional energy of the serving of food. Can be defined
+     * in Calories or kilojoules.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation.NutritionValue energy = 1;</code>
+     * @return The energy.
+     */
+    food.menu.v1.FoodMenu.NutritionInformation.NutritionValue getEnergy();
+    /**
+     * <pre>
+     * The amount of nutritional energy of the serving of food. Can be defined
+     * in Calories or kilojoules.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation.NutritionValue energy = 1;</code>
+     */
+    food.menu.v1.FoodMenu.NutritionInformation.NutritionValueOrBuilder getEnergyOrBuilder();
+
+    /**
+     * <pre>
+     * The amount of sodium content, measured in grams or milligrams.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation.NutritionValue sodium_content = 2;</code>
+     * @return Whether the sodiumContent field is set.
+     */
+    boolean hasSodiumContent();
+    /**
+     * <pre>
+     * The amount of sodium content, measured in grams or milligrams.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation.NutritionValue sodium_content = 2;</code>
+     * @return The sodiumContent.
+     */
+    food.menu.v1.FoodMenu.NutritionInformation.NutritionValue getSodiumContent();
+    /**
+     * <pre>
+     * The amount of sodium content, measured in grams or milligrams.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation.NutritionValue sodium_content = 2;</code>
+     */
+    food.menu.v1.FoodMenu.NutritionInformation.NutritionValueOrBuilder getSodiumContentOrBuilder();
+
+    /**
+     * <pre>
+     * The number of servings the nutrition value applies to.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional int32 serving_size = 3;</code>
+     * @return Whether the servingSize field is set.
+     */
+    boolean hasServingSize();
+    /**
+     * <pre>
+     * The number of servings the nutrition value applies to.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional int32 serving_size = 3;</code>
+     * @return The servingSize.
+     */
+    int getServingSize();
+
+    /**
+     * <pre>
+     * Nutrition information in free text. For example "Contains preservatives".
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 4;</code>
+     * @return Whether the description field is set.
+     */
+    boolean hasDescription();
+    /**
+     * <pre>
+     * Nutrition information in free text. For example "Contains preservatives".
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 4;</code>
+     * @return The description.
+     */
+    food.menu.v1.FoodMenu.TextField getDescription();
+    /**
+     * <pre>
+     * Nutrition information in free text. For example "Contains preservatives".
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 4;</code>
+     */
+    food.menu.v1.FoodMenu.TextFieldOrBuilder getDescriptionOrBuilder();
+  }
+  /**
+   * <pre>
+   * Describes all the nutritional measurements of a MenuItem or add-on.
+   * </pre>
+   *
+   * Protobuf type {@code food.menu.v1.NutritionInformation}
+   */
+  public static final class NutritionInformation extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.NutritionInformation)
+      NutritionInformationOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use NutritionInformation.newBuilder() to construct.
+    private NutritionInformation(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private NutritionInformation() {
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new NutritionInformation();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_NutritionInformation_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_NutritionInformation_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.NutritionInformation.class, food.menu.v1.FoodMenu.NutritionInformation.Builder.class);
+    }
+
+    public interface NutritionValueOrBuilder extends
+        // @@protoc_insertion_point(interface_extends:food.menu.v1.NutritionInformation.NutritionValue)
+        com.google.protobuf.MessageOrBuilder {
+
+      /**
+       * <pre>
+       * A single number representing the amount of nutritional value.
+       * </pre>
+       *
+       * <code>double amount = 1;</code>
+       * @return Whether the amount field is set.
+       */
+      boolean hasAmount();
+      /**
+       * <pre>
+       * A single number representing the amount of nutritional value.
+       * </pre>
+       *
+       * <code>double amount = 1;</code>
+       * @return The amount.
+       */
+      double getAmount();
+
+      /**
+       * <pre>
+       * A range representing the amount of nutritional value.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue.Range range = 3;</code>
+       * @return Whether the range field is set.
+       */
+      boolean hasRange();
+      /**
+       * <pre>
+       * A range representing the amount of nutritional value.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue.Range range = 3;</code>
+       * @return The range.
+       */
+      food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range getRange();
+      /**
+       * <pre>
+       * A range representing the amount of nutritional value.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue.Range range = 3;</code>
+       */
+      food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.RangeOrBuilder getRangeOrBuilder();
+
+      /**
+       * <pre>
+       * The unit associated with the amount as specified from the partner. We
+       * will validate the feed so that the unit for each type of nutrition value
+       * is expected for that type of value. For example, only ENERGY_CALORIES
+       * and ENERGY_KILOJOULES are expected on energy property of
+       * NutritionalInformation.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionValueUnit unit = 2;</code>
+       * @return The enum numeric value on the wire for unit.
+       */
+      int getUnitValue();
+      /**
+       * <pre>
+       * The unit associated with the amount as specified from the partner. We
+       * will validate the feed so that the unit for each type of nutrition value
+       * is expected for that type of value. For example, only ENERGY_CALORIES
+       * and ENERGY_KILOJOULES are expected on energy property of
+       * NutritionalInformation.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionValueUnit unit = 2;</code>
+       * @return The unit.
+       */
+      food.menu.v1.FoodMenu.NutritionValueUnit getUnit();
+
+      food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.ValueCase getValueCase();
+    }
+    /**
+     * <pre>
+     * Describes a single nutritional measurement of the serving of food.
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.NutritionInformation.NutritionValue}
+     */
+    public static final class NutritionValue extends
+        com.google.protobuf.GeneratedMessageV3 implements
+        // @@protoc_insertion_point(message_implements:food.menu.v1.NutritionInformation.NutritionValue)
+        NutritionValueOrBuilder {
+    private static final long serialVersionUID = 0L;
+      // Use NutritionValue.newBuilder() to construct.
+      private NutritionValue(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+        super(builder);
+      }
+      private NutritionValue() {
+        unit_ = 0;
+      }
+
+      @java.lang.Override
+      @SuppressWarnings({"unused"})
+      protected java.lang.Object newInstance(
+          UnusedPrivateParameter unused) {
+        return new NutritionValue();
+      }
+
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_NutritionInformation_NutritionValue_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_NutritionInformation_NutritionValue_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.class, food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Builder.class);
+      }
+
+      public interface RangeOrBuilder extends
+          // @@protoc_insertion_point(interface_extends:food.menu.v1.NutritionInformation.NutritionValue.Range)
+          com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * <pre>
+         * The minimum amount of nutrition value.
+         * Required.
+         * </pre>
+         *
+         * <code>double min = 1;</code>
+         * @return The min.
+         */
+        double getMin();
+
+        /**
+         * <pre>
+         * The maximum amount of nutrition value.
+         * Required.
+         * </pre>
+         *
+         * <code>double max = 2;</code>
+         * @return The max.
+         */
+        double getMax();
+      }
+      /**
+       * <pre>
+       * Describes a closed range for the nutrition value. E.g. "100-150 cal"
+       * </pre>
+       *
+       * Protobuf type {@code food.menu.v1.NutritionInformation.NutritionValue.Range}
+       */
+      public static final class Range extends
+          com.google.protobuf.GeneratedMessageV3 implements
+          // @@protoc_insertion_point(message_implements:food.menu.v1.NutritionInformation.NutritionValue.Range)
+          RangeOrBuilder {
+      private static final long serialVersionUID = 0L;
+        // Use Range.newBuilder() to construct.
+        private Range(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+          super(builder);
+        }
+        private Range() {
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({"unused"})
+        protected java.lang.Object newInstance(
+            UnusedPrivateParameter unused) {
+          return new Range();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return food.menu.v1.FoodMenu.internal_static_food_menu_v1_NutritionInformation_NutritionValue_Range_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return food.menu.v1.FoodMenu.internal_static_food_menu_v1_NutritionInformation_NutritionValue_Range_fieldAccessorTable
+              .ensureFieldAccessorsInitialized(
+                  food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.class, food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.Builder.class);
+        }
+
+        public static final int MIN_FIELD_NUMBER = 1;
+        private double min_ = 0D;
+        /**
+         * <pre>
+         * The minimum amount of nutrition value.
+         * Required.
+         * </pre>
+         *
+         * <code>double min = 1;</code>
+         * @return The min.
+         */
+        @java.lang.Override
+        public double getMin() {
+          return min_;
+        }
+
+        public static final int MAX_FIELD_NUMBER = 2;
+        private double max_ = 0D;
+        /**
+         * <pre>
+         * The maximum amount of nutrition value.
+         * Required.
+         * </pre>
+         *
+         * <code>double max = 2;</code>
+         * @return The max.
+         */
+        @java.lang.Override
+        public double getMax() {
+          return max_;
+        }
+
+        private byte memoizedIsInitialized = -1;
+        @java.lang.Override
+        public final boolean isInitialized() {
+          byte isInitialized = memoizedIsInitialized;
+          if (isInitialized == 1) return true;
+          if (isInitialized == 0) return false;
+
+          memoizedIsInitialized = 1;
+          return true;
+        }
+
+        @java.lang.Override
+        public void writeTo(com.google.protobuf.CodedOutputStream output)
+                            throws java.io.IOException {
+          if (java.lang.Double.doubleToRawLongBits(min_) != 0) {
+            output.writeDouble(1, min_);
+          }
+          if (java.lang.Double.doubleToRawLongBits(max_) != 0) {
+            output.writeDouble(2, max_);
+          }
+          getUnknownFields().writeTo(output);
+        }
+
+        @java.lang.Override
+        public int getSerializedSize() {
+          int size = memoizedSize;
+          if (size != -1) return size;
+
+          size = 0;
+          if (java.lang.Double.doubleToRawLongBits(min_) != 0) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeDoubleSize(1, min_);
+          }
+          if (java.lang.Double.doubleToRawLongBits(max_) != 0) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeDoubleSize(2, max_);
+          }
+          size += getUnknownFields().getSerializedSize();
+          memoizedSize = size;
+          return size;
+        }
+
+        @java.lang.Override
+        public boolean equals(final java.lang.Object obj) {
+          if (obj == this) {
+           return true;
+          }
+          if (!(obj instanceof food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range)) {
+            return super.equals(obj);
+          }
+          food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range other = (food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range) obj;
+
+          if (java.lang.Double.doubleToLongBits(getMin())
+              != java.lang.Double.doubleToLongBits(
+                  other.getMin())) return false;
+          if (java.lang.Double.doubleToLongBits(getMax())
+              != java.lang.Double.doubleToLongBits(
+                  other.getMax())) return false;
+          if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+          return true;
+        }
+
+        @java.lang.Override
+        public int hashCode() {
+          if (memoizedHashCode != 0) {
+            return memoizedHashCode;
+          }
+          int hash = 41;
+          hash = (19 * hash) + getDescriptor().hashCode();
+          hash = (37 * hash) + MIN_FIELD_NUMBER;
+          hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+              java.lang.Double.doubleToLongBits(getMin()));
+          hash = (37 * hash) + MAX_FIELD_NUMBER;
+          hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+              java.lang.Double.doubleToLongBits(getMax()));
+          hash = (29 * hash) + getUnknownFields().hashCode();
+          memoizedHashCode = hash;
+          return hash;
+        }
+
+        public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range parseFrom(
+            java.nio.ByteBuffer data)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return PARSER.parseFrom(data);
+        }
+        public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range parseFrom(
+            java.nio.ByteBuffer data,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return PARSER.parseFrom(data, extensionRegistry);
+        }
+        public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range parseFrom(
+            com.google.protobuf.ByteString data)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return PARSER.parseFrom(data);
+        }
+        public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range parseFrom(
+            com.google.protobuf.ByteString data,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return PARSER.parseFrom(data, extensionRegistry);
+        }
+        public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range parseFrom(byte[] data)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return PARSER.parseFrom(data);
+        }
+        public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range parseFrom(
+            byte[] data,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return PARSER.parseFrom(data, extensionRegistry);
+        }
+        public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range parseFrom(java.io.InputStream input)
+            throws java.io.IOException {
+          return com.google.protobuf.GeneratedMessageV3
+              .parseWithIOException(PARSER, input);
+        }
+        public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range parseFrom(
+            java.io.InputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          return com.google.protobuf.GeneratedMessageV3
+              .parseWithIOException(PARSER, input, extensionRegistry);
+        }
+        public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range parseDelimitedFrom(java.io.InputStream input)
+            throws java.io.IOException {
+          return com.google.protobuf.GeneratedMessageV3
+              .parseDelimitedWithIOException(PARSER, input);
+        }
+        public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range parseDelimitedFrom(
+            java.io.InputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          return com.google.protobuf.GeneratedMessageV3
+              .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+        }
+        public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range parseFrom(
+            com.google.protobuf.CodedInputStream input)
+            throws java.io.IOException {
+          return com.google.protobuf.GeneratedMessageV3
+              .parseWithIOException(PARSER, input);
+        }
+        public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range parseFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          return com.google.protobuf.GeneratedMessageV3
+              .parseWithIOException(PARSER, input, extensionRegistry);
+        }
+
+        @java.lang.Override
+        public Builder newBuilderForType() { return newBuilder(); }
+        public static Builder newBuilder() {
+          return DEFAULT_INSTANCE.toBuilder();
+        }
+        public static Builder newBuilder(food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range prototype) {
+          return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+        }
+        @java.lang.Override
+        public Builder toBuilder() {
+          return this == DEFAULT_INSTANCE
+              ? new Builder() : new Builder().mergeFrom(this);
+        }
+
+        @java.lang.Override
+        protected Builder newBuilderForType(
+            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+          Builder builder = new Builder(parent);
+          return builder;
+        }
+        /**
+         * <pre>
+         * Describes a closed range for the nutrition value. E.g. "100-150 cal"
+         * </pre>
+         *
+         * Protobuf type {@code food.menu.v1.NutritionInformation.NutritionValue.Range}
+         */
+        public static final class Builder extends
+            com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+            // @@protoc_insertion_point(builder_implements:food.menu.v1.NutritionInformation.NutritionValue.Range)
+            food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.RangeOrBuilder {
+          public static final com.google.protobuf.Descriptors.Descriptor
+              getDescriptor() {
+            return food.menu.v1.FoodMenu.internal_static_food_menu_v1_NutritionInformation_NutritionValue_Range_descriptor;
+          }
+
+          @java.lang.Override
+          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+              internalGetFieldAccessorTable() {
+            return food.menu.v1.FoodMenu.internal_static_food_menu_v1_NutritionInformation_NutritionValue_Range_fieldAccessorTable
+                .ensureFieldAccessorsInitialized(
+                    food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.class, food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.Builder.class);
+          }
+
+          // Construct using food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.newBuilder()
+          private Builder() {
+
+          }
+
+          private Builder(
+              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+            super(parent);
+
+          }
+          @java.lang.Override
+          public Builder clear() {
+            super.clear();
+            bitField0_ = 0;
+            min_ = 0D;
+            max_ = 0D;
+            return this;
+          }
+
+          @java.lang.Override
+          public com.google.protobuf.Descriptors.Descriptor
+              getDescriptorForType() {
+            return food.menu.v1.FoodMenu.internal_static_food_menu_v1_NutritionInformation_NutritionValue_Range_descriptor;
+          }
+
+          @java.lang.Override
+          public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range getDefaultInstanceForType() {
+            return food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.getDefaultInstance();
+          }
+
+          @java.lang.Override
+          public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range build() {
+            food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range result = buildPartial();
+            if (!result.isInitialized()) {
+              throw newUninitializedMessageException(result);
+            }
+            return result;
+          }
+
+          @java.lang.Override
+          public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range buildPartial() {
+            food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range result = new food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range(this);
+            if (bitField0_ != 0) { buildPartial0(result); }
+            onBuilt();
+            return result;
+          }
+
+          private void buildPartial0(food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range result) {
+            int from_bitField0_ = bitField0_;
+            if (((from_bitField0_ & 0x00000001) != 0)) {
+              result.min_ = min_;
+            }
+            if (((from_bitField0_ & 0x00000002) != 0)) {
+              result.max_ = max_;
+            }
+          }
+
+          @java.lang.Override
+          public Builder mergeFrom(com.google.protobuf.Message other) {
+            if (other instanceof food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range) {
+              return mergeFrom((food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range)other);
+            } else {
+              super.mergeFrom(other);
+              return this;
+            }
+          }
+
+          public Builder mergeFrom(food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range other) {
+            if (other == food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.getDefaultInstance()) return this;
+            if (other.getMin() != 0D) {
+              setMin(other.getMin());
+            }
+            if (other.getMax() != 0D) {
+              setMax(other.getMax());
+            }
+            this.mergeUnknownFields(other.getUnknownFields());
+            onChanged();
+            return this;
+          }
+
+          @java.lang.Override
+          public final boolean isInitialized() {
+            return true;
+          }
+
+          @java.lang.Override
+          public Builder mergeFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            if (extensionRegistry == null) {
+              throw new java.lang.NullPointerException();
+            }
+            try {
+              boolean done = false;
+              while (!done) {
+                int tag = input.readTag();
+                switch (tag) {
+                  case 0:
+                    done = true;
+                    break;
+                  case 9: {
+                    min_ = input.readDouble();
+                    bitField0_ |= 0x00000001;
+                    break;
+                  } // case 9
+                  case 17: {
+                    max_ = input.readDouble();
+                    bitField0_ |= 0x00000002;
+                    break;
+                  } // case 17
+                  default: {
+                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                      done = true; // was an endgroup tag
+                    }
+                    break;
+                  } // default:
+                } // switch (tag)
+              } // while (!done)
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+              throw e.unwrapIOException();
+            } finally {
+              onChanged();
+            } // finally
+            return this;
+          }
+          private int bitField0_;
+
+          private double min_ ;
+          /**
+           * <pre>
+           * The minimum amount of nutrition value.
+           * Required.
+           * </pre>
+           *
+           * <code>double min = 1;</code>
+           * @return The min.
+           */
+          @java.lang.Override
+          public double getMin() {
+            return min_;
+          }
+          /**
+           * <pre>
+           * The minimum amount of nutrition value.
+           * Required.
+           * </pre>
+           *
+           * <code>double min = 1;</code>
+           * @param value The min to set.
+           * @return This builder for chaining.
+           */
+          public Builder setMin(double value) {
+
+            min_ = value;
+            bitField0_ |= 0x00000001;
+            onChanged();
+            return this;
+          }
+          /**
+           * <pre>
+           * The minimum amount of nutrition value.
+           * Required.
+           * </pre>
+           *
+           * <code>double min = 1;</code>
+           * @return This builder for chaining.
+           */
+          public Builder clearMin() {
+            bitField0_ = (bitField0_ & ~0x00000001);
+            min_ = 0D;
+            onChanged();
+            return this;
+          }
+
+          private double max_ ;
+          /**
+           * <pre>
+           * The maximum amount of nutrition value.
+           * Required.
+           * </pre>
+           *
+           * <code>double max = 2;</code>
+           * @return The max.
+           */
+          @java.lang.Override
+          public double getMax() {
+            return max_;
+          }
+          /**
+           * <pre>
+           * The maximum amount of nutrition value.
+           * Required.
+           * </pre>
+           *
+           * <code>double max = 2;</code>
+           * @param value The max to set.
+           * @return This builder for chaining.
+           */
+          public Builder setMax(double value) {
+
+            max_ = value;
+            bitField0_ |= 0x00000002;
+            onChanged();
+            return this;
+          }
+          /**
+           * <pre>
+           * The maximum amount of nutrition value.
+           * Required.
+           * </pre>
+           *
+           * <code>double max = 2;</code>
+           * @return This builder for chaining.
+           */
+          public Builder clearMax() {
+            bitField0_ = (bitField0_ & ~0x00000002);
+            max_ = 0D;
+            onChanged();
+            return this;
+          }
+          @java.lang.Override
+          public final Builder setUnknownFields(
+              final com.google.protobuf.UnknownFieldSet unknownFields) {
+            return super.setUnknownFields(unknownFields);
+          }
+
+          @java.lang.Override
+          public final Builder mergeUnknownFields(
+              final com.google.protobuf.UnknownFieldSet unknownFields) {
+            return super.mergeUnknownFields(unknownFields);
+          }
+
+
+          // @@protoc_insertion_point(builder_scope:food.menu.v1.NutritionInformation.NutritionValue.Range)
+        }
+
+        // @@protoc_insertion_point(class_scope:food.menu.v1.NutritionInformation.NutritionValue.Range)
+        private static final food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range DEFAULT_INSTANCE;
+        static {
+          DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range();
+        }
+
+        public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range getDefaultInstance() {
+          return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser<Range>
+            PARSER = new com.google.protobuf.AbstractParser<Range>() {
+          @java.lang.Override
+          public Range parsePartialFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            Builder builder = newBuilder();
+            try {
+              builder.mergeFrom(input, extensionRegistry);
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+              throw e.setUnfinishedMessage(builder.buildPartial());
+            } catch (com.google.protobuf.UninitializedMessageException e) {
+              throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+            } catch (java.io.IOException e) {
+              throw new com.google.protobuf.InvalidProtocolBufferException(e)
+                  .setUnfinishedMessage(builder.buildPartial());
+            }
+            return builder.buildPartial();
+          }
+        };
+
+        public static com.google.protobuf.Parser<Range> parser() {
+          return PARSER;
+        }
+
+        @java.lang.Override
+        public com.google.protobuf.Parser<Range> getParserForType() {
+          return PARSER;
+        }
+
+        @java.lang.Override
+        public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range getDefaultInstanceForType() {
+          return DEFAULT_INSTANCE;
+        }
+
+      }
+
+      private int valueCase_ = 0;
+      @SuppressWarnings("serial")
+      private java.lang.Object value_;
+      public enum ValueCase
+          implements com.google.protobuf.Internal.EnumLite,
+              com.google.protobuf.AbstractMessage.InternalOneOfEnum {
+        AMOUNT(1),
+        RANGE(3),
+        VALUE_NOT_SET(0);
+        private final int value;
+        private ValueCase(int value) {
+          this.value = value;
+        }
+        /**
+         * @param value The number of the enum to look for.
+         * @return The enum associated with the given number.
+         * @deprecated Use {@link #forNumber(int)} instead.
+         */
+        @java.lang.Deprecated
+        public static ValueCase valueOf(int value) {
+          return forNumber(value);
+        }
+
+        public static ValueCase forNumber(int value) {
+          switch (value) {
+            case 1: return AMOUNT;
+            case 3: return RANGE;
+            case 0: return VALUE_NOT_SET;
+            default: return null;
+          }
+        }
+        public int getNumber() {
+          return this.value;
+        }
+      };
+
+      public ValueCase
+      getValueCase() {
+        return ValueCase.forNumber(
+            valueCase_);
+      }
+
+      public static final int AMOUNT_FIELD_NUMBER = 1;
+      /**
+       * <pre>
+       * A single number representing the amount of nutritional value.
+       * </pre>
+       *
+       * <code>double amount = 1;</code>
+       * @return Whether the amount field is set.
+       */
+      @java.lang.Override
+      public boolean hasAmount() {
+        return valueCase_ == 1;
+      }
+      /**
+       * <pre>
+       * A single number representing the amount of nutritional value.
+       * </pre>
+       *
+       * <code>double amount = 1;</code>
+       * @return The amount.
+       */
+      @java.lang.Override
+      public double getAmount() {
+        if (valueCase_ == 1) {
+          return (java.lang.Double) value_;
+        }
+        return 0D;
+      }
+
+      public static final int RANGE_FIELD_NUMBER = 3;
+      /**
+       * <pre>
+       * A range representing the amount of nutritional value.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue.Range range = 3;</code>
+       * @return Whether the range field is set.
+       */
+      @java.lang.Override
+      public boolean hasRange() {
+        return valueCase_ == 3;
+      }
+      /**
+       * <pre>
+       * A range representing the amount of nutritional value.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue.Range range = 3;</code>
+       * @return The range.
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range getRange() {
+        if (valueCase_ == 3) {
+           return (food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range) value_;
+        }
+        return food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.getDefaultInstance();
+      }
+      /**
+       * <pre>
+       * A range representing the amount of nutritional value.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue.Range range = 3;</code>
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.RangeOrBuilder getRangeOrBuilder() {
+        if (valueCase_ == 3) {
+           return (food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range) value_;
+        }
+        return food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.getDefaultInstance();
+      }
+
+      public static final int UNIT_FIELD_NUMBER = 2;
+      private int unit_ = 0;
+      /**
+       * <pre>
+       * The unit associated with the amount as specified from the partner. We
+       * will validate the feed so that the unit for each type of nutrition value
+       * is expected for that type of value. For example, only ENERGY_CALORIES
+       * and ENERGY_KILOJOULES are expected on energy property of
+       * NutritionalInformation.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionValueUnit unit = 2;</code>
+       * @return The enum numeric value on the wire for unit.
+       */
+      @java.lang.Override public int getUnitValue() {
+        return unit_;
+      }
+      /**
+       * <pre>
+       * The unit associated with the amount as specified from the partner. We
+       * will validate the feed so that the unit for each type of nutrition value
+       * is expected for that type of value. For example, only ENERGY_CALORIES
+       * and ENERGY_KILOJOULES are expected on energy property of
+       * NutritionalInformation.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionValueUnit unit = 2;</code>
+       * @return The unit.
+       */
+      @java.lang.Override public food.menu.v1.FoodMenu.NutritionValueUnit getUnit() {
+        food.menu.v1.FoodMenu.NutritionValueUnit result = food.menu.v1.FoodMenu.NutritionValueUnit.forNumber(unit_);
+        return result == null ? food.menu.v1.FoodMenu.NutritionValueUnit.UNRECOGNIZED : result;
+      }
+
+      private byte memoizedIsInitialized = -1;
+      @java.lang.Override
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized == 1) return true;
+        if (isInitialized == 0) return false;
+
+        memoizedIsInitialized = 1;
+        return true;
+      }
+
+      @java.lang.Override
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        if (valueCase_ == 1) {
+          output.writeDouble(
+              1, (double)((java.lang.Double) value_));
+        }
+        if (unit_ != food.menu.v1.FoodMenu.NutritionValueUnit.NUTRITION_VALUE_UNIT_UNSPECIFIED.getNumber()) {
+          output.writeEnum(2, unit_);
+        }
+        if (valueCase_ == 3) {
+          output.writeMessage(3, (food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range) value_);
+        }
+        getUnknownFields().writeTo(output);
+      }
+
+      @java.lang.Override
+      public int getSerializedSize() {
+        int size = memoizedSize;
+        if (size != -1) return size;
+
+        size = 0;
+        if (valueCase_ == 1) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeDoubleSize(
+                1, (double)((java.lang.Double) value_));
+        }
+        if (unit_ != food.menu.v1.FoodMenu.NutritionValueUnit.NUTRITION_VALUE_UNIT_UNSPECIFIED.getNumber()) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeEnumSize(2, unit_);
+        }
+        if (valueCase_ == 3) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(3, (food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range) value_);
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSize = size;
+        return size;
+      }
+
+      @java.lang.Override
+      public boolean equals(final java.lang.Object obj) {
+        if (obj == this) {
+         return true;
+        }
+        if (!(obj instanceof food.menu.v1.FoodMenu.NutritionInformation.NutritionValue)) {
+          return super.equals(obj);
+        }
+        food.menu.v1.FoodMenu.NutritionInformation.NutritionValue other = (food.menu.v1.FoodMenu.NutritionInformation.NutritionValue) obj;
+
+        if (unit_ != other.unit_) return false;
+        if (!getValueCase().equals(other.getValueCase())) return false;
+        switch (valueCase_) {
+          case 1:
+            if (java.lang.Double.doubleToLongBits(getAmount())
+                != java.lang.Double.doubleToLongBits(
+                    other.getAmount())) return false;
+            break;
+          case 3:
+            if (!getRange()
+                .equals(other.getRange())) return false;
+            break;
+          case 0:
+          default:
+        }
+        if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+        return true;
+      }
+
+      @java.lang.Override
+      public int hashCode() {
+        if (memoizedHashCode != 0) {
+          return memoizedHashCode;
+        }
+        int hash = 41;
+        hash = (19 * hash) + getDescriptor().hashCode();
+        hash = (37 * hash) + UNIT_FIELD_NUMBER;
+        hash = (53 * hash) + unit_;
+        switch (valueCase_) {
+          case 1:
+            hash = (37 * hash) + AMOUNT_FIELD_NUMBER;
+            hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+                java.lang.Double.doubleToLongBits(getAmount()));
+            break;
+          case 3:
+            hash = (37 * hash) + RANGE_FIELD_NUMBER;
+            hash = (53 * hash) + getRange().hashCode();
+            break;
+          case 0:
+          default:
+        }
+        hash = (29 * hash) + getUnknownFields().hashCode();
+        memoizedHashCode = hash;
+        return hash;
+      }
+
+      public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue parseFrom(
+          java.nio.ByteBuffer data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+      }
+      public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue parseFrom(
+          java.nio.ByteBuffer data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+      }
+      public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+      }
+      public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+      }
+      public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data);
+      }
+      public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return PARSER.parseFrom(data, extensionRegistry);
+      }
+      public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input);
+      }
+      public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input, extensionRegistry);
+      }
+      public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseDelimitedWithIOException(PARSER, input);
+      }
+      public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+      }
+      public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input);
+      }
+      public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return com.google.protobuf.GeneratedMessageV3
+            .parseWithIOException(PARSER, input, extensionRegistry);
+      }
+
+      @java.lang.Override
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder() {
+        return DEFAULT_INSTANCE.toBuilder();
+      }
+      public static Builder newBuilder(food.menu.v1.FoodMenu.NutritionInformation.NutritionValue prototype) {
+        return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+      }
+      @java.lang.Override
+      public Builder toBuilder() {
+        return this == DEFAULT_INSTANCE
+            ? new Builder() : new Builder().mergeFrom(this);
+      }
+
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      /**
+       * <pre>
+       * Describes a single nutritional measurement of the serving of food.
+       * </pre>
+       *
+       * Protobuf type {@code food.menu.v1.NutritionInformation.NutritionValue}
+       */
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+          // @@protoc_insertion_point(builder_implements:food.menu.v1.NutritionInformation.NutritionValue)
+          food.menu.v1.FoodMenu.NutritionInformation.NutritionValueOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return food.menu.v1.FoodMenu.internal_static_food_menu_v1_NutritionInformation_NutritionValue_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return food.menu.v1.FoodMenu.internal_static_food_menu_v1_NutritionInformation_NutritionValue_fieldAccessorTable
+              .ensureFieldAccessorsInitialized(
+                  food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.class, food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Builder.class);
+        }
+
+        // Construct using food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.newBuilder()
+        private Builder() {
+
+        }
+
+        private Builder(
+            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+          super(parent);
+
+        }
+        @java.lang.Override
+        public Builder clear() {
+          super.clear();
+          bitField0_ = 0;
+          if (rangeBuilder_ != null) {
+            rangeBuilder_.clear();
+          }
+          unit_ = 0;
+          valueCase_ = 0;
+          value_ = null;
+          return this;
+        }
+
+        @java.lang.Override
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return food.menu.v1.FoodMenu.internal_static_food_menu_v1_NutritionInformation_NutritionValue_descriptor;
+        }
+
+        @java.lang.Override
+        public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue getDefaultInstanceForType() {
+          return food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.getDefaultInstance();
+        }
+
+        @java.lang.Override
+        public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue build() {
+          food.menu.v1.FoodMenu.NutritionInformation.NutritionValue result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+
+        @java.lang.Override
+        public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue buildPartial() {
+          food.menu.v1.FoodMenu.NutritionInformation.NutritionValue result = new food.menu.v1.FoodMenu.NutritionInformation.NutritionValue(this);
+          if (bitField0_ != 0) { buildPartial0(result); }
+          buildPartialOneofs(result);
+          onBuilt();
+          return result;
+        }
+
+        private void buildPartial0(food.menu.v1.FoodMenu.NutritionInformation.NutritionValue result) {
+          int from_bitField0_ = bitField0_;
+          if (((from_bitField0_ & 0x00000004) != 0)) {
+            result.unit_ = unit_;
+          }
+        }
+
+        private void buildPartialOneofs(food.menu.v1.FoodMenu.NutritionInformation.NutritionValue result) {
+          result.valueCase_ = valueCase_;
+          result.value_ = this.value_;
+          if (valueCase_ == 3 &&
+              rangeBuilder_ != null) {
+            result.value_ = rangeBuilder_.build();
+          }
+        }
+
+        @java.lang.Override
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof food.menu.v1.FoodMenu.NutritionInformation.NutritionValue) {
+            return mergeFrom((food.menu.v1.FoodMenu.NutritionInformation.NutritionValue)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+
+        public Builder mergeFrom(food.menu.v1.FoodMenu.NutritionInformation.NutritionValue other) {
+          if (other == food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.getDefaultInstance()) return this;
+          if (other.unit_ != 0) {
+            setUnitValue(other.getUnitValue());
+          }
+          switch (other.getValueCase()) {
+            case AMOUNT: {
+              setAmount(other.getAmount());
+              break;
+            }
+            case RANGE: {
+              mergeRange(other.getRange());
+              break;
+            }
+            case VALUE_NOT_SET: {
+              break;
+            }
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          onChanged();
+          return this;
+        }
+
+        @java.lang.Override
+        public final boolean isInitialized() {
+          return true;
+        }
+
+        @java.lang.Override
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          if (extensionRegistry == null) {
+            throw new java.lang.NullPointerException();
+          }
+          try {
+            boolean done = false;
+            while (!done) {
+              int tag = input.readTag();
+              switch (tag) {
+                case 0:
+                  done = true;
+                  break;
+                case 9: {
+                  value_ = input.readDouble();
+                  valueCase_ = 1;
+                  break;
+                } // case 9
+                case 16: {
+                  unit_ = input.readEnum();
+                  bitField0_ |= 0x00000004;
+                  break;
+                } // case 16
+                case 26: {
+                  input.readMessage(
+                      getRangeFieldBuilder().getBuilder(),
+                      extensionRegistry);
+                  valueCase_ = 3;
+                  break;
+                } // case 26
+                default: {
+                  if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                    done = true; // was an endgroup tag
+                  }
+                  break;
+                } // default:
+              } // switch (tag)
+            } // while (!done)
+          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+            throw e.unwrapIOException();
+          } finally {
+            onChanged();
+          } // finally
+          return this;
+        }
+        private int valueCase_ = 0;
+        private java.lang.Object value_;
+        public ValueCase
+            getValueCase() {
+          return ValueCase.forNumber(
+              valueCase_);
+        }
+
+        public Builder clearValue() {
+          valueCase_ = 0;
+          value_ = null;
+          onChanged();
+          return this;
+        }
+
+        private int bitField0_;
+
+        /**
+         * <pre>
+         * A single number representing the amount of nutritional value.
+         * </pre>
+         *
+         * <code>double amount = 1;</code>
+         * @return Whether the amount field is set.
+         */
+        public boolean hasAmount() {
+          return valueCase_ == 1;
+        }
+        /**
+         * <pre>
+         * A single number representing the amount of nutritional value.
+         * </pre>
+         *
+         * <code>double amount = 1;</code>
+         * @return The amount.
+         */
+        public double getAmount() {
+          if (valueCase_ == 1) {
+            return (java.lang.Double) value_;
+          }
+          return 0D;
+        }
+        /**
+         * <pre>
+         * A single number representing the amount of nutritional value.
+         * </pre>
+         *
+         * <code>double amount = 1;</code>
+         * @param value The amount to set.
+         * @return This builder for chaining.
+         */
+        public Builder setAmount(double value) {
+
+          valueCase_ = 1;
+          value_ = value;
+          onChanged();
+          return this;
+        }
+        /**
+         * <pre>
+         * A single number representing the amount of nutritional value.
+         * </pre>
+         *
+         * <code>double amount = 1;</code>
+         * @return This builder for chaining.
+         */
+        public Builder clearAmount() {
+          if (valueCase_ == 1) {
+            valueCase_ = 0;
+            value_ = null;
+            onChanged();
+          }
+          return this;
+        }
+
+        private com.google.protobuf.SingleFieldBuilderV3<
+            food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range, food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.Builder, food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.RangeOrBuilder> rangeBuilder_;
+        /**
+         * <pre>
+         * A range representing the amount of nutritional value.
+         * </pre>
+         *
+         * <code>.food.menu.v1.NutritionInformation.NutritionValue.Range range = 3;</code>
+         * @return Whether the range field is set.
+         */
+        @java.lang.Override
+        public boolean hasRange() {
+          return valueCase_ == 3;
+        }
+        /**
+         * <pre>
+         * A range representing the amount of nutritional value.
+         * </pre>
+         *
+         * <code>.food.menu.v1.NutritionInformation.NutritionValue.Range range = 3;</code>
+         * @return The range.
+         */
+        @java.lang.Override
+        public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range getRange() {
+          if (rangeBuilder_ == null) {
+            if (valueCase_ == 3) {
+              return (food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range) value_;
+            }
+            return food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.getDefaultInstance();
+          } else {
+            if (valueCase_ == 3) {
+              return rangeBuilder_.getMessage();
+            }
+            return food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.getDefaultInstance();
+          }
+        }
+        /**
+         * <pre>
+         * A range representing the amount of nutritional value.
+         * </pre>
+         *
+         * <code>.food.menu.v1.NutritionInformation.NutritionValue.Range range = 3;</code>
+         */
+        public Builder setRange(food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range value) {
+          if (rangeBuilder_ == null) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            value_ = value;
+            onChanged();
+          } else {
+            rangeBuilder_.setMessage(value);
+          }
+          valueCase_ = 3;
+          return this;
+        }
+        /**
+         * <pre>
+         * A range representing the amount of nutritional value.
+         * </pre>
+         *
+         * <code>.food.menu.v1.NutritionInformation.NutritionValue.Range range = 3;</code>
+         */
+        public Builder setRange(
+            food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.Builder builderForValue) {
+          if (rangeBuilder_ == null) {
+            value_ = builderForValue.build();
+            onChanged();
+          } else {
+            rangeBuilder_.setMessage(builderForValue.build());
+          }
+          valueCase_ = 3;
+          return this;
+        }
+        /**
+         * <pre>
+         * A range representing the amount of nutritional value.
+         * </pre>
+         *
+         * <code>.food.menu.v1.NutritionInformation.NutritionValue.Range range = 3;</code>
+         */
+        public Builder mergeRange(food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range value) {
+          if (rangeBuilder_ == null) {
+            if (valueCase_ == 3 &&
+                value_ != food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.getDefaultInstance()) {
+              value_ = food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.newBuilder((food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range) value_)
+                  .mergeFrom(value).buildPartial();
+            } else {
+              value_ = value;
+            }
+            onChanged();
+          } else {
+            if (valueCase_ == 3) {
+              rangeBuilder_.mergeFrom(value);
+            } else {
+              rangeBuilder_.setMessage(value);
+            }
+          }
+          valueCase_ = 3;
+          return this;
+        }
+        /**
+         * <pre>
+         * A range representing the amount of nutritional value.
+         * </pre>
+         *
+         * <code>.food.menu.v1.NutritionInformation.NutritionValue.Range range = 3;</code>
+         */
+        public Builder clearRange() {
+          if (rangeBuilder_ == null) {
+            if (valueCase_ == 3) {
+              valueCase_ = 0;
+              value_ = null;
+              onChanged();
+            }
+          } else {
+            if (valueCase_ == 3) {
+              valueCase_ = 0;
+              value_ = null;
+            }
+            rangeBuilder_.clear();
+          }
+          return this;
+        }
+        /**
+         * <pre>
+         * A range representing the amount of nutritional value.
+         * </pre>
+         *
+         * <code>.food.menu.v1.NutritionInformation.NutritionValue.Range range = 3;</code>
+         */
+        public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.Builder getRangeBuilder() {
+          return getRangeFieldBuilder().getBuilder();
+        }
+        /**
+         * <pre>
+         * A range representing the amount of nutritional value.
+         * </pre>
+         *
+         * <code>.food.menu.v1.NutritionInformation.NutritionValue.Range range = 3;</code>
+         */
+        @java.lang.Override
+        public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.RangeOrBuilder getRangeOrBuilder() {
+          if ((valueCase_ == 3) && (rangeBuilder_ != null)) {
+            return rangeBuilder_.getMessageOrBuilder();
+          } else {
+            if (valueCase_ == 3) {
+              return (food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range) value_;
+            }
+            return food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.getDefaultInstance();
+          }
+        }
+        /**
+         * <pre>
+         * A range representing the amount of nutritional value.
+         * </pre>
+         *
+         * <code>.food.menu.v1.NutritionInformation.NutritionValue.Range range = 3;</code>
+         */
+        private com.google.protobuf.SingleFieldBuilderV3<
+            food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range, food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.Builder, food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.RangeOrBuilder> 
+            getRangeFieldBuilder() {
+          if (rangeBuilder_ == null) {
+            if (!(valueCase_ == 3)) {
+              value_ = food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.getDefaultInstance();
+            }
+            rangeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+                food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range, food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range.Builder, food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.RangeOrBuilder>(
+                    (food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Range) value_,
+                    getParentForChildren(),
+                    isClean());
+            value_ = null;
+          }
+          valueCase_ = 3;
+          onChanged();
+          return rangeBuilder_;
+        }
+
+        private int unit_ = 0;
+        /**
+         * <pre>
+         * The unit associated with the amount as specified from the partner. We
+         * will validate the feed so that the unit for each type of nutrition value
+         * is expected for that type of value. For example, only ENERGY_CALORIES
+         * and ENERGY_KILOJOULES are expected on energy property of
+         * NutritionalInformation.
+         * Required.
+         * </pre>
+         *
+         * <code>.food.menu.v1.NutritionValueUnit unit = 2;</code>
+         * @return The enum numeric value on the wire for unit.
+         */
+        @java.lang.Override public int getUnitValue() {
+          return unit_;
+        }
+        /**
+         * <pre>
+         * The unit associated with the amount as specified from the partner. We
+         * will validate the feed so that the unit for each type of nutrition value
+         * is expected for that type of value. For example, only ENERGY_CALORIES
+         * and ENERGY_KILOJOULES are expected on energy property of
+         * NutritionalInformation.
+         * Required.
+         * </pre>
+         *
+         * <code>.food.menu.v1.NutritionValueUnit unit = 2;</code>
+         * @param value The enum numeric value on the wire for unit to set.
+         * @return This builder for chaining.
+         */
+        public Builder setUnitValue(int value) {
+          unit_ = value;
+          bitField0_ |= 0x00000004;
+          onChanged();
+          return this;
+        }
+        /**
+         * <pre>
+         * The unit associated with the amount as specified from the partner. We
+         * will validate the feed so that the unit for each type of nutrition value
+         * is expected for that type of value. For example, only ENERGY_CALORIES
+         * and ENERGY_KILOJOULES are expected on energy property of
+         * NutritionalInformation.
+         * Required.
+         * </pre>
+         *
+         * <code>.food.menu.v1.NutritionValueUnit unit = 2;</code>
+         * @return The unit.
+         */
+        @java.lang.Override
+        public food.menu.v1.FoodMenu.NutritionValueUnit getUnit() {
+          food.menu.v1.FoodMenu.NutritionValueUnit result = food.menu.v1.FoodMenu.NutritionValueUnit.forNumber(unit_);
+          return result == null ? food.menu.v1.FoodMenu.NutritionValueUnit.UNRECOGNIZED : result;
+        }
+        /**
+         * <pre>
+         * The unit associated with the amount as specified from the partner. We
+         * will validate the feed so that the unit for each type of nutrition value
+         * is expected for that type of value. For example, only ENERGY_CALORIES
+         * and ENERGY_KILOJOULES are expected on energy property of
+         * NutritionalInformation.
+         * Required.
+         * </pre>
+         *
+         * <code>.food.menu.v1.NutritionValueUnit unit = 2;</code>
+         * @param value The unit to set.
+         * @return This builder for chaining.
+         */
+        public Builder setUnit(food.menu.v1.FoodMenu.NutritionValueUnit value) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          bitField0_ |= 0x00000004;
+          unit_ = value.getNumber();
+          onChanged();
+          return this;
+        }
+        /**
+         * <pre>
+         * The unit associated with the amount as specified from the partner. We
+         * will validate the feed so that the unit for each type of nutrition value
+         * is expected for that type of value. For example, only ENERGY_CALORIES
+         * and ENERGY_KILOJOULES are expected on energy property of
+         * NutritionalInformation.
+         * Required.
+         * </pre>
+         *
+         * <code>.food.menu.v1.NutritionValueUnit unit = 2;</code>
+         * @return This builder for chaining.
+         */
+        public Builder clearUnit() {
+          bitField0_ = (bitField0_ & ~0x00000004);
+          unit_ = 0;
+          onChanged();
+          return this;
+        }
+        @java.lang.Override
+        public final Builder setUnknownFields(
+            final com.google.protobuf.UnknownFieldSet unknownFields) {
+          return super.setUnknownFields(unknownFields);
+        }
+
+        @java.lang.Override
+        public final Builder mergeUnknownFields(
+            final com.google.protobuf.UnknownFieldSet unknownFields) {
+          return super.mergeUnknownFields(unknownFields);
+        }
+
+
+        // @@protoc_insertion_point(builder_scope:food.menu.v1.NutritionInformation.NutritionValue)
+      }
+
+      // @@protoc_insertion_point(class_scope:food.menu.v1.NutritionInformation.NutritionValue)
+      private static final food.menu.v1.FoodMenu.NutritionInformation.NutritionValue DEFAULT_INSTANCE;
+      static {
+        DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.NutritionInformation.NutritionValue();
+      }
+
+      public static food.menu.v1.FoodMenu.NutritionInformation.NutritionValue getDefaultInstance() {
+        return DEFAULT_INSTANCE;
+      }
+
+      private static final com.google.protobuf.Parser<NutritionValue>
+          PARSER = new com.google.protobuf.AbstractParser<NutritionValue>() {
+        @java.lang.Override
+        public NutritionValue parsePartialFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          Builder builder = newBuilder();
+          try {
+            builder.mergeFrom(input, extensionRegistry);
+          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+            throw e.setUnfinishedMessage(builder.buildPartial());
+          } catch (com.google.protobuf.UninitializedMessageException e) {
+            throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+          } catch (java.io.IOException e) {
+            throw new com.google.protobuf.InvalidProtocolBufferException(e)
+                .setUnfinishedMessage(builder.buildPartial());
+          }
+          return builder.buildPartial();
+        }
+      };
+
+      public static com.google.protobuf.Parser<NutritionValue> parser() {
+        return PARSER;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Parser<NutritionValue> getParserForType() {
+        return PARSER;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue getDefaultInstanceForType() {
+        return DEFAULT_INSTANCE;
+      }
+
+    }
+
+    private int bitField0_;
+    public static final int ENERGY_FIELD_NUMBER = 1;
+    private food.menu.v1.FoodMenu.NutritionInformation.NutritionValue energy_;
+    /**
+     * <pre>
+     * The amount of nutritional energy of the serving of food. Can be defined
+     * in Calories or kilojoules.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation.NutritionValue energy = 1;</code>
+     * @return Whether the energy field is set.
+     */
+    @java.lang.Override
+    public boolean hasEnergy() {
+      return energy_ != null;
+    }
+    /**
+     * <pre>
+     * The amount of nutritional energy of the serving of food. Can be defined
+     * in Calories or kilojoules.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation.NutritionValue energy = 1;</code>
+     * @return The energy.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue getEnergy() {
+      return energy_ == null ? food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.getDefaultInstance() : energy_;
+    }
+    /**
+     * <pre>
+     * The amount of nutritional energy of the serving of food. Can be defined
+     * in Calories or kilojoules.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation.NutritionValue energy = 1;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.NutritionInformation.NutritionValueOrBuilder getEnergyOrBuilder() {
+      return energy_ == null ? food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.getDefaultInstance() : energy_;
+    }
+
+    public static final int SODIUM_CONTENT_FIELD_NUMBER = 2;
+    private food.menu.v1.FoodMenu.NutritionInformation.NutritionValue sodiumContent_;
+    /**
+     * <pre>
+     * The amount of sodium content, measured in grams or milligrams.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation.NutritionValue sodium_content = 2;</code>
+     * @return Whether the sodiumContent field is set.
+     */
+    @java.lang.Override
+    public boolean hasSodiumContent() {
+      return sodiumContent_ != null;
+    }
+    /**
+     * <pre>
+     * The amount of sodium content, measured in grams or milligrams.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation.NutritionValue sodium_content = 2;</code>
+     * @return The sodiumContent.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue getSodiumContent() {
+      return sodiumContent_ == null ? food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.getDefaultInstance() : sodiumContent_;
+    }
+    /**
+     * <pre>
+     * The amount of sodium content, measured in grams or milligrams.
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.NutritionInformation.NutritionValue sodium_content = 2;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.NutritionInformation.NutritionValueOrBuilder getSodiumContentOrBuilder() {
+      return sodiumContent_ == null ? food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.getDefaultInstance() : sodiumContent_;
+    }
+
+    public static final int SERVING_SIZE_FIELD_NUMBER = 3;
+    private int servingSize_ = 0;
+    /**
+     * <pre>
+     * The number of servings the nutrition value applies to.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional int32 serving_size = 3;</code>
+     * @return Whether the servingSize field is set.
+     */
+    @java.lang.Override
+    public boolean hasServingSize() {
+      return ((bitField0_ & 0x00000001) != 0);
+    }
+    /**
+     * <pre>
+     * The number of servings the nutrition value applies to.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional int32 serving_size = 3;</code>
+     * @return The servingSize.
+     */
+    @java.lang.Override
+    public int getServingSize() {
+      return servingSize_;
+    }
+
+    public static final int DESCRIPTION_FIELD_NUMBER = 4;
+    private food.menu.v1.FoodMenu.TextField description_;
+    /**
+     * <pre>
+     * Nutrition information in free text. For example "Contains preservatives".
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 4;</code>
+     * @return Whether the description field is set.
+     */
+    @java.lang.Override
+    public boolean hasDescription() {
+      return description_ != null;
+    }
+    /**
+     * <pre>
+     * Nutrition information in free text. For example "Contains preservatives".
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 4;</code>
+     * @return The description.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextField getDescription() {
+      return description_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : description_;
+    }
+    /**
+     * <pre>
+     * Nutrition information in free text. For example "Contains preservatives".
+     * Optional.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField description = 4;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextFieldOrBuilder getDescriptionOrBuilder() {
+      return description_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : description_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (energy_ != null) {
+        output.writeMessage(1, getEnergy());
+      }
+      if (sodiumContent_ != null) {
+        output.writeMessage(2, getSodiumContent());
+      }
+      if (((bitField0_ & 0x00000001) != 0)) {
+        output.writeInt32(3, servingSize_);
+      }
+      if (description_ != null) {
+        output.writeMessage(4, getDescription());
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (energy_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, getEnergy());
+      }
+      if (sodiumContent_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getSodiumContent());
+      }
+      if (((bitField0_ & 0x00000001) != 0)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(3, servingSize_);
+      }
+      if (description_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, getDescription());
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.NutritionInformation)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.NutritionInformation other = (food.menu.v1.FoodMenu.NutritionInformation) obj;
+
+      if (hasEnergy() != other.hasEnergy()) return false;
+      if (hasEnergy()) {
+        if (!getEnergy()
+            .equals(other.getEnergy())) return false;
+      }
+      if (hasSodiumContent() != other.hasSodiumContent()) return false;
+      if (hasSodiumContent()) {
+        if (!getSodiumContent()
+            .equals(other.getSodiumContent())) return false;
+      }
+      if (hasServingSize() != other.hasServingSize()) return false;
+      if (hasServingSize()) {
+        if (getServingSize()
+            != other.getServingSize()) return false;
+      }
+      if (hasDescription() != other.hasDescription()) return false;
+      if (hasDescription()) {
+        if (!getDescription()
+            .equals(other.getDescription())) return false;
+      }
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasEnergy()) {
+        hash = (37 * hash) + ENERGY_FIELD_NUMBER;
+        hash = (53 * hash) + getEnergy().hashCode();
+      }
+      if (hasSodiumContent()) {
+        hash = (37 * hash) + SODIUM_CONTENT_FIELD_NUMBER;
+        hash = (53 * hash) + getSodiumContent().hashCode();
+      }
+      if (hasServingSize()) {
+        hash = (37 * hash) + SERVING_SIZE_FIELD_NUMBER;
+        hash = (53 * hash) + getServingSize();
+      }
+      if (hasDescription()) {
+        hash = (37 * hash) + DESCRIPTION_FIELD_NUMBER;
+        hash = (53 * hash) + getDescription().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.NutritionInformation parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.NutritionInformation parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.NutritionInformation parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.NutritionInformation parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.NutritionInformation parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.NutritionInformation parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.NutritionInformation parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.NutritionInformation parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.NutritionInformation parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.NutritionInformation parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.NutritionInformation parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.NutritionInformation parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.NutritionInformation prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * Describes all the nutritional measurements of a MenuItem or add-on.
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.NutritionInformation}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.NutritionInformation)
+        food.menu.v1.FoodMenu.NutritionInformationOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_NutritionInformation_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_NutritionInformation_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.NutritionInformation.class, food.menu.v1.FoodMenu.NutritionInformation.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.NutritionInformation.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        energy_ = null;
+        if (energyBuilder_ != null) {
+          energyBuilder_.dispose();
+          energyBuilder_ = null;
+        }
+        sodiumContent_ = null;
+        if (sodiumContentBuilder_ != null) {
+          sodiumContentBuilder_.dispose();
+          sodiumContentBuilder_ = null;
+        }
+        servingSize_ = 0;
+        description_ = null;
+        if (descriptionBuilder_ != null) {
+          descriptionBuilder_.dispose();
+          descriptionBuilder_ = null;
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_NutritionInformation_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.NutritionInformation getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.NutritionInformation.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.NutritionInformation build() {
+        food.menu.v1.FoodMenu.NutritionInformation result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.NutritionInformation buildPartial() {
+        food.menu.v1.FoodMenu.NutritionInformation result = new food.menu.v1.FoodMenu.NutritionInformation(this);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.NutritionInformation result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.energy_ = energyBuilder_ == null
+              ? energy_
+              : energyBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000002) != 0)) {
+          result.sodiumContent_ = sodiumContentBuilder_ == null
+              ? sodiumContent_
+              : sodiumContentBuilder_.build();
+        }
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000004) != 0)) {
+          result.servingSize_ = servingSize_;
+          to_bitField0_ |= 0x00000001;
+        }
+        if (((from_bitField0_ & 0x00000008) != 0)) {
+          result.description_ = descriptionBuilder_ == null
+              ? description_
+              : descriptionBuilder_.build();
+        }
+        result.bitField0_ |= to_bitField0_;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.NutritionInformation) {
+          return mergeFrom((food.menu.v1.FoodMenu.NutritionInformation)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.NutritionInformation other) {
+        if (other == food.menu.v1.FoodMenu.NutritionInformation.getDefaultInstance()) return this;
+        if (other.hasEnergy()) {
+          mergeEnergy(other.getEnergy());
+        }
+        if (other.hasSodiumContent()) {
+          mergeSodiumContent(other.getSodiumContent());
+        }
+        if (other.hasServingSize()) {
+          setServingSize(other.getServingSize());
+        }
+        if (other.hasDescription()) {
+          mergeDescription(other.getDescription());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                input.readMessage(
+                    getEnergyFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 10
+              case 18: {
+                input.readMessage(
+                    getSodiumContentFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000002;
+                break;
+              } // case 18
+              case 24: {
+                servingSize_ = input.readInt32();
+                bitField0_ |= 0x00000004;
+                break;
+              } // case 24
+              case 34: {
+                input.readMessage(
+                    getDescriptionFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000008;
+                break;
+              } // case 34
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int bitField0_;
+
+      private food.menu.v1.FoodMenu.NutritionInformation.NutritionValue energy_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.NutritionInformation.NutritionValue, food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Builder, food.menu.v1.FoodMenu.NutritionInformation.NutritionValueOrBuilder> energyBuilder_;
+      /**
+       * <pre>
+       * The amount of nutritional energy of the serving of food. Can be defined
+       * in Calories or kilojoules.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue energy = 1;</code>
+       * @return Whether the energy field is set.
+       */
+      public boolean hasEnergy() {
+        return ((bitField0_ & 0x00000001) != 0);
+      }
+      /**
+       * <pre>
+       * The amount of nutritional energy of the serving of food. Can be defined
+       * in Calories or kilojoules.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue energy = 1;</code>
+       * @return The energy.
+       */
+      public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue getEnergy() {
+        if (energyBuilder_ == null) {
+          return energy_ == null ? food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.getDefaultInstance() : energy_;
+        } else {
+          return energyBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * The amount of nutritional energy of the serving of food. Can be defined
+       * in Calories or kilojoules.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue energy = 1;</code>
+       */
+      public Builder setEnergy(food.menu.v1.FoodMenu.NutritionInformation.NutritionValue value) {
+        if (energyBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          energy_ = value;
+        } else {
+          energyBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The amount of nutritional energy of the serving of food. Can be defined
+       * in Calories or kilojoules.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue energy = 1;</code>
+       */
+      public Builder setEnergy(
+          food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Builder builderForValue) {
+        if (energyBuilder_ == null) {
+          energy_ = builderForValue.build();
+        } else {
+          energyBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The amount of nutritional energy of the serving of food. Can be defined
+       * in Calories or kilojoules.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue energy = 1;</code>
+       */
+      public Builder mergeEnergy(food.menu.v1.FoodMenu.NutritionInformation.NutritionValue value) {
+        if (energyBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0) &&
+            energy_ != null &&
+            energy_ != food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.getDefaultInstance()) {
+            getEnergyBuilder().mergeFrom(value);
+          } else {
+            energy_ = value;
+          }
+        } else {
+          energyBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The amount of nutritional energy of the serving of food. Can be defined
+       * in Calories or kilojoules.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue energy = 1;</code>
+       */
+      public Builder clearEnergy() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        energy_ = null;
+        if (energyBuilder_ != null) {
+          energyBuilder_.dispose();
+          energyBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The amount of nutritional energy of the serving of food. Can be defined
+       * in Calories or kilojoules.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue energy = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Builder getEnergyBuilder() {
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return getEnergyFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * The amount of nutritional energy of the serving of food. Can be defined
+       * in Calories or kilojoules.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue energy = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.NutritionInformation.NutritionValueOrBuilder getEnergyOrBuilder() {
+        if (energyBuilder_ != null) {
+          return energyBuilder_.getMessageOrBuilder();
+        } else {
+          return energy_ == null ?
+              food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.getDefaultInstance() : energy_;
+        }
+      }
+      /**
+       * <pre>
+       * The amount of nutritional energy of the serving of food. Can be defined
+       * in Calories or kilojoules.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue energy = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.NutritionInformation.NutritionValue, food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Builder, food.menu.v1.FoodMenu.NutritionInformation.NutritionValueOrBuilder> 
+          getEnergyFieldBuilder() {
+        if (energyBuilder_ == null) {
+          energyBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.NutritionInformation.NutritionValue, food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Builder, food.menu.v1.FoodMenu.NutritionInformation.NutritionValueOrBuilder>(
+                  getEnergy(),
+                  getParentForChildren(),
+                  isClean());
+          energy_ = null;
+        }
+        return energyBuilder_;
+      }
+
+      private food.menu.v1.FoodMenu.NutritionInformation.NutritionValue sodiumContent_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.NutritionInformation.NutritionValue, food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Builder, food.menu.v1.FoodMenu.NutritionInformation.NutritionValueOrBuilder> sodiumContentBuilder_;
+      /**
+       * <pre>
+       * The amount of sodium content, measured in grams or milligrams.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue sodium_content = 2;</code>
+       * @return Whether the sodiumContent field is set.
+       */
+      public boolean hasSodiumContent() {
+        return ((bitField0_ & 0x00000002) != 0);
+      }
+      /**
+       * <pre>
+       * The amount of sodium content, measured in grams or milligrams.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue sodium_content = 2;</code>
+       * @return The sodiumContent.
+       */
+      public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue getSodiumContent() {
+        if (sodiumContentBuilder_ == null) {
+          return sodiumContent_ == null ? food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.getDefaultInstance() : sodiumContent_;
+        } else {
+          return sodiumContentBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * The amount of sodium content, measured in grams or milligrams.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue sodium_content = 2;</code>
+       */
+      public Builder setSodiumContent(food.menu.v1.FoodMenu.NutritionInformation.NutritionValue value) {
+        if (sodiumContentBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          sodiumContent_ = value;
+        } else {
+          sodiumContentBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The amount of sodium content, measured in grams or milligrams.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue sodium_content = 2;</code>
+       */
+      public Builder setSodiumContent(
+          food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Builder builderForValue) {
+        if (sodiumContentBuilder_ == null) {
+          sodiumContent_ = builderForValue.build();
+        } else {
+          sodiumContentBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The amount of sodium content, measured in grams or milligrams.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue sodium_content = 2;</code>
+       */
+      public Builder mergeSodiumContent(food.menu.v1.FoodMenu.NutritionInformation.NutritionValue value) {
+        if (sodiumContentBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) != 0) &&
+            sodiumContent_ != null &&
+            sodiumContent_ != food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.getDefaultInstance()) {
+            getSodiumContentBuilder().mergeFrom(value);
+          } else {
+            sodiumContent_ = value;
+          }
+        } else {
+          sodiumContentBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The amount of sodium content, measured in grams or milligrams.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue sodium_content = 2;</code>
+       */
+      public Builder clearSodiumContent() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        sodiumContent_ = null;
+        if (sodiumContentBuilder_ != null) {
+          sodiumContentBuilder_.dispose();
+          sodiumContentBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The amount of sodium content, measured in grams or milligrams.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue sodium_content = 2;</code>
+       */
+      public food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Builder getSodiumContentBuilder() {
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return getSodiumContentFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * The amount of sodium content, measured in grams or milligrams.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue sodium_content = 2;</code>
+       */
+      public food.menu.v1.FoodMenu.NutritionInformation.NutritionValueOrBuilder getSodiumContentOrBuilder() {
+        if (sodiumContentBuilder_ != null) {
+          return sodiumContentBuilder_.getMessageOrBuilder();
+        } else {
+          return sodiumContent_ == null ?
+              food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.getDefaultInstance() : sodiumContent_;
+        }
+      }
+      /**
+       * <pre>
+       * The amount of sodium content, measured in grams or milligrams.
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.NutritionInformation.NutritionValue sodium_content = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.NutritionInformation.NutritionValue, food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Builder, food.menu.v1.FoodMenu.NutritionInformation.NutritionValueOrBuilder> 
+          getSodiumContentFieldBuilder() {
+        if (sodiumContentBuilder_ == null) {
+          sodiumContentBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.NutritionInformation.NutritionValue, food.menu.v1.FoodMenu.NutritionInformation.NutritionValue.Builder, food.menu.v1.FoodMenu.NutritionInformation.NutritionValueOrBuilder>(
+                  getSodiumContent(),
+                  getParentForChildren(),
+                  isClean());
+          sodiumContent_ = null;
+        }
+        return sodiumContentBuilder_;
+      }
+
+      private int servingSize_ ;
+      /**
+       * <pre>
+       * The number of servings the nutrition value applies to.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional int32 serving_size = 3;</code>
+       * @return Whether the servingSize field is set.
+       */
+      @java.lang.Override
+      public boolean hasServingSize() {
+        return ((bitField0_ & 0x00000004) != 0);
+      }
+      /**
+       * <pre>
+       * The number of servings the nutrition value applies to.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional int32 serving_size = 3;</code>
+       * @return The servingSize.
+       */
+      @java.lang.Override
+      public int getServingSize() {
+        return servingSize_;
+      }
+      /**
+       * <pre>
+       * The number of servings the nutrition value applies to.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional int32 serving_size = 3;</code>
+       * @param value The servingSize to set.
+       * @return This builder for chaining.
+       */
+      public Builder setServingSize(int value) {
+
+        servingSize_ = value;
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The number of servings the nutrition value applies to.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional int32 serving_size = 3;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearServingSize() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        servingSize_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private food.menu.v1.FoodMenu.TextField description_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> descriptionBuilder_;
+      /**
+       * <pre>
+       * Nutrition information in free text. For example "Contains preservatives".
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 4;</code>
+       * @return Whether the description field is set.
+       */
+      public boolean hasDescription() {
+        return ((bitField0_ & 0x00000008) != 0);
+      }
+      /**
+       * <pre>
+       * Nutrition information in free text. For example "Contains preservatives".
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 4;</code>
+       * @return The description.
+       */
+      public food.menu.v1.FoodMenu.TextField getDescription() {
+        if (descriptionBuilder_ == null) {
+          return description_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : description_;
+        } else {
+          return descriptionBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * Nutrition information in free text. For example "Contains preservatives".
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 4;</code>
+       */
+      public Builder setDescription(food.menu.v1.FoodMenu.TextField value) {
+        if (descriptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          description_ = value;
+        } else {
+          descriptionBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Nutrition information in free text. For example "Contains preservatives".
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 4;</code>
+       */
+      public Builder setDescription(
+          food.menu.v1.FoodMenu.TextField.Builder builderForValue) {
+        if (descriptionBuilder_ == null) {
+          description_ = builderForValue.build();
+        } else {
+          descriptionBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Nutrition information in free text. For example "Contains preservatives".
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 4;</code>
+       */
+      public Builder mergeDescription(food.menu.v1.FoodMenu.TextField value) {
+        if (descriptionBuilder_ == null) {
+          if (((bitField0_ & 0x00000008) != 0) &&
+            description_ != null &&
+            description_ != food.menu.v1.FoodMenu.TextField.getDefaultInstance()) {
+            getDescriptionBuilder().mergeFrom(value);
+          } else {
+            description_ = value;
+          }
+        } else {
+          descriptionBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Nutrition information in free text. For example "Contains preservatives".
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 4;</code>
+       */
+      public Builder clearDescription() {
+        bitField0_ = (bitField0_ & ~0x00000008);
+        description_ = null;
+        if (descriptionBuilder_ != null) {
+          descriptionBuilder_.dispose();
+          descriptionBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Nutrition information in free text. For example "Contains preservatives".
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.TextField.Builder getDescriptionBuilder() {
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return getDescriptionFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Nutrition information in free text. For example "Contains preservatives".
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 4;</code>
+       */
+      public food.menu.v1.FoodMenu.TextFieldOrBuilder getDescriptionOrBuilder() {
+        if (descriptionBuilder_ != null) {
+          return descriptionBuilder_.getMessageOrBuilder();
+        } else {
+          return description_ == null ?
+              food.menu.v1.FoodMenu.TextField.getDefaultInstance() : description_;
+        }
+      }
+      /**
+       * <pre>
+       * Nutrition information in free text. For example "Contains preservatives".
+       * Optional.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField description = 4;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> 
+          getDescriptionFieldBuilder() {
+        if (descriptionBuilder_ == null) {
+          descriptionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder>(
+                  getDescription(),
+                  getParentForChildren(),
+                  isClean());
+          description_ = null;
+        }
+        return descriptionBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.NutritionInformation)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.NutritionInformation)
+    private static final food.menu.v1.FoodMenu.NutritionInformation DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.NutritionInformation();
+    }
+
+    public static food.menu.v1.FoodMenu.NutritionInformation getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<NutritionInformation>
+        PARSER = new com.google.protobuf.AbstractParser<NutritionInformation>() {
+      @java.lang.Override
+      public NutritionInformation parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<NutritionInformation> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<NutritionInformation> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.NutritionInformation getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface AdditiveOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.Additive)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * Descriptive text of the additive, e.g. "preservatives".
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField name = 1;</code>
+     * @return Whether the name field is set.
+     */
+    boolean hasName();
+    /**
+     * <pre>
+     * Descriptive text of the additive, e.g. "preservatives".
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField name = 1;</code>
+     * @return The name.
+     */
+    food.menu.v1.FoodMenu.TextField getName();
+    /**
+     * <pre>
+     * Descriptive text of the additive, e.g. "preservatives".
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField name = 1;</code>
+     */
+    food.menu.v1.FoodMenu.TextFieldOrBuilder getNameOrBuilder();
+
+    /**
+     * <pre>
+     * Whether the MenuItem contains, may contain, or is free from this additive.
+     * Defaults to contains.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+     * @return Whether the containmentLevelCode field is set.
+     */
+    boolean hasContainmentLevelCode();
+    /**
+     * <pre>
+     * Whether the MenuItem contains, may contain, or is free from this additive.
+     * Defaults to contains.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+     * @return The enum numeric value on the wire for containmentLevelCode.
+     */
+    int getContainmentLevelCodeValue();
+    /**
+     * <pre>
+     * Whether the MenuItem contains, may contain, or is free from this additive.
+     * Defaults to contains.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+     * @return The containmentLevelCode.
+     */
+    food.menu.v1.FoodMenu.ContainmentLevelCode getContainmentLevelCode();
+  }
+  /**
+   * <pre>
+   * Additive shown to the user on the MenuItem. An additive preserves or enhances
+   * the quality of the food.
+   * </pre>
+   *
+   * Protobuf type {@code food.menu.v1.Additive}
+   */
+  public static final class Additive extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.Additive)
+      AdditiveOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use Additive.newBuilder() to construct.
+    private Additive(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private Additive() {
+      containmentLevelCode_ = 0;
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new Additive();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Additive_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Additive_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.Additive.class, food.menu.v1.FoodMenu.Additive.Builder.class);
+    }
+
+    private int bitField0_;
+    public static final int NAME_FIELD_NUMBER = 1;
+    private food.menu.v1.FoodMenu.TextField name_;
+    /**
+     * <pre>
+     * Descriptive text of the additive, e.g. "preservatives".
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField name = 1;</code>
+     * @return Whether the name field is set.
+     */
+    @java.lang.Override
+    public boolean hasName() {
+      return name_ != null;
+    }
+    /**
+     * <pre>
+     * Descriptive text of the additive, e.g. "preservatives".
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField name = 1;</code>
+     * @return The name.
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextField getName() {
+      return name_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : name_;
+    }
+    /**
+     * <pre>
+     * Descriptive text of the additive, e.g. "preservatives".
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.TextField name = 1;</code>
+     */
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.TextFieldOrBuilder getNameOrBuilder() {
+      return name_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : name_;
+    }
+
+    public static final int CONTAINMENT_LEVEL_CODE_FIELD_NUMBER = 2;
+    private int containmentLevelCode_ = 0;
+    /**
+     * <pre>
+     * Whether the MenuItem contains, may contain, or is free from this additive.
+     * Defaults to contains.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+     * @return Whether the containmentLevelCode field is set.
+     */
+    @java.lang.Override public boolean hasContainmentLevelCode() {
+      return ((bitField0_ & 0x00000001) != 0);
+    }
+    /**
+     * <pre>
+     * Whether the MenuItem contains, may contain, or is free from this additive.
+     * Defaults to contains.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+     * @return The enum numeric value on the wire for containmentLevelCode.
+     */
+    @java.lang.Override public int getContainmentLevelCodeValue() {
+      return containmentLevelCode_;
+    }
+    /**
+     * <pre>
+     * Whether the MenuItem contains, may contain, or is free from this additive.
+     * Defaults to contains.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+     * @return The containmentLevelCode.
+     */
+    @java.lang.Override public food.menu.v1.FoodMenu.ContainmentLevelCode getContainmentLevelCode() {
+      food.menu.v1.FoodMenu.ContainmentLevelCode result = food.menu.v1.FoodMenu.ContainmentLevelCode.forNumber(containmentLevelCode_);
+      return result == null ? food.menu.v1.FoodMenu.ContainmentLevelCode.UNRECOGNIZED : result;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (name_ != null) {
+        output.writeMessage(1, getName());
+      }
+      if (((bitField0_ & 0x00000001) != 0)) {
+        output.writeEnum(2, containmentLevelCode_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (name_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, getName());
+      }
+      if (((bitField0_ & 0x00000001) != 0)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(2, containmentLevelCode_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.Additive)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.Additive other = (food.menu.v1.FoodMenu.Additive) obj;
+
+      if (hasName() != other.hasName()) return false;
+      if (hasName()) {
+        if (!getName()
+            .equals(other.getName())) return false;
+      }
+      if (hasContainmentLevelCode() != other.hasContainmentLevelCode()) return false;
+      if (hasContainmentLevelCode()) {
+        if (containmentLevelCode_ != other.containmentLevelCode_) return false;
+      }
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasName()) {
+        hash = (37 * hash) + NAME_FIELD_NUMBER;
+        hash = (53 * hash) + getName().hashCode();
+      }
+      if (hasContainmentLevelCode()) {
+        hash = (37 * hash) + CONTAINMENT_LEVEL_CODE_FIELD_NUMBER;
+        hash = (53 * hash) + containmentLevelCode_;
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.Additive parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Additive parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Additive parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Additive parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Additive parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Additive parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Additive parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Additive parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Additive parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Additive parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Additive parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Additive parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.Additive prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * Additive shown to the user on the MenuItem. An additive preserves or enhances
+     * the quality of the food.
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.Additive}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.Additive)
+        food.menu.v1.FoodMenu.AdditiveOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Additive_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Additive_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.Additive.class, food.menu.v1.FoodMenu.Additive.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.Additive.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        name_ = null;
+        if (nameBuilder_ != null) {
+          nameBuilder_.dispose();
+          nameBuilder_ = null;
+        }
+        containmentLevelCode_ = 0;
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Additive_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Additive getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.Additive.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Additive build() {
+        food.menu.v1.FoodMenu.Additive result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Additive buildPartial() {
+        food.menu.v1.FoodMenu.Additive result = new food.menu.v1.FoodMenu.Additive(this);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.Additive result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.name_ = nameBuilder_ == null
+              ? name_
+              : nameBuilder_.build();
+        }
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000002) != 0)) {
+          result.containmentLevelCode_ = containmentLevelCode_;
+          to_bitField0_ |= 0x00000001;
+        }
+        result.bitField0_ |= to_bitField0_;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.Additive) {
+          return mergeFrom((food.menu.v1.FoodMenu.Additive)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.Additive other) {
+        if (other == food.menu.v1.FoodMenu.Additive.getDefaultInstance()) return this;
+        if (other.hasName()) {
+          mergeName(other.getName());
+        }
+        if (other.hasContainmentLevelCode()) {
+          setContainmentLevelCode(other.getContainmentLevelCode());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10: {
+                input.readMessage(
+                    getNameFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 10
+              case 16: {
+                containmentLevelCode_ = input.readEnum();
+                bitField0_ |= 0x00000002;
+                break;
+              } // case 16
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int bitField0_;
+
+      private food.menu.v1.FoodMenu.TextField name_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> nameBuilder_;
+      /**
+       * <pre>
+       * Descriptive text of the additive, e.g. "preservatives".
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField name = 1;</code>
+       * @return Whether the name field is set.
+       */
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) != 0);
+      }
+      /**
+       * <pre>
+       * Descriptive text of the additive, e.g. "preservatives".
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField name = 1;</code>
+       * @return The name.
+       */
+      public food.menu.v1.FoodMenu.TextField getName() {
+        if (nameBuilder_ == null) {
+          return name_ == null ? food.menu.v1.FoodMenu.TextField.getDefaultInstance() : name_;
+        } else {
+          return nameBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * Descriptive text of the additive, e.g. "preservatives".
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField name = 1;</code>
+       */
+      public Builder setName(food.menu.v1.FoodMenu.TextField value) {
+        if (nameBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          name_ = value;
+        } else {
+          nameBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Descriptive text of the additive, e.g. "preservatives".
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField name = 1;</code>
+       */
+      public Builder setName(
+          food.menu.v1.FoodMenu.TextField.Builder builderForValue) {
+        if (nameBuilder_ == null) {
+          name_ = builderForValue.build();
+        } else {
+          nameBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Descriptive text of the additive, e.g. "preservatives".
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField name = 1;</code>
+       */
+      public Builder mergeName(food.menu.v1.FoodMenu.TextField value) {
+        if (nameBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0) &&
+            name_ != null &&
+            name_ != food.menu.v1.FoodMenu.TextField.getDefaultInstance()) {
+            getNameBuilder().mergeFrom(value);
+          } else {
+            name_ = value;
+          }
+        } else {
+          nameBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Descriptive text of the additive, e.g. "preservatives".
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField name = 1;</code>
+       */
+      public Builder clearName() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        name_ = null;
+        if (nameBuilder_ != null) {
+          nameBuilder_.dispose();
+          nameBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Descriptive text of the additive, e.g. "preservatives".
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField name = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.TextField.Builder getNameBuilder() {
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return getNameFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Descriptive text of the additive, e.g. "preservatives".
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField name = 1;</code>
+       */
+      public food.menu.v1.FoodMenu.TextFieldOrBuilder getNameOrBuilder() {
+        if (nameBuilder_ != null) {
+          return nameBuilder_.getMessageOrBuilder();
+        } else {
+          return name_ == null ?
+              food.menu.v1.FoodMenu.TextField.getDefaultInstance() : name_;
+        }
+      }
+      /**
+       * <pre>
+       * Descriptive text of the additive, e.g. "preservatives".
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.TextField name = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder> 
+          getNameFieldBuilder() {
+        if (nameBuilder_ == null) {
+          nameBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              food.menu.v1.FoodMenu.TextField, food.menu.v1.FoodMenu.TextField.Builder, food.menu.v1.FoodMenu.TextFieldOrBuilder>(
+                  getName(),
+                  getParentForChildren(),
+                  isClean());
+          name_ = null;
+        }
+        return nameBuilder_;
+      }
+
+      private int containmentLevelCode_ = 0;
+      /**
+       * <pre>
+       * Whether the MenuItem contains, may contain, or is free from this additive.
+       * Defaults to contains.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+       * @return Whether the containmentLevelCode field is set.
+       */
+      @java.lang.Override public boolean hasContainmentLevelCode() {
+        return ((bitField0_ & 0x00000002) != 0);
+      }
+      /**
+       * <pre>
+       * Whether the MenuItem contains, may contain, or is free from this additive.
+       * Defaults to contains.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+       * @return The enum numeric value on the wire for containmentLevelCode.
+       */
+      @java.lang.Override public int getContainmentLevelCodeValue() {
+        return containmentLevelCode_;
+      }
+      /**
+       * <pre>
+       * Whether the MenuItem contains, may contain, or is free from this additive.
+       * Defaults to contains.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+       * @param value The enum numeric value on the wire for containmentLevelCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setContainmentLevelCodeValue(int value) {
+        containmentLevelCode_ = value;
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Whether the MenuItem contains, may contain, or is free from this additive.
+       * Defaults to contains.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+       * @return The containmentLevelCode.
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.ContainmentLevelCode getContainmentLevelCode() {
+        food.menu.v1.FoodMenu.ContainmentLevelCode result = food.menu.v1.FoodMenu.ContainmentLevelCode.forNumber(containmentLevelCode_);
+        return result == null ? food.menu.v1.FoodMenu.ContainmentLevelCode.UNRECOGNIZED : result;
+      }
+      /**
+       * <pre>
+       * Whether the MenuItem contains, may contain, or is free from this additive.
+       * Defaults to contains.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+       * @param value The containmentLevelCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setContainmentLevelCode(food.menu.v1.FoodMenu.ContainmentLevelCode value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        bitField0_ |= 0x00000002;
+        containmentLevelCode_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Whether the MenuItem contains, may contain, or is free from this additive.
+       * Defaults to contains.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearContainmentLevelCode() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        containmentLevelCode_ = 0;
+        onChanged();
+        return this;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.Additive)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.Additive)
+    private static final food.menu.v1.FoodMenu.Additive DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.Additive();
+    }
+
+    public static food.menu.v1.FoodMenu.Additive getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Additive>
+        PARSER = new com.google.protobuf.AbstractParser<Additive>() {
+      @java.lang.Override
+      public Additive parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<Additive> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Additive> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.Additive getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface AllergenOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.Allergen)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * Type of allergen.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.AllergenTypeCode allergen_type_code = 1;</code>
+     * @return The enum numeric value on the wire for allergenTypeCode.
+     */
+    int getAllergenTypeCodeValue();
+    /**
+     * <pre>
+     * Type of allergen.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.AllergenTypeCode allergen_type_code = 1;</code>
+     * @return The allergenTypeCode.
+     */
+    food.menu.v1.FoodMenu.AllergenTypeCode getAllergenTypeCode();
+
+    /**
+     * <pre>
+     * Whether the MenuItem contains, may contain, or is free from this allergen.
+     * Defaults to contains.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+     * @return Whether the containmentLevelCode field is set.
+     */
+    boolean hasContainmentLevelCode();
+    /**
+     * <pre>
+     * Whether the MenuItem contains, may contain, or is free from this allergen.
+     * Defaults to contains.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+     * @return The enum numeric value on the wire for containmentLevelCode.
+     */
+    int getContainmentLevelCodeValue();
+    /**
+     * <pre>
+     * Whether the MenuItem contains, may contain, or is free from this allergen.
+     * Defaults to contains.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+     * @return The containmentLevelCode.
+     */
+    food.menu.v1.FoodMenu.ContainmentLevelCode getContainmentLevelCode();
+  }
+  /**
+   * <pre>
+   * Allergen shown to the user on the MenuItem. An allergen relates to qualities
+   * of food that causes allergic reactions.
+   * </pre>
+   *
+   * Protobuf type {@code food.menu.v1.Allergen}
+   */
+  public static final class Allergen extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.Allergen)
+      AllergenOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use Allergen.newBuilder() to construct.
+    private Allergen(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private Allergen() {
+      allergenTypeCode_ = 0;
+      containmentLevelCode_ = 0;
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new Allergen();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Allergen_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Allergen_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.Allergen.class, food.menu.v1.FoodMenu.Allergen.Builder.class);
+    }
+
+    private int bitField0_;
+    public static final int ALLERGEN_TYPE_CODE_FIELD_NUMBER = 1;
+    private int allergenTypeCode_ = 0;
+    /**
+     * <pre>
+     * Type of allergen.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.AllergenTypeCode allergen_type_code = 1;</code>
+     * @return The enum numeric value on the wire for allergenTypeCode.
+     */
+    @java.lang.Override public int getAllergenTypeCodeValue() {
+      return allergenTypeCode_;
+    }
+    /**
+     * <pre>
+     * Type of allergen.
+     * Required.
+     * </pre>
+     *
+     * <code>.food.menu.v1.AllergenTypeCode allergen_type_code = 1;</code>
+     * @return The allergenTypeCode.
+     */
+    @java.lang.Override public food.menu.v1.FoodMenu.AllergenTypeCode getAllergenTypeCode() {
+      food.menu.v1.FoodMenu.AllergenTypeCode result = food.menu.v1.FoodMenu.AllergenTypeCode.forNumber(allergenTypeCode_);
+      return result == null ? food.menu.v1.FoodMenu.AllergenTypeCode.UNRECOGNIZED : result;
+    }
+
+    public static final int CONTAINMENT_LEVEL_CODE_FIELD_NUMBER = 2;
+    private int containmentLevelCode_ = 0;
+    /**
+     * <pre>
+     * Whether the MenuItem contains, may contain, or is free from this allergen.
+     * Defaults to contains.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+     * @return Whether the containmentLevelCode field is set.
+     */
+    @java.lang.Override public boolean hasContainmentLevelCode() {
+      return ((bitField0_ & 0x00000001) != 0);
+    }
+    /**
+     * <pre>
+     * Whether the MenuItem contains, may contain, or is free from this allergen.
+     * Defaults to contains.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+     * @return The enum numeric value on the wire for containmentLevelCode.
+     */
+    @java.lang.Override public int getContainmentLevelCodeValue() {
+      return containmentLevelCode_;
+    }
+    /**
+     * <pre>
+     * Whether the MenuItem contains, may contain, or is free from this allergen.
+     * Defaults to contains.
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+     * @return The containmentLevelCode.
+     */
+    @java.lang.Override public food.menu.v1.FoodMenu.ContainmentLevelCode getContainmentLevelCode() {
+      food.menu.v1.FoodMenu.ContainmentLevelCode result = food.menu.v1.FoodMenu.ContainmentLevelCode.forNumber(containmentLevelCode_);
+      return result == null ? food.menu.v1.FoodMenu.ContainmentLevelCode.UNRECOGNIZED : result;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (allergenTypeCode_ != food.menu.v1.FoodMenu.AllergenTypeCode.ALLERGEN_TYPE_CODE_UNSPECIFIED.getNumber()) {
+        output.writeEnum(1, allergenTypeCode_);
+      }
+      if (((bitField0_ & 0x00000001) != 0)) {
+        output.writeEnum(2, containmentLevelCode_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (allergenTypeCode_ != food.menu.v1.FoodMenu.AllergenTypeCode.ALLERGEN_TYPE_CODE_UNSPECIFIED.getNumber()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(1, allergenTypeCode_);
+      }
+      if (((bitField0_ & 0x00000001) != 0)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(2, containmentLevelCode_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.Allergen)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.Allergen other = (food.menu.v1.FoodMenu.Allergen) obj;
+
+      if (allergenTypeCode_ != other.allergenTypeCode_) return false;
+      if (hasContainmentLevelCode() != other.hasContainmentLevelCode()) return false;
+      if (hasContainmentLevelCode()) {
+        if (containmentLevelCode_ != other.containmentLevelCode_) return false;
+      }
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + ALLERGEN_TYPE_CODE_FIELD_NUMBER;
+      hash = (53 * hash) + allergenTypeCode_;
+      if (hasContainmentLevelCode()) {
+        hash = (37 * hash) + CONTAINMENT_LEVEL_CODE_FIELD_NUMBER;
+        hash = (53 * hash) + containmentLevelCode_;
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.Allergen parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Allergen parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Allergen parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Allergen parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Allergen parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.Allergen parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Allergen parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Allergen parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Allergen parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Allergen parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.Allergen parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.Allergen parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.Allergen prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * Allergen shown to the user on the MenuItem. An allergen relates to qualities
+     * of food that causes allergic reactions.
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.Allergen}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.Allergen)
+        food.menu.v1.FoodMenu.AllergenOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Allergen_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Allergen_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.Allergen.class, food.menu.v1.FoodMenu.Allergen.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.Allergen.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        allergenTypeCode_ = 0;
+        containmentLevelCode_ = 0;
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_Allergen_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Allergen getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.Allergen.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Allergen build() {
+        food.menu.v1.FoodMenu.Allergen result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.Allergen buildPartial() {
+        food.menu.v1.FoodMenu.Allergen result = new food.menu.v1.FoodMenu.Allergen(this);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.Allergen result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.allergenTypeCode_ = allergenTypeCode_;
+        }
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000002) != 0)) {
+          result.containmentLevelCode_ = containmentLevelCode_;
+          to_bitField0_ |= 0x00000001;
+        }
+        result.bitField0_ |= to_bitField0_;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.Allergen) {
+          return mergeFrom((food.menu.v1.FoodMenu.Allergen)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.Allergen other) {
+        if (other == food.menu.v1.FoodMenu.Allergen.getDefaultInstance()) return this;
+        if (other.allergenTypeCode_ != 0) {
+          setAllergenTypeCodeValue(other.getAllergenTypeCodeValue());
+        }
+        if (other.hasContainmentLevelCode()) {
+          setContainmentLevelCode(other.getContainmentLevelCode());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 8: {
+                allergenTypeCode_ = input.readEnum();
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 8
+              case 16: {
+                containmentLevelCode_ = input.readEnum();
+                bitField0_ |= 0x00000002;
+                break;
+              } // case 16
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int bitField0_;
+
+      private int allergenTypeCode_ = 0;
+      /**
+       * <pre>
+       * Type of allergen.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.AllergenTypeCode allergen_type_code = 1;</code>
+       * @return The enum numeric value on the wire for allergenTypeCode.
+       */
+      @java.lang.Override public int getAllergenTypeCodeValue() {
+        return allergenTypeCode_;
+      }
+      /**
+       * <pre>
+       * Type of allergen.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.AllergenTypeCode allergen_type_code = 1;</code>
+       * @param value The enum numeric value on the wire for allergenTypeCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setAllergenTypeCodeValue(int value) {
+        allergenTypeCode_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Type of allergen.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.AllergenTypeCode allergen_type_code = 1;</code>
+       * @return The allergenTypeCode.
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.AllergenTypeCode getAllergenTypeCode() {
+        food.menu.v1.FoodMenu.AllergenTypeCode result = food.menu.v1.FoodMenu.AllergenTypeCode.forNumber(allergenTypeCode_);
+        return result == null ? food.menu.v1.FoodMenu.AllergenTypeCode.UNRECOGNIZED : result;
+      }
+      /**
+       * <pre>
+       * Type of allergen.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.AllergenTypeCode allergen_type_code = 1;</code>
+       * @param value The allergenTypeCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setAllergenTypeCode(food.menu.v1.FoodMenu.AllergenTypeCode value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        bitField0_ |= 0x00000001;
+        allergenTypeCode_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Type of allergen.
+       * Required.
+       * </pre>
+       *
+       * <code>.food.menu.v1.AllergenTypeCode allergen_type_code = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearAllergenTypeCode() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        allergenTypeCode_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private int containmentLevelCode_ = 0;
+      /**
+       * <pre>
+       * Whether the MenuItem contains, may contain, or is free from this allergen.
+       * Defaults to contains.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+       * @return Whether the containmentLevelCode field is set.
+       */
+      @java.lang.Override public boolean hasContainmentLevelCode() {
+        return ((bitField0_ & 0x00000002) != 0);
+      }
+      /**
+       * <pre>
+       * Whether the MenuItem contains, may contain, or is free from this allergen.
+       * Defaults to contains.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+       * @return The enum numeric value on the wire for containmentLevelCode.
+       */
+      @java.lang.Override public int getContainmentLevelCodeValue() {
+        return containmentLevelCode_;
+      }
+      /**
+       * <pre>
+       * Whether the MenuItem contains, may contain, or is free from this allergen.
+       * Defaults to contains.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+       * @param value The enum numeric value on the wire for containmentLevelCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setContainmentLevelCodeValue(int value) {
+        containmentLevelCode_ = value;
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Whether the MenuItem contains, may contain, or is free from this allergen.
+       * Defaults to contains.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+       * @return The containmentLevelCode.
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.ContainmentLevelCode getContainmentLevelCode() {
+        food.menu.v1.FoodMenu.ContainmentLevelCode result = food.menu.v1.FoodMenu.ContainmentLevelCode.forNumber(containmentLevelCode_);
+        return result == null ? food.menu.v1.FoodMenu.ContainmentLevelCode.UNRECOGNIZED : result;
+      }
+      /**
+       * <pre>
+       * Whether the MenuItem contains, may contain, or is free from this allergen.
+       * Defaults to contains.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+       * @param value The containmentLevelCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setContainmentLevelCode(food.menu.v1.FoodMenu.ContainmentLevelCode value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        bitField0_ |= 0x00000002;
+        containmentLevelCode_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Whether the MenuItem contains, may contain, or is free from this allergen.
+       * Defaults to contains.
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.ContainmentLevelCode containment_level_code = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearContainmentLevelCode() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        containmentLevelCode_ = 0;
+        onChanged();
+        return this;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.Allergen)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.Allergen)
+    private static final food.menu.v1.FoodMenu.Allergen DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.Allergen();
+    }
+
+    public static food.menu.v1.FoodMenu.Allergen getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Allergen>
+        PARSER = new com.google.protobuf.AbstractParser<Allergen>() {
+      @java.lang.Override
+      public Allergen parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<Allergen> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Allergen> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.Allergen getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface DepositInfoOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:food.menu.v1.DepositInfo)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <pre>
+     * The deposit strategy to employ, e.g. "reusable".
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.DepositCode deposit_code = 1;</code>
+     * @return Whether the depositCode field is set.
+     */
+    boolean hasDepositCode();
+    /**
+     * <pre>
+     * The deposit strategy to employ, e.g. "reusable".
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.DepositCode deposit_code = 1;</code>
+     * @return The enum numeric value on the wire for depositCode.
+     */
+    int getDepositCodeValue();
+    /**
+     * <pre>
+     * The deposit strategy to employ, e.g. "reusable".
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.DepositCode deposit_code = 1;</code>
+     * @return The depositCode.
+     */
+    food.menu.v1.FoodMenu.DepositCode getDepositCode();
+
+    /**
+     * <pre>
+     * Value refunded for depositing the item properly.
+     * Optional.
+     * </pre>
+     *
+     * <code>.google.type.Money deposit_value = 2;</code>
+     * @return Whether the depositValue field is set.
+     */
+    boolean hasDepositValue();
+    /**
+     * <pre>
+     * Value refunded for depositing the item properly.
+     * Optional.
+     * </pre>
+     *
+     * <code>.google.type.Money deposit_value = 2;</code>
+     * @return The depositValue.
+     */
+    com.google.type.Money getDepositValue();
+    /**
+     * <pre>
+     * Value refunded for depositing the item properly.
+     * Optional.
+     * </pre>
+     *
+     * <code>.google.type.Money deposit_value = 2;</code>
+     */
+    com.google.type.MoneyOrBuilder getDepositValueOrBuilder();
+  }
+  /**
+   * <pre>
+   * Partner provided deposit info to instruct the user how to deposit a food item
+   * or bottle and the value of such deposit.
+   * </pre>
+   *
+   * Protobuf type {@code food.menu.v1.DepositInfo}
+   */
+  public static final class DepositInfo extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:food.menu.v1.DepositInfo)
+      DepositInfoOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use DepositInfo.newBuilder() to construct.
+    private DepositInfo(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private DepositInfo() {
+      depositCode_ = 0;
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new DepositInfo();
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_DepositInfo_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return food.menu.v1.FoodMenu.internal_static_food_menu_v1_DepositInfo_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              food.menu.v1.FoodMenu.DepositInfo.class, food.menu.v1.FoodMenu.DepositInfo.Builder.class);
+    }
+
+    private int bitField0_;
+    public static final int DEPOSIT_CODE_FIELD_NUMBER = 1;
+    private int depositCode_ = 0;
+    /**
+     * <pre>
+     * The deposit strategy to employ, e.g. "reusable".
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.DepositCode deposit_code = 1;</code>
+     * @return Whether the depositCode field is set.
+     */
+    @java.lang.Override public boolean hasDepositCode() {
+      return ((bitField0_ & 0x00000001) != 0);
+    }
+    /**
+     * <pre>
+     * The deposit strategy to employ, e.g. "reusable".
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.DepositCode deposit_code = 1;</code>
+     * @return The enum numeric value on the wire for depositCode.
+     */
+    @java.lang.Override public int getDepositCodeValue() {
+      return depositCode_;
+    }
+    /**
+     * <pre>
+     * The deposit strategy to employ, e.g. "reusable".
+     * Optional.
+     * </pre>
+     *
+     * <code>optional .food.menu.v1.DepositCode deposit_code = 1;</code>
+     * @return The depositCode.
+     */
+    @java.lang.Override public food.menu.v1.FoodMenu.DepositCode getDepositCode() {
+      food.menu.v1.FoodMenu.DepositCode result = food.menu.v1.FoodMenu.DepositCode.forNumber(depositCode_);
+      return result == null ? food.menu.v1.FoodMenu.DepositCode.UNRECOGNIZED : result;
+    }
+
+    public static final int DEPOSIT_VALUE_FIELD_NUMBER = 2;
+    private com.google.type.Money depositValue_;
+    /**
+     * <pre>
+     * Value refunded for depositing the item properly.
+     * Optional.
+     * </pre>
+     *
+     * <code>.google.type.Money deposit_value = 2;</code>
+     * @return Whether the depositValue field is set.
+     */
+    @java.lang.Override
+    public boolean hasDepositValue() {
+      return depositValue_ != null;
+    }
+    /**
+     * <pre>
+     * Value refunded for depositing the item properly.
+     * Optional.
+     * </pre>
+     *
+     * <code>.google.type.Money deposit_value = 2;</code>
+     * @return The depositValue.
+     */
+    @java.lang.Override
+    public com.google.type.Money getDepositValue() {
+      return depositValue_ == null ? com.google.type.Money.getDefaultInstance() : depositValue_;
+    }
+    /**
+     * <pre>
+     * Value refunded for depositing the item properly.
+     * Optional.
+     * </pre>
+     *
+     * <code>.google.type.Money deposit_value = 2;</code>
+     */
+    @java.lang.Override
+    public com.google.type.MoneyOrBuilder getDepositValueOrBuilder() {
+      return depositValue_ == null ? com.google.type.Money.getDefaultInstance() : depositValue_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (((bitField0_ & 0x00000001) != 0)) {
+        output.writeEnum(1, depositCode_);
+      }
+      if (depositValue_ != null) {
+        output.writeMessage(2, getDepositValue());
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) != 0)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(1, depositCode_);
+      }
+      if (depositValue_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getDepositValue());
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof food.menu.v1.FoodMenu.DepositInfo)) {
+        return super.equals(obj);
+      }
+      food.menu.v1.FoodMenu.DepositInfo other = (food.menu.v1.FoodMenu.DepositInfo) obj;
+
+      if (hasDepositCode() != other.hasDepositCode()) return false;
+      if (hasDepositCode()) {
+        if (depositCode_ != other.depositCode_) return false;
+      }
+      if (hasDepositValue() != other.hasDepositValue()) return false;
+      if (hasDepositValue()) {
+        if (!getDepositValue()
+            .equals(other.getDepositValue())) return false;
+      }
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasDepositCode()) {
+        hash = (37 * hash) + DEPOSIT_CODE_FIELD_NUMBER;
+        hash = (53 * hash) + depositCode_;
+      }
+      if (hasDepositValue()) {
+        hash = (37 * hash) + DEPOSIT_VALUE_FIELD_NUMBER;
+        hash = (53 * hash) + getDepositValue().hashCode();
+      }
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static food.menu.v1.FoodMenu.DepositInfo parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.DepositInfo parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.DepositInfo parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.DepositInfo parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.DepositInfo parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static food.menu.v1.FoodMenu.DepositInfo parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.DepositInfo parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.DepositInfo parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.DepositInfo parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.DepositInfo parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static food.menu.v1.FoodMenu.DepositInfo parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static food.menu.v1.FoodMenu.DepositInfo parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(food.menu.v1.FoodMenu.DepositInfo prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * Partner provided deposit info to instruct the user how to deposit a food item
+     * or bottle and the value of such deposit.
+     * </pre>
+     *
+     * Protobuf type {@code food.menu.v1.DepositInfo}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:food.menu.v1.DepositInfo)
+        food.menu.v1.FoodMenu.DepositInfoOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_DepositInfo_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_DepositInfo_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                food.menu.v1.FoodMenu.DepositInfo.class, food.menu.v1.FoodMenu.DepositInfo.Builder.class);
+      }
+
+      // Construct using food.menu.v1.FoodMenu.DepositInfo.newBuilder()
+      private Builder() {
+
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        depositCode_ = 0;
+        depositValue_ = null;
+        if (depositValueBuilder_ != null) {
+          depositValueBuilder_.dispose();
+          depositValueBuilder_ = null;
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return food.menu.v1.FoodMenu.internal_static_food_menu_v1_DepositInfo_descriptor;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.DepositInfo getDefaultInstanceForType() {
+        return food.menu.v1.FoodMenu.DepositInfo.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.DepositInfo build() {
+        food.menu.v1.FoodMenu.DepositInfo result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.DepositInfo buildPartial() {
+        food.menu.v1.FoodMenu.DepositInfo result = new food.menu.v1.FoodMenu.DepositInfo(this);
+        if (bitField0_ != 0) { buildPartial0(result); }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(food.menu.v1.FoodMenu.DepositInfo result) {
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.depositCode_ = depositCode_;
+          to_bitField0_ |= 0x00000001;
+        }
+        if (((from_bitField0_ & 0x00000002) != 0)) {
+          result.depositValue_ = depositValueBuilder_ == null
+              ? depositValue_
+              : depositValueBuilder_.build();
+        }
+        result.bitField0_ |= to_bitField0_;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof food.menu.v1.FoodMenu.DepositInfo) {
+          return mergeFrom((food.menu.v1.FoodMenu.DepositInfo)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(food.menu.v1.FoodMenu.DepositInfo other) {
+        if (other == food.menu.v1.FoodMenu.DepositInfo.getDefaultInstance()) return this;
+        if (other.hasDepositCode()) {
+          setDepositCode(other.getDepositCode());
+        }
+        if (other.hasDepositValue()) {
+          mergeDepositValue(other.getDepositValue());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 8: {
+                depositCode_ = input.readEnum();
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 8
+              case 18: {
+                input.readMessage(
+                    getDepositValueFieldBuilder().getBuilder(),
+                    extensionRegistry);
+                bitField0_ |= 0x00000002;
+                break;
+              } // case 18
+              default: {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+      private int bitField0_;
+
+      private int depositCode_ = 0;
+      /**
+       * <pre>
+       * The deposit strategy to employ, e.g. "reusable".
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.DepositCode deposit_code = 1;</code>
+       * @return Whether the depositCode field is set.
+       */
+      @java.lang.Override public boolean hasDepositCode() {
+        return ((bitField0_ & 0x00000001) != 0);
+      }
+      /**
+       * <pre>
+       * The deposit strategy to employ, e.g. "reusable".
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.DepositCode deposit_code = 1;</code>
+       * @return The enum numeric value on the wire for depositCode.
+       */
+      @java.lang.Override public int getDepositCodeValue() {
+        return depositCode_;
+      }
+      /**
+       * <pre>
+       * The deposit strategy to employ, e.g. "reusable".
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.DepositCode deposit_code = 1;</code>
+       * @param value The enum numeric value on the wire for depositCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setDepositCodeValue(int value) {
+        depositCode_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The deposit strategy to employ, e.g. "reusable".
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.DepositCode deposit_code = 1;</code>
+       * @return The depositCode.
+       */
+      @java.lang.Override
+      public food.menu.v1.FoodMenu.DepositCode getDepositCode() {
+        food.menu.v1.FoodMenu.DepositCode result = food.menu.v1.FoodMenu.DepositCode.forNumber(depositCode_);
+        return result == null ? food.menu.v1.FoodMenu.DepositCode.UNRECOGNIZED : result;
+      }
+      /**
+       * <pre>
+       * The deposit strategy to employ, e.g. "reusable".
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.DepositCode deposit_code = 1;</code>
+       * @param value The depositCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setDepositCode(food.menu.v1.FoodMenu.DepositCode value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        bitField0_ |= 0x00000001;
+        depositCode_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * The deposit strategy to employ, e.g. "reusable".
+       * Optional.
+       * </pre>
+       *
+       * <code>optional .food.menu.v1.DepositCode deposit_code = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearDepositCode() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        depositCode_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private com.google.type.Money depositValue_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          com.google.type.Money, com.google.type.Money.Builder, com.google.type.MoneyOrBuilder> depositValueBuilder_;
+      /**
+       * <pre>
+       * Value refunded for depositing the item properly.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.type.Money deposit_value = 2;</code>
+       * @return Whether the depositValue field is set.
+       */
+      public boolean hasDepositValue() {
+        return ((bitField0_ & 0x00000002) != 0);
+      }
+      /**
+       * <pre>
+       * Value refunded for depositing the item properly.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.type.Money deposit_value = 2;</code>
+       * @return The depositValue.
+       */
+      public com.google.type.Money getDepositValue() {
+        if (depositValueBuilder_ == null) {
+          return depositValue_ == null ? com.google.type.Money.getDefaultInstance() : depositValue_;
+        } else {
+          return depositValueBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * Value refunded for depositing the item properly.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.type.Money deposit_value = 2;</code>
+       */
+      public Builder setDepositValue(com.google.type.Money value) {
+        if (depositValueBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          depositValue_ = value;
+        } else {
+          depositValueBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Value refunded for depositing the item properly.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.type.Money deposit_value = 2;</code>
+       */
+      public Builder setDepositValue(
+          com.google.type.Money.Builder builderForValue) {
+        if (depositValueBuilder_ == null) {
+          depositValue_ = builderForValue.build();
+        } else {
+          depositValueBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Value refunded for depositing the item properly.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.type.Money deposit_value = 2;</code>
+       */
+      public Builder mergeDepositValue(com.google.type.Money value) {
+        if (depositValueBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) != 0) &&
+            depositValue_ != null &&
+            depositValue_ != com.google.type.Money.getDefaultInstance()) {
+            getDepositValueBuilder().mergeFrom(value);
+          } else {
+            depositValue_ = value;
+          }
+        } else {
+          depositValueBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Value refunded for depositing the item properly.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.type.Money deposit_value = 2;</code>
+       */
+      public Builder clearDepositValue() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        depositValue_ = null;
+        if (depositValueBuilder_ != null) {
+          depositValueBuilder_.dispose();
+          depositValueBuilder_ = null;
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * Value refunded for depositing the item properly.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.type.Money deposit_value = 2;</code>
+       */
+      public com.google.type.Money.Builder getDepositValueBuilder() {
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return getDepositValueFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Value refunded for depositing the item properly.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.type.Money deposit_value = 2;</code>
+       */
+      public com.google.type.MoneyOrBuilder getDepositValueOrBuilder() {
+        if (depositValueBuilder_ != null) {
+          return depositValueBuilder_.getMessageOrBuilder();
+        } else {
+          return depositValue_ == null ?
+              com.google.type.Money.getDefaultInstance() : depositValue_;
+        }
+      }
+      /**
+       * <pre>
+       * Value refunded for depositing the item properly.
+       * Optional.
+       * </pre>
+       *
+       * <code>.google.type.Money deposit_value = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          com.google.type.Money, com.google.type.Money.Builder, com.google.type.MoneyOrBuilder> 
+          getDepositValueFieldBuilder() {
+        if (depositValueBuilder_ == null) {
+          depositValueBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              com.google.type.Money, com.google.type.Money.Builder, com.google.type.MoneyOrBuilder>(
+                  getDepositValue(),
+                  getParentForChildren(),
+                  isClean());
+          depositValue_ = null;
+        }
+        return depositValueBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:food.menu.v1.DepositInfo)
+    }
+
+    // @@protoc_insertion_point(class_scope:food.menu.v1.DepositInfo)
+    private static final food.menu.v1.FoodMenu.DepositInfo DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new food.menu.v1.FoodMenu.DepositInfo();
+    }
+
+    public static food.menu.v1.FoodMenu.DepositInfo getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<DepositInfo>
+        PARSER = new com.google.protobuf.AbstractParser<DepositInfo>() {
+      @java.lang.Override
+      public DepositInfo parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        Builder builder = newBuilder();
+        try {
+          builder.mergeFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.setUnfinishedMessage(builder.buildPartial());
+        } catch (com.google.protobuf.UninitializedMessageException e) {
+          throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+        } catch (java.io.IOException e) {
+          throw new com.google.protobuf.InvalidProtocolBufferException(e)
+              .setUnfinishedMessage(builder.buildPartial());
+        }
+        return builder.buildPartial();
+      }
+    };
+
+    public static com.google.protobuf.Parser<DepositInfo> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<DepositInfo> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public food.menu.v1.FoodMenu.DepositInfo getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_FoodMenuFeed_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_FoodMenuFeed_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_MenuComponent_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_MenuComponent_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_Menu_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_Menu_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_MenuSection_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_MenuSection_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_MenuItem_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_MenuItem_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_MenuItem_MenuItemOptionSet_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_MenuItem_MenuItemOptionSet_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_MenuItemOption_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_MenuItemOption_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_MenuItemAttributes_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_MenuItemAttributes_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_OfferSet_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_OfferSet_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_Offer_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_Offer_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_Disclaimer_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_Disclaimer_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_TextField_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_TextField_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_Image_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_Image_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_MenuItemOptionProperty_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_MenuItemOptionProperty_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_NutritionInformation_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_NutritionInformation_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_NutritionInformation_NutritionValue_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_NutritionInformation_NutritionValue_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_NutritionInformation_NutritionValue_Range_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_NutritionInformation_NutritionValue_Range_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_Additive_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_Additive_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_Allergen_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_Allergen_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_food_menu_v1_DepositInfo_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_food_menu_v1_DepositInfo_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static  com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\017food_menu.proto\022\014food.menu.v1\032\037google/" +
+      "protobuf/timestamp.proto\032\024localized_text" +
+      ".proto\032\013money.proto\"9\n\014FoodMenuFeed\022)\n\004d" +
+      "ata\030\001 \003(\0132\033.food.menu.v1.MenuComponent\"\301" +
+      "\001\n\rMenuComponent\022\"\n\004menu\030\001 \001(\0132\022.food.me" +
+      "nu.v1.MenuH\000\022,\n\007section\030\002 \001(\0132\031.food.men" +
+      "u.v1.MenuSectionH\000\022&\n\004item\030\003 \001(\0132\026.food." +
+      "menu.v1.MenuItemH\000\022.\n\006option\030\004 \001(\0132\034.foo" +
+      "d.menu.v1.MenuItemOptionH\000B\006\n\004type\"\214\002\n\004M" +
+      "enu\022\017\n\007menu_id\030\001 \001(\t\022\024\n\014merchant_ids\030\002 \003" +
+      "(\t\022-\n\014display_name\030\003 \001(\0132\027.food.menu.v1." +
+      "TextField\022\020\n\010language\030\004 \001(\t\022,\n\ndisclaime" +
+      "r\030\005 \001(\0132\030.food.menu.v1.Disclaimer\022\025\n\rmen" +
+      "u_item_ids\030\006 \003(\t\022\030\n\020menu_section_ids\030\007 \003" +
+      "(\t\022=\n\031last_merchant_update_time\030\010 \001(\0132\032." +
+      "google.protobuf.Timestamp\"\331\001\n\013MenuSectio" +
+      "n\022\027\n\017menu_section_id\030\001 \001(\t\022-\n\014display_na" +
+      "me\030\002 \001(\0132\027.food.menu.v1.TextField\022,\n\013des" +
+      "cription\030\003 \001(\0132\027.food.menu.v1.TextField\022" +
+      "#\n\006images\030\004 \003(\0132\023.food.menu.v1.Image\022\025\n\r" +
+      "menu_item_ids\030\006 \003(\t\022\030\n\020menu_section_ids\030" +
+      "\007 \003(\t\"\222\003\n\010MenuItem\022\024\n\014menu_item_id\030\001 \001(\t" +
+      "\022-\n\014display_name\030\002 \001(\0132\027.food.menu.v1.Te" +
+      "xtField\022,\n\013description\030\003 \001(\0132\027.food.menu" +
+      ".v1.TextField\022#\n\006images\030\004 \003(\0132\023.food.men" +
+      "u.v1.Image\022+\n\toffer_set\030\006 \001(\0132\026.food.men" +
+      "u.v1.OfferSetH\000\022H\n\024menu_item_option_set\030" +
+      "\007 \001(\0132(.food.menu.v1.MenuItem.MenuItemOp" +
+      "tionSetH\000\0229\n\017item_attributes\030\010 \001(\0132 .foo" +
+      "d.menu.v1.MenuItemAttributes\0321\n\021MenuItem" +
+      "OptionSet\022\034\n\024menu_item_option_ids\030\001 \003(\tB" +
+      "\t\n\007pricing\"\310\001\n\016MenuItemOption\022\033\n\023menu_it" +
+      "em_option_id\030\t \001(\t\0223\n\005value\030\002 \001(\0132$.food" +
+      ".menu.v1.MenuItemOptionProperty\022)\n\toffer" +
+      "_set\030\004 \001(\0132\026.food.menu.v1.OfferSet\0229\n\017it" +
+      "em_attributes\030\005 \001(\0132 .food.menu.v1.MenuI" +
+      "temAttributes\"\330\002\n\022MenuItemAttributes\022\037\n\022" +
+      "number_of_servings\030\001 \001(\005H\000\210\001\001\022A\n\025nutriti" +
+      "on_information\030\002 \001(\0132\".food.menu.v1.Nutr" +
+      "itionInformation\0228\n\016suitable_diets\030\003 \003(\016" +
+      "2 .food.menu.v1.DietaryRestriction\022(\n\010ad" +
+      "ditive\030\004 \003(\0132\026.food.menu.v1.Additive\022(\n\010" +
+      "allergen\030\005 \003(\0132\026.food.menu.v1.Allergen\0229" +
+      "\n\026packaging_deposit_info\030\006 \001(\0132\031.food.me" +
+      "nu.v1.DepositInfoB\025\n\023_number_of_servings" +
+      "\"/\n\010OfferSet\022#\n\006offers\030\001 \003(\0132\023.food.menu" +
+      ".v1.Offer\"*\n\005Offer\022!\n\005price\030\001 \001(\0132\022.goog" +
+      "le.type.Money\"@\n\nDisclaimer\022%\n\004text\030\001 \001(" +
+      "\0132\027.food.menu.v1.TextField\022\013\n\003uri\030\002 \001(\t\"" +
+      "5\n\tTextField\022(\n\004text\030\001 \003(\0132\032.google.type" +
+      ".LocalizedText\"\024\n\005Image\022\013\n\003uri\030\001 \001(\t\"\243\003\n" +
+      "\026MenuItemOptionProperty\022H\n\rproperty_type" +
+      "\030\001 \001(\01621.food.menu.v1.MenuItemOptionProp" +
+      "erty.PropertyType\022J\n\014property_val\030\002 \001(\0162" +
+      "2.food.menu.v1.MenuItemOptionProperty.Pr" +
+      "opertyValueH\000\022+\n\010text_val\030\003 \001(\0132\027.food.m" +
+      "enu.v1.TextFieldH\000\"O\n\014PropertyType\022\031\n\025UN" +
+      "KNOWN_PROPERTY_TYPE\020\000\022\n\n\006OPTION\020\001\022\010\n\004SIZ" +
+      "E\020\002\022\016\n\nPIZZA_SIDE\020\003\"l\n\rPropertyValue\022\032\n\026" +
+      "UNKNOWN_PROPERTY_VALUE\020\000\022\023\n\017PIZZA_SIDE_L" +
+      "EFT\020\001\022\024\n\020PIZZA_SIDE_RIGHT\020\002\022\024\n\020PIZZA_SID" +
+      "E_WHOLE\020\003B\007\n\005value\"\311\003\n\024NutritionInformat" +
+      "ion\022A\n\006energy\030\001 \001(\01321.food.menu.v1.Nutri" +
+      "tionInformation.NutritionValue\022I\n\016sodium" +
+      "_content\030\002 \001(\01321.food.menu.v1.NutritionI" +
+      "nformation.NutritionValue\022\031\n\014serving_siz" +
+      "e\030\003 \001(\005H\000\210\001\001\022,\n\013description\030\004 \001(\0132\027.food" +
+      ".menu.v1.TextField\032\310\001\n\016NutritionValue\022\020\n" +
+      "\006amount\030\001 \001(\001H\000\022H\n\005range\030\003 \001(\01327.food.me" +
+      "nu.v1.NutritionInformation.NutritionValu" +
+      "e.RangeH\000\022.\n\004unit\030\002 \001(\0162 .food.menu.v1.N" +
+      "utritionValueUnit\032!\n\005Range\022\013\n\003min\030\001 \001(\001\022" +
+      "\013\n\003max\030\002 \001(\001B\007\n\005valueB\017\n\r_serving_size\"\225" +
+      "\001\n\010Additive\022%\n\004name\030\001 \001(\0132\027.food.menu.v1" +
+      ".TextField\022G\n\026containment_level_code\030\002 \001" +
+      "(\0162\".food.menu.v1.ContainmentLevelCodeH\000" +
+      "\210\001\001B\031\n\027_containment_level_code\"\252\001\n\010Aller" +
+      "gen\022:\n\022allergen_type_code\030\001 \001(\0162\036.food.m" +
+      "enu.v1.AllergenTypeCode\022G\n\026containment_l" +
+      "evel_code\030\002 \001(\0162\".food.menu.v1.Containme" +
+      "ntLevelCodeH\000\210\001\001B\031\n\027_containment_level_c" +
+      "ode\"\177\n\013DepositInfo\0224\n\014deposit_code\030\001 \001(\016" +
+      "2\031.food.menu.v1.DepositCodeH\000\210\001\001\022)\n\rdepo" +
+      "sit_value\030\002 \001(\0132\022.google.type.MoneyB\017\n\r_" +
+      "deposit_code*\372\001\n\022DietaryRestriction\022\024\n\020D" +
+      "IET_UNSPECIFIED\020\000\022\021\n\rDIET_DIABETIC\020\001\022\024\n\020" +
+      "DIET_GLUTEN_FREE\020\002\022\016\n\nDIET_HALAL\020\003\022\016\n\nDI" +
+      "ET_HINDU\020\004\022\017\n\013DIET_KOSHER\020\005\022\024\n\020DIET_LOW_" +
+      "CALORIE\020\006\022\020\n\014DIET_LOW_FAT\020\007\022\024\n\020DIET_LOW_" +
+      "LACTOSE\020\010\022\021\n\rDIET_LOW_SALT\020\t\022\016\n\nDIET_VEG" +
+      "AN\020\n\022\023\n\017DIET_VEGETARIAN\020\013*\207\022\n\020AllergenTy" +
+      "peCode\022\"\n\036ALLERGEN_TYPE_CODE_UNSPECIFIED" +
+      "\020\000\022\036\n\032ALLERGEN_TYPE_CODE_ALMONDS\020\001\022-\n)AL" +
+      "LERGEN_TYPE_CODE_ALPHA_ISOMETHYL_IONONE\020" +
+      "\002\022\036\n\032ALLERGEN_TYPE_CODE_ALCOHOL\020\003\022$\n ALL" +
+      "ERGEN_TYPE_CODE_AMYL_CINNAMAL\020\004\022$\n ALLER" +
+      "GEN_TYPE_CODE_ANISE_ALCOHOL\020\005\022\035\n\031ALLERGE" +
+      "N_TYPE_CODE_BARLEY\020\006\022%\n!ALLERGEN_TYPE_CO" +
+      "DE_BENZYL_ALCOHOL\020\007\022&\n\"ALLERGEN_TYPE_COD" +
+      "E_BENZYL_BENZOATE\020\010\022\'\n#ALLERGEN_TYPE_COD" +
+      "E_BENZYL_CINNAMATE\020\t\022(\n$ALLERGEN_TYPE_CO" +
+      "DE_BENZYL_SALICYLATE\020\n\022\"\n\036ALLERGEN_TYPE_" +
+      "CODE_BRAZIL_NUTS\020\013\0223\n/ALLERGEN_TYPE_CODE" +
+      "_BUTYLPHENYL_METHYLPROPIONATE\020\014\022\036\n\032ALLER" +
+      "GEN_TYPE_CODE_CARROTS\020\r\022\"\n\036ALLERGEN_TYPE" +
+      "_CODE_CASHEW_NUTS\020\016\022\035\n\031ALLERGEN_TYPE_COD" +
+      "E_CELERY\020\017\0220\n,ALLERGEN_TYPE_CODE_CEREALS" +
+      "_CONTAINING_GLUTEN\020\020\022\037\n\033ALLERGEN_TYPE_CO" +
+      "DE_CINNAMAL\020\021\022\'\n#ALLERGEN_TYPE_CODE_CINN" +
+      "AMYL_ALCOHOL\020\022\022\035\n\031ALLERGEN_TYPE_CODE_CIT" +
+      "RAL\020\023\022\"\n\036ALLERGEN_TYPE_CODE_CITRONELLOL\020" +
+      "\024\022\034\n\030ALLERGEN_TYPE_CODE_COCOA\020\025\022 \n\034ALLER" +
+      "GEN_TYPE_CODE_CORIANDER\020\026\022\033\n\027ALLERGEN_TY" +
+      "PE_CODE_CORN\020\027\022\037\n\033ALLERGEN_TYPE_CODE_COU" +
+      "MARIN\020\030\022\"\n\036ALLERGEN_TYPE_CODE_CRUSTACEAN" +
+      "S\020\031\022\033\n\027ALLERGEN_TYPE_CODE_EGGS\020\032\022\036\n\032ALLE" +
+      "RGEN_TYPE_CODE_EUGENOL\020\033\022)\n%ALLERGEN_TYP" +
+      "E_CODE_EVERNIA_FURFURACEA\020\034\022(\n$ALLERGEN_" +
+      "TYPE_CODE_EVERNIA_PRUNASTRI\020\035\022\037\n\033ALLERGE" +
+      "N_TYPE_CODE_FARNESOL\020\036\022\033\n\027ALLERGEN_TYPE_" +
+      "CODE_FISH\020\037\022\037\n\033ALLERGEN_TYPE_CODE_GERANI" +
+      "OL\020 \022\035\n\031ALLERGEN_TYPE_CODE_GLUTEN\020!\022 \n\034A" +
+      "LLERGEN_TYPE_CODE_HAZELNUTS\020\"\022%\n!ALLERGE" +
+      "N_TYPE_CODE_HEXYL_CINNAMAL\020#\022)\n%ALLERGEN" +
+      "_TYPE_CODE_HYDROXYCITRONELLAL\020$\022]\nYALLER" +
+      "GEN_TYPE_CODE_HYDROXYISOHEXYL_3_CYCLOHEX" +
+      "ENE_CARBOXALDEHYDE_ISOEUGENOL_LIMONENE_L" +
+      "INAL\020%\022\034\n\030ALLERGEN_TYPE_CODE_KAMUT\020&\022\036\n\032" +
+      "ALLERGEN_TYPE_CODE_LACTOSE\020\'\022\035\n\031ALLERGEN" +
+      "_TYPE_CODE_LUPINE\020(\022%\n!ALLERGEN_TYPE_COD" +
+      "E_MACADAMIA_NUTS\020)\022)\n%ALLERGEN_TYPE_CODE" +
+      "_METHYL_2_OCTYNOATE\020*\022\033\n\027ALLERGEN_TYPE_C" +
+      "ODE_MILK\020+\022\037\n\033ALLERGEN_TYPE_CODE_MOLLUSC" +
+      "S\020,\022\036\n\032ALLERGEN_TYPE_CODE_MUSTARD\020-\022,\n(A" +
+      "LLERGEN_TYPE_CODE_NO_DECLARED_ALLERGENS\020" +
+      ".\022\032\n\026ALLERGEN_TYPE_CODE_OAT\020/\022\036\n\032ALLERGE" +
+      "N_TYPE_CODE_PEANUTS\0200\022\033\n\027ALLERGEN_TYPE_C" +
+      "ODE_PEAS\0201\022!\n\035ALLERGEN_TYPE_CODE_PECAN_N" +
+      "UTS\0202\022!\n\035ALLERGEN_TYPE_CODE_PISTACHIOS\0203" +
+      "\022!\n\035ALLERGEN_TYPE_CODE_POD_FRUITS\0204\022&\n\"A" +
+      "LLERGEN_TYPE_CODE_QUEENSLAND_NUTS\0205\022\032\n\026A" +
+      "LLERGEN_TYPE_CODE_RYE\0206\022#\n\037ALLERGEN_TYPE" +
+      "_CODE_SESAME_SEEDS\0207\022\037\n\033ALLERGEN_TYPE_CO" +
+      "DE_SOYBEANS\0208\022\034\n\030ALLERGEN_TYPE_CODE_SPEL" +
+      "T\0209\022&\n\"ALLERGEN_TYPE_CODE_SULPHUR_DIOXID" +
+      "E\020:\022 \n\034ALLERGEN_TYPE_CODE_TREE_NUTS\020;\022&\n" +
+      "\"ALLERGEN_TYPE_CODE_TREE_NUT_TRACES\020<\022\036\n" +
+      "\032ALLERGEN_TYPE_CODE_WALNUTS\020=\022\034\n\030ALLERGE" +
+      "N_TYPE_CODE_WHEAT\020>*\217\001\n\022NutritionValueUn" +
+      "it\022$\n NUTRITION_VALUE_UNIT_UNSPECIFIED\020\000" +
+      "\022\023\n\017ENERGY_CALORIES\020\001\022\025\n\021ENERGY_KILOJOUL" +
+      "ES\020\002\022\025\n\021WEIGHT_MILLIGRAMS\020\003\022\020\n\014WEIGHT_GR" +
+      "AMS\020\004*\270\001\n\024ContainmentLevelCode\022&\n\"CONTAI" +
+      "NMENT_LEVEL_CODE_UNSPECIFIED\020\000\022#\n\037CONTAI" +
+      "NMENT_LEVEL_CODE_CONTAINS\020\001\022+\n\'CONTAINME" +
+      "NT_LEVEL_CODE_DOES_NOT_CONTAIN\020\002\022&\n\"CONT" +
+      "AINMENT_LEVEL_CODE_MAY_CONTAIN\020\003*c\n\013Depo" +
+      "sitCode\022\034\n\030DEPOSIT_CODE_UNSPECIFIED\020\000\022\031\n" +
+      "\025DEPOSIT_CODE_REUSABLE\020\001\022\033\n\027DEPOSIT_CODE" +
+      "_RECYCLABLE\020\002b\006proto3"
+    };
+    descriptor = com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+          com.google.protobuf.TimestampProto.getDescriptor(),
+          com.google.type.LocalizedTextProto.getDescriptor(),
+          com.google.type.MoneyProto.getDescriptor(),
+        });
+    internal_static_food_menu_v1_FoodMenuFeed_descriptor =
+      getDescriptor().getMessageTypes().get(0);
+    internal_static_food_menu_v1_FoodMenuFeed_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_FoodMenuFeed_descriptor,
+        new java.lang.String[] { "Data", });
+    internal_static_food_menu_v1_MenuComponent_descriptor =
+      getDescriptor().getMessageTypes().get(1);
+    internal_static_food_menu_v1_MenuComponent_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_MenuComponent_descriptor,
+        new java.lang.String[] { "Menu", "Section", "Item", "Option", "Type", });
+    internal_static_food_menu_v1_Menu_descriptor =
+      getDescriptor().getMessageTypes().get(2);
+    internal_static_food_menu_v1_Menu_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_Menu_descriptor,
+        new java.lang.String[] { "MenuId", "MerchantIds", "DisplayName", "Language", "Disclaimer", "MenuItemIds", "MenuSectionIds", "LastMerchantUpdateTime", });
+    internal_static_food_menu_v1_MenuSection_descriptor =
+      getDescriptor().getMessageTypes().get(3);
+    internal_static_food_menu_v1_MenuSection_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_MenuSection_descriptor,
+        new java.lang.String[] { "MenuSectionId", "DisplayName", "Description", "Images", "MenuItemIds", "MenuSectionIds", });
+    internal_static_food_menu_v1_MenuItem_descriptor =
+      getDescriptor().getMessageTypes().get(4);
+    internal_static_food_menu_v1_MenuItem_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_MenuItem_descriptor,
+        new java.lang.String[] { "MenuItemId", "DisplayName", "Description", "Images", "OfferSet", "MenuItemOptionSet", "ItemAttributes", "Pricing", });
+    internal_static_food_menu_v1_MenuItem_MenuItemOptionSet_descriptor =
+      internal_static_food_menu_v1_MenuItem_descriptor.getNestedTypes().get(0);
+    internal_static_food_menu_v1_MenuItem_MenuItemOptionSet_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_MenuItem_MenuItemOptionSet_descriptor,
+        new java.lang.String[] { "MenuItemOptionIds", });
+    internal_static_food_menu_v1_MenuItemOption_descriptor =
+      getDescriptor().getMessageTypes().get(5);
+    internal_static_food_menu_v1_MenuItemOption_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_MenuItemOption_descriptor,
+        new java.lang.String[] { "MenuItemOptionId", "Value", "OfferSet", "ItemAttributes", });
+    internal_static_food_menu_v1_MenuItemAttributes_descriptor =
+      getDescriptor().getMessageTypes().get(6);
+    internal_static_food_menu_v1_MenuItemAttributes_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_MenuItemAttributes_descriptor,
+        new java.lang.String[] { "NumberOfServings", "NutritionInformation", "SuitableDiets", "Additive", "Allergen", "PackagingDepositInfo", "NumberOfServings", });
+    internal_static_food_menu_v1_OfferSet_descriptor =
+      getDescriptor().getMessageTypes().get(7);
+    internal_static_food_menu_v1_OfferSet_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_OfferSet_descriptor,
+        new java.lang.String[] { "Offers", });
+    internal_static_food_menu_v1_Offer_descriptor =
+      getDescriptor().getMessageTypes().get(8);
+    internal_static_food_menu_v1_Offer_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_Offer_descriptor,
+        new java.lang.String[] { "Price", });
+    internal_static_food_menu_v1_Disclaimer_descriptor =
+      getDescriptor().getMessageTypes().get(9);
+    internal_static_food_menu_v1_Disclaimer_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_Disclaimer_descriptor,
+        new java.lang.String[] { "Text", "Uri", });
+    internal_static_food_menu_v1_TextField_descriptor =
+      getDescriptor().getMessageTypes().get(10);
+    internal_static_food_menu_v1_TextField_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_TextField_descriptor,
+        new java.lang.String[] { "Text", });
+    internal_static_food_menu_v1_Image_descriptor =
+      getDescriptor().getMessageTypes().get(11);
+    internal_static_food_menu_v1_Image_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_Image_descriptor,
+        new java.lang.String[] { "Uri", });
+    internal_static_food_menu_v1_MenuItemOptionProperty_descriptor =
+      getDescriptor().getMessageTypes().get(12);
+    internal_static_food_menu_v1_MenuItemOptionProperty_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_MenuItemOptionProperty_descriptor,
+        new java.lang.String[] { "PropertyType", "PropertyVal", "TextVal", "Value", });
+    internal_static_food_menu_v1_NutritionInformation_descriptor =
+      getDescriptor().getMessageTypes().get(13);
+    internal_static_food_menu_v1_NutritionInformation_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_NutritionInformation_descriptor,
+        new java.lang.String[] { "Energy", "SodiumContent", "ServingSize", "Description", "ServingSize", });
+    internal_static_food_menu_v1_NutritionInformation_NutritionValue_descriptor =
+      internal_static_food_menu_v1_NutritionInformation_descriptor.getNestedTypes().get(0);
+    internal_static_food_menu_v1_NutritionInformation_NutritionValue_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_NutritionInformation_NutritionValue_descriptor,
+        new java.lang.String[] { "Amount", "Range", "Unit", "Value", });
+    internal_static_food_menu_v1_NutritionInformation_NutritionValue_Range_descriptor =
+      internal_static_food_menu_v1_NutritionInformation_NutritionValue_descriptor.getNestedTypes().get(0);
+    internal_static_food_menu_v1_NutritionInformation_NutritionValue_Range_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_NutritionInformation_NutritionValue_Range_descriptor,
+        new java.lang.String[] { "Min", "Max", });
+    internal_static_food_menu_v1_Additive_descriptor =
+      getDescriptor().getMessageTypes().get(14);
+    internal_static_food_menu_v1_Additive_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_Additive_descriptor,
+        new java.lang.String[] { "Name", "ContainmentLevelCode", "ContainmentLevelCode", });
+    internal_static_food_menu_v1_Allergen_descriptor =
+      getDescriptor().getMessageTypes().get(15);
+    internal_static_food_menu_v1_Allergen_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_Allergen_descriptor,
+        new java.lang.String[] { "AllergenTypeCode", "ContainmentLevelCode", "ContainmentLevelCode", });
+    internal_static_food_menu_v1_DepositInfo_descriptor =
+      getDescriptor().getMessageTypes().get(16);
+    internal_static_food_menu_v1_DepositInfo_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_food_menu_v1_DepositInfo_descriptor,
+        new java.lang.String[] { "DepositCode", "DepositValue", "DepositCode", });
+    com.google.protobuf.TimestampProto.getDescriptor();
+    com.google.type.LocalizedTextProto.getDescriptor();
+    com.google.type.MoneyProto.getDescriptor();
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/menu-feed/proto/food_menu.proto b/menu-feed/proto/food_menu.proto
new file mode 100644
index 0000000..62689d8
--- /dev/null
+++ b/menu-feed/proto/food_menu.proto
@@ -0,0 +1,531 @@
+
+  // Feeds declaration
+  syntax = "proto3";
+  
+  package food.menu.v1;
+
+  import "google/protobuf/timestamp.proto";
+  import "money.proto";
+  import "localized_text.proto";
+
+  option go_package = "food/menu/v1/proto";
+
+  
+  message FoodMenuFeed {
+  repeated MenuComponent data = 1;
+}
+  
+  message MenuComponent {
+  oneof type {
+    food.menu.v1.Menu menu = 1;
+    food.menu.v1.MenuSection section = 2;
+    food.menu.v1.MenuItem item = 3;
+    food.menu.v1.MenuItemOption option = 4;
+  }
+}
+  
+  // Top-level catalog of food items offered by a Food establishment. Menu
+// contains a list of merchant ids and the menu that apply to those merchants.
+// A Menu can be used to represent single merchant with the menu, or multiple
+// merchants (typically chain restaurants) with the menus.
+message Menu {
+  // An opaque string from a partner which uniquely identifies the Menu within
+  // the partner feed.
+  // Required.
+  string menu_id = 1;
+
+  // The merchants to whom the menu apply.
+  // Note: This field is repeated so chain restaurants can share the same menu
+  // across multiple locations, each of which is a separate merchant.
+  // Required.
+  repeated string merchant_ids = 2;
+
+  // The name that can identify the Menu when a user is browsing the menu.
+  // Optional.
+  TextField display_name = 3;
+
+  // The default language code associated with the text labels contained in the
+  // menu. Expects BCP-47 language code, such as "en-US" or "sr-Latn".
+  //
+  // For more information, see
+  // http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+  // Optional.
+  string language = 4;
+
+  // Disclaimer to be shown to the user for the menu. For example, nutritional
+  // information disclosure and allergen disclosure.
+  // Optional.
+  Disclaimer disclaimer = 5;
+
+  // IDs of items contained within this menu. Expects first-level menu items
+  // only.
+  // Optional.
+  repeated string menu_item_ids = 6;
+
+  // IDs of sections contained within this menu. Expects first-level menu
+  // sections only.
+  // Optional.
+  repeated string menu_section_ids = 7;
+
+  // Timestamp when this Menu or any of its contents was last updated by the
+  // restaurant; i.e. a date to be associated with the phrase “accurate as of
+  // date”.
+  // Optional.
+  google.protobuf.Timestamp last_merchant_update_time = 8;
+
+}
+  
+  // A menu section is a grouping of items on a menu. Separate MenuSections are
+// usually created for each logical grouping of items on a menu. For example,
+// meal course type (Appetizer, Main, Dessert) and food categories (Burgers,
+// Drinks) are typical sections.
+message MenuSection {
+  // An opaque string from an partner which uniquely identifies the MenuSection
+  // within the partner feed.
+  // Required.
+  string menu_section_id = 1;
+
+  // The name that can identify the MenuSection when a user is browsing the
+  // menu.
+  // Required.
+  TextField display_name = 2;
+
+  // A description of the menu section.
+  // Optional.
+  TextField description = 3;
+
+  // Image(s) of the menu section.
+  // Optional.
+  repeated Image images = 4;
+
+
+  // IDs of MenuItem entities that correspond to this MenuSection entity. A
+  // section is expected to have at least 1 item if it does not contain any
+  // sub-sections.
+  // Optional.
+  repeated string menu_item_ids = 6;
+
+  // Child MenuSections (sub-sections) that correspond to this MenuSection
+  // entity.
+  // Optional.
+  repeated string menu_section_ids = 7;
+
+
+
+
+
+
+}
+  
+  // Represents a single food or drink item offered by a Food establishment.
+message MenuItem {
+  // An opaque string from an partner which uniquely identifies the MenuItem
+  // within the partner feed.
+  // Required.
+  string menu_item_id = 1;
+
+  // The name that can identify the MenuItem when a user is browsing the menu.
+  // Required.
+  TextField display_name = 2;
+
+  // A description of the menu item.
+  // Optional.
+  TextField description = 3;
+
+  // Image(s) of the menu item.
+  // Optional.
+  repeated Image images = 4;
+
+  // Container that specifies a list of options available on an item.
+  message MenuItemOptionSet {
+    // IDs of menu item options that are applicable to this menu item.
+    // Required.
+    repeated string menu_item_option_ids = 1;
+  }
+
+  // The menu item must either have a price, or a set of menu item options.
+  // Required.
+  oneof pricing {
+    // Available offers to purchase this food item.
+    OfferSet offer_set = 6;
+
+    // Available options for this menu item.
+    MenuItemOptionSet menu_item_option_set = 7;
+  }
+
+  // Attributes about this menu item.
+  // Optional.
+  MenuItemAttributes item_attributes = 8;
+
+
+}
+  
+  // Describes choices that a user would be required to make when selecting a
+// dish / combo. The user must select an option, otherwise the order is
+// considered invalid (e.g. the user must choose small, medium, or large for a
+// pizza).
+message MenuItemOption {
+  // An opaque string from an partner which uniquely identifies the
+  // MenuItemOption within the partner feed.
+  // Required.
+  string menu_item_option_id = 9;
+
+  // Option property and value e.g. Size: Small.
+  // Required.
+  MenuItemOptionProperty value = 2;
+
+
+
+  // Available offers to purchase this menu item option.
+  // Required.
+  OfferSet offer_set = 4;
+
+  // Attributes about this menu item option.
+  // Optional.
+  MenuItemAttributes item_attributes = 5;
+
+
+}
+  
+  // Describes attributes about a particular menu item or option.
+message MenuItemAttributes {
+  // Number of servings available in a given menu item.
+  // Optional.
+  optional int32 number_of_servings = 1;
+
+  // Describes all the nutritional information of the item, e.g. calories, fat
+  // content.
+  // Optional.
+  NutritionInformation nutrition_information = 2;
+
+  // The dietary restrictions that this menu item complies with.
+  // Optional.
+  repeated DietaryRestriction suitable_diets = 3;
+
+  // Additives of this menu item.
+  // Optional.
+  repeated Additive additive = 4;
+
+  // Allergens of this menu item.
+  // Optional.
+  repeated Allergen allergen = 5;
+
+  // Packaging and recycling information of this menu item.
+  // Optional.
+  DepositInfo packaging_deposit_info = 6;
+}
+  
+  // Container for a list of offers available on a menu item / option.
+// Only one offer should be applicable/valid at one particular time.
+// For example, a drink can have 2 offers where one is applicable in the morning
+// while the other is applicable in the evening during happy hours.
+message OfferSet {
+  // List of possible offers.
+  // Required.
+  repeated Offer offers = 1;
+}
+
+  // Represents pricing and availability information for MenuItems and
+// MenuItemOptions.
+message Offer {
+  // Monetary value of the menu item/option on sale. Can be 0 to represent free.
+  // Required.
+  google.type.Money price = 1;
+
+
+
+
+
+
+}
+  
+  // Partner provided disclaimer shown to the user. Contains a text disclaimer
+// along with an optional URL for more information.
+// Some example include: associated medical risks/warnings, any additional
+// fees/gratutity, etc.
+message Disclaimer {
+  // Body of the disclaimer text to be shown to the user.
+  // Required.
+  TextField text = 1;
+
+  // URL containing more information about the disclaimer.
+  // Optional.
+  string uri = 2;
+}
+  
+  // A text payload that contains one or more localized values.
+message TextField {
+  // Per-locale text values.
+  //
+  // If there is only one desired locale support, then the language_code within
+  // each text is not required to be set and the language will be inferred from
+  // the default language of the menu.
+  //
+  // If there are multiple texts across different locales, then the
+  // language_code must be set for each text. The first text in the list is
+  // considered the preferred representation.
+  // Required.
+  repeated google.type.LocalizedText text = 1;
+}
+  
+  // Represents an image associated with a menu entity.
+message Image {
+  // URL containing the raw pixels of the image.
+  // Required.
+  string uri = 1;
+}
+
+  // Describes the property of a menu item option and its value.
+message MenuItemOptionProperty {
+  // Types of property that the option is for.
+  enum PropertyType {
+    // Do not use. The property type is not explicitly specified.
+    UNKNOWN_PROPERTY_TYPE = 0;
+    // A generic menu item option property, which is not one of the more
+    // specific types below. Use this if the property is not of type
+    // SIZE or PIZZA_SIDE.
+    OPTION = 1;
+    // Denotes the menu item option property of size (e.g. small, medium, or
+    // large).
+    SIZE = 2;
+    // Property specific to pizzas. For example: this MenuItemOption is only
+    // valid for a portion/whole pizza, such as mushroom toppings on the left
+    // side, right side, or whole pizza).
+    PIZZA_SIDE = 3;
+  }
+
+  // Well-defined values for the option property.
+  enum PropertyValue {
+    // Do not use. The property value is not explicitly specified.
+    UNKNOWN_PROPERTY_VALUE = 0;
+    // The MenuItemOption applies only to the left side of a pizza.
+    PIZZA_SIDE_LEFT = 1;
+    // The MenuItemOption applies only to the right side of a pizza.
+    PIZZA_SIDE_RIGHT = 2;
+    // The MenuItemOption applies to the entire pizza.
+    PIZZA_SIDE_WHOLE = 3;
+  }
+
+  // The type of this option property.
+  // Required.
+  PropertyType property_type = 1;
+
+  // Required.
+  oneof value {
+    // A well-defined value for the option property. Currently only expected
+    // if the property_type is PIZZA_SIDE.
+    PropertyValue property_val = 2;
+
+    // A free-form text for the value of the property. Expected for
+    // property_type OPTION and SIZE.
+    TextField text_val = 3;
+  }
+}
+  
+  // Describes all the nutritional measurements of a MenuItem or add-on.
+message NutritionInformation {
+  // Describes a single nutritional measurement of the serving of food.
+  message NutritionValue {
+    // Describes a closed range for the nutrition value. E.g. "100-150 cal"
+    message Range {
+      // The minimum amount of nutrition value.
+      // Required.
+      double min = 1;
+
+      // The maximum amount of nutrition value.
+      // Required.
+      double max = 2;
+    }
+
+    // Required oneof.
+    oneof value {
+      // A single number representing the amount of nutritional value.
+      double amount = 1;
+
+      // A range representing the amount of nutritional value.
+      Range range = 3;
+    }
+
+    // The unit associated with the amount as specified from the partner. We
+    // will validate the feed so that the unit for each type of nutrition value
+    // is expected for that type of value. For example, only ENERGY_CALORIES
+    // and ENERGY_KILOJOULES are expected on energy property of
+    // NutritionalInformation.
+    // Required.
+    NutritionValueUnit unit = 2;
+  }
+
+  // The amount of nutritional energy of the serving of food. Can be defined
+  // in Calories or kilojoules.
+  // Optional.
+  NutritionValue energy = 1;
+
+  // The amount of sodium content, measured in grams or milligrams.
+  // Optional.
+  NutritionValue sodium_content = 2;
+
+  // The number of servings the nutrition value applies to.
+  // Optional.
+  optional int32 serving_size = 3;
+
+  // Nutrition information in free text. For example "Contains preservatives".
+  // Optional.
+  TextField description = 4;
+}
+  
+  // Indicates a dietary restriction or guideline adhered to during
+// food preparation.
+enum DietaryRestriction {
+  // Do not use. The dietary restriction is not explicitly specified.
+  DIET_UNSPECIFIED = 0;
+  DIET_DIABETIC = 1;
+  DIET_GLUTEN_FREE = 2;
+  DIET_HALAL = 3;
+  DIET_HINDU = 4;
+  DIET_KOSHER = 5;
+  DIET_LOW_CALORIE = 6;
+  DIET_LOW_FAT = 7;
+  DIET_LOW_LACTOSE = 8;
+  DIET_LOW_SALT = 9;
+  DIET_VEGAN = 10;
+  DIET_VEGETARIAN = 11;
+}
+
+  // Additive shown to the user on the MenuItem. An additive preserves or enhances
+// the quality of the food.
+message Additive {
+  // Descriptive text of the additive, e.g. "preservatives".
+  // Required.
+  TextField name = 1;
+
+  // Whether the MenuItem contains, may contain, or is free from this additive.
+  // Defaults to contains.
+  // Optional.
+  optional ContainmentLevelCode containment_level_code = 2;
+}
+  
+  // Allergen shown to the user on the MenuItem. An allergen relates to qualities
+// of food that causes allergic reactions.
+message Allergen {
+  // Type of allergen.
+  // Required.
+  AllergenTypeCode allergen_type_code = 1;
+
+  // Whether the MenuItem contains, may contain, or is free from this allergen.
+  // Defaults to contains.
+  // Optional.
+  optional ContainmentLevelCode containment_level_code = 2;
+}
+
+  // Allergen type derived from GS1: http://gs1.org/voc/AllergenTypeCode
+enum AllergenTypeCode {
+  // Do not use. The allergen type code is not explicitly specified.
+  ALLERGEN_TYPE_CODE_UNSPECIFIED = 0;
+  ALLERGEN_TYPE_CODE_ALMONDS = 1;
+  ALLERGEN_TYPE_CODE_ALPHA_ISOMETHYL_IONONE = 2;
+  ALLERGEN_TYPE_CODE_ALCOHOL = 3;
+  ALLERGEN_TYPE_CODE_AMYL_CINNAMAL = 4;
+  ALLERGEN_TYPE_CODE_ANISE_ALCOHOL = 5;
+  ALLERGEN_TYPE_CODE_BARLEY = 6;
+  ALLERGEN_TYPE_CODE_BENZYL_ALCOHOL = 7;
+  ALLERGEN_TYPE_CODE_BENZYL_BENZOATE = 8;
+  ALLERGEN_TYPE_CODE_BENZYL_CINNAMATE = 9;
+  ALLERGEN_TYPE_CODE_BENZYL_SALICYLATE = 10;
+  ALLERGEN_TYPE_CODE_BRAZIL_NUTS = 11;
+  ALLERGEN_TYPE_CODE_BUTYLPHENYL_METHYLPROPIONATE = 12;
+  ALLERGEN_TYPE_CODE_CARROTS = 13;
+  ALLERGEN_TYPE_CODE_CASHEW_NUTS = 14;
+  ALLERGEN_TYPE_CODE_CELERY = 15;
+  ALLERGEN_TYPE_CODE_CEREALS_CONTAINING_GLUTEN = 16;
+  ALLERGEN_TYPE_CODE_CINNAMAL = 17;
+  ALLERGEN_TYPE_CODE_CINNAMYL_ALCOHOL = 18;
+  ALLERGEN_TYPE_CODE_CITRAL = 19;
+  ALLERGEN_TYPE_CODE_CITRONELLOL = 20;
+  ALLERGEN_TYPE_CODE_COCOA = 21;
+  ALLERGEN_TYPE_CODE_CORIANDER = 22;
+  ALLERGEN_TYPE_CODE_CORN = 23;
+  ALLERGEN_TYPE_CODE_COUMARIN = 24;
+  ALLERGEN_TYPE_CODE_CRUSTACEANS = 25;
+  ALLERGEN_TYPE_CODE_EGGS = 26;
+  ALLERGEN_TYPE_CODE_EUGENOL = 27;
+  ALLERGEN_TYPE_CODE_EVERNIA_FURFURACEA = 28;
+  ALLERGEN_TYPE_CODE_EVERNIA_PRUNASTRI = 29;
+  ALLERGEN_TYPE_CODE_FARNESOL = 30;
+  ALLERGEN_TYPE_CODE_FISH = 31;
+  ALLERGEN_TYPE_CODE_GERANIOL = 32;
+  ALLERGEN_TYPE_CODE_GLUTEN = 33;
+  ALLERGEN_TYPE_CODE_HAZELNUTS = 34;
+  ALLERGEN_TYPE_CODE_HEXYL_CINNAMAL = 35;
+  ALLERGEN_TYPE_CODE_HYDROXYCITRONELLAL = 36;
+  ALLERGEN_TYPE_CODE_HYDROXYISOHEXYL_3_CYCLOHEXENE_CARBOXALDEHYDE_ISOEUGENOL_LIMONENE_LINAL =
+      37;
+  ALLERGEN_TYPE_CODE_KAMUT = 38;
+  ALLERGEN_TYPE_CODE_LACTOSE = 39;
+  ALLERGEN_TYPE_CODE_LUPINE = 40;
+  ALLERGEN_TYPE_CODE_MACADAMIA_NUTS = 41;
+  ALLERGEN_TYPE_CODE_METHYL_2_OCTYNOATE = 42;
+  ALLERGEN_TYPE_CODE_MILK = 43;
+  ALLERGEN_TYPE_CODE_MOLLUSCS = 44;
+  ALLERGEN_TYPE_CODE_MUSTARD = 45;
+  ALLERGEN_TYPE_CODE_NO_DECLARED_ALLERGENS = 46;
+  ALLERGEN_TYPE_CODE_OAT = 47;
+  ALLERGEN_TYPE_CODE_PEANUTS = 48;
+  ALLERGEN_TYPE_CODE_PEAS = 49;
+  ALLERGEN_TYPE_CODE_PECAN_NUTS = 50;
+  ALLERGEN_TYPE_CODE_PISTACHIOS = 51;
+  ALLERGEN_TYPE_CODE_POD_FRUITS = 52;
+  ALLERGEN_TYPE_CODE_QUEENSLAND_NUTS = 53;
+  ALLERGEN_TYPE_CODE_RYE = 54;
+  ALLERGEN_TYPE_CODE_SESAME_SEEDS = 55;
+  ALLERGEN_TYPE_CODE_SOYBEANS = 56;
+  ALLERGEN_TYPE_CODE_SPELT = 57;
+  ALLERGEN_TYPE_CODE_SULPHUR_DIOXIDE = 58;
+  ALLERGEN_TYPE_CODE_TREE_NUTS = 59;
+  ALLERGEN_TYPE_CODE_TREE_NUT_TRACES = 60;
+  ALLERGEN_TYPE_CODE_WALNUTS = 61;
+  ALLERGEN_TYPE_CODE_WHEAT = 62;
+}
+
+  // Partner provided deposit info to instruct the user how to deposit a food item
+// or bottle and the value of such deposit.
+message DepositInfo {
+  // The deposit strategy to employ, e.g. "reusable".
+  // Optional.
+  optional DepositCode deposit_code = 1;
+
+  // Value refunded for depositing the item properly.
+  // Optional.
+  google.type.Money deposit_value = 2;
+}
+
+  enum NutritionValueUnit {
+  // Do not use. The nutrition value unit is not explicitly set.
+  NUTRITION_VALUE_UNIT_UNSPECIFIED = 0;
+
+  // Units used to express the amount of energy in a menu item.
+  ENERGY_CALORIES = 1;
+  ENERGY_KILOJOULES = 2;
+
+  // Units used to express the amount in weight a substance is present in the
+  // menu item.
+  WEIGHT_MILLIGRAMS = 3;
+  WEIGHT_GRAMS = 4;
+}
+
+  // Indicates the level of containment a food item has of a certain attribute,
+// such as allergens or additives.
+enum ContainmentLevelCode {
+  // Do not use. The containment level code is not explicitly specified.
+  CONTAINMENT_LEVEL_CODE_UNSPECIFIED = 0;
+  CONTAINMENT_LEVEL_CODE_CONTAINS = 1;
+  CONTAINMENT_LEVEL_CODE_DOES_NOT_CONTAIN = 2;
+  CONTAINMENT_LEVEL_CODE_MAY_CONTAIN = 3;
+}
+
+  // Indicates how to properly deposit a food item or bottle.
+enum DepositCode {
+  // Do not use. The deposite code is not explicitly specified.
+  DEPOSIT_CODE_UNSPECIFIED = 0;
+  DEPOSIT_CODE_REUSABLE = 1;
+  DEPOSIT_CODE_RECYCLABLE = 2;
+}
diff --git a/menu-feed/proto/localized_text.proto b/menu-feed/proto/localized_text.proto
new file mode 100644
index 0000000..df7ebf2
--- /dev/null
+++ b/menu-feed/proto/localized_text.proto
@@ -0,0 +1,37 @@
+  // Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.type;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/type/localized_text;localized_text";
+option java_multiple_files = true;
+option java_outer_classname = "LocalizedTextProto";
+option java_package = "com.google.type";
+option objc_class_prefix = "GTP";
+
+// Localized variant of a text in a particular language.
+message LocalizedText {
+  // Localized string in the language corresponding to `language_code' below.
+  string text = 1;
+
+  // The text's BCP-47 language code, such as "en-US" or "sr-Latn".
+  //
+  // For more information, see
+  // http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
+  string language_code = 2;
+}
+
diff --git a/menu-feed/proto/money.proto b/menu-feed/proto/money.proto
new file mode 100644
index 0000000..dbd61d6
--- /dev/null
+++ b/menu-feed/proto/money.proto
@@ -0,0 +1,43 @@
+  // Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.type;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/type/money;money";
+option java_multiple_files = true;
+option java_outer_classname = "MoneyProto";
+option java_package = "com.google.type";
+option objc_class_prefix = "GTP";
+
+// Represents an amount of money with its currency type.
+message Money {
+  // The three-letter currency code defined in ISO 4217.
+  string currency_code = 1;
+
+  // The whole units of the amount.
+  // For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
+  int64 units = 2;
+
+  // Number of nano (10^-9) units of the amount.
+  // The value must be between -999,999,999 and +999,999,999 inclusive.
+  // If `units` is positive, `nanos` must be positive or zero.
+  // If `units` is zero, `nanos` can be positive, zero, or negative.
+  // If `units` is negative, `nanos` must be negative or zero.
+  // For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
+  int32 nanos = 3;
+}
+
diff --git a/menu-feed/python/feed.py b/menu-feed/python/feed.py
new file mode 100644
index 0000000..33c5435
--- /dev/null
+++ b/menu-feed/python/feed.py
@@ -0,0 +1,68 @@
+"""Menu feed example used in
+
+https://developers.google.com/maps-booking/verticals/dining/guides/tutorials/tutorial-menu-feed-protos#python.
+"""
+import json
+from generated import food_menu_pb2
+from google.protobuf.json_format import MessageToDict
+
+# create feed
+feed = food_menu_pb2.FoodMenuFeed()
+
+# add a menu component to feed data
+menuComponent = feed.data.add()
+menuComponent.menu.menu_id = 'menu1'
+menuComponent.menu.merchant_ids.append('dining-1')
+menuDisplayName = menuComponent.menu.display_name.text.add()
+menuDisplayName.text = 'Menu'
+menuDisplayName.language_code = 'en-us'
+menuComponent.menu.language = 'en-us'
+menuComponent.menu.last_merchant_update_time.seconds = 1633621547
+
+for i in ['appetizers', 'dinner']:
+  menuComponent.menu.menu_section_ids.append(i)
+
+# add a menu section component to feed data
+sectionComponent = feed.data.add()
+sectionComponent.section.menu_section_id = 'appetizers'
+sectionDisplayName = sectionComponent.section.display_name.text.add()
+sectionDisplayName.text = 'Lunch Appetizers'
+sectionDisplayName.language_code = 'en-us'
+sectionComponent.section.menu_item_ids.append('breadsticks-sauce')
+
+# add a menu item component to feed data
+itemComponent = feed.data.add()
+itemComponent.item.menu_item_id = 'breadsticks-sauce'
+itemDisplayName = itemComponent.item.display_name.text.add()
+itemDisplayName.text = 'Breadsticks & Sauce'
+itemDisplayName.language_code = 'en-us'
+itemDescription = itemComponent.item.description.text.add()
+itemDescription.text = 'Breakfast basket w/ side of tomato sauce (size 6 or 12)'
+itemDescription.language_code = 'en-us'
+
+for i in ['breadstick-sm', 'breadstick-lg']:
+  itemComponent.item.menu_item_option_set.menu_item_option_ids.append(i)
+
+for i in [
+    'http://www.example.com/photos/breadsticks.jpg',
+    'http://www.example.com/photos/sauce.jpg',
+]:
+  itemImage = itemComponent.item.images.add()
+  itemImage.uri = i
+
+# add a menu item option component to feed data
+optionComponent = feed.data.add()
+optionComponent.option.menu_item_option_id: 'breadstick-sm'
+optionComponent.option.value.property_type = (
+    food_menu_pb2.MenuItemOptionProperty.PropertyType.SIZE
+)
+optionTextValue = optionComponent.option.value.text_val.text.add()
+optionTextValue.text = 'Small'
+optionTextValue.language_code = 'en-us'
+optionOffer = optionComponent.option.offer_set.offers.add()
+optionOffer.price.currency_code = 'USD'
+optionOffer.price.units = 8
+optionOffer.price.nanos = 0
+
+feedJSON = json.dumps(MessageToDict(feed, preserving_proto_field_name=True))
+print(feedJSON)
diff --git a/menu-feed/typescript/dist/feed.js b/menu-feed/typescript/dist/feed.js
new file mode 100644
index 0000000..7b199a6
--- /dev/null
+++ b/menu-feed/typescript/dist/feed.js
@@ -0,0 +1,56 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const food_menu_1 = require("./generated/food_menu");
+const menu = {
+    menu_id: 'menu1',
+    merchant_ids: ['dining-1'],
+    display_name: { text: [{ text: 'Menu', language_code: 'en-us' }] },
+    language: 'en-us',
+    menu_section_ids: ['appetizers', 'dinner'],
+    last_merchant_update_time: new Date()
+};
+const section = {
+    menu_section_id: 'appetizers',
+    display_name: { text: [{ text: 'Lunch Appetizers', language_code: 'en-us' }] },
+    menu_section_ids: ['breadsticks-sauce']
+};
+const item = {
+    menu_item_id: 'breadsticks-sauce',
+    display_name: { text: [{ text: 'Breadsticks & Sauce', language_code: 'en-us' }] },
+    description: {
+        text: [{
+                text: 'Breakfast basket w/ side of tomato sauce (size 6 or 12)',
+                language_code: 'en-us'
+            }]
+    },
+    menu_item_option_set: { menu_item_option_ids: ['breadstick-sm', 'breadstick-lg'] },
+    images: [
+        { uri: 'http://www.example.com/photos/breadsticks.jpg' },
+        { uri: 'http://www.example.com/photos/sauce.jpg' }
+    ]
+};
+const option = {
+    menu_item_option_id: 'breadstick-sm',
+    value: {
+        property_type: food_menu_1.MenuItemOptionProperty_PropertyType.SIZE,
+        text_val: {
+            text: [
+                { text: "Small", language_code: "en-us" }
+            ]
+        }
+    },
+    offer_set: {
+        offers: [{
+                price: {
+                    currency_code: "USD",
+                    units: 8,
+                    nanos: 0
+                }
+            }]
+    }
+};
+const feed = {
+    data: [{ menu }, { section }, { item }, { option }]
+};
+console.log(JSON.stringify(feed));
+//# sourceMappingURL=feed.js.map
\ No newline at end of file
diff --git a/menu-feed/typescript/dist/feed.js.map b/menu-feed/typescript/dist/feed.js.map
new file mode 100644
index 0000000..eb55789
--- /dev/null
+++ b/menu-feed/typescript/dist/feed.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"feed.js","sourceRoot":"","sources":["../src/feed.ts"],"names":[],"mappings":";;AAAA,qDAAqI;AAErI,MAAM,IAAI,GAAS;IACjB,OAAO,EAAE,OAAO;IAChB,YAAY,EAAE,CAAC,UAAU,CAAC;IAC1B,YAAY,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAC,CAAC,EAAC;IAC9D,QAAQ,EAAE,OAAO;IACjB,gBAAgB,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC;IAC1C,yBAAyB,EAAE,IAAI,IAAI,EAAE;CACtC,CAAC;AAEF,MAAM,OAAO,GAAgB;IAC3B,eAAe,EAAE,YAAY;IAC7B,YAAY,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC,IAAI,EAAE,kBAAkB,EAAE,aAAa,EAAE,OAAO,EAAC,CAAC,EAAC;IAC1E,gBAAgB,EAAE,CAAC,mBAAmB,CAAC;CACxC,CAAC;AAEF,MAAM,IAAI,GAAa;IACrB,YAAY,EAAE,mBAAmB;IACjC,YAAY,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC,IAAI,EAAE,qBAAqB,EAAE,aAAa,EAAE,OAAO,EAAC,CAAC,EAAC;IAC7E,WAAW,EAAE;QACX,IAAI,EAAE,CAAC;gBACL,IAAI,EAAE,yDAAyD;gBAC/D,aAAa,EAAE,OAAO;aACvB,CAAC;KACH;IACD,oBAAoB,EAChB,EAAC,oBAAoB,EAAE,CAAC,eAAe,EAAE,eAAe,CAAC,EAAC;IAC9D,MAAM,EAAE;QACN,EAAC,GAAG,EAAE,+CAA+C,EAAC;QACtD,EAAC,GAAG,EAAE,yCAAyC,EAAC;KACjD;CACF,CAAC;AAEF,MAAM,MAAM,GAAmB;IAC7B,mBAAmB,EAAE,eAAe;IACpC,KAAK,EAAE;QACL,aAAa,EAAE,+CAAmC,CAAC,IAAI;QACvD,QAAQ,EAAE;YACR,IAAI,EAAE;gBACJ,EAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAC;aACxC;SACD;KACH;IACD,SAAS,EAAE;QACT,MAAM,EAAE,CAAC;gBACP,KAAK,EAAE;oBACL,aAAa,EAAE,KAAK;oBACpB,KAAK,EAAE,CAAC;oBACR,KAAK,EAAE,CAAC;iBACT;aACF,CAAC;KACH;CACF,CAAC;AAEF,MAAM,IAAI,GAAiB;IACzB,IAAI,EAAE,CAAC,EAAC,IAAI,EAAC,EAAE,EAAC,OAAO,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,MAAM,EAAC,CAAC;CAC5C,CAAC;AAEF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC"}
\ No newline at end of file
diff --git a/menu-feed/typescript/package-lock.json b/menu-feed/typescript/package-lock.json
new file mode 100644
index 0000000..2f6ba0d
--- /dev/null
+++ b/menu-feed/typescript/package-lock.json
@@ -0,0 +1,380 @@
+{
+  "name": "typescript",
+  "version": "1.0.0",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "typescript",
+      "version": "1.0.0",
+      "license": "ISC",
+      "dependencies": {
+        "google-protobuf": "^3.21.2",
+        "ts-proto": "^1.143.0"
+      },
+      "devDependencies": {
+        "typescript": "^4.9.5"
+      }
+    },
+    "node_modules/@protobufjs/aspromise": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+      "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
+    },
+    "node_modules/@protobufjs/base64": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+      "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
+    },
+    "node_modules/@protobufjs/codegen": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+      "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
+    },
+    "node_modules/@protobufjs/eventemitter": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+      "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
+    },
+    "node_modules/@protobufjs/fetch": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+      "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+      "dependencies": {
+        "@protobufjs/aspromise": "^1.1.1",
+        "@protobufjs/inquire": "^1.1.0"
+      }
+    },
+    "node_modules/@protobufjs/float": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+      "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
+    },
+    "node_modules/@protobufjs/inquire": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+      "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
+    },
+    "node_modules/@protobufjs/path": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+      "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
+    },
+    "node_modules/@protobufjs/pool": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+      "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
+    },
+    "node_modules/@protobufjs/utf8": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+      "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
+    },
+    "node_modules/@types/long": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
+      "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
+    },
+    "node_modules/@types/node": {
+      "version": "18.15.7",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.7.tgz",
+      "integrity": "sha512-LFmUbFunqmBn26wJZgZPYZPrDR1RwGOu2v79Mgcka1ndO6V0/cwjivPTc4yoK6n9kmw4/ls1r8cLrvh2iMibFA=="
+    },
+    "node_modules/@types/object-hash": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz",
+      "integrity": "sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA=="
+    },
+    "node_modules/case-anything": {
+      "version": "2.1.10",
+      "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.10.tgz",
+      "integrity": "sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ==",
+      "engines": {
+        "node": ">=12.13"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
+    "node_modules/dataloader": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz",
+      "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw=="
+    },
+    "node_modules/detect-libc": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+      "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+      "bin": {
+        "detect-libc": "bin/detect-libc.js"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/dprint-node": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.7.tgz",
+      "integrity": "sha512-NTZOW9A7ipb0n7z7nC3wftvsbceircwVHSgzobJsEQa+7RnOMbhrfX5IflA6CtC4GA63DSAiHYXa4JKEy9F7cA==",
+      "dependencies": {
+        "detect-libc": "^1.0.3"
+      }
+    },
+    "node_modules/google-protobuf": {
+      "version": "3.21.2",
+      "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz",
+      "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA=="
+    },
+    "node_modules/long": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+      "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+    },
+    "node_modules/object-hash": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz",
+      "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==",
+      "engines": {
+        "node": ">= 0.10.0"
+      }
+    },
+    "node_modules/protobufjs": {
+      "version": "6.11.3",
+      "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz",
+      "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "@protobufjs/aspromise": "^1.1.2",
+        "@protobufjs/base64": "^1.1.2",
+        "@protobufjs/codegen": "^2.0.4",
+        "@protobufjs/eventemitter": "^1.1.0",
+        "@protobufjs/fetch": "^1.1.0",
+        "@protobufjs/float": "^1.0.2",
+        "@protobufjs/inquire": "^1.1.0",
+        "@protobufjs/path": "^1.1.2",
+        "@protobufjs/pool": "^1.1.0",
+        "@protobufjs/utf8": "^1.1.0",
+        "@types/long": "^4.0.1",
+        "@types/node": ">=13.7.0",
+        "long": "^4.0.0"
+      },
+      "bin": {
+        "pbjs": "bin/pbjs",
+        "pbts": "bin/pbts"
+      }
+    },
+    "node_modules/ts-poet": {
+      "version": "6.4.1",
+      "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.4.1.tgz",
+      "integrity": "sha512-AjZEs4h2w4sDfwpHMxQKHrTlNh2wRbM5NRXmLz0RiH+yPGtSQFbe9hBpNocU8vqVNgfh0BIOiXR80xDz3kKxUQ==",
+      "dependencies": {
+        "dprint-node": "^1.0.7"
+      }
+    },
+    "node_modules/ts-proto": {
+      "version": "1.143.0",
+      "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.143.0.tgz",
+      "integrity": "sha512-a6pxp7y/R6PlaB+4adDVVTTZPHfNt4QLlm4wU8zBn5yXHbofBOIKLJ5bymwl0nizOAnuSMqt0GllOSAUnzkvYw==",
+      "dependencies": {
+        "@types/object-hash": "^1.3.0",
+        "case-anything": "^2.1.10",
+        "dataloader": "^1.4.0",
+        "object-hash": "^1.3.1",
+        "protobufjs": "^6.11.3",
+        "ts-poet": "^6.4.1",
+        "ts-proto-descriptors": "1.7.1"
+      },
+      "bin": {
+        "protoc-gen-ts_proto": "protoc-gen-ts_proto"
+      }
+    },
+    "node_modules/ts-proto-descriptors": {
+      "version": "1.7.1",
+      "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.7.1.tgz",
+      "integrity": "sha512-oIKUh3K4Xts4v29USGLfUG+2mEk32MsqpgZAOUyUlkrcIdv34yE+k2oZ2Nzngm6cV/JgFdOxRCqeyvmWHuYAyw==",
+      "dependencies": {
+        "long": "^4.0.0",
+        "protobufjs": "^6.8.8"
+      }
+    },
+    "node_modules/typescript": {
+      "version": "4.9.5",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+      "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+      "dev": true,
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=4.2.0"
+      }
+    }
+  },
+  "dependencies": {
+    "@protobufjs/aspromise": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+      "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
+    },
+    "@protobufjs/base64": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+      "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
+    },
+    "@protobufjs/codegen": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+      "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
+    },
+    "@protobufjs/eventemitter": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+      "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
+    },
+    "@protobufjs/fetch": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+      "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+      "requires": {
+        "@protobufjs/aspromise": "^1.1.1",
+        "@protobufjs/inquire": "^1.1.0"
+      }
+    },
+    "@protobufjs/float": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+      "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
+    },
+    "@protobufjs/inquire": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+      "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
+    },
+    "@protobufjs/path": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+      "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
+    },
+    "@protobufjs/pool": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+      "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
+    },
+    "@protobufjs/utf8": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+      "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
+    },
+    "@types/long": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
+      "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
+    },
+    "@types/node": {
+      "version": "18.15.7",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.7.tgz",
+      "integrity": "sha512-LFmUbFunqmBn26wJZgZPYZPrDR1RwGOu2v79Mgcka1ndO6V0/cwjivPTc4yoK6n9kmw4/ls1r8cLrvh2iMibFA=="
+    },
+    "@types/object-hash": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz",
+      "integrity": "sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA=="
+    },
+    "case-anything": {
+      "version": "2.1.10",
+      "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.10.tgz",
+      "integrity": "sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ=="
+    },
+    "dataloader": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz",
+      "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw=="
+    },
+    "detect-libc": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+      "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="
+    },
+    "dprint-node": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.7.tgz",
+      "integrity": "sha512-NTZOW9A7ipb0n7z7nC3wftvsbceircwVHSgzobJsEQa+7RnOMbhrfX5IflA6CtC4GA63DSAiHYXa4JKEy9F7cA==",
+      "requires": {
+        "detect-libc": "^1.0.3"
+      }
+    },
+    "google-protobuf": {
+      "version": "3.21.2",
+      "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz",
+      "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA=="
+    },
+    "long": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+      "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+    },
+    "object-hash": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz",
+      "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA=="
+    },
+    "protobufjs": {
+      "version": "6.11.3",
+      "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz",
+      "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==",
+      "requires": {
+        "@protobufjs/aspromise": "^1.1.2",
+        "@protobufjs/base64": "^1.1.2",
+        "@protobufjs/codegen": "^2.0.4",
+        "@protobufjs/eventemitter": "^1.1.0",
+        "@protobufjs/fetch": "^1.1.0",
+        "@protobufjs/float": "^1.0.2",
+        "@protobufjs/inquire": "^1.1.0",
+        "@protobufjs/path": "^1.1.2",
+        "@protobufjs/pool": "^1.1.0",
+        "@protobufjs/utf8": "^1.1.0",
+        "@types/long": "^4.0.1",
+        "@types/node": ">=13.7.0",
+        "long": "^4.0.0"
+      }
+    },
+    "ts-poet": {
+      "version": "6.4.1",
+      "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.4.1.tgz",
+      "integrity": "sha512-AjZEs4h2w4sDfwpHMxQKHrTlNh2wRbM5NRXmLz0RiH+yPGtSQFbe9hBpNocU8vqVNgfh0BIOiXR80xDz3kKxUQ==",
+      "requires": {
+        "dprint-node": "^1.0.7"
+      }
+    },
+    "ts-proto": {
+      "version": "1.143.0",
+      "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.143.0.tgz",
+      "integrity": "sha512-a6pxp7y/R6PlaB+4adDVVTTZPHfNt4QLlm4wU8zBn5yXHbofBOIKLJ5bymwl0nizOAnuSMqt0GllOSAUnzkvYw==",
+      "requires": {
+        "@types/object-hash": "^1.3.0",
+        "case-anything": "^2.1.10",
+        "dataloader": "^1.4.0",
+        "object-hash": "^1.3.1",
+        "protobufjs": "^6.11.3",
+        "ts-poet": "^6.4.1",
+        "ts-proto-descriptors": "1.7.1"
+      }
+    },
+    "ts-proto-descriptors": {
+      "version": "1.7.1",
+      "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.7.1.tgz",
+      "integrity": "sha512-oIKUh3K4Xts4v29USGLfUG+2mEk32MsqpgZAOUyUlkrcIdv34yE+k2oZ2Nzngm6cV/JgFdOxRCqeyvmWHuYAyw==",
+      "requires": {
+        "long": "^4.0.0",
+        "protobufjs": "^6.8.8"
+      }
+    },
+    "typescript": {
+      "version": "4.9.5",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+      "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+      "dev": true
+    }
+  }
+}
diff --git a/menu-feed/typescript/package.json b/menu-feed/typescript/package.json
new file mode 100644
index 0000000..c43360d
--- /dev/null
+++ b/menu-feed/typescript/package.json
@@ -0,0 +1,19 @@
+{
+  "name": "typescript",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "build": "tsc --build",
+    "clean": "tsc --build --clean"
+  },
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "google-protobuf": "^3.21.2",
+    "ts-proto": "^1.143.0"
+  },
+  "devDependencies": {
+    "typescript": "^4.9.5"
+  }
+}
diff --git a/menu-feed/typescript/src/feed.ts b/menu-feed/typescript/src/feed.ts
new file mode 100644
index 0000000..8e91388
--- /dev/null
+++ b/menu-feed/typescript/src/feed.ts
@@ -0,0 +1,60 @@
+import {FoodMenuFeed, Menu, MenuItem, MenuSection, MenuItemOption, MenuItemOptionProperty_PropertyType} from './generated/food_menu';
+
+const menu: Menu = {
+  menu_id: 'menu1',
+  merchant_ids: ['dining-1'],
+  display_name: {text: [{text: 'Menu', language_code: 'en-us'}]},
+  language: 'en-us',
+  menu_section_ids: ['appetizers', 'dinner'],
+  last_merchant_update_time: new Date()
+};
+
+const section: MenuSection = {
+  menu_section_id: 'appetizers',
+  display_name: {text: [{text: 'Lunch Appetizers', language_code: 'en-us'}]},
+  menu_section_ids: ['breadsticks-sauce']
+};
+
+const item: MenuItem = {
+  menu_item_id: 'breadsticks-sauce',
+  display_name: {text: [{text: 'Breadsticks & Sauce', language_code: 'en-us'}]},
+  description: {
+    text: [{
+      text: 'Breakfast basket w/ side of tomato sauce (size 6 or 12)',
+      language_code: 'en-us'
+    }]
+  },
+  menu_item_option_set:
+      {menu_item_option_ids: ['breadstick-sm', 'breadstick-lg']},
+  images: [
+    {uri: 'http://www.example.com/photos/breadsticks.jpg'},
+    {uri: 'http://www.example.com/photos/sauce.jpg'}
+  ]
+};
+
+const option: MenuItemOption = {
+  menu_item_option_id: 'breadstick-sm',
+  value: {
+    property_type: MenuItemOptionProperty_PropertyType.SIZE,
+    text_val: {
+      text: [
+        {text: "Small", language_code: "en-us"}
+      ]
+     }
+  },
+  offer_set: {
+    offers: [{
+      price: {
+        currency_code: "USD",
+        units: 8,
+        nanos: 0
+      }
+    }]
+  }
+};
+
+const feed: FoodMenuFeed = {
+  data: [{menu}, {section}, {item}, {option}]
+};
+
+console.log(JSON.stringify(feed));
diff --git a/menu-feed/typescript/tsconfig.json b/menu-feed/typescript/tsconfig.json
new file mode 100644
index 0000000..b9cbb66
--- /dev/null
+++ b/menu-feed/typescript/tsconfig.json
@@ -0,0 +1,15 @@
+{
+  "include": ["src/**/*"],
+  "compilerOptions": {
+    "outDir": "dist",
+    "rootDir": "src",
+    "allowJs": true,
+    "target": "ES2020",
+    "module": "commonjs",
+    "declaration": false,
+    "sourceMap": true,
+    "strict": true,
+    "esModuleInterop": true,
+    "forceConsistentCasingInFileNames": true
+  }
+}
\ No newline at end of file