From 8ba77ac56baa380db40ce0fa4bc8b5c1f5258417 Mon Sep 17 00:00:00 2001 From: "ramki@google.com" Date: Thu, 9 Oct 2014 17:37:41 +0000 Subject: [PATCH] App Engine Python SDK version 1.9.13 git-svn-id: http://googleappengine.googlecode.com/svn/trunk@480 80f5ef21-4148-0410-bacc-cfb02402ada8 --- python/RELEASE_NOTES | 17 ++ python/VERSION | 4 +- .../appengine/api/logservice/logservice_stub.py | 9 +- python/google/appengine/api/yaml_errors.py | 4 + .../appengine/client/services/port_manager.py | 51 ++++- .../google/appengine/client/services/vme_errors.py | 8 + .../google/appengine/datastore/datastore_index.py | 50 ++--- .../appengine/datastore/datastore_index_xml.py | 159 +++++++++++++++ python/google/appengine/datastore/datastore_pbs.py | 1 + .../appengine/datastore/datastore_stub_index.py | 218 ++++++++++++++++++++- .../appengine/datastore/datastore_stub_util.py | 57 +++++- python/google/appengine/datastore/entity_pb.py | 2 + .../appengine/ext/analytics/static/analytics_js.js | 12 +- .../appengine/ext/appstats/static/appstats_js.js | 16 +- .../ext/datastore_admin/static/js/compiled.js | 2 +- python/google/appengine/tools/appcfg_java.py | 10 +- python/google/appengine/tools/dev-channel-js.js | 21 +- .../tools/devappserver2/health_check_service.py | 6 +- python/google/net/proto2/proto/descriptor_pb2.py | 101 +++++----- .../sdk/google/appengine/datastore/entity_pb.php | 1 + 20 files changed, 623 insertions(+), 126 deletions(-) create mode 100644 python/google/appengine/datastore/datastore_index_xml.py diff --git a/python/RELEASE_NOTES b/python/RELEASE_NOTES index 850c48fa..3d9c59c5 100644 --- a/python/RELEASE_NOTES +++ b/python/RELEASE_NOTES @@ -3,8 +3,25 @@ All rights reserved. App Engine SDK - Release Notes +Version 1.9.13 + +- No changes for 1.9.13 + + Version 1.9.12 + +Python +============================== +- The libxslt library has been updated from v1.1.22 to v1.1.28 +- Fixed an issue with NDB where a user gets an error stating "_AugmentedQuery' + object has no attribute '_filter_predicate'" when running a query without a + filter predicate. + +PHP ============================== +- Fixed an issue where users are unable to read newly created files in Google + Cloud Storage. + https://code.google.com/p/googleappengine/issues/detail?id=10869 Version 1.9.11 diff --git a/python/VERSION b/python/VERSION index 8d395204..bd34a5a2 100644 --- a/python/VERSION +++ b/python/VERSION @@ -1,5 +1,5 @@ -release: "1.9.12" -timestamp: 1410473495 +release: "1.9.13" +timestamp: 1411710077 api_versions: ['1'] supported_api_versions: python: diff --git a/python/google/appengine/api/logservice/logservice_stub.py b/python/google/appengine/api/logservice/logservice_stub.py index ecfce0a1..b44d27e6 100644 --- a/python/google/appengine/api/logservice/logservice_stub.py +++ b/python/google/appengine/api/logservice/logservice_stub.py @@ -351,8 +351,13 @@ class LogServiceStub(apiproxy_stub.APIProxyStub): values += module_values if request.has_offset(): - filters.append('RequestLogs.id < ?') - values.append(int(request.offset().request_id())) + try: + filters.append('RequestLogs.id < ?') + values.append(int(request.offset().request_id())) + except ValueError: + logging.error('Bad offset in log request: "%s"', request.offset()) + raise apiproxy_errors.ApplicationError( + log_service_pb.LogServiceError.INVALID_REQUEST) if request.has_minimum_log_level(): filters.append('AppLogs.level >= ?') values.append(request.minimum_log_level()) diff --git a/python/google/appengine/api/yaml_errors.py b/python/google/appengine/api/yaml_errors.py index 4299ff9c..9afd3a99 100644 --- a/python/google/appengine/api/yaml_errors.py +++ b/python/google/appengine/api/yaml_errors.py @@ -38,6 +38,10 @@ class MultipleConfigurationFile(Error): """Tried to load configuration file with multiple objects.""" +class AmbiguousConfigurationFiles(Error): + """Both YAML and XML files exist for the same configuration information.""" + + class UnexpectedAttribute(Error): """Raised when an unexpected attribute is encounted.""" diff --git a/python/google/appengine/client/services/port_manager.py b/python/google/appengine/client/services/port_manager.py index e920825e..3ed1bda2 100644 --- a/python/google/appengine/client/services/port_manager.py +++ b/python/google/appengine/client/services/port_manager.py @@ -33,6 +33,9 @@ RESERVED_DOCKER_PORTS = [22, # SSH 10001, # Nanny stubby proxy endpoint ] +DEFAULT_CONTAINER_PORT = 8080 +VM_PORT_FOR_CONTAINER = 8080 + class InconsistentPortConfigurationError(vme_errors.PermanentAppError): """The port is already in use.""" @@ -44,17 +47,18 @@ class IllegalPortConfigurationError(vme_errors.PermanentAppError): pass -def CreatePortManager(forwarded_ports): +def CreatePortManager(forwarded_ports, container_port): """Construct a PortManager object with port forwarding configured. Args: forwarded_ports: A dictionary containing desired mappings from VM host port to docker container port. + container_port: An integer port number for the container port. Returns: The PortManager instance. """ - port_manager_obj = PortManager() + port_manager_obj = PortManager(container_port) ports_list = forwarded_ports if forwarded_ports else [] logging.debug('setting forwarded ports %s', ports_list) port_manager_obj.Add(ports_list, 'forwarded') @@ -64,9 +68,10 @@ def CreatePortManager(forwarded_ports): class PortManager(object): """A helper class for VmManager to deal with port mappings.""" - def __init__(self): + def __init__(self, container_port=DEFAULT_CONTAINER_PORT): self.used_host_ports = {} - self.port_mappings = {} + self._port_mappings = {} + self.container_port = container_port def Add(self, ports, kind): """Load port configurations and adds them to an internal dict. @@ -127,7 +132,7 @@ class PortManager(object): 'Failed to load %s port configuration: "%s" error: "%s"' % (kind, port, e)) # At this point we know they are not destructive. - self.port_mappings.update(port_translations) + self._port_mappings.update(port_translations) return port_translations def GetAllMappedPorts(self): @@ -136,4 +141,38 @@ class PortManager(object): Returns: A dict of port mappings {host: docker} """ - return self.port_mappings + if not self._port_mappings: + return {} + else: + return self._port_mappings + + # TODO: look into moving this into a DockerManager. + def _BuildDockerPublishArgumentString(self): + """Generates a string of ports to expose to the Docker container. + + Returns: + A string with --publish=host:docker pairs. + """ + port_map = self.GetAllMappedPorts() + # Map container port to port 8080 on the VM (default to 8080 if not set) + port_map[VM_PORT_FOR_CONTAINER] = int(self.container_port) + result = '' + for k, v in port_map.iteritems(): + result += '--publish=%d:%s ' % (k, v) + return result + + def GetReplicaPoolParameters(self): + """Returns the contribution to the replica template.""" + publish_ports = self._BuildDockerPublishArgumentString() + maps = { + 'template': { + 'vmParams': { + 'metadata': { + 'items': [ + {'key': 'gae_publish_ports', 'value': publish_ports} + ] + } + } + } + } + return maps diff --git a/python/google/appengine/client/services/vme_errors.py b/python/google/appengine/client/services/vme_errors.py index 7193551d..9d4644b5 100644 --- a/python/google/appengine/client/services/vme_errors.py +++ b/python/google/appengine/client/services/vme_errors.py @@ -84,6 +84,14 @@ class InvalidBucketConfigurationError(PermanentAppError): 'nor admin_config.default_bigstore_bucket is set. Deployment aborted.') +class InvalidUserInstallItem(PermanentAppError): + """Thrown if one of the apt_get_install items is invalid.""" + + def __init__(self, bad_package): + msg = 'Invalid apt-get-install package in vm_settings:"%s"' % bad_package + PermanentAppError.__init__(self, msg) + + class InvalidScopeConfigurationError(PermanentAppError): """Thrown if there are incompatible storage scopes in vm_settings.""" diff --git a/python/google/appengine/datastore/datastore_index.py b/python/google/appengine/datastore/datastore_index.py index fbfd8d8f..7daa43d8 100644 --- a/python/google/appengine/datastore/datastore_index.py +++ b/python/google/appengine/datastore/datastore_index.py @@ -16,8 +16,6 @@ # - - """Primitives for dealing with datastore indexes. Example index.yaml file: @@ -49,6 +47,8 @@ indexes: - kind: Mountain properties: + - name: name + mode: segment - name: location mode: geospatial """ @@ -87,7 +87,7 @@ class Property(validation.Validated): Attributes: name: Name of attribute to sort by. direction: Direction of sort. - mode: How the property is indexed. Either 'geospatial' + mode: How the property is indexed. Either 'geospatial', 'segment' or None (unspecified). """ @@ -96,8 +96,8 @@ class Property(validation.Validated): 'direction': validation.Options(('asc', ('ascending',)), ('desc', ('descending',)), default='asc'), - 'mode': validation.Optional(['geospatial']), - } + 'mode': validation.Optional(['geospatial', 'segment']), + } def __init__(self, **attributes): @@ -112,9 +112,10 @@ class Property(validation.Validated): return self.direction != 'desc' def CheckInitialized(self): - if 'direction' in self._is_set and self.mode == 'geospatial': - raise validation.ValidationError('Direction on a geospatial-mode ' - 'property is not allowed.') + if ('direction' in self._is_set and + self.mode in ['geospatial', 'segment']): + raise validation.ValidationError('Direction on a %s-mode ' + 'property is not allowed.' % self.mode) def _PropertyPresenter(dumper, prop): @@ -162,7 +163,7 @@ class Index(validation.Validated): 'kind': validation.Type(str, convert=False), 'ancestor': validation.Type(bool, convert=False, default=False), 'properties': validation.Optional(validation.Repeated(Property)), - } + } class IndexDefinitions(validation.Validated): @@ -175,7 +176,7 @@ class IndexDefinitions(validation.Validated): ATTRIBUTES = { appinfo.APPLICATION: validation.Optional(appinfo.APPLICATION_RE_STRING), 'indexes': validation.Optional(validation.Repeated(Index)), - } + } def ParseIndexDefinitions(document, open_fn=None): @@ -263,15 +264,12 @@ ASCENDING = datastore_pb.Query_Order.ASCENDING DESCENDING = datastore_pb.Query_Order.DESCENDING -EQUALITY_OPERATORS = set((datastore_pb.Query_Filter.EQUAL, - )) -INEQUALITY_OPERATORS = set((datastore_pb.Query_Filter.LESS_THAN, +EQUALITY_OPERATORS = set([datastore_pb.Query_Filter.EQUAL]) +INEQUALITY_OPERATORS = set([datastore_pb.Query_Filter.LESS_THAN, datastore_pb.Query_Filter.LESS_THAN_OR_EQUAL, datastore_pb.Query_Filter.GREATER_THAN, - datastore_pb.Query_Filter.GREATER_THAN_OR_EQUAL, - )) -EXISTS_OPERATORS = set((datastore_pb.Query_Filter.EXISTS, - )) + datastore_pb.Query_Filter.GREATER_THAN_OR_EQUAL]) +EXISTS_OPERATORS = set([datastore_pb.Query_Filter.EXISTS]) def Normalize(filters, orders, exists): @@ -384,7 +382,6 @@ def RemoveNativelySupportedComponents(filters, orders, exists): return (filters, orders) - has_key_desc_order = False if orders and orders[-1].property() == datastore_types.KEY_SPECIAL_PROPERTY: if orders[-1].direction() == ASCENDING: @@ -403,7 +400,8 @@ def RemoveNativelySupportedComponents(filters, orders, exists): f.property(0).name() != datastore_types.KEY_SPECIAL_PROPERTY): break else: - filters = [f for f in filters + filters = [ + f for f in filters if f.property(0).name() != datastore_types.KEY_SPECIAL_PROPERTY] return (filters, orders) @@ -763,6 +761,10 @@ def MinimalCompositeIndexForQuery(query, index_defs): return False, kind, minimal_ancestor, props + + + + def IndexYamlForQuery(kind, ancestor, props): """Return the composite index definition YAML needed for a query. @@ -815,12 +817,12 @@ def IndexXmlForQuery(kind, ancestor, props): serialized_xml = [] - serialized_xml.append('' + serialized_xml.append(' ' % (kind, 'true' if ancestor else 'false')) for name, direction in props: - serialized_xml.append(' ' + serialized_xml.append(' ' % (name, 'asc' if direction == ASCENDING else 'desc')) - serialized_xml.append('') + serialized_xml.append(' ') return '\n'.join(serialized_xml) @@ -852,6 +854,8 @@ def IndexDefinitionToProto(app_id, index_definition): if prop.mode == 'geospatial': prop_proto.set_mode(entity_pb.Index_Property.GEOSPATIAL) + elif prop.mode == 'segment': + prop_proto.set_mode(entity_pb.Index_Property.SEGMENT) elif prop.IsAscending(): prop_proto.set_direction(entity_pb.Index_Property.ASCENDING) else: @@ -891,6 +895,8 @@ def ProtoToIndexDefinition(proto): if prop_proto.mode() == entity_pb.Index_Property.GEOSPATIAL: prop_definition.mode = 'geospatial' + elif prop_proto.mode() == entity_pb.Index_Property.SEGMENT: + prop_definition.mode = 'segment' elif prop_proto.direction() == entity_pb.Index_Property.DESCENDING: prop_definition.direction = 'desc' elif prop_proto.direction() == entity_pb.Index_Property.ASCENDING: diff --git a/python/google/appengine/datastore/datastore_index_xml.py b/python/google/appengine/datastore/datastore_index_xml.py new file mode 100644 index 00000000..40d03dd4 --- /dev/null +++ b/python/google/appengine/datastore/datastore_index_xml.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python +# +# Copyright 2007 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +"""Directly processes text of datastore-indexes.xml. + +IndexesXmlParser is called with an XML string to produce an IndexXml object +containing the data from the XML. + +IndexesXmlParser: converts XML to Index object. +Index: describes a single index specified in datastore-indexes.xml +""" + +from xml.etree import ElementTree + +from google.appengine.api.validation import ValidationError +from google.appengine.datastore.datastore_index import Index +from google.appengine.datastore.datastore_index import IndexDefinitions +from google.appengine.datastore.datastore_index import Property + +MISSING_KIND = ' node has missing attribute "kind".' +BAD_DIRECTION = (' tag attribute "direction" must have value "asc"' + ' or "desc", given "%s"') +NAME_MISSING = (' node with kind "%s" needs to have a name' + ' attribute specified for its node') + + +def IndexesXmlToIndexDefinitions(xml_str): + """Convert a XML string into an IndexDefinitions objects. + + Args: + xml_str: a string containing a complete XML document where the root node is + . + + Returns: + an IndexDefinitions object parsed out of the XML string. + + Raises: + ValidationError: in case of malformed XML or illegal inputs. + """ + parser = IndexesXmlParser() + return parser.Parse(xml_str) + + +def IsAutoGenerated(xml_str): + """Test if the given datastore-indexes.xml string implies auto-generation.""" + try: + xml_root = ElementTree.fromstring(xml_str) + return (xml_root.tag == 'datastore-indexes' and + _BooleanAttribute(xml_root.attrib.get('autoGenerate', 'false'))) + except ElementTree.ParseError: + return False + + +class IndexesXmlParser(object): + """Provides logic for walking down XML tree and pulling data.""" + + def Parse(self, xml_str): + """Parses XML string and returns object representation of relevant info. + + Args: + xml_str: The XML string. + Returns: + An IndexDefinitions object containing the result of parsing the XML. + Raises: + ValidationError: In case of malformed XML or illegal inputs. + """ + + try: + self.indexes = [] + self.errors = [] + xml_root = ElementTree.fromstring(xml_str) + if xml_root.tag != 'datastore-indexes': + raise ValidationError('Root tag must be ') + + for child in xml_root.getchildren(): + self.ProcessIndexNode(child) + + if self.errors: + raise ValidationError('\n'.join(self.errors)) + + return IndexDefinitions(indexes=self.indexes) + except ElementTree.ParseError, e: + raise ValidationError('Bad input -- not valid XML: %s' % e) + + def ProcessIndexNode(self, node): + """Processes XML nodes into Index objects. + + The following information is parsed out: + kind: specifies the kind of entities to index. + ancestor: true if the index supports queries that filter by + ancestor-key to constraint results to a single entity group. + property: represents the entity properties to index, with a name + and direction attribute. + + Args: + node: XML node in datastore-indexes.xml. + """ + if node.tag != 'datastore-index': + self.errors.append('Unrecognized node: <%s>' % node.tag) + return + + index = Index() + index.kind = node.attrib.get('kind', '') + if not index.kind: + self.errors.append(MISSING_KIND) + ancestor = node.attrib.get('ancestor', 'false') + index.ancestor = _BooleanAttribute(ancestor) + if index.ancestor is None: + self.errors.append( + 'Value for ancestor should be true or false, not "%s"' % ancestor) + properties = [] + property_nodes = [n for n in node.getchildren() if n.tag == 'property'] + for property_node in property_nodes: + name = property_node.attrib.get('name', '') + if not name: + self.errors.append(NAME_MISSING % index.kind) + continue + + direction = property_node.attrib.get('direction', 'asc') + if direction not in ('asc', 'desc'): + self.errors.append(BAD_DIRECTION % direction) + continue + properties.append(Property(name=name, direction=direction)) + index.properties = properties + self.indexes.append(index) + + +def _BooleanAttribute(value): + """Parse the given attribute value as a Boolean value. + + This follows the specification here: + http://www.w3.org/TR/2012/REC-xmlschema11-2-20120405/datatypes.html#boolean + + Args: + value: the value to parse. + + Returns: + True if the value parses as true, False if it parses as false, None if it + parses as neither. + """ + if value in ['true', '1']: + return True + elif value in ['false', '0']: + return False + else: + return None diff --git a/python/google/appengine/datastore/datastore_pbs.py b/python/google/appengine/datastore/datastore_pbs.py index 87fe62a0..323897fb 100644 --- a/python/google/appengine/datastore/datastore_pbs.py +++ b/python/google/appengine/datastore/datastore_pbs.py @@ -443,6 +443,7 @@ class _EntityConverter(object): self.__v3_to_v4_user_entity(v3_property_value.uservalue(), v4_value.mutable_entity_value()) v4_value.set_meaning(MEANING_PREDEFINED_ENTITY_USER) + v3_meaning = None else: pass diff --git a/python/google/appengine/datastore/datastore_stub_index.py b/python/google/appengine/datastore/datastore_stub_index.py index dda08106..e328bfd0 100644 --- a/python/google/appengine/datastore/datastore_stub_index.py +++ b/python/google/appengine/datastore/datastore_stub_index.py @@ -20,6 +20,8 @@ """Utilities for generating and updating index.yaml.""" +from __future__ import with_statement + @@ -30,12 +32,14 @@ __all__ = ['GenerateIndexFromHistory', 'IndexYamlUpdater', ] -import os import logging +import os from google.appengine.api import apiproxy_stub_map +from google.appengine.api import validation from google.appengine.api import yaml_errors from google.appengine.datastore import datastore_index +from google.appengine.datastore import datastore_index_xml import yaml @@ -54,20 +58,25 @@ AUTO_COMMENT = ''' ''' -def GenerateIndexFromHistory(query_history, - all_indexes=None, manual_indexes=None): - """Generate most of the text for index.yaml from the query history. +def GenerateIndexDictFromHistory(query_history, + all_indexes=None, manual_indexes=None): + """Generate a dict of automatic index entries from the query history. Args: - query_history: Query history, a dict mapping query + query_history: Query history, a dict mapping datastore_pb.Query to a count + of the number of times that query has been issued. all_indexes: Optional datastore_index.IndexDefinitions instance representing all the indexes found in the input file. May be None. manual_indexes: Optional datastore_index.IndexDefinitions instance containing indexes for which we should not generate output. May be None. Returns: - A string representation that can safely be appended to an existing - index.yaml file. Returns the empty string if it would generate no output. + A dict where each key is a tuple (kind, ancestor, properties) and the + corresponding value is a count of the number of times that query has been + issued. The dict contains no entries for keys that appear in manual_keys. + In the tuple, "properties" is itself a tuple of tuples, where each + contained tuple is (name, direction), with "name" being a string and + "direction" being datastore_index.ASCENDING or .DESCENDING. """ @@ -93,6 +102,28 @@ def GenerateIndexFromHistory(query_history, else: indexes[key] = count + return indexes + + +def GenerateIndexFromHistory(query_history, + all_indexes=None, manual_indexes=None): + """Generate most of the text for index.yaml from the query history. + + Args: + query_history: Query history, a dict mapping datastore_pb.Query to a count + of the number of times that query has been issued. + all_indexes: Optional datastore_index.IndexDefinitions instance + representing all the indexes found in the input file. May be None. + manual_indexes: Optional datastore_index.IndexDefinitions instance + containing indexes for which we should not generate output. May be None. + + Returns: + A string representation that can safely be appended to an existing + index.yaml file. Returns the empty string if it would generate no output. + """ + indexes = GenerateIndexDictFromHistory( + query_history, all_indexes, manual_indexes) + if not indexes: return '' @@ -100,7 +131,7 @@ def GenerateIndexFromHistory(query_history, res = [] - for (kind, ancestor, props), count in sorted(indexes.iteritems()): + for (kind, ancestor, props), _ in sorted(indexes.iteritems()): res.append('') res.append(datastore_index.IndexYamlForQuery(kind, ancestor, props)) @@ -130,6 +161,9 @@ class IndexYamlUpdater(object): """ self.root_path = root_path + def UpdateIndexConfig(self): + self.UpdateIndexYaml() + def UpdateIndexYaml(self, openfile=open): """Update index.yaml. @@ -277,3 +311,171 @@ class IndexYamlUpdater(object): except os.error, err: logging.error('Can\'t stat index.yaml we just wrote: %s', err) self.index_yaml_mtime = None + + +class DatastoreIndexesAutoXmlUpdater(object): + """Helper class for updating datastore-indexes-auto.xml. + + This class maintains some state about the query history and the + datastore-indexes.xml and datastore-indexes-auto.xml files in order to + minimize the number of times datastore-indexes-auto.xml is rewritten. + """ + + + + auto_generated = True + datastore_indexes_xml = None + datastore_indexes_xml_mtime = None + datastore_indexes_auto_xml_mtime = None + last_history_size = 0 + + def __init__(self, root_path): + self.root_path = root_path + + def UpdateIndexConfig(self): + self.UpdateDatastoreIndexesAutoXml() + + def UpdateDatastoreIndexesAutoXml(self, openfile=open): + """Update datastore-indexes-auto.xml if appropriate.""" + + + + + datastore_indexes_xml_file = os.path.join( + self.root_path, 'WEB-INF', 'datastore-indexes.xml') + try: + datastore_indexes_xml_mtime = os.path.getmtime(datastore_indexes_xml_file) + except os.error: + datastore_indexes_xml_mtime = None + if datastore_indexes_xml_mtime != self.datastore_indexes_xml_mtime: + self.datastore_indexes_xml_mtime = datastore_indexes_xml_mtime + if self.datastore_indexes_xml_mtime: + with openfile(datastore_indexes_xml_file) as f: + self.datastore_indexes_xml = f.read() + self.auto_generated = datastore_index_xml.IsAutoGenerated( + self.datastore_indexes_xml) + else: + self.auto_generated = True + self.datastore_indexes_xml = None + + if not self.auto_generated: + logging.debug('Detected ,' + ' will not update datastore-indexes-auto.xml') + return + + + datastore_stub = apiproxy_stub_map.apiproxy.GetStub('datastore_v3') + query_ci_history_len = datastore_stub._QueryCompositeIndexHistoryLength() + history_changed = (query_ci_history_len != self.last_history_size) + self.last_history_size = query_ci_history_len + if not history_changed: + logging.debug('No need to update datastore-indexes-auto.xml') + return + + datastore_indexes_auto_xml_file = os.path.join( + self.root_path, 'WEB-INF', 'appengine-generated', + 'datastore-indexes-auto.xml') + try: + with open(datastore_indexes_auto_xml_file) as f: + datastore_indexes_auto_xml = f.read() + except IOError, err: + datastore_indexes_auto_xml = None + + if self.datastore_indexes_xml: + try: + manual_index_definitions = ( + datastore_index_xml.IndexesXmlToIndexDefinitions( + self.datastore_indexes_xml)) + except validation.ValidationError, e: + logging.error('Error parsing %s: %s', + datastore_indexes_xml_file, e) + return + else: + manual_index_definitions = datastore_index.IndexDefinitions(indexes=[]) + + if datastore_indexes_auto_xml: + try: + prev_auto_index_definitions = ( + datastore_index_xml.IndexesXmlToIndexDefinitions( + datastore_indexes_auto_xml)) + except validation.ValidationError, e: + logging.error('Error parsing %s: %s', + datastore_indexes_auto_xml_file, e) + return + else: + prev_auto_index_definitions = datastore_index.IndexDefinitions(indexes=[]) + + all_index_definitions = datastore_index.IndexDefinitions( + indexes=(manual_index_definitions.indexes + + prev_auto_index_definitions.indexes)) + query_history = datastore_stub.QueryHistory() + auto_index_dict = GenerateIndexDictFromHistory( + query_history, all_index_definitions, manual_index_definitions) + auto_indexes, counts = self._IndexesFromIndexDict(auto_index_dict) + auto_index_definitions = datastore_index.IndexDefinitions( + indexes=auto_indexes) + if auto_index_definitions == prev_auto_index_definitions: + return + + try: + appengine_generated = os.path.dirname(datastore_indexes_auto_xml_file) + if not os.path.exists(appengine_generated): + os.mkdir(appengine_generated) + with open(datastore_indexes_auto_xml_file, 'w') as f: + f.write(self._IndexXmlFromIndexes(auto_indexes, counts)) + except os.error, err: + logging.error( + 'Could not update %s: %s', datastore_indexes_auto_xml_file, err) + + def _IndexesFromIndexDict(self, index_dict): + """Convert a query dictionary into the corresponding required indexes. + + Args: + index_dict: Query history, a dict mapping datastore_pb.Query to a count + of the number of times that query has been issued. + + Returns: + a tuple (indexes, counts) where indexes and counts are lists of the same + size, with each entry in indexes being a datastore_index.Index and each + entry in indexes being the count of the number of times the corresponding + query appeared in the history. + """ + indexes = [] + counts = [] + for (kind, ancestor, props), count in sorted(index_dict.iteritems()): + properties = [] + for name, direction_code in props: + direction = ( + 'asc' if direction_code == datastore_index.ASCENDING else 'desc') + properties.append( + datastore_index.Property(name=name, direction=direction)) + + indexes.append(datastore_index.Index( + kind=kind, ancestor=bool(ancestor), properties=properties)) + counts.append(count) + + return indexes, counts + + def _IndexXmlFromIndexes(self, indexes, counts): + """Create XML for the given indexes and query counts. + + Args: + indexes: a list of datastore_index.Index objects that are the required + indexes. + counts: a list of integers that are the corresponding counts. + + Returns: + the corresponding XML, with root node . + """ + lines = [''] + for index, count in zip(indexes, counts): + lines.append(' ' + % (count, 's' if count != 1 else '')) + lines.append(' ' + % (index.kind, 'true' if index.ancestor else 'false')) + for prop in index.properties: + lines.append(' ' + % (prop.name, prop.direction)) + lines.append(' ') + lines.append('') + return '\n'.join(lines) + '\n' diff --git a/python/google/appengine/datastore/datastore_stub_util.py b/python/google/appengine/datastore/datastore_stub_util.py index 42dcea32..3e459d98 100644 --- a/python/google/appengine/datastore/datastore_stub_util.py +++ b/python/google/appengine/datastore/datastore_stub_util.py @@ -58,6 +58,7 @@ from google.appengine.api import apiproxy_stub_map from google.appengine.api import datastore_admin from google.appengine.api import datastore_errors from google.appengine.api import datastore_types +from google.appengine.api import yaml_errors from google.appengine.api.taskqueue import taskqueue_service_pb from google.appengine.datastore import datastore_index from google.appengine.datastore import datastore_pb @@ -2889,6 +2890,7 @@ class DatastoreStub(object): self._app_id = datastore_types.ResolveAppId(app_id) self._trusted = trusted self._root_path = root_path + self._xml_configuration = self._XmlConfiguration() self.__query_history = {} @@ -2902,14 +2904,53 @@ class DatastoreStub(object): if self._require_indexes or root_path is None: - self._index_yaml_updater = None + self._index_config_updater = None else: - self._index_yaml_updater = datastore_stub_index.IndexYamlUpdater( - root_path) + + updater_class = ( + datastore_stub_index.DatastoreIndexesAutoXmlUpdater + if self._xml_configuration else datastore_stub_index.IndexYamlUpdater) + self._index_config_updater = updater_class(root_path) DatastoreStub.Clear(self) + def _XmlConfiguration(self): + """Return True if the app at self._root_path uses XML configuration files. + + An app uses XML configuration files if it has a WEB-INF subdirectory and it + does not have an index.yaml at its root. We assume this even if it doesn't + currently have any configuration files at all, because then we will want to + create a new datastore-indexes-auto.xml rather than create a new index.yaml. + + Returns: + True if the app uses XML configuration files, False otherwise. + + Raises: + yaml_errors.AmbiguousConfigurationFiles: if there is both an index.yaml + and either or both of the two possible XML configuration files. + """ + if not self._root_path: + return False + index_yaml = os.path.join(self._root_path, 'index.yaml') + web_inf = os.path.join(self._root_path, 'WEB-INF') + datastore_indexes_xml = os.path.join(web_inf, 'datastore-indexes.xml') + datastore_indexes_auto_xml = os.path.join( + web_inf, 'appengine-generated', 'datastore-indexes-auto.xml') + existing = [ + f for f in [ + index_yaml, datastore_indexes_xml, datastore_indexes_auto_xml] + if os.path.isfile(f)] + if existing == [index_yaml]: + return False + elif index_yaml in existing: + raise yaml_errors.AmbiguousConfigurationFiles( + 'App has both XML and YAML configuration files: %s' % existing) + else: + return os.path.isdir(web_inf) + + + def Clear(self): """Clears out all stored values.""" self._query_cursors = {} @@ -3271,8 +3312,8 @@ class DatastoreStub(object): created, deleted, len(requested)) def _UpdateIndexes(self): - if self._index_yaml_updater is not None: - self._index_yaml_updater.UpdateIndexYaml() + if self._index_config_updater is not None: + self._index_config_updater.UpdateIndexConfig() class StubQueryConverter(object): @@ -3730,10 +3771,6 @@ class StubServiceConverter(object): if v3_req.has_count(): v4_req.set_suggested_batch_size(v3_req.count()) - datastore_pbs.check_conversion( - not (v3_req.has_transaction() and v3_req.has_failover_ms()), - 'Cannot set failover and transaction handle.') - if v3_req.has_transaction(): v4_req.mutable_read_options().set_transaction( @@ -3741,7 +3778,7 @@ class StubServiceConverter(object): elif v3_req.strong(): v4_req.mutable_read_options().set_read_consistency( datastore_v4_pb.ReadOptions.STRONG) - elif v3_req.has_failover_ms(): + elif v3_req.has_strong(): v4_req.mutable_read_options().set_read_consistency( datastore_v4_pb.ReadOptions.EVENTUAL) if v3_req.has_min_safe_time_seconds(): diff --git a/python/google/appengine/datastore/entity_pb.py b/python/google/appengine/datastore/entity_pb.py index 00a43043..7d47dae2 100644 --- a/python/google/appengine/datastore/entity_pb.py +++ b/python/google/appengine/datastore/entity_pb.py @@ -2737,10 +2737,12 @@ class Index_Property(ProtocolBuffer.ProtocolMessage): MODE_UNSPECIFIED = 0 + SEGMENT = 2 GEOSPATIAL = 3 _Mode_NAMES = { 0: "MODE_UNSPECIFIED", + 2: "SEGMENT", 3: "GEOSPATIAL", } diff --git a/python/google/appengine/ext/analytics/static/analytics_js.js b/python/google/appengine/ext/analytics/static/analytics_js.js index c56e0edd..f22e50a6 100644 --- a/python/google/appengine/ext/analytics/static/analytics_js.js +++ b/python/google/appengine/ext/analytics/static/analytics_js.js @@ -1,9 +1,9 @@ /* Copyright 2008-9 Google Inc. All Rights Reserved. */ (function(){var l,m=this,n=function(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null"; else if("function"==b&&"undefined"==typeof a.call)return"object";return b},q=function(a){return"string"==typeof a},r=function(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)}},aa=Date.now||function(){return+new Date},s=function(a,b){var c=a.split("."),e=m;c[0]in e||!e.execScript||e.execScript("var "+c[0]);for(var d;c.length&&(d=c.shift());)c.length||void 0===b?e=e[d]?e[d]:e[d]={}:e[d]=b},t=function(a,b){function c(){} -c.prototype=b.prototype;a.o=b.prototype;a.prototype=new c;a.u=function(a,c,f){return b.prototype[c].apply(a,Array.prototype.slice.call(arguments,2))}};var u=function(a){if(Error.captureStackTrace)Error.captureStackTrace(this,u);else{var b=Error().stack;b&&(this.stack=b)}a&&(this.message=String(a))};t(u,Error);var ba=function(a,b){for(var c=a.split("%s"),e="",d=Array.prototype.slice.call(arguments,1);d.length&&1b?1:0};var z=function(a,b){b.unshift(a);u.call(this,ba.apply(null,b));b.shift()};t(z,u);var A=function(a,b,c){if(!a){var e="Assertion failed";if(b)var e=e+(": "+b),d=Array.prototype.slice.call(arguments,2);throw new z(""+e,d||[]);}};var C=Array.prototype,D=C.indexOf?function(a,b,c){A(null!=a.length);return C.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(q(a))return q(b)&&1==b.length?a.indexOf(b,c):-1;for(;c=arguments.length?C.slice.call(a,b):C.slice.call(a,b,c)};var F;t:{var G=m.navigator;if(G){var H=G.userAgent;if(H){F=H;break t}}F=""}var I=function(a){return-1!=F.indexOf(a)};var J=I("Opera")||I("OPR"),K=I("Trident")||I("MSIE"),L=I("Gecko")&&-1==F.toLowerCase().indexOf("webkit")&&!(I("Trident")||I("MSIE")),M=-1!=F.toLowerCase().indexOf("webkit"),N=function(){var a=m.document;return a?a.documentMode:void 0},fa=function(){var a="",b;if(J&&m.opera)return a=m.opera.version,"function"==n(a)?a():a;L?b=/rv\:([^\);]+)(\)|;)/:K?b=/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/:M&&(b=/WebKit\/(\S+)/);b&&(a=(a=b.exec(F))?a[1]:"");return K&&(b=N(),b>parseFloat(a))?String(b):a}(),ga={},O=function(a){var b; -if(!(b=ga[a])){b=0;for(var c=v(String(fa)).split("."),e=v(String(a)).split("."),d=Math.max(c.length,e.length),f=0;0==b&&fb?1:0};var z=function(a,b){b.unshift(a);u.call(this,ba.apply(null,b));b.shift()};t(z,u);var A=function(a,b,c){if(!a){var e="Assertion failed";if(b)var e=e+(": "+b),d=Array.prototype.slice.call(arguments,2);throw new z(""+e,d||[]);}};var C=Array.prototype,D=C.indexOf?function(a,b,c){A(null!=a.length);return C.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(q(a))return q(b)&&1==b.length?a.indexOf(b,c):-1;for(;c=arguments.length?C.slice.call(a,b):C.slice.call(a,b,c)};var F;t:{var G=m.navigator;if(G){var H=G.userAgent;if(H){F=H;break t}}F=""}var I=function(a){return-1!=F.indexOf(a)};var J=I("Opera")||I("OPR"),K=I("Trident")||I("MSIE"),L=I("Gecko")&&-1==F.toLowerCase().indexOf("webkit")&&!(I("Trident")||I("MSIE")),M=-1!=F.toLowerCase().indexOf("webkit"),N=function(){var a=m.document;return a?a.documentMode:void 0},fa=function(){var a="",b;if(J&&m.opera)return a=m.opera.version,"function"==n(a)?a():a;L?b=/rv\:([^\);]+)(\)|;)/:K?b=/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/:M&&(b=/WebKit\/(\S+)/);b&&(a=(a=b.exec(F))?a[1]:"");return K&&(b=N(),b>parseFloat(a))?String(b):a}(),ga={},O=function(a){var b; +if(!(b=ga[a])){b=0;for(var c=v(String(fa)).split("."),e=v(String(a)).split("."),d=Math.max(c.length,e.length),f=0;0==b&&f=a.keyCode)a.keyCode=-1}catch(b){}};var pa="closure_listenable_"+(1E6*Math.random()|0),qa=0;var ra=function(a,b,c,e,d){this.c=a;this.e=null;this.src=b;this.type=c;this.g=!!e;this.f=d;this.key=++qa;this.d=this.h=!1},sa=function(a){a.d=!0;a.c=null;a.e=null;a.src=null;a.f=null};var T=function(a){this.src=a;this.b={};this.i=0};T.prototype.add=function(a,b,c,e,d){var f=a.toString();a=this.b[f];a||(a=this.b[f]=[],this.i++);var g;t:{for(g=0;g>>0),ya=function(a){A(a,"Listener can not be null.");if("function"==n(a))return a;A(a.handleEvent,"An object listener must have handleEvent method.");a[X]||(a[X]=function(b){return a.handleEvent(b)});return a[X]};var Z=function(a,b,c){"number"==typeof a?(this.a=Ca(a,b||0,c||1),Y(this,c||1)):(b=typeof a,"object"==b&&null!=a||"function"==b?(this.a=Ca(a.getFullYear(),a.getMonth(),a.getDate()),Y(this,a.getDate())):(this.a=new Date(aa()),this.a.setHours(0),this.a.setMinutes(0),this.a.setSeconds(0),this.a.setMilliseconds(0)))},Ca=function(a,b,c){b=new Date(a,b,c);0<=a&&100>a&&b.setFullYear(b.getFullYear()-1900);return b};l=Z.prototype;l.getFullYear=function(){return this.a.getFullYear()};l.getYear=function(){return this.getFullYear()}; l.getMonth=function(){return this.a.getMonth()};l.getDate=function(){return this.a.getDate()};l.getTime=function(){return this.a.getTime()};l.getUTCHours=function(){return this.a.getUTCHours()};l.setFullYear=function(a){this.a.setFullYear(a)};l.setMonth=function(a){this.a.setMonth(a)};l.setDate=function(a){this.a.setDate(a)}; l.add=function(a){if(a.p||a.n){var b=this.getMonth()+a.n+12*a.p,c=this.getYear()+Math.floor(b/12),b=b%12;0>b&&(b+=12);var e;t:{switch(b){case 1:e=0!=c%4||0==c%100&&0!=c%400?28:29;break t;case 5:case 8:case 10:case 3:e=30;break t}e=31}e=Math.min(e,this.getDate());this.setDate(1);this.setFullYear(c);this.setMonth(b);this.setDate(e)}a.m&&(b=new Date(this.getYear(),this.getMonth(),this.getDate(),12),a=new Date(b.getTime()+864E5*a.m),this.setDate(1),this.setFullYear(a.getFullYear()),this.setMonth(a.getMonth()), -this.setDate(a.getDate()),Y(this,a.getDate()))};l.r=function(){return[this.getFullYear(),w(this.getMonth()+1),w(this.getDate())].join("")+""};l.toString=function(){return this.r()};var Y=function(a,b){if(a.getDate()!=b){var c=a.getDate()b&&(b=2);b-=1;return Math.ceil(a/b)*b},Ia=function(a,b,c){a=a.getSelection();1==a.length&&(a=a[0],null!=a.row&&(null!=b.starttime&&(c+="&starttime="+b.starttime),null!=b.endtime&&(c+="&endtime="+b.endtime),null!=b.latency_lower&&(c+="&latency_lower="+b.latency_lower),null!=b.latency_upper&&(c+="&latency_upper="+b.latency_upper),b=c+"&detail="+a.row,window.location.href=b))}, Ja=function(a,b,c,e,d){var f=new google.visualization.DataTable;f.addColumn("string","");f.addColumn("number","");f.addColumn({type:"string",role:"tooltip"});for(var g=0;gb.length&&(f=b.length);for(var g=0;g=arguments.length?r.slice.call(a,b):r.slice.call(a,b,c)};var Ia=function(a){a=a.className;return m(a)&&a.match(/\S+/g)||[]},Ja=function(a,b){for(var c=Ia(a),d=Ga(arguments,1),e=c,g=0;gparseFloat(a))?String(b):a}(),Za={},z=function(a){var b;if(!(b=Za[a])){b=0;for(var c=oa(String(Ya)).split("."),d=oa(String(a)).split("."),e=Math.max(c.length,d.length),g=0;0==b&&gparseFloat(a))?String(b):a}(),Za={},A=function(a){var b;if(!(b=Za[a])){b=0;for(var c=oa(String(Ya)).split("."),d=oa(String(a)).split("."),e=Math.max(c.length,d.length),g=0;0==b&&g");c=c.join("")}c=a.createElement(c);d&&(m(d)?c.className=d:da(d)?c.className=d.join(" "):jb(c,d));2a},vb=function(a,b,c){if(!(a.nodeName in pb))if(3==a.nodeType)c?b.push(String(a.nodeValue).replace(/(\r\n|\r|\n)/g,"")):b.push(a.nodeValue);else if(a.nodeName in qb)b.push(qb[a.nodeName]);else for(a=a.firstChild;a;)vb(a,b,c),a=a.nextSibling},db= function(a){this.Q=a||l.document||document};f=db.prototype;f.mb=fb;f.a=function(a){return gb(this.Q,a)};f.o=function(a,b,c){return kb(this.Q,arguments)};f.createElement=function(a){return this.Q.createElement(a)};f.createTextNode=function(a){return this.Q.createTextNode(String(a))};f.appendChild=function(a,b){a.appendChild(b)};f.contains=nb; -f.I=function(a){var b;(b="A"==a.tagName||"INPUT"==a.tagName||"TEXTAREA"==a.tagName||"SELECT"==a.tagName||"BUTTON"==a.tagName?!a.disabled&&(!rb(a)||sb(a)):tb(a))&&v?(a=n(a.getBoundingClientRect)?a.getBoundingClientRect():{height:a.offsetHeight,width:a.offsetWidth},a=null!=a&&0=a.keyCode)a.keyCode=-1}catch(b){}};var Db="closure_listenable_"+(1E6*Math.random()|0),Eb=0;var Fb=function(a,b,c,d,e){this.W=a;this.Ea=null;this.src=b;this.type=c;this.Fa=!!d;this.Ha=e;this.key=++Eb;this.ha=this.Ga=!1},Gb=function(a){a.ha=!0;a.W=null;a.Ea=null;a.src=null;a.Ha=null};var D=function(a){this.src=a;this.m={};this.ua=0};D.prototype.add=function(a,b,c,d,e){var g=a.toString();a=this.m[g];a||(a=this.m[g]=[],this.ua++);var h=Hb(a,b,d,e);-1=a||96<=a&&106>=a||65<=a&&90>=a||x&&0==a)return!0;switch(a){case 32:case 63:case 107:case 109:case 110:case 111:case 186:case 59:case 189:case 187:case 61:case 188:case 190:case 191:case 192:case 222:case 219:case 220:case 221:return!0; +c)},oc=function(a){q(a,"ARIA attribute cannot be empty.");q(Na(lc,a),"No such ARIA attribute "+a);return"aria-"+a};var sc=function(a,b,c,d,e){if(!(v||x&&A("525")))return!0;if(y&&e)return qc(a);if(e&&!d)return!1;"number"==typeof b&&(b=rc(b));if(!c&&(17==b||18==b||y&&91==b))return!1;if(x&&d&&c)switch(a){case 220:case 219:case 221:case 192:case 186:case 189:case 187:case 188:case 190:case 191:case 192:case 222:return!1}if(v&&d&&b==a)return!1;switch(a){case 13:return!0;case 27:return!x}return qc(a)},qc=function(a){if(48<=a&&57>=a||96<=a&&106>=a||65<=a&&90>=a||x&&0==a)return!0;switch(a){case 32:case 63:case 107:case 109:case 110:case 111:case 186:case 59:case 189:case 187:case 61:case 188:case 190:case 191:case 192:case 222:case 219:case 220:case 221:return!0; default:return!1}},rc=function(a){if(w)a=tc(a);else if(y&&x)t:switch(a){case 93:a=91;break t}return a},tc=function(a){switch(a){case 61:return 187;case 59:return 186;case 173:return 189;case 224:return 91;case 0:return 224;default:return a}};var O=function(a,b){H.call(this);a&&uc(this,a,b)};p(O,H);f=O.prototype;f.d=null;f.Ia=null;f.Ya=null;f.Ja=null;f.r=-1;f.N=-1;f.lb=!1; -var vc={3:13,12:144,63232:38,63233:40,63234:37,63235:39,63236:112,63237:113,63238:114,63239:115,63240:116,63241:117,63242:118,63243:119,63244:120,63245:121,63246:122,63247:123,63248:44,63272:46,63273:36,63275:35,63276:33,63277:34,63289:144,63302:45},wc={Up:38,Down:40,Left:37,Right:39,Enter:13,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,"U+007F":46,Home:36,End:35,PageUp:33,PageDown:34,Insert:45},xc=v||x&&z("525"),yc=y&&w; +var vc={3:13,12:144,63232:38,63233:40,63234:37,63235:39,63236:112,63237:113,63238:114,63239:115,63240:116,63241:117,63242:118,63243:119,63244:120,63245:121,63246:122,63247:123,63248:44,63272:46,63273:36,63275:35,63276:33,63277:34,63289:144,63302:45},wc={Up:38,Down:40,Left:37,Right:39,Enter:13,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,"U+007F":46,Home:36,End:35,PageUp:33,PageDown:34,Insert:45},xc=v||x&&A("525"),yc=y&&w; O.prototype.Tb=function(a){x&&(17==this.r&&!a.ctrlKey||18==this.r&&!a.altKey||y&&91==this.r&&!a.metaKey)&&(this.N=this.r=-1);-1==this.r&&(a.ctrlKey&&17!=a.keyCode?this.r=17:a.altKey&&18!=a.keyCode?this.r=18:a.metaKey&&91!=a.keyCode&&(this.r=91));xc&&!sc(a.keyCode,this.r,a.shiftKey,a.ctrlKey,a.altKey)?this.handleEvent(a):(this.N=rc(a.keyCode),yc&&(this.lb=a.altKey))};O.prototype.Ub=function(a){this.N=this.r=-1;this.lb=a.altKey}; O.prototype.handleEvent=function(a){var b=a.O,c,d,e=b.altKey;v&&"keypress"==a.type?(c=this.N,d=13!=c&&27!=c?b.keyCode:0):x&&"keypress"==a.type?(c=this.N,d=0<=b.charCode&&63232>b.charCode&&qc(c)?b.charCode:0):Va?(c=this.N,d=qc(c)?b.keyCode:0):(c=b.keyCode||this.N,d=b.charCode||0,yc&&(e=this.lb),y&&63==d&&224==c&&(c=191));var g=c=rc(c),h=b.keyIdentifier;c?63232<=c&&c in vc?g=vc[c]:25==c&&a.shiftKey&&(g=9):h&&h in wc&&(g=wc[h]);a=g==this.r;this.r=g;b=new zc(g,d,a,b);b.altKey=e;this.dispatchEvent(b)}; O.prototype.a=function(){return this.d};var uc=function(a,b,c){a.Ja&&a.detach();a.d=b;a.Ia=E(a.d,"keypress",a,c);a.Ya=E(a.d,"keydown",a.Tb,c,a);a.Ja=E(a.d,"keyup",a.Ub,c,a)};O.prototype.detach=function(){this.Ia&&(F(this.Ia),F(this.Ya),F(this.Ja),this.Ja=this.Ya=this.Ia=null);this.d=null;this.N=this.r=-1};var zc=function(a,b,c,d){C.call(this,d);this.type="key";this.keyCode=a;this.charCode=b;this.repeat=c};p(zc,C);var Q=function(a){if(a.classList)return a.classList;a=a.className;return m(a)&&a.match(/\S+/g)||[]},Ac=function(a,b){return a.classList?a.classList.contains(b):t(Q(a),b)},Bc=function(a,b){a.classList?a.classList.add(b):Ac(a,b)||(a.className+=0");f=f.join("")}f=g.createElement(f);e&&(L(e)?f.className=e:"array"==K(e)?f.className=e.join(" "):Ma(f,e));2=a[v])&&p(a,-1)}catch(b){}};var Ua="closure_listenable_"+(1E6*Math.random()|0),Va=0;var Wa=function(a,b,c,d,f,e){this.c=a;this.g=b;this.src=c;this.type=d;this.k=!!f;this.j=e;this.key=++Va;this.e=this.l=!1};Wa[G].n=function(){this.e=!0;this.j=this.src=this.g=this.c=null};var Xa=function(a){this.src=a;this.a={};this.m=0};Xa[G].add=function(a,b,c,d,f){var e=a[w]();a=this.a[e];a||(a=this.a[e]=[],this.m++);var h;t:{for(h=0;h\n\x11\x46ileDescriptorSet\x12)\n\x04\x66ile\x18\x01 \x03(\x0b\x32\x1b.proto2.FileDescriptorProto\"\xa5\x03\n\x13\x46ileDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07package\x18\x02 \x01(\t\x12\x12\n\ndependency\x18\x03 \x03(\t\x12\x19\n\x11public_dependency\x18\n \x03(\x05\x12\x17\n\x0fweak_dependency\x18\x0b \x03(\x05\x12-\n\x0cmessage_type\x18\x04 \x03(\x0b\x32\x17.proto2.DescriptorProto\x12.\n\tenum_type\x18\x05 \x03(\x0b\x32\x1b.proto2.EnumDescriptorProto\x12/\n\x07service\x18\x06 \x03(\x0b\x32\x1e.proto2.ServiceDescriptorProto\x12/\n\textension\x18\x07 \x03(\x0b\x32\x1c.proto2.FieldDescriptorProto\x12$\n\x07options\x18\x08 \x01(\x0b\x32\x13.proto2.FileOptions\x12\x30\n\x10source_code_info\x18\t \x01(\x0b\x32\x16.proto2.SourceCodeInfo\x12\x0e\n\x06syntax\x18\x0c \x01(\t\"\xa5\x03\n\x0f\x44\x65scriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12+\n\x05\x66ield\x18\x02 \x03(\x0b\x32\x1c.proto2.FieldDescriptorProto\x12/\n\textension\x18\x06 \x03(\x0b\x32\x1c.proto2.FieldDescriptorProto\x12,\n\x0bnested_type\x18\x03 \x03(\x0b\x32\x17.proto2.DescriptorProto\x12.\n\tenum_type\x18\x04 \x03(\x0b\x32\x1b.proto2.EnumDescriptorProto\x12?\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32&.proto2.DescriptorProto.ExtensionRange\x12\x30\n\noneof_decl\x18\x08 \x03(\x0b\x32\x1c.proto2.OneofDescriptorProto\x12\'\n\x07options\x18\x07 \x01(\x0b\x32\x16.proto2.MessageOptions\x1a,\n\x0e\x45xtensionRange\x12\r\n\x05start\x18\x01 \x01(\x05\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x05\"\x8e\x05\n\x14\x46ieldDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x03 \x01(\x05\x12\x31\n\x05label\x18\x04 \x01(\x0e\x32\".proto2.FieldDescriptorProto.Label\x12/\n\x04type\x18\x05 \x01(\x0e\x32!.proto2.FieldDescriptorProto.Type\x12\x11\n\ttype_name\x18\x06 \x01(\t\x12\x10\n\x08\x65xtendee\x18\x02 \x01(\t\x12\x15\n\rdefault_value\x18\x07 \x01(\t\x12\x13\n\x0boneof_index\x18\t \x01(\x05\x12%\n\x07options\x18\x08 \x01(\x0b\x32\x14.proto2.FieldOptions\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\x12\x12\n\x0eLABEL_REPEATED\x10\x03\"$\n\x14OneofDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\"z\n\x13\x45numDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x03(\x0b\x32 .proto2.EnumValueDescriptorProto\x12$\n\x07options\x18\x03 \x01(\x0b\x32\x13.proto2.EnumOptions\"c\n\x18\x45numValueDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x02 \x01(\x05\x12)\n\x07options\x18\x03 \x01(\x0b\x32\x18.proto2.EnumValueOptions\"\xad\x01\n\x16ServiceDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12-\n\x06method\x18\x02 \x03(\x0b\x32\x1d.proto2.MethodDescriptorProto\x12-\n\x06stream\x18\x04 \x03(\x0b\x32\x1d.proto2.StreamDescriptorProto\x12\'\n\x07options\x18\x03 \x01(\x0b\x32\x16.proto2.ServiceOptions\"v\n\x15MethodDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\ninput_type\x18\x02 \x01(\t\x12\x13\n\x0boutput_type\x18\x03 \x01(\t\x12&\n\x07options\x18\x04 \x01(\x0b\x32\x15.proto2.MethodOptions\"\x87\x01\n\x15StreamDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1b\n\x13\x63lient_message_type\x18\x02 \x01(\t\x12\x1b\n\x13server_message_type\x18\x03 \x01(\t\x12&\n\x07options\x18\x04 \x01(\x0b\x32\x15.proto2.StreamOptions\"\xa5\n\n\x0b\x46ileOptions\x12\x19\n\x0e\x63\x63_api_version\x18\x02 \x01(\x05:\x01\x32\x12V\n\x14\x63\x63_api_compatibility\x18\x0f \x01(\x0e\x32&.proto2.FileOptions.CompatibilityLevel:\x10NO_COMPATIBILITY\x12\'\n\x19\x63\x63_proto_array_compatible\x18\x16 \x01(\x08:\x04true\x12\"\n\x14\x63\x63_utf8_verification\x18\x18 \x01(\x08:\x04true\x12$\n\x15\x63\x63_proto1_text_format\x18\x19 \x01(\x08:\x05\x66\x61lse\x12\x14\n\x0cjava_package\x18\x01 \x01(\t\x12\x19\n\x0epy_api_version\x18\x04 \x01(\x05:\x01\x32\x12\x1b\n\x10java_api_version\x18\x05 \x01(\x05:\x01\x32\x12!\n\x13java_use_javaproto2\x18\x06 \x01(\x08:\x04true\x12\x1e\n\x10java_java5_enums\x18\x07 \x01(\x08:\x04true\x12)\n\x1ajava_generate_rpc_baseimpl\x18\r \x01(\x08:\x05\x66\x61lse\x12#\n\x14java_use_javastrings\x18\x15 \x01(\x08:\x05\x66\x61lse\x12\x1c\n\x14java_alt_api_package\x18\x13 \x01(\t\x12\x34\n%java_enable_dual_generate_mutable_api\x18\x1a \x01(\x08:\x05\x66\x61lse\x12\x1c\n\x14java_outer_classname\x18\x08 \x01(\t\x12\"\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lse\x12,\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08:\x05\x66\x61lse\x12%\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lse\x12\x1f\n\x10java_mutable_api\x18\x1c \x01(\x08:\x05\x66\x61lse\x12+\n#java_multiple_files_mutable_package\x18\x1d \x01(\t\x12=\n\x0coptimize_for\x18\t \x01(\x0e\x32 .proto2.FileOptions.OptimizeMode:\x05SPEED\x12\x12\n\ngo_package\x18\x0b \x01(\t\x12\x1a\n\x12javascript_package\x18\x0c \x01(\t\x12\x1a\n\x0fszl_api_version\x18\x0e \x01(\x05:\x01\x31\x12\"\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lse\x12$\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lse\x12\"\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x12\x65xperimental_style\x18\x1e \x01(\t\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption\"c\n\x12\x43ompatibilityLevel\x12\x14\n\x10NO_COMPATIBILITY\x10\x00\x12\x15\n\x11PROTO1_COMPATIBLE\x10\x64\x12 \n\x1c\x44\x45PRECATED_PROTO1_COMPATIBLE\x10\x32\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xe4\x02\n\x0eMessageOptions\x12+\n#experimental_java_message_interface\x18\x04 \x03(\t\x12+\n#experimental_java_builder_interface\x18\x05 \x03(\t\x12+\n#experimental_java_interface_extends\x18\x06 \x03(\t\x12&\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lse\x12.\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12\x11\n\tmap_entry\x18\x07 \x01(\x08\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x82\x05\n\x0c\x46ieldOptions\x12\x31\n\x05\x63type\x18\x01 \x01(\x0e\x32\x1a.proto2.FieldOptions.CType:\x06STRING\x12\x0e\n\x06packed\x18\x02 \x01(\x08\x12\x31\n\x05jtype\x18\x04 \x01(\x0e\x32\x1a.proto2.FieldOptions.JType:\x06NORMAL\x12\x36\n\x06jstype\x18\x06 \x01(\x0e\x32\x1b.proto2.FieldOptions.JSType:\tJS_NORMAL\x12\x13\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12\x13\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lse\x12<\n\x0fupgraded_option\x18\x0b \x03(\x0b\x32#.proto2.FieldOptions.UpgradedOption\x12%\n\x16\x64\x65precated_raw_message\x18\x0c \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption\x1a-\n\x0eUpgradedOption\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"<\n\x05JType\x12\n\n\x06NORMAL\x10\x00\x12\t\n\x05\x42YTES\x10\x01\x12\x1c\n\x18\x45XPERIMENTAL_BYTE_BUFFER\x10\x02\"5\n\x06JSType\x12\r\n\tJS_NORMAL\x10\x00\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x99\x01\n\x0b\x45numOptions\x12\x13\n\x0bproto1_name\x18\x01 \x01(\t\x12\x13\n\x0b\x61llow_alias\x18\x02 \x01(\x08\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"t\n\x10\x45numValueOptions\x12\x19\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xb6\x01\n\x0eServiceOptions\x12\x1d\n\x0emulticast_stub\x18\x14 \x01(\x08:\x05\x66\x61lse\x12#\n\x17\x66\x61ilure_detection_delay\x18\x10 \x01(\x01:\x02-1\x12\x19\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd3\t\n\rMethodOptions\x12\x35\n\x08protocol\x18\x07 \x01(\x0e\x32\x1e.proto2.MethodOptions.Protocol:\x03TCP\x12\x14\n\x08\x64\x65\x61\x64line\x18\x08 \x01(\x01:\x02-1\x12$\n\x15\x64uplicate_suppression\x18\t \x01(\x08:\x05\x66\x61lse\x12\x18\n\tfail_fast\x18\n \x01(\x08:\x05\x66\x61lse\x12\'\n\x18\x65nd_user_creds_requested\x18\x1a \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0e\x63lient_logging\x18\x0b \x01(\x11:\x03\x32\x35\x36\x12\x1b\n\x0eserver_logging\x18\x0c \x01(\x11:\x03\x32\x35\x36\x12\x41\n\x0esecurity_level\x18\r \x01(\x0e\x32#.proto2.MethodOptions.SecurityLevel:\x04NONE\x12\x43\n\x0fresponse_format\x18\x0f \x01(\x0e\x32\x1c.proto2.MethodOptions.Format:\x0cUNCOMPRESSED\x12\x42\n\x0erequest_format\x18\x11 \x01(\x0e\x32\x1c.proto2.MethodOptions.Format:\x0cUNCOMPRESSED\x12\x13\n\x0bstream_type\x18\x12 \x01(\t\x12\x16\n\x0esecurity_label\x18\x13 \x01(\t\x12\x18\n\x10\x63lient_streaming\x18\x14 \x01(\x08\x12\x18\n\x10server_streaming\x18\x15 \x01(\x08\x12\x1a\n\x12legacy_stream_type\x18\x16 \x01(\t\x12\x1a\n\x12legacy_result_type\x18\x17 \x01(\t\x12(\n\x1clegacy_client_initial_tokens\x18\x18 \x01(\x03:\x02-1\x12(\n\x1clegacy_server_initial_tokens\x18\x19 \x01(\x03:\x02-1\x12^\n\tlog_level\x18\x1b \x01(\x0e\x32\x1e.proto2.MethodOptions.LogLevel:+LOG_HEADER_AND_NON_PRIVATE_PAYLOAD_INTERNAL\x12\x19\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption\"\x1c\n\x08Protocol\x12\x07\n\x03TCP\x10\x00\x12\x07\n\x03UDP\x10\x01\"e\n\rSecurityLevel\x12\x08\n\x04NONE\x10\x00\x12\r\n\tINTEGRITY\x10\x01\x12\x19\n\x15PRIVACY_AND_INTEGRITY\x10\x02\x12 \n\x1cSTRONG_PRIVACY_AND_INTEGRITY\x10\x03\"0\n\x06\x46ormat\x12\x10\n\x0cUNCOMPRESSED\x10\x00\x12\x14\n\x10ZIPPY_COMPRESSED\x10\x01\"\x9f\x01\n\x08LogLevel\x12\x0c\n\x08LOG_NONE\x10\x00\x12\x13\n\x0fLOG_HEADER_ONLY\x10\x01\x12/\n+LOG_HEADER_AND_NON_PRIVATE_PAYLOAD_INTERNAL\x10\x02\x12#\n\x1fLOG_HEADER_AND_FILTERED_PAYLOAD\x10\x03\x12\x1a\n\x16LOG_HEADER_AND_PAYLOAD\x10\x04*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xe7\x04\n\rStreamOptions\x12!\n\x15\x63lient_initial_tokens\x18\x01 \x01(\x03:\x02-1\x12!\n\x15server_initial_tokens\x18\x02 \x01(\x03:\x02-1\x12<\n\ntoken_unit\x18\x03 \x01(\x0e\x32\x1f.proto2.StreamOptions.TokenUnit:\x07MESSAGE\x12\x41\n\x0esecurity_level\x18\x04 \x01(\x0e\x32#.proto2.MethodOptions.SecurityLevel:\x04NONE\x12\x16\n\x0esecurity_label\x18\x05 \x01(\t\x12\x1b\n\x0e\x63lient_logging\x18\x06 \x01(\x05:\x03\x32\x35\x36\x12\x1b\n\x0eserver_logging\x18\x07 \x01(\x05:\x03\x32\x35\x36\x12\x14\n\x08\x64\x65\x61\x64line\x18\x08 \x01(\x01:\x02-1\x12\x18\n\tfail_fast\x18\t \x01(\x08:\x05\x66\x61lse\x12\'\n\x18\x65nd_user_creds_requested\x18\n \x01(\x08:\x05\x66\x61lse\x12^\n\tlog_level\x18\x0b \x01(\x0e\x32\x1e.proto2.MethodOptions.LogLevel:+LOG_HEADER_AND_NON_PRIVATE_PAYLOAD_INTERNAL\x12\x19\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption\"\"\n\tTokenUnit\x12\x0b\n\x07MESSAGE\x10\x00\x12\x08\n\x04\x42YTE\x10\x01*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x95\x02\n\x13UninterpretedOption\x12\x32\n\x04name\x18\x02 \x03(\x0b\x32$.proto2.UninterpretedOption.NamePart\x12\x18\n\x10identifier_value\x18\x03 \x01(\t\x12\x1a\n\x12positive_int_value\x18\x04 \x01(\x04\x12\x1a\n\x12negative_int_value\x18\x05 \x01(\x03\x12\x14\n\x0c\x64ouble_value\x18\x06 \x01(\x01\x12\x14\n\x0cstring_value\x18\x07 \x01(\x0c\x12\x17\n\x0f\x61ggregate_value\x18\x08 \x01(\t\x1a\x33\n\x08NamePart\x12\x11\n\tname_part\x18\x01 \x02(\t\x12\x14\n\x0cis_extension\x18\x02 \x02(\x08\"\xa8\x01\n\x0eSourceCodeInfo\x12\x31\n\x08location\x18\x01 \x03(\x0b\x32\x1f.proto2.SourceCodeInfo.Location\x1a\x63\n\x08Location\x12\x10\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01\x12\x10\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01\x12\x18\n\x10leading_comments\x18\x03 \x01(\t\x12\x19\n\x11trailing_comments\x18\x04 \x01(\tB,\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01\xe0\x01\x01') + serialized_pb=_b('\n!net/proto2/proto/descriptor.proto\x12\x06proto2\">\n\x11\x46ileDescriptorSet\x12)\n\x04\x66ile\x18\x01 \x03(\x0b\x32\x1b.proto2.FileDescriptorProto\"\xa5\x03\n\x13\x46ileDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07package\x18\x02 \x01(\t\x12\x12\n\ndependency\x18\x03 \x03(\t\x12\x19\n\x11public_dependency\x18\n \x03(\x05\x12\x17\n\x0fweak_dependency\x18\x0b \x03(\x05\x12-\n\x0cmessage_type\x18\x04 \x03(\x0b\x32\x17.proto2.DescriptorProto\x12.\n\tenum_type\x18\x05 \x03(\x0b\x32\x1b.proto2.EnumDescriptorProto\x12/\n\x07service\x18\x06 \x03(\x0b\x32\x1e.proto2.ServiceDescriptorProto\x12/\n\textension\x18\x07 \x03(\x0b\x32\x1c.proto2.FieldDescriptorProto\x12$\n\x07options\x18\x08 \x01(\x0b\x32\x13.proto2.FileOptions\x12\x30\n\x10source_code_info\x18\t \x01(\x0b\x32\x16.proto2.SourceCodeInfo\x12\x0e\n\x06syntax\x18\x0c \x01(\t\"\xa5\x03\n\x0f\x44\x65scriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12+\n\x05\x66ield\x18\x02 \x03(\x0b\x32\x1c.proto2.FieldDescriptorProto\x12/\n\textension\x18\x06 \x03(\x0b\x32\x1c.proto2.FieldDescriptorProto\x12,\n\x0bnested_type\x18\x03 \x03(\x0b\x32\x17.proto2.DescriptorProto\x12.\n\tenum_type\x18\x04 \x03(\x0b\x32\x1b.proto2.EnumDescriptorProto\x12?\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32&.proto2.DescriptorProto.ExtensionRange\x12\x30\n\noneof_decl\x18\x08 \x03(\x0b\x32\x1c.proto2.OneofDescriptorProto\x12\'\n\x07options\x18\x07 \x01(\x0b\x32\x16.proto2.MessageOptions\x1a,\n\x0e\x45xtensionRange\x12\r\n\x05start\x18\x01 \x01(\x05\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x05\"\x8e\x05\n\x14\x46ieldDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x03 \x01(\x05\x12\x31\n\x05label\x18\x04 \x01(\x0e\x32\".proto2.FieldDescriptorProto.Label\x12/\n\x04type\x18\x05 \x01(\x0e\x32!.proto2.FieldDescriptorProto.Type\x12\x11\n\ttype_name\x18\x06 \x01(\t\x12\x10\n\x08\x65xtendee\x18\x02 \x01(\t\x12\x15\n\rdefault_value\x18\x07 \x01(\t\x12\x13\n\x0boneof_index\x18\t \x01(\x05\x12%\n\x07options\x18\x08 \x01(\x0b\x32\x14.proto2.FieldOptions\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\x12\x12\n\x0eLABEL_REPEATED\x10\x03\"$\n\x14OneofDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\"z\n\x13\x45numDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x03(\x0b\x32 .proto2.EnumValueDescriptorProto\x12$\n\x07options\x18\x03 \x01(\x0b\x32\x13.proto2.EnumOptions\"c\n\x18\x45numValueDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06number\x18\x02 \x01(\x05\x12)\n\x07options\x18\x03 \x01(\x0b\x32\x18.proto2.EnumValueOptions\"\xad\x01\n\x16ServiceDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12-\n\x06method\x18\x02 \x03(\x0b\x32\x1d.proto2.MethodDescriptorProto\x12-\n\x06stream\x18\x04 \x03(\x0b\x32\x1d.proto2.StreamDescriptorProto\x12\'\n\x07options\x18\x03 \x01(\x0b\x32\x16.proto2.ServiceOptions\"v\n\x15MethodDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\ninput_type\x18\x02 \x01(\t\x12\x13\n\x0boutput_type\x18\x03 \x01(\t\x12&\n\x07options\x18\x04 \x01(\x0b\x32\x15.proto2.MethodOptions\"\x87\x01\n\x15StreamDescriptorProto\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1b\n\x13\x63lient_message_type\x18\x02 \x01(\t\x12\x1b\n\x13server_message_type\x18\x03 \x01(\t\x12&\n\x07options\x18\x04 \x01(\x0b\x32\x15.proto2.StreamOptions\"\xc6\n\n\x0b\x46ileOptions\x12\x19\n\x0e\x63\x63_api_version\x18\x02 \x01(\x05:\x01\x32\x12V\n\x14\x63\x63_api_compatibility\x18\x0f \x01(\x0e\x32&.proto2.FileOptions.CompatibilityLevel:\x10NO_COMPATIBILITY\x12\'\n\x19\x63\x63_proto_array_compatible\x18\x16 \x01(\x08:\x04true\x12\"\n\x14\x63\x63_utf8_verification\x18\x18 \x01(\x08:\x04true\x12$\n\x15\x63\x63_proto1_text_format\x18\x19 \x01(\x08:\x05\x66\x61lse\x12\x14\n\x0cjava_package\x18\x01 \x01(\t\x12\x19\n\x0epy_api_version\x18\x04 \x01(\x05:\x01\x32\x12\x1b\n\x10java_api_version\x18\x05 \x01(\x05:\x01\x32\x12!\n\x13java_use_javaproto2\x18\x06 \x01(\x08:\x04true\x12\x1e\n\x10java_java5_enums\x18\x07 \x01(\x08:\x04true\x12)\n\x1ajava_generate_rpc_baseimpl\x18\r \x01(\x08:\x05\x66\x61lse\x12#\n\x14java_use_javastrings\x18\x15 \x01(\x08:\x05\x66\x61lse\x12\x1c\n\x14java_alt_api_package\x18\x13 \x01(\t\x12\x34\n%java_enable_dual_generate_mutable_api\x18\x1a \x01(\x08:\x05\x66\x61lse\x12\x1c\n\x14java_outer_classname\x18\x08 \x01(\t\x12\"\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lse\x12,\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08:\x05\x66\x61lse\x12%\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lse\x12\x1f\n\x10java_mutable_api\x18\x1c \x01(\x08:\x05\x66\x61lse\x12+\n#java_multiple_files_mutable_package\x18\x1d \x01(\t\x12=\n\x0coptimize_for\x18\t \x01(\x0e\x32 .proto2.FileOptions.OptimizeMode:\x05SPEED\x12\x12\n\ngo_package\x18\x0b \x01(\t\x12\x1a\n\x12javascript_package\x18\x0c \x01(\t\x12\x1a\n\x0fszl_api_version\x18\x0e \x01(\x05:\x01\x31\x12\"\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lse\x12$\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lse\x12\"\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x12\x65xperimental_style\x18\x1e \x01(\t\x12\x1f\n\x10\x63\x63_enable_arenas\x18\x1f \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption\"c\n\x12\x43ompatibilityLevel\x12\x14\n\x10NO_COMPATIBILITY\x10\x00\x12\x15\n\x11PROTO1_COMPATIBLE\x10\x64\x12 \n\x1c\x44\x45PRECATED_PROTO1_COMPATIBLE\x10\x32\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xe4\x02\n\x0eMessageOptions\x12+\n#experimental_java_message_interface\x18\x04 \x03(\t\x12+\n#experimental_java_builder_interface\x18\x05 \x03(\t\x12+\n#experimental_java_interface_extends\x18\x06 \x03(\t\x12&\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lse\x12.\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12\x11\n\tmap_entry\x18\x07 \x01(\x08\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x82\x05\n\x0c\x46ieldOptions\x12\x31\n\x05\x63type\x18\x01 \x01(\x0e\x32\x1a.proto2.FieldOptions.CType:\x06STRING\x12\x0e\n\x06packed\x18\x02 \x01(\x08\x12\x31\n\x05jtype\x18\x04 \x01(\x0e\x32\x1a.proto2.FieldOptions.JType:\x06NORMAL\x12\x36\n\x06jstype\x18\x06 \x01(\x0e\x32\x1b.proto2.FieldOptions.JSType:\tJS_NORMAL\x12\x13\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lse\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12\x13\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lse\x12<\n\x0fupgraded_option\x18\x0b \x03(\x0b\x32#.proto2.FieldOptions.UpgradedOption\x12%\n\x16\x64\x65precated_raw_message\x18\x0c \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption\x1a-\n\x0eUpgradedOption\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"<\n\x05JType\x12\n\n\x06NORMAL\x10\x00\x12\t\n\x05\x42YTES\x10\x01\x12\x1c\n\x18\x45XPERIMENTAL_BYTE_BUFFER\x10\x02\"5\n\x06JSType\x12\r\n\tJS_NORMAL\x10\x00\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x99\x01\n\x0b\x45numOptions\x12\x13\n\x0bproto1_name\x18\x01 \x01(\t\x12\x13\n\x0b\x61llow_alias\x18\x02 \x01(\x08\x12\x19\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"t\n\x10\x45numValueOptions\x12\x19\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xb6\x01\n\x0eServiceOptions\x12\x1d\n\x0emulticast_stub\x18\x14 \x01(\x08:\x05\x66\x61lse\x12#\n\x17\x66\x61ilure_detection_delay\x18\x10 \x01(\x01:\x02-1\x12\x19\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd3\t\n\rMethodOptions\x12\x35\n\x08protocol\x18\x07 \x01(\x0e\x32\x1e.proto2.MethodOptions.Protocol:\x03TCP\x12\x14\n\x08\x64\x65\x61\x64line\x18\x08 \x01(\x01:\x02-1\x12$\n\x15\x64uplicate_suppression\x18\t \x01(\x08:\x05\x66\x61lse\x12\x18\n\tfail_fast\x18\n \x01(\x08:\x05\x66\x61lse\x12\'\n\x18\x65nd_user_creds_requested\x18\x1a \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0e\x63lient_logging\x18\x0b \x01(\x11:\x03\x32\x35\x36\x12\x1b\n\x0eserver_logging\x18\x0c \x01(\x11:\x03\x32\x35\x36\x12\x41\n\x0esecurity_level\x18\r \x01(\x0e\x32#.proto2.MethodOptions.SecurityLevel:\x04NONE\x12\x43\n\x0fresponse_format\x18\x0f \x01(\x0e\x32\x1c.proto2.MethodOptions.Format:\x0cUNCOMPRESSED\x12\x42\n\x0erequest_format\x18\x11 \x01(\x0e\x32\x1c.proto2.MethodOptions.Format:\x0cUNCOMPRESSED\x12\x13\n\x0bstream_type\x18\x12 \x01(\t\x12\x16\n\x0esecurity_label\x18\x13 \x01(\t\x12\x18\n\x10\x63lient_streaming\x18\x14 \x01(\x08\x12\x18\n\x10server_streaming\x18\x15 \x01(\x08\x12\x1a\n\x12legacy_stream_type\x18\x16 \x01(\t\x12\x1a\n\x12legacy_result_type\x18\x17 \x01(\t\x12(\n\x1clegacy_client_initial_tokens\x18\x18 \x01(\x03:\x02-1\x12(\n\x1clegacy_server_initial_tokens\x18\x19 \x01(\x03:\x02-1\x12^\n\tlog_level\x18\x1b \x01(\x0e\x32\x1e.proto2.MethodOptions.LogLevel:+LOG_HEADER_AND_NON_PRIVATE_PAYLOAD_INTERNAL\x12\x19\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption\"\x1c\n\x08Protocol\x12\x07\n\x03TCP\x10\x00\x12\x07\n\x03UDP\x10\x01\"e\n\rSecurityLevel\x12\x08\n\x04NONE\x10\x00\x12\r\n\tINTEGRITY\x10\x01\x12\x19\n\x15PRIVACY_AND_INTEGRITY\x10\x02\x12 \n\x1cSTRONG_PRIVACY_AND_INTEGRITY\x10\x03\"0\n\x06\x46ormat\x12\x10\n\x0cUNCOMPRESSED\x10\x00\x12\x14\n\x10ZIPPY_COMPRESSED\x10\x01\"\x9f\x01\n\x08LogLevel\x12\x0c\n\x08LOG_NONE\x10\x00\x12\x13\n\x0fLOG_HEADER_ONLY\x10\x01\x12/\n+LOG_HEADER_AND_NON_PRIVATE_PAYLOAD_INTERNAL\x10\x02\x12#\n\x1fLOG_HEADER_AND_FILTERED_PAYLOAD\x10\x03\x12\x1a\n\x16LOG_HEADER_AND_PAYLOAD\x10\x04*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xe7\x04\n\rStreamOptions\x12!\n\x15\x63lient_initial_tokens\x18\x01 \x01(\x03:\x02-1\x12!\n\x15server_initial_tokens\x18\x02 \x01(\x03:\x02-1\x12<\n\ntoken_unit\x18\x03 \x01(\x0e\x32\x1f.proto2.StreamOptions.TokenUnit:\x07MESSAGE\x12\x41\n\x0esecurity_level\x18\x04 \x01(\x0e\x32#.proto2.MethodOptions.SecurityLevel:\x04NONE\x12\x16\n\x0esecurity_label\x18\x05 \x01(\t\x12\x1b\n\x0e\x63lient_logging\x18\x06 \x01(\x05:\x03\x32\x35\x36\x12\x1b\n\x0eserver_logging\x18\x07 \x01(\x05:\x03\x32\x35\x36\x12\x14\n\x08\x64\x65\x61\x64line\x18\x08 \x01(\x01:\x02-1\x12\x18\n\tfail_fast\x18\t \x01(\x08:\x05\x66\x61lse\x12\'\n\x18\x65nd_user_creds_requested\x18\n \x01(\x08:\x05\x66\x61lse\x12^\n\tlog_level\x18\x0b \x01(\x0e\x32\x1e.proto2.MethodOptions.LogLevel:+LOG_HEADER_AND_NON_PRIVATE_PAYLOAD_INTERNAL\x12\x19\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lse\x12:\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32\x1b.proto2.UninterpretedOption\"\"\n\tTokenUnit\x12\x0b\n\x07MESSAGE\x10\x00\x12\x08\n\x04\x42YTE\x10\x01*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x95\x02\n\x13UninterpretedOption\x12\x32\n\x04name\x18\x02 \x03(\x0b\x32$.proto2.UninterpretedOption.NamePart\x12\x18\n\x10identifier_value\x18\x03 \x01(\t\x12\x1a\n\x12positive_int_value\x18\x04 \x01(\x04\x12\x1a\n\x12negative_int_value\x18\x05 \x01(\x03\x12\x14\n\x0c\x64ouble_value\x18\x06 \x01(\x01\x12\x14\n\x0cstring_value\x18\x07 \x01(\x0c\x12\x17\n\x0f\x61ggregate_value\x18\x08 \x01(\t\x1a\x33\n\x08NamePart\x12\x11\n\tname_part\x18\x01 \x02(\t\x12\x14\n\x0cis_extension\x18\x02 \x02(\x08\"\xa8\x01\n\x0eSourceCodeInfo\x12\x31\n\x08location\x18\x01 \x03(\x0b\x32\x1f.proto2.SourceCodeInfo.Location\x1a\x63\n\x08Location\x12\x10\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01\x12\x10\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01\x12\x18\n\x10leading_comments\x18\x03 \x01(\t\x12\x19\n\x11trailing_comments\x18\x04 \x01(\tB,\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01\xe0\x01\x01') ) _sym_db.RegisterFileDescriptor(DESCRIPTOR) @@ -172,8 +172,8 @@ _FILEOPTIONS_COMPATIBILITYLEVEL = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3459, - serialized_end=3558, + serialized_start=3492, + serialized_end=3591, ) _sym_db.RegisterEnumDescriptor(_FILEOPTIONS_COMPATIBILITYLEVEL) @@ -198,8 +198,8 @@ _FILEOPTIONS_OPTIMIZEMODE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3560, - serialized_end=3618, + serialized_start=3593, + serialized_end=3651, ) _sym_db.RegisterEnumDescriptor(_FILEOPTIONS_OPTIMIZEMODE) @@ -224,8 +224,8 @@ _FIELDOPTIONS_CTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=4458, - serialized_end=4505, + serialized_start=4491, + serialized_end=4538, ) _sym_db.RegisterEnumDescriptor(_FIELDOPTIONS_CTYPE) @@ -250,8 +250,8 @@ _FIELDOPTIONS_JTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=4507, - serialized_end=4567, + serialized_start=4540, + serialized_end=4600, ) _sym_db.RegisterEnumDescriptor(_FIELDOPTIONS_JTYPE) @@ -276,8 +276,8 @@ _FIELDOPTIONS_JSTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=4569, - serialized_end=4622, + serialized_start=4602, + serialized_end=4655, ) _sym_db.RegisterEnumDescriptor(_FIELDOPTIONS_JSTYPE) @@ -298,8 +298,8 @@ _METHODOPTIONS_PROTOCOL = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=5976, - serialized_end=6004, + serialized_start=6009, + serialized_end=6037, ) _sym_db.RegisterEnumDescriptor(_METHODOPTIONS_PROTOCOL) @@ -328,8 +328,8 @@ _METHODOPTIONS_SECURITYLEVEL = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=6006, - serialized_end=6107, + serialized_start=6039, + serialized_end=6140, ) _sym_db.RegisterEnumDescriptor(_METHODOPTIONS_SECURITYLEVEL) @@ -350,8 +350,8 @@ _METHODOPTIONS_FORMAT = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=6109, - serialized_end=6157, + serialized_start=6142, + serialized_end=6190, ) _sym_db.RegisterEnumDescriptor(_METHODOPTIONS_FORMAT) @@ -384,8 +384,8 @@ _METHODOPTIONS_LOGLEVEL = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=6160, - serialized_end=6319, + serialized_start=6193, + serialized_end=6352, ) _sym_db.RegisterEnumDescriptor(_METHODOPTIONS_LOGLEVEL) @@ -406,8 +406,8 @@ _STREAMOPTIONS_TOKENUNIT = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=6903, - serialized_end=6937, + serialized_start=6936, + serialized_end=6970, ) _sym_db.RegisterEnumDescriptor(_STREAMOPTIONS_TOKENUNIT) @@ -1234,7 +1234,14 @@ _FILEOPTIONS = _descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='uninterpreted_option', full_name='proto2.FileOptions.uninterpreted_option', index=29, + name='cc_enable_arenas', full_name='proto2.FileOptions.cc_enable_arenas', index=29, + number=31, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uninterpreted_option', full_name='proto2.FileOptions.uninterpreted_option', index=30, number=999, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, @@ -1254,7 +1261,7 @@ _FILEOPTIONS = _descriptor.Descriptor( oneofs=[ ], serialized_start=2312, - serialized_end=3629, + serialized_end=3662, ) @@ -1332,8 +1339,8 @@ _MESSAGEOPTIONS = _descriptor.Descriptor( extension_ranges=[(1000, 536870912), ], oneofs=[ ], - serialized_start=3632, - serialized_end=3988, + serialized_start=3665, + serialized_end=4021, ) @@ -1369,8 +1376,8 @@ _FIELDOPTIONS_UPGRADEDOPTION = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=4411, - serialized_end=4456, + serialized_start=4444, + serialized_end=4489, ) _FIELDOPTIONS = _descriptor.Descriptor( @@ -1464,8 +1471,8 @@ _FIELDOPTIONS = _descriptor.Descriptor( extension_ranges=[(1000, 536870912), ], oneofs=[ ], - serialized_start=3991, - serialized_end=4633, + serialized_start=4024, + serialized_end=4666, ) @@ -1515,8 +1522,8 @@ _ENUMOPTIONS = _descriptor.Descriptor( extension_ranges=[(1000, 536870912), ], oneofs=[ ], - serialized_start=4636, - serialized_end=4789, + serialized_start=4669, + serialized_end=4822, ) @@ -1552,8 +1559,8 @@ _ENUMVALUEOPTIONS = _descriptor.Descriptor( extension_ranges=[(1000, 536870912), ], oneofs=[ ], - serialized_start=4791, - serialized_end=4907, + serialized_start=4824, + serialized_end=4940, ) @@ -1603,8 +1610,8 @@ _SERVICEOPTIONS = _descriptor.Descriptor( extension_ranges=[(1000, 536870912), ], oneofs=[ ], - serialized_start=4910, - serialized_end=5092, + serialized_start=4943, + serialized_end=5125, ) @@ -1777,8 +1784,8 @@ _METHODOPTIONS = _descriptor.Descriptor( extension_ranges=[(1000, 536870912), ], oneofs=[ ], - serialized_start=5095, - serialized_end=6330, + serialized_start=5128, + serialized_end=6363, ) @@ -1892,8 +1899,8 @@ _STREAMOPTIONS = _descriptor.Descriptor( extension_ranges=[(1000, 536870912), ], oneofs=[ ], - serialized_start=6333, - serialized_end=6948, + serialized_start=6366, + serialized_end=6981, ) @@ -1929,8 +1936,8 @@ _UNINTERPRETEDOPTION_NAMEPART = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=7177, - serialized_end=7228, + serialized_start=7210, + serialized_end=7261, ) _UNINTERPRETEDOPTION = _descriptor.Descriptor( @@ -2000,8 +2007,8 @@ _UNINTERPRETEDOPTION = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=6951, - serialized_end=7228, + serialized_start=6984, + serialized_end=7261, ) @@ -2051,8 +2058,8 @@ _SOURCECODEINFO_LOCATION = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=7300, - serialized_end=7399, + serialized_start=7333, + serialized_end=7432, ) _SOURCECODEINFO = _descriptor.Descriptor( @@ -2080,8 +2087,8 @@ _SOURCECODEINFO = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=7231, - serialized_end=7399, + serialized_start=7264, + serialized_end=7432, ) _FILEDESCRIPTORSET.fields_by_name['file'].message_type = _FILEDESCRIPTORPROTO diff --git a/python/php/sdk/google/appengine/datastore/entity_pb.php b/python/php/sdk/google/appengine/datastore/entity_pb.php index 2d166453..52d1c182 100644 --- a/python/php/sdk/google/appengine/datastore/entity_pb.php +++ b/python/php/sdk/google/appengine/datastore/entity_pb.php @@ -2669,6 +2669,7 @@ namespace storage_onestore_v3\Index\Property { namespace storage_onestore_v3\Index\Property { class Mode { const MODE_UNSPECIFIED = 0; + const SEGMENT = 2; const GEOSPATIAL = 3; } } -- 2.11.4.GIT