message <span class="message">ObjectList</span>
{
  message <span class="message">ObjectInfo</span>
  {
    required <span class="message">ObjectValue</span> value        = 1; 
    repeated <span class="message">Property   </span> propertyList = 2; 
  }
  message <span class="message">ObjectValue</span>
  {
    required <span class="number">uint32</span> objectID    = 1; 
    required <span class="bool">bool  </span> isCallable  = 2; 
    required <span class="bool">bool  </span> isFunction  = 3; 
    <span class="comment">/** 
     * type, function or object
     */</span>
    required <span class="string">string</span> type        = 4; 
    optional <span class="number">uint32</span> prototypeID = 5; 
    <span class="comment">/** 
     * Name of class (object) or function
     */</span>
    optional <span class="string">string</span> name        = 6; 
  }
  <span class="comment">/** 
   * If `type` is ... then ... is present:
   *   "object", `objectValue`
   *   "number", `value`
   *   "string", `value`
   *   "boolean", `value` (`"true"` or `"false"`)
   * Otherwise (`"undefined"` or `"null"`), only `type` is present.
   */</span>
  message <span class="message">Property</span>
  {
    required <span class="string">string     </span> name        = 1; 
    <span class="comment">/** 
     * One of:
     * - `"number"`
     * - `"boolean"`
     * - `"string"`
     * - `"null"`
     * - `"undefined"`
     * - `"object"`
     */</span>
    required <span class="string">string     </span> type        = 2; 
    <span class="comment">/** 
     * Only present for `"number"`, `"string"` or `"boolean"`
     */</span>
    optional <span class="string">string     </span> value       = 3; 
    <span class="comment">/** 
     * Only present for `"object"`
     */</span>
    optional <span class="message">ObjectValue</span> objectValue = 4; 
  }
  repeated <span class="message">ObjectInfo</span> objectList = 1; 
}
