# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

require 'date'
require 'google/apis/core/base_service'
require 'google/apis/core/json_representation'
require 'google/apis/core/hashable'
require 'google/apis/errors'

module Google
  module Apis
    module GmailV1
      
      # Auto-forwarding settings for an account.
      class AutoForwarding
        include Google::Apis::Core::Hashable
      
        # The state that a message should be left in after it has been forwarded.
        # Corresponds to the JSON property `disposition`
        # @return [String]
        attr_accessor :disposition
      
        # Email address to which all incoming messages are forwarded. This email address
        # must be a verified member of the forwarding addresses.
        # Corresponds to the JSON property `emailAddress`
        # @return [String]
        attr_accessor :email_address
      
        # Whether all incoming mail is automatically forwarded to another address.
        # Corresponds to the JSON property `enabled`
        # @return [Boolean]
        attr_accessor :enabled
        alias_method :enabled?, :enabled
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @disposition = args[:disposition] if args.key?(:disposition)
          @email_address = args[:email_address] if args.key?(:email_address)
          @enabled = args[:enabled] if args.key?(:enabled)
        end
      end
      
      # 
      class BatchDeleteMessagesRequest
        include Google::Apis::Core::Hashable
      
        # The IDs of the messages to delete.
        # Corresponds to the JSON property `ids`
        # @return [Array<String>]
        attr_accessor :ids
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @ids = args[:ids] if args.key?(:ids)
        end
      end
      
      # 
      class BatchModifyMessagesRequest
        include Google::Apis::Core::Hashable
      
        # A list of label IDs to add to messages.
        # Corresponds to the JSON property `addLabelIds`
        # @return [Array<String>]
        attr_accessor :add_label_ids
      
        # The IDs of the messages to modify. There is a limit of 1000 ids per request.
        # Corresponds to the JSON property `ids`
        # @return [Array<String>]
        attr_accessor :ids
      
        # A list of label IDs to remove from messages.
        # Corresponds to the JSON property `removeLabelIds`
        # @return [Array<String>]
        attr_accessor :remove_label_ids
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @add_label_ids = args[:add_label_ids] if args.key?(:add_label_ids)
          @ids = args[:ids] if args.key?(:ids)
          @remove_label_ids = args[:remove_label_ids] if args.key?(:remove_label_ids)
        end
      end
      
      # The client-side encryption (CSE) configuration for the email address of an
      # authenticated user. Gmail uses CSE configurations to save drafts of client-
      # side encrypted email messages, and to sign and send encrypted email messages.
      # For administrators managing identities and keypairs for users in their
      # organization, requests require authorization with a [service account](https://
      # developers.google.com/identity/protocols/OAuth2ServiceAccount) that has [
      # domain-wide delegation authority](https://developers.google.com/identity/
      # protocols/OAuth2ServiceAccount#delegatingauthority) to impersonate users with
      # the `https://www.googleapis.com/auth/gmail.settings.basic` scope. For users
      # managing their own identities and keypairs, requests require [hardware key
      # encryption](https://support.google.com/a/answer/14153163) turned on and
      # configured.
      class CseIdentity
        include Google::Apis::Core::Hashable
      
        # The email address for the sending identity. The email address must be the
        # primary email address of the authenticated user.
        # Corresponds to the JSON property `emailAddress`
        # @return [String]
        attr_accessor :email_address
      
        # If a key pair is associated, the ID of the key pair, CseKeyPair.
        # Corresponds to the JSON property `primaryKeyPairId`
        # @return [String]
        attr_accessor :primary_key_pair_id
      
        # The configuration of a CSE identity that uses different key pairs for signing
        # and encryption.
        # Corresponds to the JSON property `signAndEncryptKeyPairs`
        # @return [Google::Apis::GmailV1::SignAndEncryptKeyPairs]
        attr_accessor :sign_and_encrypt_key_pairs
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @email_address = args[:email_address] if args.key?(:email_address)
          @primary_key_pair_id = args[:primary_key_pair_id] if args.key?(:primary_key_pair_id)
          @sign_and_encrypt_key_pairs = args[:sign_and_encrypt_key_pairs] if args.key?(:sign_and_encrypt_key_pairs)
        end
      end
      
      # A client-side encryption S/MIME key pair, which is comprised of a public key,
      # its certificate chain, and metadata for its paired private key. Gmail uses the
      # key pair to complete the following tasks: - Sign outgoing client-side
      # encrypted messages. - Save and reopen drafts of client-side encrypted messages.
      # - Save and reopen sent messages. - Decrypt incoming or archived S/MIME
      # messages. For administrators managing identities and keypairs for users in
      # their organization, requests require authorization with a [service account](
      # https://developers.google.com/identity/protocols/OAuth2ServiceAccount) that
      # has [domain-wide delegation authority](https://developers.google.com/identity/
      # protocols/OAuth2ServiceAccount#delegatingauthority) to impersonate users with
      # the `https://www.googleapis.com/auth/gmail.settings.basic` scope. For users
      # managing their own identities and keypairs, requests require [hardware key
      # encryption](https://support.google.com/a/answer/14153163) turned on and
      # configured.
      class CseKeyPair
        include Google::Apis::Core::Hashable
      
        # Output only. If a key pair is set to `DISABLED`, the time that the key pair's
        # state changed from `ENABLED` to `DISABLED`. This field is present only when
        # the key pair is in state `DISABLED`.
        # Corresponds to the JSON property `disableTime`
        # @return [String]
        attr_accessor :disable_time
      
        # Output only. The current state of the key pair.
        # Corresponds to the JSON property `enablementState`
        # @return [String]
        attr_accessor :enablement_state
      
        # Output only. The immutable ID for the client-side encryption S/MIME key pair.
        # Corresponds to the JSON property `keyPairId`
        # @return [String]
        attr_accessor :key_pair_id
      
        # Output only. The public key and its certificate chain, in [PEM](https://en.
        # wikipedia.org/wiki/Privacy-Enhanced_Mail) format.
        # Corresponds to the JSON property `pem`
        # @return [String]
        attr_accessor :pem
      
        # Input only. The public key and its certificate chain. The chain must be in [
        # PKCS#7](https://en.wikipedia.org/wiki/PKCS_7) format and use PEM encoding and
        # ASCII armor.
        # Corresponds to the JSON property `pkcs7`
        # @return [String]
        attr_accessor :pkcs7
      
        # Metadata for instances of this key pair's private key.
        # Corresponds to the JSON property `privateKeyMetadata`
        # @return [Array<Google::Apis::GmailV1::CsePrivateKeyMetadata>]
        attr_accessor :private_key_metadata
      
        # Output only. The email address identities that are specified on the leaf
        # certificate.
        # Corresponds to the JSON property `subjectEmailAddresses`
        # @return [Array<String>]
        attr_accessor :subject_email_addresses
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @disable_time = args[:disable_time] if args.key?(:disable_time)
          @enablement_state = args[:enablement_state] if args.key?(:enablement_state)
          @key_pair_id = args[:key_pair_id] if args.key?(:key_pair_id)
          @pem = args[:pem] if args.key?(:pem)
          @pkcs7 = args[:pkcs7] if args.key?(:pkcs7)
          @private_key_metadata = args[:private_key_metadata] if args.key?(:private_key_metadata)
          @subject_email_addresses = args[:subject_email_addresses] if args.key?(:subject_email_addresses)
        end
      end
      
      # Metadata for a private key instance.
      class CsePrivateKeyMetadata
        include Google::Apis::Core::Hashable
      
        # Metadata for hardware keys. If [hardware key encryption](https://support.
        # google.com/a/answer/14153163) is set up for the Google Workspace organization,
        # users can optionally store their private key on their smart card and use it to
        # sign and decrypt email messages in Gmail by inserting their smart card into a
        # reader attached to their Windows device.
        # Corresponds to the JSON property `hardwareKeyMetadata`
        # @return [Google::Apis::GmailV1::HardwareKeyMetadata]
        attr_accessor :hardware_key_metadata
      
        # Metadata for private keys managed by an external key access control list
        # service. For details about managing key access, see [Google Workspace CSE API
        # Reference](https://developers.google.com/workspace/cse/reference).
        # Corresponds to the JSON property `kaclsKeyMetadata`
        # @return [Google::Apis::GmailV1::KaclsKeyMetadata]
        attr_accessor :kacls_key_metadata
      
        # Output only. The immutable ID for the private key metadata instance.
        # Corresponds to the JSON property `privateKeyMetadataId`
        # @return [String]
        attr_accessor :private_key_metadata_id
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @hardware_key_metadata = args[:hardware_key_metadata] if args.key?(:hardware_key_metadata)
          @kacls_key_metadata = args[:kacls_key_metadata] if args.key?(:kacls_key_metadata)
          @private_key_metadata_id = args[:private_key_metadata_id] if args.key?(:private_key_metadata_id)
        end
      end
      
      # Settings for a delegate. Delegates can read, send, and delete messages, as
      # well as view and add contacts, for the delegator's account. See "Set up mail
      # delegation" for more information about delegates.
      class Delegate
        include Google::Apis::Core::Hashable
      
        # The email address of the delegate.
        # Corresponds to the JSON property `delegateEmail`
        # @return [String]
        attr_accessor :delegate_email
      
        # Indicates whether this address has been verified and can act as a delegate for
        # the account. Read-only.
        # Corresponds to the JSON property `verificationStatus`
        # @return [String]
        attr_accessor :verification_status
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @delegate_email = args[:delegate_email] if args.key?(:delegate_email)
          @verification_status = args[:verification_status] if args.key?(:verification_status)
        end
      end
      
      # Requests to turn off a client-side encryption key pair.
      class DisableCseKeyPairRequest
        include Google::Apis::Core::Hashable
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
        end
      end
      
      # A draft email in the user's mailbox.
      class Draft
        include Google::Apis::Core::Hashable
      
        # The immutable ID of the draft.
        # Corresponds to the JSON property `id`
        # @return [String]
        attr_accessor :id
      
        # An email message.
        # Corresponds to the JSON property `message`
        # @return [Google::Apis::GmailV1::Message]
        attr_accessor :message
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @id = args[:id] if args.key?(:id)
          @message = args[:message] if args.key?(:message)
        end
      end
      
      # Requests to turn on a client-side encryption key pair.
      class EnableCseKeyPairRequest
        include Google::Apis::Core::Hashable
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
        end
      end
      
      # Resource definition for Gmail filters. Filters apply to specific messages
      # instead of an entire email thread.
      class Filter
        include Google::Apis::Core::Hashable
      
        # A set of actions to perform on a message.
        # Corresponds to the JSON property `action`
        # @return [Google::Apis::GmailV1::FilterAction]
        attr_accessor :action
      
        # Message matching criteria.
        # Corresponds to the JSON property `criteria`
        # @return [Google::Apis::GmailV1::FilterCriteria]
        attr_accessor :criteria
      
        # The server assigned ID of the filter.
        # Corresponds to the JSON property `id`
        # @return [String]
        attr_accessor :id
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @action = args[:action] if args.key?(:action)
          @criteria = args[:criteria] if args.key?(:criteria)
          @id = args[:id] if args.key?(:id)
        end
      end
      
      # A set of actions to perform on a message.
      class FilterAction
        include Google::Apis::Core::Hashable
      
        # List of labels to add to the message.
        # Corresponds to the JSON property `addLabelIds`
        # @return [Array<String>]
        attr_accessor :add_label_ids
      
        # Email address that the message should be forwarded to.
        # Corresponds to the JSON property `forward`
        # @return [String]
        attr_accessor :forward
      
        # List of labels to remove from the message.
        # Corresponds to the JSON property `removeLabelIds`
        # @return [Array<String>]
        attr_accessor :remove_label_ids
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @add_label_ids = args[:add_label_ids] if args.key?(:add_label_ids)
          @forward = args[:forward] if args.key?(:forward)
          @remove_label_ids = args[:remove_label_ids] if args.key?(:remove_label_ids)
        end
      end
      
      # Message matching criteria.
      class FilterCriteria
        include Google::Apis::Core::Hashable
      
        # Whether the response should exclude chats.
        # Corresponds to the JSON property `excludeChats`
        # @return [Boolean]
        attr_accessor :exclude_chats
        alias_method :exclude_chats?, :exclude_chats
      
        # The sender's display name or email address.
        # Corresponds to the JSON property `from`
        # @return [String]
        attr_accessor :from
      
        # Whether the message has any attachment.
        # Corresponds to the JSON property `hasAttachment`
        # @return [Boolean]
        attr_accessor :has_attachment
        alias_method :has_attachment?, :has_attachment
      
        # Only return messages not matching the specified query. Supports the same query
        # format as the Gmail search box. For example, `"from:someuser@example.com
        # rfc822msgid: is:unread"`.
        # Corresponds to the JSON property `negatedQuery`
        # @return [String]
        attr_accessor :negated_query
      
        # Only return messages matching the specified query. Supports the same query
        # format as the Gmail search box. For example, `"from:someuser@example.com
        # rfc822msgid: is:unread"`.
        # Corresponds to the JSON property `query`
        # @return [String]
        attr_accessor :query
      
        # The size of the entire RFC822 message in bytes, including all headers and
        # attachments.
        # Corresponds to the JSON property `size`
        # @return [Fixnum]
        attr_accessor :size
      
        # How the message size in bytes should be in relation to the size field.
        # Corresponds to the JSON property `sizeComparison`
        # @return [String]
        attr_accessor :size_comparison
      
        # Case-insensitive phrase found in the message's subject. Trailing and leading
        # whitespace are be trimmed and adjacent spaces are collapsed.
        # Corresponds to the JSON property `subject`
        # @return [String]
        attr_accessor :subject
      
        # The recipient's display name or email address. Includes recipients in the "to",
        # "cc", and "bcc" header fields. You can use simply the local part of the email
        # address. For example, "example" and "example@" both match "example@gmail.com".
        # This field is case-insensitive.
        # Corresponds to the JSON property `to`
        # @return [String]
        attr_accessor :to
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @exclude_chats = args[:exclude_chats] if args.key?(:exclude_chats)
          @from = args[:from] if args.key?(:from)
          @has_attachment = args[:has_attachment] if args.key?(:has_attachment)
          @negated_query = args[:negated_query] if args.key?(:negated_query)
          @query = args[:query] if args.key?(:query)
          @size = args[:size] if args.key?(:size)
          @size_comparison = args[:size_comparison] if args.key?(:size_comparison)
          @subject = args[:subject] if args.key?(:subject)
          @to = args[:to] if args.key?(:to)
        end
      end
      
      # Settings for a forwarding address.
      class ForwardingAddress
        include Google::Apis::Core::Hashable
      
        # An email address to which messages can be forwarded.
        # Corresponds to the JSON property `forwardingEmail`
        # @return [String]
        attr_accessor :forwarding_email
      
        # Indicates whether this address has been verified and is usable for forwarding.
        # Read-only.
        # Corresponds to the JSON property `verificationStatus`
        # @return [String]
        attr_accessor :verification_status
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @forwarding_email = args[:forwarding_email] if args.key?(:forwarding_email)
          @verification_status = args[:verification_status] if args.key?(:verification_status)
        end
      end
      
      # Metadata for hardware keys. If [hardware key encryption](https://support.
      # google.com/a/answer/14153163) is set up for the Google Workspace organization,
      # users can optionally store their private key on their smart card and use it to
      # sign and decrypt email messages in Gmail by inserting their smart card into a
      # reader attached to their Windows device.
      class HardwareKeyMetadata
        include Google::Apis::Core::Hashable
      
        # Description about the hardware key.
        # Corresponds to the JSON property `description`
        # @return [String]
        attr_accessor :description
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @description = args[:description] if args.key?(:description)
        end
      end
      
      # A record of a change to the user's mailbox. Each history change may affect
      # multiple messages in multiple ways.
      class History
        include Google::Apis::Core::Hashable
      
        # The mailbox sequence ID.
        # Corresponds to the JSON property `id`
        # @return [Fixnum]
        attr_accessor :id
      
        # Labels added to messages in this history record.
        # Corresponds to the JSON property `labelsAdded`
        # @return [Array<Google::Apis::GmailV1::HistoryLabelAdded>]
        attr_accessor :labels_added
      
        # Labels removed from messages in this history record.
        # Corresponds to the JSON property `labelsRemoved`
        # @return [Array<Google::Apis::GmailV1::HistoryLabelRemoved>]
        attr_accessor :labels_removed
      
        # List of messages changed in this history record. The fields for specific
        # change types, such as `messagesAdded` may duplicate messages in this field. We
        # recommend using the specific change-type fields instead of this.
        # Corresponds to the JSON property `messages`
        # @return [Array<Google::Apis::GmailV1::Message>]
        attr_accessor :messages
      
        # Messages added to the mailbox in this history record.
        # Corresponds to the JSON property `messagesAdded`
        # @return [Array<Google::Apis::GmailV1::HistoryMessageAdded>]
        attr_accessor :messages_added
      
        # Messages deleted (not Trashed) from the mailbox in this history record.
        # Corresponds to the JSON property `messagesDeleted`
        # @return [Array<Google::Apis::GmailV1::HistoryMessageDeleted>]
        attr_accessor :messages_deleted
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @id = args[:id] if args.key?(:id)
          @labels_added = args[:labels_added] if args.key?(:labels_added)
          @labels_removed = args[:labels_removed] if args.key?(:labels_removed)
          @messages = args[:messages] if args.key?(:messages)
          @messages_added = args[:messages_added] if args.key?(:messages_added)
          @messages_deleted = args[:messages_deleted] if args.key?(:messages_deleted)
        end
      end
      
      # 
      class HistoryLabelAdded
        include Google::Apis::Core::Hashable
      
        # Label IDs added to the message.
        # Corresponds to the JSON property `labelIds`
        # @return [Array<String>]
        attr_accessor :label_ids
      
        # An email message.
        # Corresponds to the JSON property `message`
        # @return [Google::Apis::GmailV1::Message]
        attr_accessor :message
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @label_ids = args[:label_ids] if args.key?(:label_ids)
          @message = args[:message] if args.key?(:message)
        end
      end
      
      # 
      class HistoryLabelRemoved
        include Google::Apis::Core::Hashable
      
        # Label IDs removed from the message.
        # Corresponds to the JSON property `labelIds`
        # @return [Array<String>]
        attr_accessor :label_ids
      
        # An email message.
        # Corresponds to the JSON property `message`
        # @return [Google::Apis::GmailV1::Message]
        attr_accessor :message
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @label_ids = args[:label_ids] if args.key?(:label_ids)
          @message = args[:message] if args.key?(:message)
        end
      end
      
      # 
      class HistoryMessageAdded
        include Google::Apis::Core::Hashable
      
        # An email message.
        # Corresponds to the JSON property `message`
        # @return [Google::Apis::GmailV1::Message]
        attr_accessor :message
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @message = args[:message] if args.key?(:message)
        end
      end
      
      # 
      class HistoryMessageDeleted
        include Google::Apis::Core::Hashable
      
        # An email message.
        # Corresponds to the JSON property `message`
        # @return [Google::Apis::GmailV1::Message]
        attr_accessor :message
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @message = args[:message] if args.key?(:message)
        end
      end
      
      # IMAP settings for an account.
      class ImapSettings
        include Google::Apis::Core::Hashable
      
        # If this value is true, Gmail will immediately expunge a message when it is
        # marked as deleted in IMAP. Otherwise, Gmail will wait for an update from the
        # client before expunging messages marked as deleted.
        # Corresponds to the JSON property `autoExpunge`
        # @return [Boolean]
        attr_accessor :auto_expunge
        alias_method :auto_expunge?, :auto_expunge
      
        # Whether IMAP is enabled for the account.
        # Corresponds to the JSON property `enabled`
        # @return [Boolean]
        attr_accessor :enabled
        alias_method :enabled?, :enabled
      
        # The action that will be executed on a message when it is marked as deleted and
        # expunged from the last visible IMAP folder.
        # Corresponds to the JSON property `expungeBehavior`
        # @return [String]
        attr_accessor :expunge_behavior
      
        # An optional limit on the number of messages that an IMAP folder may contain.
        # Legal values are 0, 1000, 2000, 5000 or 10000. A value of zero is interpreted
        # to mean that there is no limit.
        # Corresponds to the JSON property `maxFolderSize`
        # @return [Fixnum]
        attr_accessor :max_folder_size
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @auto_expunge = args[:auto_expunge] if args.key?(:auto_expunge)
          @enabled = args[:enabled] if args.key?(:enabled)
          @expunge_behavior = args[:expunge_behavior] if args.key?(:expunge_behavior)
          @max_folder_size = args[:max_folder_size] if args.key?(:max_folder_size)
        end
      end
      
      # Metadata for private keys managed by an external key access control list
      # service. For details about managing key access, see [Google Workspace CSE API
      # Reference](https://developers.google.com/workspace/cse/reference).
      class KaclsKeyMetadata
        include Google::Apis::Core::Hashable
      
        # Opaque data generated and used by the key access control list service. Maximum
        # size: 8 KiB.
        # Corresponds to the JSON property `kaclsData`
        # @return [String]
        attr_accessor :kacls_data
      
        # The URI of the key access control list service that manages the private key.
        # Corresponds to the JSON property `kaclsUri`
        # @return [String]
        attr_accessor :kacls_uri
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @kacls_data = args[:kacls_data] if args.key?(:kacls_data)
          @kacls_uri = args[:kacls_uri] if args.key?(:kacls_uri)
        end
      end
      
      # Labels are used to categorize messages and threads within the user's mailbox.
      # The maximum number of labels supported for a user's mailbox is 10,000.
      class Label
        include Google::Apis::Core::Hashable
      
        # The color to assign to the label. Color is only available for labels that have
        # their `type` set to `user`.
        # Corresponds to the JSON property `color`
        # @return [Google::Apis::GmailV1::LabelColor]
        attr_accessor :color
      
        # The immutable ID of the label.
        # Corresponds to the JSON property `id`
        # @return [String]
        attr_accessor :id
      
        # The visibility of the label in the label list in the Gmail web interface.
        # Corresponds to the JSON property `labelListVisibility`
        # @return [String]
        attr_accessor :label_list_visibility
      
        # The visibility of messages with this label in the message list in the Gmail
        # web interface.
        # Corresponds to the JSON property `messageListVisibility`
        # @return [String]
        attr_accessor :message_list_visibility
      
        # The total number of messages with the label.
        # Corresponds to the JSON property `messagesTotal`
        # @return [Fixnum]
        attr_accessor :messages_total
      
        # The number of unread messages with the label.
        # Corresponds to the JSON property `messagesUnread`
        # @return [Fixnum]
        attr_accessor :messages_unread
      
        # The display name of the label.
        # Corresponds to the JSON property `name`
        # @return [String]
        attr_accessor :name
      
        # The total number of threads with the label.
        # Corresponds to the JSON property `threadsTotal`
        # @return [Fixnum]
        attr_accessor :threads_total
      
        # The number of unread threads with the label.
        # Corresponds to the JSON property `threadsUnread`
        # @return [Fixnum]
        attr_accessor :threads_unread
      
        # The owner type for the label. User labels are created by the user and can be
        # modified and deleted by the user and can be applied to any message or thread.
        # System labels are internally created and cannot be added, modified, or deleted.
        # System labels may be able to be applied to or removed from messages and
        # threads under some circumstances but this is not guaranteed. For example,
        # users can apply and remove the `INBOX` and `UNREAD` labels from messages and
        # threads, but cannot apply or remove the `DRAFTS` or `SENT` labels from
        # messages or threads.
        # Corresponds to the JSON property `type`
        # @return [String]
        attr_accessor :type
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @color = args[:color] if args.key?(:color)
          @id = args[:id] if args.key?(:id)
          @label_list_visibility = args[:label_list_visibility] if args.key?(:label_list_visibility)
          @message_list_visibility = args[:message_list_visibility] if args.key?(:message_list_visibility)
          @messages_total = args[:messages_total] if args.key?(:messages_total)
          @messages_unread = args[:messages_unread] if args.key?(:messages_unread)
          @name = args[:name] if args.key?(:name)
          @threads_total = args[:threads_total] if args.key?(:threads_total)
          @threads_unread = args[:threads_unread] if args.key?(:threads_unread)
          @type = args[:type] if args.key?(:type)
        end
      end
      
      # 
      class LabelColor
        include Google::Apis::Core::Hashable
      
        # The background color represented as hex string #RRGGBB (ex #000000). This
        # field is required in order to set the color of a label. Only the following
        # predefined set of color values are allowed: \#000000, #434343, #666666, #
        # 999999, #cccccc, #efefef, #f3f3f3, #ffffff, \#fb4c2f, #ffad47, #fad165, #
        # 16a766, #43d692, #4a86e8, #a479e2, #f691b3, \#f6c5be, #ffe6c7, #fef1d1, #
        # b9e4d0, #c6f3de, #c9daf8, #e4d7f5, #fcdee8, \#efa093, #ffd6a2, #fce8b3, #
        # 89d3b2, #a0eac9, #a4c2f4, #d0bcf1, #fbc8d9, \#e66550, #ffbc6b, #fcda83, #
        # 44b984, #68dfa9, #6d9eeb, #b694e8, #f7a7c0, \#cc3a21, #eaa041, #f2c960, #
        # 149e60, #3dc789, #3c78d8, #8e63ce, #e07798, \#ac2b16, #cf8933, #d5ae49, #
        # 0b804b, #2a9c68, #285bac, #653e9b, #b65775, \#822111, #a46a21, #aa8831, #
        # 076239, #1a764d, #1c4587, #41236d, #83334c \#464646, #e7e7e7, #0d3472, #b6cff5,
        # #0d3b44, #98d7e4, #3d188e, #e3d7ff, \#711a36, #fbd3e0, #8a1c0a, #f2b2a8, #
        # 7a2e0b, #ffc8af, #7a4706, #ffdeb5, \#594c05, #fbe983, #684e07, #fdedc1, #
        # 0b4f30, #b3efd3, #04502e, #a2dcc1, \#c2c2c2, #4986e7, #2da2bb, #b99aff, #
        # 994a64, #f691b2, #ff7537, #ffad46, \#662e37, #ebdbde, #cca6ac, #094228, #
        # 42d692, #16a765
        # Corresponds to the JSON property `backgroundColor`
        # @return [String]
        attr_accessor :background_color
      
        # The text color of the label, represented as hex string. This field is required
        # in order to set the color of a label. Only the following predefined set of
        # color values are allowed: \#000000, #434343, #666666, #999999, #cccccc, #
        # efefef, #f3f3f3, #ffffff, \#fb4c2f, #ffad47, #fad165, #16a766, #43d692, #
        # 4a86e8, #a479e2, #f691b3, \#f6c5be, #ffe6c7, #fef1d1, #b9e4d0, #c6f3de, #
        # c9daf8, #e4d7f5, #fcdee8, \#efa093, #ffd6a2, #fce8b3, #89d3b2, #a0eac9, #
        # a4c2f4, #d0bcf1, #fbc8d9, \#e66550, #ffbc6b, #fcda83, #44b984, #68dfa9, #
        # 6d9eeb, #b694e8, #f7a7c0, \#cc3a21, #eaa041, #f2c960, #149e60, #3dc789, #
        # 3c78d8, #8e63ce, #e07798, \#ac2b16, #cf8933, #d5ae49, #0b804b, #2a9c68, #
        # 285bac, #653e9b, #b65775, \#822111, #a46a21, #aa8831, #076239, #1a764d, #
        # 1c4587, #41236d, #83334c \#464646, #e7e7e7, #0d3472, #b6cff5, #0d3b44, #98d7e4,
        # #3d188e, #e3d7ff, \#711a36, #fbd3e0, #8a1c0a, #f2b2a8, #7a2e0b, #ffc8af, #
        # 7a4706, #ffdeb5, \#594c05, #fbe983, #684e07, #fdedc1, #0b4f30, #b3efd3, #
        # 04502e, #a2dcc1, \#c2c2c2, #4986e7, #2da2bb, #b99aff, #994a64, #f691b2, #
        # ff7537, #ffad46, \#662e37, #ebdbde, #cca6ac, #094228, #42d692, #16a765
        # Corresponds to the JSON property `textColor`
        # @return [String]
        attr_accessor :text_color
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @background_color = args[:background_color] if args.key?(:background_color)
          @text_color = args[:text_color] if args.key?(:text_color)
        end
      end
      
      # Language settings for an account. These settings correspond to the "Language
      # settings" feature in the web interface.
      class LanguageSettings
        include Google::Apis::Core::Hashable
      
        # The language to display Gmail in, formatted as an RFC 3066 Language Tag (for
        # example `en-GB`, `fr` or `ja` for British English, French, or Japanese
        # respectively). The set of languages supported by Gmail evolves over time, so
        # please refer to the "Language" dropdown in the Gmail settings for all
        # available options, as described in the language settings help article. For a
        # table of sample values, see [Manage language settings](https://developers.
        # google.com/workspace/gmail/api/guides/language-settings). Not all Gmail
        # clients can display the same set of languages. In the case that a user's
        # display language is not available for use on a particular client, said client
        # automatically chooses to display in the closest supported variant (or a
        # reasonable default).
        # Corresponds to the JSON property `displayLanguage`
        # @return [String]
        attr_accessor :display_language
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @display_language = args[:display_language] if args.key?(:display_language)
        end
      end
      
      # 
      class ListCseIdentitiesResponse
        include Google::Apis::Core::Hashable
      
        # One page of the list of CSE identities configured for the user.
        # Corresponds to the JSON property `cseIdentities`
        # @return [Array<Google::Apis::GmailV1::CseIdentity>]
        attr_accessor :cse_identities
      
        # Pagination token to be passed to a subsequent ListCseIdentities call in order
        # to retrieve the next page of identities. If this value is not returned or is
        # the empty string, then no further pages remain.
        # Corresponds to the JSON property `nextPageToken`
        # @return [String]
        attr_accessor :next_page_token
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @cse_identities = args[:cse_identities] if args.key?(:cse_identities)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
        end
      end
      
      # 
      class ListCseKeyPairsResponse
        include Google::Apis::Core::Hashable
      
        # One page of the list of CSE key pairs installed for the user.
        # Corresponds to the JSON property `cseKeyPairs`
        # @return [Array<Google::Apis::GmailV1::CseKeyPair>]
        attr_accessor :cse_key_pairs
      
        # Pagination token to be passed to a subsequent ListCseKeyPairs call in order to
        # retrieve the next page of key pairs. If this value is not returned, then no
        # further pages remain.
        # Corresponds to the JSON property `nextPageToken`
        # @return [String]
        attr_accessor :next_page_token
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @cse_key_pairs = args[:cse_key_pairs] if args.key?(:cse_key_pairs)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
        end
      end
      
      # Response for the ListDelegates method.
      class ListDelegatesResponse
        include Google::Apis::Core::Hashable
      
        # List of the user's delegates (with any verification status). If an account
        # doesn't have delegates, this field doesn't appear.
        # Corresponds to the JSON property `delegates`
        # @return [Array<Google::Apis::GmailV1::Delegate>]
        attr_accessor :delegates
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @delegates = args[:delegates] if args.key?(:delegates)
        end
      end
      
      # 
      class ListDraftsResponse
        include Google::Apis::Core::Hashable
      
        # List of drafts. Note that the `Message` property in each `Draft` resource only
        # contains an `id` and a `threadId`. The [`messages.get`](https://developers.
        # google.com/workspace/gmail/api/v1/reference/users/messages/get) method can
        # fetch additional message details.
        # Corresponds to the JSON property `drafts`
        # @return [Array<Google::Apis::GmailV1::Draft>]
        attr_accessor :drafts
      
        # Token to retrieve the next page of results in the list.
        # Corresponds to the JSON property `nextPageToken`
        # @return [String]
        attr_accessor :next_page_token
      
        # Estimated total number of results.
        # Corresponds to the JSON property `resultSizeEstimate`
        # @return [Fixnum]
        attr_accessor :result_size_estimate
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @drafts = args[:drafts] if args.key?(:drafts)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
          @result_size_estimate = args[:result_size_estimate] if args.key?(:result_size_estimate)
        end
      end
      
      # Response for the ListFilters method.
      class ListFiltersResponse
        include Google::Apis::Core::Hashable
      
        # List of a user's filters.
        # Corresponds to the JSON property `filter`
        # @return [Array<Google::Apis::GmailV1::Filter>]
        attr_accessor :filter
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @filter = args[:filter] if args.key?(:filter)
        end
      end
      
      # Response for the ListForwardingAddresses method.
      class ListForwardingAddressesResponse
        include Google::Apis::Core::Hashable
      
        # List of addresses that may be used for forwarding.
        # Corresponds to the JSON property `forwardingAddresses`
        # @return [Array<Google::Apis::GmailV1::ForwardingAddress>]
        attr_accessor :forwarding_addresses
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @forwarding_addresses = args[:forwarding_addresses] if args.key?(:forwarding_addresses)
        end
      end
      
      # 
      class ListHistoryResponse
        include Google::Apis::Core::Hashable
      
        # List of history records. Any `messages` contained in the response will
        # typically only have `id` and `threadId` fields populated.
        # Corresponds to the JSON property `history`
        # @return [Array<Google::Apis::GmailV1::History>]
        attr_accessor :history
      
        # The ID of the mailbox's current history record.
        # Corresponds to the JSON property `historyId`
        # @return [Fixnum]
        attr_accessor :history_id
      
        # Page token to retrieve the next page of results in the list.
        # Corresponds to the JSON property `nextPageToken`
        # @return [String]
        attr_accessor :next_page_token
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @history = args[:history] if args.key?(:history)
          @history_id = args[:history_id] if args.key?(:history_id)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
        end
      end
      
      # 
      class ListLabelsResponse
        include Google::Apis::Core::Hashable
      
        # List of labels. Note that each label resource only contains an `id`, `name`, `
        # messageListVisibility`, `labelListVisibility`, and `type`. The [`labels.get`](
        # https://developers.google.com/workspace/gmail/api/v1/reference/users/labels/
        # get) method can fetch additional label details.
        # Corresponds to the JSON property `labels`
        # @return [Array<Google::Apis::GmailV1::Label>]
        attr_accessor :labels
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @labels = args[:labels] if args.key?(:labels)
        end
      end
      
      # 
      class ListMessagesResponse
        include Google::Apis::Core::Hashable
      
        # List of messages. Note that each message resource contains only an `id` and a `
        # threadId`. Additional message details can be fetched using the messages.get
        # method.
        # Corresponds to the JSON property `messages`
        # @return [Array<Google::Apis::GmailV1::Message>]
        attr_accessor :messages
      
        # Token to retrieve the next page of results in the list.
        # Corresponds to the JSON property `nextPageToken`
        # @return [String]
        attr_accessor :next_page_token
      
        # Estimated total number of results.
        # Corresponds to the JSON property `resultSizeEstimate`
        # @return [Fixnum]
        attr_accessor :result_size_estimate
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @messages = args[:messages] if args.key?(:messages)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
          @result_size_estimate = args[:result_size_estimate] if args.key?(:result_size_estimate)
        end
      end
      
      # Response for the ListSendAs method.
      class ListSendAsResponse
        include Google::Apis::Core::Hashable
      
        # List of send-as aliases.
        # Corresponds to the JSON property `sendAs`
        # @return [Array<Google::Apis::GmailV1::SendAs>]
        attr_accessor :send_as
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @send_as = args[:send_as] if args.key?(:send_as)
        end
      end
      
      # 
      class ListSmimeInfoResponse
        include Google::Apis::Core::Hashable
      
        # List of SmimeInfo.
        # Corresponds to the JSON property `smimeInfo`
        # @return [Array<Google::Apis::GmailV1::SmimeInfo>]
        attr_accessor :smime_info
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @smime_info = args[:smime_info] if args.key?(:smime_info)
        end
      end
      
      # 
      class ListThreadsResponse
        include Google::Apis::Core::Hashable
      
        # Page token to retrieve the next page of results in the list.
        # Corresponds to the JSON property `nextPageToken`
        # @return [String]
        attr_accessor :next_page_token
      
        # Estimated total number of results.
        # Corresponds to the JSON property `resultSizeEstimate`
        # @return [Fixnum]
        attr_accessor :result_size_estimate
      
        # List of threads. Note that each thread resource does not contain a list of `
        # messages`. The list of `messages` for a given thread can be fetched using the [
        # `threads.get`](https://developers.google.com/workspace/gmail/api/v1/reference/
        # users/threads/get) method.
        # Corresponds to the JSON property `threads`
        # @return [Array<Google::Apis::GmailV1::Thread>]
        attr_accessor :threads
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
          @result_size_estimate = args[:result_size_estimate] if args.key?(:result_size_estimate)
          @threads = args[:threads] if args.key?(:threads)
        end
      end
      
      # An email message.
      class Message
        include Google::Apis::Core::Hashable
      
        # The ID of the last history record that modified this message.
        # Corresponds to the JSON property `historyId`
        # @return [Fixnum]
        attr_accessor :history_id
      
        # The immutable ID of the message.
        # Corresponds to the JSON property `id`
        # @return [String]
        attr_accessor :id
      
        # The internal message creation timestamp (epoch ms), which determines ordering
        # in the inbox. For normal SMTP-received email, this represents the time the
        # message was originally accepted by Google, which is more reliable than the `
        # Date` header. However, for API-migrated mail, it can be configured by client
        # to be based on the `Date` header.
        # Corresponds to the JSON property `internalDate`
        # @return [Fixnum]
        attr_accessor :internal_date
      
        # List of IDs of labels applied to this message.
        # Corresponds to the JSON property `labelIds`
        # @return [Array<String>]
        attr_accessor :label_ids
      
        # A single MIME message part.
        # Corresponds to the JSON property `payload`
        # @return [Google::Apis::GmailV1::MessagePart]
        attr_accessor :payload
      
        # The entire email message in an RFC 2822 formatted and base64url encoded string.
        # Returned in `messages.get` and `drafts.get` responses when the `format=RAW`
        # parameter is supplied.
        # Corresponds to the JSON property `raw`
        # NOTE: Values are automatically base64 encoded/decoded in the client library.
        # @return [String]
        attr_accessor :raw
      
        # Estimated size in bytes of the message.
        # Corresponds to the JSON property `sizeEstimate`
        # @return [Fixnum]
        attr_accessor :size_estimate
      
        # A short part of the message text.
        # Corresponds to the JSON property `snippet`
        # @return [String]
        attr_accessor :snippet
      
        # The ID of the thread the message belongs to. To add a message or draft to a
        # thread, the following criteria must be met: 1. The requested `threadId` must
        # be specified on the `Message` or `Draft.Message` you supply with your request.
        # 2. The `References` and `In-Reply-To` headers must be set in compliance with
        # the [RFC 2822](https://tools.ietf.org/html/rfc2822) standard. 3. The `Subject`
        # headers must match.
        # Corresponds to the JSON property `threadId`
        # @return [String]
        attr_accessor :thread_id
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @history_id = args[:history_id] if args.key?(:history_id)
          @id = args[:id] if args.key?(:id)
          @internal_date = args[:internal_date] if args.key?(:internal_date)
          @label_ids = args[:label_ids] if args.key?(:label_ids)
          @payload = args[:payload] if args.key?(:payload)
          @raw = args[:raw] if args.key?(:raw)
          @size_estimate = args[:size_estimate] if args.key?(:size_estimate)
          @snippet = args[:snippet] if args.key?(:snippet)
          @thread_id = args[:thread_id] if args.key?(:thread_id)
        end
      end
      
      # A single MIME message part.
      class MessagePart
        include Google::Apis::Core::Hashable
      
        # The body of a single MIME message part.
        # Corresponds to the JSON property `body`
        # @return [Google::Apis::GmailV1::MessagePartBody]
        attr_accessor :body
      
        # The filename of the attachment. Only present if this message part represents
        # an attachment.
        # Corresponds to the JSON property `filename`
        # @return [String]
        attr_accessor :filename
      
        # List of headers on this message part. For the top-level message part,
        # representing the entire message payload, it will contain the standard RFC 2822
        # email headers such as `To`, `From`, and `Subject`.
        # Corresponds to the JSON property `headers`
        # @return [Array<Google::Apis::GmailV1::MessagePartHeader>]
        attr_accessor :headers
      
        # The MIME type of the message part.
        # Corresponds to the JSON property `mimeType`
        # @return [String]
        attr_accessor :mime_type
      
        # The immutable ID of the message part.
        # Corresponds to the JSON property `partId`
        # @return [String]
        attr_accessor :part_id
      
        # The child MIME message parts of this part. This only applies to container MIME
        # message parts, for example `multipart/*`. For non- container MIME message part
        # types, such as `text/plain`, this field is empty. For more information, see
        # RFC 1521.
        # Corresponds to the JSON property `parts`
        # @return [Array<Google::Apis::GmailV1::MessagePart>]
        attr_accessor :parts
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @body = args[:body] if args.key?(:body)
          @filename = args[:filename] if args.key?(:filename)
          @headers = args[:headers] if args.key?(:headers)
          @mime_type = args[:mime_type] if args.key?(:mime_type)
          @part_id = args[:part_id] if args.key?(:part_id)
          @parts = args[:parts] if args.key?(:parts)
        end
      end
      
      # The body of a single MIME message part.
      class MessagePartBody
        include Google::Apis::Core::Hashable
      
        # When present, contains the ID of an external attachment that can be retrieved
        # in a separate `messages.attachments.get` request. When not present, the entire
        # content of the message part body is contained in the data field.
        # Corresponds to the JSON property `attachmentId`
        # @return [String]
        attr_accessor :attachment_id
      
        # The body data of a MIME message part as a base64url encoded string. May be
        # empty for MIME container types that have no message body or when the body data
        # is sent as a separate attachment. An attachment ID is present if the body data
        # is contained in a separate attachment.
        # Corresponds to the JSON property `data`
        # NOTE: Values are automatically base64 encoded/decoded in the client library.
        # @return [String]
        attr_accessor :data
      
        # Number of bytes for the message part data (encoding notwithstanding).
        # Corresponds to the JSON property `size`
        # @return [Fixnum]
        attr_accessor :size
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @attachment_id = args[:attachment_id] if args.key?(:attachment_id)
          @data = args[:data] if args.key?(:data)
          @size = args[:size] if args.key?(:size)
        end
      end
      
      # 
      class MessagePartHeader
        include Google::Apis::Core::Hashable
      
        # The name of the header before the `:` separator. For example, `To`.
        # Corresponds to the JSON property `name`
        # @return [String]
        attr_accessor :name
      
        # The value of the header after the `:` separator. For example, `someuser@
        # example.com`.
        # Corresponds to the JSON property `value`
        # @return [String]
        attr_accessor :value
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @name = args[:name] if args.key?(:name)
          @value = args[:value] if args.key?(:value)
        end
      end
      
      # 
      class ModifyMessageRequest
        include Google::Apis::Core::Hashable
      
        # A list of IDs of labels to add to this message. You can add up to 100 labels
        # with each update.
        # Corresponds to the JSON property `addLabelIds`
        # @return [Array<String>]
        attr_accessor :add_label_ids
      
        # A list IDs of labels to remove from this message. You can remove up to 100
        # labels with each update.
        # Corresponds to the JSON property `removeLabelIds`
        # @return [Array<String>]
        attr_accessor :remove_label_ids
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @add_label_ids = args[:add_label_ids] if args.key?(:add_label_ids)
          @remove_label_ids = args[:remove_label_ids] if args.key?(:remove_label_ids)
        end
      end
      
      # 
      class ModifyThreadRequest
        include Google::Apis::Core::Hashable
      
        # A list of IDs of labels to add to this thread. You can add up to 100 labels
        # with each update.
        # Corresponds to the JSON property `addLabelIds`
        # @return [Array<String>]
        attr_accessor :add_label_ids
      
        # A list of IDs of labels to remove from this thread. You can remove up to 100
        # labels with each update.
        # Corresponds to the JSON property `removeLabelIds`
        # @return [Array<String>]
        attr_accessor :remove_label_ids
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @add_label_ids = args[:add_label_ids] if args.key?(:add_label_ids)
          @remove_label_ids = args[:remove_label_ids] if args.key?(:remove_label_ids)
        end
      end
      
      # Request to obliterate a CSE key pair.
      class ObliterateCseKeyPairRequest
        include Google::Apis::Core::Hashable
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
        end
      end
      
      # POP settings for an account.
      class PopSettings
        include Google::Apis::Core::Hashable
      
        # The range of messages which are accessible via POP.
        # Corresponds to the JSON property `accessWindow`
        # @return [String]
        attr_accessor :access_window
      
        # The action that will be executed on a message after it has been fetched via
        # POP.
        # Corresponds to the JSON property `disposition`
        # @return [String]
        attr_accessor :disposition
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @access_window = args[:access_window] if args.key?(:access_window)
          @disposition = args[:disposition] if args.key?(:disposition)
        end
      end
      
      # Profile for a Gmail user.
      class Profile
        include Google::Apis::Core::Hashable
      
        # The user's email address.
        # Corresponds to the JSON property `emailAddress`
        # @return [String]
        attr_accessor :email_address
      
        # The ID of the mailbox's current history record.
        # Corresponds to the JSON property `historyId`
        # @return [Fixnum]
        attr_accessor :history_id
      
        # The total number of messages in the mailbox.
        # Corresponds to the JSON property `messagesTotal`
        # @return [Fixnum]
        attr_accessor :messages_total
      
        # The total number of threads in the mailbox.
        # Corresponds to the JSON property `threadsTotal`
        # @return [Fixnum]
        attr_accessor :threads_total
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @email_address = args[:email_address] if args.key?(:email_address)
          @history_id = args[:history_id] if args.key?(:history_id)
          @messages_total = args[:messages_total] if args.key?(:messages_total)
          @threads_total = args[:threads_total] if args.key?(:threads_total)
        end
      end
      
      # Settings associated with a send-as alias, which can be either the primary
      # login address associated with the account or a custom "from" address. Send-as
      # aliases correspond to the "Send Mail As" feature in the web interface.
      class SendAs
        include Google::Apis::Core::Hashable
      
        # A name that appears in the "From:" header for mail sent using this alias. For
        # custom "from" addresses, when this is empty, Gmail will populate the "From:"
        # header with the name that is used for the primary address associated with the
        # account. If the admin has disabled the ability for users to update their name
        # format, requests to update this field for the primary login will silently fail.
        # Corresponds to the JSON property `displayName`
        # @return [String]
        attr_accessor :display_name
      
        # Whether this address is selected as the default "From:" address in situations
        # such as composing a new message or sending a vacation auto-reply. Every Gmail
        # account has exactly one default send-as address, so the only legal value that
        # clients may write to this field is `true`. Changing this from `false` to `true`
        # for an address will result in this field becoming `false` for the other
        # previous default address.
        # Corresponds to the JSON property `isDefault`
        # @return [Boolean]
        attr_accessor :is_default
        alias_method :is_default?, :is_default
      
        # Whether this address is the primary address used to login to the account.
        # Every Gmail account has exactly one primary address, and it cannot be deleted
        # from the collection of send-as aliases. This field is read-only.
        # Corresponds to the JSON property `isPrimary`
        # @return [Boolean]
        attr_accessor :is_primary
        alias_method :is_primary?, :is_primary
      
        # An optional email address that is included in a "Reply-To:" header for mail
        # sent using this alias. If this is empty, Gmail will not generate a "Reply-To:"
        # header.
        # Corresponds to the JSON property `replyToAddress`
        # @return [String]
        attr_accessor :reply_to_address
      
        # The email address that appears in the "From:" header for mail sent using this
        # alias. This is read-only for all operations except create.
        # Corresponds to the JSON property `sendAsEmail`
        # @return [String]
        attr_accessor :send_as_email
      
        # An optional HTML signature that is included in messages composed with this
        # alias in the Gmail web UI. This signature is added to new emails only.
        # Corresponds to the JSON property `signature`
        # @return [String]
        attr_accessor :signature
      
        # Configuration for communication with an SMTP service.
        # Corresponds to the JSON property `smtpMsa`
        # @return [Google::Apis::GmailV1::SmtpMsa]
        attr_accessor :smtp_msa
      
        # Whether Gmail should treat this address as an alias for the user's primary
        # email address. This setting only applies to custom "from" aliases.
        # Corresponds to the JSON property `treatAsAlias`
        # @return [Boolean]
        attr_accessor :treat_as_alias
        alias_method :treat_as_alias?, :treat_as_alias
      
        # Indicates whether this address has been verified for use as a send-as alias.
        # Read-only. This setting only applies to custom "from" aliases.
        # Corresponds to the JSON property `verificationStatus`
        # @return [String]
        attr_accessor :verification_status
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @display_name = args[:display_name] if args.key?(:display_name)
          @is_default = args[:is_default] if args.key?(:is_default)
          @is_primary = args[:is_primary] if args.key?(:is_primary)
          @reply_to_address = args[:reply_to_address] if args.key?(:reply_to_address)
          @send_as_email = args[:send_as_email] if args.key?(:send_as_email)
          @signature = args[:signature] if args.key?(:signature)
          @smtp_msa = args[:smtp_msa] if args.key?(:smtp_msa)
          @treat_as_alias = args[:treat_as_alias] if args.key?(:treat_as_alias)
          @verification_status = args[:verification_status] if args.key?(:verification_status)
        end
      end
      
      # The configuration of a CSE identity that uses different key pairs for signing
      # and encryption.
      class SignAndEncryptKeyPairs
        include Google::Apis::Core::Hashable
      
        # The ID of the CseKeyPair that encrypts signed outgoing mail.
        # Corresponds to the JSON property `encryptionKeyPairId`
        # @return [String]
        attr_accessor :encryption_key_pair_id
      
        # The ID of the CseKeyPair that signs outgoing mail.
        # Corresponds to the JSON property `signingKeyPairId`
        # @return [String]
        attr_accessor :signing_key_pair_id
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @encryption_key_pair_id = args[:encryption_key_pair_id] if args.key?(:encryption_key_pair_id)
          @signing_key_pair_id = args[:signing_key_pair_id] if args.key?(:signing_key_pair_id)
        end
      end
      
      # An S/MIME email config.
      class SmimeInfo
        include Google::Apis::Core::Hashable
      
        # Encrypted key password, when key is encrypted.
        # Corresponds to the JSON property `encryptedKeyPassword`
        # @return [String]
        attr_accessor :encrypted_key_password
      
        # When the certificate expires (in milliseconds since epoch).
        # Corresponds to the JSON property `expiration`
        # @return [Fixnum]
        attr_accessor :expiration
      
        # The immutable ID for the SmimeInfo.
        # Corresponds to the JSON property `id`
        # @return [String]
        attr_accessor :id
      
        # Whether this SmimeInfo is the default one for this user's send-as address.
        # Corresponds to the JSON property `isDefault`
        # @return [Boolean]
        attr_accessor :is_default
        alias_method :is_default?, :is_default
      
        # The S/MIME certificate issuer's common name.
        # Corresponds to the JSON property `issuerCn`
        # @return [String]
        attr_accessor :issuer_cn
      
        # PEM formatted X509 concatenated certificate string (standard base64 encoding).
        # Format used for returning key, which includes public key as well as
        # certificate chain (not private key).
        # Corresponds to the JSON property `pem`
        # @return [String]
        attr_accessor :pem
      
        # PKCS#12 format containing a single private/public key pair and certificate
        # chain. This format is only accepted from client for creating a new SmimeInfo
        # and is never returned, because the private key is not intended to be exported.
        # PKCS#12 may be encrypted, in which case encryptedKeyPassword should be set
        # appropriately.
        # Corresponds to the JSON property `pkcs12`
        # NOTE: Values are automatically base64 encoded/decoded in the client library.
        # @return [String]
        attr_accessor :pkcs12
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @encrypted_key_password = args[:encrypted_key_password] if args.key?(:encrypted_key_password)
          @expiration = args[:expiration] if args.key?(:expiration)
          @id = args[:id] if args.key?(:id)
          @is_default = args[:is_default] if args.key?(:is_default)
          @issuer_cn = args[:issuer_cn] if args.key?(:issuer_cn)
          @pem = args[:pem] if args.key?(:pem)
          @pkcs12 = args[:pkcs12] if args.key?(:pkcs12)
        end
      end
      
      # Configuration for communication with an SMTP service.
      class SmtpMsa
        include Google::Apis::Core::Hashable
      
        # The hostname of the SMTP service. Required.
        # Corresponds to the JSON property `host`
        # @return [String]
        attr_accessor :host
      
        # The password that will be used for authentication with the SMTP service. This
        # is a write-only field that can be specified in requests to create or update
        # SendAs settings; it is never populated in responses.
        # Corresponds to the JSON property `password`
        # @return [String]
        attr_accessor :password
      
        # The port of the SMTP service. Required.
        # Corresponds to the JSON property `port`
        # @return [Fixnum]
        attr_accessor :port
      
        # The protocol that will be used to secure communication with the SMTP service.
        # Required.
        # Corresponds to the JSON property `securityMode`
        # @return [String]
        attr_accessor :security_mode
      
        # The username that will be used for authentication with the SMTP service. This
        # is a write-only field that can be specified in requests to create or update
        # SendAs settings; it is never populated in responses.
        # Corresponds to the JSON property `username`
        # @return [String]
        attr_accessor :username
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @host = args[:host] if args.key?(:host)
          @password = args[:password] if args.key?(:password)
          @port = args[:port] if args.key?(:port)
          @security_mode = args[:security_mode] if args.key?(:security_mode)
          @username = args[:username] if args.key?(:username)
        end
      end
      
      # A collection of messages representing a conversation.
      class Thread
        include Google::Apis::Core::Hashable
      
        # The ID of the last history record that modified this thread.
        # Corresponds to the JSON property `historyId`
        # @return [Fixnum]
        attr_accessor :history_id
      
        # The unique ID of the thread.
        # Corresponds to the JSON property `id`
        # @return [String]
        attr_accessor :id
      
        # The list of messages in the thread.
        # Corresponds to the JSON property `messages`
        # @return [Array<Google::Apis::GmailV1::Message>]
        attr_accessor :messages
      
        # A short part of the message text.
        # Corresponds to the JSON property `snippet`
        # @return [String]
        attr_accessor :snippet
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @history_id = args[:history_id] if args.key?(:history_id)
          @id = args[:id] if args.key?(:id)
          @messages = args[:messages] if args.key?(:messages)
          @snippet = args[:snippet] if args.key?(:snippet)
        end
      end
      
      # Vacation auto-reply settings for an account. These settings correspond to the "
      # Vacation responder" feature in the web interface.
      class VacationSettings
        include Google::Apis::Core::Hashable
      
        # Flag that controls whether Gmail automatically replies to messages.
        # Corresponds to the JSON property `enableAutoReply`
        # @return [Boolean]
        attr_accessor :enable_auto_reply
        alias_method :enable_auto_reply?, :enable_auto_reply
      
        # An optional end time for sending auto-replies (epoch ms). When this is
        # specified, Gmail will automatically reply only to messages that it receives
        # before the end time. If both `startTime` and `endTime` are specified, `
        # startTime` must precede `endTime`.
        # Corresponds to the JSON property `endTime`
        # @return [Fixnum]
        attr_accessor :end_time
      
        # Response body in HTML format. Gmail will sanitize the HTML before storing it.
        # If both `response_body_plain_text` and `response_body_html` are specified, `
        # response_body_html` will be used.
        # Corresponds to the JSON property `responseBodyHtml`
        # @return [String]
        attr_accessor :response_body_html
      
        # Response body in plain text format. If both `response_body_plain_text` and `
        # response_body_html` are specified, `response_body_html` will be used.
        # Corresponds to the JSON property `responseBodyPlainText`
        # @return [String]
        attr_accessor :response_body_plain_text
      
        # Optional text to prepend to the subject line in vacation responses. In order
        # to enable auto-replies, either the response subject or the response body must
        # be nonempty.
        # Corresponds to the JSON property `responseSubject`
        # @return [String]
        attr_accessor :response_subject
      
        # Flag that determines whether responses are sent to recipients who are not in
        # the user's list of contacts.
        # Corresponds to the JSON property `restrictToContacts`
        # @return [Boolean]
        attr_accessor :restrict_to_contacts
        alias_method :restrict_to_contacts?, :restrict_to_contacts
      
        # Flag that determines whether responses are sent to recipients who are outside
        # of the user's domain. This feature is only available for Google Workspace
        # users.
        # Corresponds to the JSON property `restrictToDomain`
        # @return [Boolean]
        attr_accessor :restrict_to_domain
        alias_method :restrict_to_domain?, :restrict_to_domain
      
        # An optional start time for sending auto-replies (epoch ms). When this is
        # specified, Gmail will automatically reply only to messages that it receives
        # after the start time. If both `startTime` and `endTime` are specified, `
        # startTime` must precede `endTime`.
        # Corresponds to the JSON property `startTime`
        # @return [Fixnum]
        attr_accessor :start_time
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @enable_auto_reply = args[:enable_auto_reply] if args.key?(:enable_auto_reply)
          @end_time = args[:end_time] if args.key?(:end_time)
          @response_body_html = args[:response_body_html] if args.key?(:response_body_html)
          @response_body_plain_text = args[:response_body_plain_text] if args.key?(:response_body_plain_text)
          @response_subject = args[:response_subject] if args.key?(:response_subject)
          @restrict_to_contacts = args[:restrict_to_contacts] if args.key?(:restrict_to_contacts)
          @restrict_to_domain = args[:restrict_to_domain] if args.key?(:restrict_to_domain)
          @start_time = args[:start_time] if args.key?(:start_time)
        end
      end
      
      # Set up or update a new push notification watch on this user's mailbox.
      class WatchRequest
        include Google::Apis::Core::Hashable
      
        # Filtering behavior of `labelIds list` specified. This field is deprecated
        # because it caused incorrect behavior in some cases; use `label_filter_behavior`
        # instead.
        # Corresponds to the JSON property `labelFilterAction`
        # @return [String]
        attr_accessor :label_filter_action
      
        # Filtering behavior of `labelIds list` specified. This field replaces `
        # label_filter_action`; if set, `label_filter_action` is ignored.
        # Corresponds to the JSON property `labelFilterBehavior`
        # @return [String]
        attr_accessor :label_filter_behavior
      
        # List of label_ids to restrict notifications about. By default, if unspecified,
        # all changes are pushed out. If specified then dictates which labels are
        # required for a push notification to be generated.
        # Corresponds to the JSON property `labelIds`
        # @return [Array<String>]
        attr_accessor :label_ids
      
        # A fully qualified Google Cloud Pub/Sub API topic name to publish the events to.
        # This topic name **must** already exist in Cloud Pub/Sub and you **must** have
        # already granted gmail "publish" permission on it. For example, "projects/my-
        # project-identifier/topics/my-topic-name" (using the Cloud Pub/Sub "v1" topic
        # naming format). Note that the "my-project-identifier" portion must exactly
        # match your Google developer project id (the one executing this watch request).
        # Corresponds to the JSON property `topicName`
        # @return [String]
        attr_accessor :topic_name
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @label_filter_action = args[:label_filter_action] if args.key?(:label_filter_action)
          @label_filter_behavior = args[:label_filter_behavior] if args.key?(:label_filter_behavior)
          @label_ids = args[:label_ids] if args.key?(:label_ids)
          @topic_name = args[:topic_name] if args.key?(:topic_name)
        end
      end
      
      # Push notification watch response.
      class WatchResponse
        include Google::Apis::Core::Hashable
      
        # When Gmail will stop sending notifications for mailbox updates (epoch millis).
        # Call `watch` again before this time to renew the watch.
        # Corresponds to the JSON property `expiration`
        # @return [Fixnum]
        attr_accessor :expiration
      
        # The ID of the mailbox's current history record.
        # Corresponds to the JSON property `historyId`
        # @return [Fixnum]
        attr_accessor :history_id
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @expiration = args[:expiration] if args.key?(:expiration)
          @history_id = args[:history_id] if args.key?(:history_id)
        end
      end
    end
  end
end
