Project import generated by Copybara.

GitOrigin-RevId: d9e9e3fb4e31372ec1fb43b178994ca78fa8fe70
diff --git a/api/api_proto/__init__.py b/api/api_proto/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/api/api_proto/__init__.py
diff --git a/api/api_proto/common.proto b/api/api_proto/common.proto
new file mode 100644
index 0000000..0ff0750
--- /dev/null
+++ b/api/api_proto/common.proto
@@ -0,0 +1,109 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+// This file defines small protobufs that are included as parts of
+// multiple services or *_objects.proto PBs.
+//
+// "Ref" objects contain enough information for a UI to display
+// something to the user, and identifying info so that the client can
+// request more info from the server.
+
+syntax = "proto3";
+
+package monorail;
+
+
+// Next available tag: 3
+message ComponentRef {
+  string path = 1;
+  bool is_derived = 2;
+}
+
+
+// Next available tag: 9
+enum FieldType {
+  NO_TYPE = 0;
+  ENUM_TYPE = 1;
+  INT_TYPE = 2;
+  STR_TYPE = 3;
+  USER_TYPE = 4;
+  DATE_TYPE = 5;
+  BOOL_TYPE = 6;
+  URL_TYPE = 7;
+  APPROVAL_TYPE = 8;
+}
+
+
+// Next available tag: 5
+message FieldRef {
+  // TODO(crbug.com/monorail/4062): Don't use field IDs to identify fields.
+  uint64 field_id = 1;
+  string field_name = 2;
+  FieldType type = 3;
+  string approval_name = 4;
+}
+
+
+// Next available tag: 3
+message LabelRef {
+  string label = 1;
+  bool is_derived = 2;
+}
+
+
+// Next available tag: 4
+message StatusRef {
+  string status = 1;
+  bool means_open = 2;
+  bool is_derived = 3;
+}
+
+
+// Next available tag: 4
+message IssueRef {
+  string project_name = 1;
+  uint32 local_id = 2;
+  string ext_identifier = 3; // For referencing external issues, e.g. b/1234.
+}
+
+
+// Next available tag: 4
+message UserRef {
+  uint64 user_id = 1;
+  string display_name = 2;  // email, or obscured like "usern...@example.com".
+  bool is_derived = 3;
+}
+
+
+// Next available tag: 4
+message HotlistRef {
+  // TODO(4131): Don't use hotlist IDs to identify hotlists.
+  uint64 hotlist_id = 1;
+  string name = 2;
+  UserRef owner = 3;
+}
+
+
+// Next available tag: 3
+message ValueAndWhy {
+  string value = 1;
+  string why = 2;
+}
+
+
+// Next available tag: 3
+message Pagination {
+  uint32 max_items = 1;
+  uint32 start = 2;
+}
+
+
+// Next available tag: 5
+message SavedQuery {
+  uint64 query_id = 1;
+  string name = 2;
+  string query = 3;
+  repeated string project_names = 4;
+}
diff --git a/api/api_proto/common_pb2.py b/api/api_proto/common_pb2.py
new file mode 100644
index 0000000..1d31b51
--- /dev/null
+++ b/api/api_proto/common_pb2.py
@@ -0,0 +1,610 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: api/api_proto/common.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='api/api_proto/common.proto',
+  package='monorail',
+  syntax='proto3',
+  serialized_options=None,
+  serialized_pb=_b('\n\x1a\x61pi/api_proto/common.proto\x12\x08monorail\"0\n\x0c\x43omponentRef\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x12\n\nis_derived\x18\x02 \x01(\x08\"j\n\x08\x46ieldRef\x12\x10\n\x08\x66ield_id\x18\x01 \x01(\x04\x12\x12\n\nfield_name\x18\x02 \x01(\t\x12!\n\x04type\x18\x03 \x01(\x0e\x32\x13.monorail.FieldType\x12\x15\n\rapproval_name\x18\x04 \x01(\t\"-\n\x08LabelRef\x12\r\n\x05label\x18\x01 \x01(\t\x12\x12\n\nis_derived\x18\x02 \x01(\x08\"C\n\tStatusRef\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x12\n\nmeans_open\x18\x02 \x01(\x08\x12\x12\n\nis_derived\x18\x03 \x01(\x08\"J\n\x08IssueRef\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x10\n\x08local_id\x18\x02 \x01(\r\x12\x16\n\x0e\x65xt_identifier\x18\x03 \x01(\t\"D\n\x07UserRef\x12\x0f\n\x07user_id\x18\x01 \x01(\x04\x12\x14\n\x0c\x64isplay_name\x18\x02 \x01(\t\x12\x12\n\nis_derived\x18\x03 \x01(\x08\"P\n\nHotlistRef\x12\x12\n\nhotlist_id\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\x12 \n\x05owner\x18\x03 \x01(\x0b\x32\x11.monorail.UserRef\")\n\x0bValueAndWhy\x12\r\n\x05value\x18\x01 \x01(\t\x12\x0b\n\x03why\x18\x02 \x01(\t\".\n\nPagination\x12\x11\n\tmax_items\x18\x01 \x01(\r\x12\r\n\x05start\x18\x02 \x01(\r\"R\n\nSavedQuery\x12\x10\n\x08query_id\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\r\n\x05query\x18\x03 \x01(\t\x12\x15\n\rproject_names\x18\x04 \x03(\t*\x91\x01\n\tFieldType\x12\x0b\n\x07NO_TYPE\x10\x00\x12\r\n\tENUM_TYPE\x10\x01\x12\x0c\n\x08INT_TYPE\x10\x02\x12\x0c\n\x08STR_TYPE\x10\x03\x12\r\n\tUSER_TYPE\x10\x04\x12\r\n\tDATE_TYPE\x10\x05\x12\r\n\tBOOL_TYPE\x10\x06\x12\x0c\n\x08URL_TYPE\x10\x07\x12\x11\n\rAPPROVAL_TYPE\x10\x08\x62\x06proto3')
+)
+
+_FIELDTYPE = _descriptor.EnumDescriptor(
+  name='FieldType',
+  full_name='monorail.FieldType',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='NO_TYPE', index=0, number=0,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='ENUM_TYPE', index=1, number=1,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='INT_TYPE', index=2, number=2,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='STR_TYPE', index=3, number=3,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='USER_TYPE', index=4, number=4,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='DATE_TYPE', index=5, number=5,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='BOOL_TYPE', index=6, number=6,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='URL_TYPE', index=7, number=7,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='APPROVAL_TYPE', index=8, number=8,
+      serialized_options=None,
+      type=None),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=718,
+  serialized_end=863,
+)
+_sym_db.RegisterEnumDescriptor(_FIELDTYPE)
+
+FieldType = enum_type_wrapper.EnumTypeWrapper(_FIELDTYPE)
+NO_TYPE = 0
+ENUM_TYPE = 1
+INT_TYPE = 2
+STR_TYPE = 3
+USER_TYPE = 4
+DATE_TYPE = 5
+BOOL_TYPE = 6
+URL_TYPE = 7
+APPROVAL_TYPE = 8
+
+
+
+_COMPONENTREF = _descriptor.Descriptor(
+  name='ComponentRef',
+  full_name='monorail.ComponentRef',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='path', full_name='monorail.ComponentRef.path', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_derived', full_name='monorail.ComponentRef.is_derived', index=1,
+      number=2, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=40,
+  serialized_end=88,
+)
+
+
+_FIELDREF = _descriptor.Descriptor(
+  name='FieldRef',
+  full_name='monorail.FieldRef',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='field_id', full_name='monorail.FieldRef.field_id', index=0,
+      number=1, type=4, cpp_type=4, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='field_name', full_name='monorail.FieldRef.field_name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='monorail.FieldRef.type', index=2,
+      number=3, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='approval_name', full_name='monorail.FieldRef.approval_name', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=90,
+  serialized_end=196,
+)
+
+
+_LABELREF = _descriptor.Descriptor(
+  name='LabelRef',
+  full_name='monorail.LabelRef',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='label', full_name='monorail.LabelRef.label', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_derived', full_name='monorail.LabelRef.is_derived', index=1,
+      number=2, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=198,
+  serialized_end=243,
+)
+
+
+_STATUSREF = _descriptor.Descriptor(
+  name='StatusRef',
+  full_name='monorail.StatusRef',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='monorail.StatusRef.status', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='means_open', full_name='monorail.StatusRef.means_open', index=1,
+      number=2, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_derived', full_name='monorail.StatusRef.is_derived', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=245,
+  serialized_end=312,
+)
+
+
+_ISSUEREF = _descriptor.Descriptor(
+  name='IssueRef',
+  full_name='monorail.IssueRef',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.IssueRef.project_name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='local_id', full_name='monorail.IssueRef.local_id', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='ext_identifier', full_name='monorail.IssueRef.ext_identifier', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=314,
+  serialized_end=388,
+)
+
+
+_USERREF = _descriptor.Descriptor(
+  name='UserRef',
+  full_name='monorail.UserRef',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='monorail.UserRef.user_id', index=0,
+      number=1, type=4, cpp_type=4, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='display_name', full_name='monorail.UserRef.display_name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_derived', full_name='monorail.UserRef.is_derived', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=390,
+  serialized_end=458,
+)
+
+
+_HOTLISTREF = _descriptor.Descriptor(
+  name='HotlistRef',
+  full_name='monorail.HotlistRef',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hotlist_id', full_name='monorail.HotlistRef.hotlist_id', index=0,
+      number=1, type=4, cpp_type=4, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='monorail.HotlistRef.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='owner', full_name='monorail.HotlistRef.owner', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=460,
+  serialized_end=540,
+)
+
+
+_VALUEANDWHY = _descriptor.Descriptor(
+  name='ValueAndWhy',
+  full_name='monorail.ValueAndWhy',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='value', full_name='monorail.ValueAndWhy.value', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='why', full_name='monorail.ValueAndWhy.why', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=542,
+  serialized_end=583,
+)
+
+
+_PAGINATION = _descriptor.Descriptor(
+  name='Pagination',
+  full_name='monorail.Pagination',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='max_items', full_name='monorail.Pagination.max_items', index=0,
+      number=1, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='start', full_name='monorail.Pagination.start', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=585,
+  serialized_end=631,
+)
+
+
+_SAVEDQUERY = _descriptor.Descriptor(
+  name='SavedQuery',
+  full_name='monorail.SavedQuery',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='query_id', full_name='monorail.SavedQuery.query_id', index=0,
+      number=1, type=4, cpp_type=4, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='monorail.SavedQuery.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='query', full_name='monorail.SavedQuery.query', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='project_names', full_name='monorail.SavedQuery.project_names', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=633,
+  serialized_end=715,
+)
+
+_FIELDREF.fields_by_name['type'].enum_type = _FIELDTYPE
+_HOTLISTREF.fields_by_name['owner'].message_type = _USERREF
+DESCRIPTOR.message_types_by_name['ComponentRef'] = _COMPONENTREF
+DESCRIPTOR.message_types_by_name['FieldRef'] = _FIELDREF
+DESCRIPTOR.message_types_by_name['LabelRef'] = _LABELREF
+DESCRIPTOR.message_types_by_name['StatusRef'] = _STATUSREF
+DESCRIPTOR.message_types_by_name['IssueRef'] = _ISSUEREF
+DESCRIPTOR.message_types_by_name['UserRef'] = _USERREF
+DESCRIPTOR.message_types_by_name['HotlistRef'] = _HOTLISTREF
+DESCRIPTOR.message_types_by_name['ValueAndWhy'] = _VALUEANDWHY
+DESCRIPTOR.message_types_by_name['Pagination'] = _PAGINATION
+DESCRIPTOR.message_types_by_name['SavedQuery'] = _SAVEDQUERY
+DESCRIPTOR.enum_types_by_name['FieldType'] = _FIELDTYPE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+ComponentRef = _reflection.GeneratedProtocolMessageType('ComponentRef', (_message.Message,), dict(
+  DESCRIPTOR = _COMPONENTREF,
+  __module__ = 'api.api_proto.common_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ComponentRef)
+  ))
+_sym_db.RegisterMessage(ComponentRef)
+
+FieldRef = _reflection.GeneratedProtocolMessageType('FieldRef', (_message.Message,), dict(
+  DESCRIPTOR = _FIELDREF,
+  __module__ = 'api.api_proto.common_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.FieldRef)
+  ))
+_sym_db.RegisterMessage(FieldRef)
+
+LabelRef = _reflection.GeneratedProtocolMessageType('LabelRef', (_message.Message,), dict(
+  DESCRIPTOR = _LABELREF,
+  __module__ = 'api.api_proto.common_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.LabelRef)
+  ))
+_sym_db.RegisterMessage(LabelRef)
+
+StatusRef = _reflection.GeneratedProtocolMessageType('StatusRef', (_message.Message,), dict(
+  DESCRIPTOR = _STATUSREF,
+  __module__ = 'api.api_proto.common_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.StatusRef)
+  ))
+_sym_db.RegisterMessage(StatusRef)
+
+IssueRef = _reflection.GeneratedProtocolMessageType('IssueRef', (_message.Message,), dict(
+  DESCRIPTOR = _ISSUEREF,
+  __module__ = 'api.api_proto.common_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.IssueRef)
+  ))
+_sym_db.RegisterMessage(IssueRef)
+
+UserRef = _reflection.GeneratedProtocolMessageType('UserRef', (_message.Message,), dict(
+  DESCRIPTOR = _USERREF,
+  __module__ = 'api.api_proto.common_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.UserRef)
+  ))
+_sym_db.RegisterMessage(UserRef)
+
+HotlistRef = _reflection.GeneratedProtocolMessageType('HotlistRef', (_message.Message,), dict(
+  DESCRIPTOR = _HOTLISTREF,
+  __module__ = 'api.api_proto.common_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.HotlistRef)
+  ))
+_sym_db.RegisterMessage(HotlistRef)
+
+ValueAndWhy = _reflection.GeneratedProtocolMessageType('ValueAndWhy', (_message.Message,), dict(
+  DESCRIPTOR = _VALUEANDWHY,
+  __module__ = 'api.api_proto.common_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ValueAndWhy)
+  ))
+_sym_db.RegisterMessage(ValueAndWhy)
+
+Pagination = _reflection.GeneratedProtocolMessageType('Pagination', (_message.Message,), dict(
+  DESCRIPTOR = _PAGINATION,
+  __module__ = 'api.api_proto.common_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.Pagination)
+  ))
+_sym_db.RegisterMessage(Pagination)
+
+SavedQuery = _reflection.GeneratedProtocolMessageType('SavedQuery', (_message.Message,), dict(
+  DESCRIPTOR = _SAVEDQUERY,
+  __module__ = 'api.api_proto.common_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.SavedQuery)
+  ))
+_sym_db.RegisterMessage(SavedQuery)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/api/api_proto/common_prpc_pb2.py b/api/api_proto/common_prpc_pb2.py
new file mode 100644
index 0000000..fb73302
--- /dev/null
+++ b/api/api_proto/common_prpc_pb2.py
@@ -0,0 +1,4 @@
+# Generated by the pRPC protocol buffer compiler plugin.  DO NOT EDIT!
+# source: api/api_proto/common.proto
+
+from google.protobuf import descriptor_pb2
diff --git a/api/api_proto/features.proto b/api/api_proto/features.proto
new file mode 100644
index 0000000..7d7f2fc
--- /dev/null
+++ b/api/api_proto/features.proto
@@ -0,0 +1,229 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+syntax = "proto3";
+
+package monorail;
+
+import "api/api_proto/common.proto";
+import "api/api_proto/features_objects.proto";
+
+
+service Features {
+  rpc ListHotlistsByUser (ListHotlistsByUserRequest) returns (ListHotlistsByUserResponse) {}
+  rpc ListHotlistsByIssue (ListHotlistsByIssueRequest) returns (ListHotlistsByIssueResponse) {}
+  rpc ListRecentlyVisitedHotlists (ListRecentlyVisitedHotlistsRequest) returns (ListRecentlyVisitedHotlistsResponse) {}
+  rpc ListStarredHotlists (ListStarredHotlistsRequest) returns (ListStarredHotlistsResponse) {}
+  rpc GetHotlistStarCount (GetHotlistStarCountRequest) returns (GetHotlistStarCountResponse) {}
+  rpc StarHotlist (StarHotlistRequest) returns (StarHotlistResponse) {}
+  rpc GetHotlist (GetHotlistRequest) returns (GetHotlistResponse) {}
+  rpc ListHotlistItems (ListHotlistItemsRequest) returns (ListHotlistItemsResponse) {}
+  rpc CreateHotlist (CreateHotlistRequest) returns (CreateHotlistResponse) {}
+  rpc CheckHotlistName (CheckHotlistNameRequest) returns (CheckHotlistNameResponse) {}
+  rpc RemoveIssuesFromHotlists (RemoveIssuesFromHotlistsRequest) returns (RemoveIssuesFromHotlistsResponse) {}
+  rpc AddIssuesToHotlists (AddIssuesToHotlistsRequest) returns (AddIssuesToHotlistsResponse) {}
+  rpc RerankHotlistIssues (RerankHotlistIssuesRequest) returns (RerankHotlistIssuesResponse) {}
+  rpc UpdateHotlistIssueNote (UpdateHotlistIssueNoteRequest) returns (UpdateHotlistIssueNoteResponse) {}
+  rpc DeleteHotlist (DeleteHotlistRequest) returns (DeleteHotlistResponse) {}
+  rpc PredictComponent (PredictComponentRequest) returns (PredictComponentResponse) {}
+}
+
+
+// Next available tag: 3
+message ListHotlistsByUserRequest {
+  UserRef user = 2;
+}
+
+
+// Next available tag: 2
+message ListHotlistsByUserResponse {
+  repeated Hotlist hotlists = 1;
+}
+
+
+// Next available tag: 3
+message ListHotlistsByIssueRequest {
+  IssueRef issue = 2;
+}
+
+
+// Next available tag: 2
+message ListHotlistsByIssueResponse {
+  repeated Hotlist hotlists = 1;
+}
+
+
+// Next available tag: 2
+message ListRecentlyVisitedHotlistsRequest {
+}
+
+
+// Next available tag: 2
+message ListRecentlyVisitedHotlistsResponse {
+  repeated Hotlist hotlists = 1;
+}
+
+
+// Next available tag: 2
+message ListStarredHotlistsRequest {
+}
+
+
+// Next available tag: 2
+message ListStarredHotlistsResponse {
+  repeated Hotlist hotlists = 1;
+}
+
+
+// Next available tag: 3
+message GetHotlistStarCountRequest {
+  HotlistRef hotlist_ref = 2;
+}
+
+
+// Next available tag: 2
+message GetHotlistStarCountResponse {
+  uint32 star_count = 1;
+}
+
+
+// Next available tag: 4
+message StarHotlistRequest {
+  HotlistRef hotlist_ref = 2;
+  bool starred = 3;
+}
+
+
+// Next available tag: 2
+message StarHotlistResponse {
+  uint32 star_count = 1;
+}
+
+// Next available tag: 2
+message GetHotlistRequest {
+  HotlistRef hotlist_ref = 1;
+}
+
+// Next available tag: 2
+message GetHotlistResponse {
+  Hotlist hotlist = 1;
+}
+
+
+// Next available tag: 7
+message ListHotlistItemsRequest {
+  HotlistRef hotlist_ref = 2;
+  Pagination pagination = 3;
+  uint32 can = 4;
+  string sort_spec = 5;
+  string group_by_spec = 6;
+}
+
+
+// Next available tag: 2
+message ListHotlistItemsResponse {
+  repeated HotlistItem items = 1;
+}
+
+
+// Next available tag: 7
+message CreateHotlistRequest {
+  string name = 2;
+  string summary = 3;
+  string description = 4;
+  repeated UserRef editor_refs = 5;
+  repeated IssueRef issue_refs = 6;
+  bool is_private = 7;
+}
+
+
+// Next available tag: 1
+message CreateHotlistResponse {
+}
+
+
+// Next available tag: 3
+message CheckHotlistNameRequest {
+  string name = 2;
+}
+
+
+// Next available tag: 1
+message CheckHotlistNameResponse {
+  string error = 1;
+}
+
+
+// Next available tag: 4
+message RemoveIssuesFromHotlistsRequest {
+  repeated HotlistRef hotlist_refs = 2;
+  repeated IssueRef issue_refs = 3;
+}
+
+
+// Next available tag: 1
+message RemoveIssuesFromHotlistsResponse {
+}
+
+
+// Next available tag: 5
+message AddIssuesToHotlistsRequest {
+  repeated HotlistRef hotlist_refs = 2;
+  repeated IssueRef issue_refs = 3;
+  string note = 4;
+}
+
+
+// Next available tag: 1
+message AddIssuesToHotlistsResponse {
+}
+
+// Next available tag: 5
+message RerankHotlistIssuesRequest{
+  HotlistRef hotlist_ref = 1;
+  repeated IssueRef moved_refs = 2;
+  IssueRef target_ref = 3;
+  bool split_above = 4;
+}
+
+// Next available tag: 1
+message RerankHotlistIssuesResponse{
+}
+
+// Next available tag: 5
+message UpdateHotlistIssueNoteRequest {
+  HotlistRef hotlist_ref = 2;
+  IssueRef issue_ref = 3;
+  string note = 4;
+}
+
+
+// Next available tag: 1
+message UpdateHotlistIssueNoteResponse {
+}
+
+
+// Next available tag: 2
+message DeleteHotlistRequest {
+  HotlistRef hotlist_ref = 1;
+}
+
+
+// Next available tag: 1
+message DeleteHotlistResponse {
+}
+
+
+// Next available tag: 4
+message PredictComponentRequest {
+  string text = 2;
+  string project_name = 3;
+}
+
+
+// Next available tag: 2
+message PredictComponentResponse {
+  ComponentRef component_ref = 1;
+}
diff --git a/api/api_proto/features_objects.proto b/api/api_proto/features_objects.proto
new file mode 100644
index 0000000..14b61ac
--- /dev/null
+++ b/api/api_proto/features_objects.proto
@@ -0,0 +1,43 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+syntax = "proto3";
+
+package monorail;
+
+import "api/api_proto/common.proto";
+import "api/api_proto/issue_objects.proto";
+
+
+// Next available tag: 9
+message Hotlist {
+  UserRef owner_ref = 1;
+  repeated UserRef editor_refs = 5;
+  repeated UserRef follower_refs = 6;
+  string name = 2;
+  string summary = 3;
+  string description = 4;
+  string default_col_spec = 7;
+  bool is_private = 8;
+}
+
+
+// Next available tag: 6
+message HotlistItem {
+  Issue issue = 1;
+  uint32 rank = 2;
+  UserRef adder_ref = 3;
+  uint32 added_timestamp = 4;
+  string note = 5;
+}
+
+
+// Next available tag: 5
+message HotlistPeopleDelta {
+  UserRef new_owner_ref = 1;
+  repeated UserRef add_editor_refs = 2;
+  repeated UserRef add_follower_refs = 3;
+  repeated UserRef remove_user_refs = 4;
+}
\ No newline at end of file
diff --git a/api/api_proto/features_objects_pb2.py b/api/api_proto/features_objects_pb2.py
new file mode 100644
index 0000000..63d8091
--- /dev/null
+++ b/api/api_proto/features_objects_pb2.py
@@ -0,0 +1,257 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: api/api_proto/features_objects.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from api.api_proto import common_pb2 as api_dot_api__proto_dot_common__pb2
+from api.api_proto import issue_objects_pb2 as api_dot_api__proto_dot_issue__objects__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='api/api_proto/features_objects.proto',
+  package='monorail',
+  syntax='proto3',
+  serialized_options=None,
+  serialized_pb=_b('\n$api/api_proto/features_objects.proto\x12\x08monorail\x1a\x1a\x61pi/api_proto/common.proto\x1a!api/api_proto/issue_objects.proto\"\xe3\x01\n\x07Hotlist\x12$\n\towner_ref\x18\x01 \x01(\x0b\x32\x11.monorail.UserRef\x12&\n\x0b\x65\x64itor_refs\x18\x05 \x03(\x0b\x32\x11.monorail.UserRef\x12(\n\rfollower_refs\x18\x06 \x03(\x0b\x32\x11.monorail.UserRef\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0f\n\x07summary\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x12\x18\n\x10\x64\x65\x66\x61ult_col_spec\x18\x07 \x01(\t\x12\x12\n\nis_private\x18\x08 \x01(\x08\"\x88\x01\n\x0bHotlistItem\x12\x1e\n\x05issue\x18\x01 \x01(\x0b\x32\x0f.monorail.Issue\x12\x0c\n\x04rank\x18\x02 \x01(\r\x12$\n\tadder_ref\x18\x03 \x01(\x0b\x32\x11.monorail.UserRef\x12\x17\n\x0f\x61\x64\x64\x65\x64_timestamp\x18\x04 \x01(\r\x12\x0c\n\x04note\x18\x05 \x01(\t\"\xc5\x01\n\x12HotlistPeopleDelta\x12(\n\rnew_owner_ref\x18\x01 \x01(\x0b\x32\x11.monorail.UserRef\x12*\n\x0f\x61\x64\x64_editor_refs\x18\x02 \x03(\x0b\x32\x11.monorail.UserRef\x12,\n\x11\x61\x64\x64_follower_refs\x18\x03 \x03(\x0b\x32\x11.monorail.UserRef\x12+\n\x10remove_user_refs\x18\x04 \x03(\x0b\x32\x11.monorail.UserRefb\x06proto3')
+  ,
+  dependencies=[api_dot_api__proto_dot_common__pb2.DESCRIPTOR,api_dot_api__proto_dot_issue__objects__pb2.DESCRIPTOR,])
+
+
+
+
+_HOTLIST = _descriptor.Descriptor(
+  name='Hotlist',
+  full_name='monorail.Hotlist',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='owner_ref', full_name='monorail.Hotlist.owner_ref', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='editor_refs', full_name='monorail.Hotlist.editor_refs', index=1,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='follower_refs', full_name='monorail.Hotlist.follower_refs', index=2,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='monorail.Hotlist.name', index=3,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='summary', full_name='monorail.Hotlist.summary', index=4,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='monorail.Hotlist.description', index=5,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='default_col_spec', full_name='monorail.Hotlist.default_col_spec', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_private', full_name='monorail.Hotlist.is_private', index=7,
+      number=8, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=114,
+  serialized_end=341,
+)
+
+
+_HOTLISTITEM = _descriptor.Descriptor(
+  name='HotlistItem',
+  full_name='monorail.HotlistItem',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue', full_name='monorail.HotlistItem.issue', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='rank', full_name='monorail.HotlistItem.rank', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='adder_ref', full_name='monorail.HotlistItem.adder_ref', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='added_timestamp', full_name='monorail.HotlistItem.added_timestamp', index=3,
+      number=4, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='note', full_name='monorail.HotlistItem.note', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=344,
+  serialized_end=480,
+)
+
+
+_HOTLISTPEOPLEDELTA = _descriptor.Descriptor(
+  name='HotlistPeopleDelta',
+  full_name='monorail.HotlistPeopleDelta',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='new_owner_ref', full_name='monorail.HotlistPeopleDelta.new_owner_ref', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='add_editor_refs', full_name='monorail.HotlistPeopleDelta.add_editor_refs', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='add_follower_refs', full_name='monorail.HotlistPeopleDelta.add_follower_refs', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='remove_user_refs', full_name='monorail.HotlistPeopleDelta.remove_user_refs', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=483,
+  serialized_end=680,
+)
+
+_HOTLIST.fields_by_name['owner_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_HOTLIST.fields_by_name['editor_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_HOTLIST.fields_by_name['follower_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_HOTLISTITEM.fields_by_name['issue'].message_type = api_dot_api__proto_dot_issue__objects__pb2._ISSUE
+_HOTLISTITEM.fields_by_name['adder_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_HOTLISTPEOPLEDELTA.fields_by_name['new_owner_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_HOTLISTPEOPLEDELTA.fields_by_name['add_editor_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_HOTLISTPEOPLEDELTA.fields_by_name['add_follower_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_HOTLISTPEOPLEDELTA.fields_by_name['remove_user_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+DESCRIPTOR.message_types_by_name['Hotlist'] = _HOTLIST
+DESCRIPTOR.message_types_by_name['HotlistItem'] = _HOTLISTITEM
+DESCRIPTOR.message_types_by_name['HotlistPeopleDelta'] = _HOTLISTPEOPLEDELTA
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Hotlist = _reflection.GeneratedProtocolMessageType('Hotlist', (_message.Message,), dict(
+  DESCRIPTOR = _HOTLIST,
+  __module__ = 'api.api_proto.features_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.Hotlist)
+  ))
+_sym_db.RegisterMessage(Hotlist)
+
+HotlistItem = _reflection.GeneratedProtocolMessageType('HotlistItem', (_message.Message,), dict(
+  DESCRIPTOR = _HOTLISTITEM,
+  __module__ = 'api.api_proto.features_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.HotlistItem)
+  ))
+_sym_db.RegisterMessage(HotlistItem)
+
+HotlistPeopleDelta = _reflection.GeneratedProtocolMessageType('HotlistPeopleDelta', (_message.Message,), dict(
+  DESCRIPTOR = _HOTLISTPEOPLEDELTA,
+  __module__ = 'api.api_proto.features_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.HotlistPeopleDelta)
+  ))
+_sym_db.RegisterMessage(HotlistPeopleDelta)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/api/api_proto/features_pb2.py b/api/api_proto/features_pb2.py
new file mode 100644
index 0000000..c415a35
--- /dev/null
+++ b/api/api_proto/features_pb2.py
@@ -0,0 +1,1543 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: api/api_proto/features.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from api.api_proto import common_pb2 as api_dot_api__proto_dot_common__pb2
+from api.api_proto import features_objects_pb2 as api_dot_api__proto_dot_features__objects__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='api/api_proto/features.proto',
+  package='monorail',
+  syntax='proto3',
+  serialized_options=None,
+  serialized_pb=_b('\n\x1c\x61pi/api_proto/features.proto\x12\x08monorail\x1a\x1a\x61pi/api_proto/common.proto\x1a$api/api_proto/features_objects.proto\"<\n\x19ListHotlistsByUserRequest\x12\x1f\n\x04user\x18\x02 \x01(\x0b\x32\x11.monorail.UserRef\"A\n\x1aListHotlistsByUserResponse\x12#\n\x08hotlists\x18\x01 \x03(\x0b\x32\x11.monorail.Hotlist\"?\n\x1aListHotlistsByIssueRequest\x12!\n\x05issue\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\"B\n\x1bListHotlistsByIssueResponse\x12#\n\x08hotlists\x18\x01 \x03(\x0b\x32\x11.monorail.Hotlist\"$\n\"ListRecentlyVisitedHotlistsRequest\"J\n#ListRecentlyVisitedHotlistsResponse\x12#\n\x08hotlists\x18\x01 \x03(\x0b\x32\x11.monorail.Hotlist\"\x1c\n\x1aListStarredHotlistsRequest\"B\n\x1bListStarredHotlistsResponse\x12#\n\x08hotlists\x18\x01 \x03(\x0b\x32\x11.monorail.Hotlist\"G\n\x1aGetHotlistStarCountRequest\x12)\n\x0bhotlist_ref\x18\x02 \x01(\x0b\x32\x14.monorail.HotlistRef\"1\n\x1bGetHotlistStarCountResponse\x12\x12\n\nstar_count\x18\x01 \x01(\r\"P\n\x12StarHotlistRequest\x12)\n\x0bhotlist_ref\x18\x02 \x01(\x0b\x32\x14.monorail.HotlistRef\x12\x0f\n\x07starred\x18\x03 \x01(\x08\")\n\x13StarHotlistResponse\x12\x12\n\nstar_count\x18\x01 \x01(\r\">\n\x11GetHotlistRequest\x12)\n\x0bhotlist_ref\x18\x01 \x01(\x0b\x32\x14.monorail.HotlistRef\"8\n\x12GetHotlistResponse\x12\"\n\x07hotlist\x18\x01 \x01(\x0b\x32\x11.monorail.Hotlist\"\xa5\x01\n\x17ListHotlistItemsRequest\x12)\n\x0bhotlist_ref\x18\x02 \x01(\x0b\x32\x14.monorail.HotlistRef\x12(\n\npagination\x18\x03 \x01(\x0b\x32\x14.monorail.Pagination\x12\x0b\n\x03\x63\x61n\x18\x04 \x01(\r\x12\x11\n\tsort_spec\x18\x05 \x01(\t\x12\x15\n\rgroup_by_spec\x18\x06 \x01(\t\"@\n\x18ListHotlistItemsResponse\x12$\n\x05items\x18\x01 \x03(\x0b\x32\x15.monorail.HotlistItem\"\xae\x01\n\x14\x43reateHotlistRequest\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0f\n\x07summary\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x12&\n\x0b\x65\x64itor_refs\x18\x05 \x03(\x0b\x32\x11.monorail.UserRef\x12&\n\nissue_refs\x18\x06 \x03(\x0b\x32\x12.monorail.IssueRef\x12\x12\n\nis_private\x18\x07 \x01(\x08\"\x17\n\x15\x43reateHotlistResponse\"\'\n\x17\x43heckHotlistNameRequest\x12\x0c\n\x04name\x18\x02 \x01(\t\")\n\x18\x43heckHotlistNameResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"u\n\x1fRemoveIssuesFromHotlistsRequest\x12*\n\x0chotlist_refs\x18\x02 \x03(\x0b\x32\x14.monorail.HotlistRef\x12&\n\nissue_refs\x18\x03 \x03(\x0b\x32\x12.monorail.IssueRef\"\"\n RemoveIssuesFromHotlistsResponse\"~\n\x1a\x41\x64\x64IssuesToHotlistsRequest\x12*\n\x0chotlist_refs\x18\x02 \x03(\x0b\x32\x14.monorail.HotlistRef\x12&\n\nissue_refs\x18\x03 \x03(\x0b\x32\x12.monorail.IssueRef\x12\x0c\n\x04note\x18\x04 \x01(\t\"\x1d\n\x1b\x41\x64\x64IssuesToHotlistsResponse\"\xac\x01\n\x1aRerankHotlistIssuesRequest\x12)\n\x0bhotlist_ref\x18\x01 \x01(\x0b\x32\x14.monorail.HotlistRef\x12&\n\nmoved_refs\x18\x02 \x03(\x0b\x32\x12.monorail.IssueRef\x12&\n\ntarget_ref\x18\x03 \x01(\x0b\x32\x12.monorail.IssueRef\x12\x13\n\x0bsplit_above\x18\x04 \x01(\x08\"\x1d\n\x1bRerankHotlistIssuesResponse\"\x7f\n\x1dUpdateHotlistIssueNoteRequest\x12)\n\x0bhotlist_ref\x18\x02 \x01(\x0b\x32\x14.monorail.HotlistRef\x12%\n\tissue_ref\x18\x03 \x01(\x0b\x32\x12.monorail.IssueRef\x12\x0c\n\x04note\x18\x04 \x01(\t\" \n\x1eUpdateHotlistIssueNoteResponse\"A\n\x14\x44\x65leteHotlistRequest\x12)\n\x0bhotlist_ref\x18\x01 \x01(\x0b\x32\x14.monorail.HotlistRef\"\x17\n\x15\x44\x65leteHotlistResponse\"=\n\x17PredictComponentRequest\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\x14\n\x0cproject_name\x18\x03 \x01(\t\"I\n\x18PredictComponentResponse\x12-\n\rcomponent_ref\x18\x01 \x01(\x0b\x32\x16.monorail.ComponentRef2\xa5\x0c\n\x08\x46\x65\x61tures\x12\x61\n\x12ListHotlistsByUser\x12#.monorail.ListHotlistsByUserRequest\x1a$.monorail.ListHotlistsByUserResponse\"\x00\x12\x64\n\x13ListHotlistsByIssue\x12$.monorail.ListHotlistsByIssueRequest\x1a%.monorail.ListHotlistsByIssueResponse\"\x00\x12|\n\x1bListRecentlyVisitedHotlists\x12,.monorail.ListRecentlyVisitedHotlistsRequest\x1a-.monorail.ListRecentlyVisitedHotlistsResponse\"\x00\x12\x64\n\x13ListStarredHotlists\x12$.monorail.ListStarredHotlistsRequest\x1a%.monorail.ListStarredHotlistsResponse\"\x00\x12\x64\n\x13GetHotlistStarCount\x12$.monorail.GetHotlistStarCountRequest\x1a%.monorail.GetHotlistStarCountResponse\"\x00\x12L\n\x0bStarHotlist\x12\x1c.monorail.StarHotlistRequest\x1a\x1d.monorail.StarHotlistResponse\"\x00\x12I\n\nGetHotlist\x12\x1b.monorail.GetHotlistRequest\x1a\x1c.monorail.GetHotlistResponse\"\x00\x12[\n\x10ListHotlistItems\x12!.monorail.ListHotlistItemsRequest\x1a\".monorail.ListHotlistItemsResponse\"\x00\x12R\n\rCreateHotlist\x12\x1e.monorail.CreateHotlistRequest\x1a\x1f.monorail.CreateHotlistResponse\"\x00\x12[\n\x10\x43heckHotlistName\x12!.monorail.CheckHotlistNameRequest\x1a\".monorail.CheckHotlistNameResponse\"\x00\x12s\n\x18RemoveIssuesFromHotlists\x12).monorail.RemoveIssuesFromHotlistsRequest\x1a*.monorail.RemoveIssuesFromHotlistsResponse\"\x00\x12\x64\n\x13\x41\x64\x64IssuesToHotlists\x12$.monorail.AddIssuesToHotlistsRequest\x1a%.monorail.AddIssuesToHotlistsResponse\"\x00\x12\x64\n\x13RerankHotlistIssues\x12$.monorail.RerankHotlistIssuesRequest\x1a%.monorail.RerankHotlistIssuesResponse\"\x00\x12m\n\x16UpdateHotlistIssueNote\x12\'.monorail.UpdateHotlistIssueNoteRequest\x1a(.monorail.UpdateHotlistIssueNoteResponse\"\x00\x12R\n\rDeleteHotlist\x12\x1e.monorail.DeleteHotlistRequest\x1a\x1f.monorail.DeleteHotlistResponse\"\x00\x12[\n\x10PredictComponent\x12!.monorail.PredictComponentRequest\x1a\".monorail.PredictComponentResponse\"\x00\x62\x06proto3')
+  ,
+  dependencies=[api_dot_api__proto_dot_common__pb2.DESCRIPTOR,api_dot_api__proto_dot_features__objects__pb2.DESCRIPTOR,])
+
+
+
+
+_LISTHOTLISTSBYUSERREQUEST = _descriptor.Descriptor(
+  name='ListHotlistsByUserRequest',
+  full_name='monorail.ListHotlistsByUserRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user', full_name='monorail.ListHotlistsByUserRequest.user', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=108,
+  serialized_end=168,
+)
+
+
+_LISTHOTLISTSBYUSERRESPONSE = _descriptor.Descriptor(
+  name='ListHotlistsByUserResponse',
+  full_name='monorail.ListHotlistsByUserResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hotlists', full_name='monorail.ListHotlistsByUserResponse.hotlists', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=170,
+  serialized_end=235,
+)
+
+
+_LISTHOTLISTSBYISSUEREQUEST = _descriptor.Descriptor(
+  name='ListHotlistsByIssueRequest',
+  full_name='monorail.ListHotlistsByIssueRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue', full_name='monorail.ListHotlistsByIssueRequest.issue', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=237,
+  serialized_end=300,
+)
+
+
+_LISTHOTLISTSBYISSUERESPONSE = _descriptor.Descriptor(
+  name='ListHotlistsByIssueResponse',
+  full_name='monorail.ListHotlistsByIssueResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hotlists', full_name='monorail.ListHotlistsByIssueResponse.hotlists', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=302,
+  serialized_end=368,
+)
+
+
+_LISTRECENTLYVISITEDHOTLISTSREQUEST = _descriptor.Descriptor(
+  name='ListRecentlyVisitedHotlistsRequest',
+  full_name='monorail.ListRecentlyVisitedHotlistsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=370,
+  serialized_end=406,
+)
+
+
+_LISTRECENTLYVISITEDHOTLISTSRESPONSE = _descriptor.Descriptor(
+  name='ListRecentlyVisitedHotlistsResponse',
+  full_name='monorail.ListRecentlyVisitedHotlistsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hotlists', full_name='monorail.ListRecentlyVisitedHotlistsResponse.hotlists', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=408,
+  serialized_end=482,
+)
+
+
+_LISTSTARREDHOTLISTSREQUEST = _descriptor.Descriptor(
+  name='ListStarredHotlistsRequest',
+  full_name='monorail.ListStarredHotlistsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=484,
+  serialized_end=512,
+)
+
+
+_LISTSTARREDHOTLISTSRESPONSE = _descriptor.Descriptor(
+  name='ListStarredHotlistsResponse',
+  full_name='monorail.ListStarredHotlistsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hotlists', full_name='monorail.ListStarredHotlistsResponse.hotlists', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=514,
+  serialized_end=580,
+)
+
+
+_GETHOTLISTSTARCOUNTREQUEST = _descriptor.Descriptor(
+  name='GetHotlistStarCountRequest',
+  full_name='monorail.GetHotlistStarCountRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hotlist_ref', full_name='monorail.GetHotlistStarCountRequest.hotlist_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=582,
+  serialized_end=653,
+)
+
+
+_GETHOTLISTSTARCOUNTRESPONSE = _descriptor.Descriptor(
+  name='GetHotlistStarCountResponse',
+  full_name='monorail.GetHotlistStarCountResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='star_count', full_name='monorail.GetHotlistStarCountResponse.star_count', index=0,
+      number=1, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=655,
+  serialized_end=704,
+)
+
+
+_STARHOTLISTREQUEST = _descriptor.Descriptor(
+  name='StarHotlistRequest',
+  full_name='monorail.StarHotlistRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hotlist_ref', full_name='monorail.StarHotlistRequest.hotlist_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='starred', full_name='monorail.StarHotlistRequest.starred', index=1,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=706,
+  serialized_end=786,
+)
+
+
+_STARHOTLISTRESPONSE = _descriptor.Descriptor(
+  name='StarHotlistResponse',
+  full_name='monorail.StarHotlistResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='star_count', full_name='monorail.StarHotlistResponse.star_count', index=0,
+      number=1, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=788,
+  serialized_end=829,
+)
+
+
+_GETHOTLISTREQUEST = _descriptor.Descriptor(
+  name='GetHotlistRequest',
+  full_name='monorail.GetHotlistRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hotlist_ref', full_name='monorail.GetHotlistRequest.hotlist_ref', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=831,
+  serialized_end=893,
+)
+
+
+_GETHOTLISTRESPONSE = _descriptor.Descriptor(
+  name='GetHotlistResponse',
+  full_name='monorail.GetHotlistResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hotlist', full_name='monorail.GetHotlistResponse.hotlist', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=895,
+  serialized_end=951,
+)
+
+
+_LISTHOTLISTITEMSREQUEST = _descriptor.Descriptor(
+  name='ListHotlistItemsRequest',
+  full_name='monorail.ListHotlistItemsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hotlist_ref', full_name='monorail.ListHotlistItemsRequest.hotlist_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='pagination', full_name='monorail.ListHotlistItemsRequest.pagination', index=1,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='can', full_name='monorail.ListHotlistItemsRequest.can', index=2,
+      number=4, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='sort_spec', full_name='monorail.ListHotlistItemsRequest.sort_spec', index=3,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='group_by_spec', full_name='monorail.ListHotlistItemsRequest.group_by_spec', index=4,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=954,
+  serialized_end=1119,
+)
+
+
+_LISTHOTLISTITEMSRESPONSE = _descriptor.Descriptor(
+  name='ListHotlistItemsResponse',
+  full_name='monorail.ListHotlistItemsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='items', full_name='monorail.ListHotlistItemsResponse.items', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1121,
+  serialized_end=1185,
+)
+
+
+_CREATEHOTLISTREQUEST = _descriptor.Descriptor(
+  name='CreateHotlistRequest',
+  full_name='monorail.CreateHotlistRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='monorail.CreateHotlistRequest.name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='summary', full_name='monorail.CreateHotlistRequest.summary', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='monorail.CreateHotlistRequest.description', index=2,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='editor_refs', full_name='monorail.CreateHotlistRequest.editor_refs', index=3,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='issue_refs', full_name='monorail.CreateHotlistRequest.issue_refs', index=4,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_private', full_name='monorail.CreateHotlistRequest.is_private', index=5,
+      number=7, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1188,
+  serialized_end=1362,
+)
+
+
+_CREATEHOTLISTRESPONSE = _descriptor.Descriptor(
+  name='CreateHotlistResponse',
+  full_name='monorail.CreateHotlistResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1364,
+  serialized_end=1387,
+)
+
+
+_CHECKHOTLISTNAMEREQUEST = _descriptor.Descriptor(
+  name='CheckHotlistNameRequest',
+  full_name='monorail.CheckHotlistNameRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='monorail.CheckHotlistNameRequest.name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1389,
+  serialized_end=1428,
+)
+
+
+_CHECKHOTLISTNAMERESPONSE = _descriptor.Descriptor(
+  name='CheckHotlistNameResponse',
+  full_name='monorail.CheckHotlistNameResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='error', full_name='monorail.CheckHotlistNameResponse.error', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1430,
+  serialized_end=1471,
+)
+
+
+_REMOVEISSUESFROMHOTLISTSREQUEST = _descriptor.Descriptor(
+  name='RemoveIssuesFromHotlistsRequest',
+  full_name='monorail.RemoveIssuesFromHotlistsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hotlist_refs', full_name='monorail.RemoveIssuesFromHotlistsRequest.hotlist_refs', index=0,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='issue_refs', full_name='monorail.RemoveIssuesFromHotlistsRequest.issue_refs', index=1,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1473,
+  serialized_end=1590,
+)
+
+
+_REMOVEISSUESFROMHOTLISTSRESPONSE = _descriptor.Descriptor(
+  name='RemoveIssuesFromHotlistsResponse',
+  full_name='monorail.RemoveIssuesFromHotlistsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1592,
+  serialized_end=1626,
+)
+
+
+_ADDISSUESTOHOTLISTSREQUEST = _descriptor.Descriptor(
+  name='AddIssuesToHotlistsRequest',
+  full_name='monorail.AddIssuesToHotlistsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hotlist_refs', full_name='monorail.AddIssuesToHotlistsRequest.hotlist_refs', index=0,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='issue_refs', full_name='monorail.AddIssuesToHotlistsRequest.issue_refs', index=1,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='note', full_name='monorail.AddIssuesToHotlistsRequest.note', index=2,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1628,
+  serialized_end=1754,
+)
+
+
+_ADDISSUESTOHOTLISTSRESPONSE = _descriptor.Descriptor(
+  name='AddIssuesToHotlistsResponse',
+  full_name='monorail.AddIssuesToHotlistsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1756,
+  serialized_end=1785,
+)
+
+
+_RERANKHOTLISTISSUESREQUEST = _descriptor.Descriptor(
+  name='RerankHotlistIssuesRequest',
+  full_name='monorail.RerankHotlistIssuesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hotlist_ref', full_name='monorail.RerankHotlistIssuesRequest.hotlist_ref', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='moved_refs', full_name='monorail.RerankHotlistIssuesRequest.moved_refs', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='target_ref', full_name='monorail.RerankHotlistIssuesRequest.target_ref', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='split_above', full_name='monorail.RerankHotlistIssuesRequest.split_above', index=3,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1788,
+  serialized_end=1960,
+)
+
+
+_RERANKHOTLISTISSUESRESPONSE = _descriptor.Descriptor(
+  name='RerankHotlistIssuesResponse',
+  full_name='monorail.RerankHotlistIssuesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1962,
+  serialized_end=1991,
+)
+
+
+_UPDATEHOTLISTISSUENOTEREQUEST = _descriptor.Descriptor(
+  name='UpdateHotlistIssueNoteRequest',
+  full_name='monorail.UpdateHotlistIssueNoteRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hotlist_ref', full_name='monorail.UpdateHotlistIssueNoteRequest.hotlist_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.UpdateHotlistIssueNoteRequest.issue_ref', index=1,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='note', full_name='monorail.UpdateHotlistIssueNoteRequest.note', index=2,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1993,
+  serialized_end=2120,
+)
+
+
+_UPDATEHOTLISTISSUENOTERESPONSE = _descriptor.Descriptor(
+  name='UpdateHotlistIssueNoteResponse',
+  full_name='monorail.UpdateHotlistIssueNoteResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2122,
+  serialized_end=2154,
+)
+
+
+_DELETEHOTLISTREQUEST = _descriptor.Descriptor(
+  name='DeleteHotlistRequest',
+  full_name='monorail.DeleteHotlistRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='hotlist_ref', full_name='monorail.DeleteHotlistRequest.hotlist_ref', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2156,
+  serialized_end=2221,
+)
+
+
+_DELETEHOTLISTRESPONSE = _descriptor.Descriptor(
+  name='DeleteHotlistResponse',
+  full_name='monorail.DeleteHotlistResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2223,
+  serialized_end=2246,
+)
+
+
+_PREDICTCOMPONENTREQUEST = _descriptor.Descriptor(
+  name='PredictComponentRequest',
+  full_name='monorail.PredictComponentRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='text', full_name='monorail.PredictComponentRequest.text', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.PredictComponentRequest.project_name', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2248,
+  serialized_end=2309,
+)
+
+
+_PREDICTCOMPONENTRESPONSE = _descriptor.Descriptor(
+  name='PredictComponentResponse',
+  full_name='monorail.PredictComponentResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='component_ref', full_name='monorail.PredictComponentResponse.component_ref', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2311,
+  serialized_end=2384,
+)
+
+_LISTHOTLISTSBYUSERREQUEST.fields_by_name['user'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_LISTHOTLISTSBYUSERRESPONSE.fields_by_name['hotlists'].message_type = api_dot_api__proto_dot_features__objects__pb2._HOTLIST
+_LISTHOTLISTSBYISSUEREQUEST.fields_by_name['issue'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_LISTHOTLISTSBYISSUERESPONSE.fields_by_name['hotlists'].message_type = api_dot_api__proto_dot_features__objects__pb2._HOTLIST
+_LISTRECENTLYVISITEDHOTLISTSRESPONSE.fields_by_name['hotlists'].message_type = api_dot_api__proto_dot_features__objects__pb2._HOTLIST
+_LISTSTARREDHOTLISTSRESPONSE.fields_by_name['hotlists'].message_type = api_dot_api__proto_dot_features__objects__pb2._HOTLIST
+_GETHOTLISTSTARCOUNTREQUEST.fields_by_name['hotlist_ref'].message_type = api_dot_api__proto_dot_common__pb2._HOTLISTREF
+_STARHOTLISTREQUEST.fields_by_name['hotlist_ref'].message_type = api_dot_api__proto_dot_common__pb2._HOTLISTREF
+_GETHOTLISTREQUEST.fields_by_name['hotlist_ref'].message_type = api_dot_api__proto_dot_common__pb2._HOTLISTREF
+_GETHOTLISTRESPONSE.fields_by_name['hotlist'].message_type = api_dot_api__proto_dot_features__objects__pb2._HOTLIST
+_LISTHOTLISTITEMSREQUEST.fields_by_name['hotlist_ref'].message_type = api_dot_api__proto_dot_common__pb2._HOTLISTREF
+_LISTHOTLISTITEMSREQUEST.fields_by_name['pagination'].message_type = api_dot_api__proto_dot_common__pb2._PAGINATION
+_LISTHOTLISTITEMSRESPONSE.fields_by_name['items'].message_type = api_dot_api__proto_dot_features__objects__pb2._HOTLISTITEM
+_CREATEHOTLISTREQUEST.fields_by_name['editor_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_CREATEHOTLISTREQUEST.fields_by_name['issue_refs'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_REMOVEISSUESFROMHOTLISTSREQUEST.fields_by_name['hotlist_refs'].message_type = api_dot_api__proto_dot_common__pb2._HOTLISTREF
+_REMOVEISSUESFROMHOTLISTSREQUEST.fields_by_name['issue_refs'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_ADDISSUESTOHOTLISTSREQUEST.fields_by_name['hotlist_refs'].message_type = api_dot_api__proto_dot_common__pb2._HOTLISTREF
+_ADDISSUESTOHOTLISTSREQUEST.fields_by_name['issue_refs'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_RERANKHOTLISTISSUESREQUEST.fields_by_name['hotlist_ref'].message_type = api_dot_api__proto_dot_common__pb2._HOTLISTREF
+_RERANKHOTLISTISSUESREQUEST.fields_by_name['moved_refs'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_RERANKHOTLISTISSUESREQUEST.fields_by_name['target_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_UPDATEHOTLISTISSUENOTEREQUEST.fields_by_name['hotlist_ref'].message_type = api_dot_api__proto_dot_common__pb2._HOTLISTREF
+_UPDATEHOTLISTISSUENOTEREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_DELETEHOTLISTREQUEST.fields_by_name['hotlist_ref'].message_type = api_dot_api__proto_dot_common__pb2._HOTLISTREF
+_PREDICTCOMPONENTRESPONSE.fields_by_name['component_ref'].message_type = api_dot_api__proto_dot_common__pb2._COMPONENTREF
+DESCRIPTOR.message_types_by_name['ListHotlistsByUserRequest'] = _LISTHOTLISTSBYUSERREQUEST
+DESCRIPTOR.message_types_by_name['ListHotlistsByUserResponse'] = _LISTHOTLISTSBYUSERRESPONSE
+DESCRIPTOR.message_types_by_name['ListHotlistsByIssueRequest'] = _LISTHOTLISTSBYISSUEREQUEST
+DESCRIPTOR.message_types_by_name['ListHotlistsByIssueResponse'] = _LISTHOTLISTSBYISSUERESPONSE
+DESCRIPTOR.message_types_by_name['ListRecentlyVisitedHotlistsRequest'] = _LISTRECENTLYVISITEDHOTLISTSREQUEST
+DESCRIPTOR.message_types_by_name['ListRecentlyVisitedHotlistsResponse'] = _LISTRECENTLYVISITEDHOTLISTSRESPONSE
+DESCRIPTOR.message_types_by_name['ListStarredHotlistsRequest'] = _LISTSTARREDHOTLISTSREQUEST
+DESCRIPTOR.message_types_by_name['ListStarredHotlistsResponse'] = _LISTSTARREDHOTLISTSRESPONSE
+DESCRIPTOR.message_types_by_name['GetHotlistStarCountRequest'] = _GETHOTLISTSTARCOUNTREQUEST
+DESCRIPTOR.message_types_by_name['GetHotlistStarCountResponse'] = _GETHOTLISTSTARCOUNTRESPONSE
+DESCRIPTOR.message_types_by_name['StarHotlistRequest'] = _STARHOTLISTREQUEST
+DESCRIPTOR.message_types_by_name['StarHotlistResponse'] = _STARHOTLISTRESPONSE
+DESCRIPTOR.message_types_by_name['GetHotlistRequest'] = _GETHOTLISTREQUEST
+DESCRIPTOR.message_types_by_name['GetHotlistResponse'] = _GETHOTLISTRESPONSE
+DESCRIPTOR.message_types_by_name['ListHotlistItemsRequest'] = _LISTHOTLISTITEMSREQUEST
+DESCRIPTOR.message_types_by_name['ListHotlistItemsResponse'] = _LISTHOTLISTITEMSRESPONSE
+DESCRIPTOR.message_types_by_name['CreateHotlistRequest'] = _CREATEHOTLISTREQUEST
+DESCRIPTOR.message_types_by_name['CreateHotlistResponse'] = _CREATEHOTLISTRESPONSE
+DESCRIPTOR.message_types_by_name['CheckHotlistNameRequest'] = _CHECKHOTLISTNAMEREQUEST
+DESCRIPTOR.message_types_by_name['CheckHotlistNameResponse'] = _CHECKHOTLISTNAMERESPONSE
+DESCRIPTOR.message_types_by_name['RemoveIssuesFromHotlistsRequest'] = _REMOVEISSUESFROMHOTLISTSREQUEST
+DESCRIPTOR.message_types_by_name['RemoveIssuesFromHotlistsResponse'] = _REMOVEISSUESFROMHOTLISTSRESPONSE
+DESCRIPTOR.message_types_by_name['AddIssuesToHotlistsRequest'] = _ADDISSUESTOHOTLISTSREQUEST
+DESCRIPTOR.message_types_by_name['AddIssuesToHotlistsResponse'] = _ADDISSUESTOHOTLISTSRESPONSE
+DESCRIPTOR.message_types_by_name['RerankHotlistIssuesRequest'] = _RERANKHOTLISTISSUESREQUEST
+DESCRIPTOR.message_types_by_name['RerankHotlistIssuesResponse'] = _RERANKHOTLISTISSUESRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateHotlistIssueNoteRequest'] = _UPDATEHOTLISTISSUENOTEREQUEST
+DESCRIPTOR.message_types_by_name['UpdateHotlistIssueNoteResponse'] = _UPDATEHOTLISTISSUENOTERESPONSE
+DESCRIPTOR.message_types_by_name['DeleteHotlistRequest'] = _DELETEHOTLISTREQUEST
+DESCRIPTOR.message_types_by_name['DeleteHotlistResponse'] = _DELETEHOTLISTRESPONSE
+DESCRIPTOR.message_types_by_name['PredictComponentRequest'] = _PREDICTCOMPONENTREQUEST
+DESCRIPTOR.message_types_by_name['PredictComponentResponse'] = _PREDICTCOMPONENTRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+ListHotlistsByUserRequest = _reflection.GeneratedProtocolMessageType('ListHotlistsByUserRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTHOTLISTSBYUSERREQUEST,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListHotlistsByUserRequest)
+  ))
+_sym_db.RegisterMessage(ListHotlistsByUserRequest)
+
+ListHotlistsByUserResponse = _reflection.GeneratedProtocolMessageType('ListHotlistsByUserResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTHOTLISTSBYUSERRESPONSE,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListHotlistsByUserResponse)
+  ))
+_sym_db.RegisterMessage(ListHotlistsByUserResponse)
+
+ListHotlistsByIssueRequest = _reflection.GeneratedProtocolMessageType('ListHotlistsByIssueRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTHOTLISTSBYISSUEREQUEST,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListHotlistsByIssueRequest)
+  ))
+_sym_db.RegisterMessage(ListHotlistsByIssueRequest)
+
+ListHotlistsByIssueResponse = _reflection.GeneratedProtocolMessageType('ListHotlistsByIssueResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTHOTLISTSBYISSUERESPONSE,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListHotlistsByIssueResponse)
+  ))
+_sym_db.RegisterMessage(ListHotlistsByIssueResponse)
+
+ListRecentlyVisitedHotlistsRequest = _reflection.GeneratedProtocolMessageType('ListRecentlyVisitedHotlistsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTRECENTLYVISITEDHOTLISTSREQUEST,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListRecentlyVisitedHotlistsRequest)
+  ))
+_sym_db.RegisterMessage(ListRecentlyVisitedHotlistsRequest)
+
+ListRecentlyVisitedHotlistsResponse = _reflection.GeneratedProtocolMessageType('ListRecentlyVisitedHotlistsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTRECENTLYVISITEDHOTLISTSRESPONSE,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListRecentlyVisitedHotlistsResponse)
+  ))
+_sym_db.RegisterMessage(ListRecentlyVisitedHotlistsResponse)
+
+ListStarredHotlistsRequest = _reflection.GeneratedProtocolMessageType('ListStarredHotlistsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTSTARREDHOTLISTSREQUEST,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListStarredHotlistsRequest)
+  ))
+_sym_db.RegisterMessage(ListStarredHotlistsRequest)
+
+ListStarredHotlistsResponse = _reflection.GeneratedProtocolMessageType('ListStarredHotlistsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTSTARREDHOTLISTSRESPONSE,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListStarredHotlistsResponse)
+  ))
+_sym_db.RegisterMessage(ListStarredHotlistsResponse)
+
+GetHotlistStarCountRequest = _reflection.GeneratedProtocolMessageType('GetHotlistStarCountRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETHOTLISTSTARCOUNTREQUEST,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetHotlistStarCountRequest)
+  ))
+_sym_db.RegisterMessage(GetHotlistStarCountRequest)
+
+GetHotlistStarCountResponse = _reflection.GeneratedProtocolMessageType('GetHotlistStarCountResponse', (_message.Message,), dict(
+  DESCRIPTOR = _GETHOTLISTSTARCOUNTRESPONSE,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetHotlistStarCountResponse)
+  ))
+_sym_db.RegisterMessage(GetHotlistStarCountResponse)
+
+StarHotlistRequest = _reflection.GeneratedProtocolMessageType('StarHotlistRequest', (_message.Message,), dict(
+  DESCRIPTOR = _STARHOTLISTREQUEST,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.StarHotlistRequest)
+  ))
+_sym_db.RegisterMessage(StarHotlistRequest)
+
+StarHotlistResponse = _reflection.GeneratedProtocolMessageType('StarHotlistResponse', (_message.Message,), dict(
+  DESCRIPTOR = _STARHOTLISTRESPONSE,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.StarHotlistResponse)
+  ))
+_sym_db.RegisterMessage(StarHotlistResponse)
+
+GetHotlistRequest = _reflection.GeneratedProtocolMessageType('GetHotlistRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETHOTLISTREQUEST,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetHotlistRequest)
+  ))
+_sym_db.RegisterMessage(GetHotlistRequest)
+
+GetHotlistResponse = _reflection.GeneratedProtocolMessageType('GetHotlistResponse', (_message.Message,), dict(
+  DESCRIPTOR = _GETHOTLISTRESPONSE,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetHotlistResponse)
+  ))
+_sym_db.RegisterMessage(GetHotlistResponse)
+
+ListHotlistItemsRequest = _reflection.GeneratedProtocolMessageType('ListHotlistItemsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTHOTLISTITEMSREQUEST,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListHotlistItemsRequest)
+  ))
+_sym_db.RegisterMessage(ListHotlistItemsRequest)
+
+ListHotlistItemsResponse = _reflection.GeneratedProtocolMessageType('ListHotlistItemsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTHOTLISTITEMSRESPONSE,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListHotlistItemsResponse)
+  ))
+_sym_db.RegisterMessage(ListHotlistItemsResponse)
+
+CreateHotlistRequest = _reflection.GeneratedProtocolMessageType('CreateHotlistRequest', (_message.Message,), dict(
+  DESCRIPTOR = _CREATEHOTLISTREQUEST,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.CreateHotlistRequest)
+  ))
+_sym_db.RegisterMessage(CreateHotlistRequest)
+
+CreateHotlistResponse = _reflection.GeneratedProtocolMessageType('CreateHotlistResponse', (_message.Message,), dict(
+  DESCRIPTOR = _CREATEHOTLISTRESPONSE,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.CreateHotlistResponse)
+  ))
+_sym_db.RegisterMessage(CreateHotlistResponse)
+
+CheckHotlistNameRequest = _reflection.GeneratedProtocolMessageType('CheckHotlistNameRequest', (_message.Message,), dict(
+  DESCRIPTOR = _CHECKHOTLISTNAMEREQUEST,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.CheckHotlistNameRequest)
+  ))
+_sym_db.RegisterMessage(CheckHotlistNameRequest)
+
+CheckHotlistNameResponse = _reflection.GeneratedProtocolMessageType('CheckHotlistNameResponse', (_message.Message,), dict(
+  DESCRIPTOR = _CHECKHOTLISTNAMERESPONSE,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.CheckHotlistNameResponse)
+  ))
+_sym_db.RegisterMessage(CheckHotlistNameResponse)
+
+RemoveIssuesFromHotlistsRequest = _reflection.GeneratedProtocolMessageType('RemoveIssuesFromHotlistsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _REMOVEISSUESFROMHOTLISTSREQUEST,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.RemoveIssuesFromHotlistsRequest)
+  ))
+_sym_db.RegisterMessage(RemoveIssuesFromHotlistsRequest)
+
+RemoveIssuesFromHotlistsResponse = _reflection.GeneratedProtocolMessageType('RemoveIssuesFromHotlistsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _REMOVEISSUESFROMHOTLISTSRESPONSE,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.RemoveIssuesFromHotlistsResponse)
+  ))
+_sym_db.RegisterMessage(RemoveIssuesFromHotlistsResponse)
+
+AddIssuesToHotlistsRequest = _reflection.GeneratedProtocolMessageType('AddIssuesToHotlistsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _ADDISSUESTOHOTLISTSREQUEST,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.AddIssuesToHotlistsRequest)
+  ))
+_sym_db.RegisterMessage(AddIssuesToHotlistsRequest)
+
+AddIssuesToHotlistsResponse = _reflection.GeneratedProtocolMessageType('AddIssuesToHotlistsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _ADDISSUESTOHOTLISTSRESPONSE,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.AddIssuesToHotlistsResponse)
+  ))
+_sym_db.RegisterMessage(AddIssuesToHotlistsResponse)
+
+RerankHotlistIssuesRequest = _reflection.GeneratedProtocolMessageType('RerankHotlistIssuesRequest', (_message.Message,), dict(
+  DESCRIPTOR = _RERANKHOTLISTISSUESREQUEST,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.RerankHotlistIssuesRequest)
+  ))
+_sym_db.RegisterMessage(RerankHotlistIssuesRequest)
+
+RerankHotlistIssuesResponse = _reflection.GeneratedProtocolMessageType('RerankHotlistIssuesResponse', (_message.Message,), dict(
+  DESCRIPTOR = _RERANKHOTLISTISSUESRESPONSE,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.RerankHotlistIssuesResponse)
+  ))
+_sym_db.RegisterMessage(RerankHotlistIssuesResponse)
+
+UpdateHotlistIssueNoteRequest = _reflection.GeneratedProtocolMessageType('UpdateHotlistIssueNoteRequest', (_message.Message,), dict(
+  DESCRIPTOR = _UPDATEHOTLISTISSUENOTEREQUEST,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.UpdateHotlistIssueNoteRequest)
+  ))
+_sym_db.RegisterMessage(UpdateHotlistIssueNoteRequest)
+
+UpdateHotlistIssueNoteResponse = _reflection.GeneratedProtocolMessageType('UpdateHotlistIssueNoteResponse', (_message.Message,), dict(
+  DESCRIPTOR = _UPDATEHOTLISTISSUENOTERESPONSE,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.UpdateHotlistIssueNoteResponse)
+  ))
+_sym_db.RegisterMessage(UpdateHotlistIssueNoteResponse)
+
+DeleteHotlistRequest = _reflection.GeneratedProtocolMessageType('DeleteHotlistRequest', (_message.Message,), dict(
+  DESCRIPTOR = _DELETEHOTLISTREQUEST,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.DeleteHotlistRequest)
+  ))
+_sym_db.RegisterMessage(DeleteHotlistRequest)
+
+DeleteHotlistResponse = _reflection.GeneratedProtocolMessageType('DeleteHotlistResponse', (_message.Message,), dict(
+  DESCRIPTOR = _DELETEHOTLISTRESPONSE,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.DeleteHotlistResponse)
+  ))
+_sym_db.RegisterMessage(DeleteHotlistResponse)
+
+PredictComponentRequest = _reflection.GeneratedProtocolMessageType('PredictComponentRequest', (_message.Message,), dict(
+  DESCRIPTOR = _PREDICTCOMPONENTREQUEST,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.PredictComponentRequest)
+  ))
+_sym_db.RegisterMessage(PredictComponentRequest)
+
+PredictComponentResponse = _reflection.GeneratedProtocolMessageType('PredictComponentResponse', (_message.Message,), dict(
+  DESCRIPTOR = _PREDICTCOMPONENTRESPONSE,
+  __module__ = 'api.api_proto.features_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.PredictComponentResponse)
+  ))
+_sym_db.RegisterMessage(PredictComponentResponse)
+
+
+
+_FEATURES = _descriptor.ServiceDescriptor(
+  name='Features',
+  full_name='monorail.Features',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  serialized_start=2387,
+  serialized_end=3960,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='ListHotlistsByUser',
+    full_name='monorail.Features.ListHotlistsByUser',
+    index=0,
+    containing_service=None,
+    input_type=_LISTHOTLISTSBYUSERREQUEST,
+    output_type=_LISTHOTLISTSBYUSERRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListHotlistsByIssue',
+    full_name='monorail.Features.ListHotlistsByIssue',
+    index=1,
+    containing_service=None,
+    input_type=_LISTHOTLISTSBYISSUEREQUEST,
+    output_type=_LISTHOTLISTSBYISSUERESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListRecentlyVisitedHotlists',
+    full_name='monorail.Features.ListRecentlyVisitedHotlists',
+    index=2,
+    containing_service=None,
+    input_type=_LISTRECENTLYVISITEDHOTLISTSREQUEST,
+    output_type=_LISTRECENTLYVISITEDHOTLISTSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListStarredHotlists',
+    full_name='monorail.Features.ListStarredHotlists',
+    index=3,
+    containing_service=None,
+    input_type=_LISTSTARREDHOTLISTSREQUEST,
+    output_type=_LISTSTARREDHOTLISTSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetHotlistStarCount',
+    full_name='monorail.Features.GetHotlistStarCount',
+    index=4,
+    containing_service=None,
+    input_type=_GETHOTLISTSTARCOUNTREQUEST,
+    output_type=_GETHOTLISTSTARCOUNTRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='StarHotlist',
+    full_name='monorail.Features.StarHotlist',
+    index=5,
+    containing_service=None,
+    input_type=_STARHOTLISTREQUEST,
+    output_type=_STARHOTLISTRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetHotlist',
+    full_name='monorail.Features.GetHotlist',
+    index=6,
+    containing_service=None,
+    input_type=_GETHOTLISTREQUEST,
+    output_type=_GETHOTLISTRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListHotlistItems',
+    full_name='monorail.Features.ListHotlistItems',
+    index=7,
+    containing_service=None,
+    input_type=_LISTHOTLISTITEMSREQUEST,
+    output_type=_LISTHOTLISTITEMSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CreateHotlist',
+    full_name='monorail.Features.CreateHotlist',
+    index=8,
+    containing_service=None,
+    input_type=_CREATEHOTLISTREQUEST,
+    output_type=_CREATEHOTLISTRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CheckHotlistName',
+    full_name='monorail.Features.CheckHotlistName',
+    index=9,
+    containing_service=None,
+    input_type=_CHECKHOTLISTNAMEREQUEST,
+    output_type=_CHECKHOTLISTNAMERESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='RemoveIssuesFromHotlists',
+    full_name='monorail.Features.RemoveIssuesFromHotlists',
+    index=10,
+    containing_service=None,
+    input_type=_REMOVEISSUESFROMHOTLISTSREQUEST,
+    output_type=_REMOVEISSUESFROMHOTLISTSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='AddIssuesToHotlists',
+    full_name='monorail.Features.AddIssuesToHotlists',
+    index=11,
+    containing_service=None,
+    input_type=_ADDISSUESTOHOTLISTSREQUEST,
+    output_type=_ADDISSUESTOHOTLISTSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='RerankHotlistIssues',
+    full_name='monorail.Features.RerankHotlistIssues',
+    index=12,
+    containing_service=None,
+    input_type=_RERANKHOTLISTISSUESREQUEST,
+    output_type=_RERANKHOTLISTISSUESRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UpdateHotlistIssueNote',
+    full_name='monorail.Features.UpdateHotlistIssueNote',
+    index=13,
+    containing_service=None,
+    input_type=_UPDATEHOTLISTISSUENOTEREQUEST,
+    output_type=_UPDATEHOTLISTISSUENOTERESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteHotlist',
+    full_name='monorail.Features.DeleteHotlist',
+    index=14,
+    containing_service=None,
+    input_type=_DELETEHOTLISTREQUEST,
+    output_type=_DELETEHOTLISTRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='PredictComponent',
+    full_name='monorail.Features.PredictComponent',
+    index=15,
+    containing_service=None,
+    input_type=_PREDICTCOMPONENTREQUEST,
+    output_type=_PREDICTCOMPONENTRESPONSE,
+    serialized_options=None,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_FEATURES)
+
+DESCRIPTOR.services_by_name['Features'] = _FEATURES
+
+# @@protoc_insertion_point(module_scope)
diff --git a/api/api_proto/features_prpc_pb2.py b/api/api_proto/features_prpc_pb2.py
new file mode 100644
index 0000000..17257e5
--- /dev/null
+++ b/api/api_proto/features_prpc_pb2.py
@@ -0,0 +1,274 @@
+# Generated by the pRPC protocol buffer compiler plugin.  DO NOT EDIT!
+# source: api/api_proto/features.proto
+
+import base64
+import zlib
+
+from google.protobuf import descriptor_pb2
+
+# Includes description of the api/api_proto/features.proto and all of its transitive
+# dependencies. Includes source code info.
+FILE_DESCRIPTOR_SET = descriptor_pb2.FileDescriptorSet()
+FILE_DESCRIPTOR_SET.ParseFromString(zlib.decompress(base64.b64decode(
+    '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')))
+_INDEX = {
+    f.name: {
+      'descriptor': f,
+      'services': {s.name: s for s in f.service},
+    }
+    for f in FILE_DESCRIPTOR_SET.file
+}
+
+
+FeaturesServiceDescription = {
+  'file_descriptor_set': FILE_DESCRIPTOR_SET,
+  'file_descriptor': _INDEX[u'api/api_proto/features.proto']['descriptor'],
+  'service_descriptor': _INDEX[u'api/api_proto/features.proto']['services'][u'Features'],
+}
diff --git a/api/api_proto/issue_objects.proto b/api/api_proto/issue_objects.proto
new file mode 100644
index 0000000..9343c98
--- /dev/null
+++ b/api/api_proto/issue_objects.proto
@@ -0,0 +1,207 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+// This file defines protobufs for issues and related business
+// objects, e.g., field values, comments, and attachments.
+
+syntax = "proto3";
+
+package monorail;
+
+import "google/protobuf/wrappers.proto";
+import "api/api_proto/common.proto";
+
+
+// Next available tag: 8
+message Approval {
+  FieldRef field_ref = 1;
+  repeated UserRef approver_refs = 2;
+  ApprovalStatus status = 3;
+  fixed32 set_on = 4;
+  UserRef setter_ref = 5;
+  PhaseRef phase_ref = 7;
+}
+
+
+// Next available tag: 8
+enum ApprovalStatus {
+  NOT_SET = 0;
+  NEEDS_REVIEW = 1;
+  NA = 2;
+  REVIEW_REQUESTED = 3;
+  REVIEW_STARTED = 4;
+  NEED_INFO = 5;
+  APPROVED = 6;
+  NOT_APPROVED = 7;
+}
+
+
+// This message is only suitable for displaying the amendment to users.
+// We don't currently offer structured amendments that client code can
+// reason about, field names can be ambiguous, and we don't have
+// old_value for most changes.
+// Next available tag: 4
+message Amendment {
+  // This may be the name of a built-in or custom field, or relative to
+  // an approval field name.
+  string field_name = 1;
+  // This may be a new value that overwrote the old value, e.g., "Assigned",
+  // or it may be a space-separated list of changes, e.g., "Size-L -Size-S".
+  string new_or_delta_value = 2;
+  // old_value is only used when the user changes the summary.
+  string old_value = 3;
+}
+
+
+// Next available tag: 9
+message Attachment {
+  uint64 attachment_id = 1;
+  string filename = 2;
+  uint64 size = 3;  // Size in bytes.
+  string content_type = 4;
+  bool is_deleted = 5;
+  string thumbnail_url = 6;
+  string view_url = 7;
+  string download_url = 8;
+}
+
+
+// Next available tag: 16
+message Comment {
+  string project_name = 1;
+  uint32 local_id = 2;
+  uint32 sequence_num = 3;
+  bool is_deleted = 4;
+  UserRef commenter = 5;
+  fixed32 timestamp = 6;
+  string content = 7;
+  string inbound_message = 8;
+  repeated Amendment amendments = 9;
+  repeated Attachment attachments = 10;
+  FieldRef approval_ref = 11;
+  // If set, this comment is an issue description.
+  uint32 description_num = 12;
+  bool is_spam = 13;
+  bool can_delete = 14;
+  bool can_flag = 15;
+}
+
+
+// Next available tag: 5
+message FieldValue {
+  FieldRef field_ref = 1;
+  string value = 2;
+  bool is_derived = 3;
+  PhaseRef phase_ref = 4;
+}
+
+
+// Next available tag: 28
+message Issue {
+  string project_name = 1;
+  uint32 local_id = 2;
+  string summary = 3;
+  StatusRef status_ref = 4;
+  UserRef owner_ref = 5;
+  repeated UserRef cc_refs = 6;
+  repeated LabelRef label_refs = 7;
+  repeated ComponentRef component_refs = 8;
+  repeated IssueRef blocked_on_issue_refs = 9;
+  repeated IssueRef blocking_issue_refs = 10;
+  repeated IssueRef dangling_blocked_on_refs = 23;
+  repeated IssueRef dangling_blocking_refs = 24;
+  IssueRef merged_into_issue_ref = 11;
+  repeated FieldValue field_values = 12;
+  bool is_deleted = 13;
+  UserRef reporter_ref = 14;
+  fixed32 opened_timestamp = 15;
+  fixed32 closed_timestamp = 16;
+  fixed32 modified_timestamp = 17;
+  fixed32 component_modified_timestamp = 25;
+  fixed32 status_modified_timestamp = 26;
+  fixed32 owner_modified_timestamp = 27;
+  uint32 star_count = 18;
+  bool is_spam = 19;
+  uint32 attachment_count = 20;
+  repeated Approval approval_values = 21;
+  repeated PhaseDef phases = 22;
+}
+
+
+// Next available tag: 18
+message IssueDelta {
+  // Note: We use StringValue instead of string so that we can
+  // check if delta.HasField('status').  Proto3 only allows that
+  // for nested messages and provides "boxed" values for this purpose.
+  // In JSON, a StringValue is represented as a simple string.
+  google.protobuf.StringValue status = 1;
+  UserRef owner_ref = 2;
+  repeated UserRef cc_refs_add = 3;
+  repeated UserRef cc_refs_remove = 4;
+  repeated ComponentRef comp_refs_add = 5;
+  repeated ComponentRef comp_refs_remove = 6;
+  repeated LabelRef label_refs_add = 7;
+  repeated LabelRef label_refs_remove = 8;
+  repeated FieldValue field_vals_add = 9;
+  repeated FieldValue field_vals_remove = 10;
+  repeated FieldRef fields_clear = 11;
+  repeated IssueRef blocked_on_refs_add = 12;
+  repeated IssueRef blocked_on_refs_remove = 13;
+  repeated IssueRef blocking_refs_add = 14;
+  repeated IssueRef blocking_refs_remove = 15;
+  IssueRef merged_into_ref = 16;
+  google.protobuf.StringValue summary = 17;
+}
+
+
+// Next available tag: 7
+message ApprovalDelta {
+  ApprovalStatus status = 1;
+  repeated UserRef approver_refs_add = 2;
+  repeated UserRef approver_refs_remove = 3;
+  repeated FieldValue field_vals_add = 4;
+  repeated FieldValue field_vals_remove = 5;
+  repeated FieldRef fields_clear = 6;
+}
+
+
+// Next available tag: 3
+message AttachmentUpload {
+  string filename = 1;
+  bytes content = 2;
+}
+
+
+// Next available tag: 4
+message IssueSummary {
+  string project_name = 1;
+  uint32 local_id = 2;
+  string summary = 3;
+}
+
+
+// Next available tag: 3
+message PhaseDef {
+  PhaseRef phase_ref = 1;
+  uint32 rank = 2;
+}
+
+
+// Next available tag: 2
+message PhaseRef {
+  string phase_name = 1;
+}
+
+
+// Next available tag: 7
+enum SearchScope {
+  ALL = 0;
+  NEW = 1;
+  OPEN = 2;
+  OWNED = 3;
+  REPORTED = 4;
+  STARRED = 5;
+  TO_VERIFY = 6;
+}
diff --git a/api/api_proto/issue_objects_pb2.py b/api/api_proto/issue_objects_pb2.py
new file mode 100644
index 0000000..fa347e1
--- /dev/null
+++ b/api/api_proto/issue_objects_pb2.py
@@ -0,0 +1,1232 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: api/api_proto/issue_objects.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
+from api.api_proto import common_pb2 as api_dot_api__proto_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='api/api_proto/issue_objects.proto',
+  package='monorail',
+  syntax='proto3',
+  serialized_options=None,
+  serialized_pb=_b('\n!api/api_proto/issue_objects.proto\x12\x08monorail\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1a\x61pi/api_proto/common.proto\"\xe3\x01\n\x08\x41pproval\x12%\n\tfield_ref\x18\x01 \x01(\x0b\x32\x12.monorail.FieldRef\x12(\n\rapprover_refs\x18\x02 \x03(\x0b\x32\x11.monorail.UserRef\x12(\n\x06status\x18\x03 \x01(\x0e\x32\x18.monorail.ApprovalStatus\x12\x0e\n\x06set_on\x18\x04 \x01(\x07\x12%\n\nsetter_ref\x18\x05 \x01(\x0b\x32\x11.monorail.UserRef\x12%\n\tphase_ref\x18\x07 \x01(\x0b\x32\x12.monorail.PhaseRef\"N\n\tAmendment\x12\x12\n\nfield_name\x18\x01 \x01(\t\x12\x1a\n\x12new_or_delta_value\x18\x02 \x01(\t\x12\x11\n\told_value\x18\x03 \x01(\t\"\xac\x01\n\nAttachment\x12\x15\n\rattachment_id\x18\x01 \x01(\x04\x12\x10\n\x08\x66ilename\x18\x02 \x01(\t\x12\x0c\n\x04size\x18\x03 \x01(\x04\x12\x14\n\x0c\x63ontent_type\x18\x04 \x01(\t\x12\x12\n\nis_deleted\x18\x05 \x01(\x08\x12\x15\n\rthumbnail_url\x18\x06 \x01(\t\x12\x10\n\x08view_url\x18\x07 \x01(\t\x12\x14\n\x0c\x64ownload_url\x18\x08 \x01(\t\"\x8c\x03\n\x07\x43omment\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x10\n\x08local_id\x18\x02 \x01(\r\x12\x14\n\x0csequence_num\x18\x03 \x01(\r\x12\x12\n\nis_deleted\x18\x04 \x01(\x08\x12$\n\tcommenter\x18\x05 \x01(\x0b\x32\x11.monorail.UserRef\x12\x11\n\ttimestamp\x18\x06 \x01(\x07\x12\x0f\n\x07\x63ontent\x18\x07 \x01(\t\x12\x17\n\x0finbound_message\x18\x08 \x01(\t\x12\'\n\namendments\x18\t \x03(\x0b\x32\x13.monorail.Amendment\x12)\n\x0b\x61ttachments\x18\n \x03(\x0b\x32\x14.monorail.Attachment\x12(\n\x0c\x61pproval_ref\x18\x0b \x01(\x0b\x32\x12.monorail.FieldRef\x12\x17\n\x0f\x64\x65scription_num\x18\x0c \x01(\r\x12\x0f\n\x07is_spam\x18\r \x01(\x08\x12\x12\n\ncan_delete\x18\x0e \x01(\x08\x12\x10\n\x08\x63\x61n_flag\x18\x0f \x01(\x08\"}\n\nFieldValue\x12%\n\tfield_ref\x18\x01 \x01(\x0b\x32\x12.monorail.FieldRef\x12\r\n\x05value\x18\x02 \x01(\t\x12\x12\n\nis_derived\x18\x03 \x01(\x08\x12%\n\tphase_ref\x18\x04 \x01(\x0b\x32\x12.monorail.PhaseRef\"\xc0\x07\n\x05Issue\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x10\n\x08local_id\x18\x02 \x01(\r\x12\x0f\n\x07summary\x18\x03 \x01(\t\x12\'\n\nstatus_ref\x18\x04 \x01(\x0b\x32\x13.monorail.StatusRef\x12$\n\towner_ref\x18\x05 \x01(\x0b\x32\x11.monorail.UserRef\x12\"\n\x07\x63\x63_refs\x18\x06 \x03(\x0b\x32\x11.monorail.UserRef\x12&\n\nlabel_refs\x18\x07 \x03(\x0b\x32\x12.monorail.LabelRef\x12.\n\x0e\x63omponent_refs\x18\x08 \x03(\x0b\x32\x16.monorail.ComponentRef\x12\x31\n\x15\x62locked_on_issue_refs\x18\t \x03(\x0b\x32\x12.monorail.IssueRef\x12/\n\x13\x62locking_issue_refs\x18\n \x03(\x0b\x32\x12.monorail.IssueRef\x12\x34\n\x18\x64\x61ngling_blocked_on_refs\x18\x17 \x03(\x0b\x32\x12.monorail.IssueRef\x12\x32\n\x16\x64\x61ngling_blocking_refs\x18\x18 \x03(\x0b\x32\x12.monorail.IssueRef\x12\x31\n\x15merged_into_issue_ref\x18\x0b \x01(\x0b\x32\x12.monorail.IssueRef\x12*\n\x0c\x66ield_values\x18\x0c \x03(\x0b\x32\x14.monorail.FieldValue\x12\x12\n\nis_deleted\x18\r \x01(\x08\x12\'\n\x0creporter_ref\x18\x0e \x01(\x0b\x32\x11.monorail.UserRef\x12\x18\n\x10opened_timestamp\x18\x0f \x01(\x07\x12\x18\n\x10\x63losed_timestamp\x18\x10 \x01(\x07\x12\x1a\n\x12modified_timestamp\x18\x11 \x01(\x07\x12$\n\x1c\x63omponent_modified_timestamp\x18\x19 \x01(\x07\x12!\n\x19status_modified_timestamp\x18\x1a \x01(\x07\x12 \n\x18owner_modified_timestamp\x18\x1b \x01(\x07\x12\x12\n\nstar_count\x18\x12 \x01(\r\x12\x0f\n\x07is_spam\x18\x13 \x01(\x08\x12\x18\n\x10\x61ttachment_count\x18\x14 \x01(\r\x12+\n\x0f\x61pproval_values\x18\x15 \x03(\x0b\x32\x12.monorail.Approval\x12\"\n\x06phases\x18\x16 \x03(\x0b\x32\x12.monorail.PhaseDef\"\x9a\x06\n\nIssueDelta\x12,\n\x06status\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12$\n\towner_ref\x18\x02 \x01(\x0b\x32\x11.monorail.UserRef\x12&\n\x0b\x63\x63_refs_add\x18\x03 \x03(\x0b\x32\x11.monorail.UserRef\x12)\n\x0e\x63\x63_refs_remove\x18\x04 \x03(\x0b\x32\x11.monorail.UserRef\x12-\n\rcomp_refs_add\x18\x05 \x03(\x0b\x32\x16.monorail.ComponentRef\x12\x30\n\x10\x63omp_refs_remove\x18\x06 \x03(\x0b\x32\x16.monorail.ComponentRef\x12*\n\x0elabel_refs_add\x18\x07 \x03(\x0b\x32\x12.monorail.LabelRef\x12-\n\x11label_refs_remove\x18\x08 \x03(\x0b\x32\x12.monorail.LabelRef\x12,\n\x0e\x66ield_vals_add\x18\t \x03(\x0b\x32\x14.monorail.FieldValue\x12/\n\x11\x66ield_vals_remove\x18\n \x03(\x0b\x32\x14.monorail.FieldValue\x12(\n\x0c\x66ields_clear\x18\x0b \x03(\x0b\x32\x12.monorail.FieldRef\x12/\n\x13\x62locked_on_refs_add\x18\x0c \x03(\x0b\x32\x12.monorail.IssueRef\x12\x32\n\x16\x62locked_on_refs_remove\x18\r \x03(\x0b\x32\x12.monorail.IssueRef\x12-\n\x11\x62locking_refs_add\x18\x0e \x03(\x0b\x32\x12.monorail.IssueRef\x12\x30\n\x14\x62locking_refs_remove\x18\x0f \x03(\x0b\x32\x12.monorail.IssueRef\x12+\n\x0fmerged_into_ref\x18\x10 \x01(\x0b\x32\x12.monorail.IssueRef\x12-\n\x07summary\x18\x11 \x01(\x0b\x32\x1c.google.protobuf.StringValue\"\xa1\x02\n\rApprovalDelta\x12(\n\x06status\x18\x01 \x01(\x0e\x32\x18.monorail.ApprovalStatus\x12,\n\x11\x61pprover_refs_add\x18\x02 \x03(\x0b\x32\x11.monorail.UserRef\x12/\n\x14\x61pprover_refs_remove\x18\x03 \x03(\x0b\x32\x11.monorail.UserRef\x12,\n\x0e\x66ield_vals_add\x18\x04 \x03(\x0b\x32\x14.monorail.FieldValue\x12/\n\x11\x66ield_vals_remove\x18\x05 \x03(\x0b\x32\x14.monorail.FieldValue\x12(\n\x0c\x66ields_clear\x18\x06 \x03(\x0b\x32\x12.monorail.FieldRef\"5\n\x10\x41ttachmentUpload\x12\x10\n\x08\x66ilename\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\x0c\"G\n\x0cIssueSummary\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12\x10\n\x08local_id\x18\x02 \x01(\r\x12\x0f\n\x07summary\x18\x03 \x01(\t\"?\n\x08PhaseDef\x12%\n\tphase_ref\x18\x01 \x01(\x0b\x32\x12.monorail.PhaseRef\x12\x0c\n\x04rank\x18\x02 \x01(\r\"\x1e\n\x08PhaseRef\x12\x12\n\nphase_name\x18\x01 \x01(\t*\x90\x01\n\x0e\x41pprovalStatus\x12\x0b\n\x07NOT_SET\x10\x00\x12\x10\n\x0cNEEDS_REVIEW\x10\x01\x12\x06\n\x02NA\x10\x02\x12\x14\n\x10REVIEW_REQUESTED\x10\x03\x12\x12\n\x0eREVIEW_STARTED\x10\x04\x12\r\n\tNEED_INFO\x10\x05\x12\x0c\n\x08\x41PPROVED\x10\x06\x12\x10\n\x0cNOT_APPROVED\x10\x07*^\n\x0bSearchScope\x12\x07\n\x03\x41LL\x10\x00\x12\x07\n\x03NEW\x10\x01\x12\x08\n\x04OPEN\x10\x02\x12\t\n\x05OWNED\x10\x03\x12\x0c\n\x08REPORTED\x10\x04\x12\x0b\n\x07STARRED\x10\x05\x12\r\n\tTO_VERIFY\x10\x06\x62\x06proto3')
+  ,
+  dependencies=[google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,api_dot_api__proto_dot_common__pb2.DESCRIPTOR,])
+
+_APPROVALSTATUS = _descriptor.EnumDescriptor(
+  name='ApprovalStatus',
+  full_name='monorail.ApprovalStatus',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='NOT_SET', index=0, number=0,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='NEEDS_REVIEW', index=1, number=1,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='NA', index=2, number=2,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='REVIEW_REQUESTED', index=3, number=3,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='REVIEW_STARTED', index=4, number=4,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='NEED_INFO', index=5, number=5,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='APPROVED', index=6, number=6,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='NOT_APPROVED', index=7, number=7,
+      serialized_options=None,
+      type=None),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=3396,
+  serialized_end=3540,
+)
+_sym_db.RegisterEnumDescriptor(_APPROVALSTATUS)
+
+ApprovalStatus = enum_type_wrapper.EnumTypeWrapper(_APPROVALSTATUS)
+_SEARCHSCOPE = _descriptor.EnumDescriptor(
+  name='SearchScope',
+  full_name='monorail.SearchScope',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='ALL', index=0, number=0,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='NEW', index=1, number=1,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='OPEN', index=2, number=2,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='OWNED', index=3, number=3,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='REPORTED', index=4, number=4,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='STARRED', index=5, number=5,
+      serialized_options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='TO_VERIFY', index=6, number=6,
+      serialized_options=None,
+      type=None),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=3542,
+  serialized_end=3636,
+)
+_sym_db.RegisterEnumDescriptor(_SEARCHSCOPE)
+
+SearchScope = enum_type_wrapper.EnumTypeWrapper(_SEARCHSCOPE)
+NOT_SET = 0
+NEEDS_REVIEW = 1
+NA = 2
+REVIEW_REQUESTED = 3
+REVIEW_STARTED = 4
+NEED_INFO = 5
+APPROVED = 6
+NOT_APPROVED = 7
+ALL = 0
+NEW = 1
+OPEN = 2
+OWNED = 3
+REPORTED = 4
+STARRED = 5
+TO_VERIFY = 6
+
+
+
+_APPROVAL = _descriptor.Descriptor(
+  name='Approval',
+  full_name='monorail.Approval',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='field_ref', full_name='monorail.Approval.field_ref', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='approver_refs', full_name='monorail.Approval.approver_refs', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='status', full_name='monorail.Approval.status', index=2,
+      number=3, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='set_on', full_name='monorail.Approval.set_on', index=3,
+      number=4, type=7, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='setter_ref', full_name='monorail.Approval.setter_ref', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='phase_ref', full_name='monorail.Approval.phase_ref', index=5,
+      number=7, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=108,
+  serialized_end=335,
+)
+
+
+_AMENDMENT = _descriptor.Descriptor(
+  name='Amendment',
+  full_name='monorail.Amendment',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='field_name', full_name='monorail.Amendment.field_name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='new_or_delta_value', full_name='monorail.Amendment.new_or_delta_value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='old_value', full_name='monorail.Amendment.old_value', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=337,
+  serialized_end=415,
+)
+
+
+_ATTACHMENT = _descriptor.Descriptor(
+  name='Attachment',
+  full_name='monorail.Attachment',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='attachment_id', full_name='monorail.Attachment.attachment_id', index=0,
+      number=1, type=4, cpp_type=4, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='filename', full_name='monorail.Attachment.filename', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='size', full_name='monorail.Attachment.size', index=2,
+      number=3, type=4, cpp_type=4, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='content_type', full_name='monorail.Attachment.content_type', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_deleted', full_name='monorail.Attachment.is_deleted', index=4,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='thumbnail_url', full_name='monorail.Attachment.thumbnail_url', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='view_url', full_name='monorail.Attachment.view_url', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='download_url', full_name='monorail.Attachment.download_url', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=418,
+  serialized_end=590,
+)
+
+
+_COMMENT = _descriptor.Descriptor(
+  name='Comment',
+  full_name='monorail.Comment',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.Comment.project_name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='local_id', full_name='monorail.Comment.local_id', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='sequence_num', full_name='monorail.Comment.sequence_num', index=2,
+      number=3, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_deleted', full_name='monorail.Comment.is_deleted', index=3,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='commenter', full_name='monorail.Comment.commenter', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='timestamp', full_name='monorail.Comment.timestamp', index=5,
+      number=6, type=7, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='content', full_name='monorail.Comment.content', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='inbound_message', full_name='monorail.Comment.inbound_message', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='amendments', full_name='monorail.Comment.amendments', index=8,
+      number=9, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='attachments', full_name='monorail.Comment.attachments', index=9,
+      number=10, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='approval_ref', full_name='monorail.Comment.approval_ref', index=10,
+      number=11, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='description_num', full_name='monorail.Comment.description_num', index=11,
+      number=12, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_spam', full_name='monorail.Comment.is_spam', index=12,
+      number=13, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='can_delete', full_name='monorail.Comment.can_delete', index=13,
+      number=14, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='can_flag', full_name='monorail.Comment.can_flag', index=14,
+      number=15, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=593,
+  serialized_end=989,
+)
+
+
+_FIELDVALUE = _descriptor.Descriptor(
+  name='FieldValue',
+  full_name='monorail.FieldValue',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='field_ref', full_name='monorail.FieldValue.field_ref', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='monorail.FieldValue.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_derived', full_name='monorail.FieldValue.is_derived', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='phase_ref', full_name='monorail.FieldValue.phase_ref', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=991,
+  serialized_end=1116,
+)
+
+
+_ISSUE = _descriptor.Descriptor(
+  name='Issue',
+  full_name='monorail.Issue',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.Issue.project_name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='local_id', full_name='monorail.Issue.local_id', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='summary', full_name='monorail.Issue.summary', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='status_ref', full_name='monorail.Issue.status_ref', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='owner_ref', full_name='monorail.Issue.owner_ref', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='cc_refs', full_name='monorail.Issue.cc_refs', index=5,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='label_refs', full_name='monorail.Issue.label_refs', index=6,
+      number=7, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='component_refs', full_name='monorail.Issue.component_refs', index=7,
+      number=8, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='blocked_on_issue_refs', full_name='monorail.Issue.blocked_on_issue_refs', index=8,
+      number=9, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='blocking_issue_refs', full_name='monorail.Issue.blocking_issue_refs', index=9,
+      number=10, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='dangling_blocked_on_refs', full_name='monorail.Issue.dangling_blocked_on_refs', index=10,
+      number=23, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='dangling_blocking_refs', full_name='monorail.Issue.dangling_blocking_refs', index=11,
+      number=24, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='merged_into_issue_ref', full_name='monorail.Issue.merged_into_issue_ref', index=12,
+      number=11, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='field_values', full_name='monorail.Issue.field_values', index=13,
+      number=12, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_deleted', full_name='monorail.Issue.is_deleted', index=14,
+      number=13, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='reporter_ref', full_name='monorail.Issue.reporter_ref', index=15,
+      number=14, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='opened_timestamp', full_name='monorail.Issue.opened_timestamp', index=16,
+      number=15, type=7, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='closed_timestamp', full_name='monorail.Issue.closed_timestamp', index=17,
+      number=16, type=7, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='modified_timestamp', full_name='monorail.Issue.modified_timestamp', index=18,
+      number=17, type=7, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='component_modified_timestamp', full_name='monorail.Issue.component_modified_timestamp', index=19,
+      number=25, type=7, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='status_modified_timestamp', full_name='monorail.Issue.status_modified_timestamp', index=20,
+      number=26, type=7, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='owner_modified_timestamp', full_name='monorail.Issue.owner_modified_timestamp', index=21,
+      number=27, type=7, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='star_count', full_name='monorail.Issue.star_count', index=22,
+      number=18, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_spam', full_name='monorail.Issue.is_spam', index=23,
+      number=19, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='attachment_count', full_name='monorail.Issue.attachment_count', index=24,
+      number=20, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='approval_values', full_name='monorail.Issue.approval_values', index=25,
+      number=21, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='phases', full_name='monorail.Issue.phases', index=26,
+      number=22, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1119,
+  serialized_end=2079,
+)
+
+
+_ISSUEDELTA = _descriptor.Descriptor(
+  name='IssueDelta',
+  full_name='monorail.IssueDelta',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='monorail.IssueDelta.status', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='owner_ref', full_name='monorail.IssueDelta.owner_ref', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='cc_refs_add', full_name='monorail.IssueDelta.cc_refs_add', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='cc_refs_remove', full_name='monorail.IssueDelta.cc_refs_remove', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='comp_refs_add', full_name='monorail.IssueDelta.comp_refs_add', index=4,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='comp_refs_remove', full_name='monorail.IssueDelta.comp_refs_remove', index=5,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='label_refs_add', full_name='monorail.IssueDelta.label_refs_add', index=6,
+      number=7, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='label_refs_remove', full_name='monorail.IssueDelta.label_refs_remove', index=7,
+      number=8, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='field_vals_add', full_name='monorail.IssueDelta.field_vals_add', index=8,
+      number=9, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='field_vals_remove', full_name='monorail.IssueDelta.field_vals_remove', index=9,
+      number=10, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='fields_clear', full_name='monorail.IssueDelta.fields_clear', index=10,
+      number=11, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='blocked_on_refs_add', full_name='monorail.IssueDelta.blocked_on_refs_add', index=11,
+      number=12, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='blocked_on_refs_remove', full_name='monorail.IssueDelta.blocked_on_refs_remove', index=12,
+      number=13, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='blocking_refs_add', full_name='monorail.IssueDelta.blocking_refs_add', index=13,
+      number=14, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='blocking_refs_remove', full_name='monorail.IssueDelta.blocking_refs_remove', index=14,
+      number=15, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='merged_into_ref', full_name='monorail.IssueDelta.merged_into_ref', index=15,
+      number=16, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='summary', full_name='monorail.IssueDelta.summary', index=16,
+      number=17, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2082,
+  serialized_end=2876,
+)
+
+
+_APPROVALDELTA = _descriptor.Descriptor(
+  name='ApprovalDelta',
+  full_name='monorail.ApprovalDelta',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='monorail.ApprovalDelta.status', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='approver_refs_add', full_name='monorail.ApprovalDelta.approver_refs_add', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='approver_refs_remove', full_name='monorail.ApprovalDelta.approver_refs_remove', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='field_vals_add', full_name='monorail.ApprovalDelta.field_vals_add', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='field_vals_remove', full_name='monorail.ApprovalDelta.field_vals_remove', index=4,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='fields_clear', full_name='monorail.ApprovalDelta.fields_clear', index=5,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2879,
+  serialized_end=3168,
+)
+
+
+_ATTACHMENTUPLOAD = _descriptor.Descriptor(
+  name='AttachmentUpload',
+  full_name='monorail.AttachmentUpload',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='filename', full_name='monorail.AttachmentUpload.filename', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='content', full_name='monorail.AttachmentUpload.content', index=1,
+      number=2, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3170,
+  serialized_end=3223,
+)
+
+
+_ISSUESUMMARY = _descriptor.Descriptor(
+  name='IssueSummary',
+  full_name='monorail.IssueSummary',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.IssueSummary.project_name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='local_id', full_name='monorail.IssueSummary.local_id', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='summary', full_name='monorail.IssueSummary.summary', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3225,
+  serialized_end=3296,
+)
+
+
+_PHASEDEF = _descriptor.Descriptor(
+  name='PhaseDef',
+  full_name='monorail.PhaseDef',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='phase_ref', full_name='monorail.PhaseDef.phase_ref', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='rank', full_name='monorail.PhaseDef.rank', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3298,
+  serialized_end=3361,
+)
+
+
+_PHASEREF = _descriptor.Descriptor(
+  name='PhaseRef',
+  full_name='monorail.PhaseRef',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='phase_name', full_name='monorail.PhaseRef.phase_name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3363,
+  serialized_end=3393,
+)
+
+_APPROVAL.fields_by_name['field_ref'].message_type = api_dot_api__proto_dot_common__pb2._FIELDREF
+_APPROVAL.fields_by_name['approver_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_APPROVAL.fields_by_name['status'].enum_type = _APPROVALSTATUS
+_APPROVAL.fields_by_name['setter_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_APPROVAL.fields_by_name['phase_ref'].message_type = _PHASEREF
+_COMMENT.fields_by_name['commenter'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_COMMENT.fields_by_name['amendments'].message_type = _AMENDMENT
+_COMMENT.fields_by_name['attachments'].message_type = _ATTACHMENT
+_COMMENT.fields_by_name['approval_ref'].message_type = api_dot_api__proto_dot_common__pb2._FIELDREF
+_FIELDVALUE.fields_by_name['field_ref'].message_type = api_dot_api__proto_dot_common__pb2._FIELDREF
+_FIELDVALUE.fields_by_name['phase_ref'].message_type = _PHASEREF
+_ISSUE.fields_by_name['status_ref'].message_type = api_dot_api__proto_dot_common__pb2._STATUSREF
+_ISSUE.fields_by_name['owner_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_ISSUE.fields_by_name['cc_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_ISSUE.fields_by_name['label_refs'].message_type = api_dot_api__proto_dot_common__pb2._LABELREF
+_ISSUE.fields_by_name['component_refs'].message_type = api_dot_api__proto_dot_common__pb2._COMPONENTREF
+_ISSUE.fields_by_name['blocked_on_issue_refs'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_ISSUE.fields_by_name['blocking_issue_refs'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_ISSUE.fields_by_name['dangling_blocked_on_refs'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_ISSUE.fields_by_name['dangling_blocking_refs'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_ISSUE.fields_by_name['merged_into_issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_ISSUE.fields_by_name['field_values'].message_type = _FIELDVALUE
+_ISSUE.fields_by_name['reporter_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_ISSUE.fields_by_name['approval_values'].message_type = _APPROVAL
+_ISSUE.fields_by_name['phases'].message_type = _PHASEDEF
+_ISSUEDELTA.fields_by_name['status'].message_type = google_dot_protobuf_dot_wrappers__pb2._STRINGVALUE
+_ISSUEDELTA.fields_by_name['owner_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_ISSUEDELTA.fields_by_name['cc_refs_add'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_ISSUEDELTA.fields_by_name['cc_refs_remove'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_ISSUEDELTA.fields_by_name['comp_refs_add'].message_type = api_dot_api__proto_dot_common__pb2._COMPONENTREF
+_ISSUEDELTA.fields_by_name['comp_refs_remove'].message_type = api_dot_api__proto_dot_common__pb2._COMPONENTREF
+_ISSUEDELTA.fields_by_name['label_refs_add'].message_type = api_dot_api__proto_dot_common__pb2._LABELREF
+_ISSUEDELTA.fields_by_name['label_refs_remove'].message_type = api_dot_api__proto_dot_common__pb2._LABELREF
+_ISSUEDELTA.fields_by_name['field_vals_add'].message_type = _FIELDVALUE
+_ISSUEDELTA.fields_by_name['field_vals_remove'].message_type = _FIELDVALUE
+_ISSUEDELTA.fields_by_name['fields_clear'].message_type = api_dot_api__proto_dot_common__pb2._FIELDREF
+_ISSUEDELTA.fields_by_name['blocked_on_refs_add'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_ISSUEDELTA.fields_by_name['blocked_on_refs_remove'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_ISSUEDELTA.fields_by_name['blocking_refs_add'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_ISSUEDELTA.fields_by_name['blocking_refs_remove'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_ISSUEDELTA.fields_by_name['merged_into_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_ISSUEDELTA.fields_by_name['summary'].message_type = google_dot_protobuf_dot_wrappers__pb2._STRINGVALUE
+_APPROVALDELTA.fields_by_name['status'].enum_type = _APPROVALSTATUS
+_APPROVALDELTA.fields_by_name['approver_refs_add'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_APPROVALDELTA.fields_by_name['approver_refs_remove'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_APPROVALDELTA.fields_by_name['field_vals_add'].message_type = _FIELDVALUE
+_APPROVALDELTA.fields_by_name['field_vals_remove'].message_type = _FIELDVALUE
+_APPROVALDELTA.fields_by_name['fields_clear'].message_type = api_dot_api__proto_dot_common__pb2._FIELDREF
+_PHASEDEF.fields_by_name['phase_ref'].message_type = _PHASEREF
+DESCRIPTOR.message_types_by_name['Approval'] = _APPROVAL
+DESCRIPTOR.message_types_by_name['Amendment'] = _AMENDMENT
+DESCRIPTOR.message_types_by_name['Attachment'] = _ATTACHMENT
+DESCRIPTOR.message_types_by_name['Comment'] = _COMMENT
+DESCRIPTOR.message_types_by_name['FieldValue'] = _FIELDVALUE
+DESCRIPTOR.message_types_by_name['Issue'] = _ISSUE
+DESCRIPTOR.message_types_by_name['IssueDelta'] = _ISSUEDELTA
+DESCRIPTOR.message_types_by_name['ApprovalDelta'] = _APPROVALDELTA
+DESCRIPTOR.message_types_by_name['AttachmentUpload'] = _ATTACHMENTUPLOAD
+DESCRIPTOR.message_types_by_name['IssueSummary'] = _ISSUESUMMARY
+DESCRIPTOR.message_types_by_name['PhaseDef'] = _PHASEDEF
+DESCRIPTOR.message_types_by_name['PhaseRef'] = _PHASEREF
+DESCRIPTOR.enum_types_by_name['ApprovalStatus'] = _APPROVALSTATUS
+DESCRIPTOR.enum_types_by_name['SearchScope'] = _SEARCHSCOPE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Approval = _reflection.GeneratedProtocolMessageType('Approval', (_message.Message,), dict(
+  DESCRIPTOR = _APPROVAL,
+  __module__ = 'api.api_proto.issue_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.Approval)
+  ))
+_sym_db.RegisterMessage(Approval)
+
+Amendment = _reflection.GeneratedProtocolMessageType('Amendment', (_message.Message,), dict(
+  DESCRIPTOR = _AMENDMENT,
+  __module__ = 'api.api_proto.issue_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.Amendment)
+  ))
+_sym_db.RegisterMessage(Amendment)
+
+Attachment = _reflection.GeneratedProtocolMessageType('Attachment', (_message.Message,), dict(
+  DESCRIPTOR = _ATTACHMENT,
+  __module__ = 'api.api_proto.issue_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.Attachment)
+  ))
+_sym_db.RegisterMessage(Attachment)
+
+Comment = _reflection.GeneratedProtocolMessageType('Comment', (_message.Message,), dict(
+  DESCRIPTOR = _COMMENT,
+  __module__ = 'api.api_proto.issue_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.Comment)
+  ))
+_sym_db.RegisterMessage(Comment)
+
+FieldValue = _reflection.GeneratedProtocolMessageType('FieldValue', (_message.Message,), dict(
+  DESCRIPTOR = _FIELDVALUE,
+  __module__ = 'api.api_proto.issue_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.FieldValue)
+  ))
+_sym_db.RegisterMessage(FieldValue)
+
+Issue = _reflection.GeneratedProtocolMessageType('Issue', (_message.Message,), dict(
+  DESCRIPTOR = _ISSUE,
+  __module__ = 'api.api_proto.issue_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.Issue)
+  ))
+_sym_db.RegisterMessage(Issue)
+
+IssueDelta = _reflection.GeneratedProtocolMessageType('IssueDelta', (_message.Message,), dict(
+  DESCRIPTOR = _ISSUEDELTA,
+  __module__ = 'api.api_proto.issue_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.IssueDelta)
+  ))
+_sym_db.RegisterMessage(IssueDelta)
+
+ApprovalDelta = _reflection.GeneratedProtocolMessageType('ApprovalDelta', (_message.Message,), dict(
+  DESCRIPTOR = _APPROVALDELTA,
+  __module__ = 'api.api_proto.issue_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ApprovalDelta)
+  ))
+_sym_db.RegisterMessage(ApprovalDelta)
+
+AttachmentUpload = _reflection.GeneratedProtocolMessageType('AttachmentUpload', (_message.Message,), dict(
+  DESCRIPTOR = _ATTACHMENTUPLOAD,
+  __module__ = 'api.api_proto.issue_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.AttachmentUpload)
+  ))
+_sym_db.RegisterMessage(AttachmentUpload)
+
+IssueSummary = _reflection.GeneratedProtocolMessageType('IssueSummary', (_message.Message,), dict(
+  DESCRIPTOR = _ISSUESUMMARY,
+  __module__ = 'api.api_proto.issue_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.IssueSummary)
+  ))
+_sym_db.RegisterMessage(IssueSummary)
+
+PhaseDef = _reflection.GeneratedProtocolMessageType('PhaseDef', (_message.Message,), dict(
+  DESCRIPTOR = _PHASEDEF,
+  __module__ = 'api.api_proto.issue_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.PhaseDef)
+  ))
+_sym_db.RegisterMessage(PhaseDef)
+
+PhaseRef = _reflection.GeneratedProtocolMessageType('PhaseRef', (_message.Message,), dict(
+  DESCRIPTOR = _PHASEREF,
+  __module__ = 'api.api_proto.issue_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.PhaseRef)
+  ))
+_sym_db.RegisterMessage(PhaseRef)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/api/api_proto/issue_objects_prpc_pb2.py b/api/api_proto/issue_objects_prpc_pb2.py
new file mode 100644
index 0000000..fe96e84
--- /dev/null
+++ b/api/api_proto/issue_objects_prpc_pb2.py
@@ -0,0 +1,4 @@
+# Generated by the pRPC protocol buffer compiler plugin.  DO NOT EDIT!
+# source: api/api_proto/issue_objects.proto
+
+from google.protobuf import descriptor_pb2
diff --git a/api/api_proto/issues.proto b/api/api_proto/issues.proto
new file mode 100644
index 0000000..7c39884
--- /dev/null
+++ b/api/api_proto/issues.proto
@@ -0,0 +1,417 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+syntax = "proto3";
+
+package monorail;
+
+import "google/protobuf/empty.proto";
+import "api/api_proto/common.proto";
+import "api/api_proto/issue_objects.proto";
+import "api/api_proto/project_objects.proto";
+
+
+service Issues {
+  rpc CreateIssue (CreateIssueRequest) returns (IssueResponse) {}
+  rpc GetIssue (GetIssueRequest) returns (IssueResponse) {}
+  rpc ListIssues (ListIssuesRequest) returns (ListIssuesResponse) {}
+  rpc ListReferencedIssues(ListReferencedIssuesRequest) returns (ListReferencedIssuesResponse) {}
+  rpc ListApplicableFieldDefs(ListApplicableFieldDefsRequest) returns (ListApplicableFieldDefsResponse) {}
+  rpc UpdateIssue (UpdateIssueRequest) returns (IssueResponse) {}
+  rpc StarIssue (StarIssueRequest) returns (StarIssueResponse) {}
+  rpc IsIssueStarred (IsIssueStarredRequest) returns (IsIssueStarredResponse) {}
+  rpc ListStarredIssues (ListStarredIssuesRequest) returns (ListStarredIssuesResponse) {}
+  // There is no CreateComment method because comments are created by updates,
+  // which may have just comment content and no delta.
+  // There is no GetComment method, clients should use ListComments.
+  rpc ListComments (ListCommentsRequest) returns (ListCommentsResponse) {}
+  rpc ListActivities (ListActivitiesRequest) returns (ListActivitiesResponse) {}
+  rpc DeleteComment (DeleteCommentRequest) returns (google.protobuf.Empty) {}
+  rpc BulkUpdateApprovals (BulkUpdateApprovalsRequest) returns (BulkUpdateApprovalsResponse) {}
+  rpc UpdateApproval (UpdateApprovalRequest) returns (UpdateApprovalResponse) {}
+  rpc ConvertIssueApprovalsTemplate (ConvertIssueApprovalsTemplateRequest) returns (ConvertIssueApprovalsTemplateResponse) {}
+  rpc IssueSnapshot (IssueSnapshotRequest) returns (IssueSnapshotResponse) {}
+  rpc PresubmitIssue (PresubmitIssueRequest) returns (PresubmitIssueResponse) {}
+  rpc RerankBlockedOnIssues (RerankBlockedOnIssuesRequest) returns (RerankBlockedOnIssuesResponse) {}
+  rpc DeleteIssue (DeleteIssueRequest) returns (DeleteIssueResponse) {}
+  rpc DeleteIssueComment (DeleteIssueCommentRequest) returns (DeleteIssueCommentResponse) {}
+  rpc DeleteAttachment (DeleteAttachmentRequest) returns (DeleteAttachmentResponse) {}
+  rpc FlagIssues (FlagIssuesRequest) returns (FlagIssuesResponse) {}
+  rpc FlagComment (FlagCommentRequest) returns (FlagCommentResponse) {}
+  rpc ListIssuePermissions (ListIssuePermissionsRequest) returns (ListIssuePermissionsResponse) {}
+  rpc MoveIssue (MoveIssueRequest) returns (MoveIssueResponse) {}
+  rpc CopyIssue (CopyIssueRequest) returns (CopyIssueResponse) {}
+}
+
+
+// Next available tag: 4
+message CreateIssueRequest {
+  string project_name = 2;
+  Issue issue = 3;
+}
+
+
+// Next available tag: 3
+message GetIssueRequest {
+  IssueRef issue_ref = 2;
+}
+
+
+// Next available tag: 3
+message IssueResponse {
+  Issue issue = 1;
+  IssueRef moved_to_ref = 2;
+}
+
+
+// Next available tag: 8
+message ListIssuesRequest {
+  string query = 2;
+  uint32 canned_query = 3;
+  repeated string project_names = 4;
+  Pagination pagination = 5;
+  string group_by_spec = 6;
+  string sort_spec = 7;
+}
+
+
+// Next available tag: 3
+message ListIssuesResponse {
+  repeated Issue issues = 1;
+  uint32 total_results = 2;
+}
+
+
+// Next available tag: 3
+message ListReferencedIssuesRequest {
+  repeated IssueRef issue_refs = 2;
+}
+
+
+// Next available tag: 2
+message ListReferencedIssuesResponse {
+  // TODO(ehmaldonado): monorail:4033 Rename these fields to issues rather than
+  // refs.
+  repeated Issue open_refs = 1;
+  repeated Issue closed_refs = 2;
+}
+
+
+// Next available tag: 3
+message ListApplicableFieldDefsRequest {
+  repeated IssueRef issue_refs = 2;
+}
+
+
+// Next available tag: 2
+message ListApplicableFieldDefsResponse {
+  repeated FieldDef field_defs = 1;
+}
+
+
+// Next available tag: 9
+message UpdateIssueRequest {
+  IssueRef issue_ref = 2;
+  bool send_email = 3;
+  IssueDelta delta = 4;
+  string comment_content = 5;
+  bool is_description = 6;
+  repeated AttachmentUpload uploads = 7;
+  repeated int64 kept_attachments = 8;
+}
+
+
+// Next available tag: 4
+message StarIssueRequest {
+  IssueRef issue_ref = 2;
+  bool starred = 3;  // True to add a star, False to remove one.
+}
+
+
+// Next available tag: 2
+message StarIssueResponse {
+  uint32 star_count = 1;
+}
+
+
+// Next available tag: 3
+message IsIssueStarredRequest {
+  IssueRef issue_ref = 2;
+}
+
+
+// Next available tag: 2
+message IsIssueStarredResponse {
+  bool is_starred = 1;
+}
+
+
+// Next available tag: 1
+message ListStarredIssuesRequest {
+}
+
+
+// Next available tag: 2
+message ListStarredIssuesResponse {
+  repeated IssueRef starred_issue_refs = 1;
+}
+
+
+// Next available tag: 3
+message ListCommentsRequest {
+  IssueRef issue_ref = 2;
+}
+
+
+// Next available tag: 2
+message ListCommentsResponse {
+  // Comments are in chronological order.  The list of comments may
+  // include deleted, spam, and description comments.  Spam and
+  // deleted comments will only have content supplied if the user is
+  // allowed to see it.
+  repeated Comment comments = 1;
+}
+
+
+// Next available tag: 5
+message ListActivitiesRequest {
+  // TODO(tyreej) description
+  UserRef user_ref = 2;
+  fixed32 before = 3;
+  fixed32 after = 4;
+}
+
+
+// Next available tag: 3
+message ListActivitiesResponse {
+  // TODO(tyreej) description
+  repeated Comment comments = 1;
+  repeated IssueSummary issue_summaries = 2;
+}
+
+
+// Next available tag: 5
+message DeleteCommentRequest {
+  IssueRef issue_ref = 2;
+  int64 sequence_num = 3;
+  bool delete = 4;  // True to delete, False to undelete.
+}
+
+
+// TODO: Consider eventually replacing calls to UpdateApprovalRequest
+// with BulkUpdateApprovalsRequest.
+// TODO: For now, block bulk attaching uploads and survey editing.
+// Next available tag: 7
+message BulkUpdateApprovalsRequest {
+  repeated IssueRef issue_refs = 2;
+  FieldRef field_ref = 3;
+  ApprovalDelta approval_delta = 4;
+  string comment_content = 5;
+  bool send_email = 6;
+}
+
+
+// Next available tag: 2
+message BulkUpdateApprovalsResponse {
+  repeated IssueRef issue_refs = 1;
+}
+
+
+// Next available tag: 10
+message UpdateApprovalRequest {
+  IssueRef issue_ref = 2;
+  FieldRef field_ref = 3;
+  ApprovalDelta approval_delta = 4;
+  string comment_content = 5;
+  bool send_email = 6;
+  bool is_description = 7;
+  repeated AttachmentUpload uploads = 8;
+  repeated int64 kept_attachments = 9;
+}
+
+
+// Next available tag: 2
+message UpdateApprovalResponse {
+  Approval approval = 1;
+  // TODO(jojwang): monorail:3895, add new_comment field.
+}
+
+
+// Next available tag: 6
+message ConvertIssueApprovalsTemplateRequest {
+  IssueRef issue_ref = 2;
+  string template_name = 3;
+  string comment_content = 4;
+  bool send_email = 5;
+}
+
+
+// Next available tag: 2
+message ConvertIssueApprovalsTemplateResponse {
+  Issue issue = 1;
+}
+
+
+// Next available tag: 9
+message IssueSnapshotRequest {
+  int32 timestamp = 2;
+  string query = 3;
+  int32 canned_query = 4;
+  string group_by = 5;
+  string label_prefix = 6;
+  string project_name = 7;
+  int32 hotlist_id = 8;
+}
+
+
+// Next available tag: 3
+message IssueSnapshotCount {
+  string dimension = 1;
+  int32 count = 2;
+}
+
+
+// Next available tag: 3
+message IssueSnapshotResponse {
+  repeated IssueSnapshotCount snapshot_count = 1;
+  repeated string unsupported_field = 2;
+  bool search_limit_reached = 3;
+}
+
+
+// Next available tag: 4
+message PresubmitIssueRequest {
+  IssueRef issue_ref = 2;
+  IssueDelta issue_delta = 3;
+}
+
+
+// Next available tag: 8
+message PresubmitIssueResponse {
+  string owner_availability = 1;
+  string owner_availability_state = 2;
+  repeated ValueAndWhy derived_labels = 3;
+  repeated ValueAndWhy derived_owners = 4;
+  repeated ValueAndWhy derived_ccs = 5;
+  repeated ValueAndWhy warnings = 6;
+  repeated ValueAndWhy errors = 7;
+}
+
+
+// Next available tag: 6
+message RerankBlockedOnIssuesRequest {
+  IssueRef issue_ref = 2;
+  IssueRef moved_ref = 3;
+  IssueRef target_ref = 4;
+  bool split_above = 5;
+}
+
+
+// Next available tag: 2
+message RerankBlockedOnIssuesResponse {
+  repeated IssueRef blocked_on_issue_refs = 1;
+}
+
+
+// Next available tag: 4
+message DeleteIssueRequest {
+  IssueRef issue_ref = 2;
+  bool delete = 3;
+}
+
+
+// Next available tag: 1
+message DeleteIssueResponse {
+}
+
+
+// Next available tag: 5
+message DeleteIssueCommentRequest {
+  IssueRef issue_ref = 2;
+  uint32 sequence_num = 3;
+  bool delete = 4;
+}
+
+
+// Next available tag: 1
+message DeleteIssueCommentResponse {
+}
+
+
+// Next available tag: 6
+message DeleteAttachmentRequest {
+  IssueRef issue_ref = 2;
+  uint32 sequence_num = 3;
+  uint32 attachment_id = 4;
+  bool delete = 5;
+}
+
+
+// Next available tag: 1
+message DeleteAttachmentResponse {
+}
+
+
+// Next available tag: 4
+message FlagIssuesRequest {
+  repeated IssueRef issue_refs = 2;
+  bool flag = 3;
+}
+
+
+// Next available tag: 1
+message FlagIssuesResponse {
+}
+
+
+// Next available tag: 5
+message FlagCommentRequest {
+  IssueRef issue_ref = 2;
+  uint32 sequence_num = 3;
+  bool flag = 4;
+}
+
+
+// Next available tag: 1
+message FlagCommentResponse {
+}
+
+
+// Next available tag: 3
+message ListIssuePermissionsRequest {
+  IssueRef issue_ref = 2;
+}
+
+
+// Next available tag: 2
+message ListIssuePermissionsResponse {
+  repeated string permissions = 1;
+}
+
+
+// Next available tag: 4
+message MoveIssueRequest {
+  IssueRef issue_ref = 2;
+  string target_project_name = 3;
+}
+
+
+// Next available tag: 2
+message MoveIssueResponse {
+  IssueRef new_issue_ref = 1;
+}
+
+
+// Next available tag: 4
+message CopyIssueRequest {
+  IssueRef issue_ref = 2;
+  string target_project_name = 3;
+}
+
+
+// Next available tag: 2
+message CopyIssueResponse {
+  IssueRef new_issue_ref = 1;
+}
diff --git a/api/api_proto/issues_pb2.py b/api/api_proto/issues_pb2.py
new file mode 100644
index 0000000..470fa21
--- /dev/null
+++ b/api/api_proto/issues_pb2.py
@@ -0,0 +1,2703 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: api/api_proto/issues.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from api.api_proto import common_pb2 as api_dot_api__proto_dot_common__pb2
+from api.api_proto import issue_objects_pb2 as api_dot_api__proto_dot_issue__objects__pb2
+from api.api_proto import project_objects_pb2 as api_dot_api__proto_dot_project__objects__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='api/api_proto/issues.proto',
+  package='monorail',
+  syntax='proto3',
+  serialized_options=None,
+  serialized_pb=_b('\n\x1a\x61pi/api_proto/issues.proto\x12\x08monorail\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1a\x61pi/api_proto/common.proto\x1a!api/api_proto/issue_objects.proto\x1a#api/api_proto/project_objects.proto\"J\n\x12\x43reateIssueRequest\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\x12\x1e\n\x05issue\x18\x03 \x01(\x0b\x32\x0f.monorail.Issue\"8\n\x0fGetIssueRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\"Y\n\rIssueResponse\x12\x1e\n\x05issue\x18\x01 \x01(\x0b\x32\x0f.monorail.Issue\x12(\n\x0cmoved_to_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\"\xa3\x01\n\x11ListIssuesRequest\x12\r\n\x05query\x18\x02 \x01(\t\x12\x14\n\x0c\x63\x61nned_query\x18\x03 \x01(\r\x12\x15\n\rproject_names\x18\x04 \x03(\t\x12(\n\npagination\x18\x05 \x01(\x0b\x32\x14.monorail.Pagination\x12\x15\n\rgroup_by_spec\x18\x06 \x01(\t\x12\x11\n\tsort_spec\x18\x07 \x01(\t\"L\n\x12ListIssuesResponse\x12\x1f\n\x06issues\x18\x01 \x03(\x0b\x32\x0f.monorail.Issue\x12\x15\n\rtotal_results\x18\x02 \x01(\r\"E\n\x1bListReferencedIssuesRequest\x12&\n\nissue_refs\x18\x02 \x03(\x0b\x32\x12.monorail.IssueRef\"h\n\x1cListReferencedIssuesResponse\x12\"\n\topen_refs\x18\x01 \x03(\x0b\x32\x0f.monorail.Issue\x12$\n\x0b\x63losed_refs\x18\x02 \x03(\x0b\x32\x0f.monorail.Issue\"H\n\x1eListApplicableFieldDefsRequest\x12&\n\nissue_refs\x18\x02 \x03(\x0b\x32\x12.monorail.IssueRef\"I\n\x1fListApplicableFieldDefsResponse\x12&\n\nfield_defs\x18\x01 \x03(\x0b\x32\x12.monorail.FieldDef\"\xec\x01\n\x12UpdateIssueRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\x12\x12\n\nsend_email\x18\x03 \x01(\x08\x12#\n\x05\x64\x65lta\x18\x04 \x01(\x0b\x32\x14.monorail.IssueDelta\x12\x17\n\x0f\x63omment_content\x18\x05 \x01(\t\x12\x16\n\x0eis_description\x18\x06 \x01(\x08\x12+\n\x07uploads\x18\x07 \x03(\x0b\x32\x1a.monorail.AttachmentUpload\x12\x18\n\x10kept_attachments\x18\x08 \x03(\x03\"J\n\x10StarIssueRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\x12\x0f\n\x07starred\x18\x03 \x01(\x08\"\'\n\x11StarIssueResponse\x12\x12\n\nstar_count\x18\x01 \x01(\r\">\n\x15IsIssueStarredRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\",\n\x16IsIssueStarredResponse\x12\x12\n\nis_starred\x18\x01 \x01(\x08\"\x1a\n\x18ListStarredIssuesRequest\"K\n\x19ListStarredIssuesResponse\x12.\n\x12starred_issue_refs\x18\x01 \x03(\x0b\x32\x12.monorail.IssueRef\"<\n\x13ListCommentsRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\";\n\x14ListCommentsResponse\x12#\n\x08\x63omments\x18\x01 \x03(\x0b\x32\x11.monorail.Comment\"[\n\x15ListActivitiesRequest\x12#\n\x08user_ref\x18\x02 \x01(\x0b\x32\x11.monorail.UserRef\x12\x0e\n\x06\x62\x65\x66ore\x18\x03 \x01(\x07\x12\r\n\x05\x61\x66ter\x18\x04 \x01(\x07\"n\n\x16ListActivitiesResponse\x12#\n\x08\x63omments\x18\x01 \x03(\x0b\x32\x11.monorail.Comment\x12/\n\x0fissue_summaries\x18\x02 \x03(\x0b\x32\x16.monorail.IssueSummary\"c\n\x14\x44\x65leteCommentRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\x12\x14\n\x0csequence_num\x18\x03 \x01(\x03\x12\x0e\n\x06\x64\x65lete\x18\x04 \x01(\x08\"\xc9\x01\n\x1a\x42ulkUpdateApprovalsRequest\x12&\n\nissue_refs\x18\x02 \x03(\x0b\x32\x12.monorail.IssueRef\x12%\n\tfield_ref\x18\x03 \x01(\x0b\x32\x12.monorail.FieldRef\x12/\n\x0e\x61pproval_delta\x18\x04 \x01(\x0b\x32\x17.monorail.ApprovalDelta\x12\x17\n\x0f\x63omment_content\x18\x05 \x01(\t\x12\x12\n\nsend_email\x18\x06 \x01(\x08\"E\n\x1b\x42ulkUpdateApprovalsResponse\x12&\n\nissue_refs\x18\x01 \x03(\x0b\x32\x12.monorail.IssueRef\"\xa2\x02\n\x15UpdateApprovalRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\x12%\n\tfield_ref\x18\x03 \x01(\x0b\x32\x12.monorail.FieldRef\x12/\n\x0e\x61pproval_delta\x18\x04 \x01(\x0b\x32\x17.monorail.ApprovalDelta\x12\x17\n\x0f\x63omment_content\x18\x05 \x01(\t\x12\x12\n\nsend_email\x18\x06 \x01(\x08\x12\x16\n\x0eis_description\x18\x07 \x01(\x08\x12+\n\x07uploads\x18\x08 \x03(\x0b\x32\x1a.monorail.AttachmentUpload\x12\x18\n\x10kept_attachments\x18\t \x03(\x03\">\n\x16UpdateApprovalResponse\x12$\n\x08\x61pproval\x18\x01 \x01(\x0b\x32\x12.monorail.Approval\"\x91\x01\n$ConvertIssueApprovalsTemplateRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\x12\x15\n\rtemplate_name\x18\x03 \x01(\t\x12\x17\n\x0f\x63omment_content\x18\x04 \x01(\t\x12\x12\n\nsend_email\x18\x05 \x01(\x08\"G\n%ConvertIssueApprovalsTemplateResponse\x12\x1e\n\x05issue\x18\x01 \x01(\x0b\x32\x0f.monorail.Issue\"\xa0\x01\n\x14IssueSnapshotRequest\x12\x11\n\ttimestamp\x18\x02 \x01(\x05\x12\r\n\x05query\x18\x03 \x01(\t\x12\x14\n\x0c\x63\x61nned_query\x18\x04 \x01(\x05\x12\x10\n\x08group_by\x18\x05 \x01(\t\x12\x14\n\x0clabel_prefix\x18\x06 \x01(\t\x12\x14\n\x0cproject_name\x18\x07 \x01(\t\x12\x12\n\nhotlist_id\x18\x08 \x01(\x05\"6\n\x12IssueSnapshotCount\x12\x11\n\tdimension\x18\x01 \x01(\t\x12\r\n\x05\x63ount\x18\x02 \x01(\x05\"\x86\x01\n\x15IssueSnapshotResponse\x12\x34\n\x0esnapshot_count\x18\x01 \x03(\x0b\x32\x1c.monorail.IssueSnapshotCount\x12\x19\n\x11unsupported_field\x18\x02 \x03(\t\x12\x1c\n\x14search_limit_reached\x18\x03 \x01(\x08\"i\n\x15PresubmitIssueRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\x12)\n\x0bissue_delta\x18\x03 \x01(\x0b\x32\x14.monorail.IssueDelta\"\xb0\x02\n\x16PresubmitIssueResponse\x12\x1a\n\x12owner_availability\x18\x01 \x01(\t\x12 \n\x18owner_availability_state\x18\x02 \x01(\t\x12-\n\x0e\x64\x65rived_labels\x18\x03 \x03(\x0b\x32\x15.monorail.ValueAndWhy\x12-\n\x0e\x64\x65rived_owners\x18\x04 \x03(\x0b\x32\x15.monorail.ValueAndWhy\x12*\n\x0b\x64\x65rived_ccs\x18\x05 \x03(\x0b\x32\x15.monorail.ValueAndWhy\x12\'\n\x08warnings\x18\x06 \x03(\x0b\x32\x15.monorail.ValueAndWhy\x12%\n\x06\x65rrors\x18\x07 \x03(\x0b\x32\x15.monorail.ValueAndWhy\"\xa9\x01\n\x1cRerankBlockedOnIssuesRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\x12%\n\tmoved_ref\x18\x03 \x01(\x0b\x32\x12.monorail.IssueRef\x12&\n\ntarget_ref\x18\x04 \x01(\x0b\x32\x12.monorail.IssueRef\x12\x13\n\x0bsplit_above\x18\x05 \x01(\x08\"R\n\x1dRerankBlockedOnIssuesResponse\x12\x31\n\x15\x62locked_on_issue_refs\x18\x01 \x03(\x0b\x32\x12.monorail.IssueRef\"K\n\x12\x44\x65leteIssueRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\x12\x0e\n\x06\x64\x65lete\x18\x03 \x01(\x08\"\x15\n\x13\x44\x65leteIssueResponse\"h\n\x19\x44\x65leteIssueCommentRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\x12\x14\n\x0csequence_num\x18\x03 \x01(\r\x12\x0e\n\x06\x64\x65lete\x18\x04 \x01(\x08\"\x1c\n\x1a\x44\x65leteIssueCommentResponse\"}\n\x17\x44\x65leteAttachmentRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\x12\x14\n\x0csequence_num\x18\x03 \x01(\r\x12\x15\n\rattachment_id\x18\x04 \x01(\r\x12\x0e\n\x06\x64\x65lete\x18\x05 \x01(\x08\"\x1a\n\x18\x44\x65leteAttachmentResponse\"I\n\x11\x46lagIssuesRequest\x12&\n\nissue_refs\x18\x02 \x03(\x0b\x32\x12.monorail.IssueRef\x12\x0c\n\x04\x66lag\x18\x03 \x01(\x08\"\x14\n\x12\x46lagIssuesResponse\"_\n\x12\x46lagCommentRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\x12\x14\n\x0csequence_num\x18\x03 \x01(\r\x12\x0c\n\x04\x66lag\x18\x04 \x01(\x08\"\x15\n\x13\x46lagCommentResponse\"D\n\x1bListIssuePermissionsRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\"3\n\x1cListIssuePermissionsResponse\x12\x13\n\x0bpermissions\x18\x01 \x03(\t\"V\n\x10MoveIssueRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\x12\x1b\n\x13target_project_name\x18\x03 \x01(\t\">\n\x11MoveIssueResponse\x12)\n\rnew_issue_ref\x18\x01 \x01(\x0b\x32\x12.monorail.IssueRef\"V\n\x10\x43opyIssueRequest\x12%\n\tissue_ref\x18\x02 \x01(\x0b\x32\x12.monorail.IssueRef\x12\x1b\n\x13target_project_name\x18\x03 \x01(\t\">\n\x11\x43opyIssueResponse\x12)\n\rnew_issue_ref\x18\x01 \x01(\x0b\x32\x12.monorail.IssueRef2\xeb\x11\n\x06Issues\x12\x46\n\x0b\x43reateIssue\x12\x1c.monorail.CreateIssueRequest\x1a\x17.monorail.IssueResponse\"\x00\x12@\n\x08GetIssue\x12\x19.monorail.GetIssueRequest\x1a\x17.monorail.IssueResponse\"\x00\x12I\n\nListIssues\x12\x1b.monorail.ListIssuesRequest\x1a\x1c.monorail.ListIssuesResponse\"\x00\x12g\n\x14ListReferencedIssues\x12%.monorail.ListReferencedIssuesRequest\x1a&.monorail.ListReferencedIssuesResponse\"\x00\x12p\n\x17ListApplicableFieldDefs\x12(.monorail.ListApplicableFieldDefsRequest\x1a).monorail.ListApplicableFieldDefsResponse\"\x00\x12\x46\n\x0bUpdateIssue\x12\x1c.monorail.UpdateIssueRequest\x1a\x17.monorail.IssueResponse\"\x00\x12\x46\n\tStarIssue\x12\x1a.monorail.StarIssueRequest\x1a\x1b.monorail.StarIssueResponse\"\x00\x12U\n\x0eIsIssueStarred\x12\x1f.monorail.IsIssueStarredRequest\x1a .monorail.IsIssueStarredResponse\"\x00\x12^\n\x11ListStarredIssues\x12\".monorail.ListStarredIssuesRequest\x1a#.monorail.ListStarredIssuesResponse\"\x00\x12O\n\x0cListComments\x12\x1d.monorail.ListCommentsRequest\x1a\x1e.monorail.ListCommentsResponse\"\x00\x12U\n\x0eListActivities\x12\x1f.monorail.ListActivitiesRequest\x1a .monorail.ListActivitiesResponse\"\x00\x12I\n\rDeleteComment\x12\x1e.monorail.DeleteCommentRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x64\n\x13\x42ulkUpdateApprovals\x12$.monorail.BulkUpdateApprovalsRequest\x1a%.monorail.BulkUpdateApprovalsResponse\"\x00\x12U\n\x0eUpdateApproval\x12\x1f.monorail.UpdateApprovalRequest\x1a .monorail.UpdateApprovalResponse\"\x00\x12\x82\x01\n\x1d\x43onvertIssueApprovalsTemplate\x12..monorail.ConvertIssueApprovalsTemplateRequest\x1a/.monorail.ConvertIssueApprovalsTemplateResponse\"\x00\x12R\n\rIssueSnapshot\x12\x1e.monorail.IssueSnapshotRequest\x1a\x1f.monorail.IssueSnapshotResponse\"\x00\x12U\n\x0ePresubmitIssue\x12\x1f.monorail.PresubmitIssueRequest\x1a .monorail.PresubmitIssueResponse\"\x00\x12j\n\x15RerankBlockedOnIssues\x12&.monorail.RerankBlockedOnIssuesRequest\x1a\'.monorail.RerankBlockedOnIssuesResponse\"\x00\x12L\n\x0b\x44\x65leteIssue\x12\x1c.monorail.DeleteIssueRequest\x1a\x1d.monorail.DeleteIssueResponse\"\x00\x12\x61\n\x12\x44\x65leteIssueComment\x12#.monorail.DeleteIssueCommentRequest\x1a$.monorail.DeleteIssueCommentResponse\"\x00\x12[\n\x10\x44\x65leteAttachment\x12!.monorail.DeleteAttachmentRequest\x1a\".monorail.DeleteAttachmentResponse\"\x00\x12I\n\nFlagIssues\x12\x1b.monorail.FlagIssuesRequest\x1a\x1c.monorail.FlagIssuesResponse\"\x00\x12L\n\x0b\x46lagComment\x12\x1c.monorail.FlagCommentRequest\x1a\x1d.monorail.FlagCommentResponse\"\x00\x12g\n\x14ListIssuePermissions\x12%.monorail.ListIssuePermissionsRequest\x1a&.monorail.ListIssuePermissionsResponse\"\x00\x12\x46\n\tMoveIssue\x12\x1a.monorail.MoveIssueRequest\x1a\x1b.monorail.MoveIssueResponse\"\x00\x12\x46\n\tCopyIssue\x12\x1a.monorail.CopyIssueRequest\x1a\x1b.monorail.CopyIssueResponse\"\x00\x62\x06proto3')
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,api_dot_api__proto_dot_common__pb2.DESCRIPTOR,api_dot_api__proto_dot_issue__objects__pb2.DESCRIPTOR,api_dot_api__proto_dot_project__objects__pb2.DESCRIPTOR,])
+
+
+
+
+_CREATEISSUEREQUEST = _descriptor.Descriptor(
+  name='CreateIssueRequest',
+  full_name='monorail.CreateIssueRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.CreateIssueRequest.project_name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='issue', full_name='monorail.CreateIssueRequest.issue', index=1,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=169,
+  serialized_end=243,
+)
+
+
+_GETISSUEREQUEST = _descriptor.Descriptor(
+  name='GetIssueRequest',
+  full_name='monorail.GetIssueRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.GetIssueRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=245,
+  serialized_end=301,
+)
+
+
+_ISSUERESPONSE = _descriptor.Descriptor(
+  name='IssueResponse',
+  full_name='monorail.IssueResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue', full_name='monorail.IssueResponse.issue', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='moved_to_ref', full_name='monorail.IssueResponse.moved_to_ref', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=303,
+  serialized_end=392,
+)
+
+
+_LISTISSUESREQUEST = _descriptor.Descriptor(
+  name='ListIssuesRequest',
+  full_name='monorail.ListIssuesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='query', full_name='monorail.ListIssuesRequest.query', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='canned_query', full_name='monorail.ListIssuesRequest.canned_query', index=1,
+      number=3, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='project_names', full_name='monorail.ListIssuesRequest.project_names', index=2,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='pagination', full_name='monorail.ListIssuesRequest.pagination', index=3,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='group_by_spec', full_name='monorail.ListIssuesRequest.group_by_spec', index=4,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='sort_spec', full_name='monorail.ListIssuesRequest.sort_spec', index=5,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=395,
+  serialized_end=558,
+)
+
+
+_LISTISSUESRESPONSE = _descriptor.Descriptor(
+  name='ListIssuesResponse',
+  full_name='monorail.ListIssuesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issues', full_name='monorail.ListIssuesResponse.issues', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='total_results', full_name='monorail.ListIssuesResponse.total_results', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=560,
+  serialized_end=636,
+)
+
+
+_LISTREFERENCEDISSUESREQUEST = _descriptor.Descriptor(
+  name='ListReferencedIssuesRequest',
+  full_name='monorail.ListReferencedIssuesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_refs', full_name='monorail.ListReferencedIssuesRequest.issue_refs', index=0,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=638,
+  serialized_end=707,
+)
+
+
+_LISTREFERENCEDISSUESRESPONSE = _descriptor.Descriptor(
+  name='ListReferencedIssuesResponse',
+  full_name='monorail.ListReferencedIssuesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='open_refs', full_name='monorail.ListReferencedIssuesResponse.open_refs', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='closed_refs', full_name='monorail.ListReferencedIssuesResponse.closed_refs', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=709,
+  serialized_end=813,
+)
+
+
+_LISTAPPLICABLEFIELDDEFSREQUEST = _descriptor.Descriptor(
+  name='ListApplicableFieldDefsRequest',
+  full_name='monorail.ListApplicableFieldDefsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_refs', full_name='monorail.ListApplicableFieldDefsRequest.issue_refs', index=0,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=815,
+  serialized_end=887,
+)
+
+
+_LISTAPPLICABLEFIELDDEFSRESPONSE = _descriptor.Descriptor(
+  name='ListApplicableFieldDefsResponse',
+  full_name='monorail.ListApplicableFieldDefsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='field_defs', full_name='monorail.ListApplicableFieldDefsResponse.field_defs', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=889,
+  serialized_end=962,
+)
+
+
+_UPDATEISSUEREQUEST = _descriptor.Descriptor(
+  name='UpdateIssueRequest',
+  full_name='monorail.UpdateIssueRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.UpdateIssueRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='send_email', full_name='monorail.UpdateIssueRequest.send_email', index=1,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='delta', full_name='monorail.UpdateIssueRequest.delta', index=2,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='comment_content', full_name='monorail.UpdateIssueRequest.comment_content', index=3,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_description', full_name='monorail.UpdateIssueRequest.is_description', index=4,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='uploads', full_name='monorail.UpdateIssueRequest.uploads', index=5,
+      number=7, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='kept_attachments', full_name='monorail.UpdateIssueRequest.kept_attachments', index=6,
+      number=8, type=3, cpp_type=2, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=965,
+  serialized_end=1201,
+)
+
+
+_STARISSUEREQUEST = _descriptor.Descriptor(
+  name='StarIssueRequest',
+  full_name='monorail.StarIssueRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.StarIssueRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='starred', full_name='monorail.StarIssueRequest.starred', index=1,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1203,
+  serialized_end=1277,
+)
+
+
+_STARISSUERESPONSE = _descriptor.Descriptor(
+  name='StarIssueResponse',
+  full_name='monorail.StarIssueResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='star_count', full_name='monorail.StarIssueResponse.star_count', index=0,
+      number=1, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1279,
+  serialized_end=1318,
+)
+
+
+_ISISSUESTARREDREQUEST = _descriptor.Descriptor(
+  name='IsIssueStarredRequest',
+  full_name='monorail.IsIssueStarredRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.IsIssueStarredRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1320,
+  serialized_end=1382,
+)
+
+
+_ISISSUESTARREDRESPONSE = _descriptor.Descriptor(
+  name='IsIssueStarredResponse',
+  full_name='monorail.IsIssueStarredResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='is_starred', full_name='monorail.IsIssueStarredResponse.is_starred', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1384,
+  serialized_end=1428,
+)
+
+
+_LISTSTARREDISSUESREQUEST = _descriptor.Descriptor(
+  name='ListStarredIssuesRequest',
+  full_name='monorail.ListStarredIssuesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1430,
+  serialized_end=1456,
+)
+
+
+_LISTSTARREDISSUESRESPONSE = _descriptor.Descriptor(
+  name='ListStarredIssuesResponse',
+  full_name='monorail.ListStarredIssuesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='starred_issue_refs', full_name='monorail.ListStarredIssuesResponse.starred_issue_refs', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1458,
+  serialized_end=1533,
+)
+
+
+_LISTCOMMENTSREQUEST = _descriptor.Descriptor(
+  name='ListCommentsRequest',
+  full_name='monorail.ListCommentsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.ListCommentsRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1535,
+  serialized_end=1595,
+)
+
+
+_LISTCOMMENTSRESPONSE = _descriptor.Descriptor(
+  name='ListCommentsResponse',
+  full_name='monorail.ListCommentsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='comments', full_name='monorail.ListCommentsResponse.comments', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1597,
+  serialized_end=1656,
+)
+
+
+_LISTACTIVITIESREQUEST = _descriptor.Descriptor(
+  name='ListActivitiesRequest',
+  full_name='monorail.ListActivitiesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_ref', full_name='monorail.ListActivitiesRequest.user_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='before', full_name='monorail.ListActivitiesRequest.before', index=1,
+      number=3, type=7, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='after', full_name='monorail.ListActivitiesRequest.after', index=2,
+      number=4, type=7, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1658,
+  serialized_end=1749,
+)
+
+
+_LISTACTIVITIESRESPONSE = _descriptor.Descriptor(
+  name='ListActivitiesResponse',
+  full_name='monorail.ListActivitiesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='comments', full_name='monorail.ListActivitiesResponse.comments', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='issue_summaries', full_name='monorail.ListActivitiesResponse.issue_summaries', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1751,
+  serialized_end=1861,
+)
+
+
+_DELETECOMMENTREQUEST = _descriptor.Descriptor(
+  name='DeleteCommentRequest',
+  full_name='monorail.DeleteCommentRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.DeleteCommentRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='sequence_num', full_name='monorail.DeleteCommentRequest.sequence_num', index=1,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='delete', full_name='monorail.DeleteCommentRequest.delete', index=2,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1863,
+  serialized_end=1962,
+)
+
+
+_BULKUPDATEAPPROVALSREQUEST = _descriptor.Descriptor(
+  name='BulkUpdateApprovalsRequest',
+  full_name='monorail.BulkUpdateApprovalsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_refs', full_name='monorail.BulkUpdateApprovalsRequest.issue_refs', index=0,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='field_ref', full_name='monorail.BulkUpdateApprovalsRequest.field_ref', index=1,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='approval_delta', full_name='monorail.BulkUpdateApprovalsRequest.approval_delta', index=2,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='comment_content', full_name='monorail.BulkUpdateApprovalsRequest.comment_content', index=3,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='send_email', full_name='monorail.BulkUpdateApprovalsRequest.send_email', index=4,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1965,
+  serialized_end=2166,
+)
+
+
+_BULKUPDATEAPPROVALSRESPONSE = _descriptor.Descriptor(
+  name='BulkUpdateApprovalsResponse',
+  full_name='monorail.BulkUpdateApprovalsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_refs', full_name='monorail.BulkUpdateApprovalsResponse.issue_refs', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2168,
+  serialized_end=2237,
+)
+
+
+_UPDATEAPPROVALREQUEST = _descriptor.Descriptor(
+  name='UpdateApprovalRequest',
+  full_name='monorail.UpdateApprovalRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.UpdateApprovalRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='field_ref', full_name='monorail.UpdateApprovalRequest.field_ref', index=1,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='approval_delta', full_name='monorail.UpdateApprovalRequest.approval_delta', index=2,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='comment_content', full_name='monorail.UpdateApprovalRequest.comment_content', index=3,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='send_email', full_name='monorail.UpdateApprovalRequest.send_email', index=4,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_description', full_name='monorail.UpdateApprovalRequest.is_description', index=5,
+      number=7, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='uploads', full_name='monorail.UpdateApprovalRequest.uploads', index=6,
+      number=8, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='kept_attachments', full_name='monorail.UpdateApprovalRequest.kept_attachments', index=7,
+      number=9, type=3, cpp_type=2, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2240,
+  serialized_end=2530,
+)
+
+
+_UPDATEAPPROVALRESPONSE = _descriptor.Descriptor(
+  name='UpdateApprovalResponse',
+  full_name='monorail.UpdateApprovalResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='approval', full_name='monorail.UpdateApprovalResponse.approval', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2532,
+  serialized_end=2594,
+)
+
+
+_CONVERTISSUEAPPROVALSTEMPLATEREQUEST = _descriptor.Descriptor(
+  name='ConvertIssueApprovalsTemplateRequest',
+  full_name='monorail.ConvertIssueApprovalsTemplateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.ConvertIssueApprovalsTemplateRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='template_name', full_name='monorail.ConvertIssueApprovalsTemplateRequest.template_name', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='comment_content', full_name='monorail.ConvertIssueApprovalsTemplateRequest.comment_content', index=2,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='send_email', full_name='monorail.ConvertIssueApprovalsTemplateRequest.send_email', index=3,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2597,
+  serialized_end=2742,
+)
+
+
+_CONVERTISSUEAPPROVALSTEMPLATERESPONSE = _descriptor.Descriptor(
+  name='ConvertIssueApprovalsTemplateResponse',
+  full_name='monorail.ConvertIssueApprovalsTemplateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue', full_name='monorail.ConvertIssueApprovalsTemplateResponse.issue', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2744,
+  serialized_end=2815,
+)
+
+
+_ISSUESNAPSHOTREQUEST = _descriptor.Descriptor(
+  name='IssueSnapshotRequest',
+  full_name='monorail.IssueSnapshotRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='timestamp', full_name='monorail.IssueSnapshotRequest.timestamp', index=0,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='query', full_name='monorail.IssueSnapshotRequest.query', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='canned_query', full_name='monorail.IssueSnapshotRequest.canned_query', index=2,
+      number=4, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='group_by', full_name='monorail.IssueSnapshotRequest.group_by', index=3,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='label_prefix', full_name='monorail.IssueSnapshotRequest.label_prefix', index=4,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.IssueSnapshotRequest.project_name', index=5,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='hotlist_id', full_name='monorail.IssueSnapshotRequest.hotlist_id', index=6,
+      number=8, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2818,
+  serialized_end=2978,
+)
+
+
+_ISSUESNAPSHOTCOUNT = _descriptor.Descriptor(
+  name='IssueSnapshotCount',
+  full_name='monorail.IssueSnapshotCount',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='dimension', full_name='monorail.IssueSnapshotCount.dimension', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='count', full_name='monorail.IssueSnapshotCount.count', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2980,
+  serialized_end=3034,
+)
+
+
+_ISSUESNAPSHOTRESPONSE = _descriptor.Descriptor(
+  name='IssueSnapshotResponse',
+  full_name='monorail.IssueSnapshotResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='snapshot_count', full_name='monorail.IssueSnapshotResponse.snapshot_count', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='unsupported_field', full_name='monorail.IssueSnapshotResponse.unsupported_field', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='search_limit_reached', full_name='monorail.IssueSnapshotResponse.search_limit_reached', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3037,
+  serialized_end=3171,
+)
+
+
+_PRESUBMITISSUEREQUEST = _descriptor.Descriptor(
+  name='PresubmitIssueRequest',
+  full_name='monorail.PresubmitIssueRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.PresubmitIssueRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='issue_delta', full_name='monorail.PresubmitIssueRequest.issue_delta', index=1,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3173,
+  serialized_end=3278,
+)
+
+
+_PRESUBMITISSUERESPONSE = _descriptor.Descriptor(
+  name='PresubmitIssueResponse',
+  full_name='monorail.PresubmitIssueResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='owner_availability', full_name='monorail.PresubmitIssueResponse.owner_availability', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='owner_availability_state', full_name='monorail.PresubmitIssueResponse.owner_availability_state', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='derived_labels', full_name='monorail.PresubmitIssueResponse.derived_labels', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='derived_owners', full_name='monorail.PresubmitIssueResponse.derived_owners', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='derived_ccs', full_name='monorail.PresubmitIssueResponse.derived_ccs', index=4,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='warnings', full_name='monorail.PresubmitIssueResponse.warnings', index=5,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='errors', full_name='monorail.PresubmitIssueResponse.errors', index=6,
+      number=7, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3281,
+  serialized_end=3585,
+)
+
+
+_RERANKBLOCKEDONISSUESREQUEST = _descriptor.Descriptor(
+  name='RerankBlockedOnIssuesRequest',
+  full_name='monorail.RerankBlockedOnIssuesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.RerankBlockedOnIssuesRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='moved_ref', full_name='monorail.RerankBlockedOnIssuesRequest.moved_ref', index=1,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='target_ref', full_name='monorail.RerankBlockedOnIssuesRequest.target_ref', index=2,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='split_above', full_name='monorail.RerankBlockedOnIssuesRequest.split_above', index=3,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3588,
+  serialized_end=3757,
+)
+
+
+_RERANKBLOCKEDONISSUESRESPONSE = _descriptor.Descriptor(
+  name='RerankBlockedOnIssuesResponse',
+  full_name='monorail.RerankBlockedOnIssuesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='blocked_on_issue_refs', full_name='monorail.RerankBlockedOnIssuesResponse.blocked_on_issue_refs', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3759,
+  serialized_end=3841,
+)
+
+
+_DELETEISSUEREQUEST = _descriptor.Descriptor(
+  name='DeleteIssueRequest',
+  full_name='monorail.DeleteIssueRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.DeleteIssueRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='delete', full_name='monorail.DeleteIssueRequest.delete', index=1,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3843,
+  serialized_end=3918,
+)
+
+
+_DELETEISSUERESPONSE = _descriptor.Descriptor(
+  name='DeleteIssueResponse',
+  full_name='monorail.DeleteIssueResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3920,
+  serialized_end=3941,
+)
+
+
+_DELETEISSUECOMMENTREQUEST = _descriptor.Descriptor(
+  name='DeleteIssueCommentRequest',
+  full_name='monorail.DeleteIssueCommentRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.DeleteIssueCommentRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='sequence_num', full_name='monorail.DeleteIssueCommentRequest.sequence_num', index=1,
+      number=3, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='delete', full_name='monorail.DeleteIssueCommentRequest.delete', index=2,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3943,
+  serialized_end=4047,
+)
+
+
+_DELETEISSUECOMMENTRESPONSE = _descriptor.Descriptor(
+  name='DeleteIssueCommentResponse',
+  full_name='monorail.DeleteIssueCommentResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4049,
+  serialized_end=4077,
+)
+
+
+_DELETEATTACHMENTREQUEST = _descriptor.Descriptor(
+  name='DeleteAttachmentRequest',
+  full_name='monorail.DeleteAttachmentRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.DeleteAttachmentRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='sequence_num', full_name='monorail.DeleteAttachmentRequest.sequence_num', index=1,
+      number=3, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='attachment_id', full_name='monorail.DeleteAttachmentRequest.attachment_id', index=2,
+      number=4, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='delete', full_name='monorail.DeleteAttachmentRequest.delete', index=3,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4079,
+  serialized_end=4204,
+)
+
+
+_DELETEATTACHMENTRESPONSE = _descriptor.Descriptor(
+  name='DeleteAttachmentResponse',
+  full_name='monorail.DeleteAttachmentResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4206,
+  serialized_end=4232,
+)
+
+
+_FLAGISSUESREQUEST = _descriptor.Descriptor(
+  name='FlagIssuesRequest',
+  full_name='monorail.FlagIssuesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_refs', full_name='monorail.FlagIssuesRequest.issue_refs', index=0,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='flag', full_name='monorail.FlagIssuesRequest.flag', index=1,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4234,
+  serialized_end=4307,
+)
+
+
+_FLAGISSUESRESPONSE = _descriptor.Descriptor(
+  name='FlagIssuesResponse',
+  full_name='monorail.FlagIssuesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4309,
+  serialized_end=4329,
+)
+
+
+_FLAGCOMMENTREQUEST = _descriptor.Descriptor(
+  name='FlagCommentRequest',
+  full_name='monorail.FlagCommentRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.FlagCommentRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='sequence_num', full_name='monorail.FlagCommentRequest.sequence_num', index=1,
+      number=3, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='flag', full_name='monorail.FlagCommentRequest.flag', index=2,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4331,
+  serialized_end=4426,
+)
+
+
+_FLAGCOMMENTRESPONSE = _descriptor.Descriptor(
+  name='FlagCommentResponse',
+  full_name='monorail.FlagCommentResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4428,
+  serialized_end=4449,
+)
+
+
+_LISTISSUEPERMISSIONSREQUEST = _descriptor.Descriptor(
+  name='ListIssuePermissionsRequest',
+  full_name='monorail.ListIssuePermissionsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.ListIssuePermissionsRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4451,
+  serialized_end=4519,
+)
+
+
+_LISTISSUEPERMISSIONSRESPONSE = _descriptor.Descriptor(
+  name='ListIssuePermissionsResponse',
+  full_name='monorail.ListIssuePermissionsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='permissions', full_name='monorail.ListIssuePermissionsResponse.permissions', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4521,
+  serialized_end=4572,
+)
+
+
+_MOVEISSUEREQUEST = _descriptor.Descriptor(
+  name='MoveIssueRequest',
+  full_name='monorail.MoveIssueRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.MoveIssueRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='target_project_name', full_name='monorail.MoveIssueRequest.target_project_name', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4574,
+  serialized_end=4660,
+)
+
+
+_MOVEISSUERESPONSE = _descriptor.Descriptor(
+  name='MoveIssueResponse',
+  full_name='monorail.MoveIssueResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='new_issue_ref', full_name='monorail.MoveIssueResponse.new_issue_ref', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4662,
+  serialized_end=4724,
+)
+
+
+_COPYISSUEREQUEST = _descriptor.Descriptor(
+  name='CopyIssueRequest',
+  full_name='monorail.CopyIssueRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='issue_ref', full_name='monorail.CopyIssueRequest.issue_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='target_project_name', full_name='monorail.CopyIssueRequest.target_project_name', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4726,
+  serialized_end=4812,
+)
+
+
+_COPYISSUERESPONSE = _descriptor.Descriptor(
+  name='CopyIssueResponse',
+  full_name='monorail.CopyIssueResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='new_issue_ref', full_name='monorail.CopyIssueResponse.new_issue_ref', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4814,
+  serialized_end=4876,
+)
+
+_CREATEISSUEREQUEST.fields_by_name['issue'].message_type = api_dot_api__proto_dot_issue__objects__pb2._ISSUE
+_GETISSUEREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_ISSUERESPONSE.fields_by_name['issue'].message_type = api_dot_api__proto_dot_issue__objects__pb2._ISSUE
+_ISSUERESPONSE.fields_by_name['moved_to_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_LISTISSUESREQUEST.fields_by_name['pagination'].message_type = api_dot_api__proto_dot_common__pb2._PAGINATION
+_LISTISSUESRESPONSE.fields_by_name['issues'].message_type = api_dot_api__proto_dot_issue__objects__pb2._ISSUE
+_LISTREFERENCEDISSUESREQUEST.fields_by_name['issue_refs'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_LISTREFERENCEDISSUESRESPONSE.fields_by_name['open_refs'].message_type = api_dot_api__proto_dot_issue__objects__pb2._ISSUE
+_LISTREFERENCEDISSUESRESPONSE.fields_by_name['closed_refs'].message_type = api_dot_api__proto_dot_issue__objects__pb2._ISSUE
+_LISTAPPLICABLEFIELDDEFSREQUEST.fields_by_name['issue_refs'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_LISTAPPLICABLEFIELDDEFSRESPONSE.fields_by_name['field_defs'].message_type = api_dot_api__proto_dot_project__objects__pb2._FIELDDEF
+_UPDATEISSUEREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_UPDATEISSUEREQUEST.fields_by_name['delta'].message_type = api_dot_api__proto_dot_issue__objects__pb2._ISSUEDELTA
+_UPDATEISSUEREQUEST.fields_by_name['uploads'].message_type = api_dot_api__proto_dot_issue__objects__pb2._ATTACHMENTUPLOAD
+_STARISSUEREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_ISISSUESTARREDREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_LISTSTARREDISSUESRESPONSE.fields_by_name['starred_issue_refs'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_LISTCOMMENTSREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_LISTCOMMENTSRESPONSE.fields_by_name['comments'].message_type = api_dot_api__proto_dot_issue__objects__pb2._COMMENT
+_LISTACTIVITIESREQUEST.fields_by_name['user_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_LISTACTIVITIESRESPONSE.fields_by_name['comments'].message_type = api_dot_api__proto_dot_issue__objects__pb2._COMMENT
+_LISTACTIVITIESRESPONSE.fields_by_name['issue_summaries'].message_type = api_dot_api__proto_dot_issue__objects__pb2._ISSUESUMMARY
+_DELETECOMMENTREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_BULKUPDATEAPPROVALSREQUEST.fields_by_name['issue_refs'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_BULKUPDATEAPPROVALSREQUEST.fields_by_name['field_ref'].message_type = api_dot_api__proto_dot_common__pb2._FIELDREF
+_BULKUPDATEAPPROVALSREQUEST.fields_by_name['approval_delta'].message_type = api_dot_api__proto_dot_issue__objects__pb2._APPROVALDELTA
+_BULKUPDATEAPPROVALSRESPONSE.fields_by_name['issue_refs'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_UPDATEAPPROVALREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_UPDATEAPPROVALREQUEST.fields_by_name['field_ref'].message_type = api_dot_api__proto_dot_common__pb2._FIELDREF
+_UPDATEAPPROVALREQUEST.fields_by_name['approval_delta'].message_type = api_dot_api__proto_dot_issue__objects__pb2._APPROVALDELTA
+_UPDATEAPPROVALREQUEST.fields_by_name['uploads'].message_type = api_dot_api__proto_dot_issue__objects__pb2._ATTACHMENTUPLOAD
+_UPDATEAPPROVALRESPONSE.fields_by_name['approval'].message_type = api_dot_api__proto_dot_issue__objects__pb2._APPROVAL
+_CONVERTISSUEAPPROVALSTEMPLATEREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_CONVERTISSUEAPPROVALSTEMPLATERESPONSE.fields_by_name['issue'].message_type = api_dot_api__proto_dot_issue__objects__pb2._ISSUE
+_ISSUESNAPSHOTRESPONSE.fields_by_name['snapshot_count'].message_type = _ISSUESNAPSHOTCOUNT
+_PRESUBMITISSUEREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_PRESUBMITISSUEREQUEST.fields_by_name['issue_delta'].message_type = api_dot_api__proto_dot_issue__objects__pb2._ISSUEDELTA
+_PRESUBMITISSUERESPONSE.fields_by_name['derived_labels'].message_type = api_dot_api__proto_dot_common__pb2._VALUEANDWHY
+_PRESUBMITISSUERESPONSE.fields_by_name['derived_owners'].message_type = api_dot_api__proto_dot_common__pb2._VALUEANDWHY
+_PRESUBMITISSUERESPONSE.fields_by_name['derived_ccs'].message_type = api_dot_api__proto_dot_common__pb2._VALUEANDWHY
+_PRESUBMITISSUERESPONSE.fields_by_name['warnings'].message_type = api_dot_api__proto_dot_common__pb2._VALUEANDWHY
+_PRESUBMITISSUERESPONSE.fields_by_name['errors'].message_type = api_dot_api__proto_dot_common__pb2._VALUEANDWHY
+_RERANKBLOCKEDONISSUESREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_RERANKBLOCKEDONISSUESREQUEST.fields_by_name['moved_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_RERANKBLOCKEDONISSUESREQUEST.fields_by_name['target_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_RERANKBLOCKEDONISSUESRESPONSE.fields_by_name['blocked_on_issue_refs'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_DELETEISSUEREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_DELETEISSUECOMMENTREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_DELETEATTACHMENTREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_FLAGISSUESREQUEST.fields_by_name['issue_refs'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_FLAGCOMMENTREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_LISTISSUEPERMISSIONSREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_MOVEISSUEREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_MOVEISSUERESPONSE.fields_by_name['new_issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_COPYISSUEREQUEST.fields_by_name['issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+_COPYISSUERESPONSE.fields_by_name['new_issue_ref'].message_type = api_dot_api__proto_dot_common__pb2._ISSUEREF
+DESCRIPTOR.message_types_by_name['CreateIssueRequest'] = _CREATEISSUEREQUEST
+DESCRIPTOR.message_types_by_name['GetIssueRequest'] = _GETISSUEREQUEST
+DESCRIPTOR.message_types_by_name['IssueResponse'] = _ISSUERESPONSE
+DESCRIPTOR.message_types_by_name['ListIssuesRequest'] = _LISTISSUESREQUEST
+DESCRIPTOR.message_types_by_name['ListIssuesResponse'] = _LISTISSUESRESPONSE
+DESCRIPTOR.message_types_by_name['ListReferencedIssuesRequest'] = _LISTREFERENCEDISSUESREQUEST
+DESCRIPTOR.message_types_by_name['ListReferencedIssuesResponse'] = _LISTREFERENCEDISSUESRESPONSE
+DESCRIPTOR.message_types_by_name['ListApplicableFieldDefsRequest'] = _LISTAPPLICABLEFIELDDEFSREQUEST
+DESCRIPTOR.message_types_by_name['ListApplicableFieldDefsResponse'] = _LISTAPPLICABLEFIELDDEFSRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateIssueRequest'] = _UPDATEISSUEREQUEST
+DESCRIPTOR.message_types_by_name['StarIssueRequest'] = _STARISSUEREQUEST
+DESCRIPTOR.message_types_by_name['StarIssueResponse'] = _STARISSUERESPONSE
+DESCRIPTOR.message_types_by_name['IsIssueStarredRequest'] = _ISISSUESTARREDREQUEST
+DESCRIPTOR.message_types_by_name['IsIssueStarredResponse'] = _ISISSUESTARREDRESPONSE
+DESCRIPTOR.message_types_by_name['ListStarredIssuesRequest'] = _LISTSTARREDISSUESREQUEST
+DESCRIPTOR.message_types_by_name['ListStarredIssuesResponse'] = _LISTSTARREDISSUESRESPONSE
+DESCRIPTOR.message_types_by_name['ListCommentsRequest'] = _LISTCOMMENTSREQUEST
+DESCRIPTOR.message_types_by_name['ListCommentsResponse'] = _LISTCOMMENTSRESPONSE
+DESCRIPTOR.message_types_by_name['ListActivitiesRequest'] = _LISTACTIVITIESREQUEST
+DESCRIPTOR.message_types_by_name['ListActivitiesResponse'] = _LISTACTIVITIESRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteCommentRequest'] = _DELETECOMMENTREQUEST
+DESCRIPTOR.message_types_by_name['BulkUpdateApprovalsRequest'] = _BULKUPDATEAPPROVALSREQUEST
+DESCRIPTOR.message_types_by_name['BulkUpdateApprovalsResponse'] = _BULKUPDATEAPPROVALSRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateApprovalRequest'] = _UPDATEAPPROVALREQUEST
+DESCRIPTOR.message_types_by_name['UpdateApprovalResponse'] = _UPDATEAPPROVALRESPONSE
+DESCRIPTOR.message_types_by_name['ConvertIssueApprovalsTemplateRequest'] = _CONVERTISSUEAPPROVALSTEMPLATEREQUEST
+DESCRIPTOR.message_types_by_name['ConvertIssueApprovalsTemplateResponse'] = _CONVERTISSUEAPPROVALSTEMPLATERESPONSE
+DESCRIPTOR.message_types_by_name['IssueSnapshotRequest'] = _ISSUESNAPSHOTREQUEST
+DESCRIPTOR.message_types_by_name['IssueSnapshotCount'] = _ISSUESNAPSHOTCOUNT
+DESCRIPTOR.message_types_by_name['IssueSnapshotResponse'] = _ISSUESNAPSHOTRESPONSE
+DESCRIPTOR.message_types_by_name['PresubmitIssueRequest'] = _PRESUBMITISSUEREQUEST
+DESCRIPTOR.message_types_by_name['PresubmitIssueResponse'] = _PRESUBMITISSUERESPONSE
+DESCRIPTOR.message_types_by_name['RerankBlockedOnIssuesRequest'] = _RERANKBLOCKEDONISSUESREQUEST
+DESCRIPTOR.message_types_by_name['RerankBlockedOnIssuesResponse'] = _RERANKBLOCKEDONISSUESRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteIssueRequest'] = _DELETEISSUEREQUEST
+DESCRIPTOR.message_types_by_name['DeleteIssueResponse'] = _DELETEISSUERESPONSE
+DESCRIPTOR.message_types_by_name['DeleteIssueCommentRequest'] = _DELETEISSUECOMMENTREQUEST
+DESCRIPTOR.message_types_by_name['DeleteIssueCommentResponse'] = _DELETEISSUECOMMENTRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteAttachmentRequest'] = _DELETEATTACHMENTREQUEST
+DESCRIPTOR.message_types_by_name['DeleteAttachmentResponse'] = _DELETEATTACHMENTRESPONSE
+DESCRIPTOR.message_types_by_name['FlagIssuesRequest'] = _FLAGISSUESREQUEST
+DESCRIPTOR.message_types_by_name['FlagIssuesResponse'] = _FLAGISSUESRESPONSE
+DESCRIPTOR.message_types_by_name['FlagCommentRequest'] = _FLAGCOMMENTREQUEST
+DESCRIPTOR.message_types_by_name['FlagCommentResponse'] = _FLAGCOMMENTRESPONSE
+DESCRIPTOR.message_types_by_name['ListIssuePermissionsRequest'] = _LISTISSUEPERMISSIONSREQUEST
+DESCRIPTOR.message_types_by_name['ListIssuePermissionsResponse'] = _LISTISSUEPERMISSIONSRESPONSE
+DESCRIPTOR.message_types_by_name['MoveIssueRequest'] = _MOVEISSUEREQUEST
+DESCRIPTOR.message_types_by_name['MoveIssueResponse'] = _MOVEISSUERESPONSE
+DESCRIPTOR.message_types_by_name['CopyIssueRequest'] = _COPYISSUEREQUEST
+DESCRIPTOR.message_types_by_name['CopyIssueResponse'] = _COPYISSUERESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+CreateIssueRequest = _reflection.GeneratedProtocolMessageType('CreateIssueRequest', (_message.Message,), dict(
+  DESCRIPTOR = _CREATEISSUEREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.CreateIssueRequest)
+  ))
+_sym_db.RegisterMessage(CreateIssueRequest)
+
+GetIssueRequest = _reflection.GeneratedProtocolMessageType('GetIssueRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETISSUEREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetIssueRequest)
+  ))
+_sym_db.RegisterMessage(GetIssueRequest)
+
+IssueResponse = _reflection.GeneratedProtocolMessageType('IssueResponse', (_message.Message,), dict(
+  DESCRIPTOR = _ISSUERESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.IssueResponse)
+  ))
+_sym_db.RegisterMessage(IssueResponse)
+
+ListIssuesRequest = _reflection.GeneratedProtocolMessageType('ListIssuesRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTISSUESREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListIssuesRequest)
+  ))
+_sym_db.RegisterMessage(ListIssuesRequest)
+
+ListIssuesResponse = _reflection.GeneratedProtocolMessageType('ListIssuesResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTISSUESRESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListIssuesResponse)
+  ))
+_sym_db.RegisterMessage(ListIssuesResponse)
+
+ListReferencedIssuesRequest = _reflection.GeneratedProtocolMessageType('ListReferencedIssuesRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTREFERENCEDISSUESREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListReferencedIssuesRequest)
+  ))
+_sym_db.RegisterMessage(ListReferencedIssuesRequest)
+
+ListReferencedIssuesResponse = _reflection.GeneratedProtocolMessageType('ListReferencedIssuesResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTREFERENCEDISSUESRESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListReferencedIssuesResponse)
+  ))
+_sym_db.RegisterMessage(ListReferencedIssuesResponse)
+
+ListApplicableFieldDefsRequest = _reflection.GeneratedProtocolMessageType('ListApplicableFieldDefsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTAPPLICABLEFIELDDEFSREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListApplicableFieldDefsRequest)
+  ))
+_sym_db.RegisterMessage(ListApplicableFieldDefsRequest)
+
+ListApplicableFieldDefsResponse = _reflection.GeneratedProtocolMessageType('ListApplicableFieldDefsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTAPPLICABLEFIELDDEFSRESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListApplicableFieldDefsResponse)
+  ))
+_sym_db.RegisterMessage(ListApplicableFieldDefsResponse)
+
+UpdateIssueRequest = _reflection.GeneratedProtocolMessageType('UpdateIssueRequest', (_message.Message,), dict(
+  DESCRIPTOR = _UPDATEISSUEREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.UpdateIssueRequest)
+  ))
+_sym_db.RegisterMessage(UpdateIssueRequest)
+
+StarIssueRequest = _reflection.GeneratedProtocolMessageType('StarIssueRequest', (_message.Message,), dict(
+  DESCRIPTOR = _STARISSUEREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.StarIssueRequest)
+  ))
+_sym_db.RegisterMessage(StarIssueRequest)
+
+StarIssueResponse = _reflection.GeneratedProtocolMessageType('StarIssueResponse', (_message.Message,), dict(
+  DESCRIPTOR = _STARISSUERESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.StarIssueResponse)
+  ))
+_sym_db.RegisterMessage(StarIssueResponse)
+
+IsIssueStarredRequest = _reflection.GeneratedProtocolMessageType('IsIssueStarredRequest', (_message.Message,), dict(
+  DESCRIPTOR = _ISISSUESTARREDREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.IsIssueStarredRequest)
+  ))
+_sym_db.RegisterMessage(IsIssueStarredRequest)
+
+IsIssueStarredResponse = _reflection.GeneratedProtocolMessageType('IsIssueStarredResponse', (_message.Message,), dict(
+  DESCRIPTOR = _ISISSUESTARREDRESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.IsIssueStarredResponse)
+  ))
+_sym_db.RegisterMessage(IsIssueStarredResponse)
+
+ListStarredIssuesRequest = _reflection.GeneratedProtocolMessageType('ListStarredIssuesRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTSTARREDISSUESREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListStarredIssuesRequest)
+  ))
+_sym_db.RegisterMessage(ListStarredIssuesRequest)
+
+ListStarredIssuesResponse = _reflection.GeneratedProtocolMessageType('ListStarredIssuesResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTSTARREDISSUESRESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListStarredIssuesResponse)
+  ))
+_sym_db.RegisterMessage(ListStarredIssuesResponse)
+
+ListCommentsRequest = _reflection.GeneratedProtocolMessageType('ListCommentsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTCOMMENTSREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListCommentsRequest)
+  ))
+_sym_db.RegisterMessage(ListCommentsRequest)
+
+ListCommentsResponse = _reflection.GeneratedProtocolMessageType('ListCommentsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTCOMMENTSRESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListCommentsResponse)
+  ))
+_sym_db.RegisterMessage(ListCommentsResponse)
+
+ListActivitiesRequest = _reflection.GeneratedProtocolMessageType('ListActivitiesRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTACTIVITIESREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListActivitiesRequest)
+  ))
+_sym_db.RegisterMessage(ListActivitiesRequest)
+
+ListActivitiesResponse = _reflection.GeneratedProtocolMessageType('ListActivitiesResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTACTIVITIESRESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListActivitiesResponse)
+  ))
+_sym_db.RegisterMessage(ListActivitiesResponse)
+
+DeleteCommentRequest = _reflection.GeneratedProtocolMessageType('DeleteCommentRequest', (_message.Message,), dict(
+  DESCRIPTOR = _DELETECOMMENTREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.DeleteCommentRequest)
+  ))
+_sym_db.RegisterMessage(DeleteCommentRequest)
+
+BulkUpdateApprovalsRequest = _reflection.GeneratedProtocolMessageType('BulkUpdateApprovalsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _BULKUPDATEAPPROVALSREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.BulkUpdateApprovalsRequest)
+  ))
+_sym_db.RegisterMessage(BulkUpdateApprovalsRequest)
+
+BulkUpdateApprovalsResponse = _reflection.GeneratedProtocolMessageType('BulkUpdateApprovalsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _BULKUPDATEAPPROVALSRESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.BulkUpdateApprovalsResponse)
+  ))
+_sym_db.RegisterMessage(BulkUpdateApprovalsResponse)
+
+UpdateApprovalRequest = _reflection.GeneratedProtocolMessageType('UpdateApprovalRequest', (_message.Message,), dict(
+  DESCRIPTOR = _UPDATEAPPROVALREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.UpdateApprovalRequest)
+  ))
+_sym_db.RegisterMessage(UpdateApprovalRequest)
+
+UpdateApprovalResponse = _reflection.GeneratedProtocolMessageType('UpdateApprovalResponse', (_message.Message,), dict(
+  DESCRIPTOR = _UPDATEAPPROVALRESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.UpdateApprovalResponse)
+  ))
+_sym_db.RegisterMessage(UpdateApprovalResponse)
+
+ConvertIssueApprovalsTemplateRequest = _reflection.GeneratedProtocolMessageType('ConvertIssueApprovalsTemplateRequest', (_message.Message,), dict(
+  DESCRIPTOR = _CONVERTISSUEAPPROVALSTEMPLATEREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ConvertIssueApprovalsTemplateRequest)
+  ))
+_sym_db.RegisterMessage(ConvertIssueApprovalsTemplateRequest)
+
+ConvertIssueApprovalsTemplateResponse = _reflection.GeneratedProtocolMessageType('ConvertIssueApprovalsTemplateResponse', (_message.Message,), dict(
+  DESCRIPTOR = _CONVERTISSUEAPPROVALSTEMPLATERESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ConvertIssueApprovalsTemplateResponse)
+  ))
+_sym_db.RegisterMessage(ConvertIssueApprovalsTemplateResponse)
+
+IssueSnapshotRequest = _reflection.GeneratedProtocolMessageType('IssueSnapshotRequest', (_message.Message,), dict(
+  DESCRIPTOR = _ISSUESNAPSHOTREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.IssueSnapshotRequest)
+  ))
+_sym_db.RegisterMessage(IssueSnapshotRequest)
+
+IssueSnapshotCount = _reflection.GeneratedProtocolMessageType('IssueSnapshotCount', (_message.Message,), dict(
+  DESCRIPTOR = _ISSUESNAPSHOTCOUNT,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.IssueSnapshotCount)
+  ))
+_sym_db.RegisterMessage(IssueSnapshotCount)
+
+IssueSnapshotResponse = _reflection.GeneratedProtocolMessageType('IssueSnapshotResponse', (_message.Message,), dict(
+  DESCRIPTOR = _ISSUESNAPSHOTRESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.IssueSnapshotResponse)
+  ))
+_sym_db.RegisterMessage(IssueSnapshotResponse)
+
+PresubmitIssueRequest = _reflection.GeneratedProtocolMessageType('PresubmitIssueRequest', (_message.Message,), dict(
+  DESCRIPTOR = _PRESUBMITISSUEREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.PresubmitIssueRequest)
+  ))
+_sym_db.RegisterMessage(PresubmitIssueRequest)
+
+PresubmitIssueResponse = _reflection.GeneratedProtocolMessageType('PresubmitIssueResponse', (_message.Message,), dict(
+  DESCRIPTOR = _PRESUBMITISSUERESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.PresubmitIssueResponse)
+  ))
+_sym_db.RegisterMessage(PresubmitIssueResponse)
+
+RerankBlockedOnIssuesRequest = _reflection.GeneratedProtocolMessageType('RerankBlockedOnIssuesRequest', (_message.Message,), dict(
+  DESCRIPTOR = _RERANKBLOCKEDONISSUESREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.RerankBlockedOnIssuesRequest)
+  ))
+_sym_db.RegisterMessage(RerankBlockedOnIssuesRequest)
+
+RerankBlockedOnIssuesResponse = _reflection.GeneratedProtocolMessageType('RerankBlockedOnIssuesResponse', (_message.Message,), dict(
+  DESCRIPTOR = _RERANKBLOCKEDONISSUESRESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.RerankBlockedOnIssuesResponse)
+  ))
+_sym_db.RegisterMessage(RerankBlockedOnIssuesResponse)
+
+DeleteIssueRequest = _reflection.GeneratedProtocolMessageType('DeleteIssueRequest', (_message.Message,), dict(
+  DESCRIPTOR = _DELETEISSUEREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.DeleteIssueRequest)
+  ))
+_sym_db.RegisterMessage(DeleteIssueRequest)
+
+DeleteIssueResponse = _reflection.GeneratedProtocolMessageType('DeleteIssueResponse', (_message.Message,), dict(
+  DESCRIPTOR = _DELETEISSUERESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.DeleteIssueResponse)
+  ))
+_sym_db.RegisterMessage(DeleteIssueResponse)
+
+DeleteIssueCommentRequest = _reflection.GeneratedProtocolMessageType('DeleteIssueCommentRequest', (_message.Message,), dict(
+  DESCRIPTOR = _DELETEISSUECOMMENTREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.DeleteIssueCommentRequest)
+  ))
+_sym_db.RegisterMessage(DeleteIssueCommentRequest)
+
+DeleteIssueCommentResponse = _reflection.GeneratedProtocolMessageType('DeleteIssueCommentResponse', (_message.Message,), dict(
+  DESCRIPTOR = _DELETEISSUECOMMENTRESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.DeleteIssueCommentResponse)
+  ))
+_sym_db.RegisterMessage(DeleteIssueCommentResponse)
+
+DeleteAttachmentRequest = _reflection.GeneratedProtocolMessageType('DeleteAttachmentRequest', (_message.Message,), dict(
+  DESCRIPTOR = _DELETEATTACHMENTREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.DeleteAttachmentRequest)
+  ))
+_sym_db.RegisterMessage(DeleteAttachmentRequest)
+
+DeleteAttachmentResponse = _reflection.GeneratedProtocolMessageType('DeleteAttachmentResponse', (_message.Message,), dict(
+  DESCRIPTOR = _DELETEATTACHMENTRESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.DeleteAttachmentResponse)
+  ))
+_sym_db.RegisterMessage(DeleteAttachmentResponse)
+
+FlagIssuesRequest = _reflection.GeneratedProtocolMessageType('FlagIssuesRequest', (_message.Message,), dict(
+  DESCRIPTOR = _FLAGISSUESREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.FlagIssuesRequest)
+  ))
+_sym_db.RegisterMessage(FlagIssuesRequest)
+
+FlagIssuesResponse = _reflection.GeneratedProtocolMessageType('FlagIssuesResponse', (_message.Message,), dict(
+  DESCRIPTOR = _FLAGISSUESRESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.FlagIssuesResponse)
+  ))
+_sym_db.RegisterMessage(FlagIssuesResponse)
+
+FlagCommentRequest = _reflection.GeneratedProtocolMessageType('FlagCommentRequest', (_message.Message,), dict(
+  DESCRIPTOR = _FLAGCOMMENTREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.FlagCommentRequest)
+  ))
+_sym_db.RegisterMessage(FlagCommentRequest)
+
+FlagCommentResponse = _reflection.GeneratedProtocolMessageType('FlagCommentResponse', (_message.Message,), dict(
+  DESCRIPTOR = _FLAGCOMMENTRESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.FlagCommentResponse)
+  ))
+_sym_db.RegisterMessage(FlagCommentResponse)
+
+ListIssuePermissionsRequest = _reflection.GeneratedProtocolMessageType('ListIssuePermissionsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTISSUEPERMISSIONSREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListIssuePermissionsRequest)
+  ))
+_sym_db.RegisterMessage(ListIssuePermissionsRequest)
+
+ListIssuePermissionsResponse = _reflection.GeneratedProtocolMessageType('ListIssuePermissionsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTISSUEPERMISSIONSRESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListIssuePermissionsResponse)
+  ))
+_sym_db.RegisterMessage(ListIssuePermissionsResponse)
+
+MoveIssueRequest = _reflection.GeneratedProtocolMessageType('MoveIssueRequest', (_message.Message,), dict(
+  DESCRIPTOR = _MOVEISSUEREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.MoveIssueRequest)
+  ))
+_sym_db.RegisterMessage(MoveIssueRequest)
+
+MoveIssueResponse = _reflection.GeneratedProtocolMessageType('MoveIssueResponse', (_message.Message,), dict(
+  DESCRIPTOR = _MOVEISSUERESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.MoveIssueResponse)
+  ))
+_sym_db.RegisterMessage(MoveIssueResponse)
+
+CopyIssueRequest = _reflection.GeneratedProtocolMessageType('CopyIssueRequest', (_message.Message,), dict(
+  DESCRIPTOR = _COPYISSUEREQUEST,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.CopyIssueRequest)
+  ))
+_sym_db.RegisterMessage(CopyIssueRequest)
+
+CopyIssueResponse = _reflection.GeneratedProtocolMessageType('CopyIssueResponse', (_message.Message,), dict(
+  DESCRIPTOR = _COPYISSUERESPONSE,
+  __module__ = 'api.api_proto.issues_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.CopyIssueResponse)
+  ))
+_sym_db.RegisterMessage(CopyIssueResponse)
+
+
+
+_ISSUES = _descriptor.ServiceDescriptor(
+  name='Issues',
+  full_name='monorail.Issues',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  serialized_start=4879,
+  serialized_end=7162,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='CreateIssue',
+    full_name='monorail.Issues.CreateIssue',
+    index=0,
+    containing_service=None,
+    input_type=_CREATEISSUEREQUEST,
+    output_type=_ISSUERESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetIssue',
+    full_name='monorail.Issues.GetIssue',
+    index=1,
+    containing_service=None,
+    input_type=_GETISSUEREQUEST,
+    output_type=_ISSUERESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListIssues',
+    full_name='monorail.Issues.ListIssues',
+    index=2,
+    containing_service=None,
+    input_type=_LISTISSUESREQUEST,
+    output_type=_LISTISSUESRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListReferencedIssues',
+    full_name='monorail.Issues.ListReferencedIssues',
+    index=3,
+    containing_service=None,
+    input_type=_LISTREFERENCEDISSUESREQUEST,
+    output_type=_LISTREFERENCEDISSUESRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListApplicableFieldDefs',
+    full_name='monorail.Issues.ListApplicableFieldDefs',
+    index=4,
+    containing_service=None,
+    input_type=_LISTAPPLICABLEFIELDDEFSREQUEST,
+    output_type=_LISTAPPLICABLEFIELDDEFSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UpdateIssue',
+    full_name='monorail.Issues.UpdateIssue',
+    index=5,
+    containing_service=None,
+    input_type=_UPDATEISSUEREQUEST,
+    output_type=_ISSUERESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='StarIssue',
+    full_name='monorail.Issues.StarIssue',
+    index=6,
+    containing_service=None,
+    input_type=_STARISSUEREQUEST,
+    output_type=_STARISSUERESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='IsIssueStarred',
+    full_name='monorail.Issues.IsIssueStarred',
+    index=7,
+    containing_service=None,
+    input_type=_ISISSUESTARREDREQUEST,
+    output_type=_ISISSUESTARREDRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListStarredIssues',
+    full_name='monorail.Issues.ListStarredIssues',
+    index=8,
+    containing_service=None,
+    input_type=_LISTSTARREDISSUESREQUEST,
+    output_type=_LISTSTARREDISSUESRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListComments',
+    full_name='monorail.Issues.ListComments',
+    index=9,
+    containing_service=None,
+    input_type=_LISTCOMMENTSREQUEST,
+    output_type=_LISTCOMMENTSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListActivities',
+    full_name='monorail.Issues.ListActivities',
+    index=10,
+    containing_service=None,
+    input_type=_LISTACTIVITIESREQUEST,
+    output_type=_LISTACTIVITIESRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteComment',
+    full_name='monorail.Issues.DeleteComment',
+    index=11,
+    containing_service=None,
+    input_type=_DELETECOMMENTREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='BulkUpdateApprovals',
+    full_name='monorail.Issues.BulkUpdateApprovals',
+    index=12,
+    containing_service=None,
+    input_type=_BULKUPDATEAPPROVALSREQUEST,
+    output_type=_BULKUPDATEAPPROVALSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UpdateApproval',
+    full_name='monorail.Issues.UpdateApproval',
+    index=13,
+    containing_service=None,
+    input_type=_UPDATEAPPROVALREQUEST,
+    output_type=_UPDATEAPPROVALRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ConvertIssueApprovalsTemplate',
+    full_name='monorail.Issues.ConvertIssueApprovalsTemplate',
+    index=14,
+    containing_service=None,
+    input_type=_CONVERTISSUEAPPROVALSTEMPLATEREQUEST,
+    output_type=_CONVERTISSUEAPPROVALSTEMPLATERESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='IssueSnapshot',
+    full_name='monorail.Issues.IssueSnapshot',
+    index=15,
+    containing_service=None,
+    input_type=_ISSUESNAPSHOTREQUEST,
+    output_type=_ISSUESNAPSHOTRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='PresubmitIssue',
+    full_name='monorail.Issues.PresubmitIssue',
+    index=16,
+    containing_service=None,
+    input_type=_PRESUBMITISSUEREQUEST,
+    output_type=_PRESUBMITISSUERESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='RerankBlockedOnIssues',
+    full_name='monorail.Issues.RerankBlockedOnIssues',
+    index=17,
+    containing_service=None,
+    input_type=_RERANKBLOCKEDONISSUESREQUEST,
+    output_type=_RERANKBLOCKEDONISSUESRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteIssue',
+    full_name='monorail.Issues.DeleteIssue',
+    index=18,
+    containing_service=None,
+    input_type=_DELETEISSUEREQUEST,
+    output_type=_DELETEISSUERESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteIssueComment',
+    full_name='monorail.Issues.DeleteIssueComment',
+    index=19,
+    containing_service=None,
+    input_type=_DELETEISSUECOMMENTREQUEST,
+    output_type=_DELETEISSUECOMMENTRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteAttachment',
+    full_name='monorail.Issues.DeleteAttachment',
+    index=20,
+    containing_service=None,
+    input_type=_DELETEATTACHMENTREQUEST,
+    output_type=_DELETEATTACHMENTRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FlagIssues',
+    full_name='monorail.Issues.FlagIssues',
+    index=21,
+    containing_service=None,
+    input_type=_FLAGISSUESREQUEST,
+    output_type=_FLAGISSUESRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FlagComment',
+    full_name='monorail.Issues.FlagComment',
+    index=22,
+    containing_service=None,
+    input_type=_FLAGCOMMENTREQUEST,
+    output_type=_FLAGCOMMENTRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListIssuePermissions',
+    full_name='monorail.Issues.ListIssuePermissions',
+    index=23,
+    containing_service=None,
+    input_type=_LISTISSUEPERMISSIONSREQUEST,
+    output_type=_LISTISSUEPERMISSIONSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='MoveIssue',
+    full_name='monorail.Issues.MoveIssue',
+    index=24,
+    containing_service=None,
+    input_type=_MOVEISSUEREQUEST,
+    output_type=_MOVEISSUERESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CopyIssue',
+    full_name='monorail.Issues.CopyIssue',
+    index=25,
+    containing_service=None,
+    input_type=_COPYISSUEREQUEST,
+    output_type=_COPYISSUERESPONSE,
+    serialized_options=None,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_ISSUES)
+
+DESCRIPTOR.services_by_name['Issues'] = _ISSUES
+
+# @@protoc_insertion_point(module_scope)
diff --git a/api/api_proto/issues_prpc_pb2.py b/api/api_proto/issues_prpc_pb2.py
new file mode 100644
index 0000000..942730d
--- /dev/null
+++ b/api/api_proto/issues_prpc_pb2.py
@@ -0,0 +1,403 @@
+# Generated by the pRPC protocol buffer compiler plugin.  DO NOT EDIT!
+# source: api/api_proto/issues.proto
+
+import base64
+import zlib
+
+from google.protobuf import descriptor_pb2
+
+# Includes description of the api/api_proto/issues.proto and all of its transitive
+# dependencies. Includes source code info.
+FILE_DESCRIPTOR_SET = descriptor_pb2.FileDescriptorSet()
+FILE_DESCRIPTOR_SET.ParseFromString(zlib.decompress(base64.b64decode(
+    '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')))
+_INDEX = {
+    f.name: {
+      'descriptor': f,
+      'services': {s.name: s for s in f.service},
+    }
+    for f in FILE_DESCRIPTOR_SET.file
+}
+
+
+IssuesServiceDescription = {
+  'file_descriptor_set': FILE_DESCRIPTOR_SET,
+  'file_descriptor': _INDEX[u'api/api_proto/issues.proto']['descriptor'],
+  'service_descriptor': _INDEX[u'api/api_proto/issues.proto']['services'][u'Issues'],
+}
diff --git a/api/api_proto/project_objects.proto b/api/api_proto/project_objects.proto
new file mode 100644
index 0000000..a6943ec
--- /dev/null
+++ b/api/api_proto/project_objects.proto
@@ -0,0 +1,136 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+// This file defines protobufs for issues and related business
+// objects, e.g., field values, comments, and attachments.
+
+syntax = "proto3";
+
+package monorail;
+
+import "api/api_proto/common.proto";
+import "api/api_proto/issue_objects.proto";
+
+
+// Next available tag: 4
+message Project {
+  string name = 1;
+  string summary = 2;
+  string description = 3;
+}
+
+
+// Next available tag: 6
+message StatusDef {
+  string status = 1;
+  bool means_open = 2;
+  uint32 rank = 3;
+  string docstring = 4;
+  bool deprecated = 5;
+}
+
+
+// Next available tag: 5
+message LabelDef {
+  string label = 1;
+  string docstring = 3;
+  bool deprecated = 4;
+}
+
+
+// Next available tag: 11
+message ComponentDef {
+  string path = 1;
+  string docstring = 2;
+  repeated UserRef admin_refs = 3;
+  repeated UserRef cc_refs = 4;
+  bool deprecated = 5;
+  fixed32 created = 6;
+  UserRef creator_ref = 7;
+  fixed32 modified = 8;
+  UserRef modifier_ref = 9;
+  repeated LabelRef label_refs = 10;
+}
+
+
+// Next available tag: 9
+message FieldDef {
+  FieldRef field_ref = 1;
+  string applicable_type = 2;
+  // TODO(jrobbins): applicable_predicate
+  bool is_required = 3;
+  bool is_niche = 4;
+  bool is_multivalued = 5;
+  string docstring = 6;
+  repeated UserRef admin_refs = 7;
+  // TODO(jrobbins): validation, permission granting, and notification options.
+  bool is_phase_field = 8;
+  repeated UserRef user_choices = 9;
+  repeated LabelDef enum_choices = 10;
+}
+
+
+// Next available tag: 3
+message FieldOptions {
+  FieldRef field_ref = 1;
+  repeated UserRef user_refs = 2;
+}
+
+
+// Next available tag: 4
+message ApprovalDef {
+  FieldRef field_ref = 1;
+  repeated UserRef approver_refs = 2;
+  string survey = 3;
+}
+
+
+// Next available tag: 11
+message Config {
+  string project_name = 1;
+  repeated StatusDef status_defs = 2;
+  repeated StatusRef statuses_offer_merge = 3;
+  repeated LabelDef label_defs = 4;
+  repeated string exclusive_label_prefixes = 5;
+  repeated ComponentDef component_defs = 6;
+  repeated FieldDef field_defs = 7;
+  repeated ApprovalDef approval_defs = 8;
+  bool restrict_to_known = 9;
+}
+
+
+// Next available tag: 11
+message PresentationConfig {
+  string project_thumbnail_url = 1;
+  string project_summary = 2;
+  string custom_issue_entry_url = 3;
+  string default_query = 4;
+  repeated SavedQuery saved_queries = 5;
+  string revision_url_format = 6;
+  string default_col_spec = 7;
+  string default_sort_spec = 8;
+  string default_x_attr = 9;
+  string default_y_attr = 10;
+}
+
+
+// Next available tag: 16
+message TemplateDef {
+  string template_name = 1;
+  string content = 2;
+  string summary = 3;
+  bool summary_must_be_edited = 4;
+  UserRef owner_ref = 5;
+  StatusRef status_ref = 6;
+  repeated LabelRef label_refs = 7;
+  bool members_only = 8;
+  bool owner_defaults_to_member = 9;
+  repeated UserRef admin_refs = 10;
+  repeated FieldValue field_values = 11;
+  repeated ComponentRef component_refs = 12;
+  bool component_required = 13;
+  repeated Approval approval_values = 14;
+  repeated PhaseDef phases = 15;
+}
diff --git a/api/api_proto/project_objects_pb2.py b/api/api_proto/project_objects_pb2.py
new file mode 100644
index 0000000..580810a
--- /dev/null
+++ b/api/api_proto/project_objects_pb2.py
@@ -0,0 +1,871 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: api/api_proto/project_objects.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from api.api_proto import common_pb2 as api_dot_api__proto_dot_common__pb2
+from api.api_proto import issue_objects_pb2 as api_dot_api__proto_dot_issue__objects__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='api/api_proto/project_objects.proto',
+  package='monorail',
+  syntax='proto3',
+  serialized_options=None,
+  serialized_pb=_b('\n#api/api_proto/project_objects.proto\x12\x08monorail\x1a\x1a\x61pi/api_proto/common.proto\x1a!api/api_proto/issue_objects.proto\"=\n\x07Project\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07summary\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\"d\n\tStatusDef\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x12\n\nmeans_open\x18\x02 \x01(\x08\x12\x0c\n\x04rank\x18\x03 \x01(\r\x12\x11\n\tdocstring\x18\x04 \x01(\t\x12\x12\n\ndeprecated\x18\x05 \x01(\x08\"@\n\x08LabelDef\x12\r\n\x05label\x18\x01 \x01(\t\x12\x11\n\tdocstring\x18\x03 \x01(\t\x12\x12\n\ndeprecated\x18\x04 \x01(\x08\"\xaa\x02\n\x0c\x43omponentDef\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x11\n\tdocstring\x18\x02 \x01(\t\x12%\n\nadmin_refs\x18\x03 \x03(\x0b\x32\x11.monorail.UserRef\x12\"\n\x07\x63\x63_refs\x18\x04 \x03(\x0b\x32\x11.monorail.UserRef\x12\x12\n\ndeprecated\x18\x05 \x01(\x08\x12\x0f\n\x07\x63reated\x18\x06 \x01(\x07\x12&\n\x0b\x63reator_ref\x18\x07 \x01(\x0b\x32\x11.monorail.UserRef\x12\x10\n\x08modified\x18\x08 \x01(\x07\x12\'\n\x0cmodifier_ref\x18\t \x01(\x0b\x32\x11.monorail.UserRef\x12&\n\nlabel_refs\x18\n \x03(\x0b\x32\x12.monorail.LabelRef\"\xae\x02\n\x08\x46ieldDef\x12%\n\tfield_ref\x18\x01 \x01(\x0b\x32\x12.monorail.FieldRef\x12\x17\n\x0f\x61pplicable_type\x18\x02 \x01(\t\x12\x13\n\x0bis_required\x18\x03 \x01(\x08\x12\x10\n\x08is_niche\x18\x04 \x01(\x08\x12\x16\n\x0eis_multivalued\x18\x05 \x01(\x08\x12\x11\n\tdocstring\x18\x06 \x01(\t\x12%\n\nadmin_refs\x18\x07 \x03(\x0b\x32\x11.monorail.UserRef\x12\x16\n\x0eis_phase_field\x18\x08 \x01(\x08\x12\'\n\x0cuser_choices\x18\t \x03(\x0b\x32\x11.monorail.UserRef\x12(\n\x0c\x65num_choices\x18\n \x03(\x0b\x32\x12.monorail.LabelDef\"[\n\x0c\x46ieldOptions\x12%\n\tfield_ref\x18\x01 \x01(\x0b\x32\x12.monorail.FieldRef\x12$\n\tuser_refs\x18\x02 \x03(\x0b\x32\x11.monorail.UserRef\"n\n\x0b\x41pprovalDef\x12%\n\tfield_ref\x18\x01 \x01(\x0b\x32\x12.monorail.FieldRef\x12(\n\rapprover_refs\x18\x02 \x03(\x0b\x32\x11.monorail.UserRef\x12\x0e\n\x06survey\x18\x03 \x01(\t\"\xe6\x02\n\x06\x43onfig\x12\x14\n\x0cproject_name\x18\x01 \x01(\t\x12(\n\x0bstatus_defs\x18\x02 \x03(\x0b\x32\x13.monorail.StatusDef\x12\x31\n\x14statuses_offer_merge\x18\x03 \x03(\x0b\x32\x13.monorail.StatusRef\x12&\n\nlabel_defs\x18\x04 \x03(\x0b\x32\x12.monorail.LabelDef\x12 \n\x18\x65xclusive_label_prefixes\x18\x05 \x03(\t\x12.\n\x0e\x63omponent_defs\x18\x06 \x03(\x0b\x32\x16.monorail.ComponentDef\x12&\n\nfield_defs\x18\x07 \x03(\x0b\x32\x12.monorail.FieldDef\x12,\n\rapproval_defs\x18\x08 \x03(\x0b\x32\x15.monorail.ApprovalDef\x12\x19\n\x11restrict_to_known\x18\t \x01(\x08\"\xb2\x02\n\x12PresentationConfig\x12\x1d\n\x15project_thumbnail_url\x18\x01 \x01(\t\x12\x17\n\x0fproject_summary\x18\x02 \x01(\t\x12\x1e\n\x16\x63ustom_issue_entry_url\x18\x03 \x01(\t\x12\x15\n\rdefault_query\x18\x04 \x01(\t\x12+\n\rsaved_queries\x18\x05 \x03(\x0b\x32\x14.monorail.SavedQuery\x12\x1b\n\x13revision_url_format\x18\x06 \x01(\t\x12\x18\n\x10\x64\x65\x66\x61ult_col_spec\x18\x07 \x01(\t\x12\x19\n\x11\x64\x65\x66\x61ult_sort_spec\x18\x08 \x01(\t\x12\x16\n\x0e\x64\x65\x66\x61ult_x_attr\x18\t \x01(\t\x12\x16\n\x0e\x64\x65\x66\x61ult_y_attr\x18\n \x01(\t\"\x85\x04\n\x0bTemplateDef\x12\x15\n\rtemplate_name\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\x12\x0f\n\x07summary\x18\x03 \x01(\t\x12\x1e\n\x16summary_must_be_edited\x18\x04 \x01(\x08\x12$\n\towner_ref\x18\x05 \x01(\x0b\x32\x11.monorail.UserRef\x12\'\n\nstatus_ref\x18\x06 \x01(\x0b\x32\x13.monorail.StatusRef\x12&\n\nlabel_refs\x18\x07 \x03(\x0b\x32\x12.monorail.LabelRef\x12\x14\n\x0cmembers_only\x18\x08 \x01(\x08\x12 \n\x18owner_defaults_to_member\x18\t \x01(\x08\x12%\n\nadmin_refs\x18\n \x03(\x0b\x32\x11.monorail.UserRef\x12*\n\x0c\x66ield_values\x18\x0b \x03(\x0b\x32\x14.monorail.FieldValue\x12.\n\x0e\x63omponent_refs\x18\x0c \x03(\x0b\x32\x16.monorail.ComponentRef\x12\x1a\n\x12\x63omponent_required\x18\r \x01(\x08\x12+\n\x0f\x61pproval_values\x18\x0e \x03(\x0b\x32\x12.monorail.Approval\x12\"\n\x06phases\x18\x0f \x03(\x0b\x32\x12.monorail.PhaseDefb\x06proto3')
+  ,
+  dependencies=[api_dot_api__proto_dot_common__pb2.DESCRIPTOR,api_dot_api__proto_dot_issue__objects__pb2.DESCRIPTOR,])
+
+
+
+
+_PROJECT = _descriptor.Descriptor(
+  name='Project',
+  full_name='monorail.Project',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='monorail.Project.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='summary', full_name='monorail.Project.summary', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='monorail.Project.description', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=112,
+  serialized_end=173,
+)
+
+
+_STATUSDEF = _descriptor.Descriptor(
+  name='StatusDef',
+  full_name='monorail.StatusDef',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='monorail.StatusDef.status', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='means_open', full_name='monorail.StatusDef.means_open', index=1,
+      number=2, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='rank', full_name='monorail.StatusDef.rank', index=2,
+      number=3, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='docstring', full_name='monorail.StatusDef.docstring', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='deprecated', full_name='monorail.StatusDef.deprecated', index=4,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=175,
+  serialized_end=275,
+)
+
+
+_LABELDEF = _descriptor.Descriptor(
+  name='LabelDef',
+  full_name='monorail.LabelDef',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='label', full_name='monorail.LabelDef.label', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='docstring', full_name='monorail.LabelDef.docstring', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='deprecated', full_name='monorail.LabelDef.deprecated', index=2,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=277,
+  serialized_end=341,
+)
+
+
+_COMPONENTDEF = _descriptor.Descriptor(
+  name='ComponentDef',
+  full_name='monorail.ComponentDef',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='path', full_name='monorail.ComponentDef.path', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='docstring', full_name='monorail.ComponentDef.docstring', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='admin_refs', full_name='monorail.ComponentDef.admin_refs', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='cc_refs', full_name='monorail.ComponentDef.cc_refs', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='deprecated', full_name='monorail.ComponentDef.deprecated', index=4,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='created', full_name='monorail.ComponentDef.created', index=5,
+      number=6, type=7, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='creator_ref', full_name='monorail.ComponentDef.creator_ref', index=6,
+      number=7, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='modified', full_name='monorail.ComponentDef.modified', index=7,
+      number=8, type=7, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='modifier_ref', full_name='monorail.ComponentDef.modifier_ref', index=8,
+      number=9, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='label_refs', full_name='monorail.ComponentDef.label_refs', index=9,
+      number=10, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=344,
+  serialized_end=642,
+)
+
+
+_FIELDDEF = _descriptor.Descriptor(
+  name='FieldDef',
+  full_name='monorail.FieldDef',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='field_ref', full_name='monorail.FieldDef.field_ref', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='applicable_type', full_name='monorail.FieldDef.applicable_type', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_required', full_name='monorail.FieldDef.is_required', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_niche', full_name='monorail.FieldDef.is_niche', index=3,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_multivalued', full_name='monorail.FieldDef.is_multivalued', index=4,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='docstring', full_name='monorail.FieldDef.docstring', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='admin_refs', full_name='monorail.FieldDef.admin_refs', index=6,
+      number=7, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_phase_field', full_name='monorail.FieldDef.is_phase_field', index=7,
+      number=8, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='user_choices', full_name='monorail.FieldDef.user_choices', index=8,
+      number=9, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='enum_choices', full_name='monorail.FieldDef.enum_choices', index=9,
+      number=10, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=645,
+  serialized_end=947,
+)
+
+
+_FIELDOPTIONS = _descriptor.Descriptor(
+  name='FieldOptions',
+  full_name='monorail.FieldOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='field_ref', full_name='monorail.FieldOptions.field_ref', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='user_refs', full_name='monorail.FieldOptions.user_refs', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=949,
+  serialized_end=1040,
+)
+
+
+_APPROVALDEF = _descriptor.Descriptor(
+  name='ApprovalDef',
+  full_name='monorail.ApprovalDef',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='field_ref', full_name='monorail.ApprovalDef.field_ref', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='approver_refs', full_name='monorail.ApprovalDef.approver_refs', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='survey', full_name='monorail.ApprovalDef.survey', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1042,
+  serialized_end=1152,
+)
+
+
+_CONFIG = _descriptor.Descriptor(
+  name='Config',
+  full_name='monorail.Config',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.Config.project_name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='status_defs', full_name='monorail.Config.status_defs', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='statuses_offer_merge', full_name='monorail.Config.statuses_offer_merge', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='label_defs', full_name='monorail.Config.label_defs', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='exclusive_label_prefixes', full_name='monorail.Config.exclusive_label_prefixes', index=4,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='component_defs', full_name='monorail.Config.component_defs', index=5,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='field_defs', full_name='monorail.Config.field_defs', index=6,
+      number=7, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='approval_defs', full_name='monorail.Config.approval_defs', index=7,
+      number=8, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='restrict_to_known', full_name='monorail.Config.restrict_to_known', index=8,
+      number=9, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1155,
+  serialized_end=1513,
+)
+
+
+_PRESENTATIONCONFIG = _descriptor.Descriptor(
+  name='PresentationConfig',
+  full_name='monorail.PresentationConfig',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_thumbnail_url', full_name='monorail.PresentationConfig.project_thumbnail_url', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='project_summary', full_name='monorail.PresentationConfig.project_summary', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='custom_issue_entry_url', full_name='monorail.PresentationConfig.custom_issue_entry_url', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='default_query', full_name='monorail.PresentationConfig.default_query', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='saved_queries', full_name='monorail.PresentationConfig.saved_queries', index=4,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='revision_url_format', full_name='monorail.PresentationConfig.revision_url_format', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='default_col_spec', full_name='monorail.PresentationConfig.default_col_spec', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='default_sort_spec', full_name='monorail.PresentationConfig.default_sort_spec', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='default_x_attr', full_name='monorail.PresentationConfig.default_x_attr', index=8,
+      number=9, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='default_y_attr', full_name='monorail.PresentationConfig.default_y_attr', index=9,
+      number=10, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1516,
+  serialized_end=1822,
+)
+
+
+_TEMPLATEDEF = _descriptor.Descriptor(
+  name='TemplateDef',
+  full_name='monorail.TemplateDef',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='template_name', full_name='monorail.TemplateDef.template_name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='content', full_name='monorail.TemplateDef.content', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='summary', full_name='monorail.TemplateDef.summary', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='summary_must_be_edited', full_name='monorail.TemplateDef.summary_must_be_edited', index=3,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='owner_ref', full_name='monorail.TemplateDef.owner_ref', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='status_ref', full_name='monorail.TemplateDef.status_ref', index=5,
+      number=6, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='label_refs', full_name='monorail.TemplateDef.label_refs', index=6,
+      number=7, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='members_only', full_name='monorail.TemplateDef.members_only', index=7,
+      number=8, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='owner_defaults_to_member', full_name='monorail.TemplateDef.owner_defaults_to_member', index=8,
+      number=9, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='admin_refs', full_name='monorail.TemplateDef.admin_refs', index=9,
+      number=10, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='field_values', full_name='monorail.TemplateDef.field_values', index=10,
+      number=11, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='component_refs', full_name='monorail.TemplateDef.component_refs', index=11,
+      number=12, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='component_required', full_name='monorail.TemplateDef.component_required', index=12,
+      number=13, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='approval_values', full_name='monorail.TemplateDef.approval_values', index=13,
+      number=14, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='phases', full_name='monorail.TemplateDef.phases', index=14,
+      number=15, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1825,
+  serialized_end=2342,
+)
+
+_COMPONENTDEF.fields_by_name['admin_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_COMPONENTDEF.fields_by_name['cc_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_COMPONENTDEF.fields_by_name['creator_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_COMPONENTDEF.fields_by_name['modifier_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_COMPONENTDEF.fields_by_name['label_refs'].message_type = api_dot_api__proto_dot_common__pb2._LABELREF
+_FIELDDEF.fields_by_name['field_ref'].message_type = api_dot_api__proto_dot_common__pb2._FIELDREF
+_FIELDDEF.fields_by_name['admin_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_FIELDDEF.fields_by_name['user_choices'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_FIELDDEF.fields_by_name['enum_choices'].message_type = _LABELDEF
+_FIELDOPTIONS.fields_by_name['field_ref'].message_type = api_dot_api__proto_dot_common__pb2._FIELDREF
+_FIELDOPTIONS.fields_by_name['user_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_APPROVALDEF.fields_by_name['field_ref'].message_type = api_dot_api__proto_dot_common__pb2._FIELDREF
+_APPROVALDEF.fields_by_name['approver_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_CONFIG.fields_by_name['status_defs'].message_type = _STATUSDEF
+_CONFIG.fields_by_name['statuses_offer_merge'].message_type = api_dot_api__proto_dot_common__pb2._STATUSREF
+_CONFIG.fields_by_name['label_defs'].message_type = _LABELDEF
+_CONFIG.fields_by_name['component_defs'].message_type = _COMPONENTDEF
+_CONFIG.fields_by_name['field_defs'].message_type = _FIELDDEF
+_CONFIG.fields_by_name['approval_defs'].message_type = _APPROVALDEF
+_PRESENTATIONCONFIG.fields_by_name['saved_queries'].message_type = api_dot_api__proto_dot_common__pb2._SAVEDQUERY
+_TEMPLATEDEF.fields_by_name['owner_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_TEMPLATEDEF.fields_by_name['status_ref'].message_type = api_dot_api__proto_dot_common__pb2._STATUSREF
+_TEMPLATEDEF.fields_by_name['label_refs'].message_type = api_dot_api__proto_dot_common__pb2._LABELREF
+_TEMPLATEDEF.fields_by_name['admin_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_TEMPLATEDEF.fields_by_name['field_values'].message_type = api_dot_api__proto_dot_issue__objects__pb2._FIELDVALUE
+_TEMPLATEDEF.fields_by_name['component_refs'].message_type = api_dot_api__proto_dot_common__pb2._COMPONENTREF
+_TEMPLATEDEF.fields_by_name['approval_values'].message_type = api_dot_api__proto_dot_issue__objects__pb2._APPROVAL
+_TEMPLATEDEF.fields_by_name['phases'].message_type = api_dot_api__proto_dot_issue__objects__pb2._PHASEDEF
+DESCRIPTOR.message_types_by_name['Project'] = _PROJECT
+DESCRIPTOR.message_types_by_name['StatusDef'] = _STATUSDEF
+DESCRIPTOR.message_types_by_name['LabelDef'] = _LABELDEF
+DESCRIPTOR.message_types_by_name['ComponentDef'] = _COMPONENTDEF
+DESCRIPTOR.message_types_by_name['FieldDef'] = _FIELDDEF
+DESCRIPTOR.message_types_by_name['FieldOptions'] = _FIELDOPTIONS
+DESCRIPTOR.message_types_by_name['ApprovalDef'] = _APPROVALDEF
+DESCRIPTOR.message_types_by_name['Config'] = _CONFIG
+DESCRIPTOR.message_types_by_name['PresentationConfig'] = _PRESENTATIONCONFIG
+DESCRIPTOR.message_types_by_name['TemplateDef'] = _TEMPLATEDEF
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Project = _reflection.GeneratedProtocolMessageType('Project', (_message.Message,), dict(
+  DESCRIPTOR = _PROJECT,
+  __module__ = 'api.api_proto.project_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.Project)
+  ))
+_sym_db.RegisterMessage(Project)
+
+StatusDef = _reflection.GeneratedProtocolMessageType('StatusDef', (_message.Message,), dict(
+  DESCRIPTOR = _STATUSDEF,
+  __module__ = 'api.api_proto.project_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.StatusDef)
+  ))
+_sym_db.RegisterMessage(StatusDef)
+
+LabelDef = _reflection.GeneratedProtocolMessageType('LabelDef', (_message.Message,), dict(
+  DESCRIPTOR = _LABELDEF,
+  __module__ = 'api.api_proto.project_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.LabelDef)
+  ))
+_sym_db.RegisterMessage(LabelDef)
+
+ComponentDef = _reflection.GeneratedProtocolMessageType('ComponentDef', (_message.Message,), dict(
+  DESCRIPTOR = _COMPONENTDEF,
+  __module__ = 'api.api_proto.project_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ComponentDef)
+  ))
+_sym_db.RegisterMessage(ComponentDef)
+
+FieldDef = _reflection.GeneratedProtocolMessageType('FieldDef', (_message.Message,), dict(
+  DESCRIPTOR = _FIELDDEF,
+  __module__ = 'api.api_proto.project_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.FieldDef)
+  ))
+_sym_db.RegisterMessage(FieldDef)
+
+FieldOptions = _reflection.GeneratedProtocolMessageType('FieldOptions', (_message.Message,), dict(
+  DESCRIPTOR = _FIELDOPTIONS,
+  __module__ = 'api.api_proto.project_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.FieldOptions)
+  ))
+_sym_db.RegisterMessage(FieldOptions)
+
+ApprovalDef = _reflection.GeneratedProtocolMessageType('ApprovalDef', (_message.Message,), dict(
+  DESCRIPTOR = _APPROVALDEF,
+  __module__ = 'api.api_proto.project_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ApprovalDef)
+  ))
+_sym_db.RegisterMessage(ApprovalDef)
+
+Config = _reflection.GeneratedProtocolMessageType('Config', (_message.Message,), dict(
+  DESCRIPTOR = _CONFIG,
+  __module__ = 'api.api_proto.project_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.Config)
+  ))
+_sym_db.RegisterMessage(Config)
+
+PresentationConfig = _reflection.GeneratedProtocolMessageType('PresentationConfig', (_message.Message,), dict(
+  DESCRIPTOR = _PRESENTATIONCONFIG,
+  __module__ = 'api.api_proto.project_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.PresentationConfig)
+  ))
+_sym_db.RegisterMessage(PresentationConfig)
+
+TemplateDef = _reflection.GeneratedProtocolMessageType('TemplateDef', (_message.Message,), dict(
+  DESCRIPTOR = _TEMPLATEDEF,
+  __module__ = 'api.api_proto.project_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.TemplateDef)
+  ))
+_sym_db.RegisterMessage(TemplateDef)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/api/api_proto/projects.proto b/api/api_proto/projects.proto
new file mode 100644
index 0000000..bcd1167
--- /dev/null
+++ b/api/api_proto/projects.proto
@@ -0,0 +1,211 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+syntax = "proto3";
+
+
+package monorail;
+
+import "api/api_proto/common.proto";
+import "api/api_proto/project_objects.proto";
+
+
+service Projects {
+  rpc ListProjects (ListProjectsRequest) returns (ListProjectsResponse) {}
+  rpc ListProjectTemplates (ListProjectTemplatesRequest) returns (ListProjectTemplatesResponse) {}
+  rpc GetConfig (GetConfigRequest) returns (Config) {}
+  rpc GetPresentationConfig (GetPresentationConfigRequest) returns (PresentationConfig) {}
+  rpc GetCustomPermissions (GetCustomPermissionsRequest) returns (GetCustomPermissionsResponse) {}
+  rpc GetVisibleMembers (GetVisibleMembersRequest) returns (GetVisibleMembersResponse) {}
+  rpc GetLabelOptions (GetLabelOptionsRequest) returns (GetLabelOptionsResponse) {}
+  rpc ListStatuses (ListStatusesRequest) returns (ListStatusesResponse) {}
+  rpc ListComponents (ListComponentsRequest) returns (ListComponentsResponse) {}
+  rpc ListFields (ListFieldsRequest) returns (ListFieldsResponse) {}
+  rpc GetProjectStarCount (GetProjectStarCountRequest) returns (GetProjectStarCountResponse) {}
+  rpc StarProject (StarProjectRequest) returns (StarProjectResponse) {}
+  rpc CheckProjectName (CheckProjectNameRequest) returns (CheckProjectNameResponse) {}
+  rpc CheckComponentName (CheckComponentNameRequest) returns (CheckComponentNameResponse) {}
+  rpc CheckFieldName (CheckFieldNameRequest) returns (CheckFieldNameResponse) {}
+}
+
+
+// Next available tag: 3
+message ListProjectsRequest {
+  int32 page_size = 1;
+  string page_token = 2;
+}
+
+
+// Next available tag: 3
+message ListProjectsResponse {
+  repeated Project projects = 1;
+  string next_page_token = 2;
+}
+
+
+// Next available tag: 3
+message ListProjectTemplatesRequest {
+  string project_name = 2;
+}
+
+
+// Next available tag: 2
+message ListProjectTemplatesResponse {
+  repeated TemplateDef templates = 1;
+}
+
+
+// Next available tag: 3
+message GetConfigRequest {
+  string project_name = 2;
+}
+
+// Next available tag: 3
+message GetPresentationConfigRequest {
+  string project_name = 2;
+}
+
+
+// Next available tag: 3
+message GetCustomPermissionsRequest {
+  string project_name = 2;
+}
+
+
+// Next available tag: 2
+message GetCustomPermissionsResponse {
+  repeated string permissions = 1;
+}
+
+
+// Next available tag: 3
+message GetVisibleMembersRequest {
+  string project_name = 2;
+}
+
+
+// Next available tag: 3
+message GetVisibleMembersResponse {
+  repeated UserRef user_refs = 1;
+  repeated UserRef group_refs = 2;
+}
+
+
+// Next available tag: 3
+message GetLabelOptionsRequest {
+  string project_name = 2;
+}
+
+
+// Next available tag: 3
+message GetLabelOptionsResponse {
+  repeated LabelDef label_options = 1;
+  repeated string exclusive_label_prefixes = 2;
+}
+
+
+// Next available tag: 3
+message ListStatusesRequest {
+  string project_name = 2;
+}
+
+
+// Next available tag: 4
+message ListStatusesResponse {
+  repeated StatusDef status_defs = 1;
+  repeated StatusRef statuses_offer_merge = 2;
+  bool restrict_to_known = 3;
+}
+
+
+// Next available tag: 4
+message ListComponentsRequest {
+  string project_name = 2;
+  bool include_admin_info = 3;
+}
+
+
+// Next available tag: 2
+message ListComponentsResponse {
+  repeated ComponentDef component_defs = 1;
+}
+
+
+// Next available tag: 5
+message ListFieldsRequest {
+  string project_name = 2;
+  bool include_admin_info = 3;
+  bool include_user_choices = 4;
+}
+
+
+// Next available tag: 2
+message ListFieldsResponse {
+  repeated FieldDef field_defs = 1;
+}
+
+
+// Next available tag: 3
+message GetProjectStarCountRequest {
+  string project_name = 2;
+}
+
+
+// Next available tag: 2
+message GetProjectStarCountResponse {
+  uint32 star_count = 1;
+}
+
+
+// Next available tag: 3
+message StarProjectRequest {
+  string project_name = 2;
+  bool starred = 3;
+}
+
+
+// Next available tag: 2
+message StarProjectResponse {
+  uint32 star_count = 1;
+}
+
+
+// Next available tag: 3
+message CheckProjectNameRequest {
+  string project_name = 2;
+}
+
+
+// Next available tag: 1
+message CheckProjectNameResponse {
+  string error = 1;
+}
+
+
+// Next available tag: 5
+message CheckComponentNameRequest {
+  string project_name = 2;
+  string parent_path = 3;
+  string component_name = 4;
+}
+
+
+// Next available tag: 2
+message CheckComponentNameResponse {
+  string error = 1;
+}
+
+
+// Next available tag: 4
+message CheckFieldNameRequest {
+  string project_name = 2;
+  string field_name = 3;
+}
+
+
+// Next available tag: 2
+message CheckFieldNameResponse {
+  string error = 1;
+}
diff --git a/api/api_proto/projects_pb2.py b/api/api_proto/projects_pb2.py
new file mode 100644
index 0000000..fa8a3fc
--- /dev/null
+++ b/api/api_proto/projects_pb2.py
@@ -0,0 +1,1375 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: api/api_proto/projects.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from api.api_proto import common_pb2 as api_dot_api__proto_dot_common__pb2
+from api.api_proto import project_objects_pb2 as api_dot_api__proto_dot_project__objects__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='api/api_proto/projects.proto',
+  package='monorail',
+  syntax='proto3',
+  serialized_options=None,
+  serialized_pb=_b('\n\x1c\x61pi/api_proto/projects.proto\x12\x08monorail\x1a\x1a\x61pi/api_proto/common.proto\x1a#api/api_proto/project_objects.proto\"<\n\x13ListProjectsRequest\x12\x11\n\tpage_size\x18\x01 \x01(\x05\x12\x12\n\npage_token\x18\x02 \x01(\t\"T\n\x14ListProjectsResponse\x12#\n\x08projects\x18\x01 \x03(\x0b\x32\x11.monorail.Project\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"3\n\x1bListProjectTemplatesRequest\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\"H\n\x1cListProjectTemplatesResponse\x12(\n\ttemplates\x18\x01 \x03(\x0b\x32\x15.monorail.TemplateDef\"(\n\x10GetConfigRequest\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\"4\n\x1cGetPresentationConfigRequest\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\"3\n\x1bGetCustomPermissionsRequest\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\"3\n\x1cGetCustomPermissionsResponse\x12\x13\n\x0bpermissions\x18\x01 \x03(\t\"0\n\x18GetVisibleMembersRequest\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\"h\n\x19GetVisibleMembersResponse\x12$\n\tuser_refs\x18\x01 \x03(\x0b\x32\x11.monorail.UserRef\x12%\n\ngroup_refs\x18\x02 \x03(\x0b\x32\x11.monorail.UserRef\".\n\x16GetLabelOptionsRequest\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\"f\n\x17GetLabelOptionsResponse\x12)\n\rlabel_options\x18\x01 \x03(\x0b\x32\x12.monorail.LabelDef\x12 \n\x18\x65xclusive_label_prefixes\x18\x02 \x03(\t\"+\n\x13ListStatusesRequest\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\"\x8e\x01\n\x14ListStatusesResponse\x12(\n\x0bstatus_defs\x18\x01 \x03(\x0b\x32\x13.monorail.StatusDef\x12\x31\n\x14statuses_offer_merge\x18\x02 \x03(\x0b\x32\x13.monorail.StatusRef\x12\x19\n\x11restrict_to_known\x18\x03 \x01(\x08\"I\n\x15ListComponentsRequest\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\x12\x1a\n\x12include_admin_info\x18\x03 \x01(\x08\"H\n\x16ListComponentsResponse\x12.\n\x0e\x63omponent_defs\x18\x01 \x03(\x0b\x32\x16.monorail.ComponentDef\"c\n\x11ListFieldsRequest\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\x12\x1a\n\x12include_admin_info\x18\x03 \x01(\x08\x12\x1c\n\x14include_user_choices\x18\x04 \x01(\x08\"<\n\x12ListFieldsResponse\x12&\n\nfield_defs\x18\x01 \x03(\x0b\x32\x12.monorail.FieldDef\"2\n\x1aGetProjectStarCountRequest\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\"1\n\x1bGetProjectStarCountResponse\x12\x12\n\nstar_count\x18\x01 \x01(\r\";\n\x12StarProjectRequest\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\x12\x0f\n\x07starred\x18\x03 \x01(\x08\")\n\x13StarProjectResponse\x12\x12\n\nstar_count\x18\x01 \x01(\r\"/\n\x17\x43heckProjectNameRequest\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\")\n\x18\x43heckProjectNameResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"^\n\x19\x43heckComponentNameRequest\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\x12\x13\n\x0bparent_path\x18\x03 \x01(\t\x12\x16\n\x0e\x63omponent_name\x18\x04 \x01(\t\"+\n\x1a\x43heckComponentNameResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t\"A\n\x15\x43heckFieldNameRequest\x12\x14\n\x0cproject_name\x18\x02 \x01(\t\x12\x12\n\nfield_name\x18\x03 \x01(\t\"\'\n\x16\x43heckFieldNameResponse\x12\r\n\x05\x65rror\x18\x01 \x01(\t2\xc3\n\n\x08Projects\x12O\n\x0cListProjects\x12\x1d.monorail.ListProjectsRequest\x1a\x1e.monorail.ListProjectsResponse\"\x00\x12g\n\x14ListProjectTemplates\x12%.monorail.ListProjectTemplatesRequest\x1a&.monorail.ListProjectTemplatesResponse\"\x00\x12;\n\tGetConfig\x12\x1a.monorail.GetConfigRequest\x1a\x10.monorail.Config\"\x00\x12_\n\x15GetPresentationConfig\x12&.monorail.GetPresentationConfigRequest\x1a\x1c.monorail.PresentationConfig\"\x00\x12g\n\x14GetCustomPermissions\x12%.monorail.GetCustomPermissionsRequest\x1a&.monorail.GetCustomPermissionsResponse\"\x00\x12^\n\x11GetVisibleMembers\x12\".monorail.GetVisibleMembersRequest\x1a#.monorail.GetVisibleMembersResponse\"\x00\x12X\n\x0fGetLabelOptions\x12 .monorail.GetLabelOptionsRequest\x1a!.monorail.GetLabelOptionsResponse\"\x00\x12O\n\x0cListStatuses\x12\x1d.monorail.ListStatusesRequest\x1a\x1e.monorail.ListStatusesResponse\"\x00\x12U\n\x0eListComponents\x12\x1f.monorail.ListComponentsRequest\x1a .monorail.ListComponentsResponse\"\x00\x12I\n\nListFields\x12\x1b.monorail.ListFieldsRequest\x1a\x1c.monorail.ListFieldsResponse\"\x00\x12\x64\n\x13GetProjectStarCount\x12$.monorail.GetProjectStarCountRequest\x1a%.monorail.GetProjectStarCountResponse\"\x00\x12L\n\x0bStarProject\x12\x1c.monorail.StarProjectRequest\x1a\x1d.monorail.StarProjectResponse\"\x00\x12[\n\x10\x43heckProjectName\x12!.monorail.CheckProjectNameRequest\x1a\".monorail.CheckProjectNameResponse\"\x00\x12\x61\n\x12\x43heckComponentName\x12#.monorail.CheckComponentNameRequest\x1a$.monorail.CheckComponentNameResponse\"\x00\x12U\n\x0e\x43heckFieldName\x12\x1f.monorail.CheckFieldNameRequest\x1a .monorail.CheckFieldNameResponse\"\x00\x62\x06proto3')
+  ,
+  dependencies=[api_dot_api__proto_dot_common__pb2.DESCRIPTOR,api_dot_api__proto_dot_project__objects__pb2.DESCRIPTOR,])
+
+
+
+
+_LISTPROJECTSREQUEST = _descriptor.Descriptor(
+  name='ListProjectsRequest',
+  full_name='monorail.ListProjectsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='page_size', full_name='monorail.ListProjectsRequest.page_size', index=0,
+      number=1, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='page_token', full_name='monorail.ListProjectsRequest.page_token', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=107,
+  serialized_end=167,
+)
+
+
+_LISTPROJECTSRESPONSE = _descriptor.Descriptor(
+  name='ListProjectsResponse',
+  full_name='monorail.ListProjectsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='projects', full_name='monorail.ListProjectsResponse.projects', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='next_page_token', full_name='monorail.ListProjectsResponse.next_page_token', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=169,
+  serialized_end=253,
+)
+
+
+_LISTPROJECTTEMPLATESREQUEST = _descriptor.Descriptor(
+  name='ListProjectTemplatesRequest',
+  full_name='monorail.ListProjectTemplatesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.ListProjectTemplatesRequest.project_name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=255,
+  serialized_end=306,
+)
+
+
+_LISTPROJECTTEMPLATESRESPONSE = _descriptor.Descriptor(
+  name='ListProjectTemplatesResponse',
+  full_name='monorail.ListProjectTemplatesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='templates', full_name='monorail.ListProjectTemplatesResponse.templates', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=308,
+  serialized_end=380,
+)
+
+
+_GETCONFIGREQUEST = _descriptor.Descriptor(
+  name='GetConfigRequest',
+  full_name='monorail.GetConfigRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.GetConfigRequest.project_name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=382,
+  serialized_end=422,
+)
+
+
+_GETPRESENTATIONCONFIGREQUEST = _descriptor.Descriptor(
+  name='GetPresentationConfigRequest',
+  full_name='monorail.GetPresentationConfigRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.GetPresentationConfigRequest.project_name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=424,
+  serialized_end=476,
+)
+
+
+_GETCUSTOMPERMISSIONSREQUEST = _descriptor.Descriptor(
+  name='GetCustomPermissionsRequest',
+  full_name='monorail.GetCustomPermissionsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.GetCustomPermissionsRequest.project_name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=478,
+  serialized_end=529,
+)
+
+
+_GETCUSTOMPERMISSIONSRESPONSE = _descriptor.Descriptor(
+  name='GetCustomPermissionsResponse',
+  full_name='monorail.GetCustomPermissionsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='permissions', full_name='monorail.GetCustomPermissionsResponse.permissions', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=531,
+  serialized_end=582,
+)
+
+
+_GETVISIBLEMEMBERSREQUEST = _descriptor.Descriptor(
+  name='GetVisibleMembersRequest',
+  full_name='monorail.GetVisibleMembersRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.GetVisibleMembersRequest.project_name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=584,
+  serialized_end=632,
+)
+
+
+_GETVISIBLEMEMBERSRESPONSE = _descriptor.Descriptor(
+  name='GetVisibleMembersResponse',
+  full_name='monorail.GetVisibleMembersResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_refs', full_name='monorail.GetVisibleMembersResponse.user_refs', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='group_refs', full_name='monorail.GetVisibleMembersResponse.group_refs', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=634,
+  serialized_end=738,
+)
+
+
+_GETLABELOPTIONSREQUEST = _descriptor.Descriptor(
+  name='GetLabelOptionsRequest',
+  full_name='monorail.GetLabelOptionsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.GetLabelOptionsRequest.project_name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=740,
+  serialized_end=786,
+)
+
+
+_GETLABELOPTIONSRESPONSE = _descriptor.Descriptor(
+  name='GetLabelOptionsResponse',
+  full_name='monorail.GetLabelOptionsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='label_options', full_name='monorail.GetLabelOptionsResponse.label_options', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='exclusive_label_prefixes', full_name='monorail.GetLabelOptionsResponse.exclusive_label_prefixes', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=788,
+  serialized_end=890,
+)
+
+
+_LISTSTATUSESREQUEST = _descriptor.Descriptor(
+  name='ListStatusesRequest',
+  full_name='monorail.ListStatusesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.ListStatusesRequest.project_name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=892,
+  serialized_end=935,
+)
+
+
+_LISTSTATUSESRESPONSE = _descriptor.Descriptor(
+  name='ListStatusesResponse',
+  full_name='monorail.ListStatusesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status_defs', full_name='monorail.ListStatusesResponse.status_defs', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='statuses_offer_merge', full_name='monorail.ListStatusesResponse.statuses_offer_merge', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='restrict_to_known', full_name='monorail.ListStatusesResponse.restrict_to_known', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=938,
+  serialized_end=1080,
+)
+
+
+_LISTCOMPONENTSREQUEST = _descriptor.Descriptor(
+  name='ListComponentsRequest',
+  full_name='monorail.ListComponentsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.ListComponentsRequest.project_name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='include_admin_info', full_name='monorail.ListComponentsRequest.include_admin_info', index=1,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1082,
+  serialized_end=1155,
+)
+
+
+_LISTCOMPONENTSRESPONSE = _descriptor.Descriptor(
+  name='ListComponentsResponse',
+  full_name='monorail.ListComponentsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='component_defs', full_name='monorail.ListComponentsResponse.component_defs', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1157,
+  serialized_end=1229,
+)
+
+
+_LISTFIELDSREQUEST = _descriptor.Descriptor(
+  name='ListFieldsRequest',
+  full_name='monorail.ListFieldsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.ListFieldsRequest.project_name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='include_admin_info', full_name='monorail.ListFieldsRequest.include_admin_info', index=1,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='include_user_choices', full_name='monorail.ListFieldsRequest.include_user_choices', index=2,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1231,
+  serialized_end=1330,
+)
+
+
+_LISTFIELDSRESPONSE = _descriptor.Descriptor(
+  name='ListFieldsResponse',
+  full_name='monorail.ListFieldsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='field_defs', full_name='monorail.ListFieldsResponse.field_defs', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1332,
+  serialized_end=1392,
+)
+
+
+_GETPROJECTSTARCOUNTREQUEST = _descriptor.Descriptor(
+  name='GetProjectStarCountRequest',
+  full_name='monorail.GetProjectStarCountRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.GetProjectStarCountRequest.project_name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1394,
+  serialized_end=1444,
+)
+
+
+_GETPROJECTSTARCOUNTRESPONSE = _descriptor.Descriptor(
+  name='GetProjectStarCountResponse',
+  full_name='monorail.GetProjectStarCountResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='star_count', full_name='monorail.GetProjectStarCountResponse.star_count', index=0,
+      number=1, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1446,
+  serialized_end=1495,
+)
+
+
+_STARPROJECTREQUEST = _descriptor.Descriptor(
+  name='StarProjectRequest',
+  full_name='monorail.StarProjectRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.StarProjectRequest.project_name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='starred', full_name='monorail.StarProjectRequest.starred', index=1,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1497,
+  serialized_end=1556,
+)
+
+
+_STARPROJECTRESPONSE = _descriptor.Descriptor(
+  name='StarProjectResponse',
+  full_name='monorail.StarProjectResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='star_count', full_name='monorail.StarProjectResponse.star_count', index=0,
+      number=1, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1558,
+  serialized_end=1599,
+)
+
+
+_CHECKPROJECTNAMEREQUEST = _descriptor.Descriptor(
+  name='CheckProjectNameRequest',
+  full_name='monorail.CheckProjectNameRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.CheckProjectNameRequest.project_name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1601,
+  serialized_end=1648,
+)
+
+
+_CHECKPROJECTNAMERESPONSE = _descriptor.Descriptor(
+  name='CheckProjectNameResponse',
+  full_name='monorail.CheckProjectNameResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='error', full_name='monorail.CheckProjectNameResponse.error', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1650,
+  serialized_end=1691,
+)
+
+
+_CHECKCOMPONENTNAMEREQUEST = _descriptor.Descriptor(
+  name='CheckComponentNameRequest',
+  full_name='monorail.CheckComponentNameRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.CheckComponentNameRequest.project_name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='parent_path', full_name='monorail.CheckComponentNameRequest.parent_path', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='component_name', full_name='monorail.CheckComponentNameRequest.component_name', index=2,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1693,
+  serialized_end=1787,
+)
+
+
+_CHECKCOMPONENTNAMERESPONSE = _descriptor.Descriptor(
+  name='CheckComponentNameResponse',
+  full_name='monorail.CheckComponentNameResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='error', full_name='monorail.CheckComponentNameResponse.error', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1789,
+  serialized_end=1832,
+)
+
+
+_CHECKFIELDNAMEREQUEST = _descriptor.Descriptor(
+  name='CheckFieldNameRequest',
+  full_name='monorail.CheckFieldNameRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='project_name', full_name='monorail.CheckFieldNameRequest.project_name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='field_name', full_name='monorail.CheckFieldNameRequest.field_name', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1834,
+  serialized_end=1899,
+)
+
+
+_CHECKFIELDNAMERESPONSE = _descriptor.Descriptor(
+  name='CheckFieldNameResponse',
+  full_name='monorail.CheckFieldNameResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='error', full_name='monorail.CheckFieldNameResponse.error', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1901,
+  serialized_end=1940,
+)
+
+_LISTPROJECTSRESPONSE.fields_by_name['projects'].message_type = api_dot_api__proto_dot_project__objects__pb2._PROJECT
+_LISTPROJECTTEMPLATESRESPONSE.fields_by_name['templates'].message_type = api_dot_api__proto_dot_project__objects__pb2._TEMPLATEDEF
+_GETVISIBLEMEMBERSRESPONSE.fields_by_name['user_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_GETVISIBLEMEMBERSRESPONSE.fields_by_name['group_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_GETLABELOPTIONSRESPONSE.fields_by_name['label_options'].message_type = api_dot_api__proto_dot_project__objects__pb2._LABELDEF
+_LISTSTATUSESRESPONSE.fields_by_name['status_defs'].message_type = api_dot_api__proto_dot_project__objects__pb2._STATUSDEF
+_LISTSTATUSESRESPONSE.fields_by_name['statuses_offer_merge'].message_type = api_dot_api__proto_dot_common__pb2._STATUSREF
+_LISTCOMPONENTSRESPONSE.fields_by_name['component_defs'].message_type = api_dot_api__proto_dot_project__objects__pb2._COMPONENTDEF
+_LISTFIELDSRESPONSE.fields_by_name['field_defs'].message_type = api_dot_api__proto_dot_project__objects__pb2._FIELDDEF
+DESCRIPTOR.message_types_by_name['ListProjectsRequest'] = _LISTPROJECTSREQUEST
+DESCRIPTOR.message_types_by_name['ListProjectsResponse'] = _LISTPROJECTSRESPONSE
+DESCRIPTOR.message_types_by_name['ListProjectTemplatesRequest'] = _LISTPROJECTTEMPLATESREQUEST
+DESCRIPTOR.message_types_by_name['ListProjectTemplatesResponse'] = _LISTPROJECTTEMPLATESRESPONSE
+DESCRIPTOR.message_types_by_name['GetConfigRequest'] = _GETCONFIGREQUEST
+DESCRIPTOR.message_types_by_name['GetPresentationConfigRequest'] = _GETPRESENTATIONCONFIGREQUEST
+DESCRIPTOR.message_types_by_name['GetCustomPermissionsRequest'] = _GETCUSTOMPERMISSIONSREQUEST
+DESCRIPTOR.message_types_by_name['GetCustomPermissionsResponse'] = _GETCUSTOMPERMISSIONSRESPONSE
+DESCRIPTOR.message_types_by_name['GetVisibleMembersRequest'] = _GETVISIBLEMEMBERSREQUEST
+DESCRIPTOR.message_types_by_name['GetVisibleMembersResponse'] = _GETVISIBLEMEMBERSRESPONSE
+DESCRIPTOR.message_types_by_name['GetLabelOptionsRequest'] = _GETLABELOPTIONSREQUEST
+DESCRIPTOR.message_types_by_name['GetLabelOptionsResponse'] = _GETLABELOPTIONSRESPONSE
+DESCRIPTOR.message_types_by_name['ListStatusesRequest'] = _LISTSTATUSESREQUEST
+DESCRIPTOR.message_types_by_name['ListStatusesResponse'] = _LISTSTATUSESRESPONSE
+DESCRIPTOR.message_types_by_name['ListComponentsRequest'] = _LISTCOMPONENTSREQUEST
+DESCRIPTOR.message_types_by_name['ListComponentsResponse'] = _LISTCOMPONENTSRESPONSE
+DESCRIPTOR.message_types_by_name['ListFieldsRequest'] = _LISTFIELDSREQUEST
+DESCRIPTOR.message_types_by_name['ListFieldsResponse'] = _LISTFIELDSRESPONSE
+DESCRIPTOR.message_types_by_name['GetProjectStarCountRequest'] = _GETPROJECTSTARCOUNTREQUEST
+DESCRIPTOR.message_types_by_name['GetProjectStarCountResponse'] = _GETPROJECTSTARCOUNTRESPONSE
+DESCRIPTOR.message_types_by_name['StarProjectRequest'] = _STARPROJECTREQUEST
+DESCRIPTOR.message_types_by_name['StarProjectResponse'] = _STARPROJECTRESPONSE
+DESCRIPTOR.message_types_by_name['CheckProjectNameRequest'] = _CHECKPROJECTNAMEREQUEST
+DESCRIPTOR.message_types_by_name['CheckProjectNameResponse'] = _CHECKPROJECTNAMERESPONSE
+DESCRIPTOR.message_types_by_name['CheckComponentNameRequest'] = _CHECKCOMPONENTNAMEREQUEST
+DESCRIPTOR.message_types_by_name['CheckComponentNameResponse'] = _CHECKCOMPONENTNAMERESPONSE
+DESCRIPTOR.message_types_by_name['CheckFieldNameRequest'] = _CHECKFIELDNAMEREQUEST
+DESCRIPTOR.message_types_by_name['CheckFieldNameResponse'] = _CHECKFIELDNAMERESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+ListProjectsRequest = _reflection.GeneratedProtocolMessageType('ListProjectsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTPROJECTSREQUEST,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListProjectsRequest)
+  ))
+_sym_db.RegisterMessage(ListProjectsRequest)
+
+ListProjectsResponse = _reflection.GeneratedProtocolMessageType('ListProjectsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTPROJECTSRESPONSE,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListProjectsResponse)
+  ))
+_sym_db.RegisterMessage(ListProjectsResponse)
+
+ListProjectTemplatesRequest = _reflection.GeneratedProtocolMessageType('ListProjectTemplatesRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTPROJECTTEMPLATESREQUEST,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListProjectTemplatesRequest)
+  ))
+_sym_db.RegisterMessage(ListProjectTemplatesRequest)
+
+ListProjectTemplatesResponse = _reflection.GeneratedProtocolMessageType('ListProjectTemplatesResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTPROJECTTEMPLATESRESPONSE,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListProjectTemplatesResponse)
+  ))
+_sym_db.RegisterMessage(ListProjectTemplatesResponse)
+
+GetConfigRequest = _reflection.GeneratedProtocolMessageType('GetConfigRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETCONFIGREQUEST,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetConfigRequest)
+  ))
+_sym_db.RegisterMessage(GetConfigRequest)
+
+GetPresentationConfigRequest = _reflection.GeneratedProtocolMessageType('GetPresentationConfigRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETPRESENTATIONCONFIGREQUEST,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetPresentationConfigRequest)
+  ))
+_sym_db.RegisterMessage(GetPresentationConfigRequest)
+
+GetCustomPermissionsRequest = _reflection.GeneratedProtocolMessageType('GetCustomPermissionsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETCUSTOMPERMISSIONSREQUEST,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetCustomPermissionsRequest)
+  ))
+_sym_db.RegisterMessage(GetCustomPermissionsRequest)
+
+GetCustomPermissionsResponse = _reflection.GeneratedProtocolMessageType('GetCustomPermissionsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _GETCUSTOMPERMISSIONSRESPONSE,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetCustomPermissionsResponse)
+  ))
+_sym_db.RegisterMessage(GetCustomPermissionsResponse)
+
+GetVisibleMembersRequest = _reflection.GeneratedProtocolMessageType('GetVisibleMembersRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETVISIBLEMEMBERSREQUEST,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetVisibleMembersRequest)
+  ))
+_sym_db.RegisterMessage(GetVisibleMembersRequest)
+
+GetVisibleMembersResponse = _reflection.GeneratedProtocolMessageType('GetVisibleMembersResponse', (_message.Message,), dict(
+  DESCRIPTOR = _GETVISIBLEMEMBERSRESPONSE,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetVisibleMembersResponse)
+  ))
+_sym_db.RegisterMessage(GetVisibleMembersResponse)
+
+GetLabelOptionsRequest = _reflection.GeneratedProtocolMessageType('GetLabelOptionsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETLABELOPTIONSREQUEST,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetLabelOptionsRequest)
+  ))
+_sym_db.RegisterMessage(GetLabelOptionsRequest)
+
+GetLabelOptionsResponse = _reflection.GeneratedProtocolMessageType('GetLabelOptionsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _GETLABELOPTIONSRESPONSE,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetLabelOptionsResponse)
+  ))
+_sym_db.RegisterMessage(GetLabelOptionsResponse)
+
+ListStatusesRequest = _reflection.GeneratedProtocolMessageType('ListStatusesRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTSTATUSESREQUEST,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListStatusesRequest)
+  ))
+_sym_db.RegisterMessage(ListStatusesRequest)
+
+ListStatusesResponse = _reflection.GeneratedProtocolMessageType('ListStatusesResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTSTATUSESRESPONSE,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListStatusesResponse)
+  ))
+_sym_db.RegisterMessage(ListStatusesResponse)
+
+ListComponentsRequest = _reflection.GeneratedProtocolMessageType('ListComponentsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTCOMPONENTSREQUEST,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListComponentsRequest)
+  ))
+_sym_db.RegisterMessage(ListComponentsRequest)
+
+ListComponentsResponse = _reflection.GeneratedProtocolMessageType('ListComponentsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTCOMPONENTSRESPONSE,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListComponentsResponse)
+  ))
+_sym_db.RegisterMessage(ListComponentsResponse)
+
+ListFieldsRequest = _reflection.GeneratedProtocolMessageType('ListFieldsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTFIELDSREQUEST,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListFieldsRequest)
+  ))
+_sym_db.RegisterMessage(ListFieldsRequest)
+
+ListFieldsResponse = _reflection.GeneratedProtocolMessageType('ListFieldsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTFIELDSRESPONSE,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListFieldsResponse)
+  ))
+_sym_db.RegisterMessage(ListFieldsResponse)
+
+GetProjectStarCountRequest = _reflection.GeneratedProtocolMessageType('GetProjectStarCountRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETPROJECTSTARCOUNTREQUEST,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetProjectStarCountRequest)
+  ))
+_sym_db.RegisterMessage(GetProjectStarCountRequest)
+
+GetProjectStarCountResponse = _reflection.GeneratedProtocolMessageType('GetProjectStarCountResponse', (_message.Message,), dict(
+  DESCRIPTOR = _GETPROJECTSTARCOUNTRESPONSE,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetProjectStarCountResponse)
+  ))
+_sym_db.RegisterMessage(GetProjectStarCountResponse)
+
+StarProjectRequest = _reflection.GeneratedProtocolMessageType('StarProjectRequest', (_message.Message,), dict(
+  DESCRIPTOR = _STARPROJECTREQUEST,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.StarProjectRequest)
+  ))
+_sym_db.RegisterMessage(StarProjectRequest)
+
+StarProjectResponse = _reflection.GeneratedProtocolMessageType('StarProjectResponse', (_message.Message,), dict(
+  DESCRIPTOR = _STARPROJECTRESPONSE,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.StarProjectResponse)
+  ))
+_sym_db.RegisterMessage(StarProjectResponse)
+
+CheckProjectNameRequest = _reflection.GeneratedProtocolMessageType('CheckProjectNameRequest', (_message.Message,), dict(
+  DESCRIPTOR = _CHECKPROJECTNAMEREQUEST,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.CheckProjectNameRequest)
+  ))
+_sym_db.RegisterMessage(CheckProjectNameRequest)
+
+CheckProjectNameResponse = _reflection.GeneratedProtocolMessageType('CheckProjectNameResponse', (_message.Message,), dict(
+  DESCRIPTOR = _CHECKPROJECTNAMERESPONSE,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.CheckProjectNameResponse)
+  ))
+_sym_db.RegisterMessage(CheckProjectNameResponse)
+
+CheckComponentNameRequest = _reflection.GeneratedProtocolMessageType('CheckComponentNameRequest', (_message.Message,), dict(
+  DESCRIPTOR = _CHECKCOMPONENTNAMEREQUEST,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.CheckComponentNameRequest)
+  ))
+_sym_db.RegisterMessage(CheckComponentNameRequest)
+
+CheckComponentNameResponse = _reflection.GeneratedProtocolMessageType('CheckComponentNameResponse', (_message.Message,), dict(
+  DESCRIPTOR = _CHECKCOMPONENTNAMERESPONSE,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.CheckComponentNameResponse)
+  ))
+_sym_db.RegisterMessage(CheckComponentNameResponse)
+
+CheckFieldNameRequest = _reflection.GeneratedProtocolMessageType('CheckFieldNameRequest', (_message.Message,), dict(
+  DESCRIPTOR = _CHECKFIELDNAMEREQUEST,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.CheckFieldNameRequest)
+  ))
+_sym_db.RegisterMessage(CheckFieldNameRequest)
+
+CheckFieldNameResponse = _reflection.GeneratedProtocolMessageType('CheckFieldNameResponse', (_message.Message,), dict(
+  DESCRIPTOR = _CHECKFIELDNAMERESPONSE,
+  __module__ = 'api.api_proto.projects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.CheckFieldNameResponse)
+  ))
+_sym_db.RegisterMessage(CheckFieldNameResponse)
+
+
+
+_PROJECTS = _descriptor.ServiceDescriptor(
+  name='Projects',
+  full_name='monorail.Projects',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  serialized_start=1943,
+  serialized_end=3290,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='ListProjects',
+    full_name='monorail.Projects.ListProjects',
+    index=0,
+    containing_service=None,
+    input_type=_LISTPROJECTSREQUEST,
+    output_type=_LISTPROJECTSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListProjectTemplates',
+    full_name='monorail.Projects.ListProjectTemplates',
+    index=1,
+    containing_service=None,
+    input_type=_LISTPROJECTTEMPLATESREQUEST,
+    output_type=_LISTPROJECTTEMPLATESRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetConfig',
+    full_name='monorail.Projects.GetConfig',
+    index=2,
+    containing_service=None,
+    input_type=_GETCONFIGREQUEST,
+    output_type=api_dot_api__proto_dot_project__objects__pb2._CONFIG,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetPresentationConfig',
+    full_name='monorail.Projects.GetPresentationConfig',
+    index=3,
+    containing_service=None,
+    input_type=_GETPRESENTATIONCONFIGREQUEST,
+    output_type=api_dot_api__proto_dot_project__objects__pb2._PRESENTATIONCONFIG,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetCustomPermissions',
+    full_name='monorail.Projects.GetCustomPermissions',
+    index=4,
+    containing_service=None,
+    input_type=_GETCUSTOMPERMISSIONSREQUEST,
+    output_type=_GETCUSTOMPERMISSIONSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetVisibleMembers',
+    full_name='monorail.Projects.GetVisibleMembers',
+    index=5,
+    containing_service=None,
+    input_type=_GETVISIBLEMEMBERSREQUEST,
+    output_type=_GETVISIBLEMEMBERSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetLabelOptions',
+    full_name='monorail.Projects.GetLabelOptions',
+    index=6,
+    containing_service=None,
+    input_type=_GETLABELOPTIONSREQUEST,
+    output_type=_GETLABELOPTIONSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListStatuses',
+    full_name='monorail.Projects.ListStatuses',
+    index=7,
+    containing_service=None,
+    input_type=_LISTSTATUSESREQUEST,
+    output_type=_LISTSTATUSESRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListComponents',
+    full_name='monorail.Projects.ListComponents',
+    index=8,
+    containing_service=None,
+    input_type=_LISTCOMPONENTSREQUEST,
+    output_type=_LISTCOMPONENTSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListFields',
+    full_name='monorail.Projects.ListFields',
+    index=9,
+    containing_service=None,
+    input_type=_LISTFIELDSREQUEST,
+    output_type=_LISTFIELDSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetProjectStarCount',
+    full_name='monorail.Projects.GetProjectStarCount',
+    index=10,
+    containing_service=None,
+    input_type=_GETPROJECTSTARCOUNTREQUEST,
+    output_type=_GETPROJECTSTARCOUNTRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='StarProject',
+    full_name='monorail.Projects.StarProject',
+    index=11,
+    containing_service=None,
+    input_type=_STARPROJECTREQUEST,
+    output_type=_STARPROJECTRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CheckProjectName',
+    full_name='monorail.Projects.CheckProjectName',
+    index=12,
+    containing_service=None,
+    input_type=_CHECKPROJECTNAMEREQUEST,
+    output_type=_CHECKPROJECTNAMERESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CheckComponentName',
+    full_name='monorail.Projects.CheckComponentName',
+    index=13,
+    containing_service=None,
+    input_type=_CHECKCOMPONENTNAMEREQUEST,
+    output_type=_CHECKCOMPONENTNAMERESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CheckFieldName',
+    full_name='monorail.Projects.CheckFieldName',
+    index=14,
+    containing_service=None,
+    input_type=_CHECKFIELDNAMEREQUEST,
+    output_type=_CHECKFIELDNAMERESPONSE,
+    serialized_options=None,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_PROJECTS)
+
+DESCRIPTOR.services_by_name['Projects'] = _PROJECTS
+
+# @@protoc_insertion_point(module_scope)
diff --git a/api/api_proto/projects_prpc_pb2.py b/api/api_proto/projects_prpc_pb2.py
new file mode 100644
index 0000000..fee63f3
--- /dev/null
+++ b/api/api_proto/projects_prpc_pb2.py
@@ -0,0 +1,313 @@
+# Generated by the pRPC protocol buffer compiler plugin.  DO NOT EDIT!
+# source: api/api_proto/projects.proto
+
+import base64
+import zlib
+
+from google.protobuf import descriptor_pb2
+
+# Includes description of the api/api_proto/projects.proto and all of its transitive
+# dependencies. Includes source code info.
+FILE_DESCRIPTOR_SET = descriptor_pb2.FileDescriptorSet()
+FILE_DESCRIPTOR_SET.ParseFromString(zlib.decompress(base64.b64decode(
+    'eJztfVtwXNlx2Nw77zOD153BawAQlwO+CYIkSO5ySe4u8SIJLghgBwApcncJDoABMORgBjszIJ'
+    'fah2LZcvyQZb0lO3Zka6VUWU5iybaUsiW/IsWJJScl5SsfqUrlK/nLTypJpSqudPfpPvcOCBCk'
+    'XE6qUtkqLqbvOae7T58+fc893X2O+ptrqje/WTwJ/xY3q5V65ST8/35huV4bItCJbVTKlWq+WM'
+    'pkGustVzagSNfKDOyIY7Gy5EOVfV2lpoq1+iwTyBXe3irU6k6Pim/m1wqLteJHC12Wax0J52L4'
+    'YA5gp08pKqxXHhTKXTaUxnNUfR4fZDdUuhFlbbNSrhWcEyom/QCUwSOJ4bYh6cgQ186ZKs4h1V'
+    'IuvFNffIJUEz6eNeQuqx4fufnCxmYpXy+YnuxXSel5Ob9RYBwJfjYNj7JzqndnDMz4GRWvy0Pm'
+    'vN3jXOqPF1ZzXr3sOdV6tVAfq5RXi2vPwcuI6oVms9VCrVCu5+vFSvm5UYBAkPJWrV7ZmC1UN4'
+    'q1GqB5HoFcJiZ2wMACcVVi03tMIkEM3qPsy6oLMNws1opLpcKNwsZSofo8DLyvundoztSHVHyr'
+    'VqguVgurOyjSAhTlYChiW/pHzTml1Fq1srWpG9i7NYhTJWyRvag6gPxUfqlQmtmsP6fwPmmpzi'
+    'daM+svqqYSPl+s6AJm3/G4oWaoSsmSD4FzXnUV3lkubdWKDwuLGsUmdKf4TkH3KJ7rMOWEYpZL'
+    's+f1BJ8DZQKJPE9H/szSE9lryr04qxI1era44g1ByuuDboCdUDX5WXMmVLrGmBYrq6swgBuF6l'
+    'qBB+SJ5jgkjjSYwfo3sLpzTLXB5KhXi8B5vbL4oFx5VO4KAvexXIsUzFdew8fZddWOHRirbADj'
+    'MJ+eo/fOoHKKZZDoSmExv7JRLC8Wy6sVJtTKJSNYMAnPs7dUx3ZKLKyXVfOyPPXLq8PrsGmFIm'
+    'ta9kG17Bct1YaYrxQLpZW/M/5hjqSlNs2t5fVKcRl0K0T1BRNOlTFdkr2qHD9f3NvTSq3iE39P'
+    'fdpNtclQrvKvWvZVlSGLR6zD2FfHKlvl+nPo6SWyd08iYJbgbQVqBF3Cp/Qua8rFa1INXoAOtp'
+    'H3z7MLuEtFEUu1sMJSFTB7VqUaUD4bI5dU59h6YfnBrEfjOYRwSnU92ZoJp1W4UK1WqkQzntNA'
+    '9uct1U1NjPo9H0mnH94C+Sqq9Wa+vk5CiOeUfjQLT5yDftUnLCH9Al/2U8wOq8xOfDyV+duqnd'
+    'qQQj0n332io1RBs631kdgZUh3bUT+NleHvKxWTtY4zo5L+tY/T57PsTy6zMvt2K9YUswFnrWEx'
+    'ZdYmzsEdW25f/WQO7VXNELqo4ma94mS8ZtsXMZlWv+HCAmi8qNp3XLU4hxoQ7bqsyfT6V4LbK2'
+    'kx7LQi8YvhKWuezKG9qhkx3FVtT6w8nGxD8x1XNZmBp9Yx+D+iWrYtDhy3oeUOq47M/qfUMJhZ'
+    '9eRtvV31ti0Atqve9pc8IFxQzY3vNKe/sc0T79WMu3sFg3ZSKe/F4fQ0tmh4zfm14sl3DaBaUa'
+    'kdLL9zYJvS7fhmyRzco5ahMqUSPnPu9DasVLa9ODJ9u5QabG+o1u2G2vGN7y6vgEz2aVUM8rxy'
+    'njSlzsC2tjsZ/MyBp1fya0WjefRrxY422a8VO1vWbOD6x4+rqBMOB/6tZan/ZCkr6QTDAWf431'
+    'vuWGXzcbW4tl53h0+dPu/OrxfcsfVqZaO4teGObNXXK9XakDtSKrlUqeai+ag+LKwMKRfWK25l'
+    '1a2vF2turbJVXS64y5WVggvgWuVhoVourLhLj928Ozo3fqJWf1wqKLcEqxtgCRrl6+5yvuwuFd'
+    'xV0IgVt1iGhwV3anJsYnpuwl0tlgB71c3Xlbter2/WLpw8uVJ4WChV4EOoNrRWqayVCkPwqjsJ'
+    'D8onNP2TjL52cqm2Ai8OZdlOMBZrVXFlBwNOUEUH6KflBBPRQaWUHQk4oebAPgt+ByMBeN4MtR'
+    'MqFAnYUL/Fvq6SKowAFLVEHIEAbUv6sEBBgIavcDOo2GovcZGFUCQjEDRr7X1RIGjWOnqXm0FR'
+    'm/0CFyGStkiLQFjWtl8gaNY2OMzNAHDsO1yE/XIiPQJBM6fvJYGw5vhNbhZyginDZAiapQyTIW'
+    'iWMkyGoFnKMBl2gmn7NheFoVk60ikQNEt3nxYImqUvLXCziBNst+e4KALN2iPtAkGz9s4TAkGz'
+    '9vMz3CzqBDvMAEShWYcZgCg06zADEIVmHWYAYk6w057lohg064ykBYJmnR3HBYJmnS9McbO4E+'
+    'yyx7koDs26Iq0CQbMuZ0AgaNY1dJmbKSfYbS9ykYJm3ZFugaBZd885gaBZ9+U3uFnCCWbsq1yU'
+    'gGaZSJtA0CyTOigQNMucGuNmMG977JtclIRmPZEOgaBZT9dJgaBZz4UcN2tygr32m1zUBM16I1'
+    '0CQbPezBmBoFnvKx/hZs1OsM9Ishma9RlJNkOzPiPJZmjWB5IcUHYIJlQ2cNDKdLrThXfqbv4h'
+    'GKY8vKzden7tgntG4UwL4XTKxnqQTohm2oDdoZpUGIGQExqws32IGsEwFkYFgnYDsTaBgOxAup'
+    '2xQNEBu4uxWIDlgD3QwTWtMBbGBMKq8ZRAgOVARycxbzmho4HBPZjH5kdjvUTWQuaP2S7hspB5'
+    'gJRAoPjHEo5A0OxYqkcgoHpsXz8jgaLjdh/xbhHvx+1jghN5P868W8T78XiXQIDleE8v8W47oV'
+    'OB4T14R0qnYgNE1kbeT9sZImuT4E/bp0jxEAxjYUwgaHc63i4QkD3d1U1kg07ohcD53cgOa7Jo'
+    'mV6IHSCyQST7oq3pBElkL7LIgiSyFxMdAkGzFztdgYDqiwMHiCrweinwyh6dRcN2KdZFVENI9W'
+    'XubIg6+7J9iYwegmEsjAkE7V7mzoaI7Mvc2bATGgmM7UEWDeMIdzaMZEeZbJjIjtojhwh1mMiO'
+    'MtkwkR1lsmEiO8pkI07oamByD7JoWK/y0EaQ7DUmGyGy1+yrWuQRInuNyUaI7DUmGyGy15hs1A'
+    'ndCMzsMbRomG9wb6NIdtrOEq4oDe00D22UqE4n2gSCZtNOn0BAddrdT1RjTmgusLBHZ9Guz8Vc'
+    'ohpDqvPc2Rh1dt6e00zEiOw8dzZGZOe5szEiO8+djTuh24E39yCL74Xbsf1ENo5k79j0XkYghJ'
+    'ASCPT4Dk/9OFG9k+oVCKje6XcZCRS9wRKL49QHSJBYgOQNgwRn/hupPoEAyRssMeWE7gWW9mAd'
+    '3033YvuIqkLW8ywxRRLL2/f0PFMksTxLTBHveZaYIt7zLLGEE1oNFPcgi++21Zi2cwkku2Zr7U'
+    '+QxNa4swmS2FoiJRA0W0vvFwiorh04yEigaN0+yUUosXWDBG3lOutYgiS27hwTCJCsnxgi1pNO'
+    'aCNQ2YN1fL9u8EsqiayXWWJJkljZ3tCDkSSJlVliSeK9zBJLEu9llliTE6oFHu1G9qwmi+/nGr'
+    '9empBsnW1lE0mszp1tIonVE2mBoFm93RUIqNYHDjASKNqyh7gIJbZlkKCObRkkKLGt9qMCAZKt'
+    'wROMBN74D/kdBQAI4KG9JThxZfjQjggEWB5GuwQCLA/5HdXshN4NfLCHAHCl8W6sj8g2owDeY7'
+    'k3k9zfs9/tJ9TNJPf3WO7NJIH3WO7NJIH3QO4aCxS9b+9jLPiCfd9+L8M1UWneZ+abSQTvR7sF'
+    'Aizv9/apg8B8ixP5uBX4OespBjEB7LfAIuLjFsy0JFBuAf5DP2vZx4l0C3UAQCVgBMFEp4AWgl'
+    '2HBAwiePQYUW91Ir9gBT65K/VzmnoroPgFK9ZN1FuR+i9aIL4WQNiK1CMA/oLVQxRaUYBYHhPQ'
+    'QhBEyGAQwS7BBYW/ZIEQNS4QYgTAX7QyXBvEiOURAak6CJLBIIK9fYwLFiu/bMGySeMCbYoA+E'
+    'vWPq4N+oTlggtJ/7IVFa5BowCExRPKpc2JfNoKfHavUWkDFJ+2Yhmi34Zy+YxlDxDCNhqVz8io'
+    'tNGofMYCW8SghWB6n4BBBPdnibrjRL5oBb68K/UzmroDKL5oxbJE3UHqX5JRcWhUAPyidYAoOD'
+    'QqX5JRcYj+l2RUHKL/JRwVpJ9yIr9hBf7hXr1PAYrfsGIDRD+F9H/TgrUy0k8RfQB/wzpIFFJE'
+    '/zeFforo/6YVTwkYRBAWzEg/7US+agW+vlf/04DiqyL9NNL/UPqfJvoAftXqJQppov+h0E8T/Q'
+    '+l/2mi/6FoZRpV42uWnWJcqJUAfshamSat/JpoUpq08mtWtFnAIIJtDvWl3Yn8jhX43b1k2Q4o'
+    'fseK9RD9duzLN0SW7dQXAH/H0oaynfryDelLO/XlGyLLdurLN0SWHU7k96zAt/aSZQeg+D0r1k'
+    '/0O5D+N0WWHUQfwN+z9hOFDqL/TaHfQfS/KbLsIPrfFF3qdCLftgL/bFf6pzX9TkDxbSvmEv1O'
+    'pP8dkX8n0Qfw21aWKHQS/e8I/U6i/x0r3ixgEEGWf5cT+a4V+LO9LFwXoPiuFdtP9LuQ/vek/1'
+    '1EH8DvWnpqdxH97wn9LqL/Pel/F9H/nuhSF+rSn1h2N+NCXQLwe6xLXaRLf+Lhsqh6PC1gEMHO'
+    'LsYFFu5PLbuXcaGFA/BPrG6ujRbuTz1cSPpPrXingEEEMz0kl24n8n0r8C/20stuQPF9sTHdKJ'
+    'cfyLh0k1wA/D7bmG6Syw+EfjfJ5QcyLt0klx/IuGScyF9Zgb/elf5ZTT8DKP7KimkLn0H6P5Rx'
+    'yRB9AP/K6icKGaL/Q6GfIfo/lHHJEP0fyrhkUDg/kjmWoXEB8Ic8Lhkalx95uCyqznMsQ+PyI5'
+    'ljPU7kxxZugz5dlj2A4sfyDu/BvvxEZNlDfQHwx5ZLFHqoLz8R+j3Ul5+ILHuoLz8BWS5FKCbo'
+    'jPqtg+opgUVe+FF2RCXNPnGusOo4KkS+QO0go9/obitipEC1+LCwQv64WC5erI3rB9nPWipGG8'
+    'LYvlvFtGuuuEI4QrkowZMr27x29javnXNYheqPN7U7r9kfTUC456EoRxUcmHb5TejHw3zJ75NM'
+    'ykPyAb6qYuRlQZ7SKkwBF+L1I2CvXuVV3IQxOB0qogMZGAVDiGOjkC/XFnGDWHDQkxl4sI1EcD'
+    'uJiopN1mpbBaSw3etpPen1BNGWKsvQ6aJmtykXJRhEe1A1Y6BVcQVGsQgirbJTtAmeTpqH2RUV'
+    '5VgZp1NFKUzADFMEQUAFjKwUa5ul/OMG9ys/E/fr07q1rtS1Sr1UrJFCQeV1DXm04vwEyIG++c'
+    'jQb9CEcOVRmTuxY6SPLs+eU4mb+dJWYaS8cmv9MY7zQwRlnAlwWlXw0fpjJoA/QTfUbH6tWCYH'
+    'JQbKbeTfWSzWCxs19unH4MEkwogS/ft1FrgGsg+VmstDV1/fKlQf47i8jT98Kk/wLr0DlFTMQ6'
+    'QBVGr/+GPcBsYEJX0KUDv2GUvFzWxwEio6PbM4f3t2ojXgNKn4xPTCDQ1aThJUa3peQzZCc/M5'
+    'DQWx6sLcBIMhBMdH5ic0GEZwdGZmSoMRbLqQYyjqtKmmkdnZ3MzNEX4Uu/5PexUsZZOBkqX+V5'
+    'C8Psn/570+w5+zoT/ADeFaKawWywXgdCMPvSEDu7S1WtOc5KvAto69WXHzNXcT9KcGnVPuxlap'
+    'XtyE9thtDMhBpo41Bne6s6O1IaXcLCh91uUikEW5nodeFcqVrbV1F8OCqhukzNBj6Ji7MOlCW5'
+    '6yCkS4UQBZltfwKYoCp/qgm0fZaOPwGAsRD9TVfGO15VIRSlGYCkaHPIHuRoU6BDVXYSypGg1b'
+    'dUh8Yejd4k16J9D+DJv0TiztbdKnbMe3SQ+QbK/jd3jKbK9ju1S8ybdJn2pt8zbp02arH7/D03'
+    'bK8W3Sp/k7XG/Sp6Oy1Y/f4el0OzIfBua7AwO7Mf8SMR9GJrrDzUg2TMxn7GbEFdb8Zey4QOhu'
+    'STZxRXSp2K1cZBGUEAgdLM0tXBHdJnYLF2GzXr2lEtb+ut4mIY2uEVMR98H7TEX00PWZiiEnuM'
+    '+Qxq3rfYY0+uT2GdIgpn5TETeb+01F9ML1m4oRJ+iairg97JqK6HdzTcWoE9xveMQN3f2GR/S0'
+    '7Tc8xpxg1k5zEe7BZk0z9K1lnZS4UQ4HTjxlHS9ulMOgjwviRjlqd2SuufMz4zNHlqtLW2s0z+'
+    'X1cvLsqReGj15wxyvlw3WcJC6tTtzJ8RrOHJkr+inOS+1LQUU9ah82PpgwkhFfCirC0XibzyNz'
+    'lL1J5JE5xt4k7ZE5Zh/t8HlkjjV4ZI6xN0l7ZI7BYlNjsdF1085YbO3XEd8NDs9xPSAIoV8n2S'
+    'oQ+nVSacYCwKDdw1iCgGXQPt7ONYNhLBReUL8G48In+nwHuzPiHTodOPsM3qHT2gGuvUPDdsrn'
+    'HRq2Tzs+79Bwg3doON7s8w4Nw7eDxgJFZ3jG2yTIM/ZwimuiIM/wjLdJkGd4xtskyDN6xqOP6X'
+    'zg0h7bhtj387E2z8f0kq0/zcjHFHrJPp8SR1IYC2M+J9NL8Rafk+klUGONBYouMPNBYv6C/VKa'
+    'ayLzF5j5IDF/gZkPEvMXWJeCqAUXDRbUgov2BXFx4Wy+aLAgwYsGCw78RRYBtLocGN9DBGg1Lv'
+    'P4kcNrpMHhNWJfdnwOr5EGh9dIg8NrhHdOSSVGmfkQiWDUHhG3meXzX4VIBKM8nUIkglFg/hJh'
+    'ARGM2b3Zk+4VeAlWC6uFaqG8jC826AysGfIlWD/Aars26BaG1obcpZOnh8+c5VkcIpmN2aMdjB'
+    'plNmbIIodj8U6BgOwYfDizt+5aYGoPmaEBvRZr8bx1kzxhtbdu0r6me6S9dZMN3rrJeKtAQHYS'
+    'JuwrhAWKrtuZ7Gm3sAEkB3HxUFmqLW9VYZ1RKj4ouFl8y5eHhoYuF97Jb2zqNU2W+xsmMV+3J8'
+    'UViGK+bgijmK8bNyGK+ToPVhjF/BoPVpik9pp9PcM1UWqvsaaFSWqvRaVrKLXXWNNgxTi7u//t'
+    'rOdsnI056oo4G3N2V+YlbbzPnj5zusFS8xfFE7aan4u11n7KnD2rZ5j2U+Ya/JQ5trPaT5ljOx'
+    'vBzszx4iRC0puzc11cE6U3Z7Cg9OZ4cRIh6c3x4iSC0ptnmxEh6c3bcw7XRGs9rxcNCKEbUbUI'
+    'hG5EfvVFn8WNGCU3Ysrzmd5hO0s+09Ad+7YeXu00vcPMa6fpHbaz2ml6h+1sVPsR2xgLiuAN+0'
+    '6Ka6II3jBYyJEYTwqEjsSWVnG93gssP4Pr9V7M8VyvebvT53rN2/f0+MUaHIkxdiQ6AqEjsb2D'
+    'sUDREosgRswv2flOronMLxksyPwSiyBGzC+BCNiBuwZfOk9fdKADd42ZJwfuOk8XcuCG1u01zX'
+    'ycmF9nstqDu862TXtw19m8kwe3yMpHHtxQ0V7v4JrIfNFgQeaLrHzahVtk5Yuj8t1nEcRJ+e7b'
+    'RXH94tS9b7Agwfssgjgp3/026READ+wDXARLBYDEm4wrhQcJ6QK+LR84/QJhu+yA2aL68VX1LP'
+    'ltz5gqt7+xjCz9tkS52yoqEaDyXW75vssxG2BrYyNflb0CATFZaqVQW64WKWKXv9v9j7Kft2S3'
+    'aPyn3y0Cpqr58gPC35Sj306viq9UljEnprzG+1zeA2efUiuFzWphOV8vrHSFCaHvSfYub4KN77'
+    'oJ1oA/+HT8oSfwfybo2z0c32X3sIGEvZ3EKaV0cguldgV3Te2iSpQMdkxFl5d19dBu1SPLy1R3'
+    'DwHhmC9XC1QYgcJoTkBnWCXoZ4Wy1Lqiu+1EKa6FW10ZBbq6glttK10xQmdg56xK8m+NML4bwo'
+    'RUQ4ynldKpYtRdtWOqGYmnxL9q2W8EeTcWx+Ok0husRNIikttzeSjTblW2bw+rlvzmZqm4jFZt'
+    'kfZj9ZA1e49p86lfJYq1RdwVKHr5M6pIgd/4BHfFoEK5uLxeYM2JFmvTCOJuJRTR/gdt0cnINB'
+    'VrN7yHjYoTebriRJ9BcQ4Q2c31fK2wSB2mQYrlksXaLD4kceBANeRPxXfDnNjycqmccypZKG9t'
+    'mFY7DxXmTSWwnqRgVVSSqEoiwXOPV0Mm5a6JkSaTMvspSyVGeJ/8p1KQF2TzfU+iSalHwkebuF'
+    'V9WJBtT4ay/yWoIpxp8gxb4NvyFndJPHzWvMXg8+Utmsm44tmenUZYT0ai/LSkz/DTkj53SDqM'
+    'PEfS4bYsvugzZPE5F3xuFWoV254n7VMcz9syrm3yDimd8Z1TOv9dUDk75BkNq3YZ/fr61sZSGS'
+    'gublXlfZXiwnkpW6iW0FpJm8ZXdzM/nuM3+BnVsUwpQ4t6YQC0q48Ju9bGlC4lb8wEliH2AdUE'
+    'csiDRVrUG/bsZ+KHevP/JdVUQ1cAVSnysCaG0z6lMp6CXLImv6EmzN1UtfCwiPlLyMqi3sVlS9'
+    'cmRcDJFSpwjqhW4We5UlqsbRaW6b0E3eXnY5XSHDzF4ZCatUq1rqvGqGoLF8zBc6oLVlHqvrOY'
+    'r9erNG5eNz8yAs/8tR7rWqqh1m2slf1xWCV8yfQoQUmn90/ppDyULEzc0IYhkXUXg/4VWbBxRQ'
+    'bjyT/hNVKrLy7BkK4UvUVKiktvQOFoYYKK0FaS24hsXXi392+M6qCpG1ZsRKhBhBrsaCziNeMo'
+    'bHxhPzHvdnhho9nb0Elmi5Vy6TG/lBL8bAYeOS+qLs05S7uGk0xX4FnWTuXjXDxf0Wlr216S6h'
+    'leki+qpDYc9BKudSW2qzOZDvK65RKr5vc2g0XkkrsarFyDwSK6J5Tjb87LiibqXJuvKq8uLtI6'
+    'RRsr5rR5u7DFXNHahX4xq8dUhFYBta6W7W1oIYD2jWtc/+oQZjXFAn/fstR/sMm/Fft/37/1cA'
+    'f3lufYQieT3kojH1K1gHMZOIbXGFSsKXFU6Y22Qd5F18M06OJnGyYUagcU2JL88jo9MB4k5WVT'
+    'Jb1sqqboMfErte3uVzrr+ZXaeMeNXDNOg1/JsdtMgkcYC/1+JafBr+T4/Uop3rfTfqWU7fj9Sp'
+    '53yiLvVKvPr5RKiY8Lc5jsbsZia+9UO9fUyU+ChRxZ8bRA6J3q7BLfR3egfzcRvOD5Prp5r9rS'
+    '3qm0z2ORsbvFn4AiyDR4LDK8V609Fhneq7a066rD57HosTNpn8eih/f+tMeiJyp+DxRBj/F7kF'
+    '/L8Xkseu0e8SegCHoNL+T04uHQHove1jbPY9HHu0LaY9Fn94oPBvch+ho8Fn1xU4YNeVfI0h4x'
+    '6RHugO+z+zq5ZiiMhdIjcpeZHmHS2j7ezbSd0EDg8B67QjalFfn8Hgca/B4H7AG/3+NAg9/jQI'
+    'Pf44Df73GQRaD9HgftA36/x0GDBYfjYFwo4HAcZBGQK/GQ8Z7gcByyD3ZyTRyOQ8Z7ggQPGe8J'
+    'jsAhEMEB7T05HnjBynTtHNV32nOfHGdvL7lPBlkNtPtk0D5usnJ8LiftPhlkNdDuk8HWNs99co'
+    'JloN0nJ+xBx+c+OWGwoAxOxE0ZYDnBMiD3yRBnSJD7BCBJF8Jd2aGENEN6Q5whob0nQ+5+RgLA'
+    'Sbufi3Bj7KRBEgQkJw0SlMPJVEYgbNe3j5FAs1PGkYMKeco+KThRIU8ZRw4q5CnjyEGFPGXcQZ'
+    'RYJVjCOutKZBumwrhA6I9TggWTKk8bLBF0wGUYS0R75wRLhAoFC+7VwwpeIPTOscMgiJ7fM2aE'
+    'oto7J32PkndOsOCe9RklUsKUyzNmhGJO8Cw7KAEALGftM51cMxbBQsGCm8dnlfCJGZhnuzOMJe'
+    '4Ez/HeJQAhhGSI4oDkXEL8d7iJey69TyBAcm7/gHjJLgSuPj00gLxkF/xesots87WX7KJ9wXjJ'
+    'IliofF6yi5wqob1kFzsluQwzzTg5QnvJLtkXu31esksNXrJLnMCnvWSXenrVGfGSvWJ3Zg5pP8'
+    'r9amVpqViuHb3g+vZ94Bt1pYg7ZH7n2Cv2pT6fc+wV1kNthl6JSn9wFrzCoxZC4FV+7YTISL9q'
+    'vyJuNDTSrxosOCdejbYIhA35tRPCOXHZeBnJTWm/KjLCOXHZYCHvZFS8jDgnLhsvI7kjOxlLWP'
+    'sqxcsYbvBVUnZdXHqEc2LE9CiC7sgsF8GcAEgGD6fEaEKa4ZQYTYnIcEqMgqW4TUhgSozbmczU'
+    'E4MAi6TiCn0WD7reaVzuWjVfrhfLa3rNVK5gPN+yjvjhc6iMHxMn2Lg9KhziBBs34sEJNm7Egx'
+    'Ns3IgHJtgET40QTjCApGM4vyZMx3B+TaT6BQIkE9kBRgLz6wonX4Vofl0xSHB+XeH5FaL5dSXt'
+    'CgRIrgwcFI/qa4HpZ8h/fI3fJORRneL5pT2qU/Zrev6HaX5NMRPaozrF80t7VKd4fpFH9Qan2p'
+    'F7FCBphhlMN1gA2jt6g1PttHf0Rr8rfs1c4OYz+DVz7Jkjv+Yc866dk3N2ziRKRrBQCYRuxYRx'
+    'XKJbkXkn5+S8LbmXyPu8aYa8zyfEx4i8z6dcgdCryClc5JtcaPBNLtjzghNnz4LxcCK9hbjfN7'
+    'kAk/WA9k3eCazstRBAPbwTa/ack2/w9NbOyTfsO3rxrJ2TbzQ4J9+IG8cluhVZf8k5+SaLgJyT'
+    'AElaKIrgTZac9k2+yVls2jf55oDkloII3uIstiitA94ySHDmv2WQILm3OIstShJ4i7PYogjctQ'
+    'e4CNcBdw0SXAfcTYjPFG3eXX7JRMnm3d2fZSTQbJEzEKNo8wASJGjyFk2WK5q8Rc5AjJLJWzwx'
+    'xEig4j37OBeByQNIkISBk3uJToHQ4dp1SCBAcu/oMUYSQQ+rdActXt4gQYuXN91Bxc6b7qDFy5'
+    'vuRNHBKuICGwWQIIkCkiXOx46SiVrqPCAQOl8PH2EkYKKW+Q0YpTXAsr0kOGNhLIwIBFiWOT0w'
+    'SjZqGd6AB7T/eT1Q20tBsf16LOM5oIucyKUd0EV7XU9/7YAuNjigi/F9AqH3lUVADuj7zL12QN'
+    '+3iwNc0/J5X7UD+j6/v7UD+n5PL2OxtfdVY8FJ+sC+38c1cbwfGCxI8EG8XyDtfmUsAJR4NRWj'
+    '93LJfnCAa+J7uWSwoI6WONwrRjpa6ha5wDBu2Ee4KESQEggGdSMhSdCooxsd0lnU0Y1DhxkJ5b'
+    'XuZ1bCOulVcIZ9Sa8xUtJyXASPSlrul/RsIFfh5MsYLVUrdnk/14yEsVCwoJZW4t0CAZZKbx9j'
+    'AS3dtPsZC75JN+2KDCa+STcNFlTTzXhGIMCyyUv4GKrp23YvY0E1fdvelGFANX3bYEE1ezsuUQ'
+    'iopm9nehgLvEqrRl3gVRqq2m9L3+NhLBQs+C6tGiz4Lq1meikVJe6EH+HW1W7a/oIXsfCI30gU'
+    'sfAO64aOWHjHfqQHUkcsvNMQsfBOXOIQUNvfYd2giIXHvFuiIxYe2+/0cE3U9scNEQuPebdERy'
+    'w85t0Silj4qMGC2v5R+7Hwgprz0YaIhY8aLKjgHzVYAHjXzjIW1PZ37Y8KFtT2d9lu6JCFd6OS'
+    'AI/a/q4rqfghTATuYiwhnSUsSfWo7u/xF0ic1P09lRIIs4Q5jChuUyKwSDess4S7uCba5Pc5XD'
+    'NO6v5+UqSL6v6+kS5U/IBtcpxs8gcmBgNt8gcJIY7a/gHb5Dhp+wdskOKo7R8zHUJt/5j9geBE'
+    'bf+YEQtq+8eighO1/WMdqG+IBQzq37PAIjVTGah7GMCPCVrQdyyOCGghGO0XMIhgdoBRxZ3Qz0'
+    'jGbJx0/mckYzaO60cAExIEAzoLYKpPwCCCbpYxKcyPBtOkC1WIQMGECQsftxKiVoqSqTtEP1QQ'
+    'wYOHGVOCkqkHuTDhz60G0J9bHcdDdrzc6jieq4O51ccZU9IJ/ZwF1qWFCpMhJwLgz1qCOhmmcp'
+    'FU0kKQc5vjeNgOgL37GFeTE/qEBe9TXdgUIlC4aoogmJBAnyYLwbSItSmI4KEjjKnZCf08Zknr'
+    'wuYQgYKpOYKgwdRsIZjOCBhEsK/fhPT897LaOw7HF9CzT29Gn5St5ZOPqvAVirvUOqjnKQE/2a'
+    '/YKiY7/P/n3NinTGiPTlPretLdwH4hCfpphxaF+mKlTK6paC4M0EwZPTPwo76XNyquK+W0q17H'
+    'LnjxKNsdF9THTf6Vrav4yEahvIKb69uS76ztyXfHlVMuPFqsoIupVM9rnwr741qgZKY6js/JgY'
+    'IZUxXxELFnLlZhR1D250F5RsymPiXrGcjLkEp6DydXMHAGXQ2+VCkDY0gRHWEepHb0G11m7CPU'
+    'ISraMZvgZxSfIjlqpYIX+UM5avSAPJMNXuYIeyb97uVuFXtYBKlguXa0RhHGIsySqzwqlyr5FS'
+    'qOcUwYP4Mq2e+GVHRM+zr+ltl90LqG6Tfl5cJieWuDA8QS8mx6a2Nbd0Pbuwu6w26XQvUpymbq'
+    'YOxNvbhRAB3e2OTQKO+B32UbbXTZHlYtxfISuqUWoXItv1Zg0TTz4xv6qQPf8XlRTgmy8TlXje'
+    'LmfNVg1iZ8/iL2Z/p8k57e5fwVMTrHeAtx9iR2tRAJqcfBUL4gPxJ9kkTf7HuM0u9UUZB+bTO/'
+    'wR7LSLE2BxAOy3K+zOPS1ayHBZ7occExx+LVUn6tq0XHSAF8BcDsh5ZSnqv1+Q2cyYW0/bmQT8'
+    '/cbDQxoWcwMf9RqTAFTfwtNXx3T3+jEz70TE7453X0+yIKI3tFFP4UDv4nPeOx5/GMT6j2JZDT'
+    'g8IKvEQ4foWwxLcTl2TinMMNZsryqOaMqhQ9LZbX/EieCFQzSNqkuofjNdW1ki+vlRCHjydC1L'
+    'kronZpMypcEbJrqqMRGf4gVF27oko3oIK/IiEK6FpZLJbrFa93T85zT0K6wSTUNynY20Mfks8a'
+    '+tBofJu2G9+zKlktbFaq8rJv3jX0U6ohN0dVK/rnoVOeIW4hQ9yin88bcwxVl0uVWkPVVl1VP/'
+    'eqnlCOhKT6KrdR5TYp8apfVr2e6u7QsJsaZkydG09guKC6ef7u0DxDzTt1hSfbnpewlx2a9lDT'
+    'Dip/smXjQe2O23hQu99epxrsNUjSt1rRrdPUusV7rnHsEIHS/lNEoHTsFYGS/UxMKdJRWoGBNv'
+    'mDyxPDvRLRIYtosIkYIKv1VFahDSbR3tsknlYJNomL+ZWVp8Rla7M4srIC06dZmlQLG7Bi3j08'
+    'O6lb5agaBh6iAnnUwk81jwmsLEQvg+qbtkx290BJbN4szZn6edXsGXQiv7tRTxqjjrRfUW2+lk'
+    'w8tmvjFtPY9LvZ2BtNOf4Ui5MUi8P9bvO1ZdpPrId8zVtMc6Z+jq1dbXG5VMhXOdBrxzWRrjeG'
+    '1ZwRfo14lp84T+5qsluX/FYfeb+qOraj4A407Yol1YCFuwAD0PDiIE6eCAMzOFqWfC8NZGRcpR'
+    'vbMxtPRIVte7EyCjOMLf63D06w1l3fO03ee0d/hpp1T9szzGapnP2ftmryonHRLJxqMAvP8mH6'
+    'smpr+AQm6e36Gdzi/wxG4Y2pdGNzFt6upsLxY9h1CoT+dlPgiejb55kCkWeaAtlrqtX70FjYxO'
+    '+9hi9Ya9sX7LYA16T5WsquqiRphoQp/x0torMzKiavlcY1/hNfEk+u8U1aku2lJWWPMsKcPuBF'
+    'I/TvLNATZPjYpy3V3KiB+uCS+cW5ifnWgNOqktMTE+Nzi7mJm5MTt1otJ6Ls6ZFWGz5hWvUzKH'
+    'p9YWJufmK8NQjsNPPTufmRHD6jI0wQx+Lk9JWZ1jCeWaJPKYHCCBEAauZJ9NhdlZiDgVxen1uG'
+    'pZQTVcGRqSlgBX5MEwcxFZqZnZgGHuIqPHNrmggD1tzE7AyThD4g/RwAdGbK/MzizYnc5JXbrZ'
+    'Hr//majhn9N/8/ZvT/TszoYS9mdMCLGe3azS9/3h8z2uqPGZU4TY4ZlWhP9Ms7vOHOMaMJidOk'
+    'mFH2y3PM6EEusuhIfGmGTulUwgSQYk32y3PIKDulOWS0tzFkVHCiJyBtS6gphYy2dQqEIaMZOQ'
+    'E9iCfkS/gqOkHa7XQv10QnSDu7L/QJIu1KcKITpN2Er4bwwHwRCzpBOux2CV9FJ0iHwYJOkA4l'
+    'YkEnSIcRSxjPzxcs6ATptDu6uSY6QTqNlNAJ0mmEi06QTh0Ei0e09O5+CPx574iW3nDKO6Klr+'
+    'GIlr6GI1r6/Ee07LNTXGQRJM1Q2fbpCEx9REu/wYHN+u2QQFgWjXlHtLh2JxehgF3bEQjPSdHx'
+    'RfqIlv12OxehDPd7B7bgOSl6JPQRLdmGI1qyDUe0ZP1HtAyYI1TQHzRgTl7BI1oGzMkrUR2Umj'
+    'RHtBwwvcYjWjDu9JdtHX58AoM9/8bSU553+tAUYQaDW9sq1mkkcNLzKUR0+hBYHLObh1n6mJYG'
+    'U9i9BRaDMvmXt6p49xTgoDwtt1avbi3X6UwDbxuQzRkfToQ2kE8oytcqZTe/VNmqi/2go7TE8u'
+    'U3loprW5UttiKPhOh6/iHYSrOjTVxvVGqAez1fXisgg0+J5qGo0libui9h1qfsrsxbLJj8YySM'
+    '/UZO0H7nweQVS/UTYICBjE470szSEQ5kF4sPoU1FAZeufDf6+tNw7swp+4Q/ivtUQxT3KXNiDB'
+    'qlUx2d6rcsCeM+Y7uZz1oNbObdcuGRNrlaxPhaeQQWXPegIvZYTHR2pFYrrsF7JzuokPdi3cME'
+    '39bLhRO1wma+SnaezmaA7rNIDQq8jfTElHuC/s5lTd/0IS6nzB0EFCbqPw3nTFxuOaBDXPb1q2'
+    'sSW37O7sxc9I2nqCVoG4z6eqFszsASdvQxVnqxZFhAQ3vOPiNXJOB8O9cQmH7OhJTj7D4HM5iD'
+    'wS/sfnz/S14w+IWYhHFTeGiPLxj8on1BWzwdDH6xIRj8IjvcdTD4RXYJ2zo81H8IziX7Yg/X9I'
+    'eH2hwe6j8E51K6XfVJMPjLtpNtdXFEcJmw9LhekOhCHR7+sn1JOLB9dxro8PCXOUxbh4e/zGHa'
+    'OirUXAMRpHDSlyUcPUjhpIIFjeMr5hoIfPu8wjFeFJD1quljSIeTZrhmyBdOapPlfNWEquPb51'
+    'UOayamLxt5h3U4qfQoTIXCC5rVy0be+Pa5bOQdwYhR4SWiw0lF3hFfOKlNNnfEyBt98COGl6h3'
+    'dYNNPvhRe0ToRX1H39hkkEeNXNAHj1c3cPD91cBH9gryQLle5ZSYoP/uhqDc3SBB4P67G4INdz'
+    'cEzd0NJvh+suHsokn7moR2W76jbHTw/WTcf3bRpP/souuGF1ufS+M/u+i6wUKn3hhebN+5NBR9'
+    '/5rhJeg/lyZIGvaaCZxHSbxmAueDfC6NCb+f4pgIHX5vQkmDtL6ZMmHmqGFTSuLFUcOmOMiDwu'
+    '9vGCyoYTfsqS6uGaZCf/j9DYMFNeyGwRLBqy3afeH30/YNwYIaNm3kgho2zcEvOvx+OiVpFqBh'
+    'MxxHpMPvZ+xpkSBq2IzBgho2ExcKqGEzHHZG4fezJnAeo4NnTeA8RgfPJuTIKgxpmm2XjAUMaZ'
+    'rlqDOKvn/dPsxFGB38ekP0/esJ4QsDkl7v2C8QIHn9wCFGovDAHumPotN8XhecKoKFghOvo8gl'
+    'JEkAL0fKZXrpsKggXo40b+/LnHQnV91aARYM9GHF3xn4yoCXL32vuD5fH5vBIIWBzNs5SQNJ+O'
+    '7/CNJVS/NGjHi50nxPHzOf9EJsgxgCgiG2kmSQpBBbUVK8GWIh2iwQhti2yZFhTU7wpsmowOCP'
+    'm/aCyL8pjIWCBS96uGlUHa9eupmWjIpmJ3jLqBcGftyyb4qwmsNYKFjwtoRbUTm+DG9iugVf55'
+    'wM8WYgv0fqE86UN/ltR8kQbzUkQ7xlv2kSHiJexK1OhnirIRniLX8yxF1OoNLJEHftt/zJEHcb'
+    'kiHucgKVToa42ya82BhWKwePoeVZtO9KhDpO4sWGJIfFqBw8hsZmkW0GJTncMz1Cy3PPXpRzxD'
+    'Dg957pEVqee6ZHaHnuQY8OUtR7uBD4mV0j9YbPe3HvhViTF/e+2nDvz6pd0KOkTxJbbThJbLXh'
+    '3p9Vc6CXhVekyIFeKMo1e1UO9EJRrjUcC7YWlwO9UJRrLAQ6FmzdnGpm63OOJAbf9p1zpI8FWz'
+    'enmqH01lMSyY8Bs/xqDpMoi/a6cI2iLHJ0XJhEWUwKBRRlkV/NYTTi99n8hklH79vFHq6JRvw+'
+    'm98wGfH7bH7DZMTvs/kN62Dafi4K+845CtM36gOTD4CD8iAlIkMb/oBjQcNow0scqBemQL2SQY'
+    'KBeqWE0EYTXuJAvTCZ8BIH6oXRhG9wGHeYgqc3DJIoxdl2CoRxtl1y9RNa8A0O4w6jBS9zaHuY'
+    'LHjZIEELXjacoAUvp48KhGG2HNoeRgtesU9wEVrwikGCFrxikKAFr+jb8xDCKNtjg4xEYSDtMB'
+    'eBBQdIkKAB3zRI0IBvpgcFwiDbk6cZSQLjaE9xEdhjgARJApC8bZCgOX47fUwgjLE9cZKRJDGM'
+    '9hArSlLH2ArOZAQLBSea42rCFQhjbAcOMhYwxzUOgw6jOQZImjUBklpCNJiu3enICgRIagcPM5'
+    'JmvHank1lBa1y3a4ITrXHdHKuH1rhujtVDa1xnmx62W/DenV7G0gJYtuy6KEcLXsNjNL8FsGwp'
+    'mT8tgGWru4extOJNOy5jadXX8Ei6SytdwyNYWgHLQyWq3wpYHvb1M5Y2J/jIYGkDLI/shyLAtj'
+    'AWCpY2jD82WNoAyyODxcGA4yxjcXQ0smBxKBpZsDgYjayETwejkfv3M5YUBhwPMpaUjkaWcUhR'
+    'NLJgSWE0spIplMJo5KPHGUsaA46PMpa0jkYW7UxTNLJgSWM0spJ5n8Zo5ENHGEs7BhwfYSztOh'
+    'pZZls7RSMLlnaMRlbCZztGIxt96cCAY8l56tDRyKIvHb47iwDCaOS4TIcOikaWnKdODDhOM5ZO'
+    'HY3czTU7fXcWAYTRyLweAQijkXk9Era7MP64n7F0AZYP7Pclx6orjIXCSxeGI8eFQheGI/eKqe'
+    'zGiGMRRHcIIZlG3aC6HzMzuhujkdMi3G6MRuZw1rCdoXBj0bpMiEA58zITQZDDWQGkYOS0vEAz'
+    'FIwMineIMrkin7AC/2D30Pnz+haHCAXXwuLmEzanc+EFRUcz/81ypyv1wgXc28LzKX1uPPiqrt'
+    'UL+RXcD9GHWZlTtx/xXtYyXrLrFlddisYcupavkSvqyGHtuzt8dMh1ZynmVm9t5EulyiO9MaZo'
+    '/6pcqOG2C+/M6T133EkqwmrWzS5V3imsZHl3nerT6ndzq7pZqRWGlDtZdq/PzUwPuvlGxtEjsa'
+    'nP7tHHmefdWnGDDjGnarBAxuhmSmTDm5s+YUk6Gd53BA/6BKSbm/YdEJBubjqsBzGir2Liuzgo'
+    'nU3f3HSUa1sRKo8LSNVVSkC6uYnD0zGpLfRJiSnXWW2fFIWgEzcBTMipnkj4k1Zqn4BBBPdnGR'
+    'NAv2Lx2yJCi5Nf8TDB4gRAgwlWJwCm9gtIbQ8cZEzQ9FOWfYwLQxoUTJhE+CmJKY/QbuunrK6D'
+    'AgYRPHKUMYWd0K9a8ELWhfil+aseJlilAGgwwTIFwK4jAgYRPD7ImCJ4dxV8nOlC/Nr8tIcpQq'
+    'UJEXGELrpKZwUMInjwEGOK0kVX0jv84vyMhynqv/cqggsWvPdKehele69M72JO6LMS5R6hTJrP'
+    'ephg0QIgR/FHKLPgs1aHaBRmFnzW06i4E/qcJyfMLPichwkzCz7nYcLMgs9ZHSIKzCz4nHVM5K'
+    'Sc0Oc9LcDvz897mDCz4PNe7zCz4PNW2hUwiOCAaEHCCX3B4wk/Kb/gYcLMgi94mDCz4AtWWnjC'
+    'zIIveDwl8eYvWAzpQlzHfNHDBOsYAA2mJF0TlpbhwbyCL1onTjKmJroV7DgX4qfllzxMmFfwJQ'
+    '9TE90ZZsauie4MO3KMMTU7oS9bsN7Uhbig+bKHCfMKvuxhwryCL1tp0UzMK/iydfwEY2pxQr8m'
+    '97hFcFETAfDLlqCGZQ2WC2q8Gu/XrIRcSwoLGwD7+hlXqxP6deyfxgVLmwiAv2bJCLVGqFysFF'
+    '509+vWPukhLG8APKLvyos6ka9YgX+06y0/L+r3Ayr4V6xYO9HHVNfQb8mNTZTrGgHwK5aeolGy'
+    'kvCgVUALwTZTGkQw08O4oPC3ZXbo43h/W8RAKa8Asj2inFcAUwcEDCLIswOzXkNflRwXSntFUD'
+    'ChZfiqh8mma9ZShwUMInjsOGOie9MMT2gjP/QwoY38UOYZZb8C2CE8Bamt4SlEd6oJTyENCia0'
+    'kV/zMIXoxrUO4SlEN64ZnsBGft2yD3Ih2sive5jQRn5dNJHyYAHkGUuJsAAOHKARj+G1a4F/st'
+    'fdaTG6fi2m7+jC3NHQ71rweY0jTsmjEQC/YZmbZMNUHhPQQjDeJmAQwXQ744LCf2zBck3jwvci'
+    'gL9rdXBtvKMKHkQFpOqxFgGDCDopTgyMfMsKfHuv+7bQFH7LiqVVkjMDQ78v921RamAEwG9Z5n'
+    'TjMJXHBLQQjEuaFfbl9+W+LcwPDP2ByIUSBCMA/r4luUXYlz/wcFlUneVCSYIAslwwSzD0h5bd'
+    'zrjwHjQA/8DwhRrwhx4uJP2HVrxVwCCCqTTJRTmRP7IC39trjNGw/5EVayX6eNNt6I/lTje66j'
+    'YC4B9ZesoomtV/LCpHt90CmEgLGESQ73RTNt08ZzuMC+UC4B/znW6K5PJd6YsiuXzXijcJGESw'
+    'tY36knAif24F/vle95Dhq+XPpS94fW7oL2TtRffnRgD8c+5Lgsb4L4Q+3aELIN+DRpfoAqjvQY'
+    'OpFPlLC4Ngnmohw9iFv7TCRD+MHtTQv2RZhcmNiWBYQBvBWJzrQuG/8upaGpS6IEQATV0bb46z'
+    'E1xo00VyOtkOQSqNK65LN8PZSS4M0r1xelohaCOoElw3RPfCtXBhSF8jJyyhN/BHVlMz1wXZ/b'
+    'VlN3Mh2pq/5mUsgjaCySauCzrzr/lNgJBFoLAfsRFsbjGZd9/Jqj2S6ZyWbZGFuCs/XtmC4dAp'
+    'Jg23Z1mcMZLNKnWlVMnXd6hj++pMlusvnN2hTlDqALGF3SqFGhGdGd6hTngboh0rNUml/So+Wq'
+    'mUdqgS8+HxfdrsfHcYMjSK/s8d6iS5zuh7KrVc2dgetznadIvFT99ps9adY2vF+vrWEkVRrVVK'
+    '+fKaN1SbmMZWMyP2Pyzrq3bw6uzoN+x9VzXeWYkHvVUoleggVUxzq13/9j5ccw4Etiz1/WYKNR'
+    'sIOMN/kdSfh8uVkju6haEUNfeEq1Edrrkr+XoevkLrhap2gLv66FHVEJ926jw3gK/BZfje3Dks'
+    '7enRYpvMxIklzcRJpdxcYaWIX4tLW3R+DX6Z4gdysSxhbfhkqVjOVx8TX7VB9xFIDiMM8G9lC/'
+    'jUCQHLfFAO3rFFh+XU8auUP3NXvHusViv4eYzf2cuV8kqRzsvBRoCnUL8ALOF/x7YxVqPPc1+g'
+    'HR40Cj2nm7cokmWp8hCLWGKKjuVZLrAnyQQ8+CiWV7axA/SWS/niBt6etQsT6IH3ZCFMQB9Xtp'
+    'YLHh/KY+RvxYeSyMCVyvLWhhzRi01O4gUjUFJ1QVMK1WK+VPNETQMEhcr1c286NV0oUkt/IIxf'
+    't8oVr4zkXqzXFF1zRqgqVROjQjEc9YpbKK/AU4pZBCY2MEZFywS0k9Pb6IIyJQGTq/VHqCasQS'
+    '6eiIsaBK2KqFhV1J2y78glvHVt/trknDs3c2X+1khuwoXfGEE6OT4x7o7ehsIJd2xm9nZu8uq1'
+    'effazNT4RG7OHZkeh6fT87nJ0YX5mdyccrMjc9A0SyUj07fdiY/M5ibm5tyZnDt5Y3ZqErAB+t'
+    'zI9PzkxNygOzk9NrUwPjl9ddAFDO70zLxypyZvTM5DvfmZQSL7ZDt35op7YyI3dg3AkdHJqcn5'
+    '20TwyuT8NBK7MpNT7og7O5KbnxxbmBrJubMLudmZuQkXezY+OTc2NTJ5Y2J8COgDTXfi5sT0vD'
+    't3bWRqqrGjysVw2Bxy7++mOzoBXI6MTk0gKern+GRuYmweO+T9GgPhAYNTg8qdm50Ym4RfII8J'
+    '6M5I7vYgI53DYF/o1ciUOz5yY+Qq9O7IXlKBgRlbyE3cQK5BFHMLo3Pzk/ML8xPu1ZmZcRL23E'
+    'Tu5uTYxNxFd2pmjgS2MDcBjIyPzI8QacAB4oJy+D26MDdJgpucnp/I5RZm5ydnpo/CKN8CyQCX'
+    'I9B2nCQ8M429RV2ZmMndRrQoBxqBQffWtQl4nkOhkrRGUAxzILWxeX81IAhChC55/XSnJ65OTV'
+    '6dmB6bwOIZRHNrcm7iKAzY5BxWmCTCoANAdIF6jQMFfCn926e6gzSe7uQVd2T85iRyzrVBA+Ym'
+    'WV1IbGPXWOZDavi/Wq68wmiLEGYKWFiMTTtSrpRP8NbiUZdeXUMYy4yRxgiQQYaZurpV0ruReB'
+    'jxygpaGoOkJobm3vaEh5Hy43uEhwwVUS7llwtgEB6BDSngHmm5oK0AGhvAulWsrYNxqD8qFMQ0'
+    '1zAxWsfbGZKKsK5wKB3dfkjWgs5M1puhJpz4YKwTf8Wc4OHARYwmjh3UP/XDI4F+etivf+qHRw'
+    'Mj9DChf+qHxwKD9NDSP/XD44Ehesg/9cPBQJYeKv1TPzwR2E8PD+ifazqWeThwzsq8IcNj4i9R'
+    'VvdWaEl3j+wXiAK3cb1NW++SyHu+pd893NiliuUtPDZ6yIuHHo6llCvx0GftVCZFWDURIzNc/O'
+    'sg6bP2sEQDowP6bMPBumfZC6+DpM+2Oaqgo0kvBF62Mrd37s8qrj737o63SN2lNxaH3PVLnOYl'
+    '28k4hJRINHRGB1dekjA8HVx5CT4BGMIAupgcS4uduQTfXAUd/TcamNi1M0VcAe/dGW+h7HXGbL'
+    'BL/OAod4biB8dNZ4hEQ2d0TOG4PeqPKRznzuiYwvGYRO1hZ8ahM2s6rux64Maumrb1jL1Z2LM7'
+    '6Mu/zpoW1Kf5iaZtPdmfIB/xd93EpIWxhT9ebSougTN0xB9rGsYK4a1juw/OmeFnGhz++NhF0z'
+    'CmIMeDQ+Eu8/7BOTPc0BkdAjNv50yYC8USRQXCWCIeHB0CM8+DE8aD9t566uA8S28W9uwORjfc'
+    '4cGhkJM3GwZnW390HMqb9h0TaxLGFv44lDfj4kXE/rwJg1PRRycuBQpWZnnn/izB59zevTEffV'
+    '5f7tWrCKK5v7cKi1YyjXIM41KsTe1jv11wxW7LtBF+JNbQK30y44q9ZK6GC2P9iECAaiWaFAh6'
+    'tdLSSqMUdUL3Axu7jpKeBXv3y/elussUwsiP+zxKdKJiyYwS+xj9/dHHLJbs+/474OTMN33MYq'
+    'nhDrgST6GYE6rCt+ZuU4iChZ9hmMw39S69wddllacQHb9XN1OISDR0Rh/JV7er/jvh6jyF9JF8'
+    'dZ5C+ki+emubbJz8bwoBFG4=')))
+_INDEX = {
+    f.name: {
+      'descriptor': f,
+      'services': {s.name: s for s in f.service},
+    }
+    for f in FILE_DESCRIPTOR_SET.file
+}
+
+
+ProjectsServiceDescription = {
+  'file_descriptor_set': FILE_DESCRIPTOR_SET,
+  'file_descriptor': _INDEX[u'api/api_proto/projects.proto']['descriptor'],
+  'service_descriptor': _INDEX[u'api/api_proto/projects.proto']['services'][u'Projects'],
+}
diff --git a/api/api_proto/sitewide.proto b/api/api_proto/sitewide.proto
new file mode 100644
index 0000000..f378ad5
--- /dev/null
+++ b/api/api_proto/sitewide.proto
@@ -0,0 +1,40 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+syntax = "proto3";
+
+package monorail;
+
+service Sitewide {
+  rpc RefreshToken (RefreshTokenRequest) returns (RefreshTokenResponse) {}
+  rpc GetServerStatus (GetServerStatusRequest) returns (GetServerStatusResponse) {}
+}
+
+
+// Next available tag: 4
+message RefreshTokenRequest {
+  string token = 2;
+  string token_path = 3;
+}
+
+
+// Next available tag: 3
+message RefreshTokenResponse {
+  string token = 1;
+  uint32 token_expires_sec = 2;
+}
+
+
+// Next available tag: 1
+message GetServerStatusRequest {
+}
+
+
+// Next available tag: 4
+message GetServerStatusResponse {
+  string banner_message = 1;
+  fixed32 banner_time = 2;
+  bool read_only = 3;
+}
diff --git a/api/api_proto/sitewide_pb2.py b/api/api_proto/sitewide_pb2.py
new file mode 100644
index 0000000..acb7e88
--- /dev/null
+++ b/api/api_proto/sitewide_pb2.py
@@ -0,0 +1,240 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: api/api_proto/sitewide.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='api/api_proto/sitewide.proto',
+  package='monorail',
+  syntax='proto3',
+  serialized_options=None,
+  serialized_pb=_b('\n\x1c\x61pi/api_proto/sitewide.proto\x12\x08monorail\"8\n\x13RefreshTokenRequest\x12\r\n\x05token\x18\x02 \x01(\t\x12\x12\n\ntoken_path\x18\x03 \x01(\t\"@\n\x14RefreshTokenResponse\x12\r\n\x05token\x18\x01 \x01(\t\x12\x19\n\x11token_expires_sec\x18\x02 \x01(\r\"\x18\n\x16GetServerStatusRequest\"Y\n\x17GetServerStatusResponse\x12\x16\n\x0e\x62\x61nner_message\x18\x01 \x01(\t\x12\x13\n\x0b\x62\x61nner_time\x18\x02 \x01(\x07\x12\x11\n\tread_only\x18\x03 \x01(\x08\x32\xb5\x01\n\x08Sitewide\x12O\n\x0cRefreshToken\x12\x1d.monorail.RefreshTokenRequest\x1a\x1e.monorail.RefreshTokenResponse\"\x00\x12X\n\x0fGetServerStatus\x12 .monorail.GetServerStatusRequest\x1a!.monorail.GetServerStatusResponse\"\x00\x62\x06proto3')
+)
+
+
+
+
+_REFRESHTOKENREQUEST = _descriptor.Descriptor(
+  name='RefreshTokenRequest',
+  full_name='monorail.RefreshTokenRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='token', full_name='monorail.RefreshTokenRequest.token', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='token_path', full_name='monorail.RefreshTokenRequest.token_path', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=42,
+  serialized_end=98,
+)
+
+
+_REFRESHTOKENRESPONSE = _descriptor.Descriptor(
+  name='RefreshTokenResponse',
+  full_name='monorail.RefreshTokenResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='token', full_name='monorail.RefreshTokenResponse.token', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='token_expires_sec', full_name='monorail.RefreshTokenResponse.token_expires_sec', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=100,
+  serialized_end=164,
+)
+
+
+_GETSERVERSTATUSREQUEST = _descriptor.Descriptor(
+  name='GetServerStatusRequest',
+  full_name='monorail.GetServerStatusRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=166,
+  serialized_end=190,
+)
+
+
+_GETSERVERSTATUSRESPONSE = _descriptor.Descriptor(
+  name='GetServerStatusResponse',
+  full_name='monorail.GetServerStatusResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='banner_message', full_name='monorail.GetServerStatusResponse.banner_message', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='banner_time', full_name='monorail.GetServerStatusResponse.banner_time', index=1,
+      number=2, type=7, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='read_only', full_name='monorail.GetServerStatusResponse.read_only', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=192,
+  serialized_end=281,
+)
+
+DESCRIPTOR.message_types_by_name['RefreshTokenRequest'] = _REFRESHTOKENREQUEST
+DESCRIPTOR.message_types_by_name['RefreshTokenResponse'] = _REFRESHTOKENRESPONSE
+DESCRIPTOR.message_types_by_name['GetServerStatusRequest'] = _GETSERVERSTATUSREQUEST
+DESCRIPTOR.message_types_by_name['GetServerStatusResponse'] = _GETSERVERSTATUSRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+RefreshTokenRequest = _reflection.GeneratedProtocolMessageType('RefreshTokenRequest', (_message.Message,), dict(
+  DESCRIPTOR = _REFRESHTOKENREQUEST,
+  __module__ = 'api.api_proto.sitewide_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.RefreshTokenRequest)
+  ))
+_sym_db.RegisterMessage(RefreshTokenRequest)
+
+RefreshTokenResponse = _reflection.GeneratedProtocolMessageType('RefreshTokenResponse', (_message.Message,), dict(
+  DESCRIPTOR = _REFRESHTOKENRESPONSE,
+  __module__ = 'api.api_proto.sitewide_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.RefreshTokenResponse)
+  ))
+_sym_db.RegisterMessage(RefreshTokenResponse)
+
+GetServerStatusRequest = _reflection.GeneratedProtocolMessageType('GetServerStatusRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETSERVERSTATUSREQUEST,
+  __module__ = 'api.api_proto.sitewide_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetServerStatusRequest)
+  ))
+_sym_db.RegisterMessage(GetServerStatusRequest)
+
+GetServerStatusResponse = _reflection.GeneratedProtocolMessageType('GetServerStatusResponse', (_message.Message,), dict(
+  DESCRIPTOR = _GETSERVERSTATUSRESPONSE,
+  __module__ = 'api.api_proto.sitewide_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetServerStatusResponse)
+  ))
+_sym_db.RegisterMessage(GetServerStatusResponse)
+
+
+
+_SITEWIDE = _descriptor.ServiceDescriptor(
+  name='Sitewide',
+  full_name='monorail.Sitewide',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  serialized_start=284,
+  serialized_end=465,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='RefreshToken',
+    full_name='monorail.Sitewide.RefreshToken',
+    index=0,
+    containing_service=None,
+    input_type=_REFRESHTOKENREQUEST,
+    output_type=_REFRESHTOKENRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetServerStatus',
+    full_name='monorail.Sitewide.GetServerStatus',
+    index=1,
+    containing_service=None,
+    input_type=_GETSERVERSTATUSREQUEST,
+    output_type=_GETSERVERSTATUSRESPONSE,
+    serialized_options=None,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_SITEWIDE)
+
+DESCRIPTOR.services_by_name['Sitewide'] = _SITEWIDE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/api/api_proto/sitewide_prpc_pb2.py b/api/api_proto/sitewide_prpc_pb2.py
new file mode 100644
index 0000000..6d999b4
--- /dev/null
+++ b/api/api_proto/sitewide_prpc_pb2.py
@@ -0,0 +1,42 @@
+# Generated by the pRPC protocol buffer compiler plugin.  DO NOT EDIT!
+# source: api/api_proto/sitewide.proto
+
+import base64
+import zlib
+
+from google.protobuf import descriptor_pb2
+
+# Includes description of the api/api_proto/sitewide.proto and all of its transitive
+# dependencies. Includes source code info.
+FILE_DESCRIPTOR_SET = descriptor_pb2.FileDescriptorSet()
+FILE_DESCRIPTOR_SET.ParseFromString(zlib.decompress(base64.b64decode(
+    'eJx9lV1z2kYUhrUrgaUDTmCxg8BfGwxOpjOGxulFJnep63bqaeMOuDO5YwSsQRPQUmlx45v+pt'
+    '7017T3/Rs9u1olaRvnghm95+M9zzmCAf6swn60jgf4Ga9TqeQgi5X4NZ6JvpHMX8lEplG87FxC'
+    'YyhuUpEtruVbkQzFLxuRKbYDJaV1SDl5GgxzwQ4AzMN4HalF6JpUYCI/YaDzBnb+7ZWtZZKJD2'
+    'bkY7MvoJ6biXfrGJvGmZiacdvDhyZxkcdHYtoJ4dF3Qo1EeivSkYrUJrOgnd+g+b+MHduDB5Mo'
+    'SUQ6Xoksi+bCzt/Ooz/mQXYEFVum4pUwBFtDyEPXGGF7EKQimo1lsrwzS/tDXweuUJ/9QcAf2e'
+    'OyK6h+fAB20C/u3P/EkduH96XzBToOewMP/7Md4x+aPn2S9uPPVBTOl7/7UGZeyXlC4G8CpMrc'
+    'ksPO/iL8XK7v0ni+UPzsy2cv+PVC8PNFKlfxZsVfbdRCplmfv1ouuSnKOGLrCbM+8J8zweUNV4'
+    's445ncpFPBp3ImOMq5RIhEzPjkjkf869E3p5m6Wwrgy3gqkAibIsWnUcIngt/ITTLjcYJBwX/4'
+    '/vzi9eiC38RLdE95pIAvlFpnLweDmbgVS7kWiDSXcr4U/alcDTCQnObzB9Y+G0yyGYAPhDJ3y6'
+    '8BAC07zAucKsFnt+wQ5gYYr4BXdqjDXKCXUIWSFpjCWxUKDWDnSaFcVGff2jYsrNCRTRGtyruF'
+    'wrZK87RQ2FZ5cQXHQD2kqDkN0m7y1+Kd4tEtvrdogruqaP6SfwUaz9MMNX9Pz/EMXp02YBtKWn'
+    'jMq9PagbbWsqSTfqGwrx48KBSOrdeZdcEUo6F1IejCaL1hK0lJJwsXvQoL3ufQhT1qGnjCvKbT'
+    'vg/+eQ6v25v+vhlLNHxo4YmBD2nz0FgTAx/ascTAhxaeGPjQwhMN36JH1kXDt2jYsJUavvXeRU'
+    '9vBe1CoUvr4NDAU+YdOkf3wT/L4fWkQz9vcJl3jD+Yz78qFxuO/SPD6eptu3TfcLpm2y49fmxY'
+    'XLNt13K6Zttu0CwUcnbbe9YFUz3ati562x7t7ttKvW2PBoXSpbBbKHTphS3rgl/BE7prXSi6nN'
+    'Be21bSkk6WC4UuJ1u1QqHLSWNnUjb/Hc//AbuGQxI=')))
+_INDEX = {
+    f.name: {
+      'descriptor': f,
+      'services': {s.name: s for s in f.service},
+    }
+    for f in FILE_DESCRIPTOR_SET.file
+}
+
+
+SitewideServiceDescription = {
+  'file_descriptor_set': FILE_DESCRIPTOR_SET,
+  'file_descriptor': _INDEX[u'api/api_proto/sitewide.proto']['descriptor'],
+  'service_descriptor': _INDEX[u'api/api_proto/sitewide.proto']['services'][u'Sitewide'],
+}
diff --git a/api/api_proto/user_objects.proto b/api/api_proto/user_objects.proto
new file mode 100644
index 0000000..20f0eed
--- /dev/null
+++ b/api/api_proto/user_objects.proto
@@ -0,0 +1,42 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+// This file defines protobufs for issues and related business
+// objects, e.g., field values, comments, and attachments.
+
+syntax = "proto3";
+
+import "api/api_proto/common.proto";
+
+package monorail;
+
+// TODO(jojwang): monorail:1701, fill User with all info necessary for
+// creating a user profile page.
+// Next available tag: 7
+message User {
+  string display_name = 1;
+  int64 user_id = 2;
+  bool is_site_admin = 3;
+  string availability = 4;
+  UserRef linked_parent_ref = 5;
+  repeated UserRef linked_child_refs = 6;
+}
+
+
+// Next available tag: 3
+message UserPrefValue {
+  string name = 1;
+  string value = 2;
+}
+
+
+// Next available tag: 6
+message UserProjects {
+  UserRef user_ref = 1;
+  repeated string owner_of = 2;
+  repeated string member_of = 3;
+  repeated string contributor_to = 4;
+  repeated string starred_projects = 5;
+}
diff --git a/api/api_proto/user_objects_pb2.py b/api/api_proto/user_objects_pb2.py
new file mode 100644
index 0000000..c4e09f1
--- /dev/null
+++ b/api/api_proto/user_objects_pb2.py
@@ -0,0 +1,222 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: api/api_proto/user_objects.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from api.api_proto import common_pb2 as api_dot_api__proto_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='api/api_proto/user_objects.proto',
+  package='monorail',
+  syntax='proto3',
+  serialized_options=None,
+  serialized_pb=_b('\n api/api_proto/user_objects.proto\x12\x08monorail\x1a\x1a\x61pi/api_proto/common.proto\"\xb6\x01\n\x04User\x12\x14\n\x0c\x64isplay_name\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\x03\x12\x15\n\ris_site_admin\x18\x03 \x01(\x08\x12\x14\n\x0c\x61vailability\x18\x04 \x01(\t\x12,\n\x11linked_parent_ref\x18\x05 \x01(\x0b\x32\x11.monorail.UserRef\x12,\n\x11linked_child_refs\x18\x06 \x03(\x0b\x32\x11.monorail.UserRef\",\n\rUserPrefValue\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\x8a\x01\n\x0cUserProjects\x12#\n\x08user_ref\x18\x01 \x01(\x0b\x32\x11.monorail.UserRef\x12\x10\n\x08owner_of\x18\x02 \x03(\t\x12\x11\n\tmember_of\x18\x03 \x03(\t\x12\x16\n\x0e\x63ontributor_to\x18\x04 \x03(\t\x12\x18\n\x10starred_projects\x18\x05 \x03(\tb\x06proto3')
+  ,
+  dependencies=[api_dot_api__proto_dot_common__pb2.DESCRIPTOR,])
+
+
+
+
+_USER = _descriptor.Descriptor(
+  name='User',
+  full_name='monorail.User',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='display_name', full_name='monorail.User.display_name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='monorail.User.user_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='is_site_admin', full_name='monorail.User.is_site_admin', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='availability', full_name='monorail.User.availability', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='linked_parent_ref', full_name='monorail.User.linked_parent_ref', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='linked_child_refs', full_name='monorail.User.linked_child_refs', index=5,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=75,
+  serialized_end=257,
+)
+
+
+_USERPREFVALUE = _descriptor.Descriptor(
+  name='UserPrefValue',
+  full_name='monorail.UserPrefValue',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='monorail.UserPrefValue.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='monorail.UserPrefValue.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=259,
+  serialized_end=303,
+)
+
+
+_USERPROJECTS = _descriptor.Descriptor(
+  name='UserProjects',
+  full_name='monorail.UserProjects',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_ref', full_name='monorail.UserProjects.user_ref', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='owner_of', full_name='monorail.UserProjects.owner_of', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='member_of', full_name='monorail.UserProjects.member_of', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='contributor_to', full_name='monorail.UserProjects.contributor_to', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='starred_projects', full_name='monorail.UserProjects.starred_projects', index=4,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=306,
+  serialized_end=444,
+)
+
+_USER.fields_by_name['linked_parent_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_USER.fields_by_name['linked_child_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_USERPROJECTS.fields_by_name['user_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+DESCRIPTOR.message_types_by_name['User'] = _USER
+DESCRIPTOR.message_types_by_name['UserPrefValue'] = _USERPREFVALUE
+DESCRIPTOR.message_types_by_name['UserProjects'] = _USERPROJECTS
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+User = _reflection.GeneratedProtocolMessageType('User', (_message.Message,), dict(
+  DESCRIPTOR = _USER,
+  __module__ = 'api.api_proto.user_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.User)
+  ))
+_sym_db.RegisterMessage(User)
+
+UserPrefValue = _reflection.GeneratedProtocolMessageType('UserPrefValue', (_message.Message,), dict(
+  DESCRIPTOR = _USERPREFVALUE,
+  __module__ = 'api.api_proto.user_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.UserPrefValue)
+  ))
+_sym_db.RegisterMessage(UserPrefValue)
+
+UserProjects = _reflection.GeneratedProtocolMessageType('UserProjects', (_message.Message,), dict(
+  DESCRIPTOR = _USERPROJECTS,
+  __module__ = 'api.api_proto.user_objects_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.UserProjects)
+  ))
+_sym_db.RegisterMessage(UserProjects)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/api/api_proto/users.proto b/api/api_proto/users.proto
new file mode 100644
index 0000000..574dccd
--- /dev/null
+++ b/api/api_proto/users.proto
@@ -0,0 +1,193 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+syntax = "proto3";
+
+package monorail;
+
+import "api/api_proto/user_objects.proto";
+import "api/api_proto/common.proto";
+
+service Users {
+  rpc GetUser (GetUserRequest) returns (User) {}
+  rpc ListReferencedUsers (ListReferencedUsersRequest) returns (ListReferencedUsersResponse) {}
+  rpc GetMemberships (GetMembershipsRequest) returns (GetMembershipsResponse) {}
+  rpc GetSavedQueries (GetSavedQueriesRequest) returns (GetSavedQueriesResponse) {}
+  rpc GetUserStarCount (GetUserStarCountRequest) returns (GetUserStarCountResponse) {}
+  rpc StarUser (StarUserRequest) returns (StarUserResponse) {}
+  rpc GetUserPrefs (GetUserPrefsRequest) returns (GetUserPrefsResponse) {}
+  rpc SetUserPrefs (SetUserPrefsRequest) returns (SetUserPrefsResponse) {}
+  // TODO(jrobbins): Merge this into SetUserPrefs.
+  rpc SetExpandPermsPreference (SetExpandPermsPreferenceRequest) returns (SetExpandPermsPreferenceResponse) {}
+  rpc InviteLinkedParent (InviteLinkedParentRequest) returns (InviteLinkedParentResponse) {}
+  rpc AcceptLinkedChild (AcceptLinkedChildRequest) returns (AcceptLinkedChildResponse) {}
+  rpc UnlinkAccounts (UnlinkAccountsRequest) returns (UnlinkAccountsResponse) {}
+  rpc GetUsersProjects (GetUsersProjectsRequest) returns (GetUsersProjectsResponse) {}
+  rpc ExpungeUser (ExpungeUserRequest) returns (ExpungeUserResponse) {}
+}
+
+
+// Next available tag: 4
+message ListReferencedUsersRequest {
+  // emails is deprecated. Use user_refs instead.
+  repeated string emails = 2;
+  repeated UserRef user_refs = 3;
+}
+
+
+message ListReferencedUsersResponse {
+  repeated User users = 1;
+}
+
+
+// Next available tag: 3
+message GetUserRequest {
+  UserRef user_ref = 2;
+}
+
+
+// Next available tag: 3
+message GetMembershipsRequest {
+  UserRef user_ref = 2;
+}
+
+
+// Next available tag: 2
+message GetMembershipsResponse {
+  repeated UserRef group_refs = 1;
+}
+
+
+// Next available tag: 3
+message GetSavedQueriesRequest {
+  UserRef user_ref = 2;
+}
+
+
+// Next available tag: 2
+message GetSavedQueriesResponse {
+  repeated SavedQuery saved_queries = 1;
+}
+
+// Next available tag: 3
+message GetUserStarCountRequest {
+  UserRef user_ref = 2;
+}
+
+
+// Next available tag: 2
+message GetUserStarCountResponse {
+  uint32 star_count = 1;
+}
+
+
+// Next available tag: 4
+message StarUserRequest {
+  UserRef user_ref = 2;
+  bool starred = 3;
+}
+
+
+// Next available tag: 2
+message StarUserResponse {
+  uint32 star_count = 1;
+}
+
+
+// Next available tag: 3
+message SetExpandPermsPreferenceRequest {
+  bool expand_perms = 2;
+}
+
+
+// Next available tag: 1
+message SetExpandPermsPreferenceResponse {
+}
+
+
+// Next available tag: 3
+message GetUserPrefsRequest {
+  // Site admins may get prefs for specific users.  Otherwise, it gets
+  // prefs for the signed-in user.
+  UserRef user_ref = 2;
+}
+
+
+// Next available tag: 2
+message GetUserPrefsResponse {
+  repeated UserPrefValue prefs = 1;
+}
+
+
+// Next available tag: 5
+message SetUserPrefsRequest {
+  // Site admins may set prefs for specific users.  Otherwise, it sets
+  // prefs for the signed-in user.
+  UserRef user_ref = 2;
+  // The given prefs add to or overwrite current user prefs.
+  repeated UserPrefValue prefs = 3;
+}
+
+
+// Next available tag: 1
+message SetUserPrefsResponse {
+}
+
+
+// Next available tag: 3
+message InviteLinkedParentRequest {
+  string email = 2;
+}
+
+
+// Next available tag: 1
+message InviteLinkedParentResponse {
+}
+
+
+// Next available tag: 3
+message AcceptLinkedChildRequest {
+  string email = 2;
+}
+
+
+// Next available tag: 1
+message AcceptLinkedChildResponse {
+}
+
+
+// Next available tag: 4
+message UnlinkAccountsRequest {
+  UserRef parent = 2;
+  UserRef child = 3;
+}
+
+
+// Next available tag: 1
+message UnlinkAccountsResponse {
+}
+
+
+// Next available tag: 2
+message GetUsersProjectsRequest {
+  repeated UserRef user_refs = 1;
+}
+
+
+// Next available tag: 5
+message GetUsersProjectsResponse {
+  repeated UserProjects users_projects = 1;
+}
+
+
+// Next available tag: 2
+message ExpungeUserRequest {
+  string email = 1;
+}
+
+
+// Next available tag: 1
+message ExpungeUserResponse {
+}
\ No newline at end of file
diff --git a/api/api_proto/users_pb2.py b/api/api_proto/users_pb2.py
new file mode 100644
index 0000000..8d84700
--- /dev/null
+++ b/api/api_proto/users_pb2.py
@@ -0,0 +1,1230 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: api/api_proto/users.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from api.api_proto import user_objects_pb2 as api_dot_api__proto_dot_user__objects__pb2
+from api.api_proto import common_pb2 as api_dot_api__proto_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='api/api_proto/users.proto',
+  package='monorail',
+  syntax='proto3',
+  serialized_options=None,
+  serialized_pb=_b('\n\x19\x61pi/api_proto/users.proto\x12\x08monorail\x1a api/api_proto/user_objects.proto\x1a\x1a\x61pi/api_proto/common.proto\"R\n\x1aListReferencedUsersRequest\x12\x0e\n\x06\x65mails\x18\x02 \x03(\t\x12$\n\tuser_refs\x18\x03 \x03(\x0b\x32\x11.monorail.UserRef\"<\n\x1bListReferencedUsersResponse\x12\x1d\n\x05users\x18\x01 \x03(\x0b\x32\x0e.monorail.User\"5\n\x0eGetUserRequest\x12#\n\x08user_ref\x18\x02 \x01(\x0b\x32\x11.monorail.UserRef\"<\n\x15GetMembershipsRequest\x12#\n\x08user_ref\x18\x02 \x01(\x0b\x32\x11.monorail.UserRef\"?\n\x16GetMembershipsResponse\x12%\n\ngroup_refs\x18\x01 \x03(\x0b\x32\x11.monorail.UserRef\"=\n\x16GetSavedQueriesRequest\x12#\n\x08user_ref\x18\x02 \x01(\x0b\x32\x11.monorail.UserRef\"F\n\x17GetSavedQueriesResponse\x12+\n\rsaved_queries\x18\x01 \x03(\x0b\x32\x14.monorail.SavedQuery\">\n\x17GetUserStarCountRequest\x12#\n\x08user_ref\x18\x02 \x01(\x0b\x32\x11.monorail.UserRef\".\n\x18GetUserStarCountResponse\x12\x12\n\nstar_count\x18\x01 \x01(\r\"G\n\x0fStarUserRequest\x12#\n\x08user_ref\x18\x02 \x01(\x0b\x32\x11.monorail.UserRef\x12\x0f\n\x07starred\x18\x03 \x01(\x08\"&\n\x10StarUserResponse\x12\x12\n\nstar_count\x18\x01 \x01(\r\"7\n\x1fSetExpandPermsPreferenceRequest\x12\x14\n\x0c\x65xpand_perms\x18\x02 \x01(\x08\"\"\n SetExpandPermsPreferenceResponse\":\n\x13GetUserPrefsRequest\x12#\n\x08user_ref\x18\x02 \x01(\x0b\x32\x11.monorail.UserRef\">\n\x14GetUserPrefsResponse\x12&\n\x05prefs\x18\x01 \x03(\x0b\x32\x17.monorail.UserPrefValue\"b\n\x13SetUserPrefsRequest\x12#\n\x08user_ref\x18\x02 \x01(\x0b\x32\x11.monorail.UserRef\x12&\n\x05prefs\x18\x03 \x03(\x0b\x32\x17.monorail.UserPrefValue\"\x16\n\x14SetUserPrefsResponse\"*\n\x19InviteLinkedParentRequest\x12\r\n\x05\x65mail\x18\x02 \x01(\t\"\x1c\n\x1aInviteLinkedParentResponse\")\n\x18\x41\x63\x63\x65ptLinkedChildRequest\x12\r\n\x05\x65mail\x18\x02 \x01(\t\"\x1b\n\x19\x41\x63\x63\x65ptLinkedChildResponse\"\\\n\x15UnlinkAccountsRequest\x12!\n\x06parent\x18\x02 \x01(\x0b\x32\x11.monorail.UserRef\x12 \n\x05\x63hild\x18\x03 \x01(\x0b\x32\x11.monorail.UserRef\"\x18\n\x16UnlinkAccountsResponse\"?\n\x17GetUsersProjectsRequest\x12$\n\tuser_refs\x18\x01 \x03(\x0b\x32\x11.monorail.UserRef\"J\n\x18GetUsersProjectsResponse\x12.\n\x0eusers_projects\x18\x01 \x03(\x0b\x32\x16.monorail.UserProjects\"#\n\x12\x45xpungeUserRequest\x12\r\n\x05\x65mail\x18\x01 \x01(\t\"\x15\n\x13\x45xpungeUserResponse2\xd3\t\n\x05Users\x12\x35\n\x07GetUser\x12\x18.monorail.GetUserRequest\x1a\x0e.monorail.User\"\x00\x12\x64\n\x13ListReferencedUsers\x12$.monorail.ListReferencedUsersRequest\x1a%.monorail.ListReferencedUsersResponse\"\x00\x12U\n\x0eGetMemberships\x12\x1f.monorail.GetMembershipsRequest\x1a .monorail.GetMembershipsResponse\"\x00\x12X\n\x0fGetSavedQueries\x12 .monorail.GetSavedQueriesRequest\x1a!.monorail.GetSavedQueriesResponse\"\x00\x12[\n\x10GetUserStarCount\x12!.monorail.GetUserStarCountRequest\x1a\".monorail.GetUserStarCountResponse\"\x00\x12\x43\n\x08StarUser\x12\x19.monorail.StarUserRequest\x1a\x1a.monorail.StarUserResponse\"\x00\x12O\n\x0cGetUserPrefs\x12\x1d.monorail.GetUserPrefsRequest\x1a\x1e.monorail.GetUserPrefsResponse\"\x00\x12O\n\x0cSetUserPrefs\x12\x1d.monorail.SetUserPrefsRequest\x1a\x1e.monorail.SetUserPrefsResponse\"\x00\x12s\n\x18SetExpandPermsPreference\x12).monorail.SetExpandPermsPreferenceRequest\x1a*.monorail.SetExpandPermsPreferenceResponse\"\x00\x12\x61\n\x12InviteLinkedParent\x12#.monorail.InviteLinkedParentRequest\x1a$.monorail.InviteLinkedParentResponse\"\x00\x12^\n\x11\x41\x63\x63\x65ptLinkedChild\x12\".monorail.AcceptLinkedChildRequest\x1a#.monorail.AcceptLinkedChildResponse\"\x00\x12U\n\x0eUnlinkAccounts\x12\x1f.monorail.UnlinkAccountsRequest\x1a .monorail.UnlinkAccountsResponse\"\x00\x12[\n\x10GetUsersProjects\x12!.monorail.GetUsersProjectsRequest\x1a\".monorail.GetUsersProjectsResponse\"\x00\x12L\n\x0b\x45xpungeUser\x12\x1c.monorail.ExpungeUserRequest\x1a\x1d.monorail.ExpungeUserResponse\"\x00\x62\x06proto3')
+  ,
+  dependencies=[api_dot_api__proto_dot_user__objects__pb2.DESCRIPTOR,api_dot_api__proto_dot_common__pb2.DESCRIPTOR,])
+
+
+
+
+_LISTREFERENCEDUSERSREQUEST = _descriptor.Descriptor(
+  name='ListReferencedUsersRequest',
+  full_name='monorail.ListReferencedUsersRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='emails', full_name='monorail.ListReferencedUsersRequest.emails', index=0,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='user_refs', full_name='monorail.ListReferencedUsersRequest.user_refs', index=1,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=101,
+  serialized_end=183,
+)
+
+
+_LISTREFERENCEDUSERSRESPONSE = _descriptor.Descriptor(
+  name='ListReferencedUsersResponse',
+  full_name='monorail.ListReferencedUsersResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='users', full_name='monorail.ListReferencedUsersResponse.users', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=185,
+  serialized_end=245,
+)
+
+
+_GETUSERREQUEST = _descriptor.Descriptor(
+  name='GetUserRequest',
+  full_name='monorail.GetUserRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_ref', full_name='monorail.GetUserRequest.user_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=247,
+  serialized_end=300,
+)
+
+
+_GETMEMBERSHIPSREQUEST = _descriptor.Descriptor(
+  name='GetMembershipsRequest',
+  full_name='monorail.GetMembershipsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_ref', full_name='monorail.GetMembershipsRequest.user_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=302,
+  serialized_end=362,
+)
+
+
+_GETMEMBERSHIPSRESPONSE = _descriptor.Descriptor(
+  name='GetMembershipsResponse',
+  full_name='monorail.GetMembershipsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='group_refs', full_name='monorail.GetMembershipsResponse.group_refs', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=364,
+  serialized_end=427,
+)
+
+
+_GETSAVEDQUERIESREQUEST = _descriptor.Descriptor(
+  name='GetSavedQueriesRequest',
+  full_name='monorail.GetSavedQueriesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_ref', full_name='monorail.GetSavedQueriesRequest.user_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=429,
+  serialized_end=490,
+)
+
+
+_GETSAVEDQUERIESRESPONSE = _descriptor.Descriptor(
+  name='GetSavedQueriesResponse',
+  full_name='monorail.GetSavedQueriesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='saved_queries', full_name='monorail.GetSavedQueriesResponse.saved_queries', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=492,
+  serialized_end=562,
+)
+
+
+_GETUSERSTARCOUNTREQUEST = _descriptor.Descriptor(
+  name='GetUserStarCountRequest',
+  full_name='monorail.GetUserStarCountRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_ref', full_name='monorail.GetUserStarCountRequest.user_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=564,
+  serialized_end=626,
+)
+
+
+_GETUSERSTARCOUNTRESPONSE = _descriptor.Descriptor(
+  name='GetUserStarCountResponse',
+  full_name='monorail.GetUserStarCountResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='star_count', full_name='monorail.GetUserStarCountResponse.star_count', index=0,
+      number=1, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=628,
+  serialized_end=674,
+)
+
+
+_STARUSERREQUEST = _descriptor.Descriptor(
+  name='StarUserRequest',
+  full_name='monorail.StarUserRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_ref', full_name='monorail.StarUserRequest.user_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='starred', full_name='monorail.StarUserRequest.starred', index=1,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=676,
+  serialized_end=747,
+)
+
+
+_STARUSERRESPONSE = _descriptor.Descriptor(
+  name='StarUserResponse',
+  full_name='monorail.StarUserResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='star_count', full_name='monorail.StarUserResponse.star_count', index=0,
+      number=1, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=749,
+  serialized_end=787,
+)
+
+
+_SETEXPANDPERMSPREFERENCEREQUEST = _descriptor.Descriptor(
+  name='SetExpandPermsPreferenceRequest',
+  full_name='monorail.SetExpandPermsPreferenceRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='expand_perms', full_name='monorail.SetExpandPermsPreferenceRequest.expand_perms', index=0,
+      number=2, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=789,
+  serialized_end=844,
+)
+
+
+_SETEXPANDPERMSPREFERENCERESPONSE = _descriptor.Descriptor(
+  name='SetExpandPermsPreferenceResponse',
+  full_name='monorail.SetExpandPermsPreferenceResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=846,
+  serialized_end=880,
+)
+
+
+_GETUSERPREFSREQUEST = _descriptor.Descriptor(
+  name='GetUserPrefsRequest',
+  full_name='monorail.GetUserPrefsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_ref', full_name='monorail.GetUserPrefsRequest.user_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=882,
+  serialized_end=940,
+)
+
+
+_GETUSERPREFSRESPONSE = _descriptor.Descriptor(
+  name='GetUserPrefsResponse',
+  full_name='monorail.GetUserPrefsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='prefs', full_name='monorail.GetUserPrefsResponse.prefs', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=942,
+  serialized_end=1004,
+)
+
+
+_SETUSERPREFSREQUEST = _descriptor.Descriptor(
+  name='SetUserPrefsRequest',
+  full_name='monorail.SetUserPrefsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_ref', full_name='monorail.SetUserPrefsRequest.user_ref', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='prefs', full_name='monorail.SetUserPrefsRequest.prefs', index=1,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1006,
+  serialized_end=1104,
+)
+
+
+_SETUSERPREFSRESPONSE = _descriptor.Descriptor(
+  name='SetUserPrefsResponse',
+  full_name='monorail.SetUserPrefsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1106,
+  serialized_end=1128,
+)
+
+
+_INVITELINKEDPARENTREQUEST = _descriptor.Descriptor(
+  name='InviteLinkedParentRequest',
+  full_name='monorail.InviteLinkedParentRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='email', full_name='monorail.InviteLinkedParentRequest.email', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1130,
+  serialized_end=1172,
+)
+
+
+_INVITELINKEDPARENTRESPONSE = _descriptor.Descriptor(
+  name='InviteLinkedParentResponse',
+  full_name='monorail.InviteLinkedParentResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1174,
+  serialized_end=1202,
+)
+
+
+_ACCEPTLINKEDCHILDREQUEST = _descriptor.Descriptor(
+  name='AcceptLinkedChildRequest',
+  full_name='monorail.AcceptLinkedChildRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='email', full_name='monorail.AcceptLinkedChildRequest.email', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1204,
+  serialized_end=1245,
+)
+
+
+_ACCEPTLINKEDCHILDRESPONSE = _descriptor.Descriptor(
+  name='AcceptLinkedChildResponse',
+  full_name='monorail.AcceptLinkedChildResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1247,
+  serialized_end=1274,
+)
+
+
+_UNLINKACCOUNTSREQUEST = _descriptor.Descriptor(
+  name='UnlinkAccountsRequest',
+  full_name='monorail.UnlinkAccountsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='parent', full_name='monorail.UnlinkAccountsRequest.parent', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='child', full_name='monorail.UnlinkAccountsRequest.child', index=1,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1276,
+  serialized_end=1368,
+)
+
+
+_UNLINKACCOUNTSRESPONSE = _descriptor.Descriptor(
+  name='UnlinkAccountsResponse',
+  full_name='monorail.UnlinkAccountsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1370,
+  serialized_end=1394,
+)
+
+
+_GETUSERSPROJECTSREQUEST = _descriptor.Descriptor(
+  name='GetUsersProjectsRequest',
+  full_name='monorail.GetUsersProjectsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_refs', full_name='monorail.GetUsersProjectsRequest.user_refs', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1396,
+  serialized_end=1459,
+)
+
+
+_GETUSERSPROJECTSRESPONSE = _descriptor.Descriptor(
+  name='GetUsersProjectsResponse',
+  full_name='monorail.GetUsersProjectsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='users_projects', full_name='monorail.GetUsersProjectsResponse.users_projects', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1461,
+  serialized_end=1535,
+)
+
+
+_EXPUNGEUSERREQUEST = _descriptor.Descriptor(
+  name='ExpungeUserRequest',
+  full_name='monorail.ExpungeUserRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='email', full_name='monorail.ExpungeUserRequest.email', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1537,
+  serialized_end=1572,
+)
+
+
+_EXPUNGEUSERRESPONSE = _descriptor.Descriptor(
+  name='ExpungeUserResponse',
+  full_name='monorail.ExpungeUserResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1574,
+  serialized_end=1595,
+)
+
+_LISTREFERENCEDUSERSREQUEST.fields_by_name['user_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_LISTREFERENCEDUSERSRESPONSE.fields_by_name['users'].message_type = api_dot_api__proto_dot_user__objects__pb2._USER
+_GETUSERREQUEST.fields_by_name['user_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_GETMEMBERSHIPSREQUEST.fields_by_name['user_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_GETMEMBERSHIPSRESPONSE.fields_by_name['group_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_GETSAVEDQUERIESREQUEST.fields_by_name['user_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_GETSAVEDQUERIESRESPONSE.fields_by_name['saved_queries'].message_type = api_dot_api__proto_dot_common__pb2._SAVEDQUERY
+_GETUSERSTARCOUNTREQUEST.fields_by_name['user_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_STARUSERREQUEST.fields_by_name['user_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_GETUSERPREFSREQUEST.fields_by_name['user_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_GETUSERPREFSRESPONSE.fields_by_name['prefs'].message_type = api_dot_api__proto_dot_user__objects__pb2._USERPREFVALUE
+_SETUSERPREFSREQUEST.fields_by_name['user_ref'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_SETUSERPREFSREQUEST.fields_by_name['prefs'].message_type = api_dot_api__proto_dot_user__objects__pb2._USERPREFVALUE
+_UNLINKACCOUNTSREQUEST.fields_by_name['parent'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_UNLINKACCOUNTSREQUEST.fields_by_name['child'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_GETUSERSPROJECTSREQUEST.fields_by_name['user_refs'].message_type = api_dot_api__proto_dot_common__pb2._USERREF
+_GETUSERSPROJECTSRESPONSE.fields_by_name['users_projects'].message_type = api_dot_api__proto_dot_user__objects__pb2._USERPROJECTS
+DESCRIPTOR.message_types_by_name['ListReferencedUsersRequest'] = _LISTREFERENCEDUSERSREQUEST
+DESCRIPTOR.message_types_by_name['ListReferencedUsersResponse'] = _LISTREFERENCEDUSERSRESPONSE
+DESCRIPTOR.message_types_by_name['GetUserRequest'] = _GETUSERREQUEST
+DESCRIPTOR.message_types_by_name['GetMembershipsRequest'] = _GETMEMBERSHIPSREQUEST
+DESCRIPTOR.message_types_by_name['GetMembershipsResponse'] = _GETMEMBERSHIPSRESPONSE
+DESCRIPTOR.message_types_by_name['GetSavedQueriesRequest'] = _GETSAVEDQUERIESREQUEST
+DESCRIPTOR.message_types_by_name['GetSavedQueriesResponse'] = _GETSAVEDQUERIESRESPONSE
+DESCRIPTOR.message_types_by_name['GetUserStarCountRequest'] = _GETUSERSTARCOUNTREQUEST
+DESCRIPTOR.message_types_by_name['GetUserStarCountResponse'] = _GETUSERSTARCOUNTRESPONSE
+DESCRIPTOR.message_types_by_name['StarUserRequest'] = _STARUSERREQUEST
+DESCRIPTOR.message_types_by_name['StarUserResponse'] = _STARUSERRESPONSE
+DESCRIPTOR.message_types_by_name['SetExpandPermsPreferenceRequest'] = _SETEXPANDPERMSPREFERENCEREQUEST
+DESCRIPTOR.message_types_by_name['SetExpandPermsPreferenceResponse'] = _SETEXPANDPERMSPREFERENCERESPONSE
+DESCRIPTOR.message_types_by_name['GetUserPrefsRequest'] = _GETUSERPREFSREQUEST
+DESCRIPTOR.message_types_by_name['GetUserPrefsResponse'] = _GETUSERPREFSRESPONSE
+DESCRIPTOR.message_types_by_name['SetUserPrefsRequest'] = _SETUSERPREFSREQUEST
+DESCRIPTOR.message_types_by_name['SetUserPrefsResponse'] = _SETUSERPREFSRESPONSE
+DESCRIPTOR.message_types_by_name['InviteLinkedParentRequest'] = _INVITELINKEDPARENTREQUEST
+DESCRIPTOR.message_types_by_name['InviteLinkedParentResponse'] = _INVITELINKEDPARENTRESPONSE
+DESCRIPTOR.message_types_by_name['AcceptLinkedChildRequest'] = _ACCEPTLINKEDCHILDREQUEST
+DESCRIPTOR.message_types_by_name['AcceptLinkedChildResponse'] = _ACCEPTLINKEDCHILDRESPONSE
+DESCRIPTOR.message_types_by_name['UnlinkAccountsRequest'] = _UNLINKACCOUNTSREQUEST
+DESCRIPTOR.message_types_by_name['UnlinkAccountsResponse'] = _UNLINKACCOUNTSRESPONSE
+DESCRIPTOR.message_types_by_name['GetUsersProjectsRequest'] = _GETUSERSPROJECTSREQUEST
+DESCRIPTOR.message_types_by_name['GetUsersProjectsResponse'] = _GETUSERSPROJECTSRESPONSE
+DESCRIPTOR.message_types_by_name['ExpungeUserRequest'] = _EXPUNGEUSERREQUEST
+DESCRIPTOR.message_types_by_name['ExpungeUserResponse'] = _EXPUNGEUSERRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+ListReferencedUsersRequest = _reflection.GeneratedProtocolMessageType('ListReferencedUsersRequest', (_message.Message,), dict(
+  DESCRIPTOR = _LISTREFERENCEDUSERSREQUEST,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListReferencedUsersRequest)
+  ))
+_sym_db.RegisterMessage(ListReferencedUsersRequest)
+
+ListReferencedUsersResponse = _reflection.GeneratedProtocolMessageType('ListReferencedUsersResponse', (_message.Message,), dict(
+  DESCRIPTOR = _LISTREFERENCEDUSERSRESPONSE,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ListReferencedUsersResponse)
+  ))
+_sym_db.RegisterMessage(ListReferencedUsersResponse)
+
+GetUserRequest = _reflection.GeneratedProtocolMessageType('GetUserRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETUSERREQUEST,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetUserRequest)
+  ))
+_sym_db.RegisterMessage(GetUserRequest)
+
+GetMembershipsRequest = _reflection.GeneratedProtocolMessageType('GetMembershipsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETMEMBERSHIPSREQUEST,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetMembershipsRequest)
+  ))
+_sym_db.RegisterMessage(GetMembershipsRequest)
+
+GetMembershipsResponse = _reflection.GeneratedProtocolMessageType('GetMembershipsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _GETMEMBERSHIPSRESPONSE,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetMembershipsResponse)
+  ))
+_sym_db.RegisterMessage(GetMembershipsResponse)
+
+GetSavedQueriesRequest = _reflection.GeneratedProtocolMessageType('GetSavedQueriesRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETSAVEDQUERIESREQUEST,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetSavedQueriesRequest)
+  ))
+_sym_db.RegisterMessage(GetSavedQueriesRequest)
+
+GetSavedQueriesResponse = _reflection.GeneratedProtocolMessageType('GetSavedQueriesResponse', (_message.Message,), dict(
+  DESCRIPTOR = _GETSAVEDQUERIESRESPONSE,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetSavedQueriesResponse)
+  ))
+_sym_db.RegisterMessage(GetSavedQueriesResponse)
+
+GetUserStarCountRequest = _reflection.GeneratedProtocolMessageType('GetUserStarCountRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETUSERSTARCOUNTREQUEST,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetUserStarCountRequest)
+  ))
+_sym_db.RegisterMessage(GetUserStarCountRequest)
+
+GetUserStarCountResponse = _reflection.GeneratedProtocolMessageType('GetUserStarCountResponse', (_message.Message,), dict(
+  DESCRIPTOR = _GETUSERSTARCOUNTRESPONSE,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetUserStarCountResponse)
+  ))
+_sym_db.RegisterMessage(GetUserStarCountResponse)
+
+StarUserRequest = _reflection.GeneratedProtocolMessageType('StarUserRequest', (_message.Message,), dict(
+  DESCRIPTOR = _STARUSERREQUEST,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.StarUserRequest)
+  ))
+_sym_db.RegisterMessage(StarUserRequest)
+
+StarUserResponse = _reflection.GeneratedProtocolMessageType('StarUserResponse', (_message.Message,), dict(
+  DESCRIPTOR = _STARUSERRESPONSE,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.StarUserResponse)
+  ))
+_sym_db.RegisterMessage(StarUserResponse)
+
+SetExpandPermsPreferenceRequest = _reflection.GeneratedProtocolMessageType('SetExpandPermsPreferenceRequest', (_message.Message,), dict(
+  DESCRIPTOR = _SETEXPANDPERMSPREFERENCEREQUEST,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.SetExpandPermsPreferenceRequest)
+  ))
+_sym_db.RegisterMessage(SetExpandPermsPreferenceRequest)
+
+SetExpandPermsPreferenceResponse = _reflection.GeneratedProtocolMessageType('SetExpandPermsPreferenceResponse', (_message.Message,), dict(
+  DESCRIPTOR = _SETEXPANDPERMSPREFERENCERESPONSE,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.SetExpandPermsPreferenceResponse)
+  ))
+_sym_db.RegisterMessage(SetExpandPermsPreferenceResponse)
+
+GetUserPrefsRequest = _reflection.GeneratedProtocolMessageType('GetUserPrefsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETUSERPREFSREQUEST,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetUserPrefsRequest)
+  ))
+_sym_db.RegisterMessage(GetUserPrefsRequest)
+
+GetUserPrefsResponse = _reflection.GeneratedProtocolMessageType('GetUserPrefsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _GETUSERPREFSRESPONSE,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetUserPrefsResponse)
+  ))
+_sym_db.RegisterMessage(GetUserPrefsResponse)
+
+SetUserPrefsRequest = _reflection.GeneratedProtocolMessageType('SetUserPrefsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _SETUSERPREFSREQUEST,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.SetUserPrefsRequest)
+  ))
+_sym_db.RegisterMessage(SetUserPrefsRequest)
+
+SetUserPrefsResponse = _reflection.GeneratedProtocolMessageType('SetUserPrefsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _SETUSERPREFSRESPONSE,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.SetUserPrefsResponse)
+  ))
+_sym_db.RegisterMessage(SetUserPrefsResponse)
+
+InviteLinkedParentRequest = _reflection.GeneratedProtocolMessageType('InviteLinkedParentRequest', (_message.Message,), dict(
+  DESCRIPTOR = _INVITELINKEDPARENTREQUEST,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.InviteLinkedParentRequest)
+  ))
+_sym_db.RegisterMessage(InviteLinkedParentRequest)
+
+InviteLinkedParentResponse = _reflection.GeneratedProtocolMessageType('InviteLinkedParentResponse', (_message.Message,), dict(
+  DESCRIPTOR = _INVITELINKEDPARENTRESPONSE,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.InviteLinkedParentResponse)
+  ))
+_sym_db.RegisterMessage(InviteLinkedParentResponse)
+
+AcceptLinkedChildRequest = _reflection.GeneratedProtocolMessageType('AcceptLinkedChildRequest', (_message.Message,), dict(
+  DESCRIPTOR = _ACCEPTLINKEDCHILDREQUEST,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.AcceptLinkedChildRequest)
+  ))
+_sym_db.RegisterMessage(AcceptLinkedChildRequest)
+
+AcceptLinkedChildResponse = _reflection.GeneratedProtocolMessageType('AcceptLinkedChildResponse', (_message.Message,), dict(
+  DESCRIPTOR = _ACCEPTLINKEDCHILDRESPONSE,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.AcceptLinkedChildResponse)
+  ))
+_sym_db.RegisterMessage(AcceptLinkedChildResponse)
+
+UnlinkAccountsRequest = _reflection.GeneratedProtocolMessageType('UnlinkAccountsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _UNLINKACCOUNTSREQUEST,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.UnlinkAccountsRequest)
+  ))
+_sym_db.RegisterMessage(UnlinkAccountsRequest)
+
+UnlinkAccountsResponse = _reflection.GeneratedProtocolMessageType('UnlinkAccountsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _UNLINKACCOUNTSRESPONSE,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.UnlinkAccountsResponse)
+  ))
+_sym_db.RegisterMessage(UnlinkAccountsResponse)
+
+GetUsersProjectsRequest = _reflection.GeneratedProtocolMessageType('GetUsersProjectsRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETUSERSPROJECTSREQUEST,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetUsersProjectsRequest)
+  ))
+_sym_db.RegisterMessage(GetUsersProjectsRequest)
+
+GetUsersProjectsResponse = _reflection.GeneratedProtocolMessageType('GetUsersProjectsResponse', (_message.Message,), dict(
+  DESCRIPTOR = _GETUSERSPROJECTSRESPONSE,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.GetUsersProjectsResponse)
+  ))
+_sym_db.RegisterMessage(GetUsersProjectsResponse)
+
+ExpungeUserRequest = _reflection.GeneratedProtocolMessageType('ExpungeUserRequest', (_message.Message,), dict(
+  DESCRIPTOR = _EXPUNGEUSERREQUEST,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ExpungeUserRequest)
+  ))
+_sym_db.RegisterMessage(ExpungeUserRequest)
+
+ExpungeUserResponse = _reflection.GeneratedProtocolMessageType('ExpungeUserResponse', (_message.Message,), dict(
+  DESCRIPTOR = _EXPUNGEUSERRESPONSE,
+  __module__ = 'api.api_proto.users_pb2'
+  # @@protoc_insertion_point(class_scope:monorail.ExpungeUserResponse)
+  ))
+_sym_db.RegisterMessage(ExpungeUserResponse)
+
+
+
+_USERS = _descriptor.ServiceDescriptor(
+  name='Users',
+  full_name='monorail.Users',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  serialized_start=1598,
+  serialized_end=2833,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='GetUser',
+    full_name='monorail.Users.GetUser',
+    index=0,
+    containing_service=None,
+    input_type=_GETUSERREQUEST,
+    output_type=api_dot_api__proto_dot_user__objects__pb2._USER,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListReferencedUsers',
+    full_name='monorail.Users.ListReferencedUsers',
+    index=1,
+    containing_service=None,
+    input_type=_LISTREFERENCEDUSERSREQUEST,
+    output_type=_LISTREFERENCEDUSERSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetMemberships',
+    full_name='monorail.Users.GetMemberships',
+    index=2,
+    containing_service=None,
+    input_type=_GETMEMBERSHIPSREQUEST,
+    output_type=_GETMEMBERSHIPSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetSavedQueries',
+    full_name='monorail.Users.GetSavedQueries',
+    index=3,
+    containing_service=None,
+    input_type=_GETSAVEDQUERIESREQUEST,
+    output_type=_GETSAVEDQUERIESRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetUserStarCount',
+    full_name='monorail.Users.GetUserStarCount',
+    index=4,
+    containing_service=None,
+    input_type=_GETUSERSTARCOUNTREQUEST,
+    output_type=_GETUSERSTARCOUNTRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='StarUser',
+    full_name='monorail.Users.StarUser',
+    index=5,
+    containing_service=None,
+    input_type=_STARUSERREQUEST,
+    output_type=_STARUSERRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetUserPrefs',
+    full_name='monorail.Users.GetUserPrefs',
+    index=6,
+    containing_service=None,
+    input_type=_GETUSERPREFSREQUEST,
+    output_type=_GETUSERPREFSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='SetUserPrefs',
+    full_name='monorail.Users.SetUserPrefs',
+    index=7,
+    containing_service=None,
+    input_type=_SETUSERPREFSREQUEST,
+    output_type=_SETUSERPREFSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='SetExpandPermsPreference',
+    full_name='monorail.Users.SetExpandPermsPreference',
+    index=8,
+    containing_service=None,
+    input_type=_SETEXPANDPERMSPREFERENCEREQUEST,
+    output_type=_SETEXPANDPERMSPREFERENCERESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='InviteLinkedParent',
+    full_name='monorail.Users.InviteLinkedParent',
+    index=9,
+    containing_service=None,
+    input_type=_INVITELINKEDPARENTREQUEST,
+    output_type=_INVITELINKEDPARENTRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='AcceptLinkedChild',
+    full_name='monorail.Users.AcceptLinkedChild',
+    index=10,
+    containing_service=None,
+    input_type=_ACCEPTLINKEDCHILDREQUEST,
+    output_type=_ACCEPTLINKEDCHILDRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UnlinkAccounts',
+    full_name='monorail.Users.UnlinkAccounts',
+    index=11,
+    containing_service=None,
+    input_type=_UNLINKACCOUNTSREQUEST,
+    output_type=_UNLINKACCOUNTSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetUsersProjects',
+    full_name='monorail.Users.GetUsersProjects',
+    index=12,
+    containing_service=None,
+    input_type=_GETUSERSPROJECTSREQUEST,
+    output_type=_GETUSERSPROJECTSRESPONSE,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ExpungeUser',
+    full_name='monorail.Users.ExpungeUser',
+    index=13,
+    containing_service=None,
+    input_type=_EXPUNGEUSERREQUEST,
+    output_type=_EXPUNGEUSERRESPONSE,
+    serialized_options=None,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_USERS)
+
+DESCRIPTOR.services_by_name['Users'] = _USERS
+
+# @@protoc_insertion_point(module_scope)
diff --git a/api/api_proto/users_prpc_pb2.py b/api/api_proto/users_prpc_pb2.py
new file mode 100644
index 0000000..9c99700
--- /dev/null
+++ b/api/api_proto/users_prpc_pb2.py
@@ -0,0 +1,129 @@
+# Generated by the pRPC protocol buffer compiler plugin.  DO NOT EDIT!
+# source: api/api_proto/users.proto
+
+import base64
+import zlib
+
+from google.protobuf import descriptor_pb2
+
+# Includes description of the api/api_proto/users.proto and all of its transitive
+# dependencies. Includes source code info.
+FILE_DESCRIPTOR_SET = descriptor_pb2.FileDescriptorSet()
+FILE_DESCRIPTOR_SET.ParseFromString(zlib.decompress(base64.b64decode(
+    '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')))
+_INDEX = {
+    f.name: {
+      'descriptor': f,
+      'services': {s.name: s for s in f.service},
+    }
+    for f in FILE_DESCRIPTOR_SET.file
+}
+
+
+UsersServiceDescription = {
+  'file_descriptor_set': FILE_DESCRIPTOR_SET,
+  'file_descriptor': _INDEX[u'api/api_proto/users.proto']['descriptor'],
+  'service_descriptor': _INDEX[u'api/api_proto/users.proto']['services'][u'Users'],
+}