class_docstr: Geocoder using the Google Maps v3 API.
  
  Documentation at:
      https://developers.google.com/maps/documentation/geocoding/
  
  Pricing details:
      https://developers.google.com/maps/documentation/geocoding/usage-and-billing
docstr: :param str api_key: The API key required by Google to perform
      geocoding requests, mandatory (unless premier is used,
      then both ``client_id`` and ``secret_key`` must be specified
      instead).
      API keys are managed through
      the Google APIs console (https://code.google.com/apis/console).
      Make sure to have both ``Geocoding API`` and ``Time Zone API``
      services enabled for this API key.
  
      .. versionchanged:: 2.1
         Previously a warning has been emitted when neither ``api_key``
         nor premier were specified. Now a :class:`geopy.exc.ConfigurationError`
         is raised.
  
  :param str domain: Should be the localized Google Maps domain to
      connect to. The default is 'maps.googleapis.com', but if you're
      geocoding address in the UK (for example), you may want to set it
      to 'maps.google.co.uk' to properly bias results.
  
  :param str scheme:
      See :attr:`geopy.geocoders.options.default_scheme`.
  
  :param str client_id: If using premier, the account client id.
  
  :param str secret_key: If using premier, the account secret key.
  
  :param int timeout:
      See :attr:`geopy.geocoders.options.default_timeout`.
  
  :param dict proxies:
      See :attr:`geopy.geocoders.options.default_proxies`.
  
  :param str user_agent:
      See :attr:`geopy.geocoders.options.default_user_agent`.
  
  :type ssl_context: :class:`ssl.SSLContext`
  :param ssl_context:
      See :attr:`geopy.geocoders.options.default_ssl_context`.
  
  :param callable adapter_factory:
      See :attr:`geopy.geocoders.options.default_adapter_factory`.
  
      .. versionadded:: 2.0
  
  :param str channel: If using premier, the channel identifier.
docstr_tok: [":","param","str","api_key",":","The","API","key","required","by","Google","to","perform","geocoding","requests",",","mandatory","(","unless","premier","is","used",",","then","both","``","client_id","``","and","``","secret_key","``","must","be","specified","instead",")",".","API","keys","are","managed","through","the","Google","APIs","console","(","https",":","\/\/code.google.com\/apis\/console",")",".","Make","sure","to","have","both","``","Geocoding","API","``","and","``","Time","Zone","API","``","services","enabled","for","this","API","key",".","..","versionchanged",":",":","2.1","Previously","a","warning","has","been","emitted","when","neither","``","api_key","``","nor","premier","were","specified",".","Now","a",":","class",":","`","geopy.exc.ConfigurationError","`","is","raised",".",":","param","str","domain",":","Should","be","the","localized","Google","Maps","domain","to","connect","to",".","The","default","is","'maps.googleapis.com","'",",","but","if","you're","geocoding","address","in","the","UK","(","for","example",")",",","you","may","want","to","set","it","to","'maps.google.co.uk","'","to","properly","bias","results",".",":","param","str","scheme",":","See",":","attr",":","`","geopy.geocoders.options.default_scheme","`",".",":","param","str","client_id",":","If","using","premier",",","the","account","client","id",".",":","param","str","secret_key",":","If","using","premier",",","the","account","secret","key",".",":","param","int","timeout",":","See",":","attr",":","`","geopy.geocoders.options.default_timeout","`",".",":","param","dict","proxies",":","See",":","attr",":","`","geopy.geocoders.options.default_proxies","`",".",":","param","str","user_agent",":","See",":","attr",":","`","geopy.geocoders.options.default_user_agent","`",".",":","type","ssl_context",":",":","class",":","`","ssl.SSLContext","`",":","param","ssl_context",":","See",":","attr",":","`","geopy.geocoders.options.default_ssl_context","`",".",":","param","callable","adapter_factory",":","See",":","attr",":","`","geopy.geocoders.options.default_adapter_factory","`",".","..","versionadded",":",":","2.0",":","param","str","channel",":","If","using","premier",",","the","channel","identifier","."]
code: def __init__(
      self,
      api_key=None,
      *,
      domain="maps.googleapis.com",
      scheme=None,
      client_id=None,
      secret_key=None,
      timeout=DEFAULT_SENTINEL,
      proxies=DEFAULT_SENTINEL,
      user_agent=None,
      ssl_context=DEFAULT_SENTINEL,
      adapter_factory=None,
      channel="",
  ):
      """
  
      :param str api_key: The API key required by Google to perform
          geocoding requests, mandatory (unless premier is used,
          then both ``client_id`` and ``secret_key`` must be specified
          instead).
          API keys are managed through
          the Google APIs console (https://code.google.com/apis/console).
          Make sure to have both ``Geocoding API`` and ``Time Zone API``
          services enabled for this API key.
  
          .. versionchanged:: 2.1
             Previously a warning has been emitted when neither ``api_key``
             nor premier were specified. Now a :class:`geopy.exc.ConfigurationError`
             is raised.
  
      :param str domain: Should be the localized Google Maps domain to
          connect to. The default is 'maps.googleapis.com', but if you're
          geocoding address in the UK (for example), you may want to set it
          to 'maps.google.co.uk' to properly bias results.
  
      :param str scheme:
          See :attr:`geopy.geocoders.options.default_scheme`.
  
      :param str client_id: If using premier, the account client id.
  
      :param str secret_key: If using premier, the account secret key.
  
      :param int timeout:
          See :attr:`geopy.geocoders.options.default_timeout`.
  
      :param dict proxies:
          See :attr:`geopy.geocoders.options.default_proxies`.
  
      :param str user_agent:
          See :attr:`geopy.geocoders.options.default_user_agent`.
  
      :type ssl_context: :class:`ssl.SSLContext`
      :param ssl_context:
          See :attr:`geopy.geocoders.options.default_ssl_context`.
  
      :param callable adapter_factory:
          See :attr:`geopy.geocoders.options.default_adapter_factory`.
  
          .. versionadded:: 2.0
  
      :param str channel: If using premier, the channel identifier.
      """
      super().__init__(
          scheme=scheme,
          timeout=timeout,
          proxies=proxies,
          user_agent=user_agent,
          ssl_context=ssl_context,
          adapter_factory=adapter_factory,
      )
      if client_id and not secret_key:
          raise ConfigurationError(
              "Must provide secret_key with client_id."
          )
      if secret_key and not client_id:
          raise ConfigurationError(
              "Must provide client_id with secret_key."
          )
  
      self.premier = bool(client_id and secret_key)
      self.client_id = client_id
      self.secret_key = secret_key
  
      if not self.premier and not api_key:
          raise ConfigurationError(
              "Since July 2018 Google requires each request to have an API key. "
              "Pass a valid `api_key` to GoogleV3 geocoder to fix this error. "
              "See https://developers.google.com/maps/documentation/geocoding/usage-and-billing"  # noqa
          )
  
      self.api_key = api_key
      self.domain = domain.strip("/")
  
      self.channel = channel
  
      self.api = "%s://%s%s" % (self.scheme, self.domain, self.api_path)
      self.tz_api = "%s://%s%s" % (
          self.scheme,
          self.domain,
          self.timezone_path,
      )
  
imports: import base64
  import collections.abc
  import hashlib
  import hmac
  from calendar import timegm
  from datetime import datetime
  from functools import partial
  from urllib.parse import urlencode
  from geopy.exc import ConfigurationError, GeocoderQueryError, GeocoderQuotaExceeded, GeocoderServiceError, GeocoderUnavailable
  from geopy.geocoders.base import DEFAULT_SENTINEL, Geocoder
  from geopy.location import Location
  from geopy.timezone import ensure_pytz_is_installed, from_timezone_name
  from geopy.util import logger
label_desc: Use image node_id 1 to create a new GoogleV3 object from inherited base classes: Geocoder with example: obj = GoogleV3(api_key)